x86: Move asm/arch-coreboot/tables.h to a common place
[oweals/u-boot.git] / drivers / video / coreboot_fb.c
1 /*
2  * coreboot Framebuffer driver.
3  *
4  * Copyright (C) 2011 The Chromium OS authors
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  */
8
9 #include <common.h>
10 #include <asm/arch/sysinfo.h>
11 #include <vbe.h>
12 #include <video_fb.h>
13 #include "videomodes.h"
14
15 /*
16  * The Graphic Device
17  */
18 GraphicDevice ctfb;
19
20 static 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
40 static 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
82 void *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
104         /* Initialize vesa_mode_info structure */
105         save_vesa_mode();
106
107         return (void *)gdev;
108 }