Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/mac/config.c
10817 views
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
.ident = MAC_MODEL_CCLII,
337
.name = "Color Classic II",
338
.adb_type = MAC_ADB_CUDA,
339
.via_type = MAC_VIA_IIci,
340
.scsi_type = MAC_SCSI_OLD,
341
.scc_type = MAC_SCC_II,
342
.nubus_type = MAC_NUBUS,
343
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
344
},
345
346
/*
347
* Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
348
*/
349
350
{
351
.ident = MAC_MODEL_LC,
352
.name = "LC",
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_LCII,
361
.name = "LC II",
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
.ident = MAC_MODEL_LCIII,
370
.name = "LC III",
371
.adb_type = MAC_ADB_IISI,
372
.via_type = MAC_VIA_IIci,
373
.scsi_type = MAC_SCSI_OLD,
374
.scc_type = MAC_SCC_II,
375
.nubus_type = MAC_NUBUS,
376
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
377
},
378
379
/*
380
* Quadra. Video is at 0xF9000000, via is like a MacII. We label it
381
* differently as some of the stuff connected to VIA2 seems different.
382
* Better SCSI chip and onboard ethernet using a NatSemi SONIC except
383
* the 660AV and 840AV which use an AMD 79C940 (MACE).
384
* The 700, 900 and 950 have some I/O chips in the wrong place to
385
* confuse us. The 840AV has a SCSI location of its own (same as
386
* the 660AV).
387
*/
388
389
{
390
.ident = MAC_MODEL_Q605,
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_Q605_ACC,
400
.name = "Quadra 605",
401
.adb_type = MAC_ADB_CUDA,
402
.via_type = MAC_VIA_QUADRA,
403
.scsi_type = MAC_SCSI_QUADRA,
404
.scc_type = MAC_SCC_QUADRA,
405
.nubus_type = MAC_NUBUS,
406
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
407
}, {
408
.ident = MAC_MODEL_Q610,
409
.name = "Quadra 610",
410
.adb_type = MAC_ADB_II,
411
.via_type = MAC_VIA_QUADRA,
412
.scsi_type = MAC_SCSI_QUADRA,
413
.scc_type = MAC_SCC_QUADRA,
414
.ether_type = MAC_ETHER_SONIC,
415
.nubus_type = MAC_NUBUS,
416
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
417
}, {
418
.ident = MAC_MODEL_Q630,
419
.name = "Quadra 630",
420
.adb_type = MAC_ADB_CUDA,
421
.via_type = MAC_VIA_QUADRA,
422
.scsi_type = MAC_SCSI_QUADRA,
423
.ide_type = MAC_IDE_QUADRA,
424
.scc_type = MAC_SCC_QUADRA,
425
.ether_type = MAC_ETHER_SONIC,
426
.nubus_type = MAC_NUBUS,
427
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
428
}, {
429
.ident = MAC_MODEL_Q650,
430
.name = "Quadra 650",
431
.adb_type = MAC_ADB_II,
432
.via_type = MAC_VIA_QUADRA,
433
.scsi_type = MAC_SCSI_QUADRA,
434
.scc_type = MAC_SCC_QUADRA,
435
.ether_type = MAC_ETHER_SONIC,
436
.nubus_type = MAC_NUBUS,
437
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
438
},
439
/* The Q700 does have a NS Sonic */
440
{
441
.ident = MAC_MODEL_Q700,
442
.name = "Quadra 700",
443
.adb_type = MAC_ADB_II,
444
.via_type = MAC_VIA_QUADRA,
445
.scsi_type = MAC_SCSI_QUADRA2,
446
.scc_type = MAC_SCC_QUADRA,
447
.ether_type = MAC_ETHER_SONIC,
448
.nubus_type = MAC_NUBUS,
449
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
450
}, {
451
.ident = MAC_MODEL_Q800,
452
.name = "Quadra 800",
453
.adb_type = MAC_ADB_II,
454
.via_type = MAC_VIA_QUADRA,
455
.scsi_type = MAC_SCSI_QUADRA,
456
.scc_type = MAC_SCC_QUADRA,
457
.ether_type = MAC_ETHER_SONIC,
458
.nubus_type = MAC_NUBUS,
459
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
460
}, {
461
.ident = MAC_MODEL_Q840,
462
.name = "Quadra 840AV",
463
.adb_type = MAC_ADB_CUDA,
464
.via_type = MAC_VIA_QUADRA,
465
.scsi_type = MAC_SCSI_QUADRA3,
466
.scc_type = MAC_SCC_PSC,
467
.ether_type = MAC_ETHER_MACE,
468
.nubus_type = MAC_NUBUS,
469
.floppy_type = MAC_FLOPPY_AV,
470
}, {
471
.ident = MAC_MODEL_Q900,
472
.name = "Quadra 900",
473
.adb_type = MAC_ADB_IOP,
474
.via_type = MAC_VIA_QUADRA,
475
.scsi_type = MAC_SCSI_QUADRA2,
476
.scc_type = MAC_SCC_IOP,
477
.ether_type = MAC_ETHER_SONIC,
478
.nubus_type = MAC_NUBUS,
479
.floppy_type = MAC_FLOPPY_SWIM_IOP,
480
}, {
481
.ident = MAC_MODEL_Q950,
482
.name = "Quadra 950",
483
.adb_type = MAC_ADB_IOP,
484
.via_type = MAC_VIA_QUADRA,
485
.scsi_type = MAC_SCSI_QUADRA2,
486
.scc_type = MAC_SCC_IOP,
487
.ether_type = MAC_ETHER_SONIC,
488
.nubus_type = MAC_NUBUS,
489
.floppy_type = MAC_FLOPPY_SWIM_IOP,
490
},
491
492
/*
493
* Performa - more LC type machines
494
*/
495
496
{
497
.ident = MAC_MODEL_P460,
498
.name = "Performa 460",
499
.adb_type = MAC_ADB_IISI,
500
.via_type = MAC_VIA_IIci,
501
.scsi_type = MAC_SCSI_OLD,
502
.scc_type = MAC_SCC_II,
503
.nubus_type = MAC_NUBUS,
504
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
505
}, {
506
.ident = MAC_MODEL_P475,
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_P475F,
516
.name = "Performa 475",
517
.adb_type = MAC_ADB_CUDA,
518
.via_type = MAC_VIA_QUADRA,
519
.scsi_type = MAC_SCSI_QUADRA,
520
.scc_type = MAC_SCC_II,
521
.nubus_type = MAC_NUBUS,
522
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
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
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
532
}, {
533
.ident = MAC_MODEL_P550,
534
.name = "Performa 550",
535
.adb_type = MAC_ADB_CUDA,
536
.via_type = MAC_VIA_IIci,
537
.scsi_type = MAC_SCSI_OLD,
538
.scc_type = MAC_SCC_II,
539
.nubus_type = MAC_NUBUS,
540
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
541
},
542
/* These have the comm slot, and therefore possibly SONIC ethernet */
543
{
544
.ident = MAC_MODEL_P575,
545
.name = "Performa 575",
546
.adb_type = MAC_ADB_CUDA,
547
.via_type = MAC_VIA_QUADRA,
548
.scsi_type = MAC_SCSI_QUADRA,
549
.scc_type = MAC_SCC_II,
550
.ether_type = MAC_ETHER_SONIC,
551
.nubus_type = MAC_NUBUS,
552
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
553
}, {
554
.ident = MAC_MODEL_P588,
555
.name = "Performa 588",
556
.adb_type = MAC_ADB_CUDA,
557
.via_type = MAC_VIA_QUADRA,
558
.scsi_type = MAC_SCSI_QUADRA,
559
.ide_type = MAC_IDE_QUADRA,
560
.scc_type = MAC_SCC_II,
561
.ether_type = MAC_ETHER_SONIC,
562
.nubus_type = MAC_NUBUS,
563
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
564
}, {
565
.ident = MAC_MODEL_TV,
566
.name = "TV",
567
.adb_type = MAC_ADB_CUDA,
568
.via_type = MAC_VIA_QUADRA,
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
.ident = MAC_MODEL_P600,
575
.name = "Performa 600",
576
.adb_type = MAC_ADB_IISI,
577
.via_type = MAC_VIA_IIci,
578
.scsi_type = MAC_SCSI_OLD,
579
.scc_type = MAC_SCC_II,
580
.nubus_type = MAC_NUBUS,
581
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
582
},
583
584
/*
585
* Centris - just guessing again; maybe like Quadra.
586
* The C610 may or may not have SONIC. We probe to make sure.
587
*/
588
589
{
590
.ident = MAC_MODEL_C610,
591
.name = "Centris 610",
592
.adb_type = MAC_ADB_II,
593
.via_type = MAC_VIA_QUADRA,
594
.scsi_type = MAC_SCSI_QUADRA,
595
.scc_type = MAC_SCC_QUADRA,
596
.ether_type = MAC_ETHER_SONIC,
597
.nubus_type = MAC_NUBUS,
598
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
599
}, {
600
.ident = MAC_MODEL_C650,
601
.name = "Centris 650",
602
.adb_type = MAC_ADB_II,
603
.via_type = MAC_VIA_QUADRA,
604
.scsi_type = MAC_SCSI_QUADRA,
605
.scc_type = MAC_SCC_QUADRA,
606
.ether_type = MAC_ETHER_SONIC,
607
.nubus_type = MAC_NUBUS,
608
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
609
}, {
610
.ident = MAC_MODEL_C660,
611
.name = "Centris 660AV",
612
.adb_type = MAC_ADB_CUDA,
613
.via_type = MAC_VIA_QUADRA,
614
.scsi_type = MAC_SCSI_QUADRA3,
615
.scc_type = MAC_SCC_PSC,
616
.ether_type = MAC_ETHER_MACE,
617
.nubus_type = MAC_NUBUS,
618
.floppy_type = MAC_FLOPPY_AV,
619
},
620
621
/*
622
* The PowerBooks all the same "Combo" custom IC for SCSI and SCC
623
* and a PMU (in two variations?) for ADB. Most of them use the
624
* Quadra-style VIAs. A few models also have IDE from hell.
625
*/
626
627
{
628
.ident = MAC_MODEL_PB140,
629
.name = "PowerBook 140",
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_PB145,
638
.name = "PowerBook 145",
639
.adb_type = MAC_ADB_PB1,
640
.via_type = MAC_VIA_QUADRA,
641
.scsi_type = MAC_SCSI_OLD,
642
.scc_type = MAC_SCC_QUADRA,
643
.nubus_type = MAC_NUBUS,
644
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
645
}, {
646
.ident = MAC_MODEL_PB150,
647
.name = "PowerBook 150",
648
.adb_type = MAC_ADB_PB1,
649
.via_type = MAC_VIA_IIci,
650
.scsi_type = MAC_SCSI_OLD,
651
.ide_type = MAC_IDE_PB,
652
.scc_type = MAC_SCC_QUADRA,
653
.nubus_type = MAC_NUBUS,
654
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
655
}, {
656
.ident = MAC_MODEL_PB160,
657
.name = "PowerBook 160",
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_PB165,
666
.name = "PowerBook 165",
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_PB165C,
675
.name = "PowerBook 165c",
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_PB170,
684
.name = "PowerBook 170",
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_PB180,
693
.name = "PowerBook 180",
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_PB180C,
702
.name = "PowerBook 180c",
703
.adb_type = MAC_ADB_PB1,
704
.via_type = MAC_VIA_QUADRA,
705
.scsi_type = MAC_SCSI_OLD,
706
.scc_type = MAC_SCC_QUADRA,
707
.nubus_type = MAC_NUBUS,
708
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
709
}, {
710
.ident = MAC_MODEL_PB190,
711
.name = "PowerBook 190",
712
.adb_type = MAC_ADB_PB2,
713
.via_type = MAC_VIA_QUADRA,
714
.scsi_type = MAC_SCSI_OLD,
715
.ide_type = MAC_IDE_BABOON,
716
.scc_type = MAC_SCC_QUADRA,
717
.nubus_type = MAC_NUBUS,
718
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
719
}, {
720
.ident = MAC_MODEL_PB520,
721
.name = "PowerBook 520",
722
.adb_type = MAC_ADB_PB2,
723
.via_type = MAC_VIA_QUADRA,
724
.scsi_type = MAC_SCSI_OLD,
725
.scc_type = MAC_SCC_QUADRA,
726
.ether_type = MAC_ETHER_SONIC,
727
.nubus_type = MAC_NUBUS,
728
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
729
},
730
731
/*
732
* PowerBook Duos are pretty much like normal PowerBooks
733
* All of these probably have onboard SONIC in the Dock which
734
* means we'll have to probe for it eventually.
735
*
736
* Are these really MAC_VIA_IIci? The developer notes for the
737
* Duos show pretty much the same custom parts as in most of
738
* the other PowerBooks which would imply MAC_VIA_QUADRA.
739
*/
740
741
{
742
.ident = MAC_MODEL_PB210,
743
.name = "PowerBook Duo 210",
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_PB230,
752
.name = "PowerBook Duo 230",
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_PB250,
761
.name = "PowerBook Duo 250",
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_PB270C,
770
.name = "PowerBook Duo 270c",
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_PB280,
779
.name = "PowerBook Duo 280",
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
.ident = MAC_MODEL_PB280C,
788
.name = "PowerBook Duo 280c",
789
.adb_type = MAC_ADB_PB2,
790
.via_type = MAC_VIA_IIci,
791
.scsi_type = MAC_SCSI_OLD,
792
.scc_type = MAC_SCC_QUADRA,
793
.nubus_type = MAC_NUBUS,
794
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
795
},
796
797
/*
798
* Other stuff?
799
*/
800
801
{
802
.ident = -1
803
}
804
};
805
806
static struct resource scc_a_rsrcs[] = {
807
{ .flags = IORESOURCE_MEM },
808
{ .flags = IORESOURCE_IRQ },
809
};
810
811
static struct resource scc_b_rsrcs[] = {
812
{ .flags = IORESOURCE_MEM },
813
{ .flags = IORESOURCE_IRQ },
814
};
815
816
struct platform_device scc_a_pdev = {
817
.name = "scc",
818
.id = 0,
819
.num_resources = ARRAY_SIZE(scc_a_rsrcs),
820
.resource = scc_a_rsrcs,
821
};
822
EXPORT_SYMBOL(scc_a_pdev);
823
824
struct platform_device scc_b_pdev = {
825
.name = "scc",
826
.id = 1,
827
.num_resources = ARRAY_SIZE(scc_b_rsrcs),
828
.resource = scc_b_rsrcs,
829
};
830
EXPORT_SYMBOL(scc_b_pdev);
831
832
static void __init mac_identify(void)
833
{
834
struct mac_model *m;
835
836
/* Penguin data useful? */
837
int model = mac_bi_data.id;
838
if (!model) {
839
/* no bootinfo model id -> NetBSD booter was used! */
840
/* XXX FIXME: breaks for model > 31 */
841
model = (mac_bi_data.cpuid >> 2) & 63;
842
printk(KERN_WARNING "No bootinfo model ID, using cpuid instead "
843
"(obsolete bootloader?)\n");
844
}
845
846
macintosh_config = mac_data_table;
847
for (m = macintosh_config; m->ident != -1; m++) {
848
if (m->ident == model) {
849
macintosh_config = m;
850
break;
851
}
852
}
853
854
/* Set up serial port resources for the console initcall. */
855
856
scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2;
857
scc_a_rsrcs[0].end = scc_a_rsrcs[0].start;
858
scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase;
859
scc_b_rsrcs[0].end = scc_b_rsrcs[0].start;
860
861
switch (macintosh_config->scc_type) {
862
case MAC_SCC_PSC:
863
scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A;
864
scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B;
865
break;
866
default:
867
scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC;
868
scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC;
869
break;
870
}
871
872
/*
873
* We need to pre-init the IOPs, if any. Otherwise
874
* the serial console won't work if the user had
875
* the serial ports set to "Faster" mode in MacOS.
876
*/
877
iop_preinit();
878
879
printk(KERN_INFO "Detected Macintosh model: %d\n", model);
880
881
/*
882
* Report booter data:
883
*/
884
printk(KERN_DEBUG " Penguin bootinfo data:\n");
885
printk(KERN_DEBUG " Video: addr 0x%lx "
886
"row 0x%lx depth %lx dimensions %ld x %ld\n",
887
mac_bi_data.videoaddr, mac_bi_data.videorow,
888
mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
889
mac_bi_data.dimensions >> 16);
890
printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n",
891
mac_bi_data.videological, mac_orig_videoaddr,
892
mac_bi_data.sccbase);
893
printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n",
894
mac_bi_data.boottime, mac_bi_data.gmtbias);
895
printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n",
896
mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
897
898
iop_init();
899
via_init();
900
oss_init();
901
psc_init();
902
baboon_init();
903
904
#ifdef CONFIG_ADB_CUDA
905
find_via_cuda();
906
#endif
907
}
908
909
static void __init mac_report_hardware(void)
910
{
911
printk(KERN_INFO "Apple Macintosh %s\n", macintosh_config->name);
912
}
913
914
static void mac_get_model(char *str)
915
{
916
strcpy(str, "Macintosh ");
917
strcat(str, macintosh_config->name);
918
}
919
920
static struct resource swim_rsrc = { .flags = IORESOURCE_MEM };
921
922
static struct platform_device swim_pdev = {
923
.name = "swim",
924
.id = -1,
925
.num_resources = 1,
926
.resource = &swim_rsrc,
927
};
928
929
static struct platform_device esp_0_pdev = {
930
.name = "mac_esp",
931
.id = 0,
932
};
933
934
static struct platform_device esp_1_pdev = {
935
.name = "mac_esp",
936
.id = 1,
937
};
938
939
static struct platform_device sonic_pdev = {
940
.name = "macsonic",
941
.id = -1,
942
};
943
944
static struct platform_device mace_pdev = {
945
.name = "macmace",
946
.id = -1,
947
};
948
949
int __init mac_platform_init(void)
950
{
951
u8 *swim_base;
952
953
/*
954
* Serial devices
955
*/
956
957
platform_device_register(&scc_a_pdev);
958
platform_device_register(&scc_b_pdev);
959
960
/*
961
* Floppy device
962
*/
963
964
switch (macintosh_config->floppy_type) {
965
case MAC_FLOPPY_SWIM_ADDR1:
966
swim_base = (u8 *)(VIA1_BASE + 0x1E000);
967
break;
968
case MAC_FLOPPY_SWIM_ADDR2:
969
swim_base = (u8 *)(VIA1_BASE + 0x16000);
970
break;
971
default:
972
swim_base = NULL;
973
break;
974
}
975
976
if (swim_base) {
977
swim_rsrc.start = (resource_size_t) swim_base,
978
swim_rsrc.end = (resource_size_t) swim_base + 0x2000,
979
platform_device_register(&swim_pdev);
980
}
981
982
/*
983
* SCSI device(s)
984
*/
985
986
switch (macintosh_config->scsi_type) {
987
case MAC_SCSI_QUADRA:
988
case MAC_SCSI_QUADRA3:
989
platform_device_register(&esp_0_pdev);
990
break;
991
case MAC_SCSI_QUADRA2:
992
platform_device_register(&esp_0_pdev);
993
if ((macintosh_config->ident == MAC_MODEL_Q900) ||
994
(macintosh_config->ident == MAC_MODEL_Q950))
995
platform_device_register(&esp_1_pdev);
996
break;
997
}
998
999
/*
1000
* Ethernet device
1001
*/
1002
1003
switch (macintosh_config->ether_type) {
1004
case MAC_ETHER_SONIC:
1005
platform_device_register(&sonic_pdev);
1006
break;
1007
case MAC_ETHER_MACE:
1008
platform_device_register(&mace_pdev);
1009
break;
1010
}
1011
1012
return 0;
1013
}
1014
1015
arch_initcall(mac_platform_init);
1016
1017