[PATCH v2 06/13] efi: Support copy framebuffer

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Feb 23 12:58:26 CET 2023


On 2/22/23 20:12, Simon Glass wrote:
> Add support for this to EFI in case it becomes useful. At present it just
> slows things down. You can enable CONFIG_VIDEO_COPY to turn it on.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2:
> - Obtain copy framebuffer size from EFI instead of using a fixed value
> - Dropping debugging printf()
> - use new bootph-xxx tag
>
>   arch/x86/dts/efi-x86_app.dts |  1 +
>   drivers/video/efi.c          | 25 ++++++++++++++++++++++++-
>   2 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/dts/efi-x86_app.dts b/arch/x86/dts/efi-x86_app.dts
> index 6d843a9820b..59e2e402d5e 100644
> --- a/arch/x86/dts/efi-x86_app.dts
> +++ b/arch/x86/dts/efi-x86_app.dts
> @@ -27,6 +27,7 @@
>   	};
>   	efi-fb {
>   		compatible = "efi-fb";
> +		bootph-some-ram;
>   	};
>
>   };
> diff --git a/drivers/video/efi.c b/drivers/video/efi.c
> index 169637c2882..a8e9282ab87 100644
> --- a/drivers/video/efi.c
> +++ b/drivers/video/efi.c
> @@ -129,7 +129,6 @@ static int save_vesa_mode(struct vesa_mode_info *vesa, u64 *fbp)
>   	struct efi_gop_mode_info *info;
>   	int ret;
>
> -	printf("start\n");
>   	if (IS_ENABLED(CONFIG_EFI_APP))
>   		ret = get_mode_info(vesa, fbp, &info);
>   	else
> @@ -207,6 +206,29 @@ err:
>   	return ret;
>   }
>
> +static int efi_video_bind(struct udevice *dev)
> +{
> +	if (IS_ENABLED(CONFIG_VIDEO_COPY)) {
> +		struct video_uc_plat *plat = dev_get_uclass_plat(dev);
> +		struct vesa_mode_info vesa;

struct vesa_mode_info vesa = {0};

see below

> +		int ret;
> +		u64 fb;
> +
> +		/*
> +		 * Initialise vesa_mode_info structure so we can figure out the
> +		 * required framebuffer size. If something goes wrong, just do
> +		 * without a copy framebuffer
> +		 */
> +		ret = save_vesa_mode(&vesa, &fb);
> +		if (!ret) {
> +			plat->copy_size = vesa.bytes_per_scanline *
> +				vesa.y_resolution;

If there is no EFI_GRAPHICS_OUTPUT_PROTOCOL, ret = -ENXIO but vesa is
*not* initialized. You don't want to use random bytes from the stack to
calculate copy_size and afterwards write into a non-existent framebuffer.

If you initialize vesa to zero, you can test if copy_size == 0 and in
this case return 1 to indicate that binding failed.

Best regards

Heinrich

> +		}
> +	}
> +
> +	return 0;
> +}
> +
>   static const struct udevice_id efi_video_ids[] = {
>   	{ .compatible = "efi-fb" },
>   	{ }
> @@ -216,5 +238,6 @@ U_BOOT_DRIVER(efi_video) = {
>   	.name	= "efi_video",
>   	.id	= UCLASS_VIDEO,
>   	.of_match = efi_video_ids,
> +	.bind	= efi_video_bind,
>   	.probe	= efi_video_probe,
>   };



More information about the U-Boot mailing list