* [PATCH v2 0/3] iommu/amd: Fix and improve SB IOAPIC IVRS validation
@ 2026-07-02 14:40 Wei Wang
2026-07-02 14:40 ` [PATCH v2 1/3] iommu/amd: Prevent SB IOAPIC from overriding IVRS validation errors Wei Wang
` (3 more replies)
0 siblings, 4 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 that the Southbridge
(SB) IOAPIC is correctly listed in the IVRS table before enabling
Interrupt Remapping (IR). If validation fails, IR is disabled to avoid
IOMMU dropping interrupts from unmapped devices.
This series fixes three independent bugs in that function:
Patch 1 fixes a logic error where successfully detecting the SB IOAPIC
resets a 'ret' flag that was previously cleared by an unmapped secondary
(i.e., non-SB) IOAPIC. This causes IR to stay enabled when it should have
been disabled, leading to localized device hangs.
Patch 2 fixes a false positive: the SB IOAPIC was identified solely by
its devid matching the hardcoded value (00:14.0). If a buggy BIOS assigns
that devid to a secondary IOAPIC in the IVRS while the real SB IOAPIC gets
a different mapping, the check passes anyway and IR is left enabled. The
system timer's interrupts then get dropped by the IOMMU, causing a silent
boot hang. The fix identifies the SB IOAPIC by its APIC ID (the IOAPIC
that owns GSI 0) before matching its devid.
Patch 3 removes the hardcoded SB IOAPIC devid entirely and replaces it
with a dynamic PCI config‑space check. The SB IOAPIC resides in the FCH
(Fusion Controller Hub / Southbridge), which typically exposes itself as
an SMBus controller function. For example:
AMD Genoa:
00:14.0 SMBus: Advanced Micro Devices, Inc. FCH SMBus Controller
Hygon Gen4:
00:0b.0 SMBus: Chengdu Haiguang IC Design Co., Ltd. FCH SMBus Controller
The PCI class code at a given BDF is a stable, specification-defined
property. Using it to identify an FCH function avoids maintaining
per-vendor/per-generation hardcoded device IDs that must be updated for
new platforms, while producing the same safe fallback (IR disabled) if
the check ever fails.
v1->v2 changes:
- Rebase to 7.2.0-rc1
- Add Tested-by from Yongwei Xu and Reviewed-by Vasant Hegde
Thanks!
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(-)
base-commit: 4f441960e691d37c880d2cc004de06bb5b6bd5e4
--
2.51.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [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
end of thread, other threads:[~2026-07-09 8:20 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox