[coreboot] New patch to review for coreboot: 60668d2 Add OPROM mapping support to coreboot

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Mon Jan 23 23:18:12 CET 2012


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/573

-gerrit

commit 60668d28abfcf877f1e0592178beb2646efb47ee
Author: Stefan Reinauer <reinauer at chromium.org>
Date:   Mon Jan 23 14:17:52 2012 -0800

    Add OPROM mapping support to coreboot
    
    This allows to add a PCI ID mapping function for option roms so that the same
    option rom can be used for a series of devices / PCI IDs. Intel and AMD often
    use the same option rom for a number of PCI devices with differend IDs.
    
    A function to implement such a mapping could look like this (or anything else
    appropriate):
    
    /* some vga option roms are used for several chipsets but they only have one
     * PCI ID in their header. If we encounter such an option rom, we need to do
     * the mapping ourselfes
     */
    
    u32 map_oprom_vendev(u32 vendev)
    {
        u32 new_vendev=vendev;
    
        switch(vendev) {
        case 0xa0118086:
            new_vendev=0xa0018086;
            break;
        }
    
        return new_vendev;
    }
    
    Change-Id: I1be7fe113b895075d43ea48fe706b039cef136d2
---
 src/devices/pci_rom.c        |   19 +++++++++++++++++--
 src/include/device/pci_rom.h |    1 +
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/devices/pci_rom.c b/src/devices/pci_rom.c
index 56712df..471c7e2 100644
--- a/src/devices/pci_rom.c
+++ b/src/devices/pci_rom.c
@@ -37,6 +37,19 @@ struct rom_header *pci_rom_probe(struct device *dev)
 	/* If it's in FLASH, then don't check device for ROM. */
 	rom_header = cbfs_load_optionrom(dev->vendor, dev->device, NULL);
 
+	u32 vendev = dev->vendor | (dev->device << 16);
+	u32 mapped_vendev = vendev;
+
+	if (map_oprom_vendev)
+		mapped_vendev = map_oprom_vendev(vendev);
+
+	if (!rom_header) {
+		if (vendev != mapped_vendev) {
+			rom_header = cbfs_load_optionrom(mapped_vendev &
+					0xffff, mapped_vendev >> 16, NULL);
+		}
+	}
+
 	if (rom_header) {
 		printk(BIOS_DEBUG, "In CBFS, ROM address for %s = %p\n",
 		       dev_path(dev), rom_header);
@@ -78,8 +91,10 @@ struct rom_header *pci_rom_probe(struct device *dev)
 
 	printk(BIOS_SPEW, "PCI ROM image, vendor ID %04x, device ID %04x,\n",
 	       rom_data->vendor, rom_data->device);
-	if (dev->vendor != rom_data->vendor
-	    || dev->device != rom_data->device) {
+	/* If the device id is mapped, a mismatch is expected */
+	if ((dev->vendor != rom_data->vendor
+	    || dev->device != rom_data->device)
+	    && (vendev == mapped_vendev)) {
 		printk(BIOS_ERR, "ID mismatch: vendor ID %04x, "
 		       "device ID %04x\n", rom_data->vendor, rom_data->device);
 		return NULL;
diff --git a/src/include/device/pci_rom.h b/src/include/device/pci_rom.h
index f268341..fe77276 100644
--- a/src/include/device/pci_rom.h
+++ b/src/include/device/pci_rom.h
@@ -35,5 +35,6 @@ struct  pci_data {
 
 struct rom_header *pci_rom_probe(struct device *dev);
 struct rom_header *pci_rom_load(struct device *dev, struct rom_header *rom_header);
+u32 __attribute__((weak)) map_oprom_vendev(u32 vendev);
 
 #endif




More information about the coreboot mailing list