From: Sasha Levin Date: Sun, 29 Oct 2023 22:49:29 +0000 (-0400) Subject: Fixes for 5.4 X-Git-Tag: v6.1.61~43 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f6e57a426b0fcb189a4613dae3aedb3e73ea8200;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.4 Signed-off-by: Sasha Levin --- diff --git a/queue-5.4/acpica-add-support-for-madt-online-enabled-bit.patch b/queue-5.4/acpica-add-support-for-madt-online-enabled-bit.patch new file mode 100644 index 00000000000..3864f042d7d --- /dev/null +++ b/queue-5.4/acpica-add-support-for-madt-online-enabled-bit.patch @@ -0,0 +1,36 @@ +From dc6f0051795e2d74943cbdd5000d4c07a0601374 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Sep 2021 16:41:45 -0500 +Subject: ACPICA: Add support for MADT online enabled bit + +From: Mario Limonciello + +[ Upstream commit 435a8dc8d9b9d91e625901fea5b5695b9b976d84 ] + +The online enabled bit on newer ACPI implmentations will indicate +whether the CPU is hotpluggable. + +Link: http://github.com/acpica/acpica/pull/708/ +Signed-off-by: Mario Limonciello +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 128b0c9781c9 ("x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility") +Signed-off-by: Sasha Levin +--- + include/acpi/actbl2.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h +index e45ced27f4c30..d385c3ea1396e 100644 +--- a/include/acpi/actbl2.h ++++ b/include/acpi/actbl2.h +@@ -716,6 +716,7 @@ struct acpi_madt_generic_translator { + /* MADT Local APIC flags */ + + #define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */ ++#define ACPI_MADT_ONLINE_CAPABLE (2) /* 01: System HW supports enabling processor at runtime */ + + /* MADT MPS INTI flags (inti_flags) */ + +-- +2.42.0 + diff --git a/queue-5.4/series b/queue-5.4/series index 2ba33b6b02e..23be6d60122 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -31,3 +31,7 @@ nvmem-imx-correct-nregs-for-i.mx6ul.patch perf-core-fix-potential-null-deref.patch clk-sanitize-possible_parent_show-to-handle-return-value-of-of_clk_get_parent_name.patch i40e-fix-wrong-check-for-i40e_txr_flags_wb_on_itr.patch +acpica-add-support-for-madt-online-enabled-bit.patch +x86-acpi-don-t-add-cpus-that-are-not-online-capable.patch +x86-acpi-boot-use-fadt-version-to-check-support-for-.patch +x86-i8259-skip-probing-when-acpi-madt-advertises-pca.patch diff --git a/queue-5.4/x86-acpi-boot-use-fadt-version-to-check-support-for-.patch b/queue-5.4/x86-acpi-boot-use-fadt-version-to-check-support-for-.patch new file mode 100644 index 00000000000..69228b6821c --- /dev/null +++ b/queue-5.4/x86-acpi-boot-use-fadt-version-to-check-support-for-.patch @@ -0,0 +1,55 @@ +From 01c3c85ea912bb169f9b050f70b338020bf0a937 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 Mar 2023 12:45:35 -0500 +Subject: x86/ACPI/boot: Use FADT version to check support for online capable + +From: Mario Limonciello + +[ Upstream commit a74fabfbd1b7013045afc8cc541e6cab3360ccb5 ] + +ACPI 6.3 introduced the online capable bit, and also introduced MADT +version 5. + +Latter was used to distinguish whether the offset storing online capable +could be used. However ACPI 6.2b has MADT version "45" which is for +an errata version of the ACPI 6.2 spec. This means that the Linux code +for detecting availability of MADT will mistakenly flag ACPI 6.2b as +supporting online capable which is inaccurate as it's an ACPI 6.3 feature. + +Instead use the FADT major and minor revision fields to distinguish this. + + [ bp: Massage. ] + +Fixes: aa06e20f1be6 ("x86/ACPI: Don't add CPUs that are not online capable") +Reported-by: Eric DeVolder +Reported-by: Borislav Petkov +Signed-off-by: Mario Limonciello +Signed-off-by: Borislav Petkov (AMD) +Cc: +Link: https://lore.kernel.org/r/943d2445-84df-d939-f578-5d8240d342cc@unsolicited.net +Stable-dep-of: 128b0c9781c9 ("x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility") +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/acpi/boot.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c +index c19a31a86c669..2e4c8af36e8a5 100644 +--- a/arch/x86/kernel/acpi/boot.c ++++ b/arch/x86/kernel/acpi/boot.c +@@ -140,7 +140,11 @@ static int __init acpi_parse_madt(struct acpi_table_header *table) + printk(KERN_DEBUG PREFIX "Local APIC address 0x%08x\n", + madt->address); + } +- if (madt->header.revision >= 5) ++ ++ /* ACPI 6.3 and newer support the online capable bit. */ ++ if (acpi_gbl_FADT.header.revision > 6 || ++ (acpi_gbl_FADT.header.revision == 6 && ++ acpi_gbl_FADT.minor_revision >= 3)) + acpi_support_online_capable = true; + + default_acpi_madt_oem_check(madt->header.oem_id, +-- +2.42.0 + diff --git a/queue-5.4/x86-acpi-don-t-add-cpus-that-are-not-online-capable.patch b/queue-5.4/x86-acpi-don-t-add-cpus-that-are-not-online-capable.patch new file mode 100644 index 00000000000..77df2c5896f --- /dev/null +++ b/queue-5.4/x86-acpi-don-t-add-cpus-that-are-not-online-capable.patch @@ -0,0 +1,64 @@ +From ffd66958ee79add1358105c7e05d59b6dd4de7bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Sep 2021 16:41:46 -0500 +Subject: x86/ACPI: Don't add CPUs that are not online capable + +From: Mario Limonciello + +[ Upstream commit aa06e20f1be628186f0c2dcec09ea0009eb69778 ] + +A number of systems are showing "hotplug capable" CPUs when they +are not really hotpluggable. This is because the MADT has extra +CPU entries to support different CPUs that may be inserted into +the socket with different numbers of cores. + +Starting with ACPI 6.3 the spec has an Online Capable bit in the +MADT used to determine whether or not a CPU is hotplug capable +when the enabled bit is not set. + +Link: https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/05_ACPI_Software_Programming_Model/ACPI_Software_Programming_Model.html?#local-apic-flags +Signed-off-by: Mario Limonciello +Signed-off-by: Rafael J. Wysocki +Stable-dep-of: 128b0c9781c9 ("x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility") +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/acpi/boot.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c +index 7b75658b7e9ac..c19a31a86c669 100644 +--- a/arch/x86/kernel/acpi/boot.c ++++ b/arch/x86/kernel/acpi/boot.c +@@ -62,6 +62,7 @@ int acpi_fix_pin2_polarity __initdata; + + #ifdef CONFIG_X86_LOCAL_APIC + static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; ++static bool acpi_support_online_capable; + #endif + + #ifdef CONFIG_X86_IO_APIC +@@ -139,6 +140,8 @@ static int __init acpi_parse_madt(struct acpi_table_header *table) + printk(KERN_DEBUG PREFIX "Local APIC address 0x%08x\n", + madt->address); + } ++ if (madt->header.revision >= 5) ++ acpi_support_online_capable = true; + + default_acpi_madt_oem_check(madt->header.oem_id, + madt->header.oem_table_id); +@@ -240,6 +243,12 @@ acpi_parse_lapic(union acpi_subtable_headers * header, const unsigned long end) + if (processor->id == 0xff) + return 0; + ++ /* don't register processors that can not be onlined */ ++ if (acpi_support_online_capable && ++ !(processor->lapic_flags & ACPI_MADT_ENABLED) && ++ !(processor->lapic_flags & ACPI_MADT_ONLINE_CAPABLE)) ++ return 0; ++ + /* + * We need to register disabled CPU as well to permit + * counting disabled CPUs. This allows us to size +-- +2.42.0 + diff --git a/queue-5.4/x86-i8259-skip-probing-when-acpi-madt-advertises-pca.patch b/queue-5.4/x86-i8259-skip-probing-when-acpi-madt-advertises-pca.patch new file mode 100644 index 00000000000..663326da437 --- /dev/null +++ b/queue-5.4/x86-i8259-skip-probing-when-acpi-madt-advertises-pca.patch @@ -0,0 +1,151 @@ +From 2807b3bc514e8032261b3af10559a668924e99be Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 Oct 2023 23:04:15 +0200 +Subject: x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility + +From: Thomas Gleixner + +[ Upstream commit 128b0c9781c9f2651bea163cb85e52a6c7be0f9e ] + +David and a few others reported that on certain newer systems some legacy +interrupts fail to work correctly. + +Debugging revealed that the BIOS of these systems leaves the legacy PIC in +uninitialized state which makes the PIC detection fail and the kernel +switches to a dummy implementation. + +Unfortunately this fallback causes quite some code to fail as it depends on +checks for the number of legacy PIC interrupts or the availability of the +real PIC. + +In theory there is no reason to use the PIC on any modern system when +IO/APIC is available, but the dependencies on the related checks cannot be +resolved trivially and on short notice. This needs lots of analysis and +rework. + +The PIC detection has been added to avoid quirky checks and force selection +of the dummy implementation all over the place, especially in VM guest +scenarios. So it's not an option to revert the relevant commit as that +would break a lot of other scenarios. + +One solution would be to try to initialize the PIC on detection fail and +retry the detection, but that puts the burden on everything which does not +have a PIC. + +Fortunately the ACPI/MADT table header has a flag field, which advertises +in bit 0 that the system is PCAT compatible, which means it has a legacy +8259 PIC. + +Evaluate that bit and if set avoid the detection routine and keep the real +PIC installed, which then gets initialized (for nothing) and makes the rest +of the code with all the dependencies work again. + +Fixes: e179f6914152 ("x86, irq, pic: Probe for legacy PIC and set legacy_pic appropriately") +Reported-by: David Lazar +Signed-off-by: Thomas Gleixner +Tested-by: David Lazar +Reviewed-by: Hans de Goede +Reviewed-by: Mario Limonciello +Cc: stable@vger.kernel.org +Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218003 +Link: https://lore.kernel.org/r/875y2u5s8g.ffs@tglx +Signed-off-by: Sasha Levin +--- + arch/x86/include/asm/i8259.h | 2 ++ + arch/x86/kernel/acpi/boot.c | 3 +++ + arch/x86/kernel/i8259.c | 38 ++++++++++++++++++++++++++++-------- + 3 files changed, 35 insertions(+), 8 deletions(-) + +diff --git a/arch/x86/include/asm/i8259.h b/arch/x86/include/asm/i8259.h +index 89789e8c80f66..e16574c16e933 100644 +--- a/arch/x86/include/asm/i8259.h ++++ b/arch/x86/include/asm/i8259.h +@@ -67,6 +67,8 @@ struct legacy_pic { + void (*make_irq)(unsigned int irq); + }; + ++void legacy_pic_pcat_compat(void); ++ + extern struct legacy_pic *legacy_pic; + extern struct legacy_pic null_legacy_pic; + +diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c +index 2e4c8af36e8a5..11c0eab38369f 100644 +--- a/arch/x86/kernel/acpi/boot.c ++++ b/arch/x86/kernel/acpi/boot.c +@@ -141,6 +141,9 @@ static int __init acpi_parse_madt(struct acpi_table_header *table) + madt->address); + } + ++ if (madt->flags & ACPI_MADT_PCAT_COMPAT) ++ legacy_pic_pcat_compat(); ++ + /* ACPI 6.3 and newer support the online capable bit. */ + if (acpi_gbl_FADT.header.revision > 6 || + (acpi_gbl_FADT.header.revision == 6 && +diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c +index 8821d0ab0a08c..82753622f4890 100644 +--- a/arch/x86/kernel/i8259.c ++++ b/arch/x86/kernel/i8259.c +@@ -32,6 +32,7 @@ + */ + static void init_8259A(int auto_eoi); + ++static bool pcat_compat __ro_after_init; + static int i8259A_auto_eoi; + DEFINE_RAW_SPINLOCK(i8259A_lock); + +@@ -301,15 +302,32 @@ static void unmask_8259A(void) + + static int probe_8259A(void) + { ++ unsigned char new_val, probe_val = ~(1 << PIC_CASCADE_IR); + unsigned long flags; +- unsigned char probe_val = ~(1 << PIC_CASCADE_IR); +- unsigned char new_val; ++ ++ /* ++ * If MADT has the PCAT_COMPAT flag set, then do not bother probing ++ * for the PIC. Some BIOSes leave the PIC uninitialized and probing ++ * fails. ++ * ++ * Right now this causes problems as quite some code depends on ++ * nr_legacy_irqs() > 0 or has_legacy_pic() == true. This is silly ++ * when the system has an IO/APIC because then PIC is not required ++ * at all, except for really old machines where the timer interrupt ++ * must be routed through the PIC. So just pretend that the PIC is ++ * there and let legacy_pic->init() initialize it for nothing. ++ * ++ * Alternatively this could just try to initialize the PIC and ++ * repeat the probe, but for cases where there is no PIC that's ++ * just pointless. ++ */ ++ if (pcat_compat) ++ return nr_legacy_irqs(); ++ + /* +- * Check to see if we have a PIC. +- * Mask all except the cascade and read +- * back the value we just wrote. If we don't +- * have a PIC, we will read 0xff as opposed to the +- * value we wrote. ++ * Check to see if we have a PIC. Mask all except the cascade and ++ * read back the value we just wrote. If we don't have a PIC, we ++ * will read 0xff as opposed to the value we wrote. + */ + raw_spin_lock_irqsave(&i8259A_lock, flags); + +@@ -431,5 +449,9 @@ static int __init i8259A_init_ops(void) + + return 0; + } +- + device_initcall(i8259A_init_ops); ++ ++void __init legacy_pic_pcat_compat(void) ++{ ++ pcat_compat = true; ++} +-- +2.42.0 +