vreset.c revision 1.10.2.1 1 1.10.2.1 yamt /* $NetBSD: vreset.c,v 1.10.2.1 2008/06/04 02:04:41 yamt 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.10.2.1 yamt #define S3Vendor 0x5333
71 1.10.2.1 yamt #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.10.2.1 yamt void writeAttr(u_char, u_char, u_char);
444 1.5 junyoung void setTextRegs(struct VgaRegs *);
445 1.5 junyoung void setTextCLUT(void);
446 1.5 junyoung void loadFont(u_char *);
447 1.5 junyoung void unlockS3(void);
448 1.4 sakamoto #ifdef DEBUG
449 1.5 junyoung static void printslots(void);
450 1.4 sakamoto #endif
451 1.1 sakamoto
452 1.4 sakamoto void
453 1.5 junyoung vga_reset(u_char *ISA_mem)
454 1.1 sakamoto {
455 1.1 sakamoto int slot;
456 1.1 sakamoto struct VgaRegs *VgaTextRegs;
457 1.1 sakamoto
458 1.1 sakamoto /* See if VGA already in TEXT mode - exit if so! */
459 1.1 sakamoto outb(0x3CE, 0x06);
460 1.5 junyoung if ((inb(0x3CF) & 0x01) == 0)
461 1.5 junyoung return;
462 1.1 sakamoto
463 1.1 sakamoto /* If no VGA responding in text mode, then we have some work to do... */
464 1.1 sakamoto slot = scanPCI(); /* find video card in use */
465 1.1 sakamoto enablePCIvideo(slot); /* enable I/O to card */
466 1.1 sakamoto
467 1.1 sakamoto /*
468 1.1 sakamoto * Note: the PCI scanning code does not yet work correctly
469 1.1 sakamoto * for non-Moto boxes, so the switch below only
470 1.1 sakamoto * defaults to using an S3 card if it does not
471 1.1 sakamoto * find a Cirrus card.
472 1.1 sakamoto *
473 1.1 sakamoto * The only reason we need to scan the bus looking for
474 1.1 sakamoto * a graphics card is so we could do the "enablePCIvideo(slot)"
475 1.1 sakamoto * call above; it is needed because Moto's OpenFirmware
476 1.1 sakamoto * disables I/O to the graphics adapter before it gives
477 1.1 sakamoto * us control. PEK'97
478 1.1 sakamoto */
479 1.1 sakamoto
480 1.1 sakamoto switch (PCIVendor(slot)) {
481 1.1 sakamoto default: /* Assume S3 */
482 1.5 junyoung #if 0
483 1.5 junyoung case S3Vendor:
484 1.5 junyoung #endif
485 1.5 junyoung unlockS3();
486 1.1 sakamoto VgaTextRegs = S3TextRegs;
487 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
488 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
489 1.1 sakamoto setTextCLUT(); /* load color lookup table */
490 1.1 sakamoto loadFont(ISA_mem); /* load font */
491 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
492 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
493 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
494 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
495 1.1 sakamoto break;
496 1.1 sakamoto
497 1.5 junyoung case CirrusVendor:
498 1.1 sakamoto VgaTextRegs = GenVgaTextRegs;
499 1.1 sakamoto outw(0x3C4, 0x0612); /* unlock ext regs */
500 1.1 sakamoto outw(0x3C4, 0x0700); /* reset ext sequence mode */
501 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
502 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
503 1.1 sakamoto setTextCLUT(); /* load color lookup table */
504 1.1 sakamoto loadFont(ISA_mem); /* load font */
505 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
506 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
507 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
508 1.1 sakamoto break;
509 1.1 sakamoto
510 1.5 junyoung case DiamondVendor:
511 1.5 junyoung case MatroxVendor:
512 1.1 sakamoto /*
513 1.1 sakamoto * The following code is almost enuf to get the Matrox
514 1.1 sakamoto * working (on a Moto box) but the video is not stable.
515 1.1 sakamoto * We probably need to tweak the TVP3026 Video PLL regs. PEK'97
516 1.1 sakamoto */
517 1.5 junyoung VgaTextRegs = GenVgaTextRegs;
518 1.1 sakamoto outw(0x3C4, 0x0120); /* disable video */
519 1.1 sakamoto setTextRegs(VgaTextRegs); /* initial register setup */
520 1.1 sakamoto setTextCLUT(); /* load color lookup table */
521 1.1 sakamoto loadFont(ISA_mem); /* load font */
522 1.1 sakamoto setTextRegs(VgaTextRegs); /* reload registers */
523 1.1 sakamoto outw(0x3C4, 0x0100); /* re-enable video */
524 1.1 sakamoto outb(0x3c2, 0x63); /* MISC */
525 1.5 junyoung delayLoop(1);
526 1.5 junyoung break;
527 1.1 sakamoto };
528 1.1 sakamoto
529 1.1 sakamoto #ifdef DEBUG
530 1.1 sakamoto printslots();
531 1.5 junyoung delayLoop(5);
532 1.1 sakamoto #endif
533 1.1 sakamoto delayLoop(2); /* give time for the video monitor to come up */
534 1.1 sakamoto }
535 1.1 sakamoto
536 1.1 sakamoto /*
537 1.5 junyoung * Write to VGA Attribute registers.
538 1.1 sakamoto */
539 1.4 sakamoto void
540 1.5 junyoung writeAttr(u_char index, u_char data, u_char videoOn)
541 1.1 sakamoto {
542 1.4 sakamoto u_char v;
543 1.1 sakamoto v = inb(0x3da); /* reset attr. address toggle */
544 1.1 sakamoto if (videoOn)
545 1.1 sakamoto outb(0x3c0, (index & 0x1F) | 0x20);
546 1.1 sakamoto else
547 1.1 sakamoto outb(0x3c0, (index & 0x1F));
548 1.1 sakamoto outb(0x3c0, data);
549 1.1 sakamoto }
550 1.1 sakamoto
551 1.4 sakamoto void
552 1.5 junyoung setTextRegs(struct VgaRegs *svp)
553 1.1 sakamoto {
554 1.1 sakamoto int i;
555 1.1 sakamoto
556 1.1 sakamoto /*
557 1.1 sakamoto * saved settings
558 1.5 junyoung */
559 1.4 sakamoto while (svp->io_port != ENDMK) {
560 1.1 sakamoto outb(svp->io_port, svp->io_index);
561 1.1 sakamoto outb(svp->io_port+1, svp->io_value);
562 1.5 junyoung svp++;
563 1.1 sakamoto }
564 1.1 sakamoto
565 1.1 sakamoto outb(0x3c2, 0x67); /* MISC */
566 1.1 sakamoto outb(0x3c6, 0xff); /* MASK */
567 1.1 sakamoto
568 1.4 sakamoto for (i = 0; i < 0x10; i++)
569 1.5 junyoung writeAttr(i, AC[i], 0); /* pallete */
570 1.5 junyoung writeAttr(0x10, 0x0c, 0); /* text mode */
571 1.5 junyoung writeAttr(0x11, 0x00, 0); /* overscan color (border) */
572 1.5 junyoung writeAttr(0x12, 0x0f, 0); /* plane enable */
573 1.5 junyoung writeAttr(0x13, 0x08, 0); /* pixel panning */
574 1.5 junyoung writeAttr(0x14, 0x00, 1); /* color select; video on */
575 1.1 sakamoto }
576 1.1 sakamoto
577 1.4 sakamoto void
578 1.5 junyoung setTextCLUT(void)
579 1.1 sakamoto {
580 1.1 sakamoto int i;
581 1.1 sakamoto
582 1.5 junyoung outb(0x3C6, 0xFF);
583 1.1 sakamoto i = inb(0x3C7);
584 1.5 junyoung outb(0x3C8, 0);
585 1.1 sakamoto i = inb(0x3C7);
586 1.1 sakamoto
587 1.4 sakamoto for (i = 0; i < 256; i++) {
588 1.1 sakamoto outb(0x3C9, TextCLUT[i].r);
589 1.1 sakamoto outb(0x3C9, TextCLUT[i].g);
590 1.1 sakamoto outb(0x3C9, TextCLUT[i].b);
591 1.1 sakamoto }
592 1.1 sakamoto }
593 1.1 sakamoto
594 1.4 sakamoto void
595 1.5 junyoung loadFont(u_char *ISA_mem)
596 1.1 sakamoto {
597 1.1 sakamoto int i, j;
598 1.4 sakamoto u_char *font_page = (u_char *)&ISA_mem[0xA0000];
599 1.5 junyoung
600 1.1 sakamoto outb(0x3C2, 0x67);
601 1.5 junyoung /*
602 1.5 junyoung * Load font
603 1.1 sakamoto */
604 1.5 junyoung i = inb(0x3DA); /* Reset Attr toggle */
605 1.1 sakamoto
606 1.5 junyoung outb(0x3C0,0x30);
607 1.5 junyoung outb(0x3C0, 0x01); /* graphics mode */
608 1.1 sakamoto
609 1.5 junyoung outw(0x3C4, 0x0001); /* reset sequencer */
610 1.5 junyoung outw(0x3C4, 0x0204); /* write to plane 2 */
611 1.5 junyoung outw(0x3C4, 0x0406); /* enable plane graphics */
612 1.5 junyoung outw(0x3C4, 0x0003); /* reset sequencer */
613 1.5 junyoung outw(0x3CE, 0x0402); /* read plane 2 */
614 1.5 junyoung outw(0x3CE, 0x0500); /* write mode 0, read mode 0 */
615 1.5 junyoung outw(0x3CE, 0x0605); /* set graphics mode */
616 1.1 sakamoto
617 1.1 sakamoto for (i = 0; i < sizeof(font); i += 16) {
618 1.1 sakamoto for (j = 0; j < 16; j++) {
619 1.8 perry __asm volatile("eieio");
620 1.1 sakamoto font_page[(2*i)+j] = font[i+j];
621 1.1 sakamoto }
622 1.1 sakamoto }
623 1.1 sakamoto }
624 1.1 sakamoto
625 1.1 sakamoto void
626 1.5 junyoung unlockS3(void)
627 1.1 sakamoto {
628 1.1 sakamoto /* From the S3 manual */
629 1.1 sakamoto outb(0x46E8, 0x10); /* Put into setup mode */
630 1.1 sakamoto outb(0x3C3, 0x10);
631 1.1 sakamoto outb(0x102, 0x01); /* Enable registers */
632 1.1 sakamoto outb(0x46E8, 0x08); /* Enable video */
633 1.1 sakamoto outb(0x3C3, 0x08);
634 1.1 sakamoto outb(0x4AE8, 0x00);
635 1.1 sakamoto
636 1.1 sakamoto outb(0x42E8, 0x80); /* Reset graphics engine? */
637 1.1 sakamoto
638 1.1 sakamoto outb(0x3D4, 0x38); /* Unlock all registers */
639 1.1 sakamoto outb(0x3D5, 0x48);
640 1.1 sakamoto outb(0x3D4, 0x39);
641 1.1 sakamoto outb(0x3D5, 0xA5);
642 1.1 sakamoto outb(0x3D4, 0x40);
643 1.1 sakamoto outb(0x3D5, inb(0x3D5)|0x01);
644 1.1 sakamoto outb(0x3D4, 0x33);
645 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x52);
646 1.1 sakamoto outb(0x3D4, 0x35);
647 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x30);
648 1.1 sakamoto outb(0x3D4, 0x3A);
649 1.1 sakamoto outb(0x3D5, 0x00);
650 1.1 sakamoto outb(0x3D4, 0x53);
651 1.1 sakamoto outb(0x3D5, 0x00);
652 1.1 sakamoto outb(0x3D4, 0x31);
653 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x4B);
654 1.1 sakamoto outb(0x3D4, 0x58);
655 1.1 sakamoto
656 1.1 sakamoto outb(0x3D5, 0);
657 1.1 sakamoto
658 1.1 sakamoto outb(0x3D4, 0x54);
659 1.1 sakamoto outb(0x3D5, 0x38);
660 1.1 sakamoto outb(0x3D4, 0x60);
661 1.1 sakamoto outb(0x3D5, 0x07);
662 1.1 sakamoto outb(0x3D4, 0x61);
663 1.1 sakamoto outb(0x3D5, 0x80);
664 1.1 sakamoto outb(0x3D4, 0x62);
665 1.1 sakamoto outb(0x3D5, 0xA1);
666 1.1 sakamoto outb(0x3D4, 0x69); /* High order bits for cursor address */
667 1.1 sakamoto outb(0x3D5, 0);
668 1.5 junyoung
669 1.1 sakamoto outb(0x3D4, 0x32);
670 1.1 sakamoto outb(0x3D5, inb(0x3D5)&~0x10);
671 1.1 sakamoto }
672 1.1 sakamoto
673 1.1 sakamoto /* ============ */
674 1.1 sakamoto
675 1.1 sakamoto
676 1.10.2.1 yamt #define NSLOTS 5
677 1.1 sakamoto #define NPCIREGS 5
678 1.1 sakamoto
679 1.4 sakamoto /*
680 1.5 junyoung * should use devfunc number/indirect method to be totally safe on
681 1.4 sakamoto * all machines, this works for now on 3 slot Moto boxes
682 1.1 sakamoto */
683 1.1 sakamoto
684 1.1 sakamoto struct PCI_ConfigInfo {
685 1.4 sakamoto u_long * config_addr;
686 1.4 sakamoto u_long regs[NPCIREGS];
687 1.1 sakamoto } PCI_slots [NSLOTS] = {
688 1.10.2.1 yamt { (u_long *)0x80800800, { 0xDE, 0xAD, 0xBE, 0xEF } },
689 1.10.2.1 yamt { (u_long *)0x80801000, { 0xDE, 0xAD, 0xBE, 0xEF } },
690 1.4 sakamoto { (u_long *)0x80802000, { 0xDE, 0xAD, 0xBE, 0xEF } },
691 1.4 sakamoto { (u_long *)0x80804000, { 0xDE, 0xAD, 0xBE, 0xEF } },
692 1.4 sakamoto { (u_long *)0x80808000, { 0xDE, 0xAD, 0xBE, 0xEF } },
693 1.1 sakamoto };
694 1.1 sakamoto
695 1.1 sakamoto
696 1.1 sakamoto /*
697 1.1 sakamoto * The following code modifies the PCI Command register
698 1.5 junyoung * to enable memory and I/O accesses.
699 1.5 junyoung */
700 1.4 sakamoto void
701 1.5 junyoung enablePCIvideo(int slot)
702 1.1 sakamoto {
703 1.10.2.1 yamt volatile u_char *ppci;
704 1.1 sakamoto
705 1.10.2.1 yamt ppci = (u_char *)PCI_slots[slot].config_addr;
706 1.10.2.1 yamt ppci[4] = 0x0003; /* enable memory and I/O accesses */
707 1.8 perry __asm volatile("eieio");
708 1.1 sakamoto
709 1.1 sakamoto outb(0x3d4, 0x11);
710 1.10.2.1 yamt outb(0x3d5, 0x0e); /* unlock CR0-CR7 */
711 1.1 sakamoto }
712 1.1 sakamoto
713 1.1 sakamoto #define DEVID 0
714 1.1 sakamoto #define CMD 1
715 1.1 sakamoto #define CLASS 2
716 1.1 sakamoto #define MEMBASE 4
717 1.1 sakamoto
718 1.1 sakamoto int
719 1.5 junyoung scanPCI(void)
720 1.1 sakamoto {
721 1.1 sakamoto int slt, r;
722 1.1 sakamoto struct PCI_ConfigInfo *pslot;
723 1.1 sakamoto int theSlot = -1;
724 1.1 sakamoto int highVgaSlot = -1;
725 1.1 sakamoto
726 1.4 sakamoto for (slt = 0; slt < NSLOTS; slt++) {
727 1.1 sakamoto pslot = &PCI_slots[slt];
728 1.4 sakamoto for (r = 0; r < NPCIREGS; r++) {
729 1.2 sakamoto pslot->regs[r] = bswap32(pslot->config_addr[r]);
730 1.1 sakamoto }
731 1.1 sakamoto
732 1.4 sakamoto if (pslot->regs[DEVID] != 0xFFFFFFFF) { /* card in slot ? */
733 1.4 sakamoto if ((pslot->regs[CLASS] & 0xFFFFFF00) == 0x03000000) { /* VGA ? */
734 1.1 sakamoto highVgaSlot = slt;
735 1.4 sakamoto if ((pslot->regs[CMD] & 0x03)) { /* did firmware enable it ? */
736 1.1 sakamoto theSlot = slt;
737 1.1 sakamoto }
738 1.1 sakamoto }
739 1.1 sakamoto }
740 1.1 sakamoto }
741 1.1 sakamoto
742 1.4 sakamoto if (theSlot == -1)
743 1.1 sakamoto theSlot = highVgaSlot;
744 1.1 sakamoto
745 1.5 junyoung return theSlot;
746 1.1 sakamoto }
747 1.1 sakamoto
748 1.1 sakamoto int
749 1.5 junyoung delayLoop(int k)
750 1.1 sakamoto {
751 1.1 sakamoto volatile int a, b;
752 1.1 sakamoto volatile int i, j;
753 1.1 sakamoto a = 0;
754 1.1 sakamoto do {
755 1.4 sakamoto for (i = 0; i < 500; i++) {
756 1.1 sakamoto b = i;
757 1.4 sakamoto for (j = 0; j < 200; j++) {
758 1.1 sakamoto a = b+j;
759 1.1 sakamoto }
760 1.1 sakamoto }
761 1.1 sakamoto } while (k--);
762 1.5 junyoung return a;
763 1.1 sakamoto }
764 1.1 sakamoto
765 1.1 sakamoto /* return Vendor ID of card in the slot */
766 1.5 junyoung static int
767 1.5 junyoung PCIVendor(int slotnum)
768 1.1 sakamoto {
769 1.1 sakamoto struct PCI_ConfigInfo *pslot;
770 1.1 sakamoto
771 1.1 sakamoto pslot = &PCI_slots[slotnum];
772 1.1 sakamoto
773 1.1 sakamoto return (pslot->regs[DEVID] & 0xFFFF);
774 1.1 sakamoto }
775 1.1 sakamoto
776 1.4 sakamoto #ifdef DEBUG
777 1.5 junyoung static void
778 1.5 junyoung printslots(void)
779 1.1 sakamoto {
780 1.1 sakamoto int i;
781 1.4 sakamoto for (i = 0; i < NSLOTS; i++) {
782 1.4 sakamoto printf("PCI Slot number: %d", i);
783 1.10 kiyohara printf(" Vendor ID: 0x%x\n", PCIVendor(i));
784 1.1 sakamoto }
785 1.1 sakamoto }
786 1.4 sakamoto #endif /* DEBUG */
787 1.1 sakamoto #endif /* CONS_VGA */
788