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]> --- 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); -- 2.56.0
