efi_loader: GOP: Add 30bpp support
authorMark Kettenis <kettenis@openbsd.org>
Sat, 25 Sep 2021 20:47:37 +0000 (22:47 +0200)
committerAnatolij Gustschin <agust@denx.de>
Sat, 9 Oct 2021 16:46:13 +0000 (18:46 +0200)
Provide correct framebuffer information for 30bpp modes.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
lib/efi_loader/efi_gop.c

index 1206b2d..5033a2c 100644 (file)
@@ -432,7 +432,7 @@ efi_status_t EFIAPI gop_blt(struct efi_gop *this, struct efi_gop_pixel *buffer,
 efi_status_t efi_gop_register(void)
 {
        struct efi_gop_obj *gopobj;
-       u32 bpix, col, row;
+       u32 bpix, format, col, row;
        u64 fb_base, fb_size;
        void *fb;
        efi_status_t ret;
@@ -449,6 +449,7 @@ efi_status_t efi_gop_register(void)
 
        priv = dev_get_uclass_priv(vdev);
        bpix = priv->bpix;
+       format = priv->format;
        col = video_get_xsize(vdev);
        row = video_get_ysize(vdev);
        fb_base = (uintptr_t)priv->fb;
@@ -458,6 +459,7 @@ efi_status_t efi_gop_register(void)
        int line_len;
 
        bpix = panel_info.vl_bpix;
+       format = VIDEO_UNKNOWN;
        col = panel_info.vl_col;
        row = panel_info.vl_row;
        fb_base = gd->fb_base;
@@ -517,7 +519,15 @@ efi_status_t efi_gop_register(void)
        if (bpix == LCD_COLOR32)
 #endif
        {
-               gopobj->info.pixel_format = EFI_GOT_BGRA8;
+               if (format == VIDEO_X2R10G10B10) {
+                       gopobj->info.pixel_format = EFI_GOT_BITMASK;
+                       gopobj->info.pixel_bitmask[0] = 0x3ff00000; /* red */
+                       gopobj->info.pixel_bitmask[1] = 0x000ffc00; /* green */
+                       gopobj->info.pixel_bitmask[2] = 0x000003ff; /* blue */
+                       gopobj->info.pixel_bitmask[3] = 0xc0000000; /* reserved */
+               } else {
+                       gopobj->info.pixel_format = EFI_GOT_BGRA8;
+               }
        } else {
                gopobj->info.pixel_format = EFI_GOT_BITMASK;
                gopobj->info.pixel_bitmask[0] = 0xf800; /* red */