blob: feb5463f4783f2c741491b458f5bebf78261aa25 [file] [log] [blame]
Stefan Reinauer23218f72012-11-30 06:32:33 +00001/*
2 * coreboot Framebuffer driver.
3 *
4 * Copyright (C) 2011 The Chromium OS authors
5 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02006 * SPDX-License-Identifier: GPL-2.0+
Stefan Reinauer23218f72012-11-30 06:32:33 +00007 */
8
9#include <common.h>
Stefan Reinauer23218f72012-11-30 06:32:33 +000010#include <asm/arch/sysinfo.h>
Bin Mengc8990bd2015-08-13 00:29:16 -070011#include <vbe.h>
Stefan Reinauer23218f72012-11-30 06:32:33 +000012#include <video_fb.h>
13#include "videomodes.h"
14
15/*
16 * The Graphic Device
17 */
18GraphicDevice ctfb;
19
Bin Mengc8990bd2015-08-13 00:29:16 -070020static void save_vesa_mode(void)
21{
22 struct vesa_mode_info *vesa = &mode_info.vesa;
23 struct cb_framebuffer *fb = lib_sysinfo.framebuffer;
24
25 vesa->x_resolution = fb->x_resolution;
26 vesa->y_resolution = fb->y_resolution;
27 vesa->bits_per_pixel = fb->bits_per_pixel;
28 vesa->bytes_per_scanline = fb->bytes_per_line;
29 vesa->phys_base_ptr = fb->physical_address;
30 vesa->red_mask_size = fb->red_mask_size;
31 vesa->red_mask_pos = fb->red_mask_pos;
32 vesa->green_mask_size = fb->green_mask_size;
33 vesa->green_mask_pos = fb->green_mask_pos;
34 vesa->blue_mask_size = fb->blue_mask_size;
35 vesa->blue_mask_pos = fb->blue_mask_pos;
36 vesa->reserved_mask_size = fb->reserved_mask_size;
37 vesa->reserved_mask_pos = fb->reserved_mask_pos;
38}
39
Stefan Reinauer23218f72012-11-30 06:32:33 +000040static int parse_coreboot_table_fb(GraphicDevice *gdev)
41{
42 struct cb_framebuffer *fb = lib_sysinfo.framebuffer;
43
44 /* If there is no framebuffer structure, bail out and keep
45 * running on the serial console.
46 */
47 if (!fb)
48 return 0;
49
50 gdev->winSizeX = fb->x_resolution;
51 gdev->winSizeY = fb->y_resolution;
52
53 gdev->plnSizeX = fb->x_resolution;
54 gdev->plnSizeY = fb->y_resolution;
55
56 gdev->gdfBytesPP = fb->bits_per_pixel / 8;
57
58 switch (fb->bits_per_pixel) {
59 case 24:
60 gdev->gdfIndex = GDF_32BIT_X888RGB;
61 break;
62 case 16:
63 gdev->gdfIndex = GDF_16BIT_565RGB;
64 break;
65 default:
66 gdev->gdfIndex = GDF__8BIT_INDEX;
67 break;
68 }
69
70 gdev->isaBase = CONFIG_SYS_ISA_IO_BASE_ADDRESS;
71 gdev->pciBase = (unsigned int)fb->physical_address;
72
73 gdev->frameAdrs = (unsigned int)fb->physical_address;
74 gdev->memSize = fb->bytes_per_line * fb->y_resolution;
75
76 gdev->vprBase = (unsigned int)fb->physical_address;
77 gdev->cprBase = (unsigned int)fb->physical_address;
78
79 return 1;
80}
81
82void *video_hw_init(void)
83{
84 GraphicDevice *gdev = &ctfb;
85 int bits_per_pixel;
86
87 printf("Video: ");
88
89 if (!parse_coreboot_table_fb(gdev)) {
90 printf("No video mode configured in coreboot!\n");
91 return NULL;
92 }
93
94 bits_per_pixel = gdev->gdfBytesPP * 8;
95
96 /* fill in Graphic device struct */
97 sprintf(gdev->modeIdent, "%dx%dx%d", gdev->winSizeX, gdev->winSizeY,
98 bits_per_pixel);
99 printf("%s\n", gdev->modeIdent);
100
101 memset((void *)gdev->pciBase, 0,
102 gdev->winSizeX * gdev->winSizeY * gdev->gdfBytesPP);
103
Bin Mengc8990bd2015-08-13 00:29:16 -0700104 /* Initialize vesa_mode_info structure */
105 save_vesa_mode();
106
Stefan Reinauer23218f72012-11-30 06:32:33 +0000107 return (void *)gdev;
108}