On Mon, Oct 19, 2026 at 02:47:08PM -0500, Mario Limonciello wrote: > +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?
I mentioned in the other thread that saving the original bus number in a struct pci_bus or similar might be practical? > 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); >
