This is to properly handle SRAT rev 2 extended proximity domain values.
At ones, it is 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>
--- 2009-05-19.orig/xen/arch/ia64/linux-xen/acpi.c 2009-05-20 14:40:35.000000000
+0200
+++ 2009-05-19/xen/arch/ia64/linux-xen/acpi.c 2009-05-20 14:54:26.000000000
+0200
@@ -55,6 +55,7 @@
#include <asm/xen/hypervisor.h>
#ifdef XEN
#include <asm/hw_irq.h>
+#include <asm/numa.h>
extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
#endif
@@ -484,22 +485,28 @@ static u32 __devinitdata pxm_flag[PXM_FL
static struct acpi_table_slit __initdata *slit_table;
cpumask_t early_cpu_possible_map = CPU_MASK_NONE;
-static int get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)
+static int __init
+get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)
{
int pxm;
pxm = pa->proximity_domain_lo;
- if (ia64_platform_is("sn2"))
+ 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;
+ } else if (ia64_platform_is("sn2"))
pxm += pa->proximity_domain_hi[0] << 8;
return pxm;
}
-static int get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)
+static int __init
+get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)
{
int pxm;
pxm = ma->proximity_domain;
- if (!ia64_platform_is("sn2"))
+ if (!ia64_platform_is("sn2") && srat_rev < 2)
pxm &= 0xff;
return pxm;
@@ -525,17 +532,9 @@ void __init acpi_numa_slit_init(struct a
slit_table = slit;
}
-#ifndef XEN
void __init
acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
-#else
-void __init
-acpi_numa_processor_affinity_init (struct acpi_table_processor_affinity *pa__)
-#endif
{
-#ifdef XEN
- struct acpi_srat_cpu_affinity *pa = (struct acpi_srat_cpu_affinity *)pa__;
-#endif
int pxm;
if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
@@ -554,18 +553,9 @@ acpi_numa_processor_affinity_init (struc
srat_num_cpus++;
}
-#ifndef XEN
void __init
acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
-#else
-void __init
-acpi_numa_memory_affinity_init (struct acpi_table_memory_affinity *ma__)
-#endif
{
-#ifdef XEN
- struct acpi_srat_mem_affinity *ma - (struct acpi_srat_mem_affinity *)ma__;
-#endif
unsigned long paddr, size;
int pxm;
struct node_memblk_s *p, *q, *pend;
--- 2009-05-19.orig/xen/arch/x86/srat.c 2009-05-20 14:40:35.000000000 +0200
+++ 2009-05-19/xen/arch/x86/srat.c 2009-05-19 18:03:28.000000000 +0200
@@ -132,17 +132,23 @@ void __init acpi_numa_slit_init(struct a
/* 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
/* 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 ac
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 ac
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);
--- 2009-05-19.orig/xen/drivers/acpi/numa.c 2009-05-20 14:40:35.000000000 +0200
+++ 2009-05-19/xen/drivers/acpi/numa.c 2009-05-19 18:06:33.000000000 +0200
@@ -35,6 +35,8 @@
#define _COMPONENT ACPI_NUMA
ACPI_MODULE_NAME("numa")
+int __initdata srat_rev;
+
void __init acpi_table_print_srat_entry(struct acpi_subtable_header * header)
{
@@ -48,14 +50,21 @@ void __init acpi_table_print_srat_entry(
case ACPI_SRAT_PROCESSOR_AFFINITY:
#ifdef ACPI_DEBUG_OUTPUT
{
- struct acpi_table_processor_affinity *p - (struct
acpi_table_processor_affinity *)header;
+ struct acpi_srat_cpu_affinity *p + container_of(header, struct
acpi_srat_cpu_affinity, header);
+ u32 proximity_domain = p->proximity_domain_lo;
+
+ if (srat_rev >= 2) {
+ proximity_domain |= p->proximity_domain_hi[0] << 8;
+ proximity_domain |= p->proximity_domain_hi[1] << 16;
+ proximity_domain |= p->proximity_domain_hi[2] << 24;
+ }
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"SRAT Processor (id[0x%02x] eid[0x%02x]) in proximity domain %d
%s\n",
- p->apic_id, p->lsapic_eid,
- p->proximity_domain,
- p->flags.
- enabled ? "enabled" : "disabled"));
+ p->apic_id, p->local_sapic_eid,
+ proximity_domain,
+ p->flags & ACPI_SRAT_CPU_ENABLED
+ ? "enabled" : "disabled"));
}
#endif /* ACPI_DEBUG_OUTPUT */
break;
@@ -63,18 +72,20 @@ void __init acpi_table_print_srat_entry(
case ACPI_SRAT_MEMORY_AFFINITY:
#ifdef ACPI_DEBUG_OUTPUT
{
- struct acpi_table_memory_affinity *p - (struct
acpi_table_memory_affinity *)header;
+ struct acpi_srat_mem_affinity *p + container_of(header, struct
acpi_srat_mem_affinity, header);
+ u32 proximity_domain = p->proximity_domain;
+
+ if (srat_rev < 2)
+ proximity_domain &= 0xff;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
- "SRAT Memory (0x%08x%08x length 0x%08x%08x type 0x%x) in proximity
domain %d %s%s\n",
- p->base_addr_hi, p->base_addr_lo,
- p->length_hi, p->length_lo,
- p->memory_type, p->proximity_domain,
- p->flags.
- enabled ? "enabled" : "disabled",
- p->flags.
- hot_pluggable ? " hot-pluggable" :
- ""));
+ "SRAT Memory (0x%016"PRIx64" length
0x%016"PRIx64" type 0x%x) in proximity domain %d %s%s\n",
+ p->base_address, p->length,
+ p->memory_type, proximity_domain,
+ p->flags & ACPI_SRAT_MEM_ENABLED
+ ? "enabled" : "disabled",
+ p->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE
+ ? " hot-pluggable" : ""));
}
#endif /* ACPI_DEBUG_OUTPUT */
break;
@@ -98,9 +109,9 @@ static int __init
acpi_parse_processor_affinity(struct acpi_subtable_header * header,
const unsigned long end)
{
- struct acpi_table_processor_affinity *processor_affinity;
+ struct acpi_srat_cpu_affinity *processor_affinity
+ = container_of(header, struct acpi_srat_cpu_affinity, header);
- processor_affinity = (struct acpi_table_processor_affinity *)header;
if (!processor_affinity)
return -EINVAL;
@@ -116,9 +127,9 @@ static int __init
acpi_parse_memory_affinity(struct acpi_subtable_header * header,
const unsigned long end)
{
- struct acpi_table_memory_affinity *memory_affinity;
+ struct acpi_srat_mem_affinity *memory_affinity
+ = container_of(header, struct acpi_srat_mem_affinity, header);
- memory_affinity = (struct acpi_table_memory_affinity *)header;
if (!memory_affinity)
return -EINVAL;
@@ -132,6 +143,11 @@ acpi_parse_memory_affinity(struct acpi_s
static int __init acpi_parse_srat(struct acpi_table_header *table)
{
+ if (!table)
+ return -EINVAL;
+
+ srat_rev = table->revision;
+
return 0;
}
--- 2009-05-19.orig/xen/include/asm-ia64/linux-xen/asm/numa.h 2009-05-20
14:40:35.000000000 +0200
+++ 2009-05-19/xen/include/asm-ia64/linux-xen/asm/numa.h 2009-05-19
17:50:24.000000000 +0200
@@ -25,6 +25,8 @@
#include <asm/mmzone.h>
+extern int srat_rev;
+
extern u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
#ifndef XEN
extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
--- 2009-05-19.orig/xen/include/asm-x86/numa.h 2009-05-20 14:40:35.000000000
+0200
+++ 2009-05-19/xen/include/asm-x86/numa.h 2009-05-19 17:50:58.000000000 +0200
@@ -5,6 +5,8 @@
#define NODES_SHIFT 6
+extern int srat_rev;
+
extern unsigned char cpu_to_node[];
extern cpumask_t node_to_cpumask[];
--- 2009-05-19.orig/xen/include/xen/acpi.h 2009-05-20 14:40:35.000000000 +0200
+++ 2009-05-19/xen/include/xen/acpi.h 2009-05-19 17:55:35.000000000 +0200
@@ -176,35 +176,6 @@ enum acpi_srat_entry_id {
ACPI_SRAT_ENTRY_COUNT
};
-struct acpi_table_processor_affinity {
- struct acpi_subtable_header header;
- u8 proximity_domain;
- u8 apic_id;
- struct {
- u32 enabled:1;
- u32 reserved:31;
- } flags;
- u8 lsapic_eid;
- u8 reserved[7];
-} __attribute__ ((packed));
-
-struct acpi_table_memory_affinity {
- struct acpi_subtable_header header;
- u8 proximity_domain;
- u8 reserved1[5];
- u32 base_addr_lo;
- u32 base_addr_hi;
- u32 length_lo;
- u32 length_hi;
- u32 memory_type; /* See acpi_address_range_id */
- struct {
- u32 enabled:1;
- u32 hot_pluggable:1;
- u32 reserved:30;
- } flags;
- u64 reserved2;
-} __attribute__ ((packed));
-
enum acpi_address_range_id {
ACPI_ADDRESS_RANGE_MEMORY = 1,
ACPI_ADDRESS_RANGE_RESERVED = 2,
@@ -297,8 +268,8 @@ void acpi_table_print_srat_entry (struct
/* the following four functions are architecture-dependent */
void acpi_numa_slit_init (struct acpi_table_slit *slit);
-void acpi_numa_processor_affinity_init (struct acpi_table_processor_affinity
*pa);
-void acpi_numa_memory_affinity_init (struct acpi_table_memory_affinity *ma);
+void acpi_numa_processor_affinity_init (struct acpi_srat_cpu_affinity *pa);
+void acpi_numa_memory_affinity_init (struct acpi_srat_mem_affinity *ma);
void acpi_numa_arch_fixup(void);
#ifdef CONFIG_ACPI_HOTPLUG_CPU
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel