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