]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
boot: fdt_simplefb: Enumerate framebuffer info from video handoff
authorDevarsh Thakkar <devarsht@ti.com>
Thu, 22 Feb 2024 13:08:08 +0000 (18:38 +0530)
committerAnatolij Gustschin <agust@denx.de>
Sun, 21 Apr 2024 07:07:02 +0000 (09:07 +0200)
Enable and update simple-framebuffer node using the video handoff
bloblist if video was enabled at SPL stage and corresponding video
bloblist was received at u-boot proper with necessary parameters.

Signed-off-by: Devarsh Thakkar <devarsht@ti.com>
Reviewed-by: Nikhil M Jain <n-jain1@ti.com>
boot/fdt_simplefb.c

index 069ced75a7f8106d2fbbc51d431796ef81655749..b0221eaf2ab9edfdba6a2d4bf45fd8b54f804f4b 100644 (file)
@@ -12,6 +12,8 @@
 #include <asm/global_data.h>
 #include <linux/libfdt.h>
 #include <video.h>
+#include <spl.h>
+#include <bloblist.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -26,15 +28,29 @@ static int fdt_simplefb_configure_node(void *blob, int off)
        struct udevice *dev;
        int ret;
 
-       ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
-       if (ret)
-               return ret;
-       uc_priv = dev_get_uclass_priv(dev);
-       plat = dev_get_uclass_plat(dev);
-       xsize = uc_priv->xsize;
-       ysize = uc_priv->ysize;
-       bpix = uc_priv->bpix;
-       fb_base = plat->base;
+       if (IS_ENABLED(CONFIG_SPL_VIDEO_HANDOFF) && spl_phase() > PHASE_SPL) {
+               struct video_handoff *ho;
+
+               ho = bloblist_find(BLOBLISTT_U_BOOT_VIDEO, sizeof(*ho));
+               if (!ho)
+                       return log_msg_ret("Missing video bloblist", -ENOENT);
+
+               xsize = ho->xsize;
+               ysize = ho->ysize;
+               bpix = ho->bpix;
+               fb_base = ho->fb;
+       } else {
+               ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
+               if (ret)
+                       return ret;
+               uc_priv = dev_get_uclass_priv(dev);
+               plat = dev_get_uclass_plat(dev);
+               xsize = uc_priv->xsize;
+               ysize = uc_priv->ysize;
+               bpix = uc_priv->bpix;
+               fb_base = plat->base;
+       }
+
        switch (bpix) {
        case 4: /* VIDEO_BPP16 */
                name = "r5g6b5";