aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/srat.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-05-20 16:02:50 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-05-20 16:02:50 +0100
commit45963f3c8c0c69c9f8697df53749487ce3eaf292 (patch)
treebaf0bd98ff7c5b00e40308cc626a7e292ce46152 /xen/arch/x86/srat.c
parent4ad717e086afa108976209d14c93f8fb4716030a (diff)
downloadxen-45963f3c8c0c69c9f8697df53749487ce3eaf292.tar.gz
xen-45963f3c8c0c69c9f8697df53749487ce3eaf292.tar.bz2
xen-45963f3c8c0c69c9f8697df53749487ce3eaf292.zip
ACPI/NUMA: Improve SRAT parsing
This is to properly handle SRAT rev 2 extended proximity domain values. Also a first step to eliminate the redundant definitions of ACPI provided table structures (Linux eliminated all of the duplicates from include/linux/acpi.h in 2.6.21). Portions based on a Linux patch from Kurt Garloff <garloff@suse.de> and Alexey Starikovskiy <astarikovskiy@suse.de>. IA64 build tested only. Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'xen/arch/x86/srat.c')
-rw-r--r--xen/arch/x86/srat.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c
index 1fe9f895f5..f5fe812bf0 100644
--- a/xen/arch/x86/srat.c
+++ b/xen/arch/x86/srat.c
@@ -132,17 +132,23 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
/* Callback for Proximity Domain -> LAPIC mapping */
void __init
-acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
+acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
{
int pxm, node;
if (srat_disabled())
return;
- if (pa->header.length != sizeof(struct acpi_table_processor_affinity)) { bad_srat();
+ if (pa->header.length != sizeof(struct acpi_srat_cpu_affinity)) {
+ bad_srat();
return;
}
- if (pa->flags.enabled == 0)
+ if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
return;
- pxm = pa->proximity_domain;
+ pxm = pa->proximity_domain_lo;
+ if (srat_rev >= 2) {
+ pxm |= pa->proximity_domain_hi[0] << 8;
+ pxm |= pa->proximity_domain_hi[1] << 16;
+ pxm |= pa->proximity_domain_hi[2] << 24;
+ }
node = setup_node(pxm);
if (node < 0) {
printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
@@ -157,7 +163,7 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
/* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
void __init
-acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
+acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
{
struct node *nd;
u64 start, end;
@@ -166,15 +172,17 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
if (srat_disabled())
return;
- if (ma->header.length != sizeof(struct acpi_table_memory_affinity)) {
+ if (ma->header.length != sizeof(struct acpi_srat_mem_affinity)) {
bad_srat();
return;
}
- if (ma->flags.enabled == 0)
+ if (!(ma->flags & ACPI_SRAT_MEM_ENABLED))
return;
- start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32);
- end = start + (ma->length_lo | ((u64)ma->length_hi << 32));
+ start = ma->base_address;
+ end = start + ma->length;
pxm = ma->proximity_domain;
+ if (srat_rev < 2)
+ pxm &= 0xff;
node = setup_node(pxm);
if (node < 0) {
printk(KERN_ERR "SRAT: Too many proximity domains.\n");
@@ -182,7 +190,7 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
return;
}
/* It is fine to add this area to the nodes data it will be used later*/
- if (ma->flags.hot_pluggable == 1)
+ if (ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)
printk(KERN_INFO "SRAT: hot plug zone found %"PRIx64" - %"PRIx64" \n",
start, end);
i = conflicting_nodes(start, end);