* [PATCH v2 1/3] iommu/amd: Prevent SB IOAPIC from overriding IVRS validation errors
2026-07-02 14:40 [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation Wei Wang
@ 2026-07-02 14:40 ` Wei Wang
2026-07-02 14:40 ` [PATCH v2 2/3] iommu/amd: Fix false positive in SB IOAPIC IVRS validation Wei Wang
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Wei Wang @ 2026-07-02 14:40 UTC (permalink / raw)
To: joro, vasant.hegde, suravee.suthikulpanit, will, robin.murphy,
thomas.lendacky, aik, jgg, kevin.tian, xuyongwei
Cc: iommu, linux-kernel, Wei Wang
The check_ioapic_information() function validates IOAPICs against the
IVRS table to safely disable Interrupt Remapping (IR) if the BIOS provides
a broken topology.
Currently, the validation loop contains a bug: If an unmapped secondary
IOAPIC is encountered, 'ret' is set to false. But if the Southbridge (SB)
IOAPIC is enumerated after it in the MADT, the loop overwrites 'ret' to
true.
This bypasses the validation failure and leaves IR enabled. When devices
attached to the unmapped secondary IOAPIC fire interrupts, the IOMMU drops
them due to the missing Requestor ID, leading to localized device hangs.
Fix this by initializing 'ret' to true and only toggling it to false
upon encountering a validation error, ensuring failures are never erased.
Fixes: c2ff5cf5294b ("iommu/amd: Work around wrong IOAPIC device-id in IVRS table")
Signed-off-by: Wei Wang <wei.w.wang@hotmail.com>
Tested-by: Yongwei Xu <xuyongwei@open-hieco.net>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/init.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index e93bcb5eef70..f983b1961847 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -3098,7 +3098,7 @@ static bool __init check_ioapic_information(void)
int idx;
has_sb_ioapic = false;
- ret = false;
+ ret = true;
/*
* If we have map overrides on the kernel command line the
@@ -3123,7 +3123,6 @@ static bool __init check_ioapic_information(void)
boot_cpu_data.x86_model <= 0xf &&
devid == IOAPIC_SB_DEVID_FAM18H_M4H)) {
has_sb_ioapic = true;
- ret = true;
}
}
@@ -3137,6 +3136,7 @@ static bool __init check_ioapic_information(void)
* device id for the IOAPIC in the system.
*/
pr_err("%s: No southbridge IOAPIC found\n", fw_bug);
+ ret = false;
}
if (!ret)
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v2 2/3] iommu/amd: Fix false positive in SB IOAPIC IVRS validation
2026-07-02 14:40 [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation Wei Wang
2026-07-02 14:40 ` [PATCH v2 1/3] iommu/amd: Prevent SB IOAPIC from overriding IVRS validation errors Wei Wang
@ 2026-07-02 14:40 ` Wei Wang
2026-07-02 14:40 ` [PATCH v2 3/3] iommu/amd: Dynamically verify Southbridge IOAPIC via PCI config space Wei Wang
2026-07-09 8:20 ` [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation Jörg Rödel
3 siblings, 0 replies; 5+ messages in thread
From: Wei Wang @ 2026-07-02 14:40 UTC (permalink / raw)
To: joro, vasant.hegde, suravee.suthikulpanit, will, robin.murphy,
thomas.lendacky, aik, jgg, kevin.tian, xuyongwei
Cc: iommu, linux-kernel, Wei Wang
The check_ioapic_information() function is designed to prevent boot hangs
by ensuring the Southbridge (SB) IOAPIC is properly mapped in the IVRS
table before enabling Interrupt Remapping.
Currently, this check passes if *any* enumerated IOAPIC matches the
expected SB IOAPIC device ID. If a buggy BIOS incorrectly assigns the
SB IOAPIC's device ID to a secondary IOAPIC in the IVRS, while scrambling
the true SB IOAPIC's mapping, the check hits a false positive and
succeeds.
This erroneously enables Interrupt Remapping. Consequently, the IOMMU
blocks unmapped interrupts from the actual SB IOAPIC, dropping the system
timer and leading to a silent kernel boot hang.
Tighten the validation to verify the device ID specifically against the SB
IOAPIC by matching their APIC IDs first. This prevents the validation
check from being bypassed via device ID aliasing.
Fixes: c2ff5cf5294b ("iommu/amd: Work around wrong IOAPIC device-id in IVRS table")
Signed-off-by: Wei Wang <wei.w.wang@hotmail.com>
Tested-by: Yongwei Xu <xuyongwei@open-hieco.net>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/init.c | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index f983b1961847..9e07f7c4196f 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -3091,11 +3091,25 @@ static void __init free_iommu_resources(void)
/* SB IOAPIC for Hygon family 18h model 4h is on the device 0xb */
#define IOAPIC_SB_DEVID_FAM18H_M4H ((0x00 << 8) | PCI_DEVFN(0xb, 0))
+/*
+ * The Southbridge IOAPIC is assigned a GSI Base of 0 (handling interrupts
+ * 0 through 23).
+ */
+static int __init get_sb_ioapic_id(void)
+{
+ int idx = mp_find_ioapic(0);
+
+ if (idx < 0)
+ return -ENODEV;
+
+ return mpc_ioapic_id(idx);
+}
+
static bool __init check_ioapic_information(void)
{
const char *fw_bug = FW_BUG;
bool ret, has_sb_ioapic;
- int idx;
+ int idx, sb_apicid;
has_sb_ioapic = false;
ret = true;
@@ -3108,6 +3122,16 @@ static bool __init check_ioapic_information(void)
if (cmdline_maps)
fw_bug = "";
+ sb_apicid = get_sb_ioapic_id();
+ if (sb_apicid < 0) {
+ /*
+ * Lack of SB IOAPIC registration is not a firmware bug,
+ * e.g. kernel booted with noapic or noacpi.
+ */
+ fw_bug = "";
+ goto out;
+ }
+
for (idx = 0; idx < nr_ioapics; idx++) {
int devid, id = mpc_ioapic_id(idx);
@@ -3116,16 +3140,16 @@ static bool __init check_ioapic_information(void)
pr_err("%s: IOAPIC[%d] not in IVRS table\n",
fw_bug, id);
ret = false;
- } else if (devid == IOAPIC_SB_DEVID ||
+ } else if (id == sb_apicid && (devid == IOAPIC_SB_DEVID ||
(boot_cpu_data.x86_vendor == X86_VENDOR_HYGON &&
boot_cpu_data.x86 == 0x18 &&
boot_cpu_data.x86_model >= 0x4 &&
boot_cpu_data.x86_model <= 0xf &&
- devid == IOAPIC_SB_DEVID_FAM18H_M4H)) {
+ devid == IOAPIC_SB_DEVID_FAM18H_M4H))) {
has_sb_ioapic = true;
}
}
-
+out:
if (!has_sb_ioapic) {
/*
* We expect the SB IOAPIC to be listed in the IVRS
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v2 3/3] iommu/amd: Dynamically verify Southbridge IOAPIC via PCI config space
2026-07-02 14:40 [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation Wei Wang
2026-07-02 14:40 ` [PATCH v2 1/3] iommu/amd: Prevent SB IOAPIC from overriding IVRS validation errors Wei Wang
2026-07-02 14:40 ` [PATCH v2 2/3] iommu/amd: Fix false positive in SB IOAPIC IVRS validation Wei Wang
@ 2026-07-02 14:40 ` Wei Wang
2026-07-09 8:20 ` [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation Jörg Rödel
3 siblings, 0 replies; 5+ messages in thread
From: Wei Wang @ 2026-07-02 14:40 UTC (permalink / raw)
To: joro, vasant.hegde, suravee.suthikulpanit, will, robin.murphy,
thomas.lendacky, aik, jgg, kevin.tian, xuyongwei
Cc: iommu, linux-kernel, Wei Wang
check_ioapic_information() verifies whether the BIOS has provided a valid
device ID for the Southbridge (SB) IOAPIC in the IVRS table. Currently,
if the SB IOAPIC entry in the IVRS table does not match a historically
hardcoded device ID (00:14.0), interrupt remapping is forcibly disabled.
This hardcoded expectation does not scale to newer architectures. For
example, recent Hygon Gen 4 servers use 00:0b.0 for the SB IOAPIC, which
originally caused the validation to fail and interrupt remapping to be
disabled until this device ID was added upstream.
Instead of maintaining per-vendor/per-generation hardcoded device IDs,
dynamically verify the SB IOAPIC by reading its PCI configuration space.
Because the SB IOAPIC is embedded within the FCH (Fusion Controller Hub)
and shares its device ID, we can inspect the PCI class code of the given
device ID to confirm it is an actual FCH device (a SMBus controller or ISA
Bridge).
Signed-off-by: Wei Wang <wei.w.wang@hotmail.com>
Tested-by: Yongwei Xu <xuyongwei@open-hieco.net>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/init.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 9e07f7c4196f..c0748521dff8 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -3085,11 +3085,21 @@ static void __init free_iommu_resources(void)
free_pci_segments();
}
-/* SB IOAPIC is always on this device in AMD systems */
-#define IOAPIC_SB_DEVID ((0x00 << 8) | PCI_DEVFN(0x14, 0))
+static bool __init check_sb_ioapic(int devid)
+{
+ u8 bus = PCI_BUS_NUM(devid);
+ u8 devfn = devid & 0xff;
+ u16 val;
-/* SB IOAPIC for Hygon family 18h model 4h is on the device 0xb */
-#define IOAPIC_SB_DEVID_FAM18H_M4H ((0x00 << 8) | PCI_DEVFN(0xb, 0))
+ val = read_pci_config_16(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+ PCI_CLASS_DEVICE);
+
+ /*
+ * The SB IOAPIC is integrated into the FCH (Southbridge), which is
+ * exposed as an SMBus or ISA bridge in PCI config space.
+ */
+ return val == PCI_CLASS_SERIAL_SMBUS || val == PCI_CLASS_BRIDGE_ISA;
+}
/*
* The Southbridge IOAPIC is assigned a GSI Base of 0 (handling interrupts
@@ -3140,12 +3150,7 @@ static bool __init check_ioapic_information(void)
pr_err("%s: IOAPIC[%d] not in IVRS table\n",
fw_bug, id);
ret = false;
- } else if (id == sb_apicid && (devid == IOAPIC_SB_DEVID ||
- (boot_cpu_data.x86_vendor == X86_VENDOR_HYGON &&
- boot_cpu_data.x86 == 0x18 &&
- boot_cpu_data.x86_model >= 0x4 &&
- boot_cpu_data.x86_model <= 0xf &&
- devid == IOAPIC_SB_DEVID_FAM18H_M4H))) {
+ } else if (id == sb_apicid && check_sb_ioapic(devid)) {
has_sb_ioapic = true;
}
}
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation
2026-07-02 14:40 [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation Wei Wang
` (2 preceding siblings ...)
2026-07-02 14:40 ` [PATCH v2 3/3] iommu/amd: Dynamically verify Southbridge IOAPIC via PCI config space Wei Wang
@ 2026-07-09 8:20 ` Jörg Rödel
3 siblings, 0 replies; 5+ messages in thread
From: Jörg Rödel @ 2026-07-09 8:20 UTC (permalink / raw)
To: Wei Wang
Cc: vasant.hegde, suravee.suthikulpanit, will, robin.murphy,
thomas.lendacky, aik, jgg, kevin.tian, xuyongwei, iommu,
linux-kernel
On Thu, Jul 02, 2026 at 10:40:17PM +0800, Wei Wang wrote:
> Wei Wang (3):
> iommu/amd: Prevent SB IOAPIC from overriding IVRS validation errors
> iommu/amd: Fix false positive in SB IOAPIC IVRS validation
> iommu/amd: Dynamically verify Southbridge IOAPIC via PCI config space
>
> drivers/iommu/amd/init.c | 57 ++++++++++++++++++++++++++++++----------
> 1 file changed, 43 insertions(+), 14 deletions(-)
Applied, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread