1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /*
4 * All IO necessary to poke VGA registers.
5 */
6 #include <pc80/vga_io.h>
7
8 #include <arch/io.h>
9
10 #define VGA_CR_INDEX 0x3D4
11 #define VGA_CR_VALUE 0x3D5
12
13 #define VGA_SR_INDEX 0x3C4
14 #define VGA_SR_VALUE 0x3C5
15
16 #define VGA_GR_INDEX 0x3CE
17 #define VGA_GR_VALUE 0x3CF
18
19 #define VGA_AR_INDEX 0x3C0
20 #define VGA_AR_VALUE_READ 0x3C1
21 #define VGA_AR_VALUE_WRITE VGA_AR_INDEX
22
23 #define VGA_MISC_WRITE 0x3C2
24 #define VGA_MISC_READ 0x3CC
25
26 #define VGA_ENABLE 0x3C3
27 #define VGA_STAT1 0x3DA
28
29 #define VGA_DAC_MASK 0x3C6
30 #define VGA_DAC_READ_ADDRESS 0x3C7
31 #define VGA_DAC_WRITE_ADDRESS 0x3C8
32 #define VGA_DAC_DATA 0x3C9
33
34 /*
35 * VGA enable. Poke this to have the PCI IO enabled device accept VGA IO.
36 */
37 unsigned char
vga_enable_read(void)38 vga_enable_read(void)
39 {
40 return inb(VGA_ENABLE);
41 }
42
43 void
vga_enable_write(unsigned char value)44 vga_enable_write(unsigned char value)
45 {
46 outb(value, VGA_ENABLE);
47 }
48
49 void
vga_enable_mask(unsigned char value,unsigned char mask)50 vga_enable_mask(unsigned char value, unsigned char mask)
51 {
52 unsigned char tmp;
53
54 tmp = vga_enable_read();
55 tmp &= ~mask;
56 tmp |= (value & mask);
57 vga_enable_write(tmp);
58 }
59
60 /*
61 * Miscellaneous register.
62 */
63 unsigned char
vga_misc_read(void)64 vga_misc_read(void)
65 {
66 return inb(VGA_MISC_READ);
67 }
68
69 void
vga_misc_write(unsigned char value)70 vga_misc_write(unsigned char value)
71 {
72 outb(value, VGA_MISC_WRITE);
73 }
74
75 void
vga_misc_mask(unsigned char value,unsigned char mask)76 vga_misc_mask(unsigned char value, unsigned char mask)
77 {
78 unsigned char tmp;
79
80 tmp = vga_misc_read();
81 tmp &= ~mask;
82 tmp |= (value & mask);
83 vga_misc_write(tmp);
84 }
85
86 /*
87 * Sequencer registers.
88 */
89 unsigned char
vga_sr_read(unsigned char index)90 vga_sr_read(unsigned char index)
91 {
92 outb(index, VGA_SR_INDEX);
93 return inb(VGA_SR_VALUE);
94 }
95
96 void
vga_sr_write(unsigned char index,unsigned char value)97 vga_sr_write(unsigned char index, unsigned char value)
98 {
99 outb(index, VGA_SR_INDEX);
100 outb(value, VGA_SR_VALUE);
101 }
102
103 void
vga_sr_mask(unsigned char index,unsigned char value,unsigned char mask)104 vga_sr_mask(unsigned char index, unsigned char value, unsigned char mask)
105 {
106 unsigned char tmp;
107
108 tmp = vga_sr_read(index);
109 tmp &= ~mask;
110 tmp |= (value & mask);
111 vga_sr_write(index, tmp);
112 }
113
114 /*
115 * CRTC registers.
116 */
117 unsigned char
vga_cr_read(unsigned char index)118 vga_cr_read(unsigned char index)
119 {
120 outb(index, VGA_CR_INDEX);
121 return inb(VGA_CR_VALUE);
122 }
123
124 void
vga_cr_write(unsigned char index,unsigned char value)125 vga_cr_write(unsigned char index, unsigned char value)
126 {
127 outb(index, VGA_CR_INDEX);
128 outb(value, VGA_CR_VALUE);
129 }
130
131 void
vga_cr_mask(unsigned char index,unsigned char value,unsigned char mask)132 vga_cr_mask(unsigned char index, unsigned char value, unsigned char mask)
133 {
134 unsigned char tmp;
135
136 tmp = vga_cr_read(index);
137 tmp &= ~mask;
138 tmp |= (value & mask);
139 vga_cr_write(index, tmp);
140 }
141
142 /*
143 * Attribute registers.
144 */
145 unsigned char
vga_ar_read(unsigned char index)146 vga_ar_read(unsigned char index)
147 {
148 unsigned char ret;
149
150 (void)inb(VGA_STAT1);
151 outb(index, VGA_AR_INDEX);
152 ret = inb(VGA_AR_VALUE_READ);
153 (void)inb(VGA_STAT1);
154
155 return ret;
156 }
157
158 void
vga_ar_write(unsigned char index,unsigned char value)159 vga_ar_write(unsigned char index, unsigned char value)
160 {
161 (void)inb(VGA_STAT1);
162 outb(index, VGA_AR_INDEX);
163 outb(value, VGA_AR_VALUE_WRITE);
164 (void)inb(VGA_STAT1);
165 }
166
167 void
vga_ar_mask(unsigned char index,unsigned char value,unsigned char mask)168 vga_ar_mask(unsigned char index, unsigned char value, unsigned char mask)
169 {
170 unsigned char tmp;
171
172 tmp = vga_ar_read(index);
173 tmp &= ~mask;
174 tmp |= (value & mask);
175 vga_ar_write(index, tmp);
176 }
177
178 /*
179 * Graphics registers.
180 */
181 unsigned char
vga_gr_read(unsigned char index)182 vga_gr_read(unsigned char index)
183 {
184 outb(index, VGA_GR_INDEX);
185 return inb(VGA_GR_VALUE);
186 }
187
188 void
vga_gr_write(unsigned char index,unsigned char value)189 vga_gr_write(unsigned char index, unsigned char value)
190 {
191 outb(index, VGA_GR_INDEX);
192 outb(value, VGA_GR_VALUE);
193 }
194
195 void
vga_gr_mask(unsigned char index,unsigned char value,unsigned char mask)196 vga_gr_mask(unsigned char index, unsigned char value, unsigned char mask)
197 {
198 unsigned char tmp;
199
200 tmp = vga_gr_read(index);
201 tmp &= ~mask;
202 tmp |= (value & mask);
203 vga_gr_write(index, tmp);
204 }
205
206 /*
207 * DAC functions.
208 */
209 void
vga_palette_enable(void)210 vga_palette_enable(void)
211 {
212 (void)inb(VGA_STAT1);
213 outb(0x00, VGA_AR_INDEX);
214 (void)inb(VGA_STAT1);
215 }
216
217 void
vga_palette_disable(void)218 vga_palette_disable(void)
219 {
220 (void)inb(VGA_STAT1);
221 outb(0x20, VGA_AR_INDEX);
222 (void)inb(VGA_STAT1);
223 }
224
225 unsigned char
vga_dac_mask_read(void)226 vga_dac_mask_read(void)
227 {
228 return inb(VGA_DAC_MASK);
229 }
230
231 void
vga_dac_mask_write(unsigned char mask)232 vga_dac_mask_write(unsigned char mask)
233 {
234 outb(mask, VGA_DAC_MASK);
235 }
236
237 void
vga_dac_read_address(unsigned char address)238 vga_dac_read_address(unsigned char address)
239 {
240 outb(address, VGA_DAC_READ_ADDRESS);
241 }
242
243 void
vga_dac_write_address(unsigned char address)244 vga_dac_write_address(unsigned char address)
245 {
246 outb(address, VGA_DAC_WRITE_ADDRESS);
247 }
248
249 unsigned char
vga_dac_data_read(void)250 vga_dac_data_read(void)
251 {
252 return inb(VGA_DAC_DATA);
253 }
254
255 void
vga_dac_data_write(unsigned char data)256 vga_dac_data_write(unsigned char data)
257 {
258 outb(data, VGA_DAC_DATA);
259 }
260