[PATCH 10/35] efi: Add video support to the app
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Sep 8 19:40:16 CEST 2021
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 at 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
>
More information about the U-Boot
mailing list