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