Commit 514604c6 authored by Christoph Lameter's avatar Christoph Lameter Committed by Tony Luck

[IA64] pcibus_to_node implementation for IA64

pcibus_to_node provides a way for the Linux kernel to identify to which
node a certain pcibus connects to. Allocations of control structures
for devices can then be made on the node where the pci bus is located
to allow local access during interrupt and other device manipulation.

This patch provides a new "node" field in the the pci_controller
structure. The node field will be set based on ACPI information (thanks
to Alex Williamson  <alex.williamson@hp.com for that piece).
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 1604d9c8
...@@ -157,6 +157,7 @@ alloc_pci_controller (int seg) ...@@ -157,6 +157,7 @@ alloc_pci_controller (int seg)
memset(controller, 0, sizeof(*controller)); memset(controller, 0, sizeof(*controller));
controller->segment = seg; controller->segment = seg;
controller->node = -1;
return controller; return controller;
} }
...@@ -288,6 +289,7 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) ...@@ -288,6 +289,7 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
unsigned int windows = 0; unsigned int windows = 0;
struct pci_bus *pbus; struct pci_bus *pbus;
char *name; char *name;
int pxm;
controller = alloc_pci_controller(domain); controller = alloc_pci_controller(domain);
if (!controller) if (!controller)
...@@ -295,10 +297,16 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) ...@@ -295,10 +297,16 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
controller->acpi_handle = device->handle; controller->acpi_handle = device->handle;
pxm = acpi_get_pxm(controller->acpi_handle);
#ifdef CONFIG_NUMA
if (pxm >= 0)
controller->node = pxm_to_nid_map[pxm];
#endif
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
&windows); &windows);
controller->window = kmalloc(sizeof(*controller->window) * windows, controller->window = kmalloc_node(sizeof(*controller->window) * windows,
GFP_KERNEL); GFP_KERNEL, controller->node);
if (!controller->window) if (!controller->window)
goto out2; goto out2;
......
...@@ -128,6 +128,7 @@ struct pci_controller { ...@@ -128,6 +128,7 @@ struct pci_controller {
void *acpi_handle; void *acpi_handle;
void *iommu; void *iommu;
int segment; int segment;
int node; /* nearest node with memory or -1 for global allocation */
unsigned int windows; unsigned int windows;
struct pci_window *window; struct pci_window *window;
......
...@@ -40,6 +40,11 @@ ...@@ -40,6 +40,11 @@
*/ */
#define node_to_first_cpu(node) (__ffs(node_to_cpumask(node))) #define node_to_first_cpu(node) (__ffs(node_to_cpumask(node)))
/*
* Determines the node for a given pci bus
*/
#define pcibus_to_node(bus) PCI_CONTROLLER(bus)->node
void build_cpu_to_node_map(void); void build_cpu_to_node_map(void);
#define SD_CPU_INIT (struct sched_domain) { \ #define SD_CPU_INIT (struct sched_domain) { \
......
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