Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa63030e authored by Daniel J Blueman's avatar Daniel J Blueman Committed by Ingo Molnar
Browse files

x86/platform: Move APIC ID validity check into platform APIC code



Move APIC ID validity check into platform APIC code, so it can
be overridden when needed. For NumaChip systems, always trust
MADT, as it's constructed with high APIC IDs.

Behaviour verifies on standard x86 systems and on NumaChip
systems with this, and compile-tested with allyesconfig.

Signed-off-by: default avatarDaniel J Blueman <daniel@numascale-asia.com>
Reviewed-by: default avatarSteffen Persvold <sp@numascale.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Cc: Suresh Siddha <suresh.b.siddha@intel.com>
Link: http://lkml.kernel.org/r/1331709454-27966-1-git-send-email-daniel@numascale-asia.com


Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c96a9876
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -288,6 +288,7 @@ struct apic {

	int (*probe)(void);
	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
	int (*apic_id_valid)(int apicid);
	int (*apic_id_registered)(void);

	u32 irq_delivery_mode;
@@ -532,6 +533,11 @@ static inline unsigned int read_apic_id(void)
	return apic->get_apic_id(reg);
}

static inline int default_apic_id_valid(int apicid)
{
	return x2apic_mode || (apicid < 255);
}

extern void default_setup_apic_routing(void);

extern struct apic apic_noop;
+2 −0
Original line number Diff line number Diff line
@@ -180,6 +180,7 @@ static struct apic apic_flat = {
	.name				= "flat",
	.probe				= flat_probe,
	.acpi_madt_oem_check		= flat_acpi_madt_oem_check,
	.apic_id_valid			= default_apic_id_valid,
	.apic_id_registered		= flat_apic_id_registered,

	.irq_delivery_mode		= dest_LowestPrio,
@@ -337,6 +338,7 @@ static struct apic apic_physflat = {
	.name				= "physical flat",
	.probe				= physflat_probe,
	.acpi_madt_oem_check		= physflat_acpi_madt_oem_check,
	.apic_id_valid			= default_apic_id_valid,
	.apic_id_registered		= flat_apic_id_registered,

	.irq_delivery_mode		= dest_Fixed,
+1 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ struct apic apic_noop = {
	.probe				= noop_probe,
	.acpi_madt_oem_check		= NULL,

	.apic_id_valid			= default_apic_id_valid,
	.apic_id_registered		= noop_apic_id_registered,

	.irq_delivery_mode		= dest_LowestPrio,
+9 −1
Original line number Diff line number Diff line
@@ -56,6 +56,12 @@ static unsigned int read_xapic_id(void)
	return get_apic_id(apic_read(APIC_ID));
}

static int numachip_apic_id_valid(int apicid)
{
	/* Trust what bootloader passes in MADT */
	return 1;
}

static int numachip_apic_id_registered(void)
{
	return physid_isset(read_xapic_id(), phys_cpu_present_map);
@@ -223,10 +229,11 @@ static int __init numachip_system_init(void)
}
early_initcall(numachip_system_init);

static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
static int __cpuinit numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
{
	if (!strncmp(oem_id, "NUMASC", 6)) {
		numachip_system = 1;
		setup_force_cpu_cap(X86_FEATURE_X2APIC);
		return 1;
	}

@@ -238,6 +245,7 @@ static struct apic apic_numachip __refconst = {
	.name				= "NumaConnect system",
	.probe				= numachip_probe,
	.acpi_madt_oem_check		= numachip_acpi_madt_oem_check,
	.apic_id_valid			= numachip_apic_id_valid,
	.apic_id_registered		= numachip_apic_id_registered,

	.irq_delivery_mode		= dest_Fixed,
+1 −0
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ static struct apic apic_bigsmp = {
	.name				= "bigsmp",
	.probe				= probe_bigsmp,
	.acpi_madt_oem_check		= NULL,
	.apic_id_valid			= default_apic_id_valid,
	.apic_id_registered		= bigsmp_apic_id_registered,

	.irq_delivery_mode		= dest_Fixed,
Loading