]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/video/coreboot_fb.c
pxa_lcd: invert colors for Zipit Z2 to get white on black palette
[people/ms/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 }