linux/arch/parisc/kernel/setup.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *    Initial setup-routines for HP 9000 based hardware.
   4 *
   5 *    Copyright (C) 1991, 1992, 1995  Linus Torvalds
   6 *    Modifications for PA-RISC (C) 1999 Helge Deller <deller@gmx.de>
   7 *    Modifications copyright 1999 SuSE GmbH (Philipp Rumpf)
   8 *    Modifications copyright 2000 Martin K. Petersen <mkp@mkp.net>
   9 *    Modifications copyright 2000 Philipp Rumpf <prumpf@tux.org>
  10 *    Modifications copyright 2001 Ryan Bradetich <rbradetich@uswest.net>
  11 *
  12 *    Initial PA-RISC Version: 04-23-1999 by Helge Deller
  13 */
  14
  15#include <linux/kernel.h>
  16#include <linux/initrd.h>
  17#include <linux/init.h>
  18#include <linux/console.h>
  19#include <linux/seq_file.h>
  20#define PCI_DEBUG
  21#include <linux/pci.h>
  22#undef PCI_DEBUG
  23#include <linux/proc_fs.h>
  24#include <linux/export.h>
  25#include <linux/sched.h>
  26#include <linux/sched/clock.h>
  27#include <linux/start_kernel.h>
  28
  29#include <asm/cacheflush.h>
  30#include <asm/processor.h>
  31#include <asm/sections.h>
  32#include <asm/pdc.h>
  33#include <asm/led.h>
  34#include <asm/machdep.h>        /* for pa7300lc_init() proto */
  35#include <asm/pdc_chassis.h>
  36#include <asm/io.h>
  37#include <asm/setup.h>
  38#include <asm/unwind.h>
  39#include <asm/smp.h>
  40
  41static char __initdata command_line[COMMAND_LINE_SIZE];
  42
  43/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
  44struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
  45struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
  46struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL;
  47
  48void __init setup_cmdline(char **cmdline_p)
  49{
  50        extern unsigned int boot_args[];
  51
  52        /* Collect stuff passed in from the boot loader */
  53
  54        /* boot_args[0] is free-mem start, boot_args[1] is ptr to command line */
  55        if (boot_args[0] < 64) {
  56                /* called from hpux boot loader */
  57                boot_command_line[0] = '\0';
  58        } else {
  59                strlcpy(boot_command_line, (char *)__va(boot_args[1]),
  60                        COMMAND_LINE_SIZE);
  61
  62#ifdef CONFIG_BLK_DEV_INITRD
  63                if (boot_args[2] != 0) /* did palo pass us a ramdisk? */
  64                {
  65                    initrd_start = (unsigned long)__va(boot_args[2]);
  66                    initrd_end = (unsigned long)__va(boot_args[3]);
  67                }
  68#endif
  69        }
  70
  71        strcpy(command_line, boot_command_line);
  72        *cmdline_p = command_line;
  73}
  74
  75#ifdef CONFIG_PA11
  76void __init dma_ops_init(void)
  77{
  78        switch (boot_cpu_data.cpu_type) {
  79        case pcx:
  80                /*
  81                 * We've got way too many dependencies on 1.1 semantics
  82                 * to support 1.0 boxes at this point.
  83                 */
  84                panic(  "PA-RISC Linux currently only supports machines that conform to\n"
  85                        "the PA-RISC 1.1 or 2.0 architecture specification.\n");
  86
  87        case pcxl2:
  88                pa7300lc_init();
  89                break;
  90        default:
  91                break;
  92        }
  93}
  94#endif
  95
  96extern void collect_boot_cpu_data(void);
  97
  98void __init setup_arch(char **cmdline_p)
  99{
 100#ifdef CONFIG_64BIT
 101        extern int parisc_narrow_firmware;
 102#endif
 103        unwind_init();
 104
 105        init_per_cpu(smp_processor_id());       /* Set Modes & Enable FP */
 106
 107#ifdef CONFIG_64BIT
 108        printk(KERN_INFO "The 64-bit Kernel has started...\n");
 109#else
 110        printk(KERN_INFO "The 32-bit Kernel has started...\n");
 111#endif
 112
 113        printk(KERN_INFO "Kernel default page size is %d KB. Huge pages ",
 114                (int)(PAGE_SIZE / 1024));
 115#ifdef CONFIG_HUGETLB_PAGE
 116        printk(KERN_CONT "enabled with %d MB physical and %d MB virtual size",
 117                 1 << (REAL_HPAGE_SHIFT - 20), 1 << (HPAGE_SHIFT - 20));
 118#else
 119        printk(KERN_CONT "disabled");
 120#endif
 121        printk(KERN_CONT ".\n");
 122
 123        /*
 124         * Check if initial kernel page mappings are sufficient.
 125         * panic early if not, else we may access kernel functions
 126         * and variables which can't be reached.
 127         */
 128        if (__pa((unsigned long) &_end) >= KERNEL_INITIAL_SIZE)
 129                panic("KERNEL_INITIAL_ORDER too small!");
 130
 131        pdc_console_init();
 132
 133#ifdef CONFIG_64BIT
 134        if(parisc_narrow_firmware) {
 135                printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n");
 136        }
 137#endif
 138        setup_pdc();
 139        setup_cmdline(cmdline_p);
 140        collect_boot_cpu_data();
 141        do_memory_inventory();  /* probe for physical memory */
 142        parisc_cache_init();
 143        paging_init();
 144
 145#ifdef CONFIG_CHASSIS_LCD_LED
 146        /* initialize the LCD/LED after boot_cpu_data is available ! */
 147        led_init();             /* LCD/LED initialization */
 148#endif
 149
 150#ifdef CONFIG_PA11
 151        dma_ops_init();
 152#endif
 153
 154        clear_sched_clock_stable();
 155}
 156
 157/*
 158 * Display CPU info for all CPUs.
 159 * for parisc this is in processor.c
 160 */
 161extern int show_cpuinfo (struct seq_file *m, void *v);
 162
 163static void *
 164c_start (struct seq_file *m, loff_t *pos)
 165{
 166        /* Looks like the caller will call repeatedly until we return
 167         * 0, signaling EOF perhaps.  This could be used to sequence
 168         * through CPUs for example.  Since we print all cpu info in our
 169         * show_cpuinfo() disregarding 'pos' (which I assume is 'v' above)
 170         * we only allow for one "position".  */
 171        return ((long)*pos < 1) ? (void *)1 : NULL;
 172}
 173
 174static void *
 175c_next (struct seq_file *m, void *v, loff_t *pos)
 176{
 177        ++*pos;
 178        return c_start(m, pos);
 179}
 180
 181static void
 182c_stop (struct seq_file *m, void *v)
 183{
 184}
 185
 186const struct seq_operations cpuinfo_op = {
 187        .start  = c_start,
 188        .next   = c_next,
 189        .stop   = c_stop,
 190        .show   = show_cpuinfo
 191};
 192
 193static void __init parisc_proc_mkdir(void)
 194{
 195        /*
 196        ** Can't call proc_mkdir() until after proc_root_init() has been
 197        ** called by start_kernel(). In other words, this code can't
 198        ** live in arch/.../setup.c because start_parisc() calls
 199        ** start_kernel().
 200        */
 201        switch (boot_cpu_data.cpu_type) {
 202        case pcxl:
 203        case pcxl2:
 204                if (NULL == proc_gsc_root)
 205                {
 206                        proc_gsc_root = proc_mkdir("bus/gsc", NULL);
 207                }
 208                break;
 209        case pcxt_:
 210        case pcxu:
 211        case pcxu_:
 212        case pcxw:
 213        case pcxw_:
 214        case pcxw2:
 215                if (NULL == proc_runway_root)
 216                {
 217                        proc_runway_root = proc_mkdir("bus/runway", NULL);
 218                }
 219                break;
 220        case mako:
 221        case mako2:
 222                if (NULL == proc_mckinley_root)
 223                {
 224                        proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
 225                }
 226                break;
 227        default:
 228                /* FIXME: this was added to prevent the compiler 
 229                 * complaining about missing pcx, pcxs and pcxt
 230                 * I'm assuming they have neither gsc nor runway */
 231                break;
 232        }
 233}
 234
 235static struct resource central_bus = {
 236        .name   = "Central Bus",
 237        .start  = F_EXTEND(0xfff80000),
 238        .end    = F_EXTEND(0xfffaffff),
 239        .flags  = IORESOURCE_MEM,
 240};
 241
 242static struct resource local_broadcast = {
 243        .name   = "Local Broadcast",
 244        .start  = F_EXTEND(0xfffb0000),
 245        .end    = F_EXTEND(0xfffdffff),
 246        .flags  = IORESOURCE_MEM,
 247};
 248
 249static struct resource global_broadcast = {
 250        .name   = "Global Broadcast",
 251        .start  = F_EXTEND(0xfffe0000),
 252        .end    = F_EXTEND(0xffffffff),
 253        .flags  = IORESOURCE_MEM,
 254};
 255
 256static int __init parisc_init_resources(void)
 257{
 258        int result;
 259
 260        result = request_resource(&iomem_resource, &central_bus);
 261        if (result < 0) {
 262                printk(KERN_ERR 
 263                       "%s: failed to claim %s address space!\n", 
 264                       __FILE__, central_bus.name);
 265                return result;
 266        }
 267
 268        result = request_resource(&iomem_resource, &local_broadcast);
 269        if (result < 0) {
 270                printk(KERN_ERR 
 271                       "%s: failed to claim %saddress space!\n", 
 272                       __FILE__, local_broadcast.name);
 273                return result;
 274        }
 275
 276        result = request_resource(&iomem_resource, &global_broadcast);
 277        if (result < 0) {
 278                printk(KERN_ERR 
 279                       "%s: failed to claim %s address space!\n", 
 280                       __FILE__, global_broadcast.name);
 281                return result;
 282        }
 283
 284        return 0;
 285}
 286
 287extern void gsc_init(void);
 288extern void processor_init(void);
 289extern void ccio_init(void);
 290extern void hppb_init(void);
 291extern void dino_init(void);
 292extern void iosapic_init(void);
 293extern void lba_init(void);
 294extern void sba_init(void);
 295extern void eisa_init(void);
 296
 297static int __init parisc_init(void)
 298{
 299        u32 osid = (OS_ID_LINUX << 16);
 300
 301        parisc_proc_mkdir();
 302        parisc_init_resources();
 303        do_device_inventory();                  /* probe for hardware */
 304
 305        parisc_pdc_chassis_init();
 306        
 307        /* set up a new led state on systems shipped LED State panel */
 308        pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BSTART);
 309
 310        /* tell PDC we're Linux. Nevermind failure. */
 311        pdc_stable_write(0x40, &osid, sizeof(osid));
 312        
 313        /* start with known state */
 314        flush_cache_all_local();
 315        flush_tlb_all_local(NULL);
 316
 317        processor_init();
 318#ifdef CONFIG_SMP
 319        pr_info("CPU(s): %d out of %d %s at %d.%06d MHz online\n",
 320                num_online_cpus(), num_present_cpus(),
 321#else
 322        pr_info("CPU(s): 1 x %s at %d.%06d MHz\n",
 323#endif
 324                        boot_cpu_data.cpu_name,
 325                        boot_cpu_data.cpu_hz / 1000000,
 326                        boot_cpu_data.cpu_hz % 1000000  );
 327
 328#if defined(CONFIG_64BIT) && defined(CONFIG_SMP)
 329        /* Don't serialize TLB flushes if we run on one CPU only. */
 330        if (num_online_cpus() == 1)
 331                pa_serialize_tlb_flushes = 0;
 332#endif
 333
 334        apply_alternatives_all();
 335        parisc_setup_cache_timing();
 336
 337        /* These are in a non-obvious order, will fix when we have an iotree */
 338#if defined(CONFIG_IOSAPIC)
 339        iosapic_init();
 340#endif
 341#if defined(CONFIG_IOMMU_SBA)
 342        sba_init();
 343#endif
 344#if defined(CONFIG_PCI_LBA)
 345        lba_init();
 346#endif
 347
 348        /* CCIO before any potential subdevices */
 349#if defined(CONFIG_IOMMU_CCIO)
 350        ccio_init();
 351#endif
 352
 353        /*
 354         * Need to register Asp & Wax before the EISA adapters for the IRQ
 355         * regions.  EISA must come before PCI to be sure it gets IRQ region
 356         * 0.
 357         */
 358#if defined(CONFIG_GSC_LASI) || defined(CONFIG_GSC_WAX)
 359        gsc_init();
 360#endif
 361#ifdef CONFIG_EISA
 362        eisa_init();
 363#endif
 364
 365#if defined(CONFIG_HPPB)
 366        hppb_init();
 367#endif
 368
 369#if defined(CONFIG_GSC_DINO)
 370        dino_init();
 371#endif
 372
 373#ifdef CONFIG_CHASSIS_LCD_LED
 374        register_led_regions(); /* register LED port info in procfs */
 375#endif
 376
 377        return 0;
 378}
 379arch_initcall(parisc_init);
 380
 381void __init start_parisc(void)
 382{
 383        extern void early_trap_init(void);
 384
 385        int ret, cpunum;
 386        struct pdc_coproc_cfg coproc_cfg;
 387
 388        /* check QEMU/SeaBIOS marker in PAGE0 */
 389        running_on_qemu = (memcmp(&PAGE0->pad0, "SeaBIOS", 8) == 0);
 390
 391        cpunum = smp_processor_id();
 392
 393        init_cpu_topology();
 394
 395        set_firmware_width_unlocked();
 396
 397        ret = pdc_coproc_cfg_unlocked(&coproc_cfg);
 398        if (ret >= 0 && coproc_cfg.ccr_functional) {
 399                mtctl(coproc_cfg.ccr_functional, 10);
 400
 401                per_cpu(cpu_data, cpunum).fp_rev = coproc_cfg.revision;
 402                per_cpu(cpu_data, cpunum).fp_model = coproc_cfg.model;
 403
 404                asm volatile ("fstd     %fr0,8(%sp)");
 405        } else {
 406                panic("must have an fpu to boot linux");
 407        }
 408
 409        early_trap_init(); /* initialize checksum of fault_vector */
 410
 411        start_kernel();
 412        // not reached
 413}
 414