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