vreset.c revision 1.9.72.1 1 1.9.72.1 mjf /* $NetBSD: vreset.c,v 1.9.72.1 2008/04/03 12:42:13 mjf 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.5 junyoung delayLoop(1);
532 1.5 junyoung break;
533 1.1 sakamoto };
534 1.1 sakamoto
535 1.1 sakamoto #ifdef DEBUG
536 1.1 sakamoto printslots();
537 1.5 junyoung delayLoop(5);
538 1.1 sakamoto #endif
539 1.1 sakamoto delayLoop(2); /* give time for the video monitor to come up */
540 1.1 sakamoto }
541 1.1 sakamoto
542 1.1 sakamoto /*
543 1.5 junyoung * Write to VGA Attribute registers.
544 1.1 sakamoto */
545 1.4 sakamoto void
546 1.5 junyoung writeAttr(u_char index, u_char data, u_char videoOn)
547 1.1 sakamoto {
548 1.4 sakamoto u_char v;
549 1.1 sakamoto v = inb(0x3da); /* reset attr. address toggle */
550 1.1 sakamoto if (videoOn)
551 1.1 sakamoto outb(0x3c0, (index & 0x1F) | 0x20);
552 1.1 sakamoto else
553 1.1 sakamoto outb(0x3c0, (index & 0x1F));
554 1.1 sakamoto outb(0x3c0, data);
555 1.1 sakamoto }
556 1.1 sakamoto
557 1.4 sakamoto void
558 1.5 junyoung setTextRegs(struct VgaRegs *svp)
559 1.1 sakamoto {
560 1.1 sakamoto int i;
561 1.1 sakamoto
562 1.1 sakamoto /*
563 1.1 sakamoto * saved settings
564 1.5 junyoung */
565 1.4 sakamoto while (svp->io_port != ENDMK) {
566 1.1 sakamoto outb(svp->io_port, svp->io_index);
567 1.1 sakamoto outb(svp->io_port+1, svp->io_value);
568 1.5 junyoung svp++;
569 1.1 sakamoto }
570 1.1 sakamoto
571 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
572 1.1 sakamoto outb(0x3c6, 0xff); /* MASK */
573 1.1 sakamoto
574 1.4 sakamoto for (i = 0; i < 0x10; i++)
575 1.5 junyoung writeAttr(i, AC[i], 0); /* pallete */
576 1.5 junyoung writeAttr(0x10, 0x0c, 0); /* text mode */
577 1.5 junyoung writeAttr(0x11, 0x00, 0); /* overscan color (border) */
578 1.5 junyoung writeAttr(0x12, 0x0f, 0); /* plane enable */
579 1.5 junyoung writeAttr(0x13, 0x08, 0); /* pixel panning */
580 1.5 junyoung writeAttr(0x14, 0x00, 1); /* color select; video on */
581 1.1 sakamoto }
582 1.1 sakamoto
583 1.4 sakamoto void
584 1.5 junyoung setTextCLUT(void)
585 1.1 sakamoto {
586 1.1 sakamoto int i;
587 1.1 sakamoto
588 1.5 junyoung outb(0x3C6, 0xFF);
589 1.1 sakamoto i = inb(0x3C7);
590 1.5 junyoung outb(0x3C8, 0);
591 1.1 sakamoto i = inb(0x3C7);
592 1.1 sakamoto
593 1.4 sakamoto for (i = 0; i < 256; i++) {
594 1.1 sakamoto outb(0x3C9, TextCLUT[i].r);
595 1.1 sakamoto outb(0x3C9, TextCLUT[i].g);
596 1.1 sakamoto outb(0x3C9, TextCLUT[i].b);
597 1.1 sakamoto }
598 1.1 sakamoto }
599 1.1 sakamoto
600 1.4 sakamoto void
601 1.5 junyoung loadFont(u_char *ISA_mem)
602 1.1 sakamoto {
603 1.1 sakamoto int i, j;
604 1.4 sakamoto u_char *font_page = (u_char *)&ISA_mem[0xA0000];
605 1.5 junyoung
606 1.1 sakamoto outb(0x3C2, 0x67);
607 1.5 junyoung /*
608 1.5 junyoung * Load font
609 1.1 sakamoto */
610 1.5 junyoung i = inb(0x3DA); /* Reset Attr toggle */
611 1.1 sakamoto
612 1.5 junyoung outb(0x3C0,0x30);
613 1.5 junyoung outb(0x3C0, 0x01); /* graphics mode */
614 1.1 sakamoto
615 1.5 junyoung outw(0x3C4, 0x0001); /* reset sequencer */
616 1.5 junyoung outw(0x3C4, 0x0204); /* write to plane 2 */
617 1.5 junyoung outw(0x3C4, 0x0406); /* enable plane graphics */
618 1.5 junyoung outw(0x3C4, 0x0003); /* reset sequencer */
619 1.5 junyoung outw(0x3CE, 0x0402); /* read plane 2 */
620 1.5 junyoung outw(0x3CE, 0x0500); /* write mode 0, read mode 0 */
621 1.5 junyoung outw(0x3CE, 0x0605); /* set graphics mode */
622 1.1 sakamoto
623 1.1 sakamoto for (i = 0; i < sizeof(font); i += 16) {
624 1.1 sakamoto for (j = 0; j < 16; j++) {
625 1.8 perry __asm volatile("eieio");
626 1.1 sakamoto font_page[(2*i)+j] = font[i+j];
627 1.1 sakamoto }
628 1.1 sakamoto }
629 1.1 sakamoto }
630 1.1 sakamoto
631 1.1 sakamoto void
632 1.5 junyoung unlockS3(void)
633 1.1 sakamoto {
634 1.1 sakamoto /* From the S3 manual */
635 1.1 sakamoto outb(0x46E8, 0x10); /* Put into setup mode */
636 1.1 sakamoto outb(0x3C3, 0x10);
637 1.1 sakamoto outb(0x102, 0x01); /* Enable registers */
638 1.1 sakamoto outb(0x46E8, 0x08); /* Enable video */
639 1.1 sakamoto outb(0x3C3, 0x08);
640 1.1 sakamoto outb(0x4AE8, 0x00);
641 1.1 sakamoto
642 1.1 sakamoto outb(0x42E8, 0x80); /* Reset graphics engine? */
643 1.1 sakamoto
644 1.1 sakamoto outb(0x3D4, 0x38); /* Unlock all registers */
645 1.1 sakamoto outb(0x3D5, 0x48);
646 1.1 sakamoto outb(0x3D4, 0x39);
647 1.1 sakamoto outb(0x3D5, 0xA5);
648 1.1 sakamoto outb(0x3D4, 0x40);
649 1.1 sakamoto outb(0x3D5, inb(0x3D5)|0x01);
650 1.1 sakamoto outb(0x3D4, 0x33);
651 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x52);
652 1.1 sakamoto outb(0x3D4, 0x35);
653 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x30);
654 1.1 sakamoto outb(0x3D4, 0x3A);
655 1.1 sakamoto outb(0x3D5, 0x00);
656 1.1 sakamoto outb(0x3D4, 0x53);
657 1.1 sakamoto outb(0x3D5, 0x00);
658 1.1 sakamoto outb(0x3D4, 0x31);
659 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x4B);
660 1.1 sakamoto outb(0x3D4, 0x58);
661 1.1 sakamoto
662 1.1 sakamoto outb(0x3D5, 0);
663 1.1 sakamoto
664 1.1 sakamoto outb(0x3D4, 0x54);
665 1.1 sakamoto outb(0x3D5, 0x38);
666 1.1 sakamoto outb(0x3D4, 0x60);
667 1.1 sakamoto outb(0x3D5, 0x07);
668 1.1 sakamoto outb(0x3D4, 0x61);
669 1.1 sakamoto outb(0x3D5, 0x80);
670 1.1 sakamoto outb(0x3D4, 0x62);
671 1.1 sakamoto outb(0x3D5, 0xA1);
672 1.1 sakamoto outb(0x3D4, 0x69); /* High order bits for cursor address */
673 1.1 sakamoto outb(0x3D5, 0);
674 1.5 junyoung
675 1.1 sakamoto outb(0x3D4, 0x32);
676 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x10);
677 1.1 sakamoto }
678 1.1 sakamoto
679 1.1 sakamoto /* ============ */
680 1.1 sakamoto
681 1.1 sakamoto
682 1.1 sakamoto #define NSLOTS 4
683 1.1 sakamoto #define NPCIREGS 5
684 1.1 sakamoto
685 1.4 sakamoto /*
686 1.5 junyoung * should use devfunc number/indirect method to be totally safe on
687 1.4 sakamoto * all machines, this works for now on 3 slot Moto boxes
688 1.1 sakamoto */
689 1.1 sakamoto
690 1.1 sakamoto struct PCI_ConfigInfo {
691 1.4 sakamoto u_long * config_addr;
692 1.4 sakamoto u_long regs[NPCIREGS];
693 1.1 sakamoto } PCI_slots [NSLOTS] = {
694 1.4 sakamoto { (u_long *)0x80802000, { 0xDE, 0xAD, 0xBE, 0xEF } },
695 1.4 sakamoto { (u_long *)0x80804000, { 0xDE, 0xAD, 0xBE, 0xEF } },
696 1.4 sakamoto { (u_long *)0x80808000, { 0xDE, 0xAD, 0xBE, 0xEF } },
697 1.4 sakamoto { (u_long *)0x80810000, { 0xDE, 0xAD, 0xBE, 0xEF } }
698 1.1 sakamoto };
699 1.1 sakamoto
700 1.1 sakamoto
701 1.1 sakamoto /*
702 1.1 sakamoto * The following code modifies the PCI Command register
703 1.5 junyoung * to enable memory and I/O accesses.
704 1.5 junyoung */
705 1.4 sakamoto void
706 1.5 junyoung enablePCIvideo(int slot)
707 1.1 sakamoto {
708 1.4 sakamoto volatile u_char * ppci;
709 1.1 sakamoto
710 1.4 sakamoto ppci = (u_char *)PCI_slots[slot].config_addr;
711 1.1 sakamoto ppci[4] = 0x0003; /* enable memory and I/O accesses */
712 1.8 perry __asm volatile("eieio");
713 1.1 sakamoto
714 1.1 sakamoto outb(0x3d4, 0x11);
715 1.1 sakamoto outb(0x3d5, 0x0e); /* unlock CR0-CR7 */
716 1.1 sakamoto }
717 1.1 sakamoto
718 1.1 sakamoto #define DEVID 0
719 1.1 sakamoto #define CMD 1
720 1.1 sakamoto #define CLASS 2
721 1.1 sakamoto #define MEMBASE 4
722 1.1 sakamoto
723 1.1 sakamoto int
724 1.5 junyoung scanPCI(void)
725 1.1 sakamoto {
726 1.1 sakamoto int slt, r;
727 1.1 sakamoto struct PCI_ConfigInfo *pslot;
728 1.1 sakamoto int theSlot = -1;
729 1.1 sakamoto int highVgaSlot = -1;
730 1.1 sakamoto
731 1.4 sakamoto for (slt = 0; slt < NSLOTS; slt++) {
732 1.1 sakamoto pslot = &PCI_slots[slt];
733 1.4 sakamoto for (r = 0; r < NPCIREGS; r++) {
734 1.2 sakamoto pslot->regs[r] = bswap32(pslot->config_addr[r]);
735 1.1 sakamoto }
736 1.1 sakamoto
737 1.4 sakamoto if (pslot->regs[DEVID] != 0xFFFFFFFF) { /* card in slot ? */
738 1.4 sakamoto if ((pslot->regs[CLASS] & 0xFFFFFF00) == 0x03000000) { /* VGA ? */
739 1.1 sakamoto highVgaSlot = slt;
740 1.4 sakamoto if ((pslot->regs[CMD] & 0x03)) { /* did firmware enable it ? */
741 1.1 sakamoto theSlot = slt;
742 1.1 sakamoto }
743 1.1 sakamoto }
744 1.1 sakamoto }
745 1.1 sakamoto }
746 1.1 sakamoto
747 1.4 sakamoto if (theSlot == -1)
748 1.1 sakamoto theSlot = highVgaSlot;
749 1.1 sakamoto
750 1.5 junyoung return theSlot;
751 1.1 sakamoto }
752 1.1 sakamoto
753 1.1 sakamoto int
754 1.5 junyoung delayLoop(int k)
755 1.1 sakamoto {
756 1.1 sakamoto volatile int a, b;
757 1.1 sakamoto volatile int i, j;
758 1.1 sakamoto a = 0;
759 1.1 sakamoto do {
760 1.4 sakamoto for (i = 0; i < 500; i++) {
761 1.1 sakamoto b = i;
762 1.4 sakamoto for (j = 0; j < 200; j++) {
763 1.1 sakamoto a = b+j;
764 1.1 sakamoto }
765 1.1 sakamoto }
766 1.1 sakamoto } while (k--);
767 1.5 junyoung return a;
768 1.1 sakamoto }
769 1.1 sakamoto
770 1.1 sakamoto /* return Vendor ID of card in the slot */
771 1.5 junyoung static int
772 1.5 junyoung PCIVendor(int slotnum)
773 1.1 sakamoto {
774 1.1 sakamoto struct PCI_ConfigInfo *pslot;
775 1.1 sakamoto
776 1.1 sakamoto pslot = &PCI_slots[slotnum];
777 1.1 sakamoto
778 1.1 sakamoto return (pslot->regs[DEVID] & 0xFFFF);
779 1.1 sakamoto }
780 1.1 sakamoto
781 1.4 sakamoto #ifdef DEBUG
782 1.5 junyoung static void
783 1.5 junyoung printslots(void)
784 1.1 sakamoto {
785 1.1 sakamoto int i;
786 1.4 sakamoto for (i = 0; i < NSLOTS; i++) {
787 1.4 sakamoto printf("PCI Slot number: %d", i);
788 1.9.72.1 mjf printf(" Vendor ID: 0x%x\n", PCIVendor(i));
789 1.1 sakamoto }
790 1.1 sakamoto }
791 1.4 sakamoto #endif /* DEBUG */
792 1.1 sakamoto #endif /* CONS_VGA */
793