x86/apic: Add separate apic_id_valid() functions for selected apic drivers
As suggested by Suresh Siddha and Yinghai Lu: For x2apic pre-enabled systems, apic driver is set already early through early_acpi_boot_init()/early_acpi_process_madt()/ acpi_parse_madt()/default_acpi_madt_oem_check() path so that apic_id_valid() checking will be sufficient during MADT and SRAT parsing. For non-x2apic pre-enabled systems, all apic ids should be less than 255. This allows us to substitute the checks in arch/x86/kernel/acpi/boot.c::acpi_parse_x2apic() and arch/x86/mm/srat.c::acpi_numa_x2apic_affinity_init() with apic->apic_id_valid(). In addition we can avoid feigning the x2apic cpu feature in the NumaChip apic code. The following apic drivers have separate apic_id_valid() functions which will accept x2apic type IDs : x2apic_phys x2apic_cluster x2apic_uv_x apic_numachip Signed-off-by: Steffen Persvold <sp@numascale.com> Cc: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Daniel J Blueman <daniel@numascale-asia.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Jack Steiner <steiner@sgi.com> Link: http://lkml.kernel.org/r/1331925935-13372-1-git-send-email-sp@numascale.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Родитель
e335e3eb82
Коммит
b7157acf42
|
@ -535,7 +535,7 @@ static inline unsigned int read_apic_id(void)
|
||||||
|
|
||||||
static inline int default_apic_id_valid(int apicid)
|
static inline int default_apic_id_valid(int apicid)
|
||||||
{
|
{
|
||||||
return x2apic_mode || (apicid < 255);
|
return (apicid < 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void default_setup_apic_routing(void);
|
extern void default_setup_apic_routing(void);
|
||||||
|
|
|
@ -18,6 +18,11 @@ static const struct cpumask *x2apic_target_cpus(void)
|
||||||
return cpu_online_mask;
|
return cpu_online_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int x2apic_apic_id_valid(int apicid)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int x2apic_apic_id_registered(void)
|
static int x2apic_apic_id_registered(void)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -239,7 +239,7 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
|
||||||
* to not preallocating memory for all NR_CPUS
|
* to not preallocating memory for all NR_CPUS
|
||||||
* when we use CPU hotplug.
|
* when we use CPU hotplug.
|
||||||
*/
|
*/
|
||||||
if (!cpu_has_x2apic && (apic_id >= 0xff) && 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, enabled);
|
||||||
|
|
|
@ -229,11 +229,10 @@ static int __init numachip_system_init(void)
|
||||||
}
|
}
|
||||||
early_initcall(numachip_system_init);
|
early_initcall(numachip_system_init);
|
||||||
|
|
||||||
static int __cpuinit numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||||
{
|
{
|
||||||
if (!strncmp(oem_id, "NUMASC", 6)) {
|
if (!strncmp(oem_id, "NUMASC", 6)) {
|
||||||
numachip_system = 1;
|
numachip_system = 1;
|
||||||
setup_force_cpu_cap(X86_FEATURE_X2APIC);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,7 @@ static struct apic apic_x2apic_cluster = {
|
||||||
.name = "cluster x2apic",
|
.name = "cluster x2apic",
|
||||||
.probe = x2apic_cluster_probe,
|
.probe = x2apic_cluster_probe,
|
||||||
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
|
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
|
||||||
.apic_id_valid = default_apic_id_valid,
|
.apic_id_valid = x2apic_apic_id_valid,
|
||||||
.apic_id_registered = x2apic_apic_id_registered,
|
.apic_id_registered = x2apic_apic_id_registered,
|
||||||
|
|
||||||
.irq_delivery_mode = dest_LowestPrio,
|
.irq_delivery_mode = dest_LowestPrio,
|
||||||
|
|
|
@ -119,7 +119,7 @@ static struct apic apic_x2apic_phys = {
|
||||||
.name = "physical x2apic",
|
.name = "physical x2apic",
|
||||||
.probe = x2apic_phys_probe,
|
.probe = x2apic_phys_probe,
|
||||||
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
|
.acpi_madt_oem_check = x2apic_acpi_madt_oem_check,
|
||||||
.apic_id_valid = default_apic_id_valid,
|
.apic_id_valid = x2apic_apic_id_valid,
|
||||||
.apic_id_registered = x2apic_apic_id_registered,
|
.apic_id_registered = x2apic_apic_id_registered,
|
||||||
|
|
||||||
.irq_delivery_mode = dest_Fixed,
|
.irq_delivery_mode = dest_Fixed,
|
||||||
|
|
|
@ -266,6 +266,11 @@ static void uv_send_IPI_all(int vector)
|
||||||
uv_send_IPI_mask(cpu_online_mask, vector);
|
uv_send_IPI_mask(cpu_online_mask, vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int uv_apic_id_valid(int apicid)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int uv_apic_id_registered(void)
|
static int uv_apic_id_registered(void)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -351,7 +356,7 @@ static struct apic __refdata apic_x2apic_uv_x = {
|
||||||
.name = "UV large system",
|
.name = "UV large system",
|
||||||
.probe = uv_probe,
|
.probe = uv_probe,
|
||||||
.acpi_madt_oem_check = uv_acpi_madt_oem_check,
|
.acpi_madt_oem_check = uv_acpi_madt_oem_check,
|
||||||
.apic_id_valid = default_apic_id_valid,
|
.apic_id_valid = uv_apic_id_valid,
|
||||||
.apic_id_registered = uv_apic_id_registered,
|
.apic_id_registered = uv_apic_id_registered,
|
||||||
|
|
||||||
.irq_delivery_mode = dest_Fixed,
|
.irq_delivery_mode = dest_Fixed,
|
||||||
|
|
|
@ -70,7 +70,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
|
||||||
return;
|
return;
|
||||||
pxm = pa->proximity_domain;
|
pxm = pa->proximity_domain;
|
||||||
apic_id = pa->apic_id;
|
apic_id = pa->apic_id;
|
||||||
if (!cpu_has_x2apic && (apic_id >= 0xff)) {
|
if (!apic->apic_id_valid(apic_id)) {
|
||||||
printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n",
|
printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n",
|
||||||
pxm, apic_id);
|
pxm, apic_id);
|
||||||
return;
|
return;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче