vreset.c revision 1.11.20.1 1 1.11.20.1 rmind /* $NetBSD: vreset.c,v 1.11.20.1 2011/03/05 20:49:46 rmind Exp $ */
2 1.1 sakamoto
3 1.1 sakamoto /*
4 1.1 sakamoto * Copyright (C) 1995-1997 Gary Thomas (gdt (at) linuxppc.org)
5 1.1 sakamoto * All rights reserved.
6 1.1 sakamoto *
7 1.1 sakamoto * Initialize the VGA control registers to 80x25 text mode.
8 1.1 sakamoto *
9 1.1 sakamoto * Adapted from a program by:
10 1.1 sakamoto * Steve Sellgren
11 1.1 sakamoto * San Francisco Indigo Company
12 1.1 sakamoto * sfindigo!sellgren (at) uunet.uu.net
13 1.1 sakamoto * Adapted for Moto boxes by:
14 1.1 sakamoto * Pat Kane & Mark Scott, 1996
15 1.1 sakamoto * Fixed for IBM/PowerStack II Pat Kane 1997
16 1.1 sakamoto *
17 1.1 sakamoto * Redistribution and use in source and binary forms, with or without
18 1.1 sakamoto * modification, are permitted provided that the following conditions
19 1.1 sakamoto * are met:
20 1.1 sakamoto * 1. Redistributions of source code must retain the above copyright
21 1.1 sakamoto * notice, this list of conditions and the following disclaimer.
22 1.1 sakamoto * 2. Redistributions in binary form must reproduce the above copyright
23 1.1 sakamoto * notice, this list of conditions and the following disclaimer in the
24 1.1 sakamoto * documentation and/or other materials provided with the distribution.
25 1.1 sakamoto * 3. All advertising materials mentioning features or use of this software
26 1.1 sakamoto * must display the following acknowledgement:
27 1.1 sakamoto * This product includes software developed by Gary Thomas.
28 1.1 sakamoto * 4. The name of the author may not be used to endorse or promote products
29 1.1 sakamoto * derived from this software without specific prior written permission.
30 1.1 sakamoto *
31 1.1 sakamoto * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
32 1.1 sakamoto * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33 1.1 sakamoto * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
34 1.1 sakamoto * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
35 1.1 sakamoto * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36 1.1 sakamoto * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 1.1 sakamoto * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 1.1 sakamoto * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 1.1 sakamoto * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40 1.1 sakamoto * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 1.1 sakamoto */
42 1.1 sakamoto
43 1.1 sakamoto #ifdef CONS_VGA
44 1.6 junyoung #include <lib/libsa/stand.h>
45 1.4 sakamoto #include "boot.h"
46 1.4 sakamoto #include "iso_font.h"
47 1.4 sakamoto
48 1.1 sakamoto /*
49 1.5 junyoung * VGA Register
50 1.1 sakamoto */
51 1.1 sakamoto struct VgaRegs
52 1.1 sakamoto {
53 1.4 sakamoto u_short io_port;
54 1.4 sakamoto u_char io_index;
55 1.4 sakamoto u_char io_value;
56 1.1 sakamoto };
57 1.1 sakamoto
58 1.1 sakamoto /*
59 1.1 sakamoto * Default console text mode registers used to reset
60 1.1 sakamoto * graphics adapter.
61 1.1 sakamoto */
62 1.1 sakamoto #define NREGS 54
63 1.1 sakamoto #define ENDMK 0xFFFF /* End marker */
64 1.1 sakamoto
65 1.11 kiyohara #define S3Vendor 0x5333
66 1.11 kiyohara #define CirrusVendor 0x1013
67 1.1 sakamoto #define DiamondVendor 0x100E
68 1.1 sakamoto #define MatroxVendor 0x102B
69 1.1 sakamoto
70 1.1 sakamoto struct VgaRegs GenVgaTextRegs[NREGS+1] = {
71 1.5 junyoung /* port index value */
72 1.5 junyoung /* SR Regs */
73 1.5 junyoung { 0x3c4, 0x1, 0x0 },
74 1.5 junyoung { 0x3c4, 0x2, 0x3 },
75 1.5 junyoung { 0x3c4, 0x3, 0x0 },
76 1.5 junyoung { 0x3c4, 0x4, 0x2 },
77 1.5 junyoung /* CR Regs */
78 1.5 junyoung { 0x3d4, 0x0, 0x5f },
79 1.5 junyoung { 0x3d4, 0x1, 0x4f },
80 1.5 junyoung { 0x3d4, 0x2, 0x50 },
81 1.5 junyoung { 0x3d4, 0x3, 0x82 },
82 1.5 junyoung { 0x3d4, 0x4, 0x55 },
83 1.5 junyoung { 0x3d4, 0x5, 0x81 },
84 1.5 junyoung { 0x3d4, 0x6, 0xbf },
85 1.5 junyoung { 0x3d4, 0x7, 0x1f },
86 1.5 junyoung { 0x3d4, 0x8, 0x00 },
87 1.5 junyoung { 0x3d4, 0x9, 0x4f },
88 1.5 junyoung { 0x3d4, 0xa, 0x0d },
89 1.5 junyoung { 0x3d4, 0xb, 0x0e },
90 1.5 junyoung { 0x3d4, 0xc, 0x00 },
91 1.5 junyoung { 0x3d4, 0xd, 0x00 },
92 1.5 junyoung { 0x3d4, 0xe, 0x00 },
93 1.5 junyoung { 0x3d4, 0xf, 0x00 },
94 1.5 junyoung { 0x3d4, 0x10, 0x9c },
95 1.5 junyoung { 0x3d4, 0x11, 0x8e },
96 1.5 junyoung { 0x3d4, 0x12, 0x8f },
97 1.5 junyoung { 0x3d4, 0x13, 0x28 },
98 1.5 junyoung { 0x3d4, 0x14, 0x1f },
99 1.5 junyoung { 0x3d4, 0x15, 0x96 },
100 1.5 junyoung { 0x3d4, 0x16, 0xb9 },
101 1.5 junyoung { 0x3d4, 0x17, 0xa3 },
102 1.5 junyoung /* GR Regs */
103 1.5 junyoung { 0x3ce, 0x0, 0x0 },
104 1.5 junyoung { 0x3ce, 0x1, 0x0 },
105 1.5 junyoung { 0x3ce, 0x2, 0x0 },
106 1.5 junyoung { 0x3ce, 0x3, 0x0 },
107 1.5 junyoung { 0x3ce, 0x4, 0x0 },
108 1.5 junyoung { 0x3ce, 0x5, 0x10 },
109 1.5 junyoung { 0x3ce, 0x6, 0xe },
110 1.5 junyoung { 0x3ce, 0x7, 0x0 },
111 1.5 junyoung { 0x3ce, 0x8, 0xff },
112 1.5 junyoung { ENDMK },
113 1.1 sakamoto };
114 1.1 sakamoto
115 1.1 sakamoto struct VgaRegs S3TextRegs[NREGS+1] = {
116 1.5 junyoung /* port index value */
117 1.5 junyoung /* SR Regs */
118 1.5 junyoung { 0x3c4, 0x1, 0x0 },
119 1.5 junyoung { 0x3c4, 0x2, 0x3 },
120 1.5 junyoung { 0x3c4, 0x3, 0x0 },
121 1.5 junyoung { 0x3c4, 0x4, 0x2 },
122 1.5 junyoung /* CR Regs */
123 1.5 junyoung { 0x3d4, 0x0, 0x5f },
124 1.5 junyoung { 0x3d4, 0x1, 0x4f },
125 1.5 junyoung { 0x3d4, 0x2, 0x50 },
126 1.5 junyoung { 0x3d4, 0x3, 0x82 },
127 1.5 junyoung { 0x3d4, 0x4, 0x55 },
128 1.5 junyoung { 0x3d4, 0x5, 0x81 },
129 1.5 junyoung { 0x3d4, 0x6, 0xbf },
130 1.5 junyoung { 0x3d4, 0x7, 0x1f },
131 1.5 junyoung { 0x3d4, 0x8, 0x00 },
132 1.5 junyoung { 0x3d4, 0x9, 0x4f },
133 1.5 junyoung { 0x3d4, 0xa, 0x0d },
134 1.5 junyoung { 0x3d4, 0xb, 0x0e },
135 1.5 junyoung { 0x3d4, 0xc, 0x00 },
136 1.5 junyoung { 0x3d4, 0xd, 0x00 },
137 1.5 junyoung { 0x3d4, 0xe, 0x00 },
138 1.5 junyoung { 0x3d4, 0xf, 0x00 },
139 1.5 junyoung { 0x3d4, 0x10, 0x9c },
140 1.5 junyoung { 0x3d4, 0x11, 0x8e },
141 1.5 junyoung { 0x3d4, 0x12, 0x8f },
142 1.5 junyoung { 0x3d4, 0x13, 0x28 },
143 1.5 junyoung { 0x3d4, 0x14, 0x1f },
144 1.5 junyoung { 0x3d4, 0x15, 0x96 },
145 1.5 junyoung { 0x3d4, 0x16, 0xb9 },
146 1.5 junyoung { 0x3d4, 0x17, 0xa3 },
147 1.5 junyoung /* GR Regs */
148 1.5 junyoung { 0x3ce, 0x0, 0x0 },
149 1.5 junyoung { 0x3ce, 0x1, 0x0 },
150 1.5 junyoung { 0x3ce, 0x2, 0x0 },
151 1.5 junyoung { 0x3ce, 0x3, 0x0 },
152 1.5 junyoung { 0x3ce, 0x4, 0x0 },
153 1.5 junyoung { 0x3ce, 0x5, 0x10 },
154 1.5 junyoung { 0x3ce, 0x6, 0xe },
155 1.5 junyoung { 0x3ce, 0x7, 0x0 },
156 1.5 junyoung { 0x3ce, 0x8, 0xff },
157 1.4 sakamoto { ENDMK }
158 1.1 sakamoto };
159 1.1 sakamoto
160 1.5 junyoung struct RGBColors {
161 1.5 junyoung u_char r, g, b;
162 1.1 sakamoto };
163 1.1 sakamoto
164 1.1 sakamoto /*
165 1.1 sakamoto * Default console text mode color table.
166 1.1 sakamoto * These values were obtained by booting Linux with
167 1.5 junyoung * text mode firmware & then dumping the registers.
168 1.1 sakamoto */
169 1.5 junyoung struct RGBColors TextCLUT[256] = {
170 1.5 junyoung /* red green blue */
171 1.4 sakamoto { 0x0, 0x0, 0x0 },
172 1.4 sakamoto { 0x0, 0x0, 0x2a },
173 1.4 sakamoto { 0x0, 0x2a, 0x0 },
174 1.4 sakamoto { 0x0, 0x2a, 0x2a },
175 1.4 sakamoto { 0x2a, 0x0, 0x0 },
176 1.4 sakamoto { 0x2a, 0x0, 0x2a },
177 1.4 sakamoto { 0x2a, 0x2a, 0x0 },
178 1.4 sakamoto { 0x2a, 0x2a, 0x2a },
179 1.4 sakamoto { 0x0, 0x0, 0x15 },
180 1.4 sakamoto { 0x0, 0x0, 0x3f },
181 1.4 sakamoto { 0x0, 0x2a, 0x15 },
182 1.4 sakamoto { 0x0, 0x2a, 0x3f },
183 1.4 sakamoto { 0x2a, 0x0, 0x15 },
184 1.4 sakamoto { 0x2a, 0x0, 0x3f },
185 1.4 sakamoto { 0x2a, 0x2a, 0x15 },
186 1.4 sakamoto { 0x2a, 0x2a, 0x3f },
187 1.4 sakamoto { 0x0, 0x15, 0x0 },
188 1.4 sakamoto { 0x0, 0x15, 0x2a },
189 1.4 sakamoto { 0x0, 0x3f, 0x0 },
190 1.4 sakamoto { 0x0, 0x3f, 0x2a },
191 1.4 sakamoto { 0x2a, 0x15, 0x0 },
192 1.4 sakamoto { 0x2a, 0x15, 0x2a },
193 1.4 sakamoto { 0x2a, 0x3f, 0x0 },
194 1.4 sakamoto { 0x2a, 0x3f, 0x2a },
195 1.4 sakamoto { 0x0, 0x15, 0x15 },
196 1.4 sakamoto { 0x0, 0x15, 0x3f },
197 1.4 sakamoto { 0x0, 0x3f, 0x15 },
198 1.4 sakamoto { 0x0, 0x3f, 0x3f },
199 1.4 sakamoto { 0x2a, 0x15, 0x15 },
200 1.4 sakamoto { 0x2a, 0x15, 0x3f },
201 1.4 sakamoto { 0x2a, 0x3f, 0x15 },
202 1.4 sakamoto { 0x2a, 0x3f, 0x3f },
203 1.4 sakamoto { 0x15, 0x0, 0x0 },
204 1.4 sakamoto { 0x15, 0x0, 0x2a },
205 1.4 sakamoto { 0x15, 0x2a, 0x0 },
206 1.4 sakamoto { 0x15, 0x2a, 0x2a },
207 1.4 sakamoto { 0x3f, 0x0, 0x0 },
208 1.4 sakamoto { 0x3f, 0x0, 0x2a },
209 1.4 sakamoto { 0x3f, 0x2a, 0x0 },
210 1.4 sakamoto { 0x3f, 0x2a, 0x2a },
211 1.4 sakamoto { 0x15, 0x0, 0x15 },
212 1.4 sakamoto { 0x15, 0x0, 0x3f },
213 1.4 sakamoto { 0x15, 0x2a, 0x15 },
214 1.4 sakamoto { 0x15, 0x2a, 0x3f },
215 1.4 sakamoto { 0x3f, 0x0, 0x15 },
216 1.4 sakamoto { 0x3f, 0x0, 0x3f },
217 1.4 sakamoto { 0x3f, 0x2a, 0x15 },
218 1.4 sakamoto { 0x3f, 0x2a, 0x3f },
219 1.4 sakamoto { 0x15, 0x15, 0x0 },
220 1.4 sakamoto { 0x15, 0x15, 0x2a },
221 1.4 sakamoto { 0x15, 0x3f, 0x0 },
222 1.4 sakamoto { 0x15, 0x3f, 0x2a },
223 1.4 sakamoto { 0x3f, 0x15, 0x0 },
224 1.4 sakamoto { 0x3f, 0x15, 0x2a },
225 1.4 sakamoto { 0x3f, 0x3f, 0x0 },
226 1.4 sakamoto { 0x3f, 0x3f, 0x2a },
227 1.4 sakamoto { 0x15, 0x15, 0x15 },
228 1.4 sakamoto { 0x15, 0x15, 0x3f },
229 1.4 sakamoto { 0x15, 0x3f, 0x15 },
230 1.4 sakamoto { 0x15, 0x3f, 0x3f },
231 1.4 sakamoto { 0x3f, 0x15, 0x15 },
232 1.4 sakamoto { 0x3f, 0x15, 0x3f },
233 1.4 sakamoto { 0x3f, 0x3f, 0x15 },
234 1.4 sakamoto { 0x3f, 0x3f, 0x3f },
235 1.4 sakamoto { 0x39, 0xc, 0x5 },
236 1.4 sakamoto { 0x15, 0x2c, 0xf },
237 1.4 sakamoto { 0x26, 0x10, 0x3d },
238 1.4 sakamoto { 0x29, 0x29, 0x38 },
239 1.4 sakamoto { 0x4, 0x1a, 0xe },
240 1.4 sakamoto { 0x2, 0x1e, 0x3a },
241 1.4 sakamoto { 0x3c, 0x25, 0x33 },
242 1.4 sakamoto { 0x3c, 0xc, 0x2c },
243 1.4 sakamoto { 0x3f, 0x3, 0x2b },
244 1.4 sakamoto { 0x1c, 0x9, 0x13 },
245 1.4 sakamoto { 0x25, 0x2a, 0x35 },
246 1.4 sakamoto { 0x1e, 0xa, 0x38 },
247 1.4 sakamoto { 0x24, 0x8, 0x3 },
248 1.4 sakamoto { 0x3, 0xe, 0x36 },
249 1.4 sakamoto { 0xc, 0x6, 0x2a },
250 1.4 sakamoto { 0x26, 0x3, 0x32 },
251 1.4 sakamoto { 0x5, 0x2f, 0x33 },
252 1.4 sakamoto { 0x3c, 0x35, 0x2f },
253 1.4 sakamoto { 0x2d, 0x26, 0x3e },
254 1.4 sakamoto { 0xd, 0xa, 0x10 },
255 1.4 sakamoto { 0x25, 0x3c, 0x11 },
256 1.4 sakamoto { 0xd, 0x4, 0x2e },
257 1.4 sakamoto { 0x5, 0x19, 0x3e },
258 1.4 sakamoto { 0xc, 0x13, 0x34 },
259 1.4 sakamoto { 0x2b, 0x6, 0x24 },
260 1.4 sakamoto { 0x4, 0x3, 0xd },
261 1.4 sakamoto { 0x2f, 0x3c, 0xc },
262 1.4 sakamoto { 0x2a, 0x37, 0x1f },
263 1.4 sakamoto { 0xf, 0x12, 0x38 },
264 1.4 sakamoto { 0x38, 0xe, 0x2a },
265 1.4 sakamoto { 0x12, 0x2f, 0x19 },
266 1.4 sakamoto { 0x29, 0x2e, 0x31 },
267 1.4 sakamoto { 0x25, 0x13, 0x3e },
268 1.4 sakamoto { 0x33, 0x3e, 0x33 },
269 1.4 sakamoto { 0x1d, 0x2c, 0x25 },
270 1.4 sakamoto { 0x15, 0x15, 0x5 },
271 1.4 sakamoto { 0x32, 0x25, 0x39 },
272 1.4 sakamoto { 0x1a, 0x7, 0x1f },
273 1.4 sakamoto { 0x13, 0xe, 0x1d },
274 1.4 sakamoto { 0x36, 0x17, 0x34 },
275 1.4 sakamoto { 0xf, 0x15, 0x23 },
276 1.4 sakamoto { 0x2, 0x35, 0xd },
277 1.4 sakamoto { 0x15, 0x3f, 0xc },
278 1.4 sakamoto { 0x14, 0x2f, 0xf },
279 1.4 sakamoto { 0x19, 0x21, 0x3e },
280 1.4 sakamoto { 0x27, 0x11, 0x2f },
281 1.4 sakamoto { 0x38, 0x3f, 0x3c },
282 1.4 sakamoto { 0x36, 0x2d, 0x15 },
283 1.4 sakamoto { 0x16, 0x17, 0x2 },
284 1.4 sakamoto { 0x1, 0xa, 0x3d },
285 1.4 sakamoto { 0x1b, 0x11, 0x3f },
286 1.4 sakamoto { 0x21, 0x3c, 0xd },
287 1.4 sakamoto { 0x1a, 0x39, 0x3d },
288 1.4 sakamoto { 0x8, 0xe, 0xe },
289 1.4 sakamoto { 0x22, 0x21, 0x23 },
290 1.4 sakamoto { 0x1e, 0x30, 0x5 },
291 1.4 sakamoto { 0x1f, 0x22, 0x3d },
292 1.4 sakamoto { 0x1e, 0x2f, 0xa },
293 1.4 sakamoto { 0x0, 0x1c, 0xe },
294 1.4 sakamoto { 0x0, 0x1c, 0x15 },
295 1.4 sakamoto { 0x0, 0x1c, 0x1c },
296 1.4 sakamoto { 0x0, 0x15, 0x1c },
297 1.4 sakamoto { 0x0, 0xe, 0x1c },
298 1.4 sakamoto { 0x0, 0x7, 0x1c },
299 1.4 sakamoto { 0xe, 0xe, 0x1c },
300 1.4 sakamoto { 0x11, 0xe, 0x1c },
301 1.4 sakamoto { 0x15, 0xe, 0x1c },
302 1.4 sakamoto { 0x18, 0xe, 0x1c },
303 1.4 sakamoto { 0x1c, 0xe, 0x1c },
304 1.4 sakamoto { 0x1c, 0xe, 0x18 },
305 1.4 sakamoto { 0x1c, 0xe, 0x15 },
306 1.4 sakamoto { 0x1c, 0xe, 0x11 },
307 1.4 sakamoto { 0x1c, 0xe, 0xe },
308 1.4 sakamoto { 0x1c, 0x11, 0xe },
309 1.4 sakamoto { 0x1c, 0x15, 0xe },
310 1.4 sakamoto { 0x1c, 0x18, 0xe },
311 1.4 sakamoto { 0x1c, 0x1c, 0xe },
312 1.4 sakamoto { 0x18, 0x1c, 0xe },
313 1.4 sakamoto { 0x15, 0x1c, 0xe },
314 1.4 sakamoto { 0x11, 0x1c, 0xe },
315 1.4 sakamoto { 0xe, 0x1c, 0xe },
316 1.4 sakamoto { 0xe, 0x1c, 0x11 },
317 1.4 sakamoto { 0xe, 0x1c, 0x15 },
318 1.4 sakamoto { 0xe, 0x1c, 0x18 },
319 1.4 sakamoto { 0xe, 0x1c, 0x1c },
320 1.4 sakamoto { 0xe, 0x18, 0x1c },
321 1.4 sakamoto { 0xe, 0x15, 0x1c },
322 1.4 sakamoto { 0xe, 0x11, 0x1c },
323 1.4 sakamoto { 0x14, 0x14, 0x1c },
324 1.4 sakamoto { 0x16, 0x14, 0x1c },
325 1.4 sakamoto { 0x18, 0x14, 0x1c },
326 1.4 sakamoto { 0x1a, 0x14, 0x1c },
327 1.4 sakamoto { 0x1c, 0x14, 0x1c },
328 1.4 sakamoto { 0x1c, 0x14, 0x1a },
329 1.4 sakamoto { 0x1c, 0x14, 0x18 },
330 1.4 sakamoto { 0x1c, 0x14, 0x16 },
331 1.4 sakamoto { 0x1c, 0x14, 0x14 },
332 1.4 sakamoto { 0x1c, 0x16, 0x14 },
333 1.4 sakamoto { 0x1c, 0x18, 0x14 },
334 1.4 sakamoto { 0x1c, 0x1a, 0x14 },
335 1.4 sakamoto { 0x1c, 0x1c, 0x14 },
336 1.4 sakamoto { 0x1a, 0x1c, 0x14 },
337 1.4 sakamoto { 0x18, 0x1c, 0x14 },
338 1.4 sakamoto { 0x16, 0x1c, 0x14 },
339 1.4 sakamoto { 0x14, 0x1c, 0x14 },
340 1.4 sakamoto { 0x14, 0x1c, 0x16 },
341 1.4 sakamoto { 0x14, 0x1c, 0x18 },
342 1.4 sakamoto { 0x14, 0x1c, 0x1a },
343 1.4 sakamoto { 0x14, 0x1c, 0x1c },
344 1.4 sakamoto { 0x14, 0x1a, 0x1c },
345 1.4 sakamoto { 0x14, 0x18, 0x1c },
346 1.4 sakamoto { 0x14, 0x16, 0x1c },
347 1.4 sakamoto { 0x0, 0x0, 0x10 },
348 1.4 sakamoto { 0x4, 0x0, 0x10 },
349 1.4 sakamoto { 0x8, 0x0, 0x10 },
350 1.4 sakamoto { 0xc, 0x0, 0x10 },
351 1.4 sakamoto { 0x10, 0x0, 0x10 },
352 1.4 sakamoto { 0x10, 0x0, 0xc },
353 1.4 sakamoto { 0x10, 0x0, 0x8 },
354 1.4 sakamoto { 0x10, 0x0, 0x4 },
355 1.4 sakamoto { 0x10, 0x0, 0x0 },
356 1.4 sakamoto { 0x10, 0x4, 0x0 },
357 1.4 sakamoto { 0x10, 0x8, 0x0 },
358 1.4 sakamoto { 0x10, 0xc, 0x0 },
359 1.4 sakamoto { 0x10, 0x10, 0x0 },
360 1.4 sakamoto { 0xc, 0x10, 0x0 },
361 1.4 sakamoto { 0x8, 0x10, 0x0 },
362 1.4 sakamoto { 0x4, 0x10, 0x0 },
363 1.4 sakamoto { 0x0, 0x10, 0x0 },
364 1.4 sakamoto { 0x0, 0x10, 0x4 },
365 1.4 sakamoto { 0x0, 0x10, 0x8 },
366 1.4 sakamoto { 0x0, 0x10, 0xc },
367 1.4 sakamoto { 0x0, 0x10, 0x10 },
368 1.4 sakamoto { 0x0, 0xc, 0x10 },
369 1.4 sakamoto { 0x0, 0x8, 0x10 },
370 1.4 sakamoto { 0x0, 0x4, 0x10 },
371 1.4 sakamoto { 0x8, 0x8, 0x10 },
372 1.4 sakamoto { 0xa, 0x8, 0x10 },
373 1.4 sakamoto { 0xc, 0x8, 0x10 },
374 1.4 sakamoto { 0xe, 0x8, 0x10 },
375 1.4 sakamoto { 0x10, 0x8, 0x10 },
376 1.4 sakamoto { 0x10, 0x8, 0xe },
377 1.4 sakamoto { 0x10, 0x8, 0xc },
378 1.4 sakamoto { 0x10, 0x8, 0xa },
379 1.4 sakamoto { 0x10, 0x8, 0x8 },
380 1.4 sakamoto { 0x10, 0xa, 0x8 },
381 1.4 sakamoto { 0x10, 0xc, 0x8 },
382 1.4 sakamoto { 0x10, 0xe, 0x8 },
383 1.4 sakamoto { 0x10, 0x10, 0x8 },
384 1.4 sakamoto { 0xe, 0x10, 0x8 },
385 1.4 sakamoto { 0xc, 0x10, 0x8 },
386 1.4 sakamoto { 0xa, 0x10, 0x8 },
387 1.4 sakamoto { 0x8, 0x10, 0x8 },
388 1.4 sakamoto { 0x8, 0x10, 0xa },
389 1.4 sakamoto { 0x8, 0x10, 0xc },
390 1.4 sakamoto { 0x8, 0x10, 0xe },
391 1.4 sakamoto { 0x8, 0x10, 0x10 },
392 1.4 sakamoto { 0x8, 0xe, 0x10 },
393 1.4 sakamoto { 0x8, 0xc, 0x10 },
394 1.4 sakamoto { 0x8, 0xa, 0x10 },
395 1.4 sakamoto { 0xb, 0xb, 0x10 },
396 1.4 sakamoto { 0xc, 0xb, 0x10 },
397 1.4 sakamoto { 0xd, 0xb, 0x10 },
398 1.4 sakamoto { 0xf, 0xb, 0x10 },
399 1.4 sakamoto { 0x10, 0xb, 0x10 },
400 1.4 sakamoto { 0x10, 0xb, 0xf },
401 1.4 sakamoto { 0x10, 0xb, 0xd },
402 1.4 sakamoto { 0x10, 0xb, 0xc },
403 1.4 sakamoto { 0x10, 0xb, 0xb },
404 1.4 sakamoto { 0x10, 0xc, 0xb },
405 1.4 sakamoto { 0x10, 0xd, 0xb },
406 1.4 sakamoto { 0x10, 0xf, 0xb },
407 1.4 sakamoto { 0x10, 0x10, 0xb },
408 1.4 sakamoto { 0xf, 0x10, 0xb },
409 1.4 sakamoto { 0xd, 0x10, 0xb },
410 1.4 sakamoto { 0xc, 0x10, 0xb },
411 1.4 sakamoto { 0xb, 0x10, 0xb },
412 1.4 sakamoto { 0xb, 0x10, 0xc },
413 1.4 sakamoto { 0xb, 0x10, 0xd },
414 1.4 sakamoto { 0xb, 0x10, 0xf },
415 1.4 sakamoto { 0xb, 0x10, 0x10 },
416 1.4 sakamoto { 0xb, 0xf, 0x10 },
417 1.4 sakamoto { 0xb, 0xd, 0x10 },
418 1.4 sakamoto { 0xb, 0xc, 0x10 },
419 1.4 sakamoto { 0x0, 0x0, 0x0 },
420 1.4 sakamoto { 0x0, 0x0, 0x0 },
421 1.4 sakamoto { 0x0, 0x0, 0x0 },
422 1.4 sakamoto { 0x0, 0x0, 0x0 },
423 1.4 sakamoto { 0x0, 0x0, 0x0 },
424 1.4 sakamoto { 0x0, 0x0, 0x0 },
425 1.4 sakamoto { 0x0, 0x0, 0x0 },
426 1.1 sakamoto };
427 1.1 sakamoto
428 1.4 sakamoto u_char AC[21] = {
429 1.5 junyoung 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
430 1.5 junyoung 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
431 1.4 sakamoto 0x0C, 0x00, 0x0F, 0x08, 0x00
432 1.4 sakamoto };
433 1.1 sakamoto
434 1.11.20.1 rmind
435 1.11.20.1 rmind static int delayLoop(int);
436 1.11.20.1 rmind static void writeAttr(u_char, u_char, u_char);
437 1.11.20.1 rmind static void setTextRegs(struct VgaRegs *);
438 1.11.20.1 rmind static void setTextCLUT(void);
439 1.11.20.1 rmind static void loadFont(u_char *);
440 1.11.20.1 rmind static void unlockS3(void);
441 1.11.20.1 rmind static void enablePCIvideo(int);
442 1.1 sakamoto
443 1.4 sakamoto void
444 1.5 junyoung vga_reset(u_char *ISA_mem)
445 1.1 sakamoto {
446 1.1 sakamoto int slot;
447 1.1 sakamoto struct VgaRegs *VgaTextRegs;
448 1.1 sakamoto
449 1.1 sakamoto /* See if VGA already in TEXT mode - exit if so! */
450 1.1 sakamoto outb(0x3CE, 0x06);
451 1.5 junyoung if ((inb(0x3CF) & 0x01) == 0)
452 1.5 junyoung return;
453 1.1 sakamoto
454 1.1 sakamoto /* If no VGA responding in text mode, then we have some work to do... */
455 1.11.20.1 rmind slot = findPCIVga(); /* find video card in use */
456 1.11.20.1 rmind enablePCIvideo(slot); /* enable I/O to card */
457 1.1 sakamoto
458 1.1 sakamoto /*
459 1.1 sakamoto * Note: the PCI scanning code does not yet work correctly
460 1.1 sakamoto * for non-Moto boxes, so the switch below only
461 1.1 sakamoto * defaults to using an S3 card if it does not
462 1.1 sakamoto * find a Cirrus card.
463 1.1 sakamoto *
464 1.1 sakamoto * The only reason we need to scan the bus looking for
465 1.1 sakamoto * a graphics card is so we could do the "enablePCIvideo(slot)"
466 1.1 sakamoto * call above; it is needed because Moto's OpenFirmware
467 1.1 sakamoto * disables I/O to the graphics adapter before it gives
468 1.1 sakamoto * us control. PEK'97
469 1.1 sakamoto */
470 1.1 sakamoto
471 1.1 sakamoto switch (PCIVendor(slot)) {
472 1.1 sakamoto default: /* Assume S3 */
473 1.5 junyoung #if 0
474 1.5 junyoung case S3Vendor:
475 1.5 junyoung #endif
476 1.5 junyoung unlockS3();
477 1.1 sakamoto VgaTextRegs = S3TextRegs;
478 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
479 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
480 1.1 sakamoto setTextCLUT(); /* load color lookup table */
481 1.1 sakamoto loadFont(ISA_mem); /* load font */
482 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
483 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
484 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
485 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
486 1.1 sakamoto break;
487 1.1 sakamoto
488 1.5 junyoung case CirrusVendor:
489 1.1 sakamoto VgaTextRegs = GenVgaTextRegs;
490 1.1 sakamoto outw(0x3C4, 0x0612); /* unlock ext regs */
491 1.1 sakamoto outw(0x3C4, 0x0700); /* reset ext sequence mode */
492 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
493 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
494 1.1 sakamoto setTextCLUT(); /* load color lookup table */
495 1.1 sakamoto loadFont(ISA_mem); /* load font */
496 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
497 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
498 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
499 1.1 sakamoto break;
500 1.1 sakamoto
501 1.5 junyoung case DiamondVendor:
502 1.5 junyoung case MatroxVendor:
503 1.1 sakamoto /*
504 1.1 sakamoto * The following code is almost enuf to get the Matrox
505 1.1 sakamoto * working (on a Moto box) but the video is not stable.
506 1.1 sakamoto * We probably need to tweak the TVP3026 Video PLL regs. PEK'97
507 1.1 sakamoto */
508 1.5 junyoung VgaTextRegs = GenVgaTextRegs;
509 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
510 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
511 1.1 sakamoto setTextCLUT(); /* load color lookup table */
512 1.1 sakamoto loadFont(ISA_mem); /* load font */
513 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
514 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
515 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
516 1.5 junyoung delayLoop(1);
517 1.5 junyoung break;
518 1.1 sakamoto };
519 1.1 sakamoto
520 1.1 sakamoto #ifdef DEBUG
521 1.11.20.1 rmind printPCIslots();
522 1.5 junyoung delayLoop(5);
523 1.1 sakamoto #endif
524 1.1 sakamoto delayLoop(2); /* give time for the video monitor to come up */
525 1.1 sakamoto }
526 1.1 sakamoto
527 1.11.20.1 rmind static int
528 1.11.20.1 rmind delayLoop(int k)
529 1.11.20.1 rmind {
530 1.11.20.1 rmind volatile int a, b;
531 1.11.20.1 rmind volatile int i, j;
532 1.11.20.1 rmind a = 0;
533 1.11.20.1 rmind do {
534 1.11.20.1 rmind for (i = 0; i < 500; i++) {
535 1.11.20.1 rmind b = i;
536 1.11.20.1 rmind for (j = 0; j < 200; j++) {
537 1.11.20.1 rmind a = b+j;
538 1.11.20.1 rmind }
539 1.11.20.1 rmind }
540 1.11.20.1 rmind } while (k--);
541 1.11.20.1 rmind return a;
542 1.11.20.1 rmind }
543 1.11.20.1 rmind
544 1.1 sakamoto /*
545 1.5 junyoung * Write to VGA Attribute registers.
546 1.1 sakamoto */
547 1.11.20.1 rmind static void
548 1.5 junyoung writeAttr(u_char index, u_char data, u_char videoOn)
549 1.1 sakamoto {
550 1.4 sakamoto u_char v;
551 1.1 sakamoto v = inb(0x3da); /* reset attr. address toggle */
552 1.1 sakamoto if (videoOn)
553 1.1 sakamoto outb(0x3c0, (index & 0x1F) | 0x20);
554 1.1 sakamoto else
555 1.1 sakamoto outb(0x3c0, (index & 0x1F));
556 1.1 sakamoto outb(0x3c0, data);
557 1.1 sakamoto }
558 1.1 sakamoto
559 1.11.20.1 rmind static void
560 1.5 junyoung setTextRegs(struct VgaRegs *svp)
561 1.1 sakamoto {
562 1.1 sakamoto int i;
563 1.1 sakamoto
564 1.1 sakamoto /*
565 1.1 sakamoto * saved settings
566 1.5 junyoung */
567 1.4 sakamoto while (svp->io_port != ENDMK) {
568 1.1 sakamoto outb(svp->io_port, svp->io_index);
569 1.1 sakamoto outb(svp->io_port+1, svp->io_value);
570 1.5 junyoung svp++;
571 1.1 sakamoto }
572 1.1 sakamoto
573 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
574 1.1 sakamoto outb(0x3c6, 0xff); /* MASK */
575 1.1 sakamoto
576 1.4 sakamoto for (i = 0; i < 0x10; i++)
577 1.5 junyoung writeAttr(i, AC[i], 0); /* pallete */
578 1.5 junyoung writeAttr(0x10, 0x0c, 0); /* text mode */
579 1.5 junyoung writeAttr(0x11, 0x00, 0); /* overscan color (border) */
580 1.5 junyoung writeAttr(0x12, 0x0f, 0); /* plane enable */
581 1.5 junyoung writeAttr(0x13, 0x08, 0); /* pixel panning */
582 1.5 junyoung writeAttr(0x14, 0x00, 1); /* color select; video on */
583 1.1 sakamoto }
584 1.1 sakamoto
585 1.11.20.1 rmind static void
586 1.5 junyoung setTextCLUT(void)
587 1.1 sakamoto {
588 1.1 sakamoto int i;
589 1.1 sakamoto
590 1.5 junyoung outb(0x3C6, 0xFF);
591 1.1 sakamoto i = inb(0x3C7);
592 1.5 junyoung outb(0x3C8, 0);
593 1.1 sakamoto i = inb(0x3C7);
594 1.1 sakamoto
595 1.4 sakamoto for (i = 0; i < 256; i++) {
596 1.1 sakamoto outb(0x3C9, TextCLUT[i].r);
597 1.1 sakamoto outb(0x3C9, TextCLUT[i].g);
598 1.1 sakamoto outb(0x3C9, TextCLUT[i].b);
599 1.1 sakamoto }
600 1.1 sakamoto }
601 1.1 sakamoto
602 1.11.20.1 rmind static void
603 1.5 junyoung loadFont(u_char *ISA_mem)
604 1.1 sakamoto {
605 1.1 sakamoto int i, j;
606 1.4 sakamoto u_char *font_page = (u_char *)&ISA_mem[0xA0000];
607 1.5 junyoung
608 1.1 sakamoto outb(0x3C2, 0x67);
609 1.5 junyoung /*
610 1.5 junyoung * Load font
611 1.1 sakamoto */
612 1.5 junyoung i = inb(0x3DA); /* Reset Attr toggle */
613 1.1 sakamoto
614 1.11.20.1 rmind outb(0x3C0, 0x30);
615 1.5 junyoung outb(0x3C0, 0x01); /* graphics mode */
616 1.1 sakamoto
617 1.5 junyoung outw(0x3C4, 0x0001); /* reset sequencer */
618 1.5 junyoung outw(0x3C4, 0x0204); /* write to plane 2 */
619 1.5 junyoung outw(0x3C4, 0x0406); /* enable plane graphics */
620 1.5 junyoung outw(0x3C4, 0x0003); /* reset sequencer */
621 1.5 junyoung outw(0x3CE, 0x0402); /* read plane 2 */
622 1.5 junyoung outw(0x3CE, 0x0500); /* write mode 0, read mode 0 */
623 1.5 junyoung outw(0x3CE, 0x0605); /* set graphics mode */
624 1.1 sakamoto
625 1.1 sakamoto for (i = 0; i < sizeof(font); i += 16) {
626 1.1 sakamoto for (j = 0; j < 16; j++) {
627 1.8 perry __asm volatile("eieio");
628 1.1 sakamoto font_page[(2*i)+j] = font[i+j];
629 1.1 sakamoto }
630 1.1 sakamoto }
631 1.1 sakamoto }
632 1.1 sakamoto
633 1.11.20.1 rmind static void
634 1.5 junyoung unlockS3(void)
635 1.1 sakamoto {
636 1.1 sakamoto /* From the S3 manual */
637 1.1 sakamoto outb(0x46E8, 0x10); /* Put into setup mode */
638 1.1 sakamoto outb(0x3C3, 0x10);
639 1.1 sakamoto outb(0x102, 0x01); /* Enable registers */
640 1.1 sakamoto outb(0x46E8, 0x08); /* Enable video */
641 1.1 sakamoto outb(0x3C3, 0x08);
642 1.1 sakamoto outb(0x4AE8, 0x00);
643 1.1 sakamoto
644 1.1 sakamoto outb(0x42E8, 0x80); /* Reset graphics engine? */
645 1.1 sakamoto
646 1.1 sakamoto outb(0x3D4, 0x38); /* Unlock all registers */
647 1.1 sakamoto outb(0x3D5, 0x48);
648 1.1 sakamoto outb(0x3D4, 0x39);
649 1.1 sakamoto outb(0x3D5, 0xA5);
650 1.1 sakamoto outb(0x3D4, 0x40);
651 1.1 sakamoto outb(0x3D5, inb(0x3D5)|0x01);
652 1.1 sakamoto outb(0x3D4, 0x33);
653 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x52);
654 1.1 sakamoto outb(0x3D4, 0x35);
655 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x30);
656 1.1 sakamoto outb(0x3D4, 0x3A);
657 1.1 sakamoto outb(0x3D5, 0x00);
658 1.1 sakamoto outb(0x3D4, 0x53);
659 1.1 sakamoto outb(0x3D5, 0x00);
660 1.1 sakamoto outb(0x3D4, 0x31);
661 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x4B);
662 1.1 sakamoto outb(0x3D4, 0x58);
663 1.1 sakamoto
664 1.1 sakamoto outb(0x3D5, 0);
665 1.1 sakamoto
666 1.1 sakamoto outb(0x3D4, 0x54);
667 1.1 sakamoto outb(0x3D5, 0x38);
668 1.1 sakamoto outb(0x3D4, 0x60);
669 1.1 sakamoto outb(0x3D5, 0x07);
670 1.1 sakamoto outb(0x3D4, 0x61);
671 1.1 sakamoto outb(0x3D5, 0x80);
672 1.1 sakamoto outb(0x3D4, 0x62);
673 1.1 sakamoto outb(0x3D5, 0xA1);
674 1.1 sakamoto outb(0x3D4, 0x69); /* High order bits for cursor address */
675 1.1 sakamoto outb(0x3D5, 0);
676 1.5 junyoung
677 1.1 sakamoto outb(0x3D4, 0x32);
678 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x10);
679 1.1 sakamoto }
680 1.1 sakamoto
681 1.1 sakamoto /*
682 1.1 sakamoto * The following code modifies the PCI Command register
683 1.5 junyoung * to enable memory and I/O accesses.
684 1.5 junyoung */
685 1.11.20.1 rmind static void
686 1.5 junyoung enablePCIvideo(int slot)
687 1.1 sakamoto {
688 1.1 sakamoto
689 1.11.20.1 rmind enablePCI(slot, 1, 1, 0); /* Enable IO and Memory */
690 1.1 sakamoto
691 1.1 sakamoto outb(0x3d4, 0x11);
692 1.11 kiyohara outb(0x3d5, 0x0e); /* unlock CR0-CR7 */
693 1.1 sakamoto }
694 1.1 sakamoto #endif /* CONS_VGA */
695