isapnpdebug.c revision 1.5 1 /* $NetBSD: isapnpdebug.c,v 1.5 1998/09/05 14:15:25 christos Exp $ */
2
3 /*-
4 * Copyright (c) 1996 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Christos Zoulas.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 #ifdef DEBUG_ISAPNP
40
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/device.h>
44
45 #include <machine/bus.h>
46
47 #include <dev/isa/isavar.h>
48
49 #include <dev/isapnp/isapnpreg.h>
50 #include <dev/isapnp/isapnpvar.h>
51
52 /* isapnp_print_mem():
53 * Print a memory tag
54 */
55 void
56 isapnp_print_mem(str, mem)
57 const char *str;
58 const struct isapnp_region *mem;
59 {
60 printf("%sMemory: %s,%sshadowable,decode-%s,%scacheable,%s", str,
61 (mem->flags & ISAPNP_MEMATTR_ROM) ? "ROM," : "RAM,",
62 (mem->flags & ISAPNP_MEMATTR_SHADOWABLE) ? "" : "non-",
63 (mem->flags & ISAPNP_MEMATTR_HIGH_ADDR) ?
64 "high-addr," : "range-len,",
65 (mem->flags & ISAPNP_MEMATTR_CACHEABLE) ? "" : "non-",
66 (mem->flags & ISAPNP_MEMATTR_WRITEABLE) ?
67 "writeable," : "read-only,");
68
69 switch (mem->flags & ISAPNP_MEMWIDTH_MASK) {
70 case ISAPNP_MEMWIDTH_8:
71 printf("8-bit ");
72 break;
73 case ISAPNP_MEMWIDTH_16:
74 printf("16-bit ");
75 break;
76 case ISAPNP_MEMWIDTH_8_16:
77 printf("8/16-bit ");
78 break;
79 case ISAPNP_MEMWIDTH_32:
80 printf("32-bit ");
81 break;
82 }
83
84 printf("min 0x%x, max 0x%x, ", mem->minbase, mem->maxbase);
85 printf("align 0x%x, length 0x%x\n", mem->align, mem->length);
86 }
87
88
89 /* isapnp_print_io():
90 * Print an io tag
91 */
92 void
93 isapnp_print_io(str, io)
94 const char *str;
95 const struct isapnp_region *io;
96 {
97 printf("%d %sIO Ports: %d address bits, alignment %d ",
98 io->length, str, (io->flags & ISAPNP_IOFLAGS_16) ? 16 : 10,
99 io->align);
100
101 printf("min 0x%x, max 0x%x\n", io->minbase, io->maxbase);
102 }
103
104
105 /* isapnp_print_irq():
106 * Print an irq tag
107 */
108 void
109 isapnp_print_irq(str, irq)
110 const char *str;
111 const struct isapnp_pin *irq;
112 {
113 int i;
114
115 printf("%sIRQ's supported: ", str);
116 for (i = 0; i < 16; i++)
117 if (irq->bits & (1 << i))
118 printf("%d ", i);
119
120 if (irq->flags & ISAPNP_IRQTYPE_EDGE_PLUS)
121 printf("E+");
122 if (irq->flags & ISAPNP_IRQTYPE_EDGE_MINUS)
123 printf("E-");
124 if (irq->flags & ISAPNP_IRQTYPE_LEVEL_PLUS)
125 printf("L+");
126 if (irq->flags & ISAPNP_IRQTYPE_LEVEL_MINUS)
127 printf("L-");
128 printf("\n");
129 }
130
131 /* isapnp_print_drq():
132 * Print a drq tag
133 */
134 void
135 isapnp_print_drq(str, drq)
136 const char *str;
137 const struct isapnp_pin *drq;
138 {
139 int i;
140 u_char flags = drq->flags;
141
142 printf("%sDRQ's supported: ", str);
143 for (i = 0; i < 8; i++)
144 if (drq->bits & (1 << i))
145 printf("%d ", i);
146
147 printf("Width: ");
148 switch (flags & ISAPNP_DMAWIDTH_MASK) {
149 case ISAPNP_DMAWIDTH_8:
150 printf("8-bit ");
151 break;
152 case ISAPNP_DMAWIDTH_8_16:
153 printf("8/16-bit ");
154 break;
155 case ISAPNP_DMAWIDTH_16:
156 printf("16-bit ");
157 break;
158 case ISAPNP_DMAWIDTH_RESERVED:
159 printf("Reserved ");
160 break;
161 }
162
163 printf("Speed: ");
164 switch (flags & ISAPNP_DMASPEED_MASK) {
165 case ISAPNP_DMASPEED_COMPAT:
166 printf("compat ");
167 break;
168 case ISAPNP_DMASPEED_A:
169 printf("A ");
170 break;
171 case ISAPNP_DMASPEED_B:
172 printf("B ");
173 break;
174 case ISAPNP_DMASPEED_F:
175 printf("F ");
176 break;
177 }
178
179 if (flags & ISAPNP_DMAATTR_MASK)
180 printf("Attributes: %s%s%s",
181 (flags & ISAPNP_DMAATTR_BUS_MASTER) ? "bus master " : "",
182 (flags & ISAPNP_DMAATTR_INCR_8) ? "incr 8 " : "",
183 (flags & ISAPNP_DMAATTR_INCR_16) ? "incr 16 " : "");
184 printf("\n");
185 }
186
187
188 /* isapnp_print_dep_start():
189 * Print a start dependencies tag
190 */
191 void
192 isapnp_print_dep_start(str, pref)
193 const char *str;
194 const u_char pref;
195 {
196
197 printf("%sconfig: ", str);
198 switch (pref) {
199 case ISAPNP_DEP_PREFERRED:
200 printf("preferred\n");
201 break;
202
203 case ISAPNP_DEP_ACCEPTABLE:
204 printf("acceptable\n");
205 break;
206
207 case ISAPNP_DEP_FUNCTIONAL:
208 printf("functional\n");
209 break;
210
211 case ISAPNP_DEP_UNSET: /* Used internally */
212 printf("unset\n");
213 break;
214
215 case ISAPNP_DEP_CONFLICTING: /* Used internally */
216 printf("conflicting\n");
217 break;
218
219 default:
220 printf("invalid\n");
221 break;
222 }
223 }
224
225 void
226 isapnp_print_attach(pa)
227 const struct isapnp_attach_args *pa;
228 {
229 int i;
230
231 printf("Found <%s, %s, %s, %s> ", pa->ipa_devident,
232 pa->ipa_devlogic, pa->ipa_devcompat, pa->ipa_devclass);
233 isapnp_print_dep_start("", pa->ipa_pref);
234
235 for (i = 0; i < pa->ipa_nio; i++)
236 isapnp_print_io("", &pa->ipa_io[i]);
237
238 for (i = 0; i < pa->ipa_nmem; i++)
239 isapnp_print_mem("", &pa->ipa_mem[i]);
240
241 for (i = 0; i < pa->ipa_nirq; i++)
242 isapnp_print_irq("", &pa->ipa_irq[i]);
243
244 for (i = 0; i < pa->ipa_ndrq; i++)
245 isapnp_print_drq("", &pa->ipa_drq[i]);
246
247 for (i = 0; i < pa->ipa_nmem32; i++)
248 isapnp_print_mem("", &pa->ipa_mem32[i]);
249 }
250
251
252 /* isapnp_get_config():
253 * Get the current configuration of the card
254 */
255 void
256 isapnp_get_config(sc, pa)
257 struct isapnp_softc *sc;
258 struct isapnp_attach_args *pa;
259 {
260 int i;
261 u_char v0, v1, v2, v3;
262 static u_char isapnp_mem_range[] = ISAPNP_MEM_DESC;
263 static u_char isapnp_io_range[] = ISAPNP_IO_DESC;
264 static u_char isapnp_irq_range[] = ISAPNP_IRQ_DESC;
265 static u_char isapnp_drq_range[] = ISAPNP_DRQ_DESC;
266 static u_char isapnp_mem32_range[] = ISAPNP_MEM32_DESC;
267 struct isapnp_region *r;
268 struct isapnp_pin *p;
269
270 memset(pa, 0, sizeof(*pa));
271
272 for (i = 0; i < sizeof(isapnp_io_range); i++) {
273 r = &pa->ipa_io[i];
274 v0 = isapnp_read_reg(sc,
275 isapnp_io_range[i] + ISAPNP_IO_BASE_15_8);
276 v1 = isapnp_read_reg(sc,
277 isapnp_io_range[i] + ISAPNP_IO_BASE_7_0);
278 r->base = (v0 << 8) | v1;
279 if (r->base == 0)
280 break;
281 }
282 pa->ipa_nio = i;
283
284 for (i = 0; i < sizeof(isapnp_mem_range); i++) {
285 r = &pa->ipa_mem[i];
286 v0 = isapnp_read_reg(sc,
287 isapnp_mem_range[i] + ISAPNP_MEM_BASE_23_16);
288 v1 = isapnp_read_reg(sc,
289 isapnp_mem_range[i] + ISAPNP_MEM_BASE_15_8);
290 r->base = (v0 << 16) | (v1 << 8);
291 if (r->base == 0)
292 break;
293
294 v0 = isapnp_read_reg(sc,
295 isapnp_mem_range[i] + ISAPNP_MEM_LRANGE_23_16);
296 v1 = isapnp_read_reg(sc,
297 isapnp_mem_range[i] + ISAPNP_MEM_LRANGE_15_8);
298 r->length = (v0 << 16) | (v1 << 8);
299 v0 = isapnp_read_reg(sc,
300 isapnp_mem_range[i] + ISAPNP_MEM_CONTROL);
301 r->flags = 0;
302 if (v0 & ISAPNP_MEM_CONTROL_LIMIT)
303 r->flags |= ISAPNP_MEMATTR_HIGH_ADDR;
304 if (v0 & ISAPNP_MEM_CONTROL_16)
305 r->flags |= ISAPNP_MEMWIDTH_16;
306 }
307 pa->ipa_nmem = i;
308
309 for (i = 0; i < sizeof(isapnp_irq_range); i++) {
310 v0 = isapnp_read_reg(sc,
311 isapnp_irq_range[i] + ISAPNP_IRQ_NUMBER);
312 p = &pa->ipa_irq[i];
313 p->num = v0 & 0xf;
314 if (p->num == 0)
315 break;
316
317 switch (v0 & (ISAPNP_IRQ_LEVEL|ISAPNP_IRQ_HIGH)) {
318 case ISAPNP_IRQ_LEVEL|ISAPNP_IRQ_HIGH:
319 p->flags = ISAPNP_IRQTYPE_LEVEL_PLUS;
320 break;
321 case ISAPNP_IRQ_HIGH:
322 p->flags = ISAPNP_IRQTYPE_EDGE_PLUS;
323 break;
324 case ISAPNP_IRQ_LEVEL:
325 p->flags = ISAPNP_IRQTYPE_LEVEL_MINUS;
326 break;
327 default:
328 p->flags = ISAPNP_IRQTYPE_EDGE_MINUS;
329 break;
330 }
331 }
332 pa->ipa_nirq = i;
333
334 for (i = 0; i < sizeof(isapnp_drq_range); i++) {
335 v0 = isapnp_read_reg(sc, isapnp_drq_range[i]);
336 p = &pa->ipa_drq[i];
337 p->num = v0 & 0xf;
338 if (p->num == 4)
339 break;
340 }
341 pa->ipa_ndrq = i;
342
343 for (i = 0; i < sizeof(isapnp_mem32_range); i++) {
344 r = &pa->ipa_mem32[i];
345 v0 = isapnp_read_reg(sc,
346 isapnp_mem32_range[i] + ISAPNP_MEM32_BASE_31_24);
347 v1 = isapnp_read_reg(sc,
348 isapnp_mem32_range[i] + ISAPNP_MEM32_BASE_23_16);
349 v2 = isapnp_read_reg(sc,
350 isapnp_mem32_range[i] + ISAPNP_MEM32_BASE_15_8);
351 v3 = isapnp_read_reg(sc,
352 isapnp_mem32_range[i] + ISAPNP_MEM32_BASE_7_0);
353 r->base = (v0 << 24) | (v1 << 16) | (v2 << 8) | v3;
354 if (r->base == 0)
355 break;
356
357 v0 = isapnp_read_reg(sc,
358 isapnp_mem32_range[i] + ISAPNP_MEM32_LRANGE_31_24);
359 v1 = isapnp_read_reg(sc,
360 isapnp_mem32_range[i] + ISAPNP_MEM32_LRANGE_23_16);
361 v2 = isapnp_read_reg(sc,
362 isapnp_mem32_range[i] + ISAPNP_MEM32_LRANGE_15_8);
363 v3 = isapnp_read_reg(sc,
364 isapnp_mem32_range[i] + ISAPNP_MEM32_LRANGE_7_0);
365 r->length = (v0 << 24) | (v1 << 16) | (v2 << 8) | v3;
366 v0 = isapnp_read_reg(sc,
367 isapnp_mem_range[i] + ISAPNP_MEM_CONTROL);
368 r->flags = v0;
369 }
370 pa->ipa_nmem32 = i;
371 }
372
373
374 /* isapnp_print_config():
375 * Print the current configuration of the card
376 */
377 void
378 isapnp_print_config(pa)
379 const struct isapnp_attach_args *pa;
380 {
381 int i;
382 const struct isapnp_region *r;
383 const struct isapnp_pin *p;
384
385 printf("Register configuration:\n");
386 if (pa->ipa_nio)
387 for (i = 0; i < pa->ipa_nio; i++) {
388 r = &pa->ipa_io[i];
389 printf("io[%d]: 0x%x/%d\n", i, r->base, r->length);
390 }
391
392 if (pa->ipa_nmem)
393 for (i = 0; i < pa->ipa_nmem; i++) {
394 r = &pa->ipa_mem[i];
395 printf("mem[%d]: 0x%x/%d\n", i, r->base, r->length);
396 }
397
398 if (pa->ipa_nirq)
399 for (i = 0; i < pa->ipa_nirq; i++) {
400 p = &pa->ipa_irq[i];
401 printf("irq[%d]: %d\n", i, p->num);
402 }
403
404 if (pa->ipa_ndrq)
405 for (i = 0; i < pa->ipa_ndrq; i++) {
406 p = &pa->ipa_drq[i];
407 printf("drq[%d]: %d\n", i, p->num);
408 }
409
410 if (pa->ipa_nmem32)
411 for (i = 0; i < pa->ipa_nmem32; i++) {
412 r = &pa->ipa_mem32[i];
413 printf("mem32[%d]: 0x%x/%d\n", i, r->base, r->length);
414 }
415 }
416
417 #endif
418