
On 9/8/21 3:33 PM, Simon Glass wrote:
The current EFI video driver only works when running in the stub. In that case the stub calls boot services (before jumping to U-Boot proper) and copies the graphics info over to the efi table. This is necessary because the stub exits boot services before jumping to U-Boot.
The app maintains access to boot services throughout its life, so does not need to do this. Update the driver to support calling boot services directly.
Enable video output for the app.
Please, use the EFI_GRAPHICS_OUTPUT_PROTOCOL to implement video. Don't assume any VESA or VGA compatible card. This would not be portable to other architectures.
Best regards
Heinrich
A sample qemu command-line for this case is:
qemu-system-x86_64 -bios /usr/share/edk2.git/ovmf-ia32/OVMF-pure-efi.fd -drive id=disk,file=try.img,if=none,format=raw -nic none -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0
Signed-off-by: Simon Glass sjg@chromium.org
arch/x86/dts/efi-x86_app.dts | 4 ++++ board/efi/efi-x86_app/Kconfig | 4 ++++ drivers/video/Kconfig | 2 +- drivers/video/efi.c | 45 ++++++++++++++++++++++++++++------- include/configs/efi-x86_app.h | 6 ++--- 5 files changed, 49 insertions(+), 12 deletions(-)
diff --git a/arch/x86/dts/efi-x86_app.dts b/arch/x86/dts/efi-x86_app.dts index 04e044a07a8..a5316e2a1a7 100644 --- a/arch/x86/dts/efi-x86_app.dts +++ b/arch/x86/dts/efi-x86_app.dts @@ -25,4 +25,8 @@ compatible = "efi,reset"; u-boot,dm-pre-reloc; };
- efi-fb {
compatible = "efi-fb";
- };
- };
diff --git a/board/efi/efi-x86_app/Kconfig b/board/efi/efi-x86_app/Kconfig index e412702eed7..ecd08d73146 100644 --- a/board/efi/efi-x86_app/Kconfig +++ b/board/efi/efi-x86_app/Kconfig @@ -12,4 +12,8 @@ config SYS_SOC config SYS_CONFIG_NAME default "efi-x86_app"
+config BOARD_SPECIFIC_OPTIONS # dummy
- def_bool y
- imply VIDEO_EFI
- endif
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 8b940d70eb2..38a421690d9 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -250,7 +250,7 @@ config VIDEO_COREBOOT
config VIDEO_EFI bool "Enable EFI framebuffer driver support"
- depends on EFI_STUB
- depends on EFI_STUB || EFI_APP help Turn on this option to enable a framebuffeer driver when U-Boot is loaded as a payload (see README.u-boot_on_efi) by an EFI BIOS where
diff --git a/drivers/video/efi.c b/drivers/video/efi.c index c248bd352a7..4e13a3efcb1 100644 --- a/drivers/video/efi.c +++ b/drivers/video/efi.c @@ -50,6 +50,28 @@ static void efi_find_pixel_bits(u32 mask, u8 *pos, u8 *size) *size = len; }
+static int get_mode_info(struct vesa_mode_info *vesa) +{
- efi_guid_t efi_gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
- struct efi_boot_services *boot = efi_get_boot();
- struct efi_gop_mode *mode;
- struct efi_gop *gop;
- int ret;
- if (!boot)
return log_msg_ret("sys", -ENOSYS);
- ret = boot->locate_protocol(&efi_gop_guid, NULL, (void **)&gop);
- if (ret)
return log_msg_ret("prot", -ENOTSUPP);
- mode = gop->mode;
- vesa->phys_base_ptr = mode->fb_base;
- vesa->x_resolution = mode->info->width;
- vesa->y_resolution = mode->info->height;
- return 0;
+}
- static int save_vesa_mode(struct vesa_mode_info *vesa) { struct efi_entry_gopmode *mode;
@@ -57,16 +79,23 @@ static int save_vesa_mode(struct vesa_mode_info *vesa) int size; int ret;
- ret = efi_info_get(EFIET_GOP_MODE, (void **)&mode, &size);
- if (ret == -ENOENT) {
debug("efi graphics output protocol mode not found\n");
return -ENXIO;
- if (IS_ENABLED(CONFIG_EFI_APP)) {
ret = get_mode_info(vesa);
if (ret) {
printf("efi graphics output protocol not found\n");
return -ENXIO;
}
- } else {
ret = efi_info_get(EFIET_GOP_MODE, (void **)&mode, &size);
if (ret == -ENOENT) {
printf("efi graphics output protocol mode not found\n");
return -ENXIO;
}
vesa->phys_base_ptr = mode->fb_base;
vesa->x_resolution = mode->info->width;
}vesa->y_resolution = mode->info->height;
- vesa->phys_base_ptr = mode->fb_base;
- vesa->x_resolution = mode->info->width;
- vesa->y_resolution = mode->info->height;
- if (mode->info->pixel_format < EFI_GOT_BITMASK) { fbinfo = &efi_framebuffer_format_map[mode->info->pixel_format]; vesa->red_mask_size = fbinfo->red.size;
diff --git a/include/configs/efi-x86_app.h b/include/configs/efi-x86_app.h index 33418cfbec4..6061a6db0a4 100644 --- a/include/configs/efi-x86_app.h +++ b/include/configs/efi-x86_app.h @@ -10,8 +10,8 @@
#undef CONFIG_TPM_TIS_BASE_ADDRESS
-#define CONFIG_STD_DEVICES_SETTINGS "stdin=usbkbd,vga,serial\0" \
"stdout=vga,serial\0" \
"stderr=vga,serial\0"
+#define CONFIG_STD_DEVICES_SETTINGS "stdin=serial\0" \
"stdout=vidconsole\0" \
"stderr=vidconsole\0"
#endif