diff options
| author | Suresh Siddha <suresh.b.siddha@intel.com> | 2009-03-30 13:55:30 -0800 | 
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2009-04-03 20:08:12 -0400 | 
| commit | 7237d3de78ff89ec2e18eae5fe962d063024fef5 (patch) | |
| tree | 07d0196e9e3122546cc0366c686d363423bfe894 /drivers/acpi/numa.c | |
| parent | 8e0ee43bc2c3e19db56a4adaa9a9b04ce885cd84 (diff) | |
x86, ACPI: add support for x2apic ACPI extensions
All logical processors with APIC ID values of 255 and greater will have their
APIC reported through Processor X2APIC structure (type-9 entry type) and all
logical processors with APIC ID less than 255 will have their APIC reported
through legacy Processor Local APIC (type-0 entry type) only. This is the
same case even for NMI structure reporting.
    
The Processor X2APIC Affinity structure provides the association between the
X2APIC ID of a logical processor and the proximity domain to which the logical
processor belongs.
    
For OSPM, Procssor IDs outside the 0-254 range are to be declared as Device()
objects in the ACPI namespace.
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/numa.c')
| -rw-r--r-- | drivers/acpi/numa.c | 46 | 
1 files changed, 45 insertions, 1 deletions
| diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index 3a0d8ef25c75..d440ccd27d91 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c @@ -131,6 +131,21 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header)  #endif				/* ACPI_DEBUG_OUTPUT */  		break; +	case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: +#ifdef ACPI_DEBUG_OUTPUT +		{ +			struct acpi_srat_x2apic_cpu_affinity *p = +			    (struct acpi_srat_x2apic_cpu_affinity *)header; +			ACPI_DEBUG_PRINT((ACPI_DB_INFO, +					  "SRAT Processor (x2apicid[0x%08x]) in" +					  " proximity domain %d %s\n", +					  p->apic_id, +					  p->proximity_domain, +					  (p->flags & ACPI_SRAT_CPU_ENABLED) ? +					  "enabled" : "disabled")); +		} +#endif				/* ACPI_DEBUG_OUTPUT */ +		break;  	default:  		printk(KERN_WARNING PREFIX  		       "Found unsupported SRAT entry (type = 0x%x)\n", @@ -180,8 +195,35 @@ static int __init acpi_parse_slit(struct acpi_table_header *table)  	return 0;  } +void __init __attribute__ ((weak)) +acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa) +{ +	printk(KERN_WARNING PREFIX +	       "Found unsupported x2apic [0x%08x] SRAT entry\n", pa->apic_id); +	return; +} + + +static int __init +acpi_parse_x2apic_affinity(struct acpi_subtable_header *header, +			   const unsigned long end) +{ +	struct acpi_srat_x2apic_cpu_affinity *processor_affinity; + +	processor_affinity = (struct acpi_srat_x2apic_cpu_affinity *)header; +	if (!processor_affinity) +		return -EINVAL; + +	acpi_table_print_srat_entry(header); + +	/* let architecture-dependent part to do it */ +	acpi_numa_x2apic_affinity_init(processor_affinity); + +	return 0; +} +  static int __init -acpi_parse_processor_affinity(struct acpi_subtable_header * header, +acpi_parse_processor_affinity(struct acpi_subtable_header *header,  			      const unsigned long end)  {  	struct acpi_srat_cpu_affinity *processor_affinity; @@ -241,6 +283,8 @@ int __init acpi_numa_init(void)  {  	/* SRAT: Static Resource Affinity Table */  	if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) { +		acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY, +				      acpi_parse_x2apic_affinity, NR_CPUS);  		acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,  				      acpi_parse_processor_affinity, NR_CPUS);  		acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY, | 
