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

Commit b7157acf authored by Steffen Persvold's avatar Steffen Persvold Committed by Ingo Molnar
Browse files

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: default avatarSteffen 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: default avatarIngo Molnar <mingo@kernel.org>
parent e335e3eb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -535,7 +535,7 @@ static inline unsigned int read_apic_id(void)

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

extern void default_setup_apic_routing(void);
+5 −0
Original line number Diff line number Diff line
@@ -18,6 +18,11 @@ static const struct cpumask *x2apic_target_cpus(void)
	return cpu_online_mask;
}

static int x2apic_apic_id_valid(int apicid)
{
	return 1;
}

static int x2apic_apic_id_registered(void)
{
	return 1;
+1 −1
Original line number Diff line number Diff line
@@ -239,7 +239,7 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
	 * to not preallocating memory for all NR_CPUS
	 * 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");
	else
		acpi_register_lapic(apic_id, enabled);
+1 −2
Original line number Diff line number Diff line
@@ -229,11 +229,10 @@ static int __init numachip_system_init(void)
}
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)) {
		numachip_system = 1;
		setup_force_cpu_cap(X86_FEATURE_X2APIC);
		return 1;
	}

+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ static struct apic apic_x2apic_cluster = {
	.name				= "cluster x2apic",
	.probe				= x2apic_cluster_probe,
	.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,

	.irq_delivery_mode		= dest_LowestPrio,
Loading