1 /* This file is part of the coreboot project. */
2 /* SPDX-License-Identifier: GPL-2.0-or-later */
5 #include <pc80/vga_io.h>
11 * pci io enable should've happened before
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);
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);
55 memset((void *)VGA_FB
, 0x00, 0x8000);
62 vga_palette_init(void)
66 /* set up attribute registers */
67 for (i
= 0; i
< 0x10; 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
);
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
,
101 vga_cr_write(0x00, htotal
);
106 vga_cr_write(0x01, hdisplay
);
108 /* hblankstart: 2048 */
111 vga_cr_write(0x02, hblankstart
);
113 /* hblankend: hblankstart + 512 */
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);
127 vga_cr_write(0x06, vtotal
);
128 vga_cr_mask(0x07, vtotal
>> 8, 0x01);
129 vga_cr_mask(0x07, vtotal
>> 4, 0x20);
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 */
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 */
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);
156 vga_cr_write(0x13, stride
/ 8);
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 */
169 vga_font_8x16_load(void)
173 unsigned char sr2
, sr4
, gr5
, gr6
;
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);
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
++) {
194 *p
= vga_font_8x16
[i
][j
];
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);
214 vga_cursor_enable(int enable
)
217 vga_cr_mask(0x0A, 0x00, 0x20);
219 vga_cr_mask(0x0A, 0x20, 0x20);
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);
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);
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.
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
++) {
271 p
[i
] = 0x0F00 | string
[i
];
278 * set up everything to get a basic 80x25 textmode.
281 vga_textmode_init(void)
283 vga_sr_write(0x00, 0x01); /* clear reset */
284 vga_sr_write(0x01, 0x00);
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);
298 vga_mode_set(640, 648, 680, 776, 792, 800,
299 400, 407, 412, 414, 442, 449, 320);
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! */