Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | /* * This file is subject to the terms and conditions of the GNU General * Public License. See the file "COPYING" in the main directory of this * archive for more details. * * Copyright (C) 2000 - 2001 by Kanoj Sarcar (kanoj@sgi.com) * Copyright (C) 2000 - 2001 by Silicon Graphics, Inc. */ #include <linux/kernel.h> #include <linux/init.h> #include <linux/sched.h> #include <linux/smp.h> #include <linux/mm.h> #include <linux/export.h> #include <linux/cpumask.h> #include <asm/bootinfo.h> #include <asm/cpu.h> #include <asm/io.h> #include <asm/sgialib.h> #include <asm/time.h> #include <asm/sn/agent.h> #include <asm/sn/types.h> #include <asm/sn/klconfig.h> #include <asm/sn/ioc3.h> #include <asm/mipsregs.h> #include <asm/sn/gda.h> #include <asm/sn/intr.h> #include <asm/current.h> #include <asm/processor.h> #include <asm/mmu_context.h> #include <asm/thread_info.h> #include <asm/sn/launch.h> #include <asm/sn/mapped_kernel.h> #include "ip27-common.h" #define CPU_NONE (cpuid_t)-1 static DECLARE_BITMAP(hub_init_mask, MAX_NUMNODES); nasid_t master_nasid = INVALID_NASID; struct cpuinfo_ip27 sn_cpu_info[NR_CPUS]; EXPORT_SYMBOL_GPL(sn_cpu_info); static void per_hub_init(nasid_t nasid) { struct hub_data *hub = hub_data(nasid); cpumask_set_cpu(smp_processor_id(), &hub->h_cpus); if (test_and_set_bit(nasid, hub_init_mask)) return; /* * Set CRB timeout at 5ms, (< PI timeout of 10ms) */ REMOTE_HUB_S(nasid, IIO_ICTP, 0x800); REMOTE_HUB_S(nasid, IIO_ICTO, 0xff); hub_rtc_init(nasid); if (nasid) { /* copy exception handlers from first node to current node */ memcpy((void *)NODE_OFFSET_TO_K0(nasid, 0), (void *)CKSEG0, 0x200); __flush_cache_all(); /* switch to node local exception handlers */ REMOTE_HUB_S(nasid, PI_CALIAS_SIZE, PI_CALIAS_SIZE_8K); } } void per_cpu_init(void) { int cpu = smp_processor_id(); nasid_t nasid = get_nasid(); clear_c0_status(ST0_IM); per_hub_init(nasid); pr_info("CPU %d clock is %dMHz.\n", cpu, sn_cpu_info[cpu].p_speed); install_ipi(); /* Install our NMI handler if symmon hasn't installed one. */ install_cpu_nmi_handler(cputoslice(cpu)); enable_percpu_irq(IP27_HUB_PEND0_IRQ, IRQ_TYPE_NONE); enable_percpu_irq(IP27_HUB_PEND1_IRQ, IRQ_TYPE_NONE); } void __init plat_mem_setup(void) { u64 p, e, n_mode; nasid_t nid; register_smp_ops(&ip27_smp_ops); ip27_reboot_setup(); /* * hub_rtc init and cpu clock intr enabled for later calibrate_delay. */ nid = get_nasid(); printk("IP27: Running on node %d.\n", nid); p = LOCAL_HUB_L(PI_CPU_PRESENT_A) & 1; e = LOCAL_HUB_L(PI_CPU_ENABLE_A) & 1; printk("Node %d has %s primary CPU%s.\n", nid, p ? "a" : "no", e ? ", CPU is running" : ""); p = LOCAL_HUB_L(PI_CPU_PRESENT_B) & 1; e = LOCAL_HUB_L(PI_CPU_ENABLE_B) & 1; printk("Node %d has %s secondary CPU%s.\n", nid, p ? "a" : "no", e ? ", CPU is running" : ""); /* * Try to catch kernel missconfigurations and give user an * indication what option to select. */ n_mode = LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_MORENODES_MASK; printk("Machine is in %c mode.\n", n_mode ? 'N' : 'M'); #ifdef CONFIG_SGI_SN_N_MODE if (!n_mode) panic("Kernel compiled for M mode."); #else if (n_mode) panic("Kernel compiled for N mode."); #endif ioport_resource.start = 0; ioport_resource.end = ~0UL; set_io_port_base(IO_BASE); } const char *get_system_type(void) { return "SGI Origin"; } void __init prom_init(void) { prom_init_cmdline(fw_arg0, (LONG *)fw_arg1); prom_meminit(); } |