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