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 __be32 *dm = NULL;
+       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;
 }
 
 /*