uboot/drivers/video/coreboot.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
   4 */
   5
   6#include <common.h>
   7#include <dm.h>
   8#include <init.h>
   9#include <vbe.h>
  10#include <video.h>
  11#include <asm/cb_sysinfo.h>
  12
  13static int save_vesa_mode(struct cb_framebuffer *fb,
  14                          struct vesa_mode_info *vesa)
  15{
  16        /*
  17         * If there is no framebuffer structure, bail out and keep
  18         * running on the serial console.
  19         */
  20        if (!fb)
  21                return log_msg_ret("save", -ENXIO);
  22
  23        vesa->x_resolution = fb->x_resolution;
  24        vesa->y_resolution = fb->y_resolution;
  25        vesa->bits_per_pixel = fb->bits_per_pixel;
  26        vesa->bytes_per_scanline = fb->bytes_per_line;
  27        vesa->phys_base_ptr = fb->physical_address;
  28        vesa->red_mask_size = fb->red_mask_size;
  29        vesa->red_mask_pos = fb->red_mask_pos;
  30        vesa->green_mask_size = fb->green_mask_size;
  31        vesa->green_mask_pos = fb->green_mask_pos;
  32        vesa->blue_mask_size = fb->blue_mask_size;
  33        vesa->blue_mask_pos = fb->blue_mask_pos;
  34        vesa->reserved_mask_size = fb->reserved_mask_size;
  35        vesa->reserved_mask_pos = fb->reserved_mask_pos;
  36
  37        return 0;
  38}
  39
  40static int coreboot_video_probe(struct udevice *dev)
  41{
  42        struct video_uc_plat *plat = dev_get_uclass_plat(dev);
  43        struct video_priv *uc_priv = dev_get_uclass_priv(dev);
  44        struct cb_framebuffer *fb = lib_sysinfo.framebuffer;
  45        struct vesa_mode_info *vesa = &mode_info.vesa;
  46        int ret;
  47
  48        if (ll_boot_init())
  49                return log_msg_ret("ll", -ENODEV);
  50
  51        printf("Video: ");
  52
  53        /* Initialize vesa_mode_info structure */
  54        ret = save_vesa_mode(fb, vesa);
  55        if (ret) {
  56                ret = log_msg_ret("save", ret);
  57                goto err;
  58        }
  59
  60        ret = vbe_setup_video_priv(vesa, uc_priv, plat);
  61        if (ret) {
  62                ret = log_msg_ret("setup", ret);
  63                goto err;
  64        }
  65
  66        printf("%dx%dx%d\n", uc_priv->xsize, uc_priv->ysize,
  67               vesa->bits_per_pixel);
  68
  69        return 0;
  70
  71err:
  72        printf("No video mode configured in coreboot (err=%d)\n", ret);
  73        return ret;
  74}
  75
  76static const struct udevice_id coreboot_video_ids[] = {
  77        { .compatible = "coreboot-fb" },
  78        { }
  79};
  80
  81U_BOOT_DRIVER(coreboot_video) = {
  82        .name   = "coreboot_video",
  83        .id     = UCLASS_VIDEO,
  84        .of_match = coreboot_video_ids,
  85        .probe  = coreboot_video_probe,
  86};
  87