Commit 69e1a33f authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[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: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 413588c7
...@@ -213,12 +213,18 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c ...@@ -213,12 +213,18 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c
node_end_pfn[nid] = memory_chunk->end_pfn; node_end_pfn[nid] = memory_chunk->end_pfn;
} }
static u8 pxm_to_nid_map[MAX_PXM_DOMAINS];/* _PXM to logical node ID map */
int pxm_to_node(int pxm)
{
return pxm_to_nid_map[pxm];
}
/* Parse the ACPI Static Resource Affinity Table */ /* Parse the ACPI Static Resource Affinity Table */
static int __init acpi20_parse_srat(struct acpi_table_srat *sratp) static int __init acpi20_parse_srat(struct acpi_table_srat *sratp)
{ {
u8 *start, *end, *p; u8 *start, *end, *p;
int i, j, nid; int i, j, nid;
u8 pxm_to_nid_map[MAX_PXM_DOMAINS];/* _PXM to logical node ID map */
u8 nid_to_pxm_map[MAX_NUMNODES];/* logical node ID to _PXM map */ u8 nid_to_pxm_map[MAX_NUMNODES];/* logical node ID to _PXM map */
start = (u8 *)(&(sratp->reserved) + 1); /* skip header */ start = (u8 *)(&(sratp->reserved) + 1); /* skip header */
......
...@@ -3,16 +3,31 @@ ...@@ -3,16 +3,31 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <asm/hw_irq.h> #include <asm/hw_irq.h>
#include <asm/numa.h>
#include "pci.h" #include "pci.h"
struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum) struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum)
{ {
struct pci_bus *bus;
if (domain != 0) { if (domain != 0) {
printk(KERN_WARNING "PCI: Multiple domains not supported\n"); printk(KERN_WARNING "PCI: Multiple domains not supported\n");
return NULL; return NULL;
} }
return pcibios_scan_root(busnum); bus = pcibios_scan_root(busnum);
#ifdef CONFIG_ACPI_NUMA
if (bus != NULL) {
int pxm = acpi_get_pxm(device->handle);
if (pxm >= 0) {
bus->sysdata = (void *)(unsigned long)pxm_to_node(pxm);
printk("bus %d -> pxm %d -> node %ld\n",
busnum, pxm, (long)(bus->sysdata));
}
}
#endif
return bus;
} }
extern int pci_routeirq; extern int pci_routeirq;
......
...@@ -46,8 +46,6 @@ int acpi_found_madt; ...@@ -46,8 +46,6 @@ int acpi_found_madt;
int apic_version [MAX_APICS]; int apic_version [MAX_APICS];
unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
unsigned char pci_bus_to_node [256];
EXPORT_SYMBOL(pci_bus_to_node);
static int mp_current_pci_id = 0; static int mp_current_pci_id = 0;
/* I/O APIC entries */ /* I/O APIC entries */
......
...@@ -25,6 +25,13 @@ static nodemask_t nodes_found __initdata; ...@@ -25,6 +25,13 @@ static nodemask_t nodes_found __initdata;
static struct node nodes[MAX_NUMNODES] __initdata; static struct node nodes[MAX_NUMNODES] __initdata;
static __u8 pxm2node[256] = { [0 ... 255] = 0xff }; static __u8 pxm2node[256] = { [0 ... 255] = 0xff };
int pxm_to_node(int pxm)
{
if ((unsigned)pxm >= 256)
return 0;
return pxm2node[pxm];
}
static __init int setup_node(int pxm) static __init int setup_node(int pxm)
{ {
unsigned node = pxm2node[pxm]; unsigned node = pxm2node[pxm];
......
...@@ -58,10 +58,16 @@ fill_mp_bus_to_cpumask(void) ...@@ -58,10 +58,16 @@ fill_mp_bus_to_cpumask(void)
for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus); for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus); j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
j++) { j++) {
int node = NODE_ID(nid); struct pci_bus *bus;
long node = NODE_ID(nid);
/* Algorithm a bit dumb, but
it shouldn't matter here */
bus = pci_find_bus(0, j);
if (!bus)
continue;
if (!node_online(node)) if (!node_online(node))
node = 0; node = 0;
pci_bus_to_node[j] = node; bus->sysdata = (void *)node;
} }
} }
} }
......
int pxm_to_nid(int pxm);
...@@ -60,7 +60,7 @@ static inline int node_to_first_cpu(int node) ...@@ -60,7 +60,7 @@ static inline int node_to_first_cpu(int node)
return first_cpu(mask); return first_cpu(mask);
} }
#define pcibus_to_node(bus) mp_bus_id_to_node[(bus)->number] #define pcibus_to_node(bus) ((long) (bus)->sysdata)
#define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus)) #define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus))
/* sched_domains SD_NODE_INIT for NUMAQ machines */ /* sched_domains SD_NODE_INIT for NUMAQ machines */
......
...@@ -9,6 +9,7 @@ struct node { ...@@ -9,6 +9,7 @@ struct node {
}; };
extern int compute_hash_shift(struct node *nodes, int numnodes); extern int compute_hash_shift(struct node *nodes, int numnodes);
extern int pxm_to_node(int nid);
#define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT))
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
extern cpumask_t cpu_online_map; extern cpumask_t cpu_online_map;
extern unsigned char cpu_to_node[]; extern unsigned char cpu_to_node[];
extern unsigned char pci_bus_to_node[];
extern cpumask_t node_to_cpumask[]; extern cpumask_t node_to_cpumask[];
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
...@@ -26,7 +25,7 @@ extern int __node_distance(int, int); ...@@ -26,7 +25,7 @@ extern int __node_distance(int, int);
#define parent_node(node) (node) #define parent_node(node) (node)
#define node_to_first_cpu(node) (__ffs(node_to_cpumask[node])) #define node_to_first_cpu(node) (__ffs(node_to_cpumask[node]))
#define node_to_cpumask(node) (node_to_cpumask[node]) #define node_to_cpumask(node) (node_to_cpumask[node])
#define pcibus_to_node(bus) pci_bus_to_node[(bus)->number] #define pcibus_to_node(bus) ((long)(bus->sysdata))
#define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus)); #define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus));
/* sched_domains SD_NODE_INIT for x86_64 machines */ /* sched_domains SD_NODE_INIT for x86_64 machines */
......
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