#include "pci_regs.h" // PCI_ROM_ADDRESS
#include "pci_ids.h" // PCI_CLASS_DISPLAY_VGA
#include "boot.h" // IPL
+#include "paravirt.h" // qemu_cfg_*
/****************************************************************
br.es = SEG_BIOS;
br.di = get_pnp_offset();
br.code = SEGOFF(seg, offset);
+ start_preempt();
call16big(&br);
+ finish_preempt();
debug_serial_setup();
}
// Return the memory position up to which roms may be located.
static inline u32
-max_rom()
+max_rom(void)
{
- extern u8 code32_start[];
- if ((u32)code32_start > BUILD_BIOS_ADDR)
+ extern u8 code32flat_start[];
+ if ((u32)code32flat_start > BUILD_BIOS_ADDR)
return BUILD_BIOS_ADDR;
- return (u32)code32_start;
+ return (u32)code32flat_start;
}
// Copy a rom to its permanent location below 1MiB
u32 romsize = rom->size * 512;
if (RomEnd + romsize > max_rom()) {
// Option rom doesn't fit.
- dprintf(1, "Option rom %p doesn't fit.\n", rom);
+ warn_noalloc();
return NULL;
}
dprintf(4, "Copying option rom (size %d) from %p to %x\n"
, romsize, rom, RomEnd);
- memcpy((void*)RomEnd, rom, romsize);
+ iomemcpy((void*)RomEnd, rom, romsize);
return (void*)RomEnd;
}
&& ((OPTIONROM_VENDEV_2 >> 16)
| ((OPTIONROM_VENDEV_2 & 0xffff)) << 16) == vendev)
return copy_rom((void*)OPTIONROM_MEM_2);
- int ret = cbfs_copy_optionrom((void*)RomEnd, max_rom() - RomEnd, vendev);
- if (ret < 0)
+ char fname[17];
+ snprintf(fname, sizeof(fname), "pci%04x,%04x.rom"
+ , pci_vd_to_ven(vendev), pci_vd_to_dev(vendev));
+ 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_cbfs_roms(const char *prefix, int isvga)
+run_file_roms(const char *prefix, int isvga)
{
- struct cbfs_file *file = NULL;
+ u32 file = 0;
for (;;) {
- file = cbfs_findprefix(prefix, file);
+ file = romfile_findprefix(prefix, file);
if (!file)
break;
- int ret = cbfs_copyfile(file, (void*)RomEnd, max_rom() - RomEnd);
+ int ret = romfile_copy(file, (void*)RomEnd, max_rom() - RomEnd);
if (ret > 0)
init_optionrom((void*)RomEnd, 0, isvga);
}
struct rom_header *rom = (void*)orig;
for (;;) {
- dprintf(5, "Inspecting possible rom at %p (dv=%08x bdf=%x)\n"
- , rom, vendev, bdf);
+ dprintf(5, "Inspecting possible rom at %p (vd=%04x:%04x"
+ " bdf=%02x:%02x.%x)\n"
+ , rom, pci_vd_to_ven(vendev), pci_vd_to_dev(vendev)
+ , pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), pci_bdf_to_fn(bdf));
if (rom->signature != OPTION_ROM_SIGNATURE) {
dprintf(6, "No option rom signature (got %x)\n", rom->signature);
goto fail;
goto fail;
}
- u32 vd = (pci->device << 16) | pci->vendor;
+ u32 vd = pci_vd(pci->vendor, pci->device);
if (vd == vendev && pci->type == PCIROM_CODETYPE_X86)
// A match
break;
init_pcirom(u16 bdf, int isvga)
{
u32 vendev = pci_config_readl(bdf, PCI_VENDOR_ID);
- dprintf(4, "Attempting to init PCI bdf %02x:%02x.%x (dev/ven %08x)\n"
+ dprintf(4, "Attempting to init PCI bdf %02x:%02x.%x (vd %04x:%04x)\n"
, pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), pci_bdf_to_fn(bdf)
- , vendev);
+ , pci_vd_to_ven(vendev), pci_vd_to_dev(vendev));
struct rom_header *rom = lookup_hardcode(vendev);
if (! rom)
rom = map_pcirom(bdf, vendev);
****************************************************************/
void
-optionrom_setup()
+optionrom_setup(void)
{
if (! CONFIG_OPTIONROMS)
return;
}
// Find and deploy CBFS roms not associated with a device.
- run_cbfs_roms("genroms/", 0);
+ run_file_roms("genroms/", 0);
}
// All option roms found and deployed - now build BEV/BCV vectors.
// Call into vga code to turn on console.
void
-vga_setup()
+vga_setup(void)
{
VGAbdf = -1;
RomEnd = BUILD_ROM_START;
init_pcirom(bdf, 1);
// Find and deploy CBFS vga-style roms not associated with a device.
- run_cbfs_roms("vgaroms/", 1);
+ run_file_roms("vgaroms/", 1);
}
if (RomEnd == BUILD_ROM_START) {
return;
}
- dprintf(1, "Turning on vga console\n");
- struct bregs br;
- memset(&br, 0, sizeof(br));
- br.flags = F_IF;
- br.ax = 0x0003;
- call16_int(0x10, &br);
-
- // Write to screen.
- printf("Starting SeaBIOS (version %s)\n\n", VERSION);
+ enable_vga_console();
}
void
-s3_resume_vga_init()
+s3_resume_vga_init(void)
{
if (!CONFIG_S3_RESUME_VGA_INIT)
return;