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