root/arch/powerpc/platforms/powermac/setup.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pmac_show_cpuinfo
  2. find_via_cuda
  3. find_via_pmu
  4. smu_init
  5. ohare_init
  6. l2cr_init
  7. pmac_setup_arch
  8. note_scsi_host
  9. pmac_late_init
  10. note_bootable_part
  11. cuda_restart
  12. cuda_shutdown
  13. pmac_restart
  14. pmac_power_off
  15. pmac_halt
  16. pmac_init
  17. pmac_declare_of_platform_devices
  18. check_pmac_serial_console
  19. pmac_probe
  20. define_machine

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Powermac setup and early boot code plus other random bits.
   4  *
   5  *  PowerPC version
   6  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
   7  *
   8  *  Adapted for Power Macintosh by Paul Mackerras
   9  *    Copyright (C) 1996 Paul Mackerras (paulus@samba.org)
  10  *
  11  *  Derived from "arch/alpha/kernel/setup.c"
  12  *    Copyright (C) 1995 Linus Torvalds
  13  *
  14  *  Maintained by Benjamin Herrenschmidt (benh@kernel.crashing.org)
  15  */
  16 
  17 /*
  18  * bootup setup stuff..
  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   /* sda1 - slightly silly choice */
  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         /* find motherboard type */
 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         /* print parsed model */
 136         seq_printf(m, "detected as\t: %d (%s)\n", mbmodel, mbname);
 137         seq_printf(m, "pmac flags\t: %08x\n", mbflags);
 138 
 139         /* find l2 cache info */
 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         /* Indicate newworld/oldworld */
 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         /* should check and warn if SMU is present */
 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         /* this area has the CPU identification register
 215            and some registers used by smp boards */
 216         sysctrl_regs = (volatile u32 *) ioremap(0xf8000000, 0x1000);
 217 
 218         /*
 219          * Turn on the L2 cache.
 220          * We assume that we have a PSX memory controller iff
 221          * we have an ohare I/O controller.
 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         /* Checks "l2cr-value" property in the registry */
 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         /* Set loops_per_jiffy to a half-way reasonable value,
 275            for use until calibrate_delay gets called. */
 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                                 /* PPC970 etc. */
 283                                 loops_per_jiffy = *fp / (3 * HZ);
 284                         else if (pvr == 4 || pvr >= 8)
 285                                 /* 604, G3, G4 etc. */
 286                                 loops_per_jiffy = *fp / HZ;
 287                         else
 288                                 /* 601, 603, etc. */
 289                                 loops_per_jiffy = *fp / (2 * HZ);
 290                         of_node_put(cpu);
 291                         break;
 292                 }
 293         }
 294 
 295         /* See if newworld or oldworld */
 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         /* Lookup PCI hosts */
 303         pmac_pci_init();
 304 
 305 #ifdef CONFIG_PPC32
 306         ohare_init();
 307         l2cr_init();
 308 #endif /* CONFIG_PPC32 */
 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 /* CONFIG_ADB */
 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  * This is __ref because we check for "initializing" before
 353  * touching any of the __init sensitive things and "initializing"
 354  * will be false after __init time. This can't be __init because it
 355  * can be called whenever a disk is first accessed.
 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  * Early initialization.
 450  */
 451 static void __init pmac_init(void)
 452 {
 453         /* Enable early btext debug if requested */
 454         if (strstr(boot_command_line, "btextdbg")) {
 455                 udbg_adb_init_early();
 456                 register_early_udbg_console();
 457         }
 458 
 459         /* Probe motherboard chipset */
 460         pmac_feature_init();
 461 
 462         /* Initialize debug stuff */
 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         /* SMP Init has to be done early as we need to patch up
 471          * cpu_possible_mask before interrupt stacks are allocated
 472          * or kaboom...
 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                 /* Some machines have strangely broken device-tree */
 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  * This is called very early, as part of console_init() (typically just after
 515  * time_init()). This function is respondible for trying to find a good
 516  * default console on serial ports. It tries to match the open firmware
 517  * default output with one of the available serial console drivers.
 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         /* The user has requested a console so this is already set up. */
 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         /* We are getting a weird phandle from OF ... */
 544         /* ... So use the full path instead */
 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 /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
 577 
 578 /*
 579  * Called very early, MMU is off, device-tree isn't unflattened
 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         /* isa_io_base gets set in pmac_pci_init */
 589         ISA_DMA_THRESHOLD = ~0L;
 590         DMA_MODE_READ = 1;
 591         DMA_MODE_WRITE = 2;
 592 #endif /* CONFIG_PPC32 */
 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, /* changed later */
 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 /* CONFIG_PPC64 */
 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 };

/* [<][>][^][v][top][bottom][index][help] */