diff options
Diffstat (limited to 'arch/x86/kernel/apic/numaq_32.c')
-rw-r--r-- | arch/x86/kernel/apic/numaq_32.c | 62 |
1 files changed, 27 insertions, 35 deletions
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c index 3e28401f161c..c4a61ca1349a 100644 --- a/arch/x86/kernel/apic/numaq_32.c +++ b/arch/x86/kernel/apic/numaq_32.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/nodemask.h> | 26 | #include <linux/nodemask.h> |
27 | #include <linux/topology.h> | 27 | #include <linux/topology.h> |
28 | #include <linux/bootmem.h> | 28 | #include <linux/bootmem.h> |
29 | #include <linux/memblock.h> | ||
29 | #include <linux/threads.h> | 30 | #include <linux/threads.h> |
30 | #include <linux/cpumask.h> | 31 | #include <linux/cpumask.h> |
31 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
@@ -47,8 +48,6 @@ | |||
47 | #include <asm/e820.h> | 48 | #include <asm/e820.h> |
48 | #include <asm/ipi.h> | 49 | #include <asm/ipi.h> |
49 | 50 | ||
50 | #define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT)) | ||
51 | |||
52 | int found_numaq; | 51 | int found_numaq; |
53 | 52 | ||
54 | /* | 53 | /* |
@@ -78,31 +77,20 @@ int quad_local_to_mp_bus_id[NR_CPUS/4][4]; | |||
78 | static inline void numaq_register_node(int node, struct sys_cfg_data *scd) | 77 | static inline void numaq_register_node(int node, struct sys_cfg_data *scd) |
79 | { | 78 | { |
80 | struct eachquadmem *eq = scd->eq + node; | 79 | struct eachquadmem *eq = scd->eq + node; |
80 | u64 start = (u64)(eq->hi_shrd_mem_start - eq->priv_mem_size) << 20; | ||
81 | u64 end = (u64)(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size) << 20; | ||
82 | int ret; | ||
81 | 83 | ||
82 | node_set_online(node); | 84 | node_set(node, numa_nodes_parsed); |
83 | 85 | ret = numa_add_memblk(node, start, end); | |
84 | /* Convert to pages */ | 86 | BUG_ON(ret < 0); |
85 | node_start_pfn[node] = | ||
86 | MB_TO_PAGES(eq->hi_shrd_mem_start - eq->priv_mem_size); | ||
87 | |||
88 | node_end_pfn[node] = | ||
89 | MB_TO_PAGES(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size); | ||
90 | |||
91 | e820_register_active_regions(node, node_start_pfn[node], | ||
92 | node_end_pfn[node]); | ||
93 | |||
94 | memory_present(node, node_start_pfn[node], node_end_pfn[node]); | ||
95 | |||
96 | node_remap_size[node] = node_memmap_size_bytes(node, | ||
97 | node_start_pfn[node], | ||
98 | node_end_pfn[node]); | ||
99 | } | 87 | } |
100 | 88 | ||
101 | /* | 89 | /* |
102 | * Function: smp_dump_qct() | 90 | * Function: smp_dump_qct() |
103 | * | 91 | * |
104 | * Description: gets memory layout from the quad config table. This | 92 | * Description: gets memory layout from the quad config table. This |
105 | * function also updates node_online_map with the nodes (quads) present. | 93 | * function also updates numa_nodes_parsed with the nodes (quads) present. |
106 | */ | 94 | */ |
107 | static void __init smp_dump_qct(void) | 95 | static void __init smp_dump_qct(void) |
108 | { | 96 | { |
@@ -111,7 +99,6 @@ static void __init smp_dump_qct(void) | |||
111 | 99 | ||
112 | scd = (void *)__va(SYS_CFG_DATA_PRIV_ADDR); | 100 | scd = (void *)__va(SYS_CFG_DATA_PRIV_ADDR); |
113 | 101 | ||
114 | nodes_clear(node_online_map); | ||
115 | for_each_node(node) { | 102 | for_each_node(node) { |
116 | if (scd->quads_present31_0 & (1 << node)) | 103 | if (scd->quads_present31_0 & (1 << node)) |
117 | numaq_register_node(node, scd); | 104 | numaq_register_node(node, scd); |
@@ -281,14 +268,14 @@ static __init void early_check_numaq(void) | |||
281 | } | 268 | } |
282 | } | 269 | } |
283 | 270 | ||
284 | int __init get_memcfg_numaq(void) | 271 | int __init numaq_numa_init(void) |
285 | { | 272 | { |
286 | early_check_numaq(); | 273 | early_check_numaq(); |
287 | if (!found_numaq) | 274 | if (!found_numaq) |
288 | return 0; | 275 | return -ENOENT; |
289 | smp_dump_qct(); | 276 | smp_dump_qct(); |
290 | 277 | ||
291 | return 1; | 278 | return 0; |
292 | } | 279 | } |
293 | 280 | ||
294 | #define NUMAQ_APIC_DFR_VALUE (APIC_DFR_CLUSTER) | 281 | #define NUMAQ_APIC_DFR_VALUE (APIC_DFR_CLUSTER) |
@@ -372,13 +359,6 @@ static inline void numaq_ioapic_phys_id_map(physid_mask_t *phys_map, physid_mask | |||
372 | return physids_promote(0xFUL, retmap); | 359 | return physids_promote(0xFUL, retmap); |
373 | } | 360 | } |
374 | 361 | ||
375 | static inline int numaq_cpu_to_logical_apicid(int cpu) | ||
376 | { | ||
377 | if (cpu >= nr_cpu_ids) | ||
378 | return BAD_APICID; | ||
379 | return cpu_2_logical_apicid[cpu]; | ||
380 | } | ||
381 | |||
382 | /* | 362 | /* |
383 | * Supporting over 60 cpus on NUMA-Q requires a locality-dependent | 363 | * Supporting over 60 cpus on NUMA-Q requires a locality-dependent |
384 | * cpu to APIC ID relation to properly interact with the intelligent | 364 | * cpu to APIC ID relation to properly interact with the intelligent |
@@ -397,6 +377,15 @@ static inline int numaq_apicid_to_node(int logical_apicid) | |||
397 | return logical_apicid >> 4; | 377 | return logical_apicid >> 4; |
398 | } | 378 | } |
399 | 379 | ||
380 | static int numaq_numa_cpu_node(int cpu) | ||
381 | { | ||
382 | int logical_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu); | ||
383 | |||
384 | if (logical_apicid != BAD_APICID) | ||
385 | return numaq_apicid_to_node(logical_apicid); | ||
386 | return NUMA_NO_NODE; | ||
387 | } | ||
388 | |||
400 | static void numaq_apicid_to_cpu_present(int logical_apicid, physid_mask_t *retmap) | 389 | static void numaq_apicid_to_cpu_present(int logical_apicid, physid_mask_t *retmap) |
401 | { | 390 | { |
402 | int node = numaq_apicid_to_node(logical_apicid); | 391 | int node = numaq_apicid_to_node(logical_apicid); |
@@ -483,8 +472,8 @@ static void numaq_setup_portio_remap(void) | |||
483 | (u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD); | 472 | (u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD); |
484 | } | 473 | } |
485 | 474 | ||
486 | /* Use __refdata to keep false positive warning calm. */ | 475 | /* Use __refdata to keep false positive warning calm. */ |
487 | struct apic __refdata apic_numaq = { | 476 | static struct apic __refdata apic_numaq = { |
488 | 477 | ||
489 | .name = "NUMAQ", | 478 | .name = "NUMAQ", |
490 | .probe = probe_numaq, | 479 | .probe = probe_numaq, |
@@ -507,8 +496,6 @@ struct apic __refdata apic_numaq = { | |||
507 | .ioapic_phys_id_map = numaq_ioapic_phys_id_map, | 496 | .ioapic_phys_id_map = numaq_ioapic_phys_id_map, |
508 | .setup_apic_routing = numaq_setup_apic_routing, | 497 | .setup_apic_routing = numaq_setup_apic_routing, |
509 | .multi_timer_check = numaq_multi_timer_check, | 498 | .multi_timer_check = numaq_multi_timer_check, |
510 | .apicid_to_node = numaq_apicid_to_node, | ||
511 | .cpu_to_logical_apicid = numaq_cpu_to_logical_apicid, | ||
512 | .cpu_present_to_apicid = numaq_cpu_present_to_apicid, | 499 | .cpu_present_to_apicid = numaq_cpu_present_to_apicid, |
513 | .apicid_to_cpu_present = numaq_apicid_to_cpu_present, | 500 | .apicid_to_cpu_present = numaq_apicid_to_cpu_present, |
514 | .setup_portio_remap = numaq_setup_portio_remap, | 501 | .setup_portio_remap = numaq_setup_portio_remap, |
@@ -546,4 +533,9 @@ struct apic __refdata apic_numaq = { | |||
546 | .icr_write = native_apic_icr_write, | 533 | .icr_write = native_apic_icr_write, |
547 | .wait_icr_idle = native_apic_wait_icr_idle, | 534 | .wait_icr_idle = native_apic_wait_icr_idle, |
548 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | 535 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, |
536 | |||
537 | .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, | ||
538 | .x86_32_numa_cpu_node = numaq_numa_cpu_node, | ||
549 | }; | 539 | }; |
540 | |||
541 | apic_driver(apic_numaq); | ||