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