src/: Replace GPL boilerplate with SPDX headers
[coreboot.git] / src / drivers / pc80 / vga / vga.c
blob7bb10cf610a0cc36bb5f3c04bde7975b177f1e07
1 /* This file is part of the coreboot project. */
2 /* SPDX-License-Identifier: GPL-2.0-or-later */
4 #include <pc80/vga.h>
5 #include <pc80/vga_io.h>
7 #include <string.h>
8 #include "vga.h"
11 * pci io enable should've happened before
13 void
14 vga_io_init(void)
16 vga_enable_mask(0x01, 0x01);
18 /* cr io is at 0x3D4/0x3D5 */
19 vga_misc_mask(0x01, 0x01);
21 /* clear cr0-7 protection */
22 vga_cr_mask(0x11, 0x00, 0x80);
28 static void
29 vga_fb_init(void)
31 vga_sr_write(0x02, 0x03);
32 vga_sr_write(0x03, 0x00);
33 vga_sr_write(0x04, 0x02); /* access all 256kB */
35 vga_gr_write(0x00, 0x00);
36 vga_gr_write(0x01, 0x00);
37 vga_gr_write(0x02, 0x00);
38 vga_gr_write(0x03, 0x00);
39 vga_gr_write(0x04, 0x00);
40 vga_gr_write(0x05, 0x10);
41 vga_gr_write(0x06, 0x0E); /* map at 0xB8000 */
42 vga_gr_write(0x07, 0x00);
43 vga_gr_write(0x08, 0xFF);
45 /* o/e enable: RAM enable */
46 vga_misc_mask(0x22, 0x22);
52 static void
53 vga_fb_clear(void)
55 memset((void *)VGA_FB, 0x00, 0x8000);
61 static void
62 vga_palette_init(void)
64 unsigned int i;
66 /* set up attribute registers */
67 for (i = 0; i < 0x10; i++)
68 vga_ar_write(i, i);
70 vga_ar_write(0x10, 0x0c);
71 vga_ar_write(0x11, 0x00);
72 vga_ar_write(0x12, 0x0F);
73 vga_ar_write(0x13, 0x08);
74 vga_ar_write(0x14, 0x00);
76 vga_palette_disable();
78 /* load actual palette */
79 vga_dac_mask_write(0xFF);
81 for (i = 0; i < 0x100; i++) {
82 vga_dac_write_address(i);
83 vga_dac_data_write(default_vga_palette[i].red);
84 vga_dac_data_write(default_vga_palette[i].green);
85 vga_dac_data_write(default_vga_palette[i].blue);
92 static void
93 vga_mode_set(int hdisplay, int hblankstart, int hsyncstart, int hsyncend,
94 int hblankend, int htotal, int vdisplay, int vblankstart,
95 int vsyncstart, int vsyncend, int vblankend, int vtotal,
96 int stride)
98 /* htotal: 2080 */
99 htotal /= 8;
100 htotal -= 5;
101 vga_cr_write(0x00, htotal);
103 /* hdisplay: 2048 */
104 hdisplay /= 8;
105 hdisplay -= 1;
106 vga_cr_write(0x01, hdisplay);
108 /* hblankstart: 2048 */
109 hblankstart /= 8;
110 hblankstart -= 1;
111 vga_cr_write(0x02, hblankstart);
113 /* hblankend: hblankstart + 512 */
114 hblankend /= 8;
115 hblankend -= 1;
116 vga_cr_mask(0x03, hblankend, 0x1F);
117 vga_cr_mask(0x05, hblankend << 2, 0x80);
119 /* hsyncstart: 255 * 8: 2040 */
120 vga_cr_write(0x04, hsyncstart / 8);
122 /* hsyncend: hsyncstart + 255 */
123 vga_cr_mask(0x05, hsyncend / 8, 0x1F);
125 /* vtotal: 1025 */
126 vtotal -= 2;
127 vga_cr_write(0x06, vtotal);
128 vga_cr_mask(0x07, vtotal >> 8, 0x01);
129 vga_cr_mask(0x07, vtotal >> 4, 0x20);
131 /* vdisplay: 1024 */
132 vdisplay -= 1;
133 vga_cr_write(0x12, vdisplay);
134 vga_cr_mask(0x07, vdisplay >> 7, 0x02);
135 vga_cr_mask(0x07, vdisplay >> 3, 0x40);
137 /* vblankstart: 1024 */
138 vblankstart -= 1;
139 vga_cr_write(0x15, vblankstart);
140 vga_cr_mask(0x07, vblankstart >> 5, 0x08);
141 vga_cr_mask(0x09, vblankstart >> 4, 0x20);
143 /* vblankend: vblankstart + 256 */
144 vblankend -= 1;
145 vga_cr_write(0x16, vblankend);
147 /* vsyncstart: 1023 */
148 vga_cr_write(0x10, vsyncstart);
149 vga_cr_mask(0x07, vsyncstart >> 6, 0x04);
150 vga_cr_mask(0x07, vsyncstart >> 2, 0x80);
152 /* vsyncend: vsyncstart + 16 */
153 vga_cr_mask(0x11, vsyncend, 0x0F);
155 /* stride */
156 vga_cr_write(0x13, stride / 8);
158 /* line compare */
159 vga_cr_write(0x18, 0xFF);
160 vga_cr_mask(0x07, 0x10, 0x10);
161 vga_cr_mask(0x09, 0x40, 0x40);
163 vga_misc_mask(0x44, 0xCC); /* set up clock: 27mhz and h/vsync */
165 vga_cr_mask(0x09, 0x00, 0x80); /* disable doublescan */
168 static void
169 vga_font_8x16_load(void)
171 unsigned char *p;
172 int i, j;
173 unsigned char sr2, sr4, gr5, gr6;
175 #define height 16
176 #define count 256
178 sr2 = vga_sr_read(0x02);
179 sr4 = vga_sr_read(0x04);
180 gr5 = vga_gr_read(0x05);
181 gr6 = vga_gr_read(0x06);
183 /* disable odd/even */
184 vga_sr_mask(0x04, 0x04, 0x04);
185 vga_gr_mask(0x05, 0x00, 0x10);
186 vga_gr_mask(0x06, 0x00, 0x02);
188 /* plane 2 */
189 vga_sr_write(0x02, 0x04);
190 p = (unsigned char *) VGA_FB;
191 for (i = 0; i < count; i++) {
192 for (j = 0; j < 32; j++) {
193 if (j < height)
194 *p = vga_font_8x16[i][j];
195 else
196 *p = 0x00;
197 p++;
201 vga_gr_write(0x06, gr6);
202 vga_gr_write(0x05, gr5);
203 vga_sr_write(0x04, sr4);
204 vga_sr_write(0x02, sr2);
206 /* set up font size */
207 vga_cr_mask(0x09, 16 - 1, 0x1F);
213 void
214 vga_cursor_enable(int enable)
216 if (enable)
217 vga_cr_mask(0x0A, 0x00, 0x20);
218 else
219 vga_cr_mask(0x0A, 0x20, 0x20);
225 void
226 vga_cursor_reset(void)
228 vga_cr_write(0x0A, 0x2E);
229 vga_cr_write(0x0B, 0x0E);
230 vga_cr_write(0x0E, 0x00);
231 vga_cr_write(0x0F, 0x00);
237 void
238 vga_cursor_set(unsigned int line, unsigned int character)
240 unsigned int offset = (80 * line + character) & 0xFFFF;
242 vga_cr_write(0x0A, 0x0E);
243 vga_cr_write(0x0B, 0x0E);
244 vga_cr_write(0x0E, offset >> 8);
245 vga_cr_write(0x0F, offset & 0xFF);
251 void
252 vga_frame_set(unsigned int line, unsigned int character)
254 unsigned int offset = (80 * line + character) & 0xFFFF;
256 vga_cr_write(0x0C, offset >> 8);
257 vga_cr_write(0x0D, offset & 0xFF);
261 * simply fills a line with the given string.
263 void
264 vga_line_write(unsigned int line, const char *string)
266 unsigned short *p = (unsigned short *) VGA_FB + (80 * line);
267 int i, len = strlen(string);
269 for (i = 0; i < 80; i++) {
270 if (i < len)
271 p[i] = 0x0F00 | string[i];
272 else
273 p[i] = 0x0F00;
278 * set up everything to get a basic 80x25 textmode.
280 void
281 vga_textmode_init(void)
283 vga_sr_write(0x00, 0x01); /* clear reset */
284 vga_sr_write(0x01, 0x00);
286 /* set up cr */
287 vga_cr_mask(0x03, 0x80, 0xE0);
288 vga_cr_mask(0x05, 0x00, 0x60);
290 vga_cr_write(0x08, 0x00);
292 vga_cr_write(0x14, 0x00); /* */
294 vga_cr_write(0x17, 0x23);
296 vga_palette_init();
298 vga_mode_set(640, 648, 680, 776, 792, 800,
299 400, 407, 412, 414, 442, 449, 320);
301 vga_cursor_reset();
302 vga_frame_set(0, 0);
304 vga_fb_init();
305 vga_fb_clear();
306 vga_font_8x16_load();
308 vga_sr_mask(0x00, 0x02, 0x02); /* take us out of reset */
309 vga_cr_mask(0x17, 0x80, 0x80); /* sync! */