powerpc/numa: Fix multiple bugs in memory_hotplug_max()
[pandora-kernel.git] / arch / powerpc / mm / numa.c
index f4b78a3..9a5ec9a 100644 (file)
@@ -1275,17 +1275,33 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
 static u64 hot_add_drconf_memory_max(void)
 {
         struct device_node *memory = NULL;
+       struct device_node *dn = NULL;
         unsigned int drconf_cell_cnt = 0;
         u64 lmb_size = 0;
         const u32 *dm = 0;
+       const __be64 *lrdr = NULL;
+       struct of_drconf_cell drmem;
+
+       dn = of_find_node_by_path("/rtas");
+       if (dn) {
+               lrdr = of_get_property(dn, "ibm,lrdr-capacity", NULL);
+               of_node_put(dn);
+               if (lrdr)
+                       return be64_to_cpup(lrdr);
+       }
 
         memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");
         if (memory) {
                 drconf_cell_cnt = of_get_drconf_memory(memory, &dm);
                 lmb_size = of_get_lmb_size(memory);
+
+               /* Advance to the last cell, each cell has 6 32 bit integers */
+               dm += (drconf_cell_cnt - 1) * 6;
+               read_drconf_cell(&drmem, &dm);
                 of_node_put(memory);
+               return drmem.base_addr + lmb_size;
         }
-        return lmb_size * drconf_cell_cnt;
+       return 0;
 }
 
 /*