of/flattree: merge early_init_dt_scan_memory() common code
authorGrant Likely <grant.likely@secretlab.ca>
Tue, 2 Feb 2010 04:34:14 +0000 (21:34 -0700)
committerGrant Likely <grant.likely@secretlab.ca>
Tue, 9 Feb 2010 15:33:10 +0000 (08:33 -0700)
Merge common code between PowerPC and Microblaze architectures.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Michal Simek <monstr@monstr.eu>
arch/microblaze/kernel/prom.c
arch/powerpc/kernel/prom.c
drivers/of/fdt.c
include/linux/of_fdt.h

index f7bd0ee8d481c5f9917412e03c3751cc8a1e45f5..459c32e4a5fed22d661f9efb7a98c8b638f8b2ce 100644 (file)
 /* export that to outside world */
 struct device_node *of_chosen;
 
-#define early_init_dt_scan_drconf_memory(node) 0
-
 void __init early_init_dt_scan_chosen_arch(unsigned long node)
 {
        /* No Microblaze specific code here */
 }
 
-static int __init early_init_dt_scan_memory(unsigned long node,
-                               const char *uname, int depth, void *data)
+void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 {
-       char *type = of_get_flat_dt_prop(node, "device_type", NULL);
-       __be32 *reg, *endp;
-       unsigned long l;
-
-       /* Look for the ibm,dynamic-reconfiguration-memory node */
-/*     if (depth == 1 &&
-               strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0)
-               return early_init_dt_scan_drconf_memory(node);
-*/
-       /* We are scanning "memory" nodes only */
-       if (type == NULL) {
-               /*
-                * The longtrail doesn't have a device_type on the
-                * /memory node, so look for the node called /memory@0.
-                */
-               if (depth != 1 || strcmp(uname, "memory@0") != 0)
-                       return 0;
-       } else if (strcmp(type, "memory") != 0)
-               return 0;
-
-       reg = (__be32 *)of_get_flat_dt_prop(node, "linux,usable-memory", &l);
-       if (reg == NULL)
-               reg = (__be32 *)of_get_flat_dt_prop(node, "reg", &l);
-       if (reg == NULL)
-               return 0;
-
-       endp = reg + (l / sizeof(__be32));
-
-       pr_debug("memory scan node %s, reg size %ld, data: %x %x %x %x,\n",
-               uname, l, reg[0], reg[1], reg[2], reg[3]);
-
-       while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
-               u64 base, size;
-
-               base = dt_mem_next_cell(dt_root_addr_cells, &reg);
-               size = dt_mem_next_cell(dt_root_size_cells, &reg);
-
-               if (size == 0)
-                       continue;
-               pr_debug(" - %llx ,  %llx\n", (unsigned long long)base,
-                       (unsigned long long)size);
-
-               lmb_add(base, size);
-       }
-       return 0;
+       lmb_add(base, size);
 }
 
 #ifdef CONFIG_EARLY_PRINTK
index 28be19ab0f182f53d26a0cc019bad897f3a756fe..e0f368ff8d1263dab2abe2e85ca2719373fbf6f1 100644 (file)
@@ -483,64 +483,31 @@ static int __init early_init_dt_scan_drconf_memory(unsigned long node)
 #define early_init_dt_scan_drconf_memory(node) 0
 #endif /* CONFIG_PPC_PSERIES */
 
-static int __init early_init_dt_scan_memory(unsigned long node,
-                                           const char *uname, int depth, void *data)
+static int __init early_init_dt_scan_memory_ppc(unsigned long node,
+                                               const char *uname,
+                                               int depth, void *data)
 {
-       char *type = of_get_flat_dt_prop(node, "device_type", NULL);
-       __be32 *reg, *endp;
-       unsigned long l;
-
-       /* Look for the ibm,dynamic-reconfiguration-memory node */
        if (depth == 1 &&
            strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0)
                return early_init_dt_scan_drconf_memory(node);
+       
+       return early_init_dt_scan_memory(node, uname, depth, data);
+}
 
-       /* We are scanning "memory" nodes only */
-       if (type == NULL) {
-               /*
-                * The longtrail doesn't have a device_type on the
-                * /memory node, so look for the node called /memory@0.
-                */
-               if (depth != 1 || strcmp(uname, "memory@0") != 0)
-                       return 0;
-       } else if (strcmp(type, "memory") != 0)
-               return 0;
-
-       reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
-       if (reg == NULL)
-               reg = of_get_flat_dt_prop(node, "reg", &l);
-       if (reg == NULL)
-               return 0;
-
-       endp = reg + (l / sizeof(__be32));
-
-       DBG("memory scan node %s, reg size %ld, data: %x %x %x %x,\n",
-           uname, l, reg[0], reg[1], reg[2], reg[3]);
-
-       while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
-               u64 base, size;
-
-               base = dt_mem_next_cell(dt_root_addr_cells, &reg);
-               size = dt_mem_next_cell(dt_root_size_cells, &reg);
-
-               if (size == 0)
-                       continue;
-               DBG(" - %llx ,  %llx\n", (unsigned long long)base,
-                   (unsigned long long)size);
-#ifdef CONFIG_PPC64
-               if (iommu_is_off) {
-                       if (base >= 0x80000000ul)
-                               continue;
-                       if ((base + size) > 0x80000000ul)
-                               size = 0x80000000ul - base;
-               }
+void __init early_init_dt_add_memory_arch(u64 base, u64 size)
+{
+#if defined(CONFIG_PPC64)
+       if (iommu_is_off) {
+               if (base >= 0x80000000ul)
+                       return;
+               if ((base + size) > 0x80000000ul)
+                       size = 0x80000000ul - base;
+       }
 #endif
-               lmb_add(base, size);
 
-               memstart_addr = min((u64)memstart_addr, base);
-       }
+       lmb_add(base, size);
 
-       return 0;
+       memstart_addr = min((u64)memstart_addr, base);
 }
 
 static void __init early_reserve_mem(void)
@@ -706,7 +673,7 @@ void __init early_init_devtree(void *params)
        /* Scan memory nodes and rebuild LMBs */
        lmb_init();
        of_scan_flat_dt(early_init_dt_scan_root, NULL);
-       of_scan_flat_dt(early_init_dt_scan_memory, NULL);
+       of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL);
 
        /* Save command line for /proc/cmdline and then parse parameters */
        strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE);
index 7f8861121a31117fb551007afd22b9d9c475bed0..f84152d112b0703486047c3029ec56d5cbd9b1ae 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/of.h>
 #include <linux/of_fdt.h>
 
+
 #ifdef CONFIG_PPC
 #include <asm/machdep.h>
 #endif /* CONFIG_PPC */
@@ -443,6 +444,55 @@ u64 __init dt_mem_next_cell(int s, u32 **cellp)
        return of_read_number(p, s);
 }
 
+/**
+ * early_init_dt_scan_memory - Look for an parse memory nodes
+ */
+int __init early_init_dt_scan_memory(unsigned long node, const char *uname,
+                                    int depth, void *data)
+{
+       char *type = of_get_flat_dt_prop(node, "device_type", NULL);
+       __be32 *reg, *endp;
+       unsigned long l;
+
+       /* We are scanning "memory" nodes only */
+       if (type == NULL) {
+               /*
+                * The longtrail doesn't have a device_type on the
+                * /memory node, so look for the node called /memory@0.
+                */
+               if (depth != 1 || strcmp(uname, "memory@0") != 0)
+                       return 0;
+       } else if (strcmp(type, "memory") != 0)
+               return 0;
+
+       reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
+       if (reg == NULL)
+               reg = of_get_flat_dt_prop(node, "reg", &l);
+       if (reg == NULL)
+               return 0;
+
+       endp = reg + (l / sizeof(__be32));
+
+       pr_debug("memory scan node %s, reg size %ld, data: %x %x %x %x,\n",
+           uname, l, reg[0], reg[1], reg[2], reg[3]);
+
+       while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
+               u64 base, size;
+
+               base = dt_mem_next_cell(dt_root_addr_cells, &reg);
+               size = dt_mem_next_cell(dt_root_size_cells, &reg);
+
+               if (size == 0)
+                       continue;
+               pr_debug(" - %llx ,  %llx\n", (unsigned long long)base,
+                   (unsigned long long)size);
+
+               early_init_dt_add_memory_arch(base, size);
+       }
+
+       return 0;
+}
+
 int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
                                     int depth, void *data)
 {
index fbf29610616d7a6f02f0dac226b3046ebba11e22..bf26bd5df9f1ddc2529efb4e6c9f19d50b8ef5b4 100644 (file)
@@ -75,6 +75,9 @@ extern void early_init_dt_scan_chosen_arch(unsigned long node);
 extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,
                                     int depth, void *data);
 extern void early_init_dt_check_for_initrd(unsigned long node);
+extern int early_init_dt_scan_memory(unsigned long node, const char *uname,
+                                    int depth, void *data);
+extern void early_init_dt_add_memory_arch(u64 base, u64 size);
 extern u64 dt_mem_next_cell(int s, u32 **cellp);
 
 /* Early flat tree scan hooks */