config.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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/config.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. #define BOOTINFO_COMPAT_1_0
  23. #include <asm/setup.h>
  24. #include <asm/bootinfo.h>
  25. #include <asm/system.h>
  26. #include <asm/io.h>
  27. #include <asm/irq.h>
  28. #include <asm/pgtable.h>
  29. #include <asm/rtc.h>
  30. #include <asm/machdep.h>
  31. #include <asm/macintosh.h>
  32. #include <asm/macints.h>
  33. #include <asm/machw.h>
  34. #include <asm/mac_iop.h>
  35. #include <asm/mac_via.h>
  36. #include <asm/mac_oss.h>
  37. #include <asm/mac_psc.h>
  38. /* Mac bootinfo struct */
  39. struct mac_booter_data mac_bi_data = {0,};
  40. int mac_bisize = sizeof mac_bi_data;
  41. /* New m68k bootinfo stuff and videobase */
  42. extern int m68k_num_memory;
  43. extern struct mem_info m68k_memory[NUM_MEMINFO];
  44. extern struct mem_info m68k_ramdisk;
  45. extern char m68k_command_line[CL_SIZE];
  46. void *mac_env; /* Loaded by the boot asm */
  47. /* The phys. video addr. - might be bogus on some machines */
  48. unsigned long mac_orig_videoaddr;
  49. /* Mac specific timer functions */
  50. extern void mac_gettod (int *, int *, int *, int *, int *, int *);
  51. extern unsigned long mac_gettimeoffset (void);
  52. extern int mac_hwclk (int, struct hwclk_time *);
  53. extern int mac_set_clock_mmss (unsigned long);
  54. extern int mac_get_irq_list(char *);
  55. extern void iop_preinit(void);
  56. extern void iop_init(void);
  57. extern void via_init(void);
  58. extern void via_init_clock(void (*func)(int, void *, struct pt_regs *));
  59. extern void via_flush_cache(void);
  60. extern void oss_init(void);
  61. extern void psc_init(void);
  62. extern void baboon_init(void);
  63. extern void (*kd_mksound)(unsigned int, unsigned int);
  64. extern void mac_mksound(unsigned int, unsigned int);
  65. extern void nubus_sweep_video(void);
  66. /* Mac specific debug functions (in debug.c) */
  67. extern void mac_debug_init(void);
  68. extern void mac_debugging_long(int, long);
  69. extern void (*kd_mksound)(unsigned int, unsigned int);
  70. extern int mackbd_init_hw(void);
  71. extern void mackbd_leds(unsigned int leds);
  72. extern int mackbd_translate(unsigned char keycode, unsigned char *keycodep, char raw_mode);
  73. extern void mac_hid_init_hw(void);
  74. extern int mac_hid_kbd_translate(unsigned char scancode, unsigned char *keycode, char raw_mode);
  75. #ifdef CONFIG_MAGIC_SYSRQ
  76. extern unsigned char mac_hid_kbd_sysrq_xlate[128];
  77. extern unsigned char pckbd_sysrq_xlate[128];
  78. extern unsigned char mackbd_sysrq_xlate[128];
  79. #endif /* CONFIG_MAGIC_SYSRQ */
  80. static void mac_get_model(char *str);
  81. void mac_bang(int irq, void *vector, struct pt_regs *p)
  82. {
  83. printk("Resetting ...n");
  84. mac_reset();
  85. }
  86. static void mac_sched_init(void (*vector)(int, void *, struct pt_regs *))
  87. {
  88. via_init_clock(vector);
  89. }
  90. #if 0
  91. void mac_waitbut (void)
  92. {
  93. ;
  94. }
  95. #endif
  96. extern void mac_default_handler(int, void *, struct pt_regs *);
  97. void (*mac_handlers[8])(int, void *, struct pt_regs *)=
  98. {
  99. mac_default_handler,
  100. mac_default_handler,
  101. mac_default_handler,
  102. mac_default_handler,
  103. mac_default_handler,
  104. mac_default_handler,
  105. mac_default_handler,
  106. mac_default_handler
  107. };
  108. /*
  109.  * Parse a Macintosh-specific record in the bootinfo
  110.  */
  111. int __init mac_parse_bootinfo(const struct bi_record *record)
  112. {
  113.     int unknown = 0;
  114.     const u_long *data = record->data;
  115.     switch (record->tag) {
  116. case BI_MAC_MODEL:
  117.     mac_bi_data.id = *data;
  118.     break;
  119. case BI_MAC_VADDR:
  120.     mac_bi_data.videoaddr = *data;
  121.     break;
  122. case BI_MAC_VDEPTH:
  123.     mac_bi_data.videodepth = *data;
  124.     break;
  125. case BI_MAC_VROW:
  126.     mac_bi_data.videorow = *data;
  127.     break;
  128. case BI_MAC_VDIM:
  129.     mac_bi_data.dimensions = *data;
  130.     break;
  131. case BI_MAC_VLOGICAL:
  132.     mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK);
  133.     mac_orig_videoaddr = *data;
  134.     break;
  135. case BI_MAC_SCCBASE:
  136.     mac_bi_data.sccbase = *data;
  137.     break;
  138. case BI_MAC_BTIME:
  139.     mac_bi_data.boottime = *data;
  140.     break;
  141. case BI_MAC_GMTBIAS:
  142.     mac_bi_data.gmtbias = *data;
  143.     break;
  144. case BI_MAC_MEMSIZE:
  145.     mac_bi_data.memsize = *data;
  146.     break;
  147. case BI_MAC_CPUID:
  148.     mac_bi_data.cpuid = *data;
  149.     break;
  150.         case BI_MAC_ROMBASE:
  151.     mac_bi_data.rombase = *data;
  152.     break;
  153. default:
  154.     unknown = 1;
  155.     }
  156.     return(unknown);
  157. }
  158. /*
  159.  * Flip into 24bit mode for an instant - flushes the L2 cache card. We
  160.  * have to disable interrupts for this. Our IRQ handlers will crap 
  161.  * themselves if they take an IRQ in 24bit mode!
  162.  */
  163. static void mac_cache_card_flush(int writeback)
  164. {
  165. unsigned long cpu_flags;
  166. save_flags(cpu_flags);
  167. cli();
  168. via_flush_cache();
  169. restore_flags(cpu_flags);
  170. }
  171. void __init config_mac(void)
  172. {
  173. if (!MACH_IS_MAC) {
  174.   printk("ERROR: no Mac, but config_mac() called!! n");
  175. }
  176. #ifdef CONFIG_VT
  177. #ifdef CONFIG_INPUT_ADBHID
  178. mach_keyb_init       = mac_hid_init_hw;
  179. mach_kbd_translate   = mac_hid_kbd_translate;
  180. #ifdef CONFIG_MAGIC_SYSRQ
  181. #ifdef CONFIG_MAC_ADBKEYCODES
  182. if (!keyboard_sends_linux_keycodes) {
  183. mach_sysrq_xlate = mac_hid_kbd_sysrq_xlate;
  184. SYSRQ_KEY = 0x69;
  185. } else
  186. #endif /* CONFIG_MAC_ADBKEYCODES */
  187. {
  188. mach_sysrq_xlate = pckbd_sysrq_xlate;
  189. SYSRQ_KEY = 0x54;
  190. }
  191. #endif /* CONFIG_MAGIC_SYSRQ */
  192. #elif defined(CONFIG_ADB_KEYBOARD)
  193. mach_keyb_init       = mackbd_init_hw;
  194. mach_kbd_leds        = mackbd_leds;
  195. mach_kbd_translate   = mackbd_translate;
  196. mach_sysrq_xlate     = mackbd_sysrq_xlate;
  197. SYSRQ_KEY = 0x69;
  198. #endif /* CONFIG_INPUT_ADBHID */
  199. #endif /* CONFIG_VT */
  200. mach_sched_init      = mac_sched_init;
  201. mach_init_IRQ        = mac_init_IRQ;
  202. mach_request_irq     = mac_request_irq;
  203. mach_free_irq        = mac_free_irq;
  204. enable_irq           = mac_enable_irq;
  205. disable_irq          = mac_disable_irq;
  206. mach_get_model  = mac_get_model;
  207. mach_default_handler = &mac_handlers;
  208. mach_get_irq_list    = mac_get_irq_list;
  209. mach_gettimeoffset   = mac_gettimeoffset;
  210. mach_gettod          = mac_gettod;
  211. mach_hwclk           = mac_hwclk;
  212. mach_set_clock_mmss  = mac_set_clock_mmss;
  213. #if 0
  214. mach_mksound         = mac_mksound;
  215. #endif
  216. mach_reset           = mac_reset;
  217. mach_halt            = mac_poweroff;
  218. mach_power_off       = mac_poweroff;
  219. conswitchp          = &dummy_con;
  220. mach_max_dma_address = 0xffffffff;
  221. #if 0
  222. mach_debug_init  = mac_debug_init;
  223. #endif
  224. kd_mksound  = mac_mksound;
  225. #ifdef CONFIG_HEARTBEAT
  226. #if 0
  227. mach_heartbeat = mac_heartbeat;
  228. mach_heartbeat_irq = IRQ_MAC_TIMER;
  229. #endif
  230. #endif
  231. /*
  232.  * Determine hardware present
  233.  */
  234.      
  235. mac_identify();
  236. mac_report_hardware();
  237.     
  238. /* AFAIK only the IIci takes a cache card.  The IIfx has onboard
  239.    cache ... someone needs to figure out how to tell if it's on or
  240.    not. */
  241. if (macintosh_config->ident == MAC_MODEL_IICI
  242.     || macintosh_config->ident == MAC_MODEL_IIFX) {
  243. mach_l2_flush = mac_cache_card_flush;
  244. }
  245. #ifdef MAC_DEBUG_SOUND
  246. /* goes on forever if timers broken */
  247. mac_mksound(1000,10);
  248. #endif
  249. /*
  250.  * Check for machine specific fixups.
  251.  */
  252. #ifdef OLD_NUBUS_CODE
  253.  nubus_sweep_video();
  254. #endif
  255. }
  256. /*
  257.  * Macintosh Table: hardcoded model configuration data. 
  258.  *
  259.  * Much of this was defined by Alan, based on who knows what docs. 
  260.  * I've added a lot more, and some of that was pure guesswork based 
  261.  * on hardware pages present on the Mac web site. Possibly wildly 
  262.  * inaccurate, so look here if a new Mac model won't run. Example: if
  263.  * a Mac crashes immediately after the VIA1 registers have been dumped
  264.  * to the screen, it probably died attempting to read DirB on a RBV. 
  265.  * Meaning it should have MAC_VIA_IIci here :-)
  266.  */
  267.  
  268. struct mac_model *macintosh_config;
  269. static struct mac_model mac_data_table[]=
  270. {
  271. /*
  272.  * We'll pretend to be a Macintosh II, that's pretty safe.
  273.  */
  274. { MAC_MODEL_II, "Unknown", MAC_ADB_II, MAC_VIA_II, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  275. /*
  276.  * Original MacII hardware
  277.  *
  278.  */
  279.  
  280. { MAC_MODEL_II, "II", MAC_ADB_II, MAC_VIA_II, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  281. { MAC_MODEL_IIX, "IIx", MAC_ADB_II, MAC_VIA_II, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  282. { MAC_MODEL_IICX, "IIcx", MAC_ADB_II, MAC_VIA_II, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  283. { MAC_MODEL_SE30, "SE/30", MAC_ADB_II, MAC_VIA_II, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  284. /*
  285.  * Weirdified MacII hardware - all subtley different. Gee thanks
  286.  * Apple. All these boxes seem to have VIA2 in a different place to
  287.  * the MacII (+1A000 rather than +4000)
  288.  * CSA: see http://developer.apple.com/technotes/hw/hw_09.html
  289.  */
  290. { MAC_MODEL_IICI, "IIci", MAC_ADB_II, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  291. { MAC_MODEL_IIFX, "IIfx", MAC_ADB_IOP, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_IOP, MAC_ETHER_NONE, MAC_NUBUS},
  292. { MAC_MODEL_IISI, "IIsi", MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  293. { MAC_MODEL_IIVI, "IIvi", MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  294. { MAC_MODEL_IIVX, "IIvx", MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  295. /*
  296.  * Classic models (guessing: similar to SE/30 ?? Nope, similar to LC ...)
  297.  */
  298. { MAC_MODEL_CLII, "Classic II", MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II,     MAC_ETHER_NONE, MAC_NUBUS},
  299. { MAC_MODEL_CCL,  "Color Classic", MAC_ADB_CUDA, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II,     MAC_ETHER_NONE, MAC_NUBUS},
  300. /*
  301.  * Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
  302.  */
  303. { MAC_MODEL_LC, "LC",   MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  304. { MAC_MODEL_LCII, "LC II",  MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  305. { MAC_MODEL_LCIII,"LC III", MAC_ADB_IISI, MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  306. /*
  307.  * Quadra. Video is at 0xF9000000, via is like a MacII. We label it differently 
  308.  * as some of the stuff connected to VIA2 seems different. Better SCSI chip and 
  309.  * onboard ethernet using a NatSemi SONIC except the 660AV and 840AV which use an 
  310.  * AMD 79C940 (MACE).
  311.  * The 700, 900 and 950 have some I/O chips in the wrong place to
  312.  * confuse us. The 840AV has a SCSI location of its own (same as
  313.  * the 660AV).
  314.  */  
  315.  
  316. { MAC_MODEL_Q605, "Quadra 605", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  317. { MAC_MODEL_Q610, "Quadra 610", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  318. { MAC_MODEL_Q630, "Quadra 630", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_QUADRA, MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  319.   { MAC_MODEL_Q650, "Quadra 650", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  320. /* The Q700 does have a NS Sonic */
  321. { MAC_MODEL_Q700, "Quadra 700", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA2, MAC_IDE_NONE,   MAC_SCC_QUADRA2, MAC_ETHER_SONIC, MAC_NUBUS},
  322. { MAC_MODEL_Q800, "Quadra 800", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  323. { MAC_MODEL_Q840, "Quadra 840AV", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA3, MAC_IDE_NONE, MAC_SCC_II, MAC_ETHER_MACE, MAC_NUBUS},
  324. { MAC_MODEL_Q900, "Quadra 900", MAC_ADB_IOP, MAC_VIA_QUADRA, MAC_SCSI_QUADRA2, MAC_IDE_NONE,   MAC_SCC_IOP, MAC_ETHER_SONIC, MAC_NUBUS},
  325. { MAC_MODEL_Q950, "Quadra 950", MAC_ADB_IOP, MAC_VIA_QUADRA, MAC_SCSI_QUADRA2, MAC_IDE_NONE,   MAC_SCC_IOP, MAC_ETHER_SONIC, MAC_NUBUS},
  326. /* 
  327.  * Performa - more LC type machines
  328.  */
  329. { MAC_MODEL_P460,  "Performa 460", MAC_ADB_IISI, MAC_VIA_IIci,   MAC_SCSI_OLD,  MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  330. { MAC_MODEL_P475,  "Performa 475", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  331. { MAC_MODEL_P475F, "Performa 475", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  332. { MAC_MODEL_P520,  "Performa 520", MAC_ADB_CUDA, MAC_VIA_IIci,   MAC_SCSI_OLD,    MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  333. { MAC_MODEL_P550,  "Performa 550", MAC_ADB_CUDA, MAC_VIA_IIci,   MAC_SCSI_OLD,    MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  334. { MAC_MODEL_P575,  "Performa 575", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  335. /* These have the comm slot, and therefore the possibility of SONIC ethernet */
  336. { MAC_MODEL_P588,  "Performa 588", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_QUADRA, MAC_SCC_II, MAC_ETHER_SONIC, MAC_NUBUS},
  337. { MAC_MODEL_TV,    "TV",           MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_OLD, MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  338. { MAC_MODEL_P600,  "Performa 600", MAC_ADB_IISI, MAC_VIA_IIci,   MAC_SCSI_OLD, MAC_IDE_NONE,   MAC_SCC_II, MAC_ETHER_NONE, MAC_NUBUS},
  339. /*
  340.  * Centris - just guessing again; maybe like Quadra
  341.  */
  342. /* The C610 may or may not have SONIC.  We probe to make sure */
  343. { MAC_MODEL_C610, "Centris 610",   MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  344. { MAC_MODEL_C650, "Centris 650",   MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  345. { MAC_MODEL_C660, "Centris 660AV", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA3, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_MACE, MAC_NUBUS},
  346. /*
  347.  * The PowerBooks all the same "Combo" custom IC for SCSI and SCC
  348.  * and a PMU (in two variations?) for ADB. Most of them use the
  349.  * Quadra-style VIAs. A few models also have IDE from hell.
  350.  */
  351. { MAC_MODEL_PB140,  "PowerBook 140",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  352. { MAC_MODEL_PB145,  "PowerBook 145",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  353. { MAC_MODEL_PB150,  "PowerBook 150",   MAC_ADB_PB1, MAC_VIA_IIci,   MAC_SCSI_OLD,  MAC_IDE_PB,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  354. { MAC_MODEL_PB160,  "PowerBook 160",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  355. { MAC_MODEL_PB165,  "PowerBook 165",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  356. { MAC_MODEL_PB165C, "PowerBook 165c",  MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  357. { MAC_MODEL_PB170,  "PowerBook 170",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  358. { MAC_MODEL_PB180,  "PowerBook 180",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  359. { MAC_MODEL_PB180C, "PowerBook 180c",  MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  360. { MAC_MODEL_PB190,  "PowerBook 190",   MAC_ADB_PB2, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_BABOON, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  361. { MAC_MODEL_PB520,  "PowerBook 520",   MAC_ADB_PB2, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,  MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
  362. /*
  363.  * PowerBook Duos are pretty much like normal PowerBooks
  364.  * All of these probably have onboard SONIC in the Dock which
  365.  * means we'll have to probe for it eventually.
  366.  *
  367.  * Are these reallly MAC_VIA_IIci? The developer notes for the
  368.  * Duos show pretty much the same custom parts as in most of
  369.  * the other PowerBooks which would imply MAC_VIA_QUADRA.
  370.  */
  371. { MAC_MODEL_PB210,  "PowerBook Duo 210",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  372. { MAC_MODEL_PB230,  "PowerBook Duo 230",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  373. { MAC_MODEL_PB250,  "PowerBook Duo 250",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  374. { MAC_MODEL_PB270C, "PowerBook Duo 270c", MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  375. { MAC_MODEL_PB280,  "PowerBook Duo 280",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  376. { MAC_MODEL_PB280C, "PowerBook Duo 280c", MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA, MAC_ETHER_NONE, MAC_NUBUS},
  377. /*
  378.  * Other stuff ??
  379.  */
  380. { -1, NULL, 0,0,0,}
  381. };
  382. void mac_identify(void)
  383. {
  384. struct mac_model *m;
  385. /* Penguin data useful? */
  386. int model = mac_bi_data.id;
  387. if (!model) {
  388. /* no bootinfo model id -> NetBSD booter was used! */
  389. /* XXX FIXME: breaks for model > 31 */
  390. model=(mac_bi_data.cpuid>>2)&63;
  391. printk ("No bootinfo model ID, using cpuid instead (hey, use Penguin!)n");
  392. }
  393. macintosh_config = mac_data_table; 
  394. for (m = macintosh_config ; m->ident != -1 ; m++) {
  395. if (m->ident == model) {
  396. macintosh_config = m;
  397. break;
  398. }
  399. }
  400. /* We need to pre-init the IOPs, if any. Otherwise */
  401. /* the serial console won't work if the user had   */
  402. /* the serial ports set to "Faster" mode in MacOS. */
  403. iop_preinit();
  404. mac_debug_init();
  405. printk ("Detected Macintosh model: %d n", model);
  406. /*
  407.  * Report booter data:
  408.  */
  409. printk (" Penguin bootinfo data:n");
  410. printk (" Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ldn", 
  411. mac_bi_data.videoaddr, mac_bi_data.videorow, 
  412. mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF, 
  413. mac_bi_data.dimensions >> 16); 
  414. printk (" Videological 0x%lx phys. 0x%lx, SCC at 0x%lx n",
  415. mac_bi_data.videological, mac_orig_videoaddr, 
  416. mac_bi_data.sccbase); 
  417. printk (" Boottime: 0x%lx GMTBias: 0x%lx n",
  418. mac_bi_data.boottime, mac_bi_data.gmtbias); 
  419. printk (" Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx n",
  420. mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); 
  421. #if 0
  422. printk ("Ramdisk: addr 0x%lx size 0x%lxn", 
  423. m68k_ramdisk.addr, m68k_ramdisk.size);
  424. #endif
  425. /*
  426.  * TODO: set the various fields in macintosh_config->hw_present here!
  427.  */
  428. switch (macintosh_config->scsi_type) {
  429. case MAC_SCSI_OLD:
  430.   MACHW_SET(MAC_SCSI_80);
  431.   break;
  432. case MAC_SCSI_QUADRA:
  433. case MAC_SCSI_QUADRA2:
  434. case MAC_SCSI_QUADRA3:
  435.   MACHW_SET(MAC_SCSI_96);
  436.   if ((macintosh_config->ident == MAC_MODEL_Q900) ||
  437.       (macintosh_config->ident == MAC_MODEL_Q950))
  438.     MACHW_SET(MAC_SCSI_96_2);
  439.   break;
  440. default:
  441.   printk("config.c: wtf: unknown scsi, using 53c80n");
  442.   MACHW_SET(MAC_SCSI_80);
  443.   break;
  444. }
  445. iop_init();
  446. via_init();
  447. oss_init();
  448. psc_init();
  449. baboon_init();
  450. }
  451. void mac_report_hardware(void)
  452. {
  453. printk("Apple Macintosh %sn", macintosh_config->name);
  454. }
  455. static void mac_get_model(char *str)
  456. {
  457. strcpy(str,"Macintosh ");
  458. strcat(str, macintosh_config->name);
  459. }