vreset.c revision 1.2 1 1.2 sakamoto /* $Id: vreset.c,v 1.2 1998/10/26 00:45:48 sakamoto 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.1 sakamoto #ifndef lint
45 1.1 sakamoto static char rcsid[] = "vreset.c 2.0 1997 kane PEK'97 Exp $";
46 1.1 sakamoto #endif
47 1.1 sakamoto
48 1.1 sakamoto #include "iso_font.h"
49 1.1 sakamoto /*
50 1.1 sakamoto * VGA Register
51 1.1 sakamoto */
52 1.1 sakamoto struct VgaRegs
53 1.1 sakamoto {
54 1.1 sakamoto unsigned short io_port;
55 1.1 sakamoto unsigned char io_index;
56 1.1 sakamoto unsigned char io_value;
57 1.1 sakamoto };
58 1.1 sakamoto
59 1.1 sakamoto /*
60 1.1 sakamoto * Default console text mode registers used to reset
61 1.1 sakamoto * graphics adapter.
62 1.1 sakamoto */
63 1.1 sakamoto #define NREGS 54
64 1.1 sakamoto #define ENDMK 0xFFFF /* End marker */
65 1.1 sakamoto
66 1.1 sakamoto #define S3Vendor 0x5333
67 1.1 sakamoto #define CirrusVendor 0x1013
68 1.1 sakamoto #define DiamondVendor 0x100E
69 1.1 sakamoto #define MatroxVendor 0x102B
70 1.1 sakamoto
71 1.1 sakamoto struct VgaRegs GenVgaTextRegs[NREGS+1] = {
72 1.1 sakamoto /* port index value */
73 1.1 sakamoto /* SR Regs */
74 1.1 sakamoto 0x3c4, 0x1, 0x0,
75 1.1 sakamoto 0x3c4, 0x2, 0x3,
76 1.1 sakamoto 0x3c4, 0x3, 0x0,
77 1.1 sakamoto 0x3c4, 0x4, 0x2,
78 1.1 sakamoto /* CR Regs */
79 1.1 sakamoto 0x3d4, 0x0, 0x5f,
80 1.1 sakamoto 0x3d4, 0x1, 0x4f,
81 1.1 sakamoto 0x3d4, 0x2, 0x50,
82 1.1 sakamoto 0x3d4, 0x3, 0x82,
83 1.1 sakamoto 0x3d4, 0x4, 0x55,
84 1.1 sakamoto 0x3d4, 0x5, 0x81,
85 1.1 sakamoto 0x3d4, 0x6, 0xbf,
86 1.1 sakamoto 0x3d4, 0x7, 0x1f,
87 1.1 sakamoto 0x3d4, 0x8, 0x00,
88 1.1 sakamoto 0x3d4, 0x9, 0x4f,
89 1.1 sakamoto 0x3d4, 0xa, 0x0d,
90 1.1 sakamoto 0x3d4, 0xb, 0x0e,
91 1.1 sakamoto 0x3d4, 0xc, 0x00,
92 1.1 sakamoto 0x3d4, 0xd, 0x00,
93 1.1 sakamoto 0x3d4, 0xe, 0x00,
94 1.1 sakamoto 0x3d4, 0xf, 0x00,
95 1.1 sakamoto 0x3d4, 0x10, 0x9c,
96 1.1 sakamoto 0x3d4, 0x11, 0x8e,
97 1.1 sakamoto 0x3d4, 0x12, 0x8f,
98 1.1 sakamoto 0x3d4, 0x13, 0x28,
99 1.1 sakamoto 0x3d4, 0x14, 0x1f,
100 1.1 sakamoto 0x3d4, 0x15, 0x96,
101 1.1 sakamoto 0x3d4, 0x16, 0xb9,
102 1.1 sakamoto 0x3d4, 0x17, 0xa3,
103 1.1 sakamoto /* GR Regs */
104 1.1 sakamoto 0x3ce, 0x0, 0x0,
105 1.1 sakamoto 0x3ce, 0x1, 0x0,
106 1.1 sakamoto 0x3ce, 0x2, 0x0,
107 1.1 sakamoto 0x3ce, 0x3, 0x0,
108 1.1 sakamoto 0x3ce, 0x4, 0x0,
109 1.1 sakamoto 0x3ce, 0x5, 0x10,
110 1.1 sakamoto 0x3ce, 0x6, 0xe,
111 1.1 sakamoto 0x3ce, 0x7, 0x0,
112 1.1 sakamoto 0x3ce, 0x8, 0xff,
113 1.1 sakamoto ENDMK
114 1.1 sakamoto };
115 1.1 sakamoto
116 1.1 sakamoto struct VgaRegs S3TextRegs[NREGS+1] = {
117 1.1 sakamoto /* port index value */
118 1.1 sakamoto /* SR Regs */
119 1.1 sakamoto 0x3c4, 0x1, 0x0,
120 1.1 sakamoto 0x3c4, 0x2, 0x3,
121 1.1 sakamoto 0x3c4, 0x3, 0x0,
122 1.1 sakamoto 0x3c4, 0x4, 0x2,
123 1.1 sakamoto /* CR Regs */
124 1.1 sakamoto 0x3d4, 0x0, 0x5f,
125 1.1 sakamoto 0x3d4, 0x1, 0x4f,
126 1.1 sakamoto 0x3d4, 0x2, 0x50,
127 1.1 sakamoto 0x3d4, 0x3, 0x82,
128 1.1 sakamoto 0x3d4, 0x4, 0x55,
129 1.1 sakamoto 0x3d4, 0x5, 0x81,
130 1.1 sakamoto 0x3d4, 0x6, 0xbf,
131 1.1 sakamoto 0x3d4, 0x7, 0x1f,
132 1.1 sakamoto 0x3d4, 0x8, 0x00,
133 1.1 sakamoto 0x3d4, 0x9, 0x4f,
134 1.1 sakamoto 0x3d4, 0xa, 0x0d,
135 1.1 sakamoto 0x3d4, 0xb, 0x0e,
136 1.1 sakamoto 0x3d4, 0xc, 0x00,
137 1.1 sakamoto 0x3d4, 0xd, 0x00,
138 1.1 sakamoto 0x3d4, 0xe, 0x00,
139 1.1 sakamoto 0x3d4, 0xf, 0x00,
140 1.1 sakamoto 0x3d4, 0x10, 0x9c,
141 1.1 sakamoto 0x3d4, 0x11, 0x8e,
142 1.1 sakamoto 0x3d4, 0x12, 0x8f,
143 1.1 sakamoto 0x3d4, 0x13, 0x28,
144 1.1 sakamoto 0x3d4, 0x14, 0x1f,
145 1.1 sakamoto 0x3d4, 0x15, 0x96,
146 1.1 sakamoto 0x3d4, 0x16, 0xb9,
147 1.1 sakamoto 0x3d4, 0x17, 0xa3,
148 1.1 sakamoto /* GR Regs */
149 1.1 sakamoto 0x3ce, 0x0, 0x0,
150 1.1 sakamoto 0x3ce, 0x1, 0x0,
151 1.1 sakamoto 0x3ce, 0x2, 0x0,
152 1.1 sakamoto 0x3ce, 0x3, 0x0,
153 1.1 sakamoto 0x3ce, 0x4, 0x0,
154 1.1 sakamoto 0x3ce, 0x5, 0x10,
155 1.1 sakamoto 0x3ce, 0x6, 0xe,
156 1.1 sakamoto 0x3ce, 0x7, 0x0,
157 1.1 sakamoto 0x3ce, 0x8, 0xff,
158 1.1 sakamoto ENDMK
159 1.1 sakamoto };
160 1.1 sakamoto
161 1.1 sakamoto struct RGBColors
162 1.1 sakamoto {
163 1.1 sakamoto unsigned char r, g, b;
164 1.1 sakamoto };
165 1.1 sakamoto
166 1.1 sakamoto /*
167 1.1 sakamoto * Default console text mode color table.
168 1.1 sakamoto * These values were obtained by booting Linux with
169 1.1 sakamoto * text mode firmware & then dumping the registers.
170 1.1 sakamoto */
171 1.1 sakamoto struct RGBColors TextCLUT[256] =
172 1.1 sakamoto {
173 1.1 sakamoto /* red green blue */
174 1.1 sakamoto 0x0, 0x0, 0x0,
175 1.1 sakamoto 0x0, 0x0, 0x2a,
176 1.1 sakamoto 0x0, 0x2a, 0x0,
177 1.1 sakamoto 0x0, 0x2a, 0x2a,
178 1.1 sakamoto 0x2a, 0x0, 0x0,
179 1.1 sakamoto 0x2a, 0x0, 0x2a,
180 1.1 sakamoto 0x2a, 0x2a, 0x0,
181 1.1 sakamoto 0x2a, 0x2a, 0x2a,
182 1.1 sakamoto 0x0, 0x0, 0x15,
183 1.1 sakamoto 0x0, 0x0, 0x3f,
184 1.1 sakamoto 0x0, 0x2a, 0x15,
185 1.1 sakamoto 0x0, 0x2a, 0x3f,
186 1.1 sakamoto 0x2a, 0x0, 0x15,
187 1.1 sakamoto 0x2a, 0x0, 0x3f,
188 1.1 sakamoto 0x2a, 0x2a, 0x15,
189 1.1 sakamoto 0x2a, 0x2a, 0x3f,
190 1.1 sakamoto 0x0, 0x15, 0x0,
191 1.1 sakamoto 0x0, 0x15, 0x2a,
192 1.1 sakamoto 0x0, 0x3f, 0x0,
193 1.1 sakamoto 0x0, 0x3f, 0x2a,
194 1.1 sakamoto 0x2a, 0x15, 0x0,
195 1.1 sakamoto 0x2a, 0x15, 0x2a,
196 1.1 sakamoto 0x2a, 0x3f, 0x0,
197 1.1 sakamoto 0x2a, 0x3f, 0x2a,
198 1.1 sakamoto 0x0, 0x15, 0x15,
199 1.1 sakamoto 0x0, 0x15, 0x3f,
200 1.1 sakamoto 0x0, 0x3f, 0x15,
201 1.1 sakamoto 0x0, 0x3f, 0x3f,
202 1.1 sakamoto 0x2a, 0x15, 0x15,
203 1.1 sakamoto 0x2a, 0x15, 0x3f,
204 1.1 sakamoto 0x2a, 0x3f, 0x15,
205 1.1 sakamoto 0x2a, 0x3f, 0x3f,
206 1.1 sakamoto 0x15, 0x0, 0x0,
207 1.1 sakamoto 0x15, 0x0, 0x2a,
208 1.1 sakamoto 0x15, 0x2a, 0x0,
209 1.1 sakamoto 0x15, 0x2a, 0x2a,
210 1.1 sakamoto 0x3f, 0x0, 0x0,
211 1.1 sakamoto 0x3f, 0x0, 0x2a,
212 1.1 sakamoto 0x3f, 0x2a, 0x0,
213 1.1 sakamoto 0x3f, 0x2a, 0x2a,
214 1.1 sakamoto 0x15, 0x0, 0x15,
215 1.1 sakamoto 0x15, 0x0, 0x3f,
216 1.1 sakamoto 0x15, 0x2a, 0x15,
217 1.1 sakamoto 0x15, 0x2a, 0x3f,
218 1.1 sakamoto 0x3f, 0x0, 0x15,
219 1.1 sakamoto 0x3f, 0x0, 0x3f,
220 1.1 sakamoto 0x3f, 0x2a, 0x15,
221 1.1 sakamoto 0x3f, 0x2a, 0x3f,
222 1.1 sakamoto 0x15, 0x15, 0x0,
223 1.1 sakamoto 0x15, 0x15, 0x2a,
224 1.1 sakamoto 0x15, 0x3f, 0x0,
225 1.1 sakamoto 0x15, 0x3f, 0x2a,
226 1.1 sakamoto 0x3f, 0x15, 0x0,
227 1.1 sakamoto 0x3f, 0x15, 0x2a,
228 1.1 sakamoto 0x3f, 0x3f, 0x0,
229 1.1 sakamoto 0x3f, 0x3f, 0x2a,
230 1.1 sakamoto 0x15, 0x15, 0x15,
231 1.1 sakamoto 0x15, 0x15, 0x3f,
232 1.1 sakamoto 0x15, 0x3f, 0x15,
233 1.1 sakamoto 0x15, 0x3f, 0x3f,
234 1.1 sakamoto 0x3f, 0x15, 0x15,
235 1.1 sakamoto 0x3f, 0x15, 0x3f,
236 1.1 sakamoto 0x3f, 0x3f, 0x15,
237 1.1 sakamoto 0x3f, 0x3f, 0x3f,
238 1.1 sakamoto 0x39, 0xc, 0x5,
239 1.1 sakamoto 0x15, 0x2c, 0xf,
240 1.1 sakamoto 0x26, 0x10, 0x3d,
241 1.1 sakamoto 0x29, 0x29, 0x38,
242 1.1 sakamoto 0x4, 0x1a, 0xe,
243 1.1 sakamoto 0x2, 0x1e, 0x3a,
244 1.1 sakamoto 0x3c, 0x25, 0x33,
245 1.1 sakamoto 0x3c, 0xc, 0x2c,
246 1.1 sakamoto 0x3f, 0x3, 0x2b,
247 1.1 sakamoto 0x1c, 0x9, 0x13,
248 1.1 sakamoto 0x25, 0x2a, 0x35,
249 1.1 sakamoto 0x1e, 0xa, 0x38,
250 1.1 sakamoto 0x24, 0x8, 0x3,
251 1.1 sakamoto 0x3, 0xe, 0x36,
252 1.1 sakamoto 0xc, 0x6, 0x2a,
253 1.1 sakamoto 0x26, 0x3, 0x32,
254 1.1 sakamoto 0x5, 0x2f, 0x33,
255 1.1 sakamoto 0x3c, 0x35, 0x2f,
256 1.1 sakamoto 0x2d, 0x26, 0x3e,
257 1.1 sakamoto 0xd, 0xa, 0x10,
258 1.1 sakamoto 0x25, 0x3c, 0x11,
259 1.1 sakamoto 0xd, 0x4, 0x2e,
260 1.1 sakamoto 0x5, 0x19, 0x3e,
261 1.1 sakamoto 0xc, 0x13, 0x34,
262 1.1 sakamoto 0x2b, 0x6, 0x24,
263 1.1 sakamoto 0x4, 0x3, 0xd,
264 1.1 sakamoto 0x2f, 0x3c, 0xc,
265 1.1 sakamoto 0x2a, 0x37, 0x1f,
266 1.1 sakamoto 0xf, 0x12, 0x38,
267 1.1 sakamoto 0x38, 0xe, 0x2a,
268 1.1 sakamoto 0x12, 0x2f, 0x19,
269 1.1 sakamoto 0x29, 0x2e, 0x31,
270 1.1 sakamoto 0x25, 0x13, 0x3e,
271 1.1 sakamoto 0x33, 0x3e, 0x33,
272 1.1 sakamoto 0x1d, 0x2c, 0x25,
273 1.1 sakamoto 0x15, 0x15, 0x5,
274 1.1 sakamoto 0x32, 0x25, 0x39,
275 1.1 sakamoto 0x1a, 0x7, 0x1f,
276 1.1 sakamoto 0x13, 0xe, 0x1d,
277 1.1 sakamoto 0x36, 0x17, 0x34,
278 1.1 sakamoto 0xf, 0x15, 0x23,
279 1.1 sakamoto 0x2, 0x35, 0xd,
280 1.1 sakamoto 0x15, 0x3f, 0xc,
281 1.1 sakamoto 0x14, 0x2f, 0xf,
282 1.1 sakamoto 0x19, 0x21, 0x3e,
283 1.1 sakamoto 0x27, 0x11, 0x2f,
284 1.1 sakamoto 0x38, 0x3f, 0x3c,
285 1.1 sakamoto 0x36, 0x2d, 0x15,
286 1.1 sakamoto 0x16, 0x17, 0x2,
287 1.1 sakamoto 0x1, 0xa, 0x3d,
288 1.1 sakamoto 0x1b, 0x11, 0x3f,
289 1.1 sakamoto 0x21, 0x3c, 0xd,
290 1.1 sakamoto 0x1a, 0x39, 0x3d,
291 1.1 sakamoto 0x8, 0xe, 0xe,
292 1.1 sakamoto 0x22, 0x21, 0x23,
293 1.1 sakamoto 0x1e, 0x30, 0x5,
294 1.1 sakamoto 0x1f, 0x22, 0x3d,
295 1.1 sakamoto 0x1e, 0x2f, 0xa,
296 1.1 sakamoto 0x0, 0x1c, 0xe,
297 1.1 sakamoto 0x0, 0x1c, 0x15,
298 1.1 sakamoto 0x0, 0x1c, 0x1c,
299 1.1 sakamoto 0x0, 0x15, 0x1c,
300 1.1 sakamoto 0x0, 0xe, 0x1c,
301 1.1 sakamoto 0x0, 0x7, 0x1c,
302 1.1 sakamoto 0xe, 0xe, 0x1c,
303 1.1 sakamoto 0x11, 0xe, 0x1c,
304 1.1 sakamoto 0x15, 0xe, 0x1c,
305 1.1 sakamoto 0x18, 0xe, 0x1c,
306 1.1 sakamoto 0x1c, 0xe, 0x1c,
307 1.1 sakamoto 0x1c, 0xe, 0x18,
308 1.1 sakamoto 0x1c, 0xe, 0x15,
309 1.1 sakamoto 0x1c, 0xe, 0x11,
310 1.1 sakamoto 0x1c, 0xe, 0xe,
311 1.1 sakamoto 0x1c, 0x11, 0xe,
312 1.1 sakamoto 0x1c, 0x15, 0xe,
313 1.1 sakamoto 0x1c, 0x18, 0xe,
314 1.1 sakamoto 0x1c, 0x1c, 0xe,
315 1.1 sakamoto 0x18, 0x1c, 0xe,
316 1.1 sakamoto 0x15, 0x1c, 0xe,
317 1.1 sakamoto 0x11, 0x1c, 0xe,
318 1.1 sakamoto 0xe, 0x1c, 0xe,
319 1.1 sakamoto 0xe, 0x1c, 0x11,
320 1.1 sakamoto 0xe, 0x1c, 0x15,
321 1.1 sakamoto 0xe, 0x1c, 0x18,
322 1.1 sakamoto 0xe, 0x1c, 0x1c,
323 1.1 sakamoto 0xe, 0x18, 0x1c,
324 1.1 sakamoto 0xe, 0x15, 0x1c,
325 1.1 sakamoto 0xe, 0x11, 0x1c,
326 1.1 sakamoto 0x14, 0x14, 0x1c,
327 1.1 sakamoto 0x16, 0x14, 0x1c,
328 1.1 sakamoto 0x18, 0x14, 0x1c,
329 1.1 sakamoto 0x1a, 0x14, 0x1c,
330 1.1 sakamoto 0x1c, 0x14, 0x1c,
331 1.1 sakamoto 0x1c, 0x14, 0x1a,
332 1.1 sakamoto 0x1c, 0x14, 0x18,
333 1.1 sakamoto 0x1c, 0x14, 0x16,
334 1.1 sakamoto 0x1c, 0x14, 0x14,
335 1.1 sakamoto 0x1c, 0x16, 0x14,
336 1.1 sakamoto 0x1c, 0x18, 0x14,
337 1.1 sakamoto 0x1c, 0x1a, 0x14,
338 1.1 sakamoto 0x1c, 0x1c, 0x14,
339 1.1 sakamoto 0x1a, 0x1c, 0x14,
340 1.1 sakamoto 0x18, 0x1c, 0x14,
341 1.1 sakamoto 0x16, 0x1c, 0x14,
342 1.1 sakamoto 0x14, 0x1c, 0x14,
343 1.1 sakamoto 0x14, 0x1c, 0x16,
344 1.1 sakamoto 0x14, 0x1c, 0x18,
345 1.1 sakamoto 0x14, 0x1c, 0x1a,
346 1.1 sakamoto 0x14, 0x1c, 0x1c,
347 1.1 sakamoto 0x14, 0x1a, 0x1c,
348 1.1 sakamoto 0x14, 0x18, 0x1c,
349 1.1 sakamoto 0x14, 0x16, 0x1c,
350 1.1 sakamoto 0x0, 0x0, 0x10,
351 1.1 sakamoto 0x4, 0x0, 0x10,
352 1.1 sakamoto 0x8, 0x0, 0x10,
353 1.1 sakamoto 0xc, 0x0, 0x10,
354 1.1 sakamoto 0x10, 0x0, 0x10,
355 1.1 sakamoto 0x10, 0x0, 0xc,
356 1.1 sakamoto 0x10, 0x0, 0x8,
357 1.1 sakamoto 0x10, 0x0, 0x4,
358 1.1 sakamoto 0x10, 0x0, 0x0,
359 1.1 sakamoto 0x10, 0x4, 0x0,
360 1.1 sakamoto 0x10, 0x8, 0x0,
361 1.1 sakamoto 0x10, 0xc, 0x0,
362 1.1 sakamoto 0x10, 0x10, 0x0,
363 1.1 sakamoto 0xc, 0x10, 0x0,
364 1.1 sakamoto 0x8, 0x10, 0x0,
365 1.1 sakamoto 0x4, 0x10, 0x0,
366 1.1 sakamoto 0x0, 0x10, 0x0,
367 1.1 sakamoto 0x0, 0x10, 0x4,
368 1.1 sakamoto 0x0, 0x10, 0x8,
369 1.1 sakamoto 0x0, 0x10, 0xc,
370 1.1 sakamoto 0x0, 0x10, 0x10,
371 1.1 sakamoto 0x0, 0xc, 0x10,
372 1.1 sakamoto 0x0, 0x8, 0x10,
373 1.1 sakamoto 0x0, 0x4, 0x10,
374 1.1 sakamoto 0x8, 0x8, 0x10,
375 1.1 sakamoto 0xa, 0x8, 0x10,
376 1.1 sakamoto 0xc, 0x8, 0x10,
377 1.1 sakamoto 0xe, 0x8, 0x10,
378 1.1 sakamoto 0x10, 0x8, 0x10,
379 1.1 sakamoto 0x10, 0x8, 0xe,
380 1.1 sakamoto 0x10, 0x8, 0xc,
381 1.1 sakamoto 0x10, 0x8, 0xa,
382 1.1 sakamoto 0x10, 0x8, 0x8,
383 1.1 sakamoto 0x10, 0xa, 0x8,
384 1.1 sakamoto 0x10, 0xc, 0x8,
385 1.1 sakamoto 0x10, 0xe, 0x8,
386 1.1 sakamoto 0x10, 0x10, 0x8,
387 1.1 sakamoto 0xe, 0x10, 0x8,
388 1.1 sakamoto 0xc, 0x10, 0x8,
389 1.1 sakamoto 0xa, 0x10, 0x8,
390 1.1 sakamoto 0x8, 0x10, 0x8,
391 1.1 sakamoto 0x8, 0x10, 0xa,
392 1.1 sakamoto 0x8, 0x10, 0xc,
393 1.1 sakamoto 0x8, 0x10, 0xe,
394 1.1 sakamoto 0x8, 0x10, 0x10,
395 1.1 sakamoto 0x8, 0xe, 0x10,
396 1.1 sakamoto 0x8, 0xc, 0x10,
397 1.1 sakamoto 0x8, 0xa, 0x10,
398 1.1 sakamoto 0xb, 0xb, 0x10,
399 1.1 sakamoto 0xc, 0xb, 0x10,
400 1.1 sakamoto 0xd, 0xb, 0x10,
401 1.1 sakamoto 0xf, 0xb, 0x10,
402 1.1 sakamoto 0x10, 0xb, 0x10,
403 1.1 sakamoto 0x10, 0xb, 0xf,
404 1.1 sakamoto 0x10, 0xb, 0xd,
405 1.1 sakamoto 0x10, 0xb, 0xc,
406 1.1 sakamoto 0x10, 0xb, 0xb,
407 1.1 sakamoto 0x10, 0xc, 0xb,
408 1.1 sakamoto 0x10, 0xd, 0xb,
409 1.1 sakamoto 0x10, 0xf, 0xb,
410 1.1 sakamoto 0x10, 0x10, 0xb,
411 1.1 sakamoto 0xf, 0x10, 0xb,
412 1.1 sakamoto 0xd, 0x10, 0xb,
413 1.1 sakamoto 0xc, 0x10, 0xb,
414 1.1 sakamoto 0xb, 0x10, 0xb,
415 1.1 sakamoto 0xb, 0x10, 0xc,
416 1.1 sakamoto 0xb, 0x10, 0xd,
417 1.1 sakamoto 0xb, 0x10, 0xf,
418 1.1 sakamoto 0xb, 0x10, 0x10,
419 1.1 sakamoto 0xb, 0xf, 0x10,
420 1.1 sakamoto 0xb, 0xd, 0x10,
421 1.1 sakamoto 0xb, 0xc, 0x10,
422 1.1 sakamoto 0x0, 0x0, 0x0,
423 1.1 sakamoto 0x0, 0x0, 0x0,
424 1.1 sakamoto 0x0, 0x0, 0x0,
425 1.1 sakamoto 0x0, 0x0, 0x0,
426 1.1 sakamoto 0x0, 0x0, 0x0,
427 1.1 sakamoto 0x0, 0x0, 0x0,
428 1.1 sakamoto 0x0, 0x0, 0x0
429 1.1 sakamoto };
430 1.1 sakamoto
431 1.1 sakamoto unsigned char AC[21] = {
432 1.1 sakamoto 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
433 1.1 sakamoto 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
434 1.1 sakamoto 0x0C, 0x00, 0x0F, 0x08, 0x00};
435 1.1 sakamoto
436 1.1 sakamoto static int scanPCI(void);
437 1.1 sakamoto static int PCIVendor(int);
438 1.1 sakamoto static void printslots(void);
439 1.1 sakamoto int delayLoop(int);
440 1.1 sakamoto void unlockS3();
441 1.1 sakamoto
442 1.1 sakamoto void puthex(unsigned long val)
443 1.1 sakamoto {
444 1.1 sakamoto printf("%08X ", val);
445 1.1 sakamoto }
446 1.1 sakamoto
447 1.1 sakamoto void puts(const char *s)
448 1.1 sakamoto {
449 1.1 sakamoto printf("%s", s);
450 1.1 sakamoto }
451 1.1 sakamoto
452 1.1 sakamoto static inline
453 1.1 sakamoto outw(int port, unsigned short val)
454 1.1 sakamoto {
455 1.1 sakamoto outb(port, val >> 8);
456 1.1 sakamoto outb(port+1, val);
457 1.1 sakamoto }
458 1.1 sakamoto
459 1.2 sakamoto vga_reset(unsigned char *ISA_mem)
460 1.1 sakamoto {
461 1.1 sakamoto int slot;
462 1.1 sakamoto struct VgaRegs *VgaTextRegs;
463 1.1 sakamoto
464 1.1 sakamoto /* See if VGA already in TEXT mode - exit if so! */
465 1.1 sakamoto outb(0x3CE, 0x06);
466 1.1 sakamoto if ((inb(0x3CF) & 0x01) == 0) return;
467 1.1 sakamoto
468 1.1 sakamoto /* If no VGA responding in text mode, then we have some work to do... */
469 1.1 sakamoto slot = scanPCI(); /* find video card in use */
470 1.1 sakamoto enablePCIvideo(slot); /* enable I/O to card */
471 1.1 sakamoto
472 1.1 sakamoto /*
473 1.1 sakamoto * Note: the PCI scanning code does not yet work correctly
474 1.1 sakamoto * for non-Moto boxes, so the switch below only
475 1.1 sakamoto * defaults to using an S3 card if it does not
476 1.1 sakamoto * find a Cirrus card.
477 1.1 sakamoto *
478 1.1 sakamoto * The only reason we need to scan the bus looking for
479 1.1 sakamoto * a graphics card is so we could do the "enablePCIvideo(slot)"
480 1.1 sakamoto * call above; it is needed because Moto's OpenFirmware
481 1.1 sakamoto * disables I/O to the graphics adapter before it gives
482 1.1 sakamoto * us control. PEK'97
483 1.1 sakamoto */
484 1.1 sakamoto
485 1.1 sakamoto switch (PCIVendor(slot)) {
486 1.1 sakamoto default: /* Assume S3 */
487 1.1 sakamoto /* case(S3Vendor): */
488 1.1 sakamoto unlockS3();
489 1.1 sakamoto VgaTextRegs = S3TextRegs;
490 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
491 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
492 1.1 sakamoto setTextCLUT(); /* load color lookup table */
493 1.1 sakamoto loadFont(ISA_mem); /* load font */
494 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
495 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
496 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
497 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
498 1.1 sakamoto break;
499 1.1 sakamoto
500 1.1 sakamoto case(CirrusVendor):
501 1.1 sakamoto VgaTextRegs = GenVgaTextRegs;
502 1.1 sakamoto outw(0x3C4, 0x0612); /* unlock ext regs */
503 1.1 sakamoto outw(0x3C4, 0x0700); /* reset ext sequence mode */
504 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
505 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
506 1.1 sakamoto setTextCLUT(); /* load color lookup table */
507 1.1 sakamoto loadFont(ISA_mem); /* load font */
508 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
509 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
510 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
511 1.1 sakamoto break;
512 1.1 sakamoto
513 1.1 sakamoto case (DiamondVendor):
514 1.1 sakamoto case (MatroxVendor):
515 1.1 sakamoto /*
516 1.1 sakamoto * The following code is almost enuf to get the Matrox
517 1.1 sakamoto * working (on a Moto box) but the video is not stable.
518 1.1 sakamoto * We probably need to tweak the TVP3026 Video PLL regs. PEK'97
519 1.1 sakamoto */
520 1.1 sakamoto VgaTextRegs=GenVgaTextRegs;
521 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
522 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
523 1.1 sakamoto setTextCLUT(); /* load color lookup table */
524 1.1 sakamoto loadFont(ISA_mem); /* load font */
525 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
526 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
527 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
528 1.1 sakamoto puts("VGA Chip Vendor ID: ");
529 1.1 sakamoto puthex(PCIVendor(slot));
530 1.1 sakamoto puts("\n");
531 1.1 sakamoto delayLoop(1);
532 1.1 sakamoto break;
533 1.1 sakamoto };
534 1.1 sakamoto
535 1.1 sakamoto
536 1.1 sakamoto #ifdef DEBUG
537 1.1 sakamoto printslots();
538 1.1 sakamoto delayLoop(5);
539 1.1 sakamoto #endif
540 1.1 sakamoto
541 1.1 sakamoto delayLoop(2); /* give time for the video monitor to come up */
542 1.1 sakamoto }
543 1.1 sakamoto
544 1.1 sakamoto /*
545 1.1 sakamoto * Write to VGA Attribute registers.
546 1.1 sakamoto */
547 1.1 sakamoto writeAttr(index, data, videoOn)
548 1.1 sakamoto unsigned char index;
549 1.1 sakamoto unsigned char data;
550 1.1 sakamoto unsigned char videoOn; /* video on flag */
551 1.1 sakamoto {
552 1.1 sakamoto unsigned char v;
553 1.1 sakamoto v = inb(0x3da); /* reset attr. address toggle */
554 1.1 sakamoto if (videoOn)
555 1.1 sakamoto outb(0x3c0, (index & 0x1F) | 0x20);
556 1.1 sakamoto else
557 1.1 sakamoto outb(0x3c0, (index & 0x1F));
558 1.1 sakamoto outb(0x3c0, data);
559 1.1 sakamoto }
560 1.1 sakamoto
561 1.1 sakamoto setTextRegs(struct VgaRegs *svp)
562 1.1 sakamoto {
563 1.1 sakamoto int i;
564 1.1 sakamoto
565 1.1 sakamoto /*
566 1.1 sakamoto * saved settings
567 1.1 sakamoto */
568 1.1 sakamoto while( svp->io_port != ENDMK ) {
569 1.1 sakamoto outb(svp->io_port, svp->io_index);
570 1.1 sakamoto outb(svp->io_port+1, svp->io_value);
571 1.1 sakamoto svp++;
572 1.1 sakamoto }
573 1.1 sakamoto
574 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
575 1.1 sakamoto outb(0x3c6, 0xff); /* MASK */
576 1.1 sakamoto
577 1.1 sakamoto for ( i = 0; i < 0x10; i++)
578 1.1 sakamoto writeAttr(i, AC[i], 0); /* pallete */
579 1.1 sakamoto writeAttr(0x10, 0x0c, 0); /* text mode */
580 1.1 sakamoto writeAttr(0x11, 0x00, 0); /* overscan color (border) */
581 1.1 sakamoto writeAttr(0x12, 0x0f, 0); /* plane enable */
582 1.1 sakamoto writeAttr(0x13, 0x08, 0); /* pixel panning */
583 1.1 sakamoto writeAttr(0x14, 0x00, 1); /* color select; video on */
584 1.1 sakamoto
585 1.1 sakamoto }
586 1.1 sakamoto
587 1.1 sakamoto setTextCLUT()
588 1.1 sakamoto {
589 1.1 sakamoto int i;
590 1.1 sakamoto
591 1.1 sakamoto outb(0x3C6, 0xFF);
592 1.1 sakamoto i = inb(0x3C7);
593 1.1 sakamoto outb(0x3C8, 0);
594 1.1 sakamoto i = inb(0x3C7);
595 1.1 sakamoto
596 1.1 sakamoto for ( i = 0; i < 256; i++) {
597 1.1 sakamoto outb(0x3C9, TextCLUT[i].r);
598 1.1 sakamoto outb(0x3C9, TextCLUT[i].g);
599 1.1 sakamoto outb(0x3C9, TextCLUT[i].b);
600 1.1 sakamoto }
601 1.1 sakamoto }
602 1.1 sakamoto
603 1.1 sakamoto
604 1.1 sakamoto loadFont(unsigned char *ISA_mem)
605 1.1 sakamoto {
606 1.1 sakamoto int i, j;
607 1.1 sakamoto unsigned char *font_page = (unsigned char *) &ISA_mem[0xA0000];
608 1.1 sakamoto
609 1.1 sakamoto outb(0x3C2, 0x67);
610 1.1 sakamoto /*
611 1.1 sakamoto * Load font
612 1.1 sakamoto */
613 1.1 sakamoto i = inb(0x3DA); /* Reset Attr toggle */
614 1.1 sakamoto
615 1.1 sakamoto outb(0x3C0,0x30);
616 1.1 sakamoto outb(0x3C0, 0x01); /* graphics mode */
617 1.1 sakamoto
618 1.1 sakamoto outw(0x3C4, 0x0001); /* reset sequencer */
619 1.1 sakamoto outw(0x3C4, 0x0204); /* write to plane 2 */
620 1.1 sakamoto outw(0x3C4, 0x0406); /* enable plane graphics */
621 1.1 sakamoto outw(0x3C4, 0x0003); /* reset sequencer */
622 1.1 sakamoto outw(0x3CE, 0x0402); /* read plane 2 */
623 1.1 sakamoto outw(0x3CE, 0x0500); /* write mode 0, read mode 0 */
624 1.1 sakamoto outw(0x3CE, 0x0605); /* set graphics mode */
625 1.1 sakamoto
626 1.1 sakamoto for (i = 0; i < sizeof(font); i += 16) {
627 1.1 sakamoto for (j = 0; j < 16; j++) {
628 1.1 sakamoto __asm__ volatile("eieio");
629 1.1 sakamoto font_page[(2*i)+j] = font[i+j];
630 1.1 sakamoto }
631 1.1 sakamoto }
632 1.1 sakamoto }
633 1.1 sakamoto
634 1.1 sakamoto
635 1.1 sakamoto void
636 1.1 sakamoto unlockS3()
637 1.1 sakamoto {
638 1.1 sakamoto /* From the S3 manual */
639 1.1 sakamoto outb(0x46E8, 0x10); /* Put into setup mode */
640 1.1 sakamoto outb(0x3C3, 0x10);
641 1.1 sakamoto outb(0x102, 0x01); /* Enable registers */
642 1.1 sakamoto outb(0x46E8, 0x08); /* Enable video */
643 1.1 sakamoto outb(0x3C3, 0x08);
644 1.1 sakamoto outb(0x4AE8, 0x00);
645 1.1 sakamoto
646 1.1 sakamoto outb(0x42E8, 0x80); /* Reset graphics engine? */
647 1.1 sakamoto
648 1.1 sakamoto outb(0x3D4, 0x38); /* Unlock all registers */
649 1.1 sakamoto outb(0x3D5, 0x48);
650 1.1 sakamoto outb(0x3D4, 0x39);
651 1.1 sakamoto outb(0x3D5, 0xA5);
652 1.1 sakamoto outb(0x3D4, 0x40);
653 1.1 sakamoto outb(0x3D5, inb(0x3D5)|0x01);
654 1.1 sakamoto outb(0x3D4, 0x33);
655 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x52);
656 1.1 sakamoto outb(0x3D4, 0x35);
657 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x30);
658 1.1 sakamoto outb(0x3D4, 0x3A);
659 1.1 sakamoto outb(0x3D5, 0x00);
660 1.1 sakamoto outb(0x3D4, 0x53);
661 1.1 sakamoto outb(0x3D5, 0x00);
662 1.1 sakamoto outb(0x3D4, 0x31);
663 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x4B);
664 1.1 sakamoto outb(0x3D4, 0x58);
665 1.1 sakamoto
666 1.1 sakamoto outb(0x3D5, 0);
667 1.1 sakamoto
668 1.1 sakamoto outb(0x3D4, 0x54);
669 1.1 sakamoto outb(0x3D5, 0x38);
670 1.1 sakamoto outb(0x3D4, 0x60);
671 1.1 sakamoto outb(0x3D5, 0x07);
672 1.1 sakamoto outb(0x3D4, 0x61);
673 1.1 sakamoto outb(0x3D5, 0x80);
674 1.1 sakamoto outb(0x3D4, 0x62);
675 1.1 sakamoto outb(0x3D5, 0xA1);
676 1.1 sakamoto outb(0x3D4, 0x69); /* High order bits for cursor address */
677 1.1 sakamoto outb(0x3D5, 0);
678 1.1 sakamoto
679 1.1 sakamoto outb(0x3D4, 0x32);
680 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x10);
681 1.1 sakamoto }
682 1.1 sakamoto
683 1.1 sakamoto /* ============ */
684 1.1 sakamoto
685 1.1 sakamoto
686 1.1 sakamoto #define NSLOTS 4
687 1.1 sakamoto #define NPCIREGS 5
688 1.1 sakamoto
689 1.1 sakamoto
690 1.1 sakamoto /*
691 1.1 sakamoto * should use devfunc number/indirect method to be totally safe on
692 1.1 sakamoto * all machines, this works for now on 3 slot Moto boxes
693 1.1 sakamoto */
694 1.1 sakamoto
695 1.1 sakamoto struct PCI_ConfigInfo {
696 1.1 sakamoto unsigned long * config_addr;
697 1.1 sakamoto unsigned long regs[NPCIREGS];
698 1.1 sakamoto } PCI_slots [NSLOTS] = {
699 1.2 sakamoto { (unsigned long *)0x80802000, { 0xDE, 0xAD, 0xBE, 0xEF } },
700 1.2 sakamoto { (unsigned long *)0x80804000, { 0xDE, 0xAD, 0xBE, 0xEF } },
701 1.2 sakamoto { (unsigned long *)0x80808000, { 0xDE, 0xAD, 0xBE, 0xEF } },
702 1.2 sakamoto { (unsigned long *)0x80810000, { 0xDE, 0xAD, 0xBE, 0xEF } }
703 1.1 sakamoto };
704 1.1 sakamoto
705 1.1 sakamoto
706 1.1 sakamoto /*
707 1.1 sakamoto * The following code modifies the PCI Command register
708 1.1 sakamoto * to enable memory and I/O accesses.
709 1.1 sakamoto */
710 1.1 sakamoto enablePCIvideo(slot)
711 1.1 sakamoto {
712 1.1 sakamoto volatile unsigned char * ppci;
713 1.1 sakamoto
714 1.1 sakamoto ppci = (unsigned char * )PCI_slots[slot].config_addr;
715 1.1 sakamoto ppci[4] = 0x0003; /* enable memory and I/O accesses */
716 1.1 sakamoto __asm__ volatile("eieio");
717 1.1 sakamoto
718 1.1 sakamoto outb(0x3d4, 0x11);
719 1.1 sakamoto outb(0x3d5, 0x0e); /* unlock CR0-CR7 */
720 1.1 sakamoto }
721 1.1 sakamoto
722 1.1 sakamoto #define DEVID 0
723 1.1 sakamoto #define CMD 1
724 1.1 sakamoto #define CLASS 2
725 1.1 sakamoto #define MEMBASE 4
726 1.1 sakamoto
727 1.1 sakamoto int
728 1.1 sakamoto scanPCI(void)
729 1.1 sakamoto {
730 1.1 sakamoto int slt, r;
731 1.1 sakamoto struct PCI_ConfigInfo *pslot;
732 1.1 sakamoto int theSlot = -1;
733 1.1 sakamoto int highVgaSlot = -1;
734 1.1 sakamoto
735 1.1 sakamoto for ( slt = 0; slt < NSLOTS; slt++) {
736 1.1 sakamoto pslot = &PCI_slots[slt];
737 1.1 sakamoto for ( r = 0; r < NPCIREGS; r++) {
738 1.2 sakamoto pslot->regs[r] = bswap32(pslot->config_addr[r]);
739 1.1 sakamoto }
740 1.1 sakamoto
741 1.1 sakamoto if ( pslot->regs[DEVID] != 0xFFFFFFFF ) { /* card in slot ? */
742 1.1 sakamoto if ( (pslot->regs[CLASS] & 0xFFFFFF00) == 0x03000000 ) { /* VGA ? */
743 1.1 sakamoto highVgaSlot = slt;
744 1.1 sakamoto if ( (pslot->regs[CMD] & 0x03) ) { /* did firmware enable it ? */
745 1.1 sakamoto theSlot = slt;
746 1.1 sakamoto }
747 1.1 sakamoto }
748 1.1 sakamoto }
749 1.1 sakamoto }
750 1.1 sakamoto
751 1.1 sakamoto if ( theSlot == -1 )
752 1.1 sakamoto theSlot = highVgaSlot;
753 1.1 sakamoto
754 1.1 sakamoto return ( theSlot );
755 1.1 sakamoto }
756 1.1 sakamoto
757 1.1 sakamoto
758 1.1 sakamoto int
759 1.1 sakamoto delayLoop(int k)
760 1.1 sakamoto {
761 1.1 sakamoto volatile int a, b;
762 1.1 sakamoto volatile int i, j;
763 1.1 sakamoto a = 0;
764 1.1 sakamoto do {
765 1.1 sakamoto for ( i = 0; i < 500; i++) {
766 1.1 sakamoto b = i;
767 1.1 sakamoto for ( j = 0; j < 200; j++) {
768 1.1 sakamoto a = b+j;
769 1.1 sakamoto }
770 1.1 sakamoto }
771 1.1 sakamoto } while (k--);
772 1.1 sakamoto return(a);
773 1.1 sakamoto }
774 1.1 sakamoto
775 1.1 sakamoto
776 1.1 sakamoto /* return Vendor ID of card in the slot */
777 1.1 sakamoto static
778 1.1 sakamoto int PCIVendor(int slotnum)
779 1.1 sakamoto {
780 1.1 sakamoto struct PCI_ConfigInfo *pslot;
781 1.1 sakamoto
782 1.1 sakamoto pslot = &PCI_slots[slotnum];
783 1.1 sakamoto
784 1.1 sakamoto return (pslot->regs[DEVID] & 0xFFFF);
785 1.1 sakamoto }
786 1.1 sakamoto
787 1.1 sakamoto static
788 1.1 sakamoto void printslots(void)
789 1.1 sakamoto {
790 1.1 sakamoto int i;
791 1.1 sakamoto for(i=0; i < NSLOTS; i++) {
792 1.1 sakamoto
793 1.1 sakamoto puts("PCI Slot number: "); puthex(i);
794 1.1 sakamoto puts(" Vendor ID: ");
795 1.1 sakamoto puthex(PCIVendor(i)); puts("\n");
796 1.1 sakamoto
797 1.1 sakamoto }
798 1.1 sakamoto }
799 1.1 sakamoto #endif /* CONS_VGA */
800