nubus.c revision 1.10 1 1.10 briggs /* $NetBSD: nubus.c,v 1.10 1995/04/21 02:47:59 briggs Exp $ */
2 1.8 cgd
3 1.1 briggs /*-
4 1.1 briggs * Copyright (C) 1993 Allen K. Briggs, Chris P. Caputo,
5 1.1 briggs * Michael L. Finch, Bradley A. Grantham, and
6 1.1 briggs * Lawrence A. Kesteloot
7 1.1 briggs * All rights reserved.
8 1.1 briggs *
9 1.1 briggs * Redistribution and use in source and binary forms, with or without
10 1.1 briggs * modification, are permitted provided that the following conditions
11 1.1 briggs * are met:
12 1.1 briggs * 1. Redistributions of source code must retain the above copyright
13 1.1 briggs * notice, this list of conditions and the following disclaimer.
14 1.1 briggs * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 briggs * notice, this list of conditions and the following disclaimer in the
16 1.1 briggs * documentation and/or other materials provided with the distribution.
17 1.1 briggs * 3. All advertising materials mentioning features or use of this software
18 1.1 briggs * must display the following acknowledgement:
19 1.1 briggs * This product includes software developed by the Alice Group.
20 1.1 briggs * 4. The names of the Alice Group or any of its members may not be used
21 1.1 briggs * to endorse or promote products derived from this software without
22 1.1 briggs * specific prior written permission.
23 1.1 briggs *
24 1.1 briggs * THIS SOFTWARE IS PROVIDED BY THE ALICE GROUP ``AS IS'' AND ANY EXPRESS OR
25 1.1 briggs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 1.1 briggs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 1.1 briggs * IN NO EVENT SHALL THE ALICE GROUP BE LIABLE FOR ANY DIRECT, INDIRECT,
28 1.1 briggs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 1.1 briggs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 1.1 briggs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 1.1 briggs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 1.1 briggs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 1.1 briggs * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 1.1 briggs */
35 1.1 briggs
36 1.4 briggs #include <sys/param.h>
37 1.4 briggs #include <sys/systm.h>
38 1.10 briggs #include <sys/device.h>
39 1.10 briggs
40 1.4 briggs #include <machine/cpu.h>
41 1.1 briggs
42 1.1 briggs #include "nubus.h"
43 1.1 briggs
44 1.10 briggs static struct dir *getRsrcByNum __P((struct slot *slot, struct dir *p,
45 1.10 briggs int num, struct dir *out, int max));
46 1.10 briggs static int print_rsrcinfo __P((struct slot *slot, struct dir *p));
47 1.10 briggs static char *GetStringInfo __P((struct slot *slot, u_char *data1,
48 1.10 briggs char *space, int len));
49 1.10 briggs static int printTree __P((struct slot *slot, struct dir *root));
50 1.10 briggs static long GetLongInfo __P((struct slot *slot, u_char *data));
51 1.10 briggs static int FindMagic __P((u_long *data));
52 1.10 briggs static int GetHeader __P((struct slot *slot, u_long pos));
53 1.10 briggs static u_char *IncPtr __P((struct slot *slot, u_char *p, int size));
54 1.10 briggs static char GetByteInfo __P((struct slot *slot, u_char *data));
55 1.10 briggs static int GetRsrcs __P((struct slot *slot, u_char *p,
56 1.10 briggs struct dir *dir, int maxdir));
57 1.10 briggs static u_char *getDataAtRsrc __P((struct slot *slot, struct dir *p, int num));
58 1.10 briggs static short GetShortInfo __P((struct slot *slot, u_char *data));
59 1.10 briggs
60 1.10 briggs static int
61 1.10 briggs GetHeader(slot, pos)
62 1.10 briggs struct slot *slot;
63 1.10 briggs u_long pos;
64 1.1 briggs {
65 1.10 briggs /* the pos passed in is the pos that the magic testvalue was found at */
66 1.10 briggs u_char *p;
67 1.10 briggs u_char *dirBase;
68 1.1 briggs
69 1.10 briggs switch (slot->size) {
70 1.10 briggs case 1: /* char */
71 1.10 briggs pos -= 14;
72 1.10 briggs break;
73 1.10 briggs case 2:
74 1.10 briggs pos -= 28;
75 1.10 briggs break;
76 1.10 briggs case 4:
77 1.10 briggs pos -= 56;
78 1.10 briggs break;
79 1.10 briggs }
80 1.1 briggs
81 1.10 briggs p = (u_char *) pos;
82 1.1 briggs
83 1.10 briggs slot->head.offset = (0xff000000 | (u_long) GetLongInfo(slot, p));
84 1.10 briggs p = IncPtr(slot, p, 4);
85 1.1 briggs
86 1.10 briggs slot->head.length = GetLongInfo(slot, p);
87 1.10 briggs p = IncPtr(slot, p, 4);
88 1.1 briggs
89 1.10 briggs slot->head.crc = GetLongInfo(slot, p);
90 1.10 briggs p = IncPtr(slot, p, 4);
91 1.1 briggs
92 1.10 briggs slot->head.romrev = GetByteInfo(slot, p);
93 1.10 briggs p = IncPtr(slot, p, 1);
94 1.1 briggs
95 1.10 briggs slot->head.format = GetByteInfo(slot, p);
96 1.10 briggs p = IncPtr(slot, p, 1);
97 1.1 briggs
98 1.10 briggs slot->head.tst = GetLongInfo(slot, p);
99 1.10 briggs p = IncPtr(slot, p, 4);
100 1.1 briggs
101 1.10 briggs slot->head.reserved = GetByteInfo(slot, p);
102 1.10 briggs p = IncPtr(slot, p, 1);
103 1.1 briggs
104 1.10 briggs /* byte lanes should be used instead of size, this hasn't bitten me yet */
105 1.10 briggs slot->head.bytelane = GetByteInfo(slot, p);
106 1.10 briggs p = IncPtr(slot, p, 1);
107 1.1 briggs
108 1.10 briggs dirBase = (u_char *) (pos + slot->head.offset * slot->size);
109 1.10 briggs GetRsrcs(slot, dirBase, slot->mainDir, 15);
110 1.1 briggs return 0;
111 1.1 briggs }
112 1.1 briggs
113 1.10 briggs static int
114 1.10 briggs printTree(slot, root)
115 1.10 briggs struct slot *slot;
116 1.10 briggs struct dir *root;
117 1.1 briggs {
118 1.1 briggs struct dir *b;
119 1.10 briggs u_char *c;
120 1.1 briggs struct dir *d;
121 1.10 briggs u_char *e;
122 1.1 briggs struct dir *f;
123 1.10 briggs u_char *g;
124 1.1 briggs struct dir *h;
125 1.10 briggs u_char *i;
126 1.10 briggs u_char *j;
127 1.10 briggs u_char *k;
128 1.1 briggs struct dir bSpace[15];
129 1.1 briggs struct dir cSpace[15];
130 1.1 briggs struct dir dSpace[15];
131 1.1 briggs struct dir fSpace[15];
132 1.1 briggs struct dir hSpace[15];
133 1.10 briggs char space[40];
134 1.1 briggs /* to get a good idea of what is happening here you should get the
135 1.10 briggs "slots" program from apple dts, it is so cool. Its the next
136 1.1 briggs best thing to actual docs, which i didn't have...
137 1.1 briggs */
138 1.10 briggs
139 1.10 briggs b = getRsrcByNum(slot, root, 1, bSpace, 15);
140 1.10 briggs c = getDataAtRsrc(slot, b, 2);
141 1.10 briggs d = getRsrcByNum(slot, b, 0x24, dSpace, 15);
142 1.10 briggs
143 1.10 briggs e = getDataAtRsrc(slot, d, 1);
144 1.10 briggs
145 1.10 briggs f = getRsrcByNum(slot, root, 0x80, fSpace, 15);
146 1.10 briggs g = getDataAtRsrc(slot, f, 2);
147 1.10 briggs j = getDataAtRsrc(slot, f, 0x0a);
148 1.10 briggs k = getDataAtRsrc(slot, f, 0x0b);
149 1.10 briggs
150 1.10 briggs h = getRsrcByNum(slot, root, 0xa0, hSpace, 15);
151 1.10 briggs i = getDataAtRsrc(slot, h, 2);
152 1.1 briggs
153 1.1 briggs printf("A\n");
154 1.10 briggs print_rsrcinfo(slot, root);
155 1.1 briggs
156 1.1 briggs printf("B\n");
157 1.10 briggs print_rsrcinfo(slot, b);
158 1.10 briggs
159 1.1 briggs printf("C\n");
160 1.10 briggs printf("%s\n", GetStringInfo(slot, c, space, 40));
161 1.1 briggs
162 1.1 briggs printf("D\n");
163 1.10 briggs print_rsrcinfo(slot, d);
164 1.10 briggs
165 1.1 briggs printf("E\n");
166 1.10 briggs printf("%s\n", GetStringInfo(slot, e, space, 40));
167 1.10 briggs
168 1.1 briggs printf("F\n");
169 1.10 briggs print_rsrcinfo(slot, f);
170 1.10 briggs
171 1.1 briggs printf("g\n");
172 1.10 briggs printf("%s\n", GetStringInfo(slot, g, space, 40));
173 1.10 briggs printf("Video RAM Base %lx\n", GetLongInfo(slot, j));
174 1.10 briggs printf("Video RAM Length %lx\n", GetLongInfo(slot, k));
175 1.1 briggs
176 1.1 briggs printf("H\n");
177 1.10 briggs print_rsrcinfo(slot, h);
178 1.1 briggs
179 1.1 briggs printf("I\n");
180 1.10 briggs printf("%s\n", GetStringInfo(slot, i, space, 40));
181 1.1 briggs }
182 1.1 briggs
183 1.10 briggs static int
184 1.10 briggs print_rsrcinfo(slot, p)
185 1.10 briggs struct slot *slot;
186 1.10 briggs struct dir *p;
187 1.10 briggs {
188 1.10 briggs int i = 0;
189 1.10 briggs int failsafe = 20;
190 1.1 briggs
191 1.10 briggs if (p == NULL)
192 1.10 briggs return 1;
193 1.10 briggs while (failsafe--) {
194 1.10 briggs printf("RSRC %02x :%06lx\n", p[i].rsrc, p[i].offset);
195 1.10 briggs if (p[i].rsrc == 0xff)
196 1.10 briggs break;
197 1.1 briggs i++;
198 1.1 briggs }
199 1.1 briggs
200 1.1 briggs }
201 1.1 briggs
202 1.10 briggs static struct dir *
203 1.10 briggs getRsrcByNum(slot, p, num, out, max)
204 1.10 briggs struct slot *slot;
205 1.10 briggs struct dir *p;
206 1.10 briggs int num;
207 1.10 briggs struct dir *out;
208 1.10 briggs int max;
209 1.1 briggs {
210 1.10 briggs int i = 0;
211 1.10 briggs int failsafe = 20;
212 1.10 briggs long nextoffset = 0;
213 1.10 briggs u_char *base;
214 1.10 briggs
215 1.10 briggs if (p == NULL)
216 1.10 briggs return NULL;
217 1.10 briggs
218 1.10 briggs
219 1.10 briggs base = getDataAtRsrc(slot, p, num);
220 1.10 briggs
221 1.10 briggs if (NULL == base)
222 1.10 briggs return NULL;
223 1.10 briggs
224 1.10 briggs GetRsrcs(slot, base, out, max);
225 1.10 briggs
226 1.1 briggs return out;
227 1.1 briggs }
228 1.1 briggs
229 1.10 briggs static char *
230 1.10 briggs GetStringInfo(slot, data, space, len)
231 1.10 briggs struct slot *slot;
232 1.10 briggs u_char *data;
233 1.10 briggs char *space;
234 1.10 briggs int len;
235 1.1 briggs {
236 1.1 briggs int i;
237 1.10 briggs char *p = space;
238 1.10 briggs
239 1.10 briggs if (NULL == data)
240 1.10 briggs return "";
241 1.10 briggs
242 1.10 briggs for (i = 0; (i < len) && *data; i++, p++) {
243 1.10 briggs *p = GetByteInfo(slot, data);
244 1.10 briggs data = IncPtr(slot, data, 1);
245 1.1 briggs }
246 1.10 briggs *p = '\0';
247 1.1 briggs return space;
248 1.1 briggs }
249 1.1 briggs
250 1.10 briggs static long
251 1.10 briggs GetLongInfo(slot, data)
252 1.10 briggs struct slot *slot;
253 1.10 briggs u_char *data;
254 1.10 briggs {
255 1.10 briggs long ret = 0;
256 1.10 briggs
257 1.10 briggs switch (slot->size) {
258 1.10 briggs case 1:
259 1.10 briggs ret = (u_long) data[0] << 24 | (u_long) data[1] << 16
260 1.10 briggs | (u_long) data[2] << 8 | data[3];
261 1.10 briggs break;
262 1.10 briggs case 2:
263 1.10 briggs ret = (u_long) data[0] << 24 | (u_long) data[2] << 16
264 1.10 briggs | (u_long) data[4] << 8 | data[6];
265 1.10 briggs break;
266 1.10 briggs case 4:
267 1.10 briggs ret = (u_long) data[0] << 24 | (u_long) data[4] << 16
268 1.10 briggs | (u_long) data[8] << 8 | data[12];
269 1.10 briggs break;
270 1.1 briggs }
271 1.10 briggs
272 1.1 briggs return ret;
273 1.1 briggs }
274 1.1 briggs
275 1.10 briggs static short
276 1.10 briggs GetShortInfo(slot, data)
277 1.10 briggs struct slot *slot;
278 1.10 briggs u_char *data;
279 1.10 briggs {
280 1.10 briggs short ret;
281 1.10 briggs
282 1.10 briggs switch (slot->size) {
283 1.10 briggs case 1:
284 1.10 briggs ret = (u_long) data[0] << 8 | data[1];
285 1.10 briggs break;
286 1.10 briggs case 2:
287 1.10 briggs ret = (u_long) data[0] << 8 | data[2];
288 1.10 briggs break;
289 1.10 briggs case 4:
290 1.10 briggs ret = (u_long) data[0] << 8 | data[4];
291 1.10 briggs break;
292 1.1 briggs }
293 1.10 briggs
294 1.1 briggs return ret;
295 1.1 briggs }
296 1.1 briggs
297 1.10 briggs static char
298 1.10 briggs GetByteInfo(slot, data)
299 1.10 briggs struct slot *slot;
300 1.10 briggs u_char *data;
301 1.1 briggs {
302 1.10 briggs /* boring .... */
303 1.1 briggs return data[0];
304 1.1 briggs }
305 1.1 briggs
306 1.1 briggs
307 1.10 briggs static int
308 1.10 briggs FindMagic(data)
309 1.10 briggs u_long data[];
310 1.1 briggs {
311 1.10 briggs u_short *data2;
312 1.10 briggs u_char *data3 = (u_char *) data;
313 1.10 briggs
314 1.10 briggs data2 = (u_short *) data;
315 1.10 briggs data3 = (u_char *) data;
316 1.1 briggs
317 1.1 briggs /* char data */
318 1.10 briggs if (((data3[0]) == 0x5a) &&
319 1.10 briggs ((data3[1]) == 0x93) &&
320 1.10 briggs ((data3[2]) == 0x2b) &&
321 1.10 briggs ((data3[3]) == 0xc7))
322 1.1 briggs return 1;
323 1.10 briggs
324 1.1 briggs /* short data */
325 1.10 briggs if (((data3[0]) == 0x5a) &&
326 1.10 briggs ((data3[2]) == 0x93) &&
327 1.10 briggs ((data3[4]) == 0x2b) &&
328 1.10 briggs ((data3[6]) == 0xc7))
329 1.1 briggs return 2;
330 1.10 briggs
331 1.1 briggs /* long data */
332 1.10 briggs if (((data3[0]) == 0x5a) &&
333 1.10 briggs ((data3[4]) == 0x93) &&
334 1.10 briggs ((data3[8]) == 0x2b) &&
335 1.10 briggs ((data3[12]) == 0xc7))
336 1.1 briggs return 4;
337 1.1 briggs
338 1.1 briggs return 0;
339 1.1 briggs }
340 1.1 briggs
341 1.10 briggs static u_char *
342 1.10 briggs IncPtr(slot, p, size)
343 1.10 briggs struct slot *slot;
344 1.10 briggs u_char *p;
345 1.10 briggs int size;
346 1.1 briggs {
347 1.10 briggs u_char *tmp;
348 1.10 briggs
349 1.10 briggs tmp = p + size * slot->size;
350 1.1 briggs
351 1.1 briggs return tmp;
352 1.1 briggs }
353 1.1 briggs
354 1.10 briggs static int
355 1.10 briggs GetRsrcs(slot, p, dir, maxdir)
356 1.10 briggs struct slot *slot;
357 1.10 briggs u_char *p;
358 1.10 briggs struct dir *dir;
359 1.10 briggs int maxdir;
360 1.1 briggs {
361 1.10 briggs int i = 0;
362 1.10 briggs
363 1.10 briggs if (p == NULL)
364 1.10 briggs return 1;
365 1.10 briggs
366 1.10 briggs while (maxdir--) {
367 1.10 briggs long entry;
368 1.10 briggs
369 1.10 briggs entry = GetLongInfo(slot, p);
370 1.10 briggs
371 1.10 briggs dir[i].rsrc = (entry & 0xff000000) >> 24;
372 1.10 briggs dir[i].offset = entry & 0x00ffffff;
373 1.10 briggs dir[i].base = (u_long) p;
374 1.10 briggs p = IncPtr(slot, p, 4);
375 1.10 briggs if (dir[i].rsrc == 0xff)
376 1.1 briggs break;
377 1.1 briggs i++;
378 1.1 briggs }
379 1.1 briggs
380 1.1 briggs return 0;
381 1.1 briggs }
382 1.1 briggs
383 1.10 briggs static u_char *
384 1.10 briggs getDataAtRsrc(slot, p, num)
385 1.10 briggs struct slot *slot;
386 1.10 briggs struct dir *p;
387 1.10 briggs int num;
388 1.10 briggs {
389 1.10 briggs int i = 0;
390 1.10 briggs int failsafe = num;
391 1.10 briggs long nextoffset = 0;
392 1.10 briggs u_char *base;
393 1.10 briggs
394 1.10 briggs if (p == NULL)
395 1.10 briggs return NULL;
396 1.10 briggs
397 1.10 briggs while (failsafe--) {
398 1.10 briggs if (p[i].rsrc == num) {
399 1.10 briggs base = (u_char *) ((u_long) slot->size * p[i].offset +
400 1.10 briggs (u_long) p[i].base);
401 1.1 briggs return base;
402 1.1 briggs }
403 1.10 briggs if (p[i].rsrc == 0xff)
404 1.10 briggs return NULL;
405 1.1 briggs i++;
406 1.1 briggs }
407 1.1 briggs
408 1.1 briggs return NULL;
409 1.1 briggs }
410 1.1 briggs
411 1.1 briggs
412 1.10 briggs static int
413 1.10 briggs InitNubusSlot(slotaddr, newslot)
414 1.10 briggs u_long slotaddr;
415 1.10 briggs struct slot *newslot;
416 1.1 briggs {
417 1.10 briggs int i = 0;
418 1.10 briggs struct slot slot;
419 1.1 briggs struct dir *b;
420 1.1 briggs struct dir bSpace[5];
421 1.1 briggs struct dir *d;
422 1.1 briggs struct dir dSpace[5];
423 1.1 briggs struct dir *f;
424 1.1 briggs struct dir fSpace[5];
425 1.10 briggs u_char *c;
426 1.10 briggs u_char *e;
427 1.10 briggs u_char *g;
428 1.10 briggs u_long slotend;
429 1.10 briggs
430 1.10 briggs slotend = slotaddr + NBMEMSIZE - 1;
431 1.10 briggs
432 1.10 briggs /*
433 1.10 briggs * If magic is not on the card, then we will quite likely bus error,
434 1.10 briggs * because we will read a long word when there are only 3 bytes left
435 1.10 briggs * on the card, unless there is a card in the next slot that has
436 1.10 briggs * readable memory starting at 0, so more than likely we crash. Oh well.
437 1.10 briggs *
438 1.10 briggs * The directory and the rest of the card can be in different formats.
439 1.10 briggs * This code won't handle that case.
440 1.10 briggs */
441 1.10 briggs for (i = 5; i < 100; i++) {
442 1.10 briggs if (slot.size = FindMagic((u_long *) (slotend - i))) {
443 1.10 briggs GetHeader(&slot, slotend - i);
444 1.1 briggs break;
445 1.1 briggs }
446 1.1 briggs }
447 1.10 briggs
448 1.10 briggs if (slot.size) {
449 1.10 briggs b = getRsrcByNum(&slot, slot.mainDir, 1, bSpace, 5);
450 1.10 briggs c = getDataAtRsrc(&slot, b, 2);
451 1.10 briggs d = getRsrcByNum(&slot, b, 0x24, dSpace, 5);
452 1.10 briggs e = getDataAtRsrc(&slot, d, 1);
453 1.10 briggs f = getRsrcByNum(&slot, slot.mainDir, 0x80, fSpace, 5);
454 1.10 briggs g = getDataAtRsrc(&slot, f, 1);
455 1.10 briggs GetStringInfo(&slot, c, slot.name, 40);
456 1.10 briggs
457 1.10 briggs GetStringInfo(&slot, e, slot.manufacturer, 40);
458 1.10 briggs
459 1.1 briggs /* info here is two long words (cat,type,drvrsw,drvrhw) */
460 1.10 briggs slot.type = (GetLongInfo(&slot, g) & 0xffff0000) >> 16;
461 1.1 briggs
462 1.10 briggs } else
463 1.1 briggs return 1;
464 1.1 briggs
465 1.10 briggs *newslot = slot;
466 1.1 briggs return 0;
467 1.1 briggs }
468 1.1 briggs
469 1.10 briggs struct imagedata *
470 1.10 briggs NUBUS_GetImageData(slot, Rimage)
471 1.10 briggs struct slot *slot;
472 1.10 briggs struct imagedata *Rimage;
473 1.1 briggs {
474 1.1 briggs struct imagedata image;
475 1.10 briggs struct dir *dir;
476 1.1 briggs struct dir dirSpace[10];
477 1.1 briggs struct dir dirSpace2[10];
478 1.10 briggs u_char *rawImage;
479 1.10 briggs
480 1.10 briggs
481 1.10 briggs dir = getRsrcByNum(slot, slot->mainDir, 128, dirSpace, 10);
482 1.10 briggs dir = getRsrcByNum(slot, dir, 128, dirSpace2, 10);
483 1.1 briggs
484 1.10 briggs rawImage = getDataAtRsrc(slot, dir, 1);
485 1.1 briggs
486 1.10 briggs image.whatTheHellIsThis = GetLongInfo(slot, rawImage);
487 1.10 briggs rawImage = IncPtr(slot, rawImage, 4);
488 1.1 briggs
489 1.10 briggs image.offset = GetLongInfo(slot, rawImage);
490 1.10 briggs rawImage = IncPtr(slot, rawImage, 4);
491 1.1 briggs
492 1.10 briggs image.rowbytes = GetShortInfo(slot, rawImage);
493 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
494 1.1 briggs
495 1.10 briggs image.top = GetShortInfo(slot, rawImage);
496 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
497 1.1 briggs
498 1.10 briggs image.left = GetShortInfo(slot, rawImage);
499 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
500 1.1 briggs
501 1.10 briggs image.bottom = GetShortInfo(slot, rawImage);
502 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
503 1.1 briggs
504 1.10 briggs image.right = GetShortInfo(slot, rawImage);
505 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
506 1.1 briggs
507 1.10 briggs image.version = GetShortInfo(slot, rawImage);
508 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
509 1.1 briggs
510 1.10 briggs image.packType = GetShortInfo(slot, rawImage);
511 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
512 1.1 briggs
513 1.10 briggs image.packSize = GetShortInfo(slot, rawImage);
514 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
515 1.1 briggs
516 1.10 briggs image.hRes = GetLongInfo(slot, rawImage);
517 1.10 briggs rawImage = IncPtr(slot, rawImage, 4);
518 1.1 briggs
519 1.10 briggs image.vRes = GetLongInfo(slot, rawImage);
520 1.10 briggs rawImage = IncPtr(slot, rawImage, 4);
521 1.1 briggs
522 1.10 briggs image.pixelType = GetShortInfo(slot, rawImage);
523 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
524 1.10 briggs
525 1.10 briggs image.pixelSize = GetShortInfo(slot, rawImage);
526 1.10 briggs rawImage = IncPtr(slot, rawImage, 2);
527 1.10 briggs
528 1.10 briggs *Rimage = image;
529 1.1 briggs
530 1.1 briggs return Rimage;
531 1.1 briggs }
532 1.2 briggs
533 1.10 briggs struct nubus_hw nubus_table[NUBUS_MAXSLOTS];
534 1.3 briggs
535 1.3 briggs extern int
536 1.10 briggs nubus_addr_to_slot(addr)
537 1.10 briggs caddr_t addr;
538 1.3 briggs {
539 1.3 briggs int nubus_num;
540 1.3 briggs
541 1.10 briggs for (nubus_num = 0; nubus_num < NUBUS_MAXSLOTS; nubus_num++)
542 1.3 briggs if (nubus_table[nubus_num].addr == addr)
543 1.3 briggs return nubus_num;
544 1.3 briggs return -1;
545 1.3 briggs }
546 1.2 briggs
547 1.2 briggs static void
548 1.10 briggs find_nubus()
549 1.2 briggs {
550 1.10 briggs /*
551 1.10 briggs * This function sets up the array "nubus_table" which contains the
552 1.10 briggs * basic information about each card in the Nubus slot. When device
553 1.10 briggs * drivers are initialized later, they can look through this array to
554 1.10 briggs * see if their hardware is present and claim it.
555 1.10 briggs */
556 1.2 briggs
557 1.10 briggs extern u_long NuBusBase;
558 1.10 briggs register struct nubus_hw *nu;
559 1.10 briggs int nubus_num;
560 1.10 briggs
561 1.10 briggs for (nubus_num = 0; nubus_num < NUBUS_MAXSLOTS; nubus_num++)
562 1.10 briggs nubus_table[nubus_num].found = 0; /* Empty */
563 1.10 briggs
564 1.10 briggs /*
565 1.10 briggs * LAK: For now we can only check 9..F because that's all we map in
566 1.10 briggs * locore.s. Eventually (i.e. near future) we should put THIS
567 1.10 briggs * function in locore.s before enabling the MMU and only map the slots
568 1.10 briggs * that have a card in them. Also, the next loop should go from 1 to
569 1.10 briggs * 0xF inclusive (0 is "reserved") to cover all possible hardware.
570 1.10 briggs * Even if the MacII only has 9..F, it won't hurt us to probe 1..8
571 1.10 briggs * also.
572 1.10 briggs */
573 1.10 briggs for (nubus_num = 0; nubus_num < 6; nubus_num++) {
574 1.10 briggs nu = nubus_table + nubus_num + 9;
575 1.10 briggs nu->addr = (caddr_t) (NuBusBase + nubus_num * NBMEMSIZE);
576 1.10 briggs nu->rom = nu->addr + NBROMOFFSET;
577 1.10 briggs
578 1.10 briggs if (!badbaddr(nu->addr + NBMEMSIZE - 1)) {
579 1.10 briggs InitNubusSlot((u_long) nu->addr, &(nu->slot));
580 1.10 briggs
581 1.10 briggs nu->found = 1;
582 1.10 briggs nu->claimed = 0; /* No driver has claimed this
583 1.10 briggs * slot yet */
584 1.2 briggs
585 1.10 briggs }
586 1.10 briggs }
587 1.2 briggs }
588 1.2 briggs
589 1.2 briggs static int
590 1.2 briggs nubus_print(aux, name)
591 1.10 briggs void *aux;
592 1.10 briggs char *name;
593 1.2 briggs {
594 1.10 briggs struct nubus_hw *nu = (struct nubus_hw *) aux;
595 1.10 briggs int i;
596 1.2 briggs
597 1.2 briggs if (name) {
598 1.2 briggs i = nu - nubus_table;
599 1.10 briggs printf("%s: s:%d t:%d \"",
600 1.10 briggs name, i, nu->slot.type);
601 1.10 briggs printf("%s, ", nu->slot.name);
602 1.10 briggs printf("%s\"", nu->slot.manufacturer);
603 1.2 briggs }
604 1.10 briggs return (UNCONF);
605 1.2 briggs }
606 1.2 briggs
607 1.2 briggs static void
608 1.9 briggs nubus_attach(parent, self, aux)
609 1.10 briggs struct device *parent, *self;
610 1.10 briggs void *aux;
611 1.2 briggs {
612 1.2 briggs register struct nubus_hw *nu;
613 1.10 briggs int i;
614 1.2 briggs
615 1.2 briggs printf("\n");
616 1.2 briggs
617 1.2 briggs find_nubus();
618 1.2 briggs
619 1.2 briggs for (i = 0; i < 6; i++) {
620 1.2 briggs nu = nubus_table + i + 9;
621 1.2 briggs
622 1.2 briggs if (!nu->found)
623 1.2 briggs continue;
624 1.2 briggs
625 1.9 briggs if (config_found(self, nu, nubus_print))
626 1.2 briggs nu->claimed = 1;
627 1.2 briggs }
628 1.2 briggs }
629 1.2 briggs
630 1.2 briggs extern int matchbyname();
631 1.2 briggs
632 1.10 briggs struct cfdriver nubuscd = {
633 1.10 briggs NULL, "nubus", matchbyname, nubus_attach,
634 1.10 briggs DV_DULL, sizeof(struct device), 1
635 1.10 briggs };
636