|
@@ -1164,17 +1164,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 __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;
|
|
|
}
|
|
|
|
|
|
/*
|