[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