Commit b88fc309 authored by Nathan Fontenot's avatar Nathan Fontenot Committed by Michael Ellerman

powerpc/numa: Look up associativity array in of_drconf_to_nid_single

Look up the associativity arrays in of_drconf_to_nid_single when
deriving the nid for a LMB instead of having it passed in as a
parameter.
Signed-off-by: default avatarNathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 22508f3d
...@@ -509,26 +509,30 @@ static int of_get_assoc_arrays(struct assoc_arrays *aa) ...@@ -509,26 +509,30 @@ static int of_get_assoc_arrays(struct assoc_arrays *aa)
* This is like of_node_to_nid_single() for memory represented in the * This is like of_node_to_nid_single() for memory represented in the
* ibm,dynamic-reconfiguration-memory node. * ibm,dynamic-reconfiguration-memory node.
*/ */
static int of_drconf_to_nid_single(struct of_drconf_cell *drmem, static int of_drconf_to_nid_single(struct of_drconf_cell *drmem)
struct assoc_arrays *aa)
{ {
struct assoc_arrays aa = { .arrays = NULL };
int default_nid = 0; int default_nid = 0;
int nid = default_nid; int nid = default_nid;
int index; int rc, index;
rc = of_get_assoc_arrays(&aa);
if (rc)
return default_nid;
if (min_common_depth > 0 && min_common_depth <= aa->array_sz && if (min_common_depth > 0 && min_common_depth <= aa.array_sz &&
!(drmem->flags & DRCONF_MEM_AI_INVALID) && !(drmem->flags & DRCONF_MEM_AI_INVALID) &&
drmem->aa_index < aa->n_arrays) { drmem->aa_index < aa.n_arrays) {
index = drmem->aa_index * aa->array_sz + min_common_depth - 1; index = drmem->aa_index * aa.array_sz + min_common_depth - 1;
nid = of_read_number(&aa->arrays[index], 1); nid = of_read_number(&aa.arrays[index], 1);
if (nid == 0xffff || nid >= MAX_NUMNODES) if (nid == 0xffff || nid >= MAX_NUMNODES)
nid = default_nid; nid = default_nid;
if (nid > 0) { if (nid > 0) {
index = drmem->aa_index * aa->array_sz; index = drmem->aa_index * aa.array_sz;
initialize_distance_lookup_table(nid, initialize_distance_lookup_table(nid,
&aa->arrays[index]); &aa.arrays[index]);
} }
} }
...@@ -664,10 +668,9 @@ static inline int __init read_usm_ranges(const __be32 **usm) ...@@ -664,10 +668,9 @@ static inline int __init read_usm_ranges(const __be32 **usm)
static void __init parse_drconf_memory(struct device_node *memory) static void __init parse_drconf_memory(struct device_node *memory)
{ {
const __be32 *uninitialized_var(dm), *usm; const __be32 *uninitialized_var(dm), *usm;
unsigned int n, rc, ranges, is_kexec_kdump = 0; unsigned int n, ranges, is_kexec_kdump = 0;
unsigned long lmb_size, base, size, sz; unsigned long lmb_size, base, size, sz;
int nid; int nid;
struct assoc_arrays aa = { .arrays = NULL };
n = of_get_drconf_memory(memory, &dm); n = of_get_drconf_memory(memory, &dm);
if (!n) if (!n)
...@@ -677,10 +680,6 @@ static void __init parse_drconf_memory(struct device_node *memory) ...@@ -677,10 +680,6 @@ static void __init parse_drconf_memory(struct device_node *memory)
if (!lmb_size) if (!lmb_size)
return; return;
rc = of_get_assoc_arrays(&aa);
if (rc)
return;
/* check if this is a kexec/kdump kernel */ /* check if this is a kexec/kdump kernel */
usm = of_get_usable_memory(); usm = of_get_usable_memory();
if (usm != NULL) if (usm != NULL)
...@@ -711,7 +710,7 @@ static void __init parse_drconf_memory(struct device_node *memory) ...@@ -711,7 +710,7 @@ static void __init parse_drconf_memory(struct device_node *memory)
base = read_n_cells(n_mem_addr_cells, &usm); base = read_n_cells(n_mem_addr_cells, &usm);
size = read_n_cells(n_mem_size_cells, &usm); size = read_n_cells(n_mem_size_cells, &usm);
} }
nid = of_drconf_to_nid_single(&drmem, &aa); nid = of_drconf_to_nid_single(&drmem);
fake_numa_create_new_node( fake_numa_create_new_node(
((base + size) >> PAGE_SHIFT), ((base + size) >> PAGE_SHIFT),
&nid); &nid);
...@@ -999,9 +998,8 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory, ...@@ -999,9 +998,8 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory,
unsigned long scn_addr) unsigned long scn_addr)
{ {
const __be32 *dm; const __be32 *dm;
unsigned int drconf_cell_cnt, rc; unsigned int drconf_cell_cnt;
unsigned long lmb_size; unsigned long lmb_size;
struct assoc_arrays aa;
int nid = -1; int nid = -1;
drconf_cell_cnt = of_get_drconf_memory(memory, &dm); drconf_cell_cnt = of_get_drconf_memory(memory, &dm);
...@@ -1012,10 +1010,6 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory, ...@@ -1012,10 +1010,6 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory,
if (!lmb_size) if (!lmb_size)
return -1; return -1;
rc = of_get_assoc_arrays(&aa);
if (rc)
return -1;
for (; drconf_cell_cnt != 0; --drconf_cell_cnt) { for (; drconf_cell_cnt != 0; --drconf_cell_cnt) {
struct of_drconf_cell drmem; struct of_drconf_cell drmem;
...@@ -1031,7 +1025,7 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory, ...@@ -1031,7 +1025,7 @@ static int hot_add_drconf_scn_to_nid(struct device_node *memory,
|| (scn_addr >= (drmem.base_addr + lmb_size))) || (scn_addr >= (drmem.base_addr + lmb_size)))
continue; continue;
nid = of_drconf_to_nid_single(&drmem, &aa); nid = of_drconf_to_nid_single(&drmem);
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment