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