This source file includes following definitions.
- pmac_show_cpuinfo
- find_via_cuda
- find_via_pmu
- smu_init
- ohare_init
- l2cr_init
- pmac_setup_arch
- note_scsi_host
- pmac_late_init
- note_bootable_part
- cuda_restart
- cuda_shutdown
- pmac_restart
- pmac_power_off
- pmac_halt
- pmac_init
- pmac_declare_of_platform_devices
- check_pmac_serial_console
- pmac_probe
- define_machine
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <linux/init.h>
22 #include <linux/errno.h>
23 #include <linux/sched.h>
24 #include <linux/kernel.h>
25 #include <linux/mm.h>
26 #include <linux/stddef.h>
27 #include <linux/unistd.h>
28 #include <linux/ptrace.h>
29 #include <linux/export.h>
30 #include <linux/user.h>
31 #include <linux/tty.h>
32 #include <linux/string.h>
33 #include <linux/delay.h>
34 #include <linux/ioport.h>
35 #include <linux/major.h>
36 #include <linux/initrd.h>
37 #include <linux/vt_kern.h>
38 #include <linux/console.h>
39 #include <linux/pci.h>
40 #include <linux/adb.h>
41 #include <linux/cuda.h>
42 #include <linux/pmu.h>
43 #include <linux/irq.h>
44 #include <linux/seq_file.h>
45 #include <linux/root_dev.h>
46 #include <linux/bitops.h>
47 #include <linux/suspend.h>
48 #include <linux/of_device.h>
49 #include <linux/of_platform.h>
50
51 #include <asm/reg.h>
52 #include <asm/sections.h>
53 #include <asm/prom.h>
54 #include <asm/pgtable.h>
55 #include <asm/io.h>
56 #include <asm/pci-bridge.h>
57 #include <asm/ohare.h>
58 #include <asm/mediabay.h>
59 #include <asm/machdep.h>
60 #include <asm/dma.h>
61 #include <asm/cputable.h>
62 #include <asm/btext.h>
63 #include <asm/pmac_feature.h>
64 #include <asm/time.h>
65 #include <asm/mmu_context.h>
66 #include <asm/iommu.h>
67 #include <asm/smu.h>
68 #include <asm/pmc.h>
69 #include <asm/udbg.h>
70
71 #include "pmac.h"
72
73 #undef SHOW_GATWICK_IRQS
74
75 int ppc_override_l2cr = 0;
76 int ppc_override_l2cr_value;
77 int has_l2cache = 0;
78
79 int pmac_newworld;
80
81 static int current_root_goodness = -1;
82
83 extern struct machdep_calls pmac_md;
84
85 #define DEFAULT_ROOT_DEVICE Root_SDA1
86
87 #ifdef CONFIG_PPC64
88 int sccdbg;
89 #endif
90
91 sys_ctrler_t sys_ctrler = SYS_CTRLER_UNKNOWN;
92 EXPORT_SYMBOL(sys_ctrler);
93
94 static void pmac_show_cpuinfo(struct seq_file *m)
95 {
96 struct device_node *np;
97 const char *pp;
98 int plen;
99 int mbmodel;
100 unsigned int mbflags;
101 char* mbname;
102
103 mbmodel = pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL,
104 PMAC_MB_INFO_MODEL, 0);
105 mbflags = pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL,
106 PMAC_MB_INFO_FLAGS, 0);
107 if (pmac_call_feature(PMAC_FTR_GET_MB_INFO, NULL, PMAC_MB_INFO_NAME,
108 (long) &mbname) != 0)
109 mbname = "Unknown";
110
111
112 seq_printf(m, "machine\t\t: ");
113 np = of_find_node_by_path("/");
114 if (np != NULL) {
115 pp = of_get_property(np, "model", NULL);
116 if (pp != NULL)
117 seq_printf(m, "%s\n", pp);
118 else
119 seq_printf(m, "PowerMac\n");
120 pp = of_get_property(np, "compatible", &plen);
121 if (pp != NULL) {
122 seq_printf(m, "motherboard\t:");
123 while (plen > 0) {
124 int l = strlen(pp) + 1;
125 seq_printf(m, " %s", pp);
126 plen -= l;
127 pp += l;
128 }
129 seq_printf(m, "\n");
130 }
131 of_node_put(np);
132 } else
133 seq_printf(m, "PowerMac\n");
134
135
136 seq_printf(m, "detected as\t: %d (%s)\n", mbmodel, mbname);
137 seq_printf(m, "pmac flags\t: %08x\n", mbflags);
138
139
140 np = of_find_node_by_name(NULL, "l2-cache");
141 if (np == NULL)
142 np = of_find_node_by_type(NULL, "cache");
143 if (np != NULL) {
144 const unsigned int *ic =
145 of_get_property(np, "i-cache-size", NULL);
146 const unsigned int *dc =
147 of_get_property(np, "d-cache-size", NULL);
148 seq_printf(m, "L2 cache\t:");
149 has_l2cache = 1;
150 if (of_get_property(np, "cache-unified", NULL) && dc) {
151 seq_printf(m, " %dK unified", *dc / 1024);
152 } else {
153 if (ic)
154 seq_printf(m, " %dK instruction", *ic / 1024);
155 if (dc)
156 seq_printf(m, "%s %dK data",
157 (ic? " +": ""), *dc / 1024);
158 }
159 pp = of_get_property(np, "ram-type", NULL);
160 if (pp)
161 seq_printf(m, " %s", pp);
162 seq_printf(m, "\n");
163 of_node_put(np);
164 }
165
166
167 seq_printf(m, "pmac-generation\t: %s\n",
168 pmac_newworld ? "NewWorld" : "OldWorld");
169 }
170
171 #ifndef CONFIG_ADB_CUDA
172 int find_via_cuda(void)
173 {
174 struct device_node *dn = of_find_node_by_name(NULL, "via-cuda");
175
176 if (!dn)
177 return 0;
178 of_node_put(dn);
179 printk("WARNING ! Your machine is CUDA-based but your kernel\n");
180 printk(" wasn't compiled with CONFIG_ADB_CUDA option !\n");
181 return 0;
182 }
183 #endif
184
185 #ifndef CONFIG_ADB_PMU
186 int find_via_pmu(void)
187 {
188 struct device_node *dn = of_find_node_by_name(NULL, "via-pmu");
189
190 if (!dn)
191 return 0;
192 of_node_put(dn);
193 printk("WARNING ! Your machine is PMU-based but your kernel\n");
194 printk(" wasn't compiled with CONFIG_ADB_PMU option !\n");
195 return 0;
196 }
197 #endif
198
199 #ifndef CONFIG_PMAC_SMU
200 int smu_init(void)
201 {
202
203 return 0;
204 }
205 #endif
206
207 #ifdef CONFIG_PPC32
208 static volatile u32 *sysctrl_regs;
209
210 static void __init ohare_init(void)
211 {
212 struct device_node *dn;
213
214
215
216 sysctrl_regs = (volatile u32 *) ioremap(0xf8000000, 0x1000);
217
218
219
220
221
222
223 dn = of_find_node_by_name(NULL, "ohare");
224 if (dn) {
225 of_node_put(dn);
226 if (((sysctrl_regs[2] >> 24) & 0xf) >= 3) {
227 if (sysctrl_regs[4] & 0x10)
228 sysctrl_regs[4] |= 0x04000020;
229 else
230 sysctrl_regs[4] |= 0x04000000;
231 if(has_l2cache)
232 printk(KERN_INFO "Level 2 cache enabled\n");
233 }
234 }
235 }
236
237 static void __init l2cr_init(void)
238 {
239
240 if (cpu_has_feature(CPU_FTR_L2CR)) {
241 struct device_node *np;
242
243 for_each_of_cpu_node(np) {
244 const unsigned int *l2cr =
245 of_get_property(np, "l2cr-value", NULL);
246 if (l2cr) {
247 ppc_override_l2cr = 1;
248 ppc_override_l2cr_value = *l2cr;
249 _set_L2CR(0);
250 _set_L2CR(ppc_override_l2cr_value);
251 }
252 of_node_put(np);
253 break;
254 }
255 }
256
257 if (ppc_override_l2cr)
258 printk(KERN_INFO "L2CR overridden (0x%x), "
259 "backside cache is %s\n",
260 ppc_override_l2cr_value,
261 (ppc_override_l2cr_value & 0x80000000)
262 ? "enabled" : "disabled");
263 }
264 #endif
265
266 static void __init pmac_setup_arch(void)
267 {
268 struct device_node *cpu, *ic;
269 const int *fp;
270 unsigned long pvr;
271
272 pvr = PVR_VER(mfspr(SPRN_PVR));
273
274
275
276 loops_per_jiffy = 50000000 / HZ;
277
278 for_each_of_cpu_node(cpu) {
279 fp = of_get_property(cpu, "clock-frequency", NULL);
280 if (fp != NULL) {
281 if (pvr >= 0x30 && pvr < 0x80)
282
283 loops_per_jiffy = *fp / (3 * HZ);
284 else if (pvr == 4 || pvr >= 8)
285
286 loops_per_jiffy = *fp / HZ;
287 else
288
289 loops_per_jiffy = *fp / (2 * HZ);
290 of_node_put(cpu);
291 break;
292 }
293 }
294
295
296 ic = of_find_node_with_property(NULL, "interrupt-controller");
297 if (ic) {
298 pmac_newworld = 1;
299 of_node_put(ic);
300 }
301
302
303 pmac_pci_init();
304
305 #ifdef CONFIG_PPC32
306 ohare_init();
307 l2cr_init();
308 #endif
309
310 find_via_cuda();
311 find_via_pmu();
312 smu_init();
313
314 #if IS_ENABLED(CONFIG_NVRAM)
315 pmac_nvram_init();
316 #endif
317 #ifdef CONFIG_PPC32
318 #ifdef CONFIG_BLK_DEV_INITRD
319 if (initrd_start)
320 ROOT_DEV = Root_RAM0;
321 else
322 #endif
323 ROOT_DEV = DEFAULT_ROOT_DEVICE;
324 #endif
325
326 #ifdef CONFIG_ADB
327 if (strstr(boot_command_line, "adb_sync")) {
328 extern int __adb_probe_sync;
329 __adb_probe_sync = 1;
330 }
331 #endif
332 }
333
334 #ifdef CONFIG_SCSI
335 void note_scsi_host(struct device_node *node, void *host)
336 {
337 }
338 EXPORT_SYMBOL(note_scsi_host);
339 #endif
340
341 static int initializing = 1;
342
343 static int pmac_late_init(void)
344 {
345 initializing = 0;
346 return 0;
347 }
348 machine_late_initcall(powermac, pmac_late_init);
349
350 void note_bootable_part(dev_t dev, int part, int goodness);
351
352
353
354
355
356
357 void __ref note_bootable_part(dev_t dev, int part, int goodness)
358 {
359 char *p;
360
361 if (!initializing)
362 return;
363 if ((goodness <= current_root_goodness) &&
364 ROOT_DEV != DEFAULT_ROOT_DEVICE)
365 return;
366 p = strstr(boot_command_line, "root=");
367 if (p != NULL && (p == boot_command_line || p[-1] == ' '))
368 return;
369
370 ROOT_DEV = dev + part;
371 current_root_goodness = goodness;
372 }
373
374 #ifdef CONFIG_ADB_CUDA
375 static void __noreturn cuda_restart(void)
376 {
377 struct adb_request req;
378
379 cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_RESET_SYSTEM);
380 for (;;)
381 cuda_poll();
382 }
383
384 static void __noreturn cuda_shutdown(void)
385 {
386 struct adb_request req;
387
388 cuda_request(&req, NULL, 2, CUDA_PACKET, CUDA_POWERDOWN);
389 for (;;)
390 cuda_poll();
391 }
392
393 #else
394 #define cuda_restart()
395 #define cuda_shutdown()
396 #endif
397
398 #ifndef CONFIG_ADB_PMU
399 #define pmu_restart()
400 #define pmu_shutdown()
401 #endif
402
403 #ifndef CONFIG_PMAC_SMU
404 #define smu_restart()
405 #define smu_shutdown()
406 #endif
407
408 static void __noreturn pmac_restart(char *cmd)
409 {
410 switch (sys_ctrler) {
411 case SYS_CTRLER_CUDA:
412 cuda_restart();
413 break;
414 case SYS_CTRLER_PMU:
415 pmu_restart();
416 break;
417 case SYS_CTRLER_SMU:
418 smu_restart();
419 break;
420 default: ;
421 }
422 while (1) ;
423 }
424
425 static void __noreturn pmac_power_off(void)
426 {
427 switch (sys_ctrler) {
428 case SYS_CTRLER_CUDA:
429 cuda_shutdown();
430 break;
431 case SYS_CTRLER_PMU:
432 pmu_shutdown();
433 break;
434 case SYS_CTRLER_SMU:
435 smu_shutdown();
436 break;
437 default: ;
438 }
439 while (1) ;
440 }
441
442 static void __noreturn
443 pmac_halt(void)
444 {
445 pmac_power_off();
446 }
447
448
449
450
451 static void __init pmac_init(void)
452 {
453
454 if (strstr(boot_command_line, "btextdbg")) {
455 udbg_adb_init_early();
456 register_early_udbg_console();
457 }
458
459
460 pmac_feature_init();
461
462
463 udbg_scc_init(!!strstr(boot_command_line, "sccdbg"));
464 udbg_adb_init(!!strstr(boot_command_line, "btextdbg"));
465
466 #ifdef CONFIG_PPC64
467 iommu_init_early_dart(&pmac_pci_controller_ops);
468 #endif
469
470
471
472
473
474 #ifdef CONFIG_SMP
475 pmac_setup_smp();
476 #endif
477 }
478
479 static int __init pmac_declare_of_platform_devices(void)
480 {
481 struct device_node *np;
482
483 np = of_find_node_by_name(NULL, "valkyrie");
484 if (np) {
485 of_platform_device_create(np, "valkyrie", NULL);
486 of_node_put(np);
487 }
488 np = of_find_node_by_name(NULL, "platinum");
489 if (np) {
490 of_platform_device_create(np, "platinum", NULL);
491 of_node_put(np);
492 }
493 np = of_find_node_by_type(NULL, "smu");
494 if (np) {
495 of_platform_device_create(np, "smu", NULL);
496 of_node_put(np);
497 }
498 np = of_find_node_by_type(NULL, "fcu");
499 if (np == NULL) {
500
501 np = of_find_node_by_path("/u3@0,f8000000/i2c@f8001000/fan@15e");
502 }
503 if (np) {
504 of_platform_device_create(np, "temperature", NULL);
505 of_node_put(np);
506 }
507
508 return 0;
509 }
510 machine_device_initcall(powermac, pmac_declare_of_platform_devices);
511
512 #ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
513
514
515
516
517
518
519 static int __init check_pmac_serial_console(void)
520 {
521 struct device_node *prom_stdout = NULL;
522 int offset = 0;
523 const char *name;
524 #ifdef CONFIG_SERIAL_PMACZILOG_TTYS
525 char *devname = "ttyS";
526 #else
527 char *devname = "ttyPZ";
528 #endif
529
530 pr_debug(" -> check_pmac_serial_console()\n");
531
532
533 if (strstr(boot_command_line, "console=")) {
534 pr_debug(" console was specified !\n");
535 return -EBUSY;
536 }
537
538 if (!of_chosen) {
539 pr_debug(" of_chosen is NULL !\n");
540 return -ENODEV;
541 }
542
543
544
545 name = of_get_property(of_chosen, "linux,stdout-path", NULL);
546 if (name == NULL) {
547 pr_debug(" no linux,stdout-path !\n");
548 return -ENODEV;
549 }
550 prom_stdout = of_find_node_by_path(name);
551 if (!prom_stdout) {
552 pr_debug(" can't find stdout package %s !\n", name);
553 return -ENODEV;
554 }
555 pr_debug("stdout is %pOF\n", prom_stdout);
556
557 if (of_node_name_eq(prom_stdout, "ch-a"))
558 offset = 0;
559 else if (of_node_name_eq(prom_stdout, "ch-b"))
560 offset = 1;
561 else
562 goto not_found;
563 of_node_put(prom_stdout);
564
565 pr_debug("Found serial console at %s%d\n", devname, offset);
566
567 return add_preferred_console(devname, offset, NULL);
568
569 not_found:
570 pr_debug("No preferred console found !\n");
571 of_node_put(prom_stdout);
572 return -ENODEV;
573 }
574 console_initcall(check_pmac_serial_console);
575
576 #endif
577
578
579
580
581 static int __init pmac_probe(void)
582 {
583 if (!of_machine_is_compatible("Power Macintosh") &&
584 !of_machine_is_compatible("MacRISC"))
585 return 0;
586
587 #ifdef CONFIG_PPC32
588
589 ISA_DMA_THRESHOLD = ~0L;
590 DMA_MODE_READ = 1;
591 DMA_MODE_WRITE = 2;
592 #endif
593
594 pm_power_off = pmac_power_off;
595
596 pmac_init();
597
598 return 1;
599 }
600
601 define_machine(powermac) {
602 .name = "PowerMac",
603 .probe = pmac_probe,
604 .setup_arch = pmac_setup_arch,
605 .show_cpuinfo = pmac_show_cpuinfo,
606 .init_IRQ = pmac_pic_init,
607 .get_irq = NULL,
608 .pci_irq_fixup = pmac_pci_irq_fixup,
609 .restart = pmac_restart,
610 .halt = pmac_halt,
611 .time_init = pmac_time_init,
612 .get_boot_time = pmac_get_boot_time,
613 .set_rtc_time = pmac_set_rtc_time,
614 .get_rtc_time = pmac_get_rtc_time,
615 .calibrate_decr = pmac_calibrate_decr,
616 .feature_call = pmac_do_feature_call,
617 .progress = udbg_progress,
618 #ifdef CONFIG_PPC64
619 .power_save = power4_idle,
620 .enable_pmcs = power4_enable_pmcs,
621 #endif
622 #ifdef CONFIG_PPC32
623 .pcibios_after_init = pmac_pcibios_after_init,
624 .phys_mem_access_prot = pci_phys_mem_access_prot,
625 #endif
626 };