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 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(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 if (!*t++) 185 break; 186 len--; 187 } 188 } 189 EXPORT_SYMBOL(nubus_get_rsrc_str); 190 191 int nubus_get_root_dir(const struct nubus_board *board, 192 struct nubus_dir *dir) 193 { 194 dir->ptr = dir->base = board->directory; 195 dir->done = 0; 196 dir->mask = board->lanes; 197 return 0; 198 } 199 EXPORT_SYMBOL(nubus_get_root_dir); 200 201 /* This is a slyly renamed version of the above */ 202 int nubus_get_func_dir(const struct nubus_dev *dev, 203 struct nubus_dir *dir) 204 { 205 dir->ptr = dir->base = dev->directory; 206 dir->done = 0; 207 dir->mask = dev->board->lanes; 208 return 0; 209 } 210 EXPORT_SYMBOL(nubus_get_func_dir); 211 212 int nubus_get_board_dir(const struct nubus_board *board, 213 struct nubus_dir *dir) 214 { 215 struct nubus_dirent ent; 216 217 dir->ptr = dir->base = board->directory; 218 dir->done = 0; 219 dir->mask = board->lanes; 220 221 /* Now dereference it (the first directory is always the board 222 directory) */ 223 if (nubus_readdir(dir, &ent) == -1) 224 return -1; 225 if (nubus_get_subdir(&ent, dir) == -1) 226 return -1; 227 return 0; 228 } 229 EXPORT_SYMBOL(nubus_get_board_dir); 230 231 int nubus_get_subdir(const struct nubus_dirent *ent, 232 struct nubus_dir *dir) 233 { 234 dir->ptr = dir->base = nubus_dirptr(ent); 235 dir->done = 0; 236 dir->mask = ent->mask; 237 return 0; 238 } 239 EXPORT_SYMBOL(nubus_get_subdir); 240 241 int nubus_readdir(struct nubus_dir *nd, struct nubus_dirent *ent) 242 { 243 u32 resid; 244 245 if (nd->done) 246 return -1; 247 248 /* Do this first, otherwise nubus_rewind & co are off by 4 */ 249 ent->base = nd->ptr; 250 251 /* This moves nd->ptr forward */ 252 resid = nubus_get_rom(&nd->ptr, 4, nd->mask); 253 254 /* EOL marker, as per the Apple docs */ 255 if ((resid & 0xff000000) == 0xff000000) { 256 /* Mark it as done */ 257 nd->done = 1; 258 return -1; 259 } 260 261 /* First byte is the resource ID */ 262 ent->type = resid >> 24; 263 /* Low 3 bytes might contain data (or might not) */ 264 ent->data = resid & 0xffffff; 265 ent->mask = nd->mask; 266 return 0; 267 } 268 EXPORT_SYMBOL(nubus_readdir); 269 270 int nubus_rewinddir(struct nubus_dir *dir) 271 { 272 dir->ptr = dir->base; 273 dir->done = 0; 274 return 0; 275 } 276 EXPORT_SYMBOL(nubus_rewinddir); 277 278 /* Driver interface functions, more or less like in pci.c */ 279 280 struct nubus_dev* 281 nubus_find_device(unsigned short category, unsigned short type, 282 unsigned short dr_hw, unsigned short dr_sw, 283 const struct nubus_dev *from) 284 { 285 struct nubus_dev *itor = from ? from->next : nubus_devices; 286 287 while (itor) { 288 if (itor->category == category && itor->type == type && 289 itor->dr_hw == dr_hw && itor->dr_sw == dr_sw) 290 return itor; 291 itor = itor->next; 292 } 293 return NULL; 294 } 295 EXPORT_SYMBOL(nubus_find_device); 296 297 struct nubus_dev* 298 nubus_find_type(unsigned short category, unsigned short type, 299 const struct nubus_dev *from) 300 { 301 struct nubus_dev *itor = from ? from->next : nubus_devices; 302 303 while (itor) { 304 if (itor->category == category && itor->type == type) 305 return itor; 306 itor = itor->next; 307 } 308 return NULL; 309 } 310 EXPORT_SYMBOL(nubus_find_type); 311 312 struct nubus_dev* 313 nubus_find_slot(unsigned int slot, const struct nubus_dev *from) 314 { 315 struct nubus_dev *itor = from ? from->next : nubus_devices; 316 317 while (itor) { 318 if (itor->board->slot == slot) 319 return itor; 320 itor = itor->next; 321 } 322 return NULL; 323 } 324 EXPORT_SYMBOL(nubus_find_slot); 325 326 int 327 nubus_find_rsrc(struct nubus_dir *dir, unsigned char rsrc_type, 328 struct nubus_dirent *ent) 329 { 330 while (nubus_readdir(dir, ent) != -1) { 331 if (ent->type == rsrc_type) 332 return 0; 333 } 334 return -1; 335 } 336 EXPORT_SYMBOL(nubus_find_rsrc); 337 338 /* Initialization functions - decide which slots contain stuff worth 339 looking at, and print out lots and lots of information from the 340 resource blocks. */ 341 342 /* FIXME: A lot of this stuff will eventually be useful after 343 initialization, for intelligently probing Ethernet and video chips, 344 among other things. The rest of it should go in the /proc code. 345 For now, we just use it to give verbose boot logs. */ 346 347 static int __init nubus_show_display_resource(struct nubus_dev *dev, 348 const struct nubus_dirent *ent) 349 { 350 switch (ent->type) { 351 case NUBUS_RESID_GAMMADIR: 352 pr_info(" gamma directory offset: 0x%06x\n", ent->data); 353 break; 354 case 0x0080 ... 0x0085: 355 pr_info(" mode %02X info offset: 0x%06x\n", 356 ent->type, ent->data); 357 break; 358 default: 359 pr_info(" unknown resource %02X, data 0x%06x\n", 360 ent->type, ent->data); 361 } 362 return 0; 363 } 364 365 static int __init nubus_show_network_resource(struct nubus_dev *dev, 366 const struct nubus_dirent *ent) 367 { 368 switch (ent->type) { 369 case NUBUS_RESID_MAC_ADDRESS: 370 { 371 char addr[6]; 372 373 nubus_get_rsrc_mem(addr, ent, 6); 374 pr_info(" MAC address: %pM\n", addr); 375 break; 376 } 377 default: 378 pr_info(" unknown resource %02X, data 0x%06x\n", 379 ent->type, ent->data); 380 } 381 return 0; 382 } 383 384 static int __init nubus_show_cpu_resource(struct nubus_dev *dev, 385 const struct nubus_dirent *ent) 386 { 387 switch (ent->type) { 388 case NUBUS_RESID_MEMINFO: 389 { 390 unsigned long meminfo[2]; 391 392 nubus_get_rsrc_mem(&meminfo, ent, 8); 393 pr_info(" memory: [ 0x%08lx 0x%08lx ]\n", 394 meminfo[0], meminfo[1]); 395 break; 396 } 397 case NUBUS_RESID_ROMINFO: 398 { 399 unsigned long rominfo[2]; 400 401 nubus_get_rsrc_mem(&rominfo, ent, 8); 402 pr_info(" ROM: [ 0x%08lx 0x%08lx ]\n", 403 rominfo[0], rominfo[1]); 404 break; 405 } 406 default: 407 pr_info(" unknown resource %02X, data 0x%06x\n", 408 ent->type, ent->data); 409 } 410 return 0; 411 } 412 413 static int __init nubus_show_private_resource(struct nubus_dev *dev, 414 const struct nubus_dirent *ent) 415 { 416 switch (dev->category) { 417 case NUBUS_CAT_DISPLAY: 418 nubus_show_display_resource(dev, ent); 419 break; 420 case NUBUS_CAT_NETWORK: 421 nubus_show_network_resource(dev, ent); 422 break; 423 case NUBUS_CAT_CPU: 424 nubus_show_cpu_resource(dev, ent); 425 break; 426 default: 427 pr_info(" unknown resource %02X, data 0x%06x\n", 428 ent->type, ent->data); 429 } 430 return 0; 431 } 432 433 static struct nubus_dev * __init 434 nubus_get_functional_resource(struct nubus_board *board, int slot, 435 const struct nubus_dirent *parent) 436 { 437 struct nubus_dir dir; 438 struct nubus_dirent ent; 439 struct nubus_dev *dev; 440 441 pr_info(" Function 0x%02x:\n", parent->type); 442 nubus_get_subdir(parent, &dir); 443 444 pr_debug("%s: parent is 0x%p, dir is 0x%p\n", 445 __func__, parent->base, dir.base); 446 447 /* Actually we should probably panic if this fails */ 448 if ((dev = kzalloc(sizeof(*dev), GFP_ATOMIC)) == NULL) 449 return NULL; 450 dev->resid = parent->type; 451 dev->directory = dir.base; 452 dev->board = board; 453 454 while (nubus_readdir(&dir, &ent) != -1) { 455 switch (ent.type) { 456 case NUBUS_RESID_TYPE: 457 { 458 unsigned short nbtdata[4]; 459 460 nubus_get_rsrc_mem(nbtdata, &ent, 8); 461 dev->category = nbtdata[0]; 462 dev->type = nbtdata[1]; 463 dev->dr_sw = nbtdata[2]; 464 dev->dr_hw = nbtdata[3]; 465 pr_info(" type: [cat 0x%x type 0x%x sw 0x%x hw 0x%x]\n", 466 nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]); 467 break; 468 } 469 case NUBUS_RESID_NAME: 470 { 471 nubus_get_rsrc_str(dev->name, &ent, 64); 472 pr_info(" name: %s\n", dev->name); 473 break; 474 } 475 case NUBUS_RESID_DRVRDIR: 476 { 477 /* MacOS driver. If we were NetBSD we might 478 use this :-) */ 479 struct nubus_dir drvr_dir; 480 struct nubus_dirent drvr_ent; 481 482 nubus_get_subdir(&ent, &drvr_dir); 483 nubus_readdir(&drvr_dir, &drvr_ent); 484 dev->driver = nubus_dirptr(&drvr_ent); 485 pr_info(" driver at: 0x%p\n", dev->driver); 486 break; 487 } 488 case NUBUS_RESID_MINOR_BASEOS: 489 /* We will need this in order to support 490 multiple framebuffers. It might be handy 491 for Ethernet as well */ 492 nubus_get_rsrc_mem(&dev->iobase, &ent, 4); 493 pr_info(" memory offset: 0x%08lx\n", dev->iobase); 494 break; 495 case NUBUS_RESID_MINOR_LENGTH: 496 /* Ditto */ 497 nubus_get_rsrc_mem(&dev->iosize, &ent, 4); 498 pr_info(" memory length: 0x%08lx\n", dev->iosize); 499 break; 500 case NUBUS_RESID_FLAGS: 501 dev->flags = ent.data; 502 pr_info(" flags: 0x%06x\n", dev->flags); 503 break; 504 case NUBUS_RESID_HWDEVID: 505 dev->hwdevid = ent.data; 506 pr_info(" hwdevid: 0x%06x\n", dev->hwdevid); 507 break; 508 default: 509 /* Local/Private resources have their own 510 function */ 511 nubus_show_private_resource(dev, &ent); 512 } 513 } 514 515 return dev; 516 } 517 518 /* This is cool. */ 519 static int __init nubus_get_vidnames(struct nubus_board *board, 520 const struct nubus_dirent *parent) 521 { 522 struct nubus_dir dir; 523 struct nubus_dirent ent; 524 525 /* FIXME: obviously we want to put this in a header file soon */ 526 struct vidmode { 527 u32 size; 528 /* Don't know what this is yet */ 529 u16 id; 530 /* Longest one I've seen so far is 26 characters */ 531 char name[32]; 532 }; 533 534 pr_info(" video modes supported:\n"); 535 nubus_get_subdir(parent, &dir); 536 pr_debug("%s: parent is 0x%p, dir is 0x%p\n", 537 __func__, parent->base, dir.base); 538 539 while (nubus_readdir(&dir, &ent) != -1) { 540 struct vidmode mode; 541 u32 size; 542 543 /* First get the length */ 544 nubus_get_rsrc_mem(&size, &ent, 4); 545 546 /* Now clobber the whole thing */ 547 if (size > sizeof(mode) - 1) 548 size = sizeof(mode) - 1; 549 memset(&mode, 0, sizeof(mode)); 550 nubus_get_rsrc_mem(&mode, &ent, size); 551 pr_info(" %02X: (%02X) %s\n", ent.type, 552 mode.id, mode.name); 553 } 554 return 0; 555 } 556 557 /* This is *really* cool. */ 558 static int __init nubus_get_icon(struct nubus_board *board, 559 const struct nubus_dirent *ent) 560 { 561 /* Should be 32x32 if my memory serves me correctly */ 562 unsigned char icon[128]; 563 int x, y; 564 565 nubus_get_rsrc_mem(&icon, ent, 128); 566 pr_info(" icon:\n"); 567 568 /* We should actually plot these somewhere in the framebuffer 569 init. This is just to demonstrate that they do, in fact, 570 exist */ 571 for (y = 0; y < 32; y++) { 572 pr_info(" "); 573 for (x = 0; x < 32; x++) { 574 if (icon[y * 4 + x / 8] & (0x80 >> (x % 8))) 575 pr_cont("*"); 576 else 577 pr_cont(" "); 578 } 579 pr_cont("\n"); 580 } 581 return 0; 582 } 583 584 static int __init nubus_get_vendorinfo(struct nubus_board *board, 585 const struct nubus_dirent *parent) 586 { 587 struct nubus_dir dir; 588 struct nubus_dirent ent; 589 static char *vendor_fields[6] = { "ID", "serial", "revision", 590 "part", "date", "unknown field" }; 591 592 pr_info(" vendor info:\n"); 593 nubus_get_subdir(parent, &dir); 594 pr_debug("%s: parent is 0x%p, dir is 0x%p\n", 595 __func__, parent->base, dir.base); 596 597 while (nubus_readdir(&dir, &ent) != -1) { 598 char name[64]; 599 600 /* These are all strings, we think */ 601 nubus_get_rsrc_str(name, &ent, 64); 602 if (ent.type > 5) 603 ent.type = 5; 604 pr_info(" %s: %s\n", vendor_fields[ent.type - 1], name); 605 } 606 return 0; 607 } 608 609 static int __init nubus_get_board_resource(struct nubus_board *board, int slot, 610 const struct nubus_dirent *parent) 611 { 612 struct nubus_dir dir; 613 struct nubus_dirent ent; 614 615 nubus_get_subdir(parent, &dir); 616 pr_debug("%s: parent is 0x%p, dir is 0x%p\n", 617 __func__, parent->base, dir.base); 618 619 while (nubus_readdir(&dir, &ent) != -1) { 620 switch (ent.type) { 621 case NUBUS_RESID_TYPE: 622 { 623 unsigned short nbtdata[4]; 624 /* This type is always the same, and is not 625 useful except insofar as it tells us that 626 we really are looking at a board resource. */ 627 nubus_get_rsrc_mem(nbtdata, &ent, 8); 628 pr_info(" type: [cat 0x%x type 0x%x sw 0x%x hw 0x%x]\n", 629 nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]); 630 if (nbtdata[0] != 1 || nbtdata[1] != 0 || 631 nbtdata[2] != 0 || nbtdata[3] != 0) 632 pr_err("this sResource is not a board resource!\n"); 633 break; 634 } 635 case NUBUS_RESID_NAME: 636 nubus_get_rsrc_str(board->name, &ent, 64); 637 pr_info(" name: %s\n", board->name); 638 break; 639 case NUBUS_RESID_ICON: 640 nubus_get_icon(board, &ent); 641 break; 642 case NUBUS_RESID_BOARDID: 643 pr_info(" board id: 0x%x\n", ent.data); 644 break; 645 case NUBUS_RESID_PRIMARYINIT: 646 pr_info(" primary init offset: 0x%06x\n", ent.data); 647 break; 648 case NUBUS_RESID_VENDORINFO: 649 nubus_get_vendorinfo(board, &ent); 650 break; 651 case NUBUS_RESID_FLAGS: 652 pr_info(" flags: 0x%06x\n", ent.data); 653 break; 654 case NUBUS_RESID_HWDEVID: 655 pr_info(" hwdevid: 0x%06x\n", ent.data); 656 break; 657 case NUBUS_RESID_SECONDINIT: 658 pr_info(" secondary init offset: 0x%06x\n", ent.data); 659 break; 660 /* WTF isn't this in the functional resources? */ 661 case NUBUS_RESID_VIDNAMES: 662 nubus_get_vidnames(board, &ent); 663 break; 664 /* Same goes for this */ 665 case NUBUS_RESID_VIDMODES: 666 pr_info(" video mode parameter directory offset: 0x%06x\n", 667 ent.data); 668 break; 669 default: 670 pr_info(" unknown resource %02X, data 0x%06x\n", 671 ent.type, ent.data); 672 } 673 } 674 return 0; 675 } 676 677 /* Add a board (might be many devices) to the list */ 678 static struct nubus_board * __init nubus_add_board(int slot, int bytelanes) 679 { 680 struct nubus_board *board; 681 struct nubus_board **boardp; 682 unsigned char *rp; 683 unsigned long dpat; 684 struct nubus_dir dir; 685 struct nubus_dirent ent; 686 687 /* Move to the start of the format block */ 688 rp = nubus_rom_addr(slot); 689 nubus_rewind(&rp, FORMAT_BLOCK_SIZE, bytelanes); 690 691 /* Actually we should probably panic if this fails */ 692 if ((board = kzalloc(sizeof(*board), GFP_ATOMIC)) == NULL) 693 return NULL; 694 board->fblock = rp; 695 696 /* Dump the format block for debugging purposes */ 697 pr_debug("Slot %X, format block at 0x%p:\n", slot, rp); 698 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); 699 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); 700 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); 701 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); 702 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); 703 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); 704 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); 705 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); 706 rp = board->fblock; 707 708 board->slot = slot; 709 board->slot_addr = (unsigned long)nubus_slot_addr(slot); 710 board->doffset = nubus_get_rom(&rp, 4, bytelanes); 711 /* rom_length is *supposed* to be the total length of the 712 * ROM. In practice it is the "amount of ROM used to compute 713 * the CRC." So some jokers decide to set it to zero and 714 * set the crc to zero so they don't have to do any math. 715 * See the Performa 460 ROM, for example. Those Apple "engineers". 716 */ 717 board->rom_length = nubus_get_rom(&rp, 4, bytelanes); 718 board->crc = nubus_get_rom(&rp, 4, bytelanes); 719 board->rev = nubus_get_rom(&rp, 1, bytelanes); 720 board->format = nubus_get_rom(&rp, 1, bytelanes); 721 board->lanes = bytelanes; 722 723 /* Directory offset should be small and negative... */ 724 if (!(board->doffset & 0x00FF0000)) 725 pr_warn("Dodgy doffset!\n"); 726 dpat = nubus_get_rom(&rp, 4, bytelanes); 727 if (dpat != NUBUS_TEST_PATTERN) 728 pr_warn("Wrong test pattern %08lx!\n", dpat); 729 730 /* 731 * I wonder how the CRC is meant to work - 732 * any takers ? 733 * CSA: According to MAC docs, not all cards pass the CRC anyway, 734 * since the initial Macintosh ROM releases skipped the check. 735 */ 736 737 /* Set up the directory pointer */ 738 board->directory = board->fblock; 739 nubus_move(&board->directory, nubus_expand32(board->doffset), 740 board->lanes); 741 742 nubus_get_root_dir(board, &dir); 743 744 /* We're ready to rock */ 745 pr_info("Slot %X:\n", slot); 746 747 /* Each slot should have one board resource and any number of 748 functional resources. So we'll fill in some fields in the 749 struct nubus_board from the board resource, then walk down 750 the list of functional resources, spinning out a nubus_dev 751 for each of them. */ 752 if (nubus_readdir(&dir, &ent) == -1) { 753 /* We can't have this! */ 754 pr_err("Board resource not found!\n"); 755 return NULL; 756 } else { 757 pr_info(" Board resource:\n"); 758 nubus_get_board_resource(board, slot, &ent); 759 } 760 761 while (nubus_readdir(&dir, &ent) != -1) { 762 struct nubus_dev *dev; 763 struct nubus_dev **devp; 764 765 dev = nubus_get_functional_resource(board, slot, &ent); 766 if (dev == NULL) 767 continue; 768 769 /* We zeroed this out above */ 770 if (board->first_dev == NULL) 771 board->first_dev = dev; 772 773 /* Put it on the global NuBus device chain. Keep entries in order. */ 774 for (devp = &nubus_devices; *devp != NULL; 775 devp = &((*devp)->next)) 776 /* spin */; 777 *devp = dev; 778 dev->next = NULL; 779 } 780 781 /* Put it on the global NuBus board chain. Keep entries in order. */ 782 for (boardp = &nubus_boards; *boardp != NULL; 783 boardp = &((*boardp)->next)) 784 /* spin */; 785 *boardp = board; 786 board->next = NULL; 787 788 return board; 789 } 790 791 void __init nubus_probe_slot(int slot) 792 { 793 unsigned char dp; 794 unsigned char *rp; 795 int i; 796 797 rp = nubus_rom_addr(slot); 798 for (i = 4; i; i--) { 799 int card_present; 800 801 rp--; 802 card_present = hwreg_present(rp); 803 if (!card_present) 804 continue; 805 806 dp = *rp; 807 808 /* The last byte of the format block consists of two 809 nybbles which are "mirror images" of each other. 810 These show us the valid bytelanes */ 811 if ((((dp >> 4) ^ dp) & 0x0F) != 0x0F) 812 continue; 813 /* Check that this value is actually *on* one of the 814 bytelanes it claims are valid! */ 815 if (not_useful(rp, dp)) 816 continue; 817 818 /* Looks promising. Let's put it on the list. */ 819 nubus_add_board(slot, dp); 820 821 return; 822 } 823 } 824 825 void __init nubus_scan_bus(void) 826 { 827 int slot; 828 829 for (slot = 9; slot < 15; slot++) { 830 nubus_probe_slot(slot); 831 } 832 } 833 834 static int __init nubus_init(void) 835 { 836 if (!MACH_IS_MAC) 837 return 0; 838 839 pr_info("NuBus: Scanning NuBus slots.\n"); 840 nubus_devices = NULL; 841 nubus_boards = NULL; 842 nubus_scan_bus(); 843 nubus_proc_init(); 844 return 0; 845 } 846 847 subsys_initcall(nubus_init); 848