[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