+Bjorn
+linux-pci

On 10/19/26 14:41, Alex Deucher wrote:
This reverts commit 11c141672045ffc0187aa604f2c0f597bc334fb2.

This was added to work around systems where the user specified
pci=realloc on the kernel command line.  The firmware specifies the
BDF to match, but those may not be the same with pci=realloc. This
causes mismatches when there are multiple cards of the same type in
the system and failure of the cards to initialize. pci=realloc is
not the most common case so let's revert for now to fix the regression.
We probably need to store the original BDF in the PCI subsystem so
we can use it match later if the BDF has changed.  This can be properly
reinstated once we have a general solution.

Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5762
Cc: Mario Limonciello <[email protected]>
Cc: Oz Tiram <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---

I hate to trade one regression for another; but arguably pci=realloc is the less common than the case of two identical GPUs.

Bjorn,

You open to storing the original BDF in the device somewhere and letting drivers access it?

That's what I suggested here in response to the other way (let driver detect pci=realloc).

https://lore.kernel.org/linux-pci/[email protected]/
  drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 45 +++---------------------
  1 file changed, 5 insertions(+), 40 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
index f9315e0472fe9..6bbca70a4e2eb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
@@ -428,45 +428,6 @@ static bool amdgpu_read_disabled_bios(struct amdgpu_device 
*adev)
  }
#ifdef CONFIG_ACPI
-/**
- * amdgpu_acpi_vfct_match() - Check if a VFCT entry matches the device
- * @adev: AMDGPU device
- * @vhdr: VFCT image header to check
- *
- * 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.
- *
- * Returns: 0 on match, -ENODEV on no match
- */
-static int amdgpu_acpi_vfct_match(struct amdgpu_device *adev,
-                                 VFCT_IMAGE_HEADER *vhdr)
-{
-       /* Vendor and device IDs must always match */
-       if (vhdr->VendorID != adev->pdev->vendor ||
-           vhdr->DeviceID != adev->pdev->device)
-               return -ENODEV;
-
-       if (vhdr->PCIDevice != PCI_SLOT(adev->pdev->devfn) ||
-           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;
-}
-
  static bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
  {
        struct acpi_table_header *hdr;
@@ -503,7 +464,11 @@ static bool amdgpu_acpi_vfct_bios(struct amdgpu_device 
*adev)
                }
if (vhdr->ImageLength &&
-                   !amdgpu_acpi_vfct_match(adev, vhdr)) {
+                   vhdr->PCIBus == adev->pdev->bus->number &&
+                   vhdr->PCIDevice == PCI_SLOT(adev->pdev->devfn) &&
+                   vhdr->PCIFunction == PCI_FUNC(adev->pdev->devfn) &&
+                   vhdr->VendorID == adev->pdev->vendor &&
+                   vhdr->DeviceID == adev->pdev->device) {
                        adev->bios = kmemdup(&vbios->VbiosContent,
                                             vhdr->ImageLength,
                                             GFP_KERNEL);

Reply via email to