[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <c5kqcudzrcafm24nr5ixgalhxdkxl3uoueerjlp6tbksj3hzy7@klytjugpkvdm>
Date: Sat, 21 Jun 2025 04:55:52 +0300
From: Ahmed Salem <x0rw3ll@...il.com>
To: airlied@...hat.com
Cc: lukas@...ner.de, dri-devel@...ts.freedesktop.org,
linux-kernel@...r.kernel.org, linux-kernel-mentees@...ts.linux.dev
Subject: [RFC PATCH] amd64-agp: do not bind to pci driver if probing fails
Commit 3be5fa236649 ("Revert "iommu/amd: Prevent binding other PCI
drivers to IOMMU PCI devices"") had an unintended side effect in that
when looking for any AGP bridge, driver_attach() will try to bind to
IOMMU devices without preemptively checking for PCI_CAP_ID_AGP
capability. This happens during agp_amd64_init().
As a result, driver_attach() calls driver_probe_device(), which then
calls really_probe(), raising this critical condition:
pci 0000:00:00.2: Resources present before probing
With the device being:
00:00.2 IOMMU: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 IOMMU
Subsystem: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 IOMMU
Flags: bus master, fast devsel, latency 0, IRQ 25
Capabilities: [40] Secure device <?>
Capabilities: [64] MSI: Enable+ Count=1/4 Maskable- 64bit+
Capabilities: [74] HyperTransport: MSI Mapping Enable+ Fixed+
As pci_register_driver() calls the device's probing function, the latter
(agp_amd64_probe) tries to find the device's PCI_CAP_ID_AGP capability,
and returns -ENODEV if said capability is not found.
Do not attempt driver_attach() if agp_amd64_pci_driver.probe is non-zero
to avoid probing already present resources.
Link: https://lore.kernel.org/all/aFJOLZ88KIH5WBy2@wunner.de
Signed-off-by: Ahmed Salem <x0rw3ll@...il.com>
---
I'm not quite sure whether I should have maintained the linked
conversation's Ccs, so please let me know if I should Cc anyone else.
Lukas, kindly let me know whether you want me to add a Suggested-by
trailer as well.
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index bf490967241a..e6a0d09e115a 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -768,10 +768,15 @@ int __init agp_amd64_init(void)
/* Look for any AGP bridge */
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
- err = driver_attach(&agp_amd64_pci_driver.driver);
- if (err == 0 && agp_bridges_found == 0) {
+ if ((int *)agp_amd64_pci_driver.probe != 0) {
pci_unregister_driver(&agp_amd64_pci_driver);
err = -ENODEV;
+ } else {
+ err = driver_attach(&agp_amd64_pci_driver.driver);
+ if (err == 0 && agp_bridges_found == 0) {
+ pci_unregister_driver(&agp_amd64_pci_driver);
+ err = -ENODEV;
+ }
}
}
return err;
base-commit: 11313e2f78128c948e9b4eb58b3dacfc30964700
--
2.47.2
Powered by blists - more mailing lists