0001
0002
0003
0004
0005
0006
0007
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
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
0063 memcpy((void *)NODE_OFFSET_TO_K0(nasid, 0),
0064 (void *)CKSEG0, 0x200);
0065 __flush_cache_all();
0066
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
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
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
0120
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