x86/acpi: store ACPI ids from MADT for future usage
Currently we don't save ACPI ids (unlike LAPIC ids which go to x86_cpu_to_apicid) from MADT and we may need this information later. Particularly, ACPI ids is the only existent way for a PVHVM Xen guest to figure out Xen's idea of its vCPUs ids before these CPUs boot and in some cases these ids diverge from Linux's cpu ids. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
This commit is contained in:
committed by
David Vrabel
parent
de2f5537b3
commit
3e9e57fad3
@@ -16,6 +16,7 @@ extern void prefill_possible_map(void);
|
|||||||
static inline void prefill_possible_map(void) {}
|
static inline void prefill_possible_map(void) {}
|
||||||
|
|
||||||
#define cpu_physical_id(cpu) boot_cpu_physical_apicid
|
#define cpu_physical_id(cpu) boot_cpu_physical_apicid
|
||||||
|
#define cpu_acpi_id(cpu) 0
|
||||||
#define safe_smp_processor_id() 0
|
#define safe_smp_processor_id() 0
|
||||||
#define stack_smp_processor_id() 0
|
#define stack_smp_processor_id() 0
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ static inline struct cpumask *cpu_llc_shared_mask(int cpu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid);
|
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid);
|
||||||
|
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u32, x86_cpu_to_acpiid);
|
||||||
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_bios_cpu_apicid);
|
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_bios_cpu_apicid);
|
||||||
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
|
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
|
||||||
DECLARE_EARLY_PER_CPU_READ_MOSTLY(int, x86_cpu_to_logical_apicid);
|
DECLARE_EARLY_PER_CPU_READ_MOSTLY(int, x86_cpu_to_logical_apicid);
|
||||||
@@ -147,6 +148,7 @@ void x86_idle_thread_init(unsigned int cpu, struct task_struct *idle);
|
|||||||
void smp_store_boot_cpu_info(void);
|
void smp_store_boot_cpu_info(void);
|
||||||
void smp_store_cpu_info(int id);
|
void smp_store_cpu_info(int id);
|
||||||
#define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu)
|
#define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu)
|
||||||
|
#define cpu_acpi_id(cpu) per_cpu(x86_cpu_to_acpiid, cpu)
|
||||||
|
|
||||||
#else /* !CONFIG_SMP */
|
#else /* !CONFIG_SMP */
|
||||||
#define wbinvd_on_cpu(cpu) wbinvd()
|
#define wbinvd_on_cpu(cpu) wbinvd()
|
||||||
|
|||||||
@@ -161,13 +161,15 @@ static int __init acpi_parse_madt(struct acpi_table_header *table)
|
|||||||
/**
|
/**
|
||||||
* acpi_register_lapic - register a local apic and generates a logic cpu number
|
* acpi_register_lapic - register a local apic and generates a logic cpu number
|
||||||
* @id: local apic id to register
|
* @id: local apic id to register
|
||||||
|
* @acpiid: ACPI id to register
|
||||||
* @enabled: this cpu is enabled or not
|
* @enabled: this cpu is enabled or not
|
||||||
*
|
*
|
||||||
* Returns the logic cpu number which maps to the local apic
|
* Returns the logic cpu number which maps to the local apic
|
||||||
*/
|
*/
|
||||||
static int acpi_register_lapic(int id, u8 enabled)
|
static int acpi_register_lapic(int id, u32 acpiid, u8 enabled)
|
||||||
{
|
{
|
||||||
unsigned int ver = 0;
|
unsigned int ver = 0;
|
||||||
|
int cpu;
|
||||||
|
|
||||||
if (id >= MAX_LOCAL_APIC) {
|
if (id >= MAX_LOCAL_APIC) {
|
||||||
printk(KERN_INFO PREFIX "skipped apicid that is too big\n");
|
printk(KERN_INFO PREFIX "skipped apicid that is too big\n");
|
||||||
@@ -182,7 +184,11 @@ static int acpi_register_lapic(int id, u8 enabled)
|
|||||||
if (boot_cpu_physical_apicid != -1U)
|
if (boot_cpu_physical_apicid != -1U)
|
||||||
ver = apic_version[boot_cpu_physical_apicid];
|
ver = apic_version[boot_cpu_physical_apicid];
|
||||||
|
|
||||||
return generic_processor_info(id, ver);
|
cpu = generic_processor_info(id, ver);
|
||||||
|
if (cpu >= 0)
|
||||||
|
early_per_cpu(x86_cpu_to_acpiid, cpu) = acpiid;
|
||||||
|
|
||||||
|
return cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init
|
static int __init
|
||||||
@@ -212,7 +218,7 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
|
|||||||
if (!apic->apic_id_valid(apic_id) && enabled)
|
if (!apic->apic_id_valid(apic_id) && enabled)
|
||||||
printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
|
printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
|
||||||
else
|
else
|
||||||
acpi_register_lapic(apic_id, enabled);
|
acpi_register_lapic(apic_id, processor->uid, enabled);
|
||||||
#else
|
#else
|
||||||
printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
|
printk(KERN_WARNING PREFIX "x2apic entry ignored\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -240,6 +246,7 @@ acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
|
|||||||
* when we use CPU hotplug.
|
* when we use CPU hotplug.
|
||||||
*/
|
*/
|
||||||
acpi_register_lapic(processor->id, /* APIC ID */
|
acpi_register_lapic(processor->id, /* APIC ID */
|
||||||
|
processor->processor_id, /* ACPI ID */
|
||||||
processor->lapic_flags & ACPI_MADT_ENABLED);
|
processor->lapic_flags & ACPI_MADT_ENABLED);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -258,6 +265,7 @@ acpi_parse_sapic(struct acpi_subtable_header *header, const unsigned long end)
|
|||||||
acpi_table_print_madt_entry(header);
|
acpi_table_print_madt_entry(header);
|
||||||
|
|
||||||
acpi_register_lapic((processor->id << 8) | processor->eid,/* APIC ID */
|
acpi_register_lapic((processor->id << 8) | processor->eid,/* APIC ID */
|
||||||
|
processor->processor_id, /* ACPI ID */
|
||||||
processor->lapic_flags & ACPI_MADT_ENABLED);
|
processor->lapic_flags & ACPI_MADT_ENABLED);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -714,7 +722,7 @@ int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
|
|||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
cpu = acpi_register_lapic(physid, ACPI_MADT_ENABLED);
|
cpu = acpi_register_lapic(physid, U32_MAX, ACPI_MADT_ENABLED);
|
||||||
if (cpu < 0) {
|
if (cpu < 0) {
|
||||||
pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
|
pr_info(PREFIX "Unable to map lapic to logical cpu number\n");
|
||||||
return cpu;
|
return cpu;
|
||||||
|
|||||||
@@ -92,8 +92,10 @@ static int apic_extnmi = APIC_EXTNMI_BSP;
|
|||||||
*/
|
*/
|
||||||
DEFINE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid, BAD_APICID);
|
DEFINE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid, BAD_APICID);
|
||||||
DEFINE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_bios_cpu_apicid, BAD_APICID);
|
DEFINE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_bios_cpu_apicid, BAD_APICID);
|
||||||
|
DEFINE_EARLY_PER_CPU_READ_MOSTLY(u32, x86_cpu_to_acpiid, U32_MAX);
|
||||||
EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid);
|
EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid);
|
||||||
EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);
|
EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);
|
||||||
|
EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_acpiid);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
|
|
||||||
|
|||||||
@@ -236,6 +236,8 @@ void __init setup_per_cpu_areas(void)
|
|||||||
early_per_cpu_map(x86_cpu_to_apicid, cpu);
|
early_per_cpu_map(x86_cpu_to_apicid, cpu);
|
||||||
per_cpu(x86_bios_cpu_apicid, cpu) =
|
per_cpu(x86_bios_cpu_apicid, cpu) =
|
||||||
early_per_cpu_map(x86_bios_cpu_apicid, cpu);
|
early_per_cpu_map(x86_bios_cpu_apicid, cpu);
|
||||||
|
per_cpu(x86_cpu_to_acpiid, cpu) =
|
||||||
|
early_per_cpu_map(x86_cpu_to_acpiid, cpu);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
per_cpu(x86_cpu_to_logical_apicid, cpu) =
|
per_cpu(x86_cpu_to_logical_apicid, cpu) =
|
||||||
@@ -271,6 +273,7 @@ void __init setup_per_cpu_areas(void)
|
|||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
early_per_cpu_ptr(x86_cpu_to_apicid) = NULL;
|
early_per_cpu_ptr(x86_cpu_to_apicid) = NULL;
|
||||||
early_per_cpu_ptr(x86_bios_cpu_apicid) = NULL;
|
early_per_cpu_ptr(x86_bios_cpu_apicid) = NULL;
|
||||||
|
early_per_cpu_ptr(x86_cpu_to_acpiid) = NULL;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
early_per_cpu_ptr(x86_cpu_to_logical_apicid) = NULL;
|
early_per_cpu_ptr(x86_cpu_to_logical_apicid) = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user