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