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