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 Reviewed-on: http://review.coreboot.org/573 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com> Reviewed-by: Marc Jones <marcj303@gmail.com>
This commit is contained in:
parent
01f7ab9335
commit
c0a6c6b3b9
|
@ -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. */
|
/* If it's in FLASH, then don't check device for ROM. */
|
||||||
rom_header = cbfs_load_optionrom(dev->vendor, dev->device, NULL);
|
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) {
|
if (rom_header) {
|
||||||
printk(BIOS_DEBUG, "In CBFS, ROM address for %s = %p\n",
|
printk(BIOS_DEBUG, "In CBFS, ROM address for %s = %p\n",
|
||||||
dev_path(dev), rom_header);
|
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",
|
printk(BIOS_SPEW, "PCI ROM image, vendor ID %04x, device ID %04x,\n",
|
||||||
rom_data->vendor, rom_data->device);
|
rom_data->vendor, rom_data->device);
|
||||||
if (dev->vendor != rom_data->vendor
|
/* If the device id is mapped, a mismatch is expected */
|
||||||
|| dev->device != rom_data->device) {
|
if ((dev->vendor != rom_data->vendor
|
||||||
|
|| dev->device != rom_data->device)
|
||||||
|
&& (vendev == mapped_vendev)) {
|
||||||
printk(BIOS_ERR, "ID mismatch: vendor ID %04x, "
|
printk(BIOS_ERR, "ID mismatch: vendor ID %04x, "
|
||||||
"device ID %04x\n", rom_data->vendor, rom_data->device);
|
"device ID %04x\n", rom_data->vendor, rom_data->device);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -35,5 +35,6 @@ struct pci_data {
|
||||||
|
|
||||||
struct rom_header *pci_rom_probe(struct device *dev);
|
struct rom_header *pci_rom_probe(struct device *dev);
|
||||||
struct rom_header *pci_rom_load(struct device *dev, struct rom_header *rom_header);
|
struct rom_header *pci_rom_load(struct device *dev, struct rom_header *rom_header);
|
||||||
|
u32 __attribute__((weak)) map_oprom_vendev(u32 vendev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue