Home | History | Annotate | Line # | Download | only in nubus
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