1 /* 2 * linux/arch/m68k/mac/config.c 3 * 4 * This file is subject to the terms and conditions of the GNU General Public 5 * License. See the file COPYING in the main directory of this archive 6 * for more details. 7 */ 8 9 /* 10 * Miscellaneous linux stuff 11 */ 12 13 #include <linux/module.h> 14 #include <linux/types.h> 15 #include <linux/mm.h> 16 #include <linux/tty.h> 17 #include <linux/console.h> 18 #include <linux/interrupt.h> 19 /* keyb */ 20 #include <linux/random.h> 21 #include <linux/delay.h> 22 /* keyb */ 23 #include <linux/init.h> 24 #include <linux/vt_kern.h> 25 #include <linux/platform_device.h> 26 #include <linux/adb.h> 27 #include <linux/cuda.h> 28 29 #define BOOTINFO_COMPAT_1_0 30 #include <asm/setup.h> 31 #include <asm/bootinfo.h> 32 33 #include <asm/system.h> 34 #include <asm/io.h> 35 #include <asm/irq.h> 36 #include <asm/pgtable.h> 37 #include <asm/rtc.h> 38 #include <asm/machdep.h> 39 40 #include <asm/macintosh.h> 41 #include <asm/macints.h> 42 #include <asm/machw.h> 43 44 #include <asm/mac_iop.h> 45 #include <asm/mac_via.h> 46 #include <asm/mac_oss.h> 47 #include <asm/mac_psc.h> 48 49 /* Mac bootinfo struct */ 50 struct mac_booter_data mac_bi_data; 51 52 /* The phys. video addr. - might be bogus on some machines */ 53 static unsigned long mac_orig_videoaddr; 54 55 /* Mac specific timer functions */ 56 extern unsigned long mac_gettimeoffset(void); 57 extern int mac_hwclk(int, struct rtc_time *); 58 extern int mac_set_clock_mmss(unsigned long); 59 extern void iop_preinit(void); 60 extern void iop_init(void); 61 extern void via_init(void); 62 extern void via_init_clock(irq_handler_t func); 63 extern void via_flush_cache(void); 64 extern void oss_init(void); 65 extern void psc_init(void); 66 extern void baboon_init(void); 67 68 extern void mac_mksound(unsigned int, unsigned int); 69 70 static void mac_get_model(char *str); 71 static void mac_identify(void); 72 static void mac_report_hardware(void); 73 74 static void __init mac_sched_init(irq_handler_t vector) 75 { 76 via_init_clock(vector); 77 } 78 79 /* 80 * Parse a Macintosh-specific record in the bootinfo 81 */ 82 83 int __init mac_parse_bootinfo(const struct bi_record *record) 84 { 85 int unknown = 0; 86 const u_long *data = record->data; 87 88 switch (record->tag) { 89 case BI_MAC_MODEL: 90 mac_bi_data.id = *data; 91 break; 92 case BI_MAC_VADDR: 93 mac_bi_data.videoaddr = *data; 94 break; 95 case BI_MAC_VDEPTH: 96 mac_bi_data.videodepth = *data; 97 break; 98 case BI_MAC_VROW: 99 mac_bi_data.videorow = *data; 100 break; 101 case BI_MAC_VDIM: 102 mac_bi_data.dimensions = *data; 103 break; 104 case BI_MAC_VLOGICAL: 105 mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK); 106 mac_orig_videoaddr = *data; 107 break; 108 case BI_MAC_SCCBASE: 109 mac_bi_data.sccbase = *data; 110 break; 111 case BI_MAC_BTIME: 112 mac_bi_data.boottime = *data; 113 break; 114 case BI_MAC_GMTBIAS: 115 mac_bi_data.gmtbias = *data; 116 break; 117 case BI_MAC_MEMSIZE: 118 mac_bi_data.memsize = *data; 119 break; 120 case BI_MAC_CPUID: 121 mac_bi_data.cpuid = *data; 122 break; 123 case BI_MAC_ROMBASE: 124 mac_bi_data.rombase = *data; 125 break; 126 default: 127 unknown = 1; 128 break; 129 } 130 return unknown; 131 } 132 133 /* 134 * Flip into 24bit mode for an instant - flushes the L2 cache card. We 135 * have to disable interrupts for this. Our IRQ handlers will crap 136 * themselves if they take an IRQ in 24bit mode! 137 */ 138 139 static void mac_cache_card_flush(int writeback) 140 { 141 unsigned long flags; 142 143 local_irq_save(flags); 144 via_flush_cache(); 145 local_irq_restore(flags); 146 } 147 148 void __init config_mac(void) 149 { 150 if (!MACH_IS_MAC) 151 printk(KERN_ERR "ERROR: no Mac, but config_mac() called!!\n"); 152 153 mach_sched_init = mac_sched_init; 154 mach_init_IRQ = mac_init_IRQ; 155 mach_get_model = mac_get_model; 156 mach_gettimeoffset = mac_gettimeoffset; 157 mach_hwclk = mac_hwclk; 158 mach_set_clock_mmss = mac_set_clock_mmss; 159 mach_reset = mac_reset; 160 mach_halt = mac_poweroff; 161 mach_power_off = mac_poweroff; 162 mach_max_dma_address = 0xffffffff; 163 #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) 164 mach_beep = mac_mksound; 165 #endif 166 167 /* 168 * Determine hardware present 169 */ 170 171 mac_identify(); 172 mac_report_hardware(); 173 174 /* 175 * AFAIK only the IIci takes a cache card. The IIfx has onboard 176 * cache ... someone needs to figure out how to tell if it's on or 177 * not. 178 */ 179 180 if (macintosh_config->ident == MAC_MODEL_IICI 181 || macintosh_config->ident == MAC_MODEL_IIFX) 182 mach_l2_flush = mac_cache_card_flush; 183 } 184 185 186 /* 187 * Macintosh Table: hardcoded model configuration data. 188 * 189 * Much of this was defined by Alan, based on who knows what docs. 190 * I've added a lot more, and some of that was pure guesswork based 191 * on hardware pages present on the Mac web site. Possibly wildly 192 * inaccurate, so look here if a new Mac model won't run. Example: if 193 * a Mac crashes immediately after the VIA1 registers have been dumped 194 * to the screen, it probably died attempting to read DirB on a RBV. 195 * Meaning it should have MAC_VIA_IIci here :-) 196 */ 197 198 struct mac_model *macintosh_config; 199 EXPORT_SYMBOL(macintosh_config); 200 201 static struct mac_model mac_data_table[] = { 202 /* 203 * We'll pretend to be a Macintosh II, that's pretty safe. 204 */ 205 206 { 207 .ident = MAC_MODEL_II, 208 .name = "Unknown", 209 .adb_type = MAC_ADB_II, 210 .via_type = MAC_VIA_II, 211 .scsi_type = MAC_SCSI_OLD, 212 .scc_type = MAC_SCC_II, 213 .nubus_type = MAC_NUBUS, 214 .floppy_type = MAC_FLOPPY_IWM, 215 }, 216 217 /* 218 * Original Mac II hardware 219 */ 220 221 { 222 .ident = MAC_MODEL_II, 223 .name = "II", 224 .adb_type = MAC_ADB_II, 225 .via_type = MAC_VIA_II, 226 .scsi_type = MAC_SCSI_OLD, 227 .scc_type = MAC_SCC_II, 228 .nubus_type = MAC_NUBUS, 229 .floppy_type = MAC_FLOPPY_IWM, 230 }, { 231 .ident = MAC_MODEL_IIX, 232 .name = "IIx", 233 .adb_type = MAC_ADB_II, 234 .via_type = MAC_VIA_II, 235 .scsi_type = MAC_SCSI_OLD, 236 .scc_type = MAC_SCC_II, 237 .nubus_type = MAC_NUBUS, 238 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 239 }, { 240 .ident = MAC_MODEL_IICX, 241 .name = "IIcx", 242 .adb_type = MAC_ADB_II, 243 .via_type = MAC_VIA_II, 244 .scsi_type = MAC_SCSI_OLD, 245 .scc_type = MAC_SCC_II, 246 .nubus_type = MAC_NUBUS, 247 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 248 }, { 249 .ident = MAC_MODEL_SE30, 250 .name = "SE/30", 251 .adb_type = MAC_ADB_II, 252 .via_type = MAC_VIA_II, 253 .scsi_type = MAC_SCSI_OLD, 254 .scc_type = MAC_SCC_II, 255 .nubus_type = MAC_NUBUS, 256 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 257 }, 258 259 /* 260 * Weirdified Mac II hardware - all subtly different. Gee thanks 261 * Apple. All these boxes seem to have VIA2 in a different place to 262 * the Mac II (+1A000 rather than +4000) 263 * CSA: see http://developer.apple.com/technotes/hw/hw_09.html 264 */ 265 266 { 267 .ident = MAC_MODEL_IICI, 268 .name = "IIci", 269 .adb_type = MAC_ADB_II, 270 .via_type = MAC_VIA_IIci, 271 .scsi_type = MAC_SCSI_OLD, 272 .scc_type = MAC_SCC_II, 273 .nubus_type = MAC_NUBUS, 274 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 275 }, { 276 .ident = MAC_MODEL_IIFX, 277 .name = "IIfx", 278 .adb_type = MAC_ADB_IOP, 279 .via_type = MAC_VIA_IIci, 280 .scsi_type = MAC_SCSI_OLD, 281 .scc_type = MAC_SCC_IOP, 282 .nubus_type = MAC_NUBUS, 283 .floppy_type = MAC_FLOPPY_SWIM_IOP, 284 }, { 285 .ident = MAC_MODEL_IISI, 286 .name = "IIsi", 287 .adb_type = MAC_ADB_IISI, 288 .via_type = MAC_VIA_IIci, 289 .scsi_type = MAC_SCSI_OLD, 290 .scc_type = MAC_SCC_II, 291 .nubus_type = MAC_NUBUS, 292 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 293 }, { 294 .ident = MAC_MODEL_IIVI, 295 .name = "IIvi", 296 .adb_type = MAC_ADB_IISI, 297 .via_type = MAC_VIA_IIci, 298 .scsi_type = MAC_SCSI_OLD, 299 .scc_type = MAC_SCC_II, 300 .nubus_type = MAC_NUBUS, 301 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 302 }, { 303 .ident = MAC_MODEL_IIVX, 304 .name = "IIvx", 305 .adb_type = MAC_ADB_IISI, 306 .via_type = MAC_VIA_IIci, 307 .scsi_type = MAC_SCSI_OLD, 308 .scc_type = MAC_SCC_II, 309 .nubus_type = MAC_NUBUS, 310 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 311 }, 312 313 /* 314 * Classic models (guessing: similar to SE/30? Nope, similar to LC...) 315 */ 316 317 { 318 .ident = MAC_MODEL_CLII, 319 .name = "Classic II", 320 .adb_type = MAC_ADB_IISI, 321 .via_type = MAC_VIA_IIci, 322 .scsi_type = MAC_SCSI_OLD, 323 .scc_type = MAC_SCC_II, 324 .nubus_type = MAC_NUBUS, 325 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 326 }, { 327 .ident = MAC_MODEL_CCL, 328 .name = "Color Classic", 329 .adb_type = MAC_ADB_CUDA, 330 .via_type = MAC_VIA_IIci, 331 .scsi_type = MAC_SCSI_OLD, 332 .scc_type = MAC_SCC_II, 333 .nubus_type = MAC_NUBUS, 334 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 335 }, 336 337 /* 338 * Some Mac LC machines. Basically the same as the IIci, ADB like IIsi 339 */ 340 341 { 342 .ident = MAC_MODEL_LC, 343 .name = "LC", 344 .adb_type = MAC_ADB_IISI, 345 .via_type = MAC_VIA_IIci, 346 .scsi_type = MAC_SCSI_OLD, 347 .scc_type = MAC_SCC_II, 348 .nubus_type = MAC_NUBUS, 349 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 350 }, { 351 .ident = MAC_MODEL_LCII, 352 .name = "LC II", 353 .adb_type = MAC_ADB_IISI, 354 .via_type = MAC_VIA_IIci, 355 .scsi_type = MAC_SCSI_OLD, 356 .scc_type = MAC_SCC_II, 357 .nubus_type = MAC_NUBUS, 358 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 359 }, { 360 .ident = MAC_MODEL_LCIII, 361 .name = "LC III", 362 .adb_type = MAC_ADB_IISI, 363 .via_type = MAC_VIA_IIci, 364 .scsi_type = MAC_SCSI_OLD, 365 .scc_type = MAC_SCC_II, 366 .nubus_type = MAC_NUBUS, 367 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 368 }, 369 370 /* 371 * Quadra. Video is at 0xF9000000, via is like a MacII. We label it 372 * differently as some of the stuff connected to VIA2 seems different. 373 * Better SCSI chip and onboard ethernet using a NatSemi SONIC except 374 * the 660AV and 840AV which use an AMD 79C940 (MACE). 375 * The 700, 900 and 950 have some I/O chips in the wrong place to 376 * confuse us. The 840AV has a SCSI location of its own (same as 377 * the 660AV). 378 */ 379 380 { 381 .ident = MAC_MODEL_Q605, 382 .name = "Quadra 605", 383 .adb_type = MAC_ADB_CUDA, 384 .via_type = MAC_VIA_QUADRA, 385 .scsi_type = MAC_SCSI_QUADRA, 386 .scc_type = MAC_SCC_QUADRA, 387 .nubus_type = MAC_NUBUS, 388 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 389 }, { 390 .ident = MAC_MODEL_Q605_ACC, 391 .name = "Quadra 605", 392 .adb_type = MAC_ADB_CUDA, 393 .via_type = MAC_VIA_QUADRA, 394 .scsi_type = MAC_SCSI_QUADRA, 395 .scc_type = MAC_SCC_QUADRA, 396 .nubus_type = MAC_NUBUS, 397 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 398 }, { 399 .ident = MAC_MODEL_Q610, 400 .name = "Quadra 610", 401 .adb_type = MAC_ADB_II, 402 .via_type = MAC_VIA_QUADRA, 403 .scsi_type = MAC_SCSI_QUADRA, 404 .scc_type = MAC_SCC_QUADRA, 405 .ether_type = MAC_ETHER_SONIC, 406 .nubus_type = MAC_NUBUS, 407 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 408 }, { 409 .ident = MAC_MODEL_Q630, 410 .name = "Quadra 630", 411 .adb_type = MAC_ADB_CUDA, 412 .via_type = MAC_VIA_QUADRA, 413 .scsi_type = MAC_SCSI_QUADRA, 414 .ide_type = MAC_IDE_QUADRA, 415 .scc_type = MAC_SCC_QUADRA, 416 .ether_type = MAC_ETHER_SONIC, 417 .nubus_type = MAC_NUBUS, 418 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 419 }, { 420 .ident = MAC_MODEL_Q650, 421 .name = "Quadra 650", 422 .adb_type = MAC_ADB_II, 423 .via_type = MAC_VIA_QUADRA, 424 .scsi_type = MAC_SCSI_QUADRA, 425 .scc_type = MAC_SCC_QUADRA, 426 .ether_type = MAC_ETHER_SONIC, 427 .nubus_type = MAC_NUBUS, 428 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 429 }, 430 /* The Q700 does have a NS Sonic */ 431 { 432 .ident = MAC_MODEL_Q700, 433 .name = "Quadra 700", 434 .adb_type = MAC_ADB_II, 435 .via_type = MAC_VIA_QUADRA, 436 .scsi_type = MAC_SCSI_QUADRA2, 437 .scc_type = MAC_SCC_QUADRA, 438 .ether_type = MAC_ETHER_SONIC, 439 .nubus_type = MAC_NUBUS, 440 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 441 }, { 442 .ident = MAC_MODEL_Q800, 443 .name = "Quadra 800", 444 .adb_type = MAC_ADB_II, 445 .via_type = MAC_VIA_QUADRA, 446 .scsi_type = MAC_SCSI_QUADRA, 447 .scc_type = MAC_SCC_QUADRA, 448 .ether_type = MAC_ETHER_SONIC, 449 .nubus_type = MAC_NUBUS, 450 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 451 }, { 452 .ident = MAC_MODEL_Q840, 453 .name = "Quadra 840AV", 454 .adb_type = MAC_ADB_CUDA, 455 .via_type = MAC_VIA_QUADRA, 456 .scsi_type = MAC_SCSI_QUADRA3, 457 .scc_type = MAC_SCC_PSC, 458 .ether_type = MAC_ETHER_MACE, 459 .nubus_type = MAC_NUBUS, 460 .floppy_type = MAC_FLOPPY_AV, 461 }, { 462 .ident = MAC_MODEL_Q900, 463 .name = "Quadra 900", 464 .adb_type = MAC_ADB_IOP, 465 .via_type = MAC_VIA_QUADRA, 466 .scsi_type = MAC_SCSI_QUADRA2, 467 .scc_type = MAC_SCC_IOP, 468 .ether_type = MAC_ETHER_SONIC, 469 .nubus_type = MAC_NUBUS, 470 .floppy_type = MAC_FLOPPY_SWIM_IOP, 471 }, { 472 .ident = MAC_MODEL_Q950, 473 .name = "Quadra 950", 474 .adb_type = MAC_ADB_IOP, 475 .via_type = MAC_VIA_QUADRA, 476 .scsi_type = MAC_SCSI_QUADRA2, 477 .scc_type = MAC_SCC_IOP, 478 .ether_type = MAC_ETHER_SONIC, 479 .nubus_type = MAC_NUBUS, 480 .floppy_type = MAC_FLOPPY_SWIM_IOP, 481 }, 482 483 /* 484 * Performa - more LC type machines 485 */ 486 487 { 488 .ident = MAC_MODEL_P460, 489 .name = "Performa 460", 490 .adb_type = MAC_ADB_IISI, 491 .via_type = MAC_VIA_IIci, 492 .scsi_type = MAC_SCSI_OLD, 493 .scc_type = MAC_SCC_II, 494 .nubus_type = MAC_NUBUS, 495 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 496 }, { 497 .ident = MAC_MODEL_P475, 498 .name = "Performa 475", 499 .adb_type = MAC_ADB_CUDA, 500 .via_type = MAC_VIA_QUADRA, 501 .scsi_type = MAC_SCSI_QUADRA, 502 .scc_type = MAC_SCC_II, 503 .nubus_type = MAC_NUBUS, 504 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 505 }, { 506 .ident = MAC_MODEL_P475F, 507 .name = "Performa 475", 508 .adb_type = MAC_ADB_CUDA, 509 .via_type = MAC_VIA_QUADRA, 510 .scsi_type = MAC_SCSI_QUADRA, 511 .scc_type = MAC_SCC_II, 512 .nubus_type = MAC_NUBUS, 513 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 514 }, { 515 .ident = MAC_MODEL_P520, 516 .name = "Performa 520", 517 .adb_type = MAC_ADB_CUDA, 518 .via_type = MAC_VIA_IIci, 519 .scsi_type = MAC_SCSI_OLD, 520 .scc_type = MAC_SCC_II, 521 .nubus_type = MAC_NUBUS, 522 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 523 }, { 524 .ident = MAC_MODEL_P550, 525 .name = "Performa 550", 526 .adb_type = MAC_ADB_CUDA, 527 .via_type = MAC_VIA_IIci, 528 .scsi_type = MAC_SCSI_OLD, 529 .scc_type = MAC_SCC_II, 530 .nubus_type = MAC_NUBUS, 531 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 532 }, 533 /* These have the comm slot, and therefore possibly SONIC ethernet */ 534 { 535 .ident = MAC_MODEL_P575, 536 .name = "Performa 575", 537 .adb_type = MAC_ADB_CUDA, 538 .via_type = MAC_VIA_QUADRA, 539 .scsi_type = MAC_SCSI_QUADRA, 540 .scc_type = MAC_SCC_II, 541 .ether_type = MAC_ETHER_SONIC, 542 .nubus_type = MAC_NUBUS, 543 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 544 }, { 545 .ident = MAC_MODEL_P588, 546 .name = "Performa 588", 547 .adb_type = MAC_ADB_CUDA, 548 .via_type = MAC_VIA_QUADRA, 549 .scsi_type = MAC_SCSI_QUADRA, 550 .ide_type = MAC_IDE_QUADRA, 551 .scc_type = MAC_SCC_II, 552 .ether_type = MAC_ETHER_SONIC, 553 .nubus_type = MAC_NUBUS, 554 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 555 }, { 556 .ident = MAC_MODEL_TV, 557 .name = "TV", 558 .adb_type = MAC_ADB_CUDA, 559 .via_type = MAC_VIA_QUADRA, 560 .scsi_type = MAC_SCSI_OLD, 561 .scc_type = MAC_SCC_II, 562 .nubus_type = MAC_NUBUS, 563 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 564 }, { 565 .ident = MAC_MODEL_P600, 566 .name = "Performa 600", 567 .adb_type = MAC_ADB_IISI, 568 .via_type = MAC_VIA_IIci, 569 .scsi_type = MAC_SCSI_OLD, 570 .scc_type = MAC_SCC_II, 571 .nubus_type = MAC_NUBUS, 572 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 573 }, 574 575 /* 576 * Centris - just guessing again; maybe like Quadra. 577 * The C610 may or may not have SONIC. We probe to make sure. 578 */ 579 580 { 581 .ident = MAC_MODEL_C610, 582 .name = "Centris 610", 583 .adb_type = MAC_ADB_II, 584 .via_type = MAC_VIA_QUADRA, 585 .scsi_type = MAC_SCSI_QUADRA, 586 .scc_type = MAC_SCC_QUADRA, 587 .ether_type = MAC_ETHER_SONIC, 588 .nubus_type = MAC_NUBUS, 589 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 590 }, { 591 .ident = MAC_MODEL_C650, 592 .name = "Centris 650", 593 .adb_type = MAC_ADB_II, 594 .via_type = MAC_VIA_QUADRA, 595 .scsi_type = MAC_SCSI_QUADRA, 596 .scc_type = MAC_SCC_QUADRA, 597 .ether_type = MAC_ETHER_SONIC, 598 .nubus_type = MAC_NUBUS, 599 .floppy_type = MAC_FLOPPY_SWIM_ADDR1, 600 }, { 601 .ident = MAC_MODEL_C660, 602 .name = "Centris 660AV", 603 .adb_type = MAC_ADB_CUDA, 604 .via_type = MAC_VIA_QUADRA, 605 .scsi_type = MAC_SCSI_QUADRA3, 606 .scc_type = MAC_SCC_PSC, 607 .ether_type = MAC_ETHER_MACE, 608 .nubus_type = MAC_NUBUS, 609 .floppy_type = MAC_FLOPPY_AV, 610 }, 611 612 /* 613 * The PowerBooks all the same "Combo" custom IC for SCSI and SCC 614 * and a PMU (in two variations?) for ADB. Most of them use the 615 * Quadra-style VIAs. A few models also have IDE from hell. 616 */ 617 618 { 619 .ident = MAC_MODEL_PB140, 620 .name = "PowerBook 140", 621 .adb_type = MAC_ADB_PB1, 622 .via_type = MAC_VIA_QUADRA, 623 .scsi_type = MAC_SCSI_OLD, 624 .scc_type = MAC_SCC_QUADRA, 625 .nubus_type = MAC_NUBUS, 626 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 627 }, { 628 .ident = MAC_MODEL_PB145, 629 .name = "PowerBook 145", 630 .adb_type = MAC_ADB_PB1, 631 .via_type = MAC_VIA_QUADRA, 632 .scsi_type = MAC_SCSI_OLD, 633 .scc_type = MAC_SCC_QUADRA, 634 .nubus_type = MAC_NUBUS, 635 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 636 }, { 637 .ident = MAC_MODEL_PB150, 638 .name = "PowerBook 150", 639 .adb_type = MAC_ADB_PB1, 640 .via_type = MAC_VIA_IIci, 641 .scsi_type = MAC_SCSI_OLD, 642 .ide_type = MAC_IDE_PB, 643 .scc_type = MAC_SCC_QUADRA, 644 .nubus_type = MAC_NUBUS, 645 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 646 }, { 647 .ident = MAC_MODEL_PB160, 648 .name = "PowerBook 160", 649 .adb_type = MAC_ADB_PB1, 650 .via_type = MAC_VIA_QUADRA, 651 .scsi_type = MAC_SCSI_OLD, 652 .scc_type = MAC_SCC_QUADRA, 653 .nubus_type = MAC_NUBUS, 654 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 655 }, { 656 .ident = MAC_MODEL_PB165, 657 .name = "PowerBook 165", 658 .adb_type = MAC_ADB_PB1, 659 .via_type = MAC_VIA_QUADRA, 660 .scsi_type = MAC_SCSI_OLD, 661 .scc_type = MAC_SCC_QUADRA, 662 .nubus_type = MAC_NUBUS, 663 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 664 }, { 665 .ident = MAC_MODEL_PB165C, 666 .name = "PowerBook 165c", 667 .adb_type = MAC_ADB_PB1, 668 .via_type = MAC_VIA_QUADRA, 669 .scsi_type = MAC_SCSI_OLD, 670 .scc_type = MAC_SCC_QUADRA, 671 .nubus_type = MAC_NUBUS, 672 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 673 }, { 674 .ident = MAC_MODEL_PB170, 675 .name = "PowerBook 170", 676 .adb_type = MAC_ADB_PB1, 677 .via_type = MAC_VIA_QUADRA, 678 .scsi_type = MAC_SCSI_OLD, 679 .scc_type = MAC_SCC_QUADRA, 680 .nubus_type = MAC_NUBUS, 681 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 682 }, { 683 .ident = MAC_MODEL_PB180, 684 .name = "PowerBook 180", 685 .adb_type = MAC_ADB_PB1, 686 .via_type = MAC_VIA_QUADRA, 687 .scsi_type = MAC_SCSI_OLD, 688 .scc_type = MAC_SCC_QUADRA, 689 .nubus_type = MAC_NUBUS, 690 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 691 }, { 692 .ident = MAC_MODEL_PB180C, 693 .name = "PowerBook 180c", 694 .adb_type = MAC_ADB_PB1, 695 .via_type = MAC_VIA_QUADRA, 696 .scsi_type = MAC_SCSI_OLD, 697 .scc_type = MAC_SCC_QUADRA, 698 .nubus_type = MAC_NUBUS, 699 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 700 }, { 701 .ident = MAC_MODEL_PB190, 702 .name = "PowerBook 190", 703 .adb_type = MAC_ADB_PB2, 704 .via_type = MAC_VIA_QUADRA, 705 .scsi_type = MAC_SCSI_OLD, 706 .ide_type = MAC_IDE_BABOON, 707 .scc_type = MAC_SCC_QUADRA, 708 .nubus_type = MAC_NUBUS, 709 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 710 }, { 711 .ident = MAC_MODEL_PB520, 712 .name = "PowerBook 520", 713 .adb_type = MAC_ADB_PB2, 714 .via_type = MAC_VIA_QUADRA, 715 .scsi_type = MAC_SCSI_OLD, 716 .scc_type = MAC_SCC_QUADRA, 717 .ether_type = MAC_ETHER_SONIC, 718 .nubus_type = MAC_NUBUS, 719 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 720 }, 721 722 /* 723 * PowerBook Duos are pretty much like normal PowerBooks 724 * All of these probably have onboard SONIC in the Dock which 725 * means we'll have to probe for it eventually. 726 * 727 * Are these really MAC_VIA_IIci? The developer notes for the 728 * Duos show pretty much the same custom parts as in most of 729 * the other PowerBooks which would imply MAC_VIA_QUADRA. 730 */ 731 732 { 733 .ident = MAC_MODEL_PB210, 734 .name = "PowerBook Duo 210", 735 .adb_type = MAC_ADB_PB2, 736 .via_type = MAC_VIA_IIci, 737 .scsi_type = MAC_SCSI_OLD, 738 .scc_type = MAC_SCC_QUADRA, 739 .nubus_type = MAC_NUBUS, 740 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 741 }, { 742 .ident = MAC_MODEL_PB230, 743 .name = "PowerBook Duo 230", 744 .adb_type = MAC_ADB_PB2, 745 .via_type = MAC_VIA_IIci, 746 .scsi_type = MAC_SCSI_OLD, 747 .scc_type = MAC_SCC_QUADRA, 748 .nubus_type = MAC_NUBUS, 749 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 750 }, { 751 .ident = MAC_MODEL_PB250, 752 .name = "PowerBook Duo 250", 753 .adb_type = MAC_ADB_PB2, 754 .via_type = MAC_VIA_IIci, 755 .scsi_type = MAC_SCSI_OLD, 756 .scc_type = MAC_SCC_QUADRA, 757 .nubus_type = MAC_NUBUS, 758 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 759 }, { 760 .ident = MAC_MODEL_PB270C, 761 .name = "PowerBook Duo 270c", 762 .adb_type = MAC_ADB_PB2, 763 .via_type = MAC_VIA_IIci, 764 .scsi_type = MAC_SCSI_OLD, 765 .scc_type = MAC_SCC_QUADRA, 766 .nubus_type = MAC_NUBUS, 767 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 768 }, { 769 .ident = MAC_MODEL_PB280, 770 .name = "PowerBook Duo 280", 771 .adb_type = MAC_ADB_PB2, 772 .via_type = MAC_VIA_IIci, 773 .scsi_type = MAC_SCSI_OLD, 774 .scc_type = MAC_SCC_QUADRA, 775 .nubus_type = MAC_NUBUS, 776 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 777 }, { 778 .ident = MAC_MODEL_PB280C, 779 .name = "PowerBook Duo 280c", 780 .adb_type = MAC_ADB_PB2, 781 .via_type = MAC_VIA_IIci, 782 .scsi_type = MAC_SCSI_OLD, 783 .scc_type = MAC_SCC_QUADRA, 784 .nubus_type = MAC_NUBUS, 785 .floppy_type = MAC_FLOPPY_SWIM_ADDR2, 786 }, 787 788 /* 789 * Other stuff? 790 */ 791 792 { 793 .ident = -1 794 } 795 }; 796 797 static struct resource scc_a_rsrcs[] = { 798 { .flags = IORESOURCE_MEM }, 799 { .flags = IORESOURCE_IRQ }, 800 }; 801 802 static struct resource scc_b_rsrcs[] = { 803 { .flags = IORESOURCE_MEM }, 804 { .flags = IORESOURCE_IRQ }, 805 }; 806 807 struct platform_device scc_a_pdev = { 808 .name = "scc", 809 .id = 0, 810 .num_resources = ARRAY_SIZE(scc_a_rsrcs), 811 .resource = scc_a_rsrcs, 812 }; 813 EXPORT_SYMBOL(scc_a_pdev); 814 815 struct platform_device scc_b_pdev = { 816 .name = "scc", 817 .id = 1, 818 .num_resources = ARRAY_SIZE(scc_b_rsrcs), 819 .resource = scc_b_rsrcs, 820 }; 821 EXPORT_SYMBOL(scc_b_pdev); 822 823 static void __init mac_identify(void) 824 { 825 struct mac_model *m; 826 827 /* Penguin data useful? */ 828 int model = mac_bi_data.id; 829 if (!model) { 830 /* no bootinfo model id -> NetBSD booter was used! */ 831 /* XXX FIXME: breaks for model > 31 */ 832 model = (mac_bi_data.cpuid >> 2) & 63; 833 printk(KERN_WARNING "No bootinfo model ID, using cpuid instead " 834 "(obsolete bootloader?)\n"); 835 } 836 837 macintosh_config = mac_data_table; 838 for (m = macintosh_config; m->ident != -1; m++) { 839 if (m->ident == model) { 840 macintosh_config = m; 841 break; 842 } 843 } 844 845 /* Set up serial port resources for the console initcall. */ 846 847 scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2; 848 scc_a_rsrcs[0].end = scc_a_rsrcs[0].start; 849 scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase; 850 scc_b_rsrcs[0].end = scc_b_rsrcs[0].start; 851 852 switch (macintosh_config->scc_type) { 853 case MAC_SCC_PSC: 854 scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A; 855 scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B; 856 break; 857 default: 858 scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC; 859 scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC; 860 break; 861 } 862 863 /* 864 * We need to pre-init the IOPs, if any. Otherwise 865 * the serial console won't work if the user had 866 * the serial ports set to "Faster" mode in MacOS. 867 */ 868 iop_preinit(); 869 870 printk(KERN_INFO "Detected Macintosh model: %d\n", model); 871 872 /* 873 * Report booter data: 874 */ 875 printk(KERN_DEBUG " Penguin bootinfo data:\n"); 876 printk(KERN_DEBUG " Video: addr 0x%lx " 877 "row 0x%lx depth %lx dimensions %ld x %ld\n", 878 mac_bi_data.videoaddr, mac_bi_data.videorow, 879 mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF, 880 mac_bi_data.dimensions >> 16); 881 printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n", 882 mac_bi_data.videological, mac_orig_videoaddr, 883 mac_bi_data.sccbase); 884 printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n", 885 mac_bi_data.boottime, mac_bi_data.gmtbias); 886 printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n", 887 mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); 888 889 iop_init(); 890 via_init(); 891 oss_init(); 892 psc_init(); 893 baboon_init(); 894 895 #ifdef CONFIG_ADB_CUDA 896 find_via_cuda(); 897 #endif 898 } 899 900 static void __init mac_report_hardware(void) 901 { 902 printk(KERN_INFO "Apple Macintosh %s\n", macintosh_config->name); 903 } 904 905 static void mac_get_model(char *str) 906 { 907 strcpy(str, "Macintosh "); 908 strcat(str, macintosh_config->name); 909 } 910 911 static struct resource swim_rsrc = { .flags = IORESOURCE_MEM }; 912 913 static struct platform_device swim_pdev = { 914 .name = "swim", 915 .id = -1, 916 .num_resources = 1, 917 .resource = &swim_rsrc, 918 }; 919 920 static struct platform_device esp_0_pdev = { 921 .name = "mac_esp", 922 .id = 0, 923 }; 924 925 static struct platform_device esp_1_pdev = { 926 .name = "mac_esp", 927 .id = 1, 928 }; 929 930 static struct platform_device sonic_pdev = { 931 .name = "macsonic", 932 .id = -1, 933 }; 934 935 static struct platform_device mace_pdev = { 936 .name = "macmace", 937 .id = -1, 938 }; 939 940 int __init mac_platform_init(void) 941 { 942 u8 *swim_base; 943 944 /* 945 * Serial devices 946 */ 947 948 platform_device_register(&scc_a_pdev); 949 platform_device_register(&scc_b_pdev); 950 951 /* 952 * Floppy device 953 */ 954 955 switch (macintosh_config->floppy_type) { 956 case MAC_FLOPPY_SWIM_ADDR1: 957 swim_base = (u8 *)(VIA1_BASE + 0x1E000); 958 break; 959 case MAC_FLOPPY_SWIM_ADDR2: 960 swim_base = (u8 *)(VIA1_BASE + 0x16000); 961 break; 962 default: 963 swim_base = NULL; 964 break; 965 } 966 967 if (swim_base) { 968 swim_rsrc.start = (resource_size_t) swim_base, 969 swim_rsrc.end = (resource_size_t) swim_base + 0x2000, 970 platform_device_register(&swim_pdev); 971 } 972 973 /* 974 * SCSI device(s) 975 */ 976 977 switch (macintosh_config->scsi_type) { 978 case MAC_SCSI_QUADRA: 979 case MAC_SCSI_QUADRA3: 980 platform_device_register(&esp_0_pdev); 981 break; 982 case MAC_SCSI_QUADRA2: 983 platform_device_register(&esp_0_pdev); 984 if ((macintosh_config->ident == MAC_MODEL_Q900) || 985 (macintosh_config->ident == MAC_MODEL_Q950)) 986 platform_device_register(&esp_1_pdev); 987 break; 988 } 989 990 /* 991 * Ethernet device 992 */ 993 994 switch (macintosh_config->ether_type) { 995 case MAC_ETHER_SONIC: 996 platform_device_register(&sonic_pdev); 997 break; 998 case MAC_ETHER_MACE: 999 platform_device_register(&mace_pdev); 1000 break; 1001 } 1002 1003 return 0; 1004 } 1005 1006 arch_initcall(mac_platform_init); 1007