Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * This file is subject to the terms and conditions of the GNU General
0003  * Public License.  See the file "COPYING" in the main directory of this
0004  * archive for more details.
0005  *
0006  * Copyright (C) 2000 - 2001 by Kanoj Sarcar (kanoj@sgi.com)
0007  * Copyright (C) 2000 - 2001 by Silicon Graphics, Inc.
0008  */
0009 #include <linux/kernel.h>
0010 #include <linux/init.h>
0011 #include <linux/sched.h>
0012 #include <linux/smp.h>
0013 #include <linux/mm.h>
0014 #include <linux/export.h>
0015 #include <linux/cpumask.h>
0016 #include <asm/bootinfo.h>
0017 #include <asm/cpu.h>
0018 #include <asm/io.h>
0019 #include <asm/sgialib.h>
0020 #include <asm/time.h>
0021 #include <asm/sn/agent.h>
0022 #include <asm/sn/types.h>
0023 #include <asm/sn/klconfig.h>
0024 #include <asm/sn/ioc3.h>
0025 #include <asm/mipsregs.h>
0026 #include <asm/sn/gda.h>
0027 #include <asm/sn/intr.h>
0028 #include <asm/current.h>
0029 #include <asm/processor.h>
0030 #include <asm/mmu_context.h>
0031 #include <asm/thread_info.h>
0032 #include <asm/sn/launch.h>
0033 #include <asm/sn/mapped_kernel.h>
0034 
0035 #include "ip27-common.h"
0036 
0037 #define CPU_NONE        (cpuid_t)-1
0038 
0039 static DECLARE_BITMAP(hub_init_mask, MAX_NUMNODES);
0040 nasid_t master_nasid = INVALID_NASID;
0041 
0042 struct cpuinfo_ip27 sn_cpu_info[NR_CPUS];
0043 EXPORT_SYMBOL_GPL(sn_cpu_info);
0044 
0045 static void per_hub_init(nasid_t nasid)
0046 {
0047     struct hub_data *hub = hub_data(nasid);
0048 
0049     cpumask_set_cpu(smp_processor_id(), &hub->h_cpus);
0050 
0051     if (test_and_set_bit(nasid, hub_init_mask))
0052         return;
0053     /*
0054      * Set CRB timeout at 5ms, (< PI timeout of 10ms)
0055      */
0056     REMOTE_HUB_S(nasid, IIO_ICTP, 0x800);
0057     REMOTE_HUB_S(nasid, IIO_ICTO, 0xff);
0058 
0059     hub_rtc_init(nasid);
0060 
0061     if (nasid) {
0062         /* copy exception handlers from first node to current node */
0063         memcpy((void *)NODE_OFFSET_TO_K0(nasid, 0),
0064                (void *)CKSEG0, 0x200);
0065         __flush_cache_all();
0066         /* switch to node local exception handlers */
0067         REMOTE_HUB_S(nasid, PI_CALIAS_SIZE, PI_CALIAS_SIZE_8K);
0068     }
0069 }
0070 
0071 void per_cpu_init(void)
0072 {
0073     int cpu = smp_processor_id();
0074     nasid_t nasid = get_nasid();
0075 
0076     clear_c0_status(ST0_IM);
0077 
0078     per_hub_init(nasid);
0079 
0080     pr_info("CPU %d clock is %dMHz.\n", cpu, sn_cpu_info[cpu].p_speed);
0081 
0082     install_ipi();
0083 
0084     /* Install our NMI handler if symmon hasn't installed one. */
0085     install_cpu_nmi_handler(cputoslice(cpu));
0086 
0087     enable_percpu_irq(IP27_HUB_PEND0_IRQ, IRQ_TYPE_NONE);
0088     enable_percpu_irq(IP27_HUB_PEND1_IRQ, IRQ_TYPE_NONE);
0089 }
0090 
0091 void __init plat_mem_setup(void)
0092 {
0093     u64 p, e, n_mode;
0094     nasid_t nid;
0095 
0096     register_smp_ops(&ip27_smp_ops);
0097 
0098     ip27_reboot_setup();
0099 
0100     /*
0101      * hub_rtc init and cpu clock intr enabled for later calibrate_delay.
0102      */
0103     nid = get_nasid();
0104     printk("IP27: Running on node %d.\n", nid);
0105 
0106     p = LOCAL_HUB_L(PI_CPU_PRESENT_A) & 1;
0107     e = LOCAL_HUB_L(PI_CPU_ENABLE_A) & 1;
0108     printk("Node %d has %s primary CPU%s.\n", nid,
0109            p ? "a" : "no",
0110            e ? ", CPU is running" : "");
0111 
0112     p = LOCAL_HUB_L(PI_CPU_PRESENT_B) & 1;
0113     e = LOCAL_HUB_L(PI_CPU_ENABLE_B) & 1;
0114     printk("Node %d has %s secondary CPU%s.\n", nid,
0115            p ? "a" : "no",
0116            e ? ", CPU is running" : "");
0117 
0118     /*
0119      * Try to catch kernel missconfigurations and give user an
0120      * indication what option to select.
0121      */
0122     n_mode = LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_MORENODES_MASK;
0123     printk("Machine is in %c mode.\n", n_mode ? 'N' : 'M');
0124 #ifdef CONFIG_SGI_SN_N_MODE
0125     if (!n_mode)
0126         panic("Kernel compiled for M mode.");
0127 #else
0128     if (n_mode)
0129         panic("Kernel compiled for N mode.");
0130 #endif
0131 
0132     ioport_resource.start = 0;
0133     ioport_resource.end = ~0UL;
0134     set_io_port_base(IO_BASE);
0135 }
0136 
0137 const char *get_system_type(void)
0138 {
0139     return "SGI Origin";
0140 }
0141 
0142 void __init prom_init(void)
0143 {
0144     prom_init_cmdline(fw_arg0, (LONG *)fw_arg1);
0145     prom_meminit();
0146 }
0147