xref: /openbmc/linux/drivers/nubus/nubus.c (revision f53bad08)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *	Macintosh Nubus Interface Code
4  *
5  *      Originally by Alan Cox
6  *
7  *      Mostly rewritten by David Huggins-Daines, C. Scott Ananian,
8  *      and others.
9  */
10 
11 #include <linux/types.h>
12 #include <linux/kernel.h>
13 #include <linux/string.h>
14 #include <linux/nubus.h>
15 #include <linux/errno.h>
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <asm/setup.h>
20 #include <asm/page.h>
21 #include <asm/hwtest.h>
22 
23 /* Constants */
24 
25 /* This is, of course, the size in bytelanes, rather than the size in
26    actual bytes */
27 #define FORMAT_BLOCK_SIZE 20
28 #define ROM_DIR_OFFSET 0x24
29 
30 #define NUBUS_TEST_PATTERN 0x5A932BC7
31 
32 /* Globals */
33 
34 struct nubus_dev *nubus_devices;
35 struct nubus_board *nubus_boards;
36 
37 /* Meaning of "bytelanes":
38 
39    The card ROM may appear on any or all bytes of each long word in
40    NuBus memory.  The low 4 bits of the "map" value found in the
41    format block (at the top of the slot address space, as well as at
42    the top of the MacOS ROM) tells us which bytelanes, i.e. which byte
43    offsets within each longword, are valid.  Thus:
44 
45    A map of 0x0f, as found in the MacOS ROM, means that all bytelanes
46    are valid.
47 
48    A map of 0xf0 means that no bytelanes are valid (We pray that we
49    will never encounter this, but stranger things have happened)
50 
51    A map of 0xe1 means that only the MSB of each long word is actually
52    part of the card ROM.  (We hope to never encounter NuBus on a
53    little-endian machine.  Again, stranger things have happened)
54 
55    A map of 0x78 means that only the LSB of each long word is valid.
56 
57    Etcetera, etcetera.  Hopefully this clears up some confusion over
58    what the following code actually does.  */
59 
60 static inline int not_useful(void *p, int map)
61 {
62 	unsigned long pv = (unsigned long)p;
63 
64 	pv &= 3;
65 	if (map & (1 << pv))
66 		return 0;
67 	return 1;
68 }
69 
70 static unsigned long nubus_get_rom(unsigned char **ptr, int len, int map)
71 {
72 	/* This will hold the result */
73 	unsigned long v = 0;
74 	unsigned char *p = *ptr;
75 
76 	while (len) {
77 		v <<= 8;
78 		while (not_useful(p, map))
79 			p++;
80 		v |= *p++;
81 		len--;
82 	}
83 	*ptr = p;
84 	return v;
85 }
86 
87 static void nubus_rewind(unsigned char **ptr, int len, int map)
88 {
89 	unsigned char *p = *ptr;
90 
91 	while (len) {
92 		do {
93 			p--;
94 		} while (not_useful(p, map));
95 		len--;
96 	}
97 	*ptr = p;
98 }
99 
100 static void nubus_advance(unsigned char **ptr, int len, int map)
101 {
102 	unsigned char *p = *ptr;
103 
104 	while (len) {
105 		while (not_useful(p, map))
106 			p++;
107 		p++;
108 		len--;
109 	}
110 	*ptr = p;
111 }
112 
113 static void nubus_move(unsigned char **ptr, int len, int map)
114 {
115 	unsigned long slot_space = (unsigned long)*ptr & 0xFF000000;
116 
117 	if (len > 0)
118 		nubus_advance(ptr, len, map);
119 	else if (len < 0)
120 		nubus_rewind(ptr, -len, map);
121 
122 	if (((unsigned long)*ptr & 0xFF000000) != slot_space)
123 		pr_err("%s: moved out of slot address space!\n", __func__);
124 }
125 
126 /* Now, functions to read the sResource tree */
127 
128 /* Each sResource entry consists of a 1-byte ID and a 3-byte data
129    field.  If that data field contains an offset, then obviously we
130    have to expand it from a 24-bit signed number to a 32-bit signed
131    number. */
132 
133 static inline long nubus_expand32(long foo)
134 {
135 	if (foo & 0x00800000)	/* 24bit negative */
136 		foo |= 0xFF000000;
137 	return foo;
138 }
139 
140 static inline void *nubus_rom_addr(int slot)
141 {
142 	/*
143 	 *	Returns the first byte after the card. We then walk
144 	 *	backwards to get the lane register and the config
145 	 */
146 	return (void *)(0xF1000000 + (slot << 24));
147 }
148 
149 static unsigned char *nubus_dirptr(const struct nubus_dirent *nd)
150 {
151 	unsigned char *p = nd->base;
152 
153 	/* Essentially, just step over the bytelanes using whatever
154 	   offset we might have found */
155 	nubus_move(&p, nubus_expand32(nd->data), nd->mask);
156 	/* And return the value */
157 	return p;
158 }
159 
160 /* These two are for pulling resource data blocks (i.e. stuff that's
161    pointed to with offsets) out of the card ROM. */
162 
163 void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,
164 			unsigned int len)
165 {
166 	unsigned char *t = (unsigned char *)dest;
167 	unsigned char *p = nubus_dirptr(dirent);
168 
169 	while (len) {
170 		*t++ = nubus_get_rom(&p, 1, dirent->mask);
171 		len--;
172 	}
173 }
174 EXPORT_SYMBOL(nubus_get_rsrc_mem);
175 
176 void nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,
177 			unsigned int len)
178 {
179 	char *t = dest;
180 	unsigned char *p = nubus_dirptr(dirent);
181 
182 	while (len > 1) {
183 		unsigned char c = nubus_get_rom(&p, 1, dirent->mask);
184 
185 		if (!c)
186 			break;
187 		*t++ = c;
188 		len--;
189 	}
190 	if (len > 0)
191 		*t = '\0';
192 }
193 EXPORT_SYMBOL(nubus_get_rsrc_str);
194 
195 int nubus_get_root_dir(const struct nubus_board *board,
196 		       struct nubus_dir *dir)
197 {
198 	dir->ptr = dir->base = board->directory;
199 	dir->done = 0;
200 	dir->mask = board->lanes;
201 	return 0;
202 }
203 EXPORT_SYMBOL(nubus_get_root_dir);
204 
205 /* This is a slyly renamed version of the above */
206 int nubus_get_func_dir(const struct nubus_dev *dev,
207 		       struct nubus_dir *dir)
208 {
209 	dir->ptr = dir->base = dev->directory;
210 	dir->done = 0;
211 	dir->mask = dev->board->lanes;
212 	return 0;
213 }
214 EXPORT_SYMBOL(nubus_get_func_dir);
215 
216 int nubus_get_board_dir(const struct nubus_board *board,
217 			struct nubus_dir *dir)
218 {
219 	struct nubus_dirent ent;
220 
221 	dir->ptr = dir->base = board->directory;
222 	dir->done = 0;
223 	dir->mask = board->lanes;
224 
225 	/* Now dereference it (the first directory is always the board
226 	   directory) */
227 	if (nubus_readdir(dir, &ent) == -1)
228 		return -1;
229 	if (nubus_get_subdir(&ent, dir) == -1)
230 		return -1;
231 	return 0;
232 }
233 EXPORT_SYMBOL(nubus_get_board_dir);
234 
235 int nubus_get_subdir(const struct nubus_dirent *ent,
236 		     struct nubus_dir *dir)
237 {
238 	dir->ptr = dir->base = nubus_dirptr(ent);
239 	dir->done = 0;
240 	dir->mask = ent->mask;
241 	return 0;
242 }
243 EXPORT_SYMBOL(nubus_get_subdir);
244 
245 int nubus_readdir(struct nubus_dir *nd, struct nubus_dirent *ent)
246 {
247 	u32 resid;
248 
249 	if (nd->done)
250 		return -1;
251 
252 	/* Do this first, otherwise nubus_rewind & co are off by 4 */
253 	ent->base = nd->ptr;
254 
255 	/* This moves nd->ptr forward */
256 	resid = nubus_get_rom(&nd->ptr, 4, nd->mask);
257 
258 	/* EOL marker, as per the Apple docs */
259 	if ((resid & 0xff000000) == 0xff000000) {
260 		/* Mark it as done */
261 		nd->done = 1;
262 		return -1;
263 	}
264 
265 	/* First byte is the resource ID */
266 	ent->type = resid >> 24;
267 	/* Low 3 bytes might contain data (or might not) */
268 	ent->data = resid & 0xffffff;
269 	ent->mask = nd->mask;
270 	return 0;
271 }
272 EXPORT_SYMBOL(nubus_readdir);
273 
274 int nubus_rewinddir(struct nubus_dir *dir)
275 {
276 	dir->ptr = dir->base;
277 	dir->done = 0;
278 	return 0;
279 }
280 EXPORT_SYMBOL(nubus_rewinddir);
281 
282 /* Driver interface functions, more or less like in pci.c */
283 
284 struct nubus_dev*
285 nubus_find_device(unsigned short category, unsigned short type,
286 		  unsigned short dr_hw, unsigned short dr_sw,
287 		  const struct nubus_dev *from)
288 {
289 	struct nubus_dev *itor = from ? from->next : nubus_devices;
290 
291 	while (itor) {
292 		if (itor->category == category && itor->type == type &&
293 		    itor->dr_hw == dr_hw && itor->dr_sw == dr_sw)
294 			return itor;
295 		itor = itor->next;
296 	}
297 	return NULL;
298 }
299 EXPORT_SYMBOL(nubus_find_device);
300 
301 struct nubus_dev*
302 nubus_find_type(unsigned short category, unsigned short type,
303 		const struct nubus_dev *from)
304 {
305 	struct nubus_dev *itor = from ? from->next : nubus_devices;
306 
307 	while (itor) {
308 		if (itor->category == category && itor->type == type)
309 			return itor;
310 		itor = itor->next;
311 	}
312 	return NULL;
313 }
314 EXPORT_SYMBOL(nubus_find_type);
315 
316 struct nubus_dev*
317 nubus_find_slot(unsigned int slot, const struct nubus_dev *from)
318 {
319 	struct nubus_dev *itor = from ? from->next : nubus_devices;
320 
321 	while (itor) {
322 		if (itor->board->slot == slot)
323 			return itor;
324 		itor = itor->next;
325 	}
326 	return NULL;
327 }
328 EXPORT_SYMBOL(nubus_find_slot);
329 
330 int
331 nubus_find_rsrc(struct nubus_dir *dir, unsigned char rsrc_type,
332 		struct nubus_dirent *ent)
333 {
334 	while (nubus_readdir(dir, ent) != -1) {
335 		if (ent->type == rsrc_type)
336 			return 0;
337 	}
338 	return -1;
339 }
340 EXPORT_SYMBOL(nubus_find_rsrc);
341 
342 /* Initialization functions - decide which slots contain stuff worth
343    looking at, and print out lots and lots of information from the
344    resource blocks. */
345 
346 /* FIXME: A lot of this stuff will eventually be useful after
347    initialization, for intelligently probing Ethernet and video chips,
348    among other things.  The rest of it should go in the /proc code.
349    For now, we just use it to give verbose boot logs. */
350 
351 static int __init nubus_show_display_resource(struct nubus_dev *dev,
352 					      const struct nubus_dirent *ent)
353 {
354 	switch (ent->type) {
355 	case NUBUS_RESID_GAMMADIR:
356 		pr_debug("    gamma directory offset: 0x%06x\n", ent->data);
357 		break;
358 	case 0x0080 ... 0x0085:
359 		pr_debug("    mode 0x%02x info offset: 0x%06x\n",
360 			ent->type, ent->data);
361 		break;
362 	default:
363 		pr_debug("    unknown resource 0x%02x, data 0x%06x\n",
364 			ent->type, ent->data);
365 	}
366 	return 0;
367 }
368 
369 static int __init nubus_show_network_resource(struct nubus_dev *dev,
370 					      const struct nubus_dirent *ent)
371 {
372 	switch (ent->type) {
373 	case NUBUS_RESID_MAC_ADDRESS:
374 	{
375 		char addr[6];
376 
377 		nubus_get_rsrc_mem(addr, ent, 6);
378 		pr_debug("    MAC address: %pM\n", addr);
379 		break;
380 	}
381 	default:
382 		pr_debug("    unknown resource 0x%02x, data 0x%06x\n",
383 			ent->type, ent->data);
384 	}
385 	return 0;
386 }
387 
388 static int __init nubus_show_cpu_resource(struct nubus_dev *dev,
389 					  const struct nubus_dirent *ent)
390 {
391 	switch (ent->type) {
392 	case NUBUS_RESID_MEMINFO:
393 	{
394 		unsigned long meminfo[2];
395 
396 		nubus_get_rsrc_mem(&meminfo, ent, 8);
397 		pr_debug("    memory: [ 0x%08lx 0x%08lx ]\n",
398 			meminfo[0], meminfo[1]);
399 		break;
400 	}
401 	case NUBUS_RESID_ROMINFO:
402 	{
403 		unsigned long rominfo[2];
404 
405 		nubus_get_rsrc_mem(&rominfo, ent, 8);
406 		pr_debug("    ROM:    [ 0x%08lx 0x%08lx ]\n",
407 			rominfo[0], rominfo[1]);
408 		break;
409 	}
410 	default:
411 		pr_debug("    unknown resource 0x%02x, data 0x%06x\n",
412 			ent->type, ent->data);
413 	}
414 	return 0;
415 }
416 
417 static int __init nubus_show_private_resource(struct nubus_dev *dev,
418 					      const struct nubus_dirent *ent)
419 {
420 	switch (dev->category) {
421 	case NUBUS_CAT_DISPLAY:
422 		nubus_show_display_resource(dev, ent);
423 		break;
424 	case NUBUS_CAT_NETWORK:
425 		nubus_show_network_resource(dev, ent);
426 		break;
427 	case NUBUS_CAT_CPU:
428 		nubus_show_cpu_resource(dev, ent);
429 		break;
430 	default:
431 		pr_debug("    unknown resource 0x%02x, data 0x%06x\n",
432 			ent->type, ent->data);
433 	}
434 	return 0;
435 }
436 
437 static struct nubus_dev * __init
438 nubus_get_functional_resource(struct nubus_board *board, int slot,
439 			      const struct nubus_dirent *parent)
440 {
441 	struct nubus_dir dir;
442 	struct nubus_dirent ent;
443 	struct nubus_dev *dev;
444 
445 	pr_debug("  Functional resource 0x%02x:\n", parent->type);
446 	nubus_get_subdir(parent, &dir);
447 
448 	/* Actually we should probably panic if this fails */
449 	if ((dev = kzalloc(sizeof(*dev), GFP_ATOMIC)) == NULL)
450 		return NULL;
451 	dev->resid = parent->type;
452 	dev->directory = dir.base;
453 	dev->board = board;
454 
455 	while (nubus_readdir(&dir, &ent) != -1) {
456 		switch (ent.type) {
457 		case NUBUS_RESID_TYPE:
458 		{
459 			unsigned short nbtdata[4];
460 
461 			nubus_get_rsrc_mem(nbtdata, &ent, 8);
462 			dev->category = nbtdata[0];
463 			dev->type     = nbtdata[1];
464 			dev->dr_sw    = nbtdata[2];
465 			dev->dr_hw    = nbtdata[3];
466 			pr_debug("    type: [cat 0x%x type 0x%x sw 0x%x hw 0x%x]\n",
467 				nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]);
468 			break;
469 		}
470 		case NUBUS_RESID_NAME:
471 		{
472 			nubus_get_rsrc_str(dev->name, &ent, sizeof(dev->name));
473 			pr_debug("    name: %s\n", dev->name);
474 			break;
475 		}
476 		case NUBUS_RESID_DRVRDIR:
477 		{
478 			/* MacOS driver.  If we were NetBSD we might
479 			   use this :-) */
480 			struct nubus_dir drvr_dir;
481 			struct nubus_dirent drvr_ent;
482 
483 			nubus_get_subdir(&ent, &drvr_dir);
484 			nubus_readdir(&drvr_dir, &drvr_ent);
485 			dev->driver = nubus_dirptr(&drvr_ent);
486 			pr_debug("    driver at: 0x%p\n", dev->driver);
487 			break;
488 		}
489 		case NUBUS_RESID_MINOR_BASEOS:
490 			/* We will need this in order to support
491 			   multiple framebuffers.  It might be handy
492 			   for Ethernet as well */
493 			nubus_get_rsrc_mem(&dev->iobase, &ent, 4);
494 			pr_debug("    memory offset: 0x%08lx\n", dev->iobase);
495 			break;
496 		case NUBUS_RESID_MINOR_LENGTH:
497 			/* Ditto */
498 			nubus_get_rsrc_mem(&dev->iosize, &ent, 4);
499 			pr_debug("    memory length: 0x%08lx\n", dev->iosize);
500 			break;
501 		case NUBUS_RESID_FLAGS:
502 			dev->flags = ent.data;
503 			pr_debug("    flags: 0x%06x\n", dev->flags);
504 			break;
505 		case NUBUS_RESID_HWDEVID:
506 			dev->hwdevid = ent.data;
507 			pr_debug("    hwdevid: 0x%06x\n", dev->hwdevid);
508 			break;
509 		default:
510 			/* Local/Private resources have their own
511 			   function */
512 			nubus_show_private_resource(dev, &ent);
513 		}
514 	}
515 
516 	return dev;
517 }
518 
519 /* This is cool. */
520 static int __init nubus_get_vidnames(struct nubus_board *board,
521 				     const struct nubus_dirent *parent)
522 {
523 	struct nubus_dir dir;
524 	struct nubus_dirent ent;
525 
526 	/* FIXME: obviously we want to put this in a header file soon */
527 	struct vidmode {
528 		u32 size;
529 		/* Don't know what this is yet */
530 		u16 id;
531 		/* Longest one I've seen so far is 26 characters */
532 		char name[36];
533 	};
534 
535 	pr_debug("    video modes supported:\n");
536 	nubus_get_subdir(parent, &dir);
537 
538 	while (nubus_readdir(&dir, &ent) != -1) {
539 		struct vidmode mode;
540 		u32 size;
541 
542 		/* First get the length */
543 		nubus_get_rsrc_mem(&size, &ent, 4);
544 
545 		/* Now clobber the whole thing */
546 		if (size > sizeof(mode) - 1)
547 			size = sizeof(mode) - 1;
548 		memset(&mode, 0, sizeof(mode));
549 		nubus_get_rsrc_mem(&mode, &ent, size);
550 		pr_debug("      0x%02x: 0x%04x %s\n", ent.type,
551 			mode.id, mode.name);
552 	}
553 	return 0;
554 }
555 
556 /* This is *really* cool. */
557 static int __init nubus_get_icon(struct nubus_board *board,
558 				 const struct nubus_dirent *ent)
559 {
560 	/* Should be 32x32 if my memory serves me correctly */
561 	u32 icon[32];
562 	int i;
563 
564 	nubus_get_rsrc_mem(&icon, ent, 128);
565 	pr_debug("    icon:\n");
566 	for (i = 0; i < 8; i++)
567 		pr_debug("        %08x %08x %08x %08x\n",
568 			icon[i * 4 + 0], icon[i * 4 + 1],
569 			icon[i * 4 + 2], icon[i * 4 + 3]);
570 
571 	return 0;
572 }
573 
574 static int __init nubus_get_vendorinfo(struct nubus_board *board,
575 				       const struct nubus_dirent *parent)
576 {
577 	struct nubus_dir dir;
578 	struct nubus_dirent ent;
579 	static char *vendor_fields[6] = { "ID", "serial", "revision",
580 	                                  "part", "date", "unknown field" };
581 
582 	pr_debug("    vendor info:\n");
583 	nubus_get_subdir(parent, &dir);
584 
585 	while (nubus_readdir(&dir, &ent) != -1) {
586 		char name[64];
587 
588 		/* These are all strings, we think */
589 		nubus_get_rsrc_str(name, &ent, sizeof(name));
590 		if (ent.type < 1 || ent.type > 5)
591 			ent.type = 5;
592 		pr_debug("    %s: %s\n", vendor_fields[ent.type - 1], name);
593 	}
594 	return 0;
595 }
596 
597 static int __init nubus_get_board_resource(struct nubus_board *board, int slot,
598 					   const struct nubus_dirent *parent)
599 {
600 	struct nubus_dir dir;
601 	struct nubus_dirent ent;
602 
603 	pr_debug("  Board resource 0x%02x:\n", parent->type);
604 	nubus_get_subdir(parent, &dir);
605 
606 	while (nubus_readdir(&dir, &ent) != -1) {
607 		switch (ent.type) {
608 		case NUBUS_RESID_TYPE:
609 		{
610 			unsigned short nbtdata[4];
611 			/* This type is always the same, and is not
612 			   useful except insofar as it tells us that
613 			   we really are looking at a board resource. */
614 			nubus_get_rsrc_mem(nbtdata, &ent, 8);
615 			pr_debug("    type: [cat 0x%x type 0x%x sw 0x%x hw 0x%x]\n",
616 				nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]);
617 			if (nbtdata[0] != 1 || nbtdata[1] != 0 ||
618 			    nbtdata[2] != 0 || nbtdata[3] != 0)
619 				pr_err("this sResource is not a board resource!\n");
620 			break;
621 		}
622 		case NUBUS_RESID_NAME:
623 			nubus_get_rsrc_str(board->name, &ent,
624 					   sizeof(board->name));
625 			pr_debug("    name: %s\n", board->name);
626 			break;
627 		case NUBUS_RESID_ICON:
628 			nubus_get_icon(board, &ent);
629 			break;
630 		case NUBUS_RESID_BOARDID:
631 			pr_debug("    board id: 0x%x\n", ent.data);
632 			break;
633 		case NUBUS_RESID_PRIMARYINIT:
634 			pr_debug("    primary init offset: 0x%06x\n", ent.data);
635 			break;
636 		case NUBUS_RESID_VENDORINFO:
637 			nubus_get_vendorinfo(board, &ent);
638 			break;
639 		case NUBUS_RESID_FLAGS:
640 			pr_debug("    flags: 0x%06x\n", ent.data);
641 			break;
642 		case NUBUS_RESID_HWDEVID:
643 			pr_debug("    hwdevid: 0x%06x\n", ent.data);
644 			break;
645 		case NUBUS_RESID_SECONDINIT:
646 			pr_debug("    secondary init offset: 0x%06x\n",
647 				 ent.data);
648 			break;
649 			/* WTF isn't this in the functional resources? */
650 		case NUBUS_RESID_VIDNAMES:
651 			nubus_get_vidnames(board, &ent);
652 			break;
653 			/* Same goes for this */
654 		case NUBUS_RESID_VIDMODES:
655 			pr_debug("    video mode parameter directory offset: 0x%06x\n",
656 				ent.data);
657 			break;
658 		default:
659 			pr_debug("    unknown resource 0x%02x, data 0x%06x\n",
660 				ent.type, ent.data);
661 		}
662 	}
663 	return 0;
664 }
665 
666 /* Add a board (might be many devices) to the list */
667 static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
668 {
669 	struct nubus_board *board;
670 	struct nubus_board **boardp;
671 	unsigned char *rp;
672 	unsigned long dpat;
673 	struct nubus_dir dir;
674 	struct nubus_dirent ent;
675 
676 	/* Move to the start of the format block */
677 	rp = nubus_rom_addr(slot);
678 	nubus_rewind(&rp, FORMAT_BLOCK_SIZE, bytelanes);
679 
680 	/* Actually we should probably panic if this fails */
681 	if ((board = kzalloc(sizeof(*board), GFP_ATOMIC)) == NULL)
682 		return NULL;
683 	board->fblock = rp;
684 
685 	/* Dump the format block for debugging purposes */
686 	pr_debug("Slot %X, format block at 0x%p:\n", slot, rp);
687 	pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes));
688 	pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes));
689 	pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes));
690 	pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes));
691 	pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes));
692 	pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes));
693 	pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes));
694 	pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes));
695 	rp = board->fblock;
696 
697 	board->slot = slot;
698 	board->slot_addr = (unsigned long)nubus_slot_addr(slot);
699 	board->doffset = nubus_get_rom(&rp, 4, bytelanes);
700 	/* rom_length is *supposed* to be the total length of the
701 	 * ROM.  In practice it is the "amount of ROM used to compute
702 	 * the CRC."  So some jokers decide to set it to zero and
703 	 * set the crc to zero so they don't have to do any math.
704 	 * See the Performa 460 ROM, for example.  Those Apple "engineers".
705 	 */
706 	board->rom_length = nubus_get_rom(&rp, 4, bytelanes);
707 	board->crc = nubus_get_rom(&rp, 4, bytelanes);
708 	board->rev = nubus_get_rom(&rp, 1, bytelanes);
709 	board->format = nubus_get_rom(&rp, 1, bytelanes);
710 	board->lanes = bytelanes;
711 
712 	/* Directory offset should be small and negative... */
713 	if (!(board->doffset & 0x00FF0000))
714 		pr_warn("Dodgy doffset!\n");
715 	dpat = nubus_get_rom(&rp, 4, bytelanes);
716 	if (dpat != NUBUS_TEST_PATTERN)
717 		pr_warn("Wrong test pattern %08lx!\n", dpat);
718 
719 	/*
720 	 *	I wonder how the CRC is meant to work -
721 	 *		any takers ?
722 	 * CSA: According to MAC docs, not all cards pass the CRC anyway,
723 	 * since the initial Macintosh ROM releases skipped the check.
724 	 */
725 
726 	/* Set up the directory pointer */
727 	board->directory = board->fblock;
728 	nubus_move(&board->directory, nubus_expand32(board->doffset),
729 	           board->lanes);
730 
731 	nubus_get_root_dir(board, &dir);
732 
733 	/* We're ready to rock */
734 	pr_debug("Slot %X resources:\n", slot);
735 
736 	/* Each slot should have one board resource and any number of
737 	   functional resources.  So we'll fill in some fields in the
738 	   struct nubus_board from the board resource, then walk down
739 	   the list of functional resources, spinning out a nubus_dev
740 	   for each of them. */
741 	if (nubus_readdir(&dir, &ent) == -1) {
742 		/* We can't have this! */
743 		pr_err("Board resource not found!\n");
744 		return NULL;
745 	} else {
746 		nubus_get_board_resource(board, slot, &ent);
747 	}
748 
749 	while (nubus_readdir(&dir, &ent) != -1) {
750 		struct nubus_dev *dev;
751 		struct nubus_dev **devp;
752 
753 		dev = nubus_get_functional_resource(board, slot, &ent);
754 		if (dev == NULL)
755 			continue;
756 
757 		/* We zeroed this out above */
758 		if (board->first_dev == NULL)
759 			board->first_dev = dev;
760 
761 		/* Put it on the global NuBus device chain. Keep entries in order. */
762 		for (devp = &nubus_devices; *devp != NULL;
763 		     devp = &((*devp)->next))
764 			/* spin */;
765 		*devp = dev;
766 		dev->next = NULL;
767 	}
768 
769 	/* Put it on the global NuBus board chain. Keep entries in order. */
770 	for (boardp = &nubus_boards; *boardp != NULL;
771 	     boardp = &((*boardp)->next))
772 		/* spin */;
773 	*boardp = board;
774 	board->next = NULL;
775 
776 	return board;
777 }
778 
779 static void __init nubus_probe_slot(int slot)
780 {
781 	unsigned char dp;
782 	unsigned char *rp;
783 	int i;
784 
785 	rp = nubus_rom_addr(slot);
786 	for (i = 4; i; i--) {
787 		int card_present;
788 
789 		rp--;
790 		card_present = hwreg_present(rp);
791 		if (!card_present)
792 			continue;
793 
794 		dp = *rp;
795 
796 		/* The last byte of the format block consists of two
797 		   nybbles which are "mirror images" of each other.
798 		   These show us the valid bytelanes */
799 		if ((((dp >> 4) ^ dp) & 0x0F) != 0x0F)
800 			continue;
801 		/* Check that this value is actually *on* one of the
802 		   bytelanes it claims are valid! */
803 		if (not_useful(rp, dp))
804 			continue;
805 
806 		/* Looks promising.  Let's put it on the list. */
807 		nubus_add_board(slot, dp);
808 
809 		return;
810 	}
811 }
812 
813 static void __init nubus_scan_bus(void)
814 {
815 	int slot;
816 
817 	pr_info("NuBus: Scanning NuBus slots.\n");
818 	for (slot = 9; slot < 15; slot++) {
819 		nubus_probe_slot(slot);
820 	}
821 }
822 
823 static int __init nubus_init(void)
824 {
825 	if (!MACH_IS_MAC)
826 		return 0;
827 
828 	nubus_devices = NULL;
829 	nubus_boards = NULL;
830 	nubus_scan_bus();
831 	nubus_proc_init();
832 	return 0;
833 }
834 
835 subsys_initcall(nubus_init);
836