xref: /aosp_15_r20/external/coreboot/src/drivers/pc80/vga/vga_io.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
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