config.c 22 KB

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