nubus.c revision 1.8 1 1.8 cgd /* $NetBSD: nubus.c,v 1.8 1994/10/26 08:46:14 cgd 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.4 briggs #include <machine/cpu.h>
39 1.1 briggs
40 1.4 briggs #include <sys/device.h>
41 1.1 briggs #include "nubus.h"
42 1.1 briggs
43 1.1 briggs
44 1.1 briggs /* TODO:
45 1.1 briggs be able to do "memcpy"s from the board, then i won't
46 1.1 briggs have to fill in structures by hand.
47 1.1 briggs
48 1.1 briggs get rid of extra crap calls that are useless
49 1.1 briggs
50 1.1 briggs I think the directory stuff is bogus, I need to find
51 1.1 briggs that other magic resource that tells me fancy stuff,
52 1.1 briggs I could be wrong.
53 1.1 briggs
54 1.1 briggs
55 1.1 briggs */
56 1.1 briggs
57 1.1 briggs
58 1.1 briggs struct dir *getRsrcByNum(struct slot *Slot,struct dir *p,int num,struct dir *out,int max);
59 1.1 briggs int print_rsrcinfo(struct slot *Slot,struct dir *p);
60 1.1 briggs char *GetStringInfo(struct slot *Slot,unsigned char *data1,char *space,int len);
61 1.1 briggs int printTree(struct slot *Slot,struct dir *root);
62 1.1 briggs long GetLongInfo(struct slot *,unsigned char *data);
63 1.1 briggs int FindMagic(unsigned long *data);
64 1.1 briggs int GetHeader(struct slot *Slot,unsigned long pos);
65 1.1 briggs unsigned char *IncPtr(struct slot *Slot,unsigned char *p,int size);
66 1.1 briggs char GetByteInfo(struct slot *Slot,unsigned char *data);
67 1.1 briggs int GetRsrcs(struct slot *Slot,unsigned char *p,struct dir *Dir,int maxdir);
68 1.1 briggs unsigned char *getDataAtRsrc(struct slot *Slot,struct dir *p,int num);
69 1.1 briggs short GetShortInfo(struct slot *Slot,unsigned char *data);
70 1.1 briggs
71 1.1 briggs /* this is the main I used in macos to get stuff out */
72 1.1 briggs #if 0
73 1.1 briggs main()
74 1.1 briggs {
75 1.1 briggs
76 1.1 briggs unsigned long *rawImage;
77 1.1 briggs struct imagedata image;
78 1.1 briggs struct dir *Dir;
79 1.1 briggs struct dir dirSpace[15];
80 1.1 briggs struct dir dirSpace2[10];
81 1.1 briggs unsigned long length;
82 1.1 briggs unsigned long offset;
83 1.1 briggs unsigned long nextoffset;
84 1.1 briggs int pos,i;
85 1.1 briggs unsigned char *data;
86 1.1 briggs struct slot Slot;
87 1.1 briggs
88 1.1 briggs // firstHeader=(char *)0xbfffff-40;
89 1.1 briggs
90 1.1 briggs data=(char *)SLOTADDR-100;
91 1.1 briggs
92 1.1 briggs for(i=0;i<100;i++)
93 1.1 briggs if (Slot.size=FindMagic( (long *)(data+i) ) )
94 1.1 briggs {
95 1.1 briggs /* printf("magic found at i=%d\n",i); */
96 1.1 briggs GetHeader(&Slot,SLOTADDR-100+i);
97 1.1 briggs break;
98 1.1 briggs }
99 1.1 briggs
100 1.1 briggs
101 1.1 briggs
102 1.1 briggs
103 1.1 briggs printf("main directory\n");
104 1.1 briggs print_rsrcinfo(&Slot,Slot.mainDir );
105 1.1 briggs
106 1.1 briggs Dir=getRsrcByNum(&Slot,Slot.mainDir,128,dirSpace,15);
107 1.1 briggs
108 1.1 briggs printf("image directory\n");
109 1.1 briggs print_rsrcinfo(&Slot,Dir);
110 1.1 briggs
111 1.1 briggs printTree(&Slot,Slot.mainDir);
112 1.1 briggs
113 1.1 briggs // get image param stuff
114 1.1 briggs Dir=getRsrcByNum(&Slot,Dir,128,dirSpace2,10);
115 1.1 briggs
116 1.1 briggs /* hopefully video mode params */
117 1.1 briggs rawImage=getDataAtRsrc(&Slot,Dir,1);
118 1.1 briggs
119 1.1 briggs image.whatTheHellIsThis=GetLongInfo(&Slot,rawImage);
120 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
121 1.1 briggs
122 1.1 briggs image.offset=GetLongInfo(&Slot,rawImage);
123 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
124 1.1 briggs
125 1.1 briggs image.rowbytes=GetShortInfo(&Slot,rawImage);
126 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
127 1.1 briggs
128 1.1 briggs image.top=GetShortInfo(&Slot,rawImage);
129 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
130 1.1 briggs
131 1.1 briggs image.left=GetShortInfo(&Slot,rawImage);
132 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
133 1.1 briggs
134 1.1 briggs image.bottom=GetShortInfo(&Slot,rawImage);
135 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
136 1.1 briggs
137 1.1 briggs image.right=GetShortInfo(&Slot,rawImage);
138 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
139 1.1 briggs
140 1.1 briggs image.version=GetShortInfo(&Slot,rawImage);
141 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
142 1.1 briggs
143 1.1 briggs image.packType=GetShortInfo(&Slot,rawImage);
144 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
145 1.1 briggs
146 1.1 briggs image.packSize=GetShortInfo(&Slot,rawImage);
147 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
148 1.1 briggs
149 1.1 briggs image.hRes=GetLongInfo(&Slot,rawImage);
150 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
151 1.1 briggs
152 1.1 briggs image.vRes=GetLongInfo(&Slot,rawImage);
153 1.1 briggs rawImage=IncPtr(&Slot,rawImage,4);
154 1.1 briggs
155 1.1 briggs image.pixelType=GetShortInfo(&Slot,rawImage);
156 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
157 1.1 briggs
158 1.1 briggs image.pixelSize=GetShortInfo(&Slot,rawImage);
159 1.1 briggs rawImage=IncPtr(&Slot,rawImage,2);
160 1.1 briggs
161 1.1 briggs
162 1.1 briggs }
163 1.1 briggs #endif /* main */
164 1.1 briggs
165 1.1 briggs int GetHeader(struct slot *Slot,unsigned long pos)
166 1.1 briggs {
167 1.1 briggs /* the pos passed in is the pos that the magic testvalue was found at */
168 1.1 briggs unsigned char *p;
169 1.1 briggs unsigned char *dirBase;
170 1.1 briggs
171 1.1 briggs switch (Slot->size)
172 1.1 briggs {
173 1.1 briggs case 1: /* char */
174 1.1 briggs pos-=14;
175 1.1 briggs break;
176 1.1 briggs case 2:
177 1.1 briggs pos-=28;
178 1.1 briggs break;
179 1.1 briggs case 4:
180 1.1 briggs pos-=56;
181 1.1 briggs break;
182 1.1 briggs }
183 1.1 briggs
184 1.1 briggs p=(unsigned char *)pos;
185 1.1 briggs
186 1.5 briggs Slot->head.offset=(0xff000000 | (unsigned long) GetLongInfo(Slot,p));
187 1.1 briggs p=IncPtr(Slot,p,4);
188 1.1 briggs
189 1.1 briggs Slot->head.length=GetLongInfo(Slot,p);
190 1.1 briggs p=IncPtr(Slot,p,4);
191 1.1 briggs
192 1.1 briggs Slot->head.crc=GetLongInfo(Slot,p);
193 1.1 briggs p=IncPtr(Slot,p,4);
194 1.1 briggs
195 1.1 briggs Slot->head.romrev=GetByteInfo(Slot,p);
196 1.1 briggs p=IncPtr(Slot,p,1);
197 1.1 briggs
198 1.1 briggs Slot->head.format=GetByteInfo(Slot,p);
199 1.1 briggs p=IncPtr(Slot,p,1);
200 1.1 briggs
201 1.1 briggs Slot->head.tst=GetLongInfo(Slot,p);
202 1.1 briggs p=IncPtr(Slot,p,4);
203 1.1 briggs
204 1.1 briggs Slot->head.reserved=GetByteInfo(Slot,p);
205 1.1 briggs p=IncPtr(Slot,p,1);
206 1.1 briggs
207 1.1 briggs /* byte lanes should be used instead of size, this hasn't bitten me yet */
208 1.1 briggs Slot->head.bytelane=GetByteInfo(Slot,p);
209 1.1 briggs p=IncPtr(Slot,p,1);
210 1.1 briggs
211 1.5 briggs dirBase=(unsigned char *)(pos+Slot->head.offset*Slot->size);
212 1.1 briggs GetRsrcs(Slot,dirBase,Slot->mainDir,15);
213 1.1 briggs return 0;
214 1.1 briggs }
215 1.1 briggs
216 1.1 briggs
217 1.1 briggs printTree(struct slot *Slot,struct dir *root)
218 1.1 briggs {
219 1.1 briggs struct dir *b;
220 1.1 briggs unsigned char *c;
221 1.1 briggs struct dir *d;
222 1.1 briggs unsigned char *e;
223 1.1 briggs struct dir *f;
224 1.1 briggs unsigned char *g;
225 1.1 briggs struct dir *h;
226 1.1 briggs unsigned char *i;
227 1.1 briggs unsigned char *j;
228 1.1 briggs unsigned char *k;
229 1.1 briggs struct dir bSpace[15];
230 1.1 briggs struct dir cSpace[15];
231 1.1 briggs struct dir dSpace[15];
232 1.1 briggs struct dir fSpace[15];
233 1.1 briggs struct dir hSpace[15];
234 1.1 briggs char space[40];
235 1.1 briggs /* to get a good idea of what is happening here you should get the
236 1.1 briggs "slots" program from apple dts, it is so cool. Its the next
237 1.1 briggs best thing to actual docs, which i didn't have...
238 1.1 briggs */
239 1.1 briggs
240 1.1 briggs b=getRsrcByNum(Slot,root,1,bSpace,15);
241 1.1 briggs c=getDataAtRsrc(Slot,b,2);
242 1.1 briggs d=getRsrcByNum(Slot,b,0x24,dSpace,15);
243 1.1 briggs
244 1.1 briggs e=getDataAtRsrc(Slot,d,1);
245 1.1 briggs
246 1.1 briggs f=getRsrcByNum(Slot,root,0x80,fSpace,15);
247 1.1 briggs g=getDataAtRsrc(Slot,f,2);
248 1.1 briggs j=getDataAtRsrc(Slot,f,0x0a);
249 1.1 briggs k=getDataAtRsrc(Slot,f,0x0b);
250 1.1 briggs
251 1.1 briggs h=getRsrcByNum(Slot,root,0xa0,hSpace,15);
252 1.1 briggs i=getDataAtRsrc(Slot,h,2);
253 1.1 briggs
254 1.1 briggs printf("A\n");
255 1.1 briggs print_rsrcinfo(Slot,root);
256 1.1 briggs
257 1.1 briggs printf("B\n");
258 1.1 briggs print_rsrcinfo(Slot,b);
259 1.1 briggs
260 1.1 briggs printf("C\n");
261 1.1 briggs printf("%s\n",GetStringInfo(Slot,c,space,40));
262 1.1 briggs
263 1.1 briggs printf("D\n");
264 1.1 briggs print_rsrcinfo(Slot,d);
265 1.1 briggs
266 1.1 briggs printf("E\n");
267 1.1 briggs printf("%s\n",GetStringInfo(Slot,e,space,40));
268 1.1 briggs
269 1.1 briggs printf("F\n");
270 1.1 briggs print_rsrcinfo(Slot,f);
271 1.1 briggs
272 1.1 briggs
273 1.1 briggs printf("g\n");
274 1.1 briggs printf("%s\n",GetStringInfo(Slot,g,space,40));
275 1.1 briggs printf("Video RAM Base %lx\n", GetLongInfo(Slot,j) );
276 1.1 briggs printf("Video RAM Length %lx\n", GetLongInfo(Slot,k) );
277 1.1 briggs
278 1.1 briggs printf("H\n");
279 1.1 briggs print_rsrcinfo(Slot,h);
280 1.1 briggs
281 1.1 briggs printf("I\n");
282 1.1 briggs printf("%s\n",GetStringInfo(Slot,i,space,40));
283 1.1 briggs
284 1.1 briggs }
285 1.1 briggs
286 1.1 briggs
287 1.1 briggs print_rsrcinfo(struct slot *Slot,struct dir *p)
288 1.1 briggs {
289 1.1 briggs int i=0;
290 1.1 briggs int failsafe=20;
291 1.1 briggs
292 1.1 briggs if (p==NULL) return 1;
293 1.1 briggs while(failsafe--)
294 1.1 briggs {
295 1.1 briggs printf("RSRC %02x :%06lx\n",p[i].rsrc,p[i].offset);
296 1.1 briggs if (p[i].rsrc == 0xff) break;
297 1.1 briggs i++;
298 1.1 briggs }
299 1.1 briggs
300 1.1 briggs }
301 1.1 briggs
302 1.1 briggs struct dir *getRsrcByNum(struct slot *Slot,struct dir *p,int num,struct dir *out,int max)
303 1.1 briggs {
304 1.1 briggs int i=0;
305 1.1 briggs int failsafe=20;
306 1.1 briggs long nextoffset=0;
307 1.1 briggs unsigned char *base;
308 1.1 briggs
309 1.1 briggs if (p==NULL) return NULL;
310 1.1 briggs
311 1.1 briggs
312 1.1 briggs base=getDataAtRsrc(Slot,p,num);
313 1.1 briggs
314 1.1 briggs if (NULL==base) return NULL;
315 1.1 briggs
316 1.1 briggs GetRsrcs(Slot,base,out,max);
317 1.1 briggs
318 1.1 briggs return out;
319 1.1 briggs }
320 1.1 briggs
321 1.1 briggs char *GetStringInfo(struct slot *Slot,unsigned char *data,char *space,int len)
322 1.1 briggs {
323 1.1 briggs int i;
324 1.1 briggs char *p=space;
325 1.1 briggs
326 1.1 briggs if (NULL==data) return "";
327 1.1 briggs
328 1.1 briggs for(i=0;(i<len) && *data;i++,p++)
329 1.1 briggs {
330 1.1 briggs *p=GetByteInfo(Slot,data);
331 1.1 briggs data=IncPtr(Slot,data,1);
332 1.1 briggs }
333 1.1 briggs *p='\0';
334 1.1 briggs return space;
335 1.1 briggs }
336 1.1 briggs
337 1.1 briggs long GetLongInfo(struct slot *Slot,unsigned char *data)
338 1.1 briggs {
339 1.1 briggs long ret=0;
340 1.1 briggs
341 1.1 briggs switch (Slot->size)
342 1.1 briggs {
343 1.1 briggs case 1:
344 1.1 briggs ret= (unsigned long)data[0]<<24 | (unsigned long)data[1]<<16 | (unsigned long)data[2]<<8 |data[3] ;
345 1.1 briggs break;
346 1.1 briggs case 2:
347 1.1 briggs ret= (unsigned long)data[0]<<24 | (unsigned long)data[2]<<16 | (unsigned long)data[4]<<8 |data[6] ;
348 1.1 briggs break;
349 1.1 briggs case 4:
350 1.1 briggs ret= (unsigned long)data[0]<<24 | (unsigned long)data[4]<<16 | (unsigned long)data[8]<<8 |data[12] ;
351 1.1 briggs break;
352 1.1 briggs }
353 1.1 briggs
354 1.1 briggs return ret;
355 1.1 briggs }
356 1.1 briggs
357 1.1 briggs short GetShortInfo(struct slot *Slot,unsigned char *data)
358 1.1 briggs {
359 1.1 briggs short ret;
360 1.1 briggs
361 1.1 briggs switch (Slot->size)
362 1.1 briggs {
363 1.1 briggs case 1:
364 1.1 briggs ret= (unsigned long)data[0]<<8 |data[1] ;
365 1.1 briggs break;
366 1.1 briggs case 2:
367 1.1 briggs ret= (unsigned long)data[0]<<8 |data[2] ;
368 1.1 briggs break;
369 1.1 briggs case 4:
370 1.1 briggs ret= (unsigned long)data[0]<<8 |data[4] ;
371 1.1 briggs break;
372 1.1 briggs }
373 1.1 briggs
374 1.1 briggs return ret;
375 1.1 briggs }
376 1.1 briggs
377 1.1 briggs char GetByteInfo(struct slot *Slot,unsigned char *data)
378 1.1 briggs {
379 1.1 briggs /* boring .... */
380 1.1 briggs return data[0];
381 1.1 briggs }
382 1.1 briggs
383 1.1 briggs
384 1.1 briggs int FindMagic(unsigned long data[])
385 1.1 briggs {
386 1.1 briggs unsigned short *data2=(unsigned short *)data;
387 1.1 briggs unsigned char *data3=(unsigned char *)data;
388 1.1 briggs
389 1.1 briggs
390 1.1 briggs /* char data */
391 1.1 briggs if (((data3[0] )== 0x5a) &&
392 1.1 briggs ((data3[1] )== 0x93) &&
393 1.1 briggs ((data3[2] )== 0x2b) &&
394 1.1 briggs ((data3[3] )== 0xc7) )
395 1.1 briggs return 1;
396 1.1 briggs
397 1.1 briggs /* short data */
398 1.1 briggs
399 1.1 briggs if (((data3[0] )== 0x5a) &&
400 1.1 briggs ((data3[2] )== 0x93) &&
401 1.1 briggs ((data3[4] )== 0x2b) &&
402 1.1 briggs ((data3[6] )== 0xc7) )
403 1.1 briggs return 2;
404 1.1 briggs
405 1.1 briggs /* long data */
406 1.1 briggs if (((data3[0] )== 0x5a) &&
407 1.1 briggs ((data3[4] )== 0x93) &&
408 1.1 briggs ((data3[8] )== 0x2b) &&
409 1.1 briggs ((data3[12] )== 0xc7) )
410 1.1 briggs return 4;
411 1.1 briggs
412 1.1 briggs
413 1.1 briggs return 0;
414 1.1 briggs }
415 1.1 briggs
416 1.1 briggs unsigned char *IncPtr(struct slot *Slot,unsigned char *p,int size)
417 1.1 briggs {
418 1.1 briggs /* MF make this a macro someday */
419 1.1 briggs
420 1.1 briggs unsigned char *tmp=p;
421 1.1 briggs
422 1.1 briggs tmp=tmp+size*Slot->size;
423 1.1 briggs
424 1.1 briggs return tmp;
425 1.1 briggs
426 1.1 briggs }
427 1.1 briggs
428 1.1 briggs int GetRsrcs(struct slot *Slot,unsigned char *p,struct dir *Dir,int maxdir)
429 1.1 briggs {
430 1.1 briggs int i=0;
431 1.1 briggs /* MF if you alias memory here you will be fucked. */
432 1.1 briggs
433 1.6 briggs if (p==NULL) return 1;
434 1.1 briggs
435 1.1 briggs while(maxdir--)
436 1.1 briggs {
437 1.1 briggs long entry;
438 1.1 briggs
439 1.1 briggs entry=GetLongInfo(Slot,p);
440 1.1 briggs
441 1.1 briggs Dir[i].rsrc=(entry & 0xff000000) >> 24;
442 1.1 briggs Dir[i].offset=entry & 0x00ffffff;
443 1.1 briggs Dir[i].base=(unsigned long)p;
444 1.1 briggs p=IncPtr(Slot,p,4);
445 1.1 briggs if (Dir[i].rsrc==0xff)
446 1.1 briggs break;
447 1.1 briggs i++;
448 1.1 briggs }
449 1.1 briggs
450 1.1 briggs return 0;
451 1.1 briggs }
452 1.1 briggs
453 1.1 briggs unsigned char *getDataAtRsrc(struct slot *Slot,struct dir *p,int num)
454 1.1 briggs {
455 1.1 briggs int i=0;
456 1.1 briggs int failsafe=num;
457 1.1 briggs long nextoffset=0;
458 1.1 briggs unsigned char *base;
459 1.1 briggs
460 1.1 briggs if (p==NULL) return NULL;
461 1.1 briggs
462 1.1 briggs while(failsafe--)
463 1.1 briggs {
464 1.1 briggs if (p[i].rsrc==num)
465 1.1 briggs {
466 1.1 briggs base= (unsigned char *)( (unsigned long)Slot->size*p[i].offset+
467 1.1 briggs (unsigned long)p[i].base );
468 1.1 briggs return base;
469 1.1 briggs }
470 1.1 briggs if (p[i].rsrc==0xff) return NULL;
471 1.1 briggs i++;
472 1.1 briggs }
473 1.1 briggs
474 1.1 briggs
475 1.1 briggs
476 1.1 briggs return NULL;
477 1.1 briggs }
478 1.1 briggs
479 1.1 briggs
480 1.1 briggs int InitNubusSlot(unsigned long slotaddr,struct slot *newSlot)
481 1.1 briggs {
482 1.1 briggs int i=0;
483 1.1 briggs struct slot Slot;
484 1.1 briggs struct dir *b;
485 1.1 briggs struct dir bSpace[5];
486 1.1 briggs struct dir *d;
487 1.1 briggs struct dir dSpace[5];
488 1.1 briggs struct dir *f;
489 1.1 briggs struct dir fSpace[5];
490 1.1 briggs unsigned char *c;
491 1.1 briggs unsigned char *e;
492 1.1 briggs unsigned char *g;
493 1.1 briggs
494 1.1 briggs unsigned long slotend;
495 1.1 briggs
496 1.1 briggs
497 1.1 briggs
498 1.1 briggs slotend=slotaddr+NBMEMSIZE-1;
499 1.1 briggs
500 1.6 briggs for(i=5;i<100;i++)
501 1.1 briggs {
502 1.1 briggs /* lets be quite clear here, if magic is not on the card, then
503 1.1 briggs we will quite likely bus error, because we will read a long
504 1.1 briggs word when there are only 3 bytes left on the card, unless
505 1.1 briggs there is a card in the next slot that has readable memory starting
506 1.1 briggs at 0, so more than likely we crash, ohh well.
507 1.1 briggs
508 1.1 briggs The other day I heard (read) that the directory and the rest of
509 1.1 briggs the card can be in different formats, to this I say FUCK! So
510 1.1 briggs for the time being I will just assume the whole card is in the
511 1.1 briggs same format, and let it crash most heiniously on bizzare cards
512 1.1 briggs from hell, which I hear has lots of luke warm fresca on tap.
513 1.1 briggs */
514 1.6 briggs if (Slot.size=FindMagic( (unsigned long *)(slotend-i) ) )
515 1.1 briggs {
516 1.6 briggs GetHeader(&Slot,slotend-i);
517 1.1 briggs break;
518 1.1 briggs }
519 1.1 briggs }
520 1.1 briggs
521 1.1 briggs /* ohh ohh Mexico, i've never really been, but I'd sure like to go */
522 1.1 briggs if (Slot.size)
523 1.1 briggs {
524 1.1 briggs b=getRsrcByNum(&Slot,Slot.mainDir,1,bSpace,5);
525 1.1 briggs c=getDataAtRsrc(&Slot,b,2);
526 1.1 briggs d=getRsrcByNum(&Slot,b,0x24,dSpace,5);
527 1.1 briggs e=getDataAtRsrc(&Slot,d,1);
528 1.1 briggs f=getRsrcByNum(&Slot,Slot.mainDir,0x80,fSpace,5);
529 1.1 briggs g=getDataAtRsrc(&Slot,f,1);
530 1.1 briggs GetStringInfo(&Slot,c,Slot.name,40);
531 1.1 briggs /* printf("card is %s, ",Slot.name); */
532 1.1 briggs GetStringInfo(&Slot,e,Slot.manufacturer,40);
533 1.1 briggs /* printf("%s\n",Slot.manufacturer); */
534 1.1 briggs /* info here is two long words (cat,type,drvrsw,drvrhw) */
535 1.1 briggs Slot.type=(GetLongInfo(&Slot,g) & 0xffff0000) >> 16;
536 1.1 briggs /* printf("type is %x\n",Slot.type); */
537 1.1 briggs
538 1.1 briggs /* sounds so simple with the sun sinking low */
539 1.1 briggs
540 1.1 briggs }
541 1.1 briggs else
542 1.1 briggs return 1;
543 1.1 briggs /* this comment intentionally left meaningless */
544 1.1 briggs
545 1.1 briggs *newSlot=Slot;
546 1.1 briggs return 0;
547 1.1 briggs }
548 1.1 briggs
549 1.1 briggs struct imagedata *NUBUS_GetImageData(struct slot *Slot,
550 1.1 briggs struct imagedata *Rimage)
551 1.1 briggs {
552 1.1 briggs struct imagedata image;
553 1.1 briggs struct dir *Dir;
554 1.1 briggs struct dir dirSpace[10];
555 1.1 briggs struct dir dirSpace2[10];
556 1.1 briggs unsigned char *rawImage;
557 1.1 briggs
558 1.1 briggs
559 1.1 briggs Dir=getRsrcByNum(Slot,Slot->mainDir,128,dirSpace,10);
560 1.1 briggs Dir=getRsrcByNum(Slot,Dir,128,dirSpace2,10);
561 1.1 briggs
562 1.1 briggs rawImage=getDataAtRsrc(Slot,Dir,1);
563 1.1 briggs
564 1.1 briggs /* this is self documenting code, WHAT THE HELL IS THIS? */
565 1.1 briggs image.whatTheHellIsThis=GetLongInfo(Slot,rawImage);
566 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
567 1.1 briggs
568 1.1 briggs image.offset=GetLongInfo(Slot,rawImage);
569 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
570 1.1 briggs
571 1.1 briggs image.rowbytes=GetShortInfo(Slot,rawImage);
572 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
573 1.1 briggs
574 1.1 briggs image.top=GetShortInfo(Slot,rawImage);
575 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
576 1.1 briggs
577 1.1 briggs image.left=GetShortInfo(Slot,rawImage);
578 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
579 1.1 briggs
580 1.1 briggs image.bottom=GetShortInfo(Slot,rawImage);
581 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
582 1.1 briggs
583 1.1 briggs image.right=GetShortInfo(Slot,rawImage);
584 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
585 1.1 briggs
586 1.1 briggs image.version=GetShortInfo(Slot,rawImage);
587 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
588 1.1 briggs
589 1.1 briggs image.packType=GetShortInfo(Slot,rawImage);
590 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
591 1.1 briggs
592 1.1 briggs image.packSize=GetShortInfo(Slot,rawImage);
593 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
594 1.1 briggs
595 1.1 briggs image.hRes=GetLongInfo(Slot,rawImage);
596 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
597 1.1 briggs
598 1.1 briggs image.vRes=GetLongInfo(Slot,rawImage);
599 1.1 briggs rawImage=IncPtr(Slot,rawImage,4);
600 1.1 briggs
601 1.1 briggs image.pixelType=GetShortInfo(Slot,rawImage);
602 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
603 1.1 briggs
604 1.1 briggs image.pixelSize=GetShortInfo(Slot,rawImage);
605 1.1 briggs rawImage=IncPtr(Slot,rawImage,2);
606 1.1 briggs
607 1.1 briggs *Rimage=image;
608 1.1 briggs
609 1.1 briggs return Rimage;
610 1.1 briggs }
611 1.2 briggs
612 1.2 briggs struct nubus_hw nubus_table[NUBUS_MAXSLOTS];
613 1.3 briggs
614 1.3 briggs extern int
615 1.3 briggs nubus_addr_to_slot(caddr_t addr)
616 1.3 briggs {
617 1.3 briggs int nubus_num;
618 1.3 briggs
619 1.3 briggs for (nubus_num = 0 ; nubus_num < NUBUS_MAXSLOTS ; nubus_num++)
620 1.3 briggs if (nubus_table[nubus_num].addr == addr)
621 1.3 briggs return nubus_num;
622 1.3 briggs return -1;
623 1.3 briggs }
624 1.2 briggs
625 1.2 briggs static void
626 1.2 briggs find_nubus(void)
627 1.2 briggs {
628 1.2 briggs /* This functions sets up the array "nubus_table" which contains the
629 1.2 briggs basic information about each card in the Nubus slot. When device
630 1.2 briggs drivers are initialized later, they can look through this array to
631 1.2 briggs see if their hardware is present and claim it. */
632 1.2 briggs
633 1.7 briggs extern unsigned long NuBusBase;
634 1.2 briggs register struct nubus_hw *nu;
635 1.2 briggs int nubus_num;
636 1.2 briggs
637 1.2 briggs for (nubus_num = 0; nubus_num < NUBUS_MAXSLOTS; nubus_num++)
638 1.2 briggs nubus_table[nubus_num].found = 0; /* Empty */
639 1.2 briggs
640 1.2 briggs /* LAK: For now we can only check 9..F because that's all we map
641 1.2 briggs in locore.s. Eventually (i.e. near future) we should put THIS
642 1.2 briggs function in locore.s before enabling the MMU and only map the
643 1.2 briggs slots that have a card in them. Also, the next loop should go from
644 1.2 briggs 1 to 0xF inclusive (0 is "reserved") to cover all possible hardware.
645 1.2 briggs Even if the MacII only has 9..F, it won't hurt us to probe 1..8 also. */
646 1.2 briggs for (nubus_num = 0; nubus_num < 6; nubus_num++)
647 1.2 briggs {
648 1.2 briggs nu = nubus_table + nubus_num + 9;
649 1.7 briggs nu->addr = (caddr_t)(NuBusBase + nubus_num * NBMEMSIZE);
650 1.2 briggs nu->rom = nu->addr + NBROMOFFSET;
651 1.2 briggs
652 1.6 briggs if(!badbaddr(nu->addr+NBMEMSIZE-1))
653 1.2 briggs {
654 1.2 briggs InitNubusSlot((unsigned long) nu->addr, &(nu->Slot));
655 1.2 briggs
656 1.2 briggs nu->found = 1;
657 1.2 briggs nu->claimed = 0; /* No driver has claimed this slot yet */
658 1.2 briggs
659 1.2 briggs }
660 1.2 briggs }
661 1.2 briggs }
662 1.2 briggs
663 1.2 briggs static int
664 1.2 briggs nubus_print(aux, name)
665 1.2 briggs void *aux;
666 1.2 briggs char *name;
667 1.2 briggs {
668 1.2 briggs struct nubus_hw *nu = (struct nubus_hw *) aux;
669 1.2 briggs int i;
670 1.2 briggs
671 1.2 briggs if (name) {
672 1.2 briggs i = nu - nubus_table;
673 1.2 briggs printf ("%s: s:%d t:%d \"",
674 1.2 briggs name, i, nu->Slot.type);
675 1.2 briggs printf ("%s, ",nu->Slot.name);
676 1.5 briggs printf ("%s\"",nu->Slot.manufacturer);
677 1.2 briggs }
678 1.2 briggs return(UNCONF);
679 1.2 briggs }
680 1.2 briggs
681 1.2 briggs static void
682 1.2 briggs nubus_attach(parent, dev, aux)
683 1.2 briggs struct device *parent, *dev;
684 1.2 briggs void *aux;
685 1.2 briggs {
686 1.2 briggs struct cfdriver *cf;
687 1.2 briggs register struct nubus_hw *nu;
688 1.2 briggs int i;
689 1.2 briggs
690 1.2 briggs printf("\n");
691 1.2 briggs
692 1.2 briggs find_nubus();
693 1.2 briggs
694 1.2 briggs for (i = 0; i < 6; i++) {
695 1.2 briggs nu = nubus_table + i + 9;
696 1.2 briggs
697 1.2 briggs if (!nu->found)
698 1.2 briggs continue;
699 1.2 briggs
700 1.2 briggs if (config_found(dev, nu, nubus_print))
701 1.2 briggs nu->claimed = 1;
702 1.2 briggs }
703 1.2 briggs
704 1.2 briggs }
705 1.2 briggs
706 1.2 briggs extern int matchbyname();
707 1.2 briggs
708 1.2 briggs struct cfdriver nubuscd =
709 1.2 briggs { NULL, "nubus", matchbyname, nubus_attach,
710 1.2 briggs DV_DULL, sizeof(struct device), NULL, 0 };
711