]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi: Correct handling of frame buffer
authorSimon Glass <sjg@chromium.org>
Mon, 2 Oct 2023 01:14:36 +0000 (19:14 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 15 Nov 2023 03:04:00 +0000 (20:04 -0700)
The efi_gop driver uses private fields from the video uclass to obtain a
pointer to the frame buffer. Use the platform data instead.

Check the VIDEO_COPY setting to determine which frame buffer to use. Once
the next stage is running (and making use of U-Boot's EFI boot services)
U-Boot does not handle copying from priv->fb to the hardware framebuffer,
so we must allow EFI to write directly to the hardware framebuffer.

We could provide a function to read this, but it seems better to just
document how it works. The original change ignored an explicit comment
in the video.h file ("Things that are private to the uclass: don't use
these in the driver") which is why this was missed when the VIDEO_COPY
feature was added.

Signed-off-by: Simon Glass <sjg@chromium.org>
Fixes: 8f661a5b662 ("efi_loader: gop: Expose fb when 32bpp")
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
include/video.h
lib/efi_loader/efi_gop.c

index 5048116a3d5762de315933678bafd667c3835c2e..4d8df9baaada799bda781e554f1660013fb2332f 100644 (file)
@@ -21,9 +21,12 @@ struct udevice;
  * @align: Frame-buffer alignment, indicating the memory boundary the frame
  *     buffer should start on. If 0, 1MB is assumed
  * @size: Frame-buffer size, in bytes
- * @base: Base address of frame buffer, 0 if not yet known
- * @copy_base: Base address of a hardware copy of the frame buffer. See
- *     CONFIG_VIDEO_COPY.
+ * @base: Base address of frame buffer, 0 if not yet known. If CONFIG_VIDEO_COPY
+ *     is enabled, this is the software copy, so writes to this will not be
+ *     visible until vidconsole_sync_copy() is called. If CONFIG_VIDEO_COPY is
+ *     disabled, this is the hardware framebuffer.
+ * @copy_base: Base address of a hardware copy of the frame buffer. If
+ *     CONFIG_VIDEO_COPY is disabled, this is not used.
  * @copy_size: Size of copy framebuffer, used if @size is 0
  * @hide_logo: Hide the logo (used for testing)
  */
index 778b693f983ad83b0d35c83c6677e46b7c2a8a49..a09db31eb46513a6a19d2e48c51ad6b507734070 100644 (file)
@@ -10,6 +10,7 @@
 #include <efi_loader.h>
 #include <log.h>
 #include <malloc.h>
+#include <mapmem.h>
 #include <video.h>
 #include <asm/global_data.h>
 
@@ -467,10 +468,10 @@ efi_status_t efi_gop_register(void)
        struct efi_gop_obj *gopobj;
        u32 bpix, format, col, row;
        u64 fb_base, fb_size;
-       void *fb;
        efi_status_t ret;
        struct udevice *vdev;
        struct video_priv *priv;
+       struct video_uc_plat *plat;
 
        /* We only support a single video output device for now */
        if (uclass_first_device_err(UCLASS_VIDEO, &vdev)) {
@@ -483,9 +484,10 @@ efi_status_t efi_gop_register(void)
        format = priv->format;
        col = video_get_xsize(vdev);
        row = video_get_ysize(vdev);
-       fb_base = (uintptr_t)priv->fb;
-       fb_size = priv->fb_size;
-       fb = priv->fb;
+
+       plat = dev_get_uclass_plat(vdev);
+       fb_base = IS_ENABLED(CONFIG_VIDEO_COPY) ? plat->copy_base : plat->base;
+       fb_size = plat->size;
 
        switch (bpix) {
        case VIDEO_BPP16:
@@ -547,7 +549,7 @@ efi_status_t efi_gop_register(void)
        }
        gopobj->info.pixels_per_scanline = col;
        gopobj->bpix = bpix;
-       gopobj->fb = fb;
+       gopobj->fb = map_sysmem(fb_base, fb_size);
 
        return EFI_SUCCESS;
 }