x86: video: Allow video ROM execution to fall back to the other method

If the BIOS emulator is not available, allow use of native execution if
available, and vice versa. This can be controlled by the caller.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2015-01-27 22:13:34 -07:00
parent 2d934e5703
commit bc17d8f4ac
4 changed files with 43 additions and 13 deletions

View file

@ -758,7 +758,8 @@ int gma_func0_init(pci_dev_t dev, struct pci_controller *hose,
#ifdef CONFIG_VIDEO #ifdef CONFIG_VIDEO
start = get_timer(0); start = get_timer(0);
ret = pci_run_vga_bios(dev, int15_handler, false); ret = pci_run_vga_bios(dev, int15_handler, PCI_ROM_USE_NATIVE |
PCI_ROM_ALLOW_FALLBACK);
debug("BIOS ran in %lums\n", get_timer(start)); debug("BIOS ran in %lums\n", get_timer(start));
#endif #endif
/* Post VBIOS init */ /* Post VBIOS init */

View file

@ -228,11 +228,12 @@ int vbe_get_video_info(struct graphic_device *gdev)
#endif #endif
} }
int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), bool emulate) int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), int exec_method)
{ {
struct pci_rom_header *rom, *ram; struct pci_rom_header *rom, *ram;
int vesa_mode = -1; int vesa_mode = -1;
uint16_t class; uint16_t class;
bool emulate;
int ret; int ret;
/* Only execute VGA ROMs */ /* Only execute VGA ROMs */
@ -262,6 +263,29 @@ int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), bool emulate)
vesa_mode = CONFIG_FRAMEBUFFER_VESA_MODE; vesa_mode = CONFIG_FRAMEBUFFER_VESA_MODE;
#endif #endif
debug("Selected vesa mode %#x\n", vesa_mode); debug("Selected vesa mode %#x\n", vesa_mode);
if (exec_method & PCI_ROM_USE_NATIVE) {
#ifdef CONFIG_X86
emulate = false;
#else
if (!(exec_method & PCI_ROM_ALLOW_FALLBACK)) {
printf("BIOS native execution is only available on x86\n");
return -ENOSYS;
}
emulate = true;
#endif
} else {
#ifdef CONFIG_BIOSEMU
emulate = true;
#else
if (!(exec_method & PCI_ROM_ALLOW_FALLBACK)) {
printf("BIOS emulation not available - see CONFIG_BIOSEMU\n");
return -ENOSYS;
}
emulate = false;
#endif
}
if (emulate) { if (emulate) {
#ifdef CONFIG_BIOSEMU #ifdef CONFIG_BIOSEMU
BE_VGAInfo *info; BE_VGAInfo *info;
@ -274,9 +298,6 @@ int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), bool emulate)
vesa_mode, &mode_info); vesa_mode, &mode_info);
if (ret) if (ret)
return ret; return ret;
#else
printf("BIOS emulation not available - see CONFIG_BIOSEMU\n");
return -ENOSYS;
#endif #endif
} else { } else {
#ifdef CONFIG_X86 #ifdef CONFIG_X86
@ -284,9 +305,6 @@ int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), bool emulate)
bios_run_on_x86(dev, (unsigned long)ram, vesa_mode, bios_run_on_x86(dev, (unsigned long)ram, vesa_mode,
&mode_info); &mode_info);
#else
printf("BIOS native execution is only available on x86\n");
return -ENOSYS;
#endif #endif
} }
debug("Final vesa mode %#x\n", mode_info.video_mode); debug("Final vesa mode %#x\n", mode_info.video_mode);

View file

@ -42,8 +42,8 @@ void *video_hw_init(void)
printf("no card detected\n"); printf("no card detected\n");
return NULL; return NULL;
} }
printf("bdf %x\n", dev); ret = pci_run_vga_bios(dev, NULL, PCI_ROM_USE_NATIVE |
ret = pci_run_vga_bios(dev, NULL, true); PCI_ROM_ALLOW_FALLBACK);
if (ret) { if (ret) {
printf("failed to run video BIOS: %d\n", ret); printf("failed to run video BIOS: %d\n", ret);
return NULL; return NULL;
@ -59,7 +59,7 @@ void *video_hw_init(void)
sprintf(gdev->modeIdent, "%dx%dx%d", gdev->winSizeX, gdev->winSizeY, sprintf(gdev->modeIdent, "%dx%dx%d", gdev->winSizeX, gdev->winSizeY,
bits_per_pixel); bits_per_pixel);
printf("%s\n", gdev->modeIdent); printf("%s\n", gdev->modeIdent);
debug("Framex buffer at %x\n", gdev->pciBase); debug("Frame buffer at %x\n", gdev->pciBase);
return (void *)gdev; return (void *)gdev;
} }

View file

@ -33,14 +33,25 @@ struct pci_rom_data {
uint16_t reserved_2; uint16_t reserved_2;
}; };
/*
* Determines which execution method is used and whether we allow falling back
* to the other if the requested method is not available.
*/
enum pci_rom_emul {
PCI_ROM_EMULATE = 0 << 0,
PCI_ROM_USE_NATIVE = 1 << 0,
PCI_ROM_ALLOW_FALLBACK = 1 << 1,
};
/** /**
* pci_run_vga_bios() - Run the VGA BIOS in an x86 PC * pci_run_vga_bios() - Run the VGA BIOS in an x86 PC
* *
* @dev: Video device containing the BIOS * @dev: Video device containing the BIOS
* @int15_handler: Function to call to handle int 0x15 * @int15_handler: Function to call to handle int 0x15
* @emulate: true to use the x86 emulator, false to run native * @exec_method: flags from enum pci_rom_emul
*/ */
int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), bool emulate); int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void),
int exec_method);
/** /**
* board_map_oprom_vendev() - map several PCI IDs to the one the ROM expects * board_map_oprom_vendev() - map several PCI IDs to the one the ROM expects