2 * coreboot Framebuffer driver.
4 * Copyright (C) 2011 The Chromium OS authors
6 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/arch/tables.h>
11 #include <asm/arch/sysinfo.h>
14 #include "videomodes.h"
21 static void save_vesa_mode(void)
23 struct vesa_mode_info *vesa = &mode_info.vesa;
24 struct cb_framebuffer *fb = lib_sysinfo.framebuffer;
26 vesa->x_resolution = fb->x_resolution;
27 vesa->y_resolution = fb->y_resolution;
28 vesa->bits_per_pixel = fb->bits_per_pixel;
29 vesa->bytes_per_scanline = fb->bytes_per_line;
30 vesa->phys_base_ptr = fb->physical_address;
31 vesa->red_mask_size = fb->red_mask_size;
32 vesa->red_mask_pos = fb->red_mask_pos;
33 vesa->green_mask_size = fb->green_mask_size;
34 vesa->green_mask_pos = fb->green_mask_pos;
35 vesa->blue_mask_size = fb->blue_mask_size;
36 vesa->blue_mask_pos = fb->blue_mask_pos;
37 vesa->reserved_mask_size = fb->reserved_mask_size;
38 vesa->reserved_mask_pos = fb->reserved_mask_pos;
41 static int parse_coreboot_table_fb(GraphicDevice *gdev)
43 struct cb_framebuffer *fb = lib_sysinfo.framebuffer;
45 /* If there is no framebuffer structure, bail out and keep
46 * running on the serial console.
51 gdev->winSizeX = fb->x_resolution;
52 gdev->winSizeY = fb->y_resolution;
54 gdev->plnSizeX = fb->x_resolution;
55 gdev->plnSizeY = fb->y_resolution;
57 gdev->gdfBytesPP = fb->bits_per_pixel / 8;
59 switch (fb->bits_per_pixel) {
61 gdev->gdfIndex = GDF_32BIT_X888RGB;
64 gdev->gdfIndex = GDF_16BIT_565RGB;
67 gdev->gdfIndex = GDF__8BIT_INDEX;
71 gdev->isaBase = CONFIG_SYS_ISA_IO_BASE_ADDRESS;
72 gdev->pciBase = (unsigned int)fb->physical_address;
74 gdev->frameAdrs = (unsigned int)fb->physical_address;
75 gdev->memSize = fb->bytes_per_line * fb->y_resolution;
77 gdev->vprBase = (unsigned int)fb->physical_address;
78 gdev->cprBase = (unsigned int)fb->physical_address;
83 void *video_hw_init(void)
85 GraphicDevice *gdev = &ctfb;
90 if (!parse_coreboot_table_fb(gdev)) {
91 printf("No video mode configured in coreboot!\n");
95 bits_per_pixel = gdev->gdfBytesPP * 8;
97 /* fill in Graphic device struct */
98 sprintf(gdev->modeIdent, "%dx%dx%d", gdev->winSizeX, gdev->winSizeY,
100 printf("%s\n", gdev->modeIdent);
102 memset((void *)gdev->pciBase, 0,
103 gdev->winSizeX * gdev->winSizeY * gdev->gdfBytesPP);
105 /* Initialize vesa_mode_info structure */