aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2005-09-12 12:49:24 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-12 13:49:57 -0400
commit69e1a33f62eff9b228a8cc2c3e4429dbee8966c9 (patch)
tree985f088d05f2d936cfafa5dd0232aa59391dc663 /arch
parent413588c7cb8113c03d0044f1d41b832ad7201c29 (diff)
[PATCH] x86-64: Use ACPI PXM to parse PCI<->node assignments
Since this is shared code I had to implement it for i386 too Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/srat.c8
-rw-r--r--arch/i386/pci/acpi.c17
-rw-r--r--arch/x86_64/kernel/mpparse.c2
-rw-r--r--arch/x86_64/mm/srat.c7
-rw-r--r--arch/x86_64/pci/k8-bus.c10
5 files changed, 38 insertions, 6 deletions
diff --git a/arch/i386/kernel/srat.c b/arch/i386/kernel/srat.c
index 7b3b27d64409..516bf5653b02 100644
--- a/arch/i386/kernel/srat.c
+++ b/arch/i386/kernel/srat.c
@@ -213,12 +213,18 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c
213 node_end_pfn[nid] = memory_chunk->end_pfn; 213 node_end_pfn[nid] = memory_chunk->end_pfn;
214} 214}
215 215
216static u8 pxm_to_nid_map[MAX_PXM_DOMAINS];/* _PXM to logical node ID map */
217
218int pxm_to_node(int pxm)
219{
220 return pxm_to_nid_map[pxm];
221}
222
216/* Parse the ACPI Static Resource Affinity Table */ 223/* Parse the ACPI Static Resource Affinity Table */
217static int __init acpi20_parse_srat(struct acpi_table_srat *sratp) 224static int __init acpi20_parse_srat(struct acpi_table_srat *sratp)
218{ 225{
219 u8 *start, *end, *p; 226 u8 *start, *end, *p;
220 int i, j, nid; 227 int i, j, nid;
221 u8 pxm_to_nid_map[MAX_PXM_DOMAINS];/* _PXM to logical node ID map */
222 u8 nid_to_pxm_map[MAX_NUMNODES];/* logical node ID to _PXM map */ 228 u8 nid_to_pxm_map[MAX_NUMNODES];/* logical node ID to _PXM map */
223 229
224 start = (u8 *)(&(sratp->reserved) + 1); /* skip header */ 230 start = (u8 *)(&(sratp->reserved) + 1); /* skip header */
diff --git a/arch/i386/pci/acpi.c b/arch/i386/pci/acpi.c
index 42913f43feb0..2941674f35eb 100644
--- a/arch/i386/pci/acpi.c
+++ b/arch/i386/pci/acpi.c
@@ -3,16 +3,31 @@
3#include <linux/init.h> 3#include <linux/init.h>
4#include <linux/irq.h> 4#include <linux/irq.h>
5#include <asm/hw_irq.h> 5#include <asm/hw_irq.h>
6#include <asm/numa.h>
6#include "pci.h" 7#include "pci.h"
7 8
8struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum) 9struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum)
9{ 10{
11 struct pci_bus *bus;
12
10 if (domain != 0) { 13 if (domain != 0) {
11 printk(KERN_WARNING "PCI: Multiple domains not supported\n"); 14 printk(KERN_WARNING "PCI: Multiple domains not supported\n");
12 return NULL; 15 return NULL;
13 } 16 }
14 17
15 return pcibios_scan_root(busnum); 18 bus = pcibios_scan_root(busnum);
19#ifdef CONFIG_ACPI_NUMA
20 if (bus != NULL) {
21 int pxm = acpi_get_pxm(device->handle);
22 if (pxm >= 0) {
23 bus->sysdata = (void *)(unsigned long)pxm_to_node(pxm);
24 printk("bus %d -> pxm %d -> node %ld\n",
25 busnum, pxm, (long)(bus->sysdata));
26 }
27 }
28#endif
29
30 return bus;
16} 31}
17 32
18extern int pci_routeirq; 33extern int pci_routeirq;
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
index 312ecc9e5f7f..11642526c5b7 100644
--- a/arch/x86_64/kernel/mpparse.c
+++ b/arch/x86_64/kernel/mpparse.c
@@ -46,8 +46,6 @@ int acpi_found_madt;
46int apic_version [MAX_APICS]; 46int apic_version [MAX_APICS];
47unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; 47unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
48int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; 48int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
49unsigned char pci_bus_to_node [256];
50EXPORT_SYMBOL(pci_bus_to_node);
51 49
52static int mp_current_pci_id = 0; 50static int mp_current_pci_id = 0;
53/* I/O APIC entries */ 51/* I/O APIC entries */
diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c
index 92f6ec79b232..db6b073a149f 100644
--- a/arch/x86_64/mm/srat.c
+++ b/arch/x86_64/mm/srat.c
@@ -25,6 +25,13 @@ static nodemask_t nodes_found __initdata;
25static struct node nodes[MAX_NUMNODES] __initdata; 25static struct node nodes[MAX_NUMNODES] __initdata;
26static __u8 pxm2node[256] = { [0 ... 255] = 0xff }; 26static __u8 pxm2node[256] = { [0 ... 255] = 0xff };
27 27
28int pxm_to_node(int pxm)
29{
30 if ((unsigned)pxm >= 256)
31 return 0;
32 return pxm2node[pxm];
33}
34
28static __init int setup_node(int pxm) 35static __init int setup_node(int pxm)
29{ 36{
30 unsigned node = pxm2node[pxm]; 37 unsigned node = pxm2node[pxm];
diff --git a/arch/x86_64/pci/k8-bus.c b/arch/x86_64/pci/k8-bus.c
index d80c323669e0..3acf60ded2a0 100644
--- a/arch/x86_64/pci/k8-bus.c
+++ b/arch/x86_64/pci/k8-bus.c
@@ -58,10 +58,16 @@ fill_mp_bus_to_cpumask(void)
58 for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus); 58 for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
59 j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus); 59 j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
60 j++) { 60 j++) {
61 int node = NODE_ID(nid); 61 struct pci_bus *bus;
62 long node = NODE_ID(nid);
63 /* Algorithm a bit dumb, but
64 it shouldn't matter here */
65 bus = pci_find_bus(0, j);
66 if (!bus)
67 continue;
62 if (!node_online(node)) 68 if (!node_online(node))
63 node = 0; 69 node = 0;
64 pci_bus_to_node[j] = node; 70 bus->sysdata = (void *)node;
65 } 71 }
66 } 72 }
67 } 73 }