diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-05-20 16:02:50 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-05-20 16:02:50 +0100 |
commit | 45963f3c8c0c69c9f8697df53749487ce3eaf292 (patch) | |
tree | baf0bd98ff7c5b00e40308cc626a7e292ce46152 /xen/arch/x86/srat.c | |
parent | 4ad717e086afa108976209d14c93f8fb4716030a (diff) | |
download | xen-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.c | 28 |
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); |