mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The x86-32 kernel used to support multiple platforms with more than eight logical CPUs, from the 1999-2003 timeframe: Sequent NUMA-Q, IBM Summit, Unisys ES7000 and HP F8. Support for all except the latter was dropped back in 2014, leaving only the F8 based DL740 and DL760 G2 machines in this catery, with up to eight single-core Socket-603 Xeon-MP processors with hyperthreading. Like the already removed machines, the HP F8 servers at the time cost upwards of $100k in typical configurations, but were quickly obsoleted by their 64-bit Socket-604 cousins and the AMD Opteron. Earlier servers with up to 8 Pentium Pro or Xeon processors remain fully supported as they had no hyperthreading. Similarly, the more common 4-socket Xeon-MP machines with hyperthreading using Intel or ServerWorks chipsets continue to work without this, and all the multi-core Xeon processors also run 64-bit kernels. While the "bigsmp" support can also be used to run on later 64-bit machines (including VM guests), it seems best to discourage that and get any remaining users to update their kernels to 64-bit builds on these. As a side-effect of this, there is also no more need to support NUMA configurations on 32-bit x86, as all true 32-bit NUMA platforms are already gone. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/20250226213714.4040853-3-arnd@kernel.org
111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Default generic APIC driver. This handles up to 8 CPUs.
|
|
*
|
|
* Copyright 2003 Andi Kleen, SuSE Labs.
|
|
*
|
|
* Generic x86 APIC driver probe layer.
|
|
*/
|
|
#include <linux/export.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/smp.h>
|
|
|
|
#include <xen/xen.h>
|
|
|
|
#include <asm/io_apic.h>
|
|
#include <asm/apic.h>
|
|
#include <asm/acpi.h>
|
|
|
|
#include "local.h"
|
|
|
|
static u32 default_get_apic_id(u32 x)
|
|
{
|
|
unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR));
|
|
|
|
if (APIC_XAPIC(ver) || boot_cpu_has(X86_FEATURE_EXTD_APICID))
|
|
return (x >> 24) & 0xFF;
|
|
else
|
|
return (x >> 24) & 0x0F;
|
|
}
|
|
|
|
/* should be called last. */
|
|
static int probe_default(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static struct apic apic_default __ro_after_init = {
|
|
|
|
.name = "default",
|
|
.probe = probe_default,
|
|
|
|
.dest_mode_logical = true,
|
|
|
|
.disable_esr = 0,
|
|
|
|
.init_apic_ldr = default_init_apic_ldr,
|
|
.cpu_present_to_apicid = default_cpu_present_to_apicid,
|
|
|
|
.max_apic_id = 0xFE,
|
|
.get_apic_id = default_get_apic_id,
|
|
|
|
.calc_dest_apicid = apic_flat_calc_apicid,
|
|
|
|
.send_IPI = default_send_IPI_single,
|
|
.send_IPI_mask = default_send_IPI_mask_logical,
|
|
.send_IPI_mask_allbutself = default_send_IPI_mask_allbutself_logical,
|
|
.send_IPI_allbutself = default_send_IPI_allbutself,
|
|
.send_IPI_all = default_send_IPI_all,
|
|
.send_IPI_self = default_send_IPI_self,
|
|
|
|
.read = native_apic_mem_read,
|
|
.write = native_apic_mem_write,
|
|
.eoi = native_apic_mem_eoi,
|
|
.icr_read = native_apic_icr_read,
|
|
.icr_write = native_apic_icr_write,
|
|
.wait_icr_idle = apic_mem_wait_icr_idle,
|
|
.safe_wait_icr_idle = apic_mem_wait_icr_idle_timeout,
|
|
};
|
|
|
|
apic_driver(apic_default);
|
|
|
|
struct apic *apic __ro_after_init = &apic_default;
|
|
EXPORT_SYMBOL_GPL(apic);
|
|
|
|
static int cmdline_apic __initdata;
|
|
static int __init parse_apic(char *arg)
|
|
{
|
|
struct apic **drv;
|
|
|
|
if (!arg)
|
|
return -EINVAL;
|
|
|
|
for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
|
|
if (!strcmp((*drv)->name, arg)) {
|
|
apic_install_driver(*drv);
|
|
cmdline_apic = 1;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* Parsed again by __setup for debug/verbose */
|
|
return 0;
|
|
}
|
|
early_param("apic", parse_apic);
|
|
|
|
void __init x86_32_probe_apic(void)
|
|
{
|
|
if (!cmdline_apic) {
|
|
struct apic **drv;
|
|
|
|
for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
|
|
if ((*drv)->probe()) {
|
|
apic_install_driver(*drv);
|
|
break;
|
|
}
|
|
}
|
|
/* Not visible without early console */
|
|
if (drv == __apicdrivers_end)
|
|
panic("Didn't find an APIC driver");
|
|
}
|
|
}
|