Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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;
}

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 */
static int __init acpi20_parse_srat(struct acpi_table_srat *sratp)
{
	u8 *start, *end, *p;
	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 */

	start = (u8 *)(&(sratp->reserved) + 1);	/* skip header */
+16 −1
Original line number Diff line number Diff line
@@ -3,16 +3,31 @@
#include <linux/init.h>
#include <linux/irq.h>
#include <asm/hw_irq.h>
#include <asm/numa.h>
#include "pci.h"

struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int domain, int busnum)
{
	struct pci_bus *bus;

	if (domain != 0) {
		printk(KERN_WARNING "PCI: Multiple domains not supported\n");
		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;
+0 −2
Original line number Diff line number Diff line
@@ -46,8 +46,6 @@ int acpi_found_madt;
int apic_version [MAX_APICS];
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 };
unsigned char pci_bus_to_node [256];
EXPORT_SYMBOL(pci_bus_to_node);

static int mp_current_pci_id = 0;
/* I/O APIC entries */
+7 −0
Original line number Diff line number Diff line
@@ -25,6 +25,13 @@ static nodemask_t nodes_found __initdata;
static struct node nodes[MAX_NUMNODES] __initdata;
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)
{
	unsigned node = pxm2node[pxm];
+8 −2
Original line number Diff line number Diff line
@@ -58,10 +58,16 @@ fill_mp_bus_to_cpumask(void)
				for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
				     j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
				     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))
						node = 0;
					pci_bus_to_node[j] = node;
					bus->sysdata = (void *)node;
				}		
			}
		}
Loading