device/pci_rom: Fix redundant pci_rom_probe() calls
For the PCI_VENDOR_ID_ATI case, we can rely on pci_rom_acpi_fill_vfct() to make the call if necessary. For hardware other than ATI, pci_rom_probe() was already called from pci_rom_ssdt() and pci_dev_init(), so PCI_ROM_ADDRESS BAR is already enabled, if requested so. Change-Id: I0ea893a9ac7ba480840ebf5570d8fe0d9e20938f Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/33909 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Rudolph <siro@das-labor.org> Reviewed-by: Mike Banon <mikebdp2@gmail.com>
This commit is contained in:
parent
8c9be43271
commit
fb49379ed2
|
@ -763,11 +763,14 @@ void acpi_create_vfct(struct device *device,
|
|||
memcpy(header->asl_compiler_id, ASLC, 4);
|
||||
|
||||
header->asl_compiler_revision = asl_revision;
|
||||
header->length = sizeof(struct acpi_vfct);
|
||||
header->revision = get_acpi_table_revision(VFCT);
|
||||
|
||||
current = acpi_fill_vfct(device, vfct, current);
|
||||
|
||||
/* If no BIOS image, return with header->length == 0. */
|
||||
if (!vfct->VBIOSImageOffset)
|
||||
return;
|
||||
|
||||
/* (Re)calculate length and checksum. */
|
||||
header->length = current - (unsigned long)vfct;
|
||||
header->checksum = acpi_checksum((void *)vfct, header->length);
|
||||
|
|
|
@ -209,8 +209,6 @@ pci_rom_acpi_fill_vfct(struct device *device, struct acpi_vfct *vfct_struct,
|
|||
struct acpi_vfct_image_hdr *header = &vfct_struct->image_hdr;
|
||||
struct rom_header *rom;
|
||||
|
||||
vfct_struct->VBIOSImageOffset = (size_t)header - (size_t)vfct_struct;
|
||||
|
||||
rom = check_initialized(device);
|
||||
if (!rom)
|
||||
rom = pci_rom_probe(device);
|
||||
|
@ -233,6 +231,8 @@ pci_rom_acpi_fill_vfct(struct device *device, struct acpi_vfct *vfct_struct,
|
|||
header->ImageLength = rom->size * 512;
|
||||
memcpy((void *)&header->VbiosContent, rom, header->ImageLength);
|
||||
|
||||
vfct_struct->VBIOSImageOffset = (size_t)header - (size_t)vfct_struct;
|
||||
|
||||
current += header->ImageLength;
|
||||
return current;
|
||||
}
|
||||
|
@ -241,9 +241,6 @@ unsigned long
|
|||
pci_rom_write_acpi_tables(struct device *device, unsigned long current,
|
||||
struct acpi_rsdp *rsdp)
|
||||
{
|
||||
struct acpi_vfct *vfct;
|
||||
struct rom_header *rom;
|
||||
|
||||
/* Only handle VGA devices */
|
||||
if ((device->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
||||
return current;
|
||||
|
@ -252,20 +249,19 @@ pci_rom_write_acpi_tables(struct device *device, unsigned long current,
|
|||
if (!device->enabled)
|
||||
return current;
|
||||
|
||||
/* Probe for option rom */
|
||||
rom = pci_rom_probe(device);
|
||||
if (!rom)
|
||||
return current;
|
||||
|
||||
/* AMD/ATI uses VFCT */
|
||||
if (device->vendor == PCI_VENDOR_ID_ATI) {
|
||||
struct acpi_vfct *vfct;
|
||||
|
||||
current = ALIGN_UP(current, 8);
|
||||
printk(BIOS_DEBUG, "ACPI: * VFCT at %lx\n", current);
|
||||
vfct = (struct acpi_vfct *)current;
|
||||
acpi_create_vfct(device, vfct, pci_rom_acpi_fill_vfct);
|
||||
if (vfct->header.length) {
|
||||
printk(BIOS_DEBUG, "ACPI: * VFCT at %lx\n", current);
|
||||
current += vfct->header.length;
|
||||
acpi_add_table(rsdp, vfct);
|
||||
}
|
||||
}
|
||||
|
||||
return current;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue