#include "pci_ids.h" // PCI_CLASS_DISPLAY_VGA
#include "boot.h" // IPL
#include "paravirt.h" // qemu_cfg_*
-
+#include "optionroms.h" // struct rom_header
/****************************************************************
* Definitions
****************************************************************/
-struct rom_header {
- u16 signature;
- u8 size;
- u8 initVector[4];
- u8 reserved[17];
- u16 pcioffset;
- u16 pnpoffset;
-} PACKED;
-
-struct pci_data {
- u32 signature;
- u16 vendor;
- u16 device;
- u16 vitaldata;
- u16 dlen;
- u8 drevision;
- u8 class_lo;
- u16 class_hi;
- u16 ilen;
- u16 irevision;
- u8 type;
- u8 indicator;
- u16 reserved;
-} PACKED;
-
-struct pnp_data {
- u32 signature;
- u8 revision;
- u8 len;
- u16 nextoffset;
- u8 reserved_08;
- u8 checksum;
- u32 devid;
- u16 manufacturer;
- u16 productname;
- u8 type_lo;
- u16 type_hi;
- u8 dev_flags;
- u16 bcv;
- u16 dv;
- u16 bev;
- u16 reserved_1c;
- u16 staticresource;
-} PACKED;
-
-#define OPTION_ROM_SIGNATURE 0xaa55
-#define OPTION_ROM_ALIGN 2048
-#define OPTION_ROM_INITVECTOR offsetof(struct rom_header, initVector[0])
-#define PCI_ROM_SIGNATURE 0x52494350 // PCIR
-#define PCIROM_CODETYPE_X86 0
-
// The end of the last deployed rom.
u32 RomEnd = BUILD_ROM_START;
__callrom(MAKE_FLATPTR(seg, 0), ip, 0);
}
+static int EnforceChecksum;
+
// Verify that an option rom looks valid
static int
is_valid_rom(struct rom_header *rom)
if (sum != 0) {
dprintf(1, "Found option rom with bad checksum: loc=%p len=%d sum=%x\n"
, rom, len, sum);
- if (CONFIG_OPTIONROMS_CHECKSUM)
+ if (EnforceChecksum)
return 0;
}
return 1;
if (!source)
return -1;
if (source & RS_PCIROM)
- return bootprio_find_pci_rom(source, instance);
+ return bootprio_find_pci_rom((void*)(u32)source, instance);
return bootprio_find_named_rom(romfile_name(source), instance);
}
+
/****************************************************************
* Roms in CBFS
****************************************************************/
if (! rom)
// No ROM present.
return -1;
- setRomSource(sources, rom, RS_PCIROM | bdf);
+ setRomSource(sources, rom, RS_PCIROM | (u32)pci);
return init_optionrom(rom, bdf, isvga);
}
* VGA init
****************************************************************/
+static int S3ResumeVgaInit;
+int ScreenAndDebug;
+
// Call into vga code to turn on console.
void
vga_setup(void)
dprintf(1, "Scan for VGA option rom\n");
+ // Load some config settings that impact VGA.
+ EnforceChecksum = romfile_loadint("etc/optionroms-checksum", 1);
+ S3ResumeVgaInit = romfile_loadint("etc/s3-resume-vga-init", 0);
+ ScreenAndDebug = romfile_loadint("etc/screen-and-debug", 1);
+
if (CONFIG_OPTIONROMS_DEPLOYED) {
// Option roms are already deployed on the system.
init_optionrom((void*)BUILD_ROM_START, 0, 1);
} else {
// Clear option rom memory
- memset((void*)RomEnd, 0, _max_rom() - RomEnd);
+ memset((void*)RomEnd, 0, max_rom() - RomEnd);
// Find and deploy PCI VGA rom.
struct pci_device *pci;
foreachpci(pci) {
if (!is_pci_vga(pci))
continue;
- VGAbdf = pci->bdf;
+ vgahook_setup(pci);
init_pcirom(pci, 1, NULL);
break;
}
void
s3_resume_vga_init(void)
{
- if (!CONFIG_S3_RESUME_VGA_INIT)
+ if (!S3ResumeVgaInit)
return;
struct rom_header *rom = (void*)BUILD_ROM_START;
if (! is_valid_rom(rom))