- if (OPTIONROM_VENDEV_1
- && ((OPTIONROM_VENDEV_1 >> 16)
- | ((OPTIONROM_VENDEV_1 & 0xffff)) << 16) == vendev)
- return copy_rom((struct rom_header *)OPTIONROM_MEM_1);
- if (OPTIONROM_VENDEV_2
- && ((OPTIONROM_VENDEV_2 >> 16)
- | ((OPTIONROM_VENDEV_2 & 0xffff)) << 16) == vendev)
- return copy_rom((struct rom_header *)OPTIONROM_MEM_2);
- struct rom_header *rom = cb_find_optionrom(vendev);
- if (rom)
- return copy_rom(rom);
- return NULL;
+ char fname[17];
+ snprintf(fname, sizeof(fname), "pci%04x,%04x.rom"
+ , pci->vendor, pci->device);
+ int ret = romfile_copy(romfile_find(fname), (void*)RomEnd
+ , max_rom() - RomEnd);
+ if (ret <= 0)
+ return NULL;
+ return (void*)RomEnd;
+}
+
+// Run all roms in a given CBFS directory.
+static void
+run_file_roms(const char *prefix, int isvga, u64 *sources)
+{
+ u32 file = 0;
+ for (;;) {
+ file = romfile_findprefix(prefix, file);
+ if (!file)
+ break;
+ struct rom_header *rom = (void*)RomEnd;
+ int ret = romfile_copy(file, rom, max_rom() - RomEnd);
+ if (ret > 0) {
+ setRomSource(sources, rom, file);
+ init_optionrom(rom, 0, isvga);
+ }
+ }
+}
+
+
+/****************************************************************
+ * PCI roms
+ ****************************************************************/
+
+// Verify device is a vga device with legacy address decoding enabled.
+static int
+is_pci_vga(struct pci_device *pci)
+{
+ if (pci->class != PCI_CLASS_DISPLAY_VGA)
+ return 0;
+ u16 cmd = pci_config_readw(pci->bdf, PCI_COMMAND);
+ if (!(cmd & PCI_COMMAND_IO && cmd & PCI_COMMAND_MEMORY))
+ return 0;
+ while (pci->parent) {
+ pci = pci->parent;
+ u32 ctrl = pci_config_readb(pci->bdf, PCI_BRIDGE_CONTROL);
+ if (!(ctrl & PCI_BRIDGE_CTL_VGA))
+ return 0;
+ }
+ return 1;