VFCT records the PCI bus number from BIOS POST. The current bus number
can change after PCI core renumbers the bus, while accepting a mismatch
based only on device identity can select the wrong VFCT image when
matching devices are present. Compare against the bus number captured
when the PCI device was discovered.

Reported-by: Reza Nikzad Chaleshori <[email protected]>
Closes: 
https://lore.kernel.org/amd-gfx/[email protected]/
Fixes: 11c141672045f ("drm/amdgpu: Fix VFCT bus number matching with soft 
filter")
Signed-off-by: Mario Limonciello <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 17 +++--------------
 1 file changed, 3 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
index 08ed1eb695586..2b375e6b39d5f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
@@ -386,10 +386,8 @@ static bool amdgpu_read_disabled_bios(struct amdgpu_device 
*adev)
  * VFCT entries contain the PCI bus number as recorded during BIOS POST.
  * On systems where the kernel renumbers PCI buses (e.g. pci=realloc or
  * resource conflicts), the runtime bus number may differ from the POST
- * value.  Match by device identity (vendor + device + function) and use
- * the bus number as a preference: exact bus match is preferred, but when
- * the bus numbers disagree we accept the entry if the device identity
- * matches.
+ * value.  Match using the bus number captured when the device was
+ * discovered, before any bus renumbering.
  *
  * Returns: 0 on match, -ENODEV on no match
  */
@@ -405,16 +403,7 @@ static int amdgpu_acpi_vfct_match(struct amdgpu_device 
*adev,
            vhdr->PCIFunction != PCI_FUNC(adev->pdev->devfn))
                return -ENODEV;
 
-       /* Exact bus number match - preferred */
-       if (vhdr->PCIBus == adev->pdev->bus->number)
-               return 0;
-
-       /* Bus mismatch but device identity matches (PCI renumbering case) */
-       dev_notice(adev->dev,
-                  "VFCT bus number mismatch: table %u != runtime %u, matching 
by device identity (vendor 0x%04x device 0x%04x)\n",
-                  vhdr->PCIBus, adev->pdev->bus->number,
-                  adev->pdev->vendor, adev->pdev->device);
-       return 0;
+       return vhdr->PCIBus == adev->pdev->initial_bus_number ? 0 : -ENODEV;
 }
 
 static bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)

-- 
2.43.0

Reply via email to