| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights | 
|  | 3 | * reserved. | 
|  | 4 | * | 
|  | 5 | * This software is available to you under a choice of one of two | 
|  | 6 | * licenses.  You may choose to be licensed under the terms of the GNU | 
|  | 7 | * General Public License (GPL) Version 2, available from the file | 
|  | 8 | * COPYING in the main directory of this source tree, or the NetLogic | 
|  | 9 | * license below: | 
|  | 10 | * | 
|  | 11 | * Redistribution and use in source and binary forms, with or without | 
|  | 12 | * modification, are permitted provided that the following conditions | 
|  | 13 | * are met: | 
|  | 14 | * | 
|  | 15 | * 1. Redistributions of source code must retain the above copyright | 
|  | 16 | *    notice, this list of conditions and the following disclaimer. | 
|  | 17 | * 2. Redistributions in binary form must reproduce the above copyright | 
|  | 18 | *    notice, this list of conditions and the following disclaimer in | 
|  | 19 | *    the documentation and/or other materials provided with the | 
|  | 20 | *    distribution. | 
|  | 21 | * | 
|  | 22 | * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR | 
|  | 23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 
|  | 24 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
|  | 25 | * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE | 
|  | 26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
|  | 27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
|  | 28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | 
|  | 29 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
|  | 30 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | 
|  | 31 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | 
|  | 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | 33 | */ | 
|  | 34 |  | 
|  | 35 | #include <linux/kernel.h> | 
|  | 36 | #include <linux/delay.h> | 
|  | 37 | #include <linux/init.h> | 
|  | 38 | #include <linux/smp.h> | 
|  | 39 | #include <linux/irq.h> | 
|  | 40 |  | 
|  | 41 | #include <asm/mmu_context.h> | 
|  | 42 |  | 
|  | 43 | #include <asm/netlogic/interrupt.h> | 
|  | 44 | #include <asm/netlogic/mips-extns.h> | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 45 | #include <asm/netlogic/haldefs.h> | 
|  | 46 | #include <asm/netlogic/common.h> | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 47 |  | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 48 | #if defined(CONFIG_CPU_XLP) | 
|  | 49 | #include <asm/netlogic/xlp-hal/iomap.h> | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 50 | #include <asm/netlogic/xlp-hal/xlp.h> | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 51 | #include <asm/netlogic/xlp-hal/pic.h> | 
|  | 52 | #elif defined(CONFIG_CPU_XLR) | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 53 | #include <asm/netlogic/xlr/iomap.h> | 
|  | 54 | #include <asm/netlogic/xlr/pic.h> | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 55 | #include <asm/netlogic/xlr/xlr.h> | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 56 | #else | 
|  | 57 | #error "Unknown CPU" | 
|  | 58 | #endif | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 59 |  | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 60 | void nlm_send_ipi_single(int logical_cpu, unsigned int action) | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 61 | { | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 62 | int cpu, node; | 
|  | 63 | uint64_t picbase; | 
|  | 64 |  | 
|  | 65 | cpu = cpu_logical_map(logical_cpu); | 
|  | 66 | node = cpu / NLM_CPUS_PER_NODE; | 
|  | 67 | picbase = nlm_get_node(node)->picbase; | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 68 |  | 
|  | 69 | if (action & SMP_CALL_FUNCTION) | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 70 | nlm_pic_send_ipi(picbase, cpu, IRQ_IPI_SMP_FUNCTION, 0); | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 71 | if (action & SMP_RESCHEDULE_YOURSELF) | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 72 | nlm_pic_send_ipi(picbase, cpu, IRQ_IPI_SMP_RESCHEDULE, 0); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 73 | } | 
|  | 74 |  | 
|  | 75 | void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action) | 
|  | 76 | { | 
|  | 77 | int cpu; | 
|  | 78 |  | 
|  | 79 | for_each_cpu(cpu, mask) { | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 80 | nlm_send_ipi_single(cpu, action); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 81 | } | 
|  | 82 | } | 
|  | 83 |  | 
|  | 84 | /* IRQ_IPI_SMP_FUNCTION Handler */ | 
|  | 85 | void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc) | 
|  | 86 | { | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 87 | write_c0_eirr(1ull << irq); | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 88 | smp_call_function_interrupt(); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 89 | } | 
|  | 90 |  | 
|  | 91 | /* IRQ_IPI_SMP_RESCHEDULE  handler */ | 
|  | 92 | void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc) | 
|  | 93 | { | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 94 | write_c0_eirr(1ull << irq); | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 95 | scheduler_ipi(); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 96 | } | 
|  | 97 |  | 
|  | 98 | /* | 
|  | 99 | * Called before going into mips code, early cpu init | 
|  | 100 | */ | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 101 | void nlm_early_init_secondary(int cpu) | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 102 | { | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 103 | change_c0_config(CONF_CM_CMASK, 0x3); | 
| Jayachandran C | 65040e2 | 2011-11-16 00:21:28 +0000 | [diff] [blame] | 104 | #ifdef CONFIG_CPU_XLP | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 105 | /* mmu init, once per core */ | 
|  | 106 | if (cpu % NLM_THREADS_PER_CORE == 0) | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 107 | xlp_mmu_init(); | 
|  | 108 | #endif | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 109 | write_c0_ebase(nlm_current_node()->ebase); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 110 | } | 
|  | 111 |  | 
|  | 112 | /* | 
|  | 113 | * Code to run on secondary just after probing the CPU | 
|  | 114 | */ | 
|  | 115 | static void __cpuinit nlm_init_secondary(void) | 
|  | 116 | { | 
| Jayachandran C | 3854174 | 2012-10-31 12:01:41 +0000 | [diff] [blame] | 117 | int hwtid; | 
|  | 118 |  | 
|  | 119 | hwtid = hard_smp_processor_id(); | 
|  | 120 | current_cpu_data.core = hwtid / NLM_THREADS_PER_CORE; | 
| Ganesan Ramalingam | ed21cfe | 2012-10-31 12:01:42 +0000 | [diff] [blame] | 121 | nlm_percpu_init(hwtid); | 
| Jayachandran C | 3854174 | 2012-10-31 12:01:41 +0000 | [diff] [blame] | 122 | nlm_smp_irq_init(hwtid); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 123 | } | 
|  | 124 |  | 
| Hillf Danton | b3ea581 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 125 | void nlm_prepare_cpus(unsigned int max_cpus) | 
|  | 126 | { | 
|  | 127 | /* declare we are SMT capable */ | 
|  | 128 | smp_num_siblings = nlm_threads_per_core; | 
|  | 129 | } | 
|  | 130 |  | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 131 | void nlm_smp_finish(void) | 
|  | 132 | { | 
| Jayachandran C | 39263ee | 2011-06-07 03:14:12 +0530 | [diff] [blame] | 133 | local_irq_enable(); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 134 | } | 
|  | 135 |  | 
|  | 136 | void nlm_cpus_done(void) | 
|  | 137 | { | 
|  | 138 | } | 
|  | 139 |  | 
|  | 140 | /* | 
|  | 141 | * Boot all other cpus in the system, initialize them, and bring them into | 
|  | 142 | * the boot function | 
|  | 143 | */ | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 144 | int nlm_cpu_ready[NR_CPUS]; | 
|  | 145 | unsigned long nlm_next_gp; | 
|  | 146 | unsigned long nlm_next_sp; | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 147 |  | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 148 | cpumask_t phys_cpu_present_map; | 
|  | 149 |  | 
|  | 150 | void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) | 
|  | 151 | { | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 152 | int cpu, node; | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 153 |  | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 154 | cpu = cpu_logical_map(logical_cpu); | 
|  | 155 | node = cpu / NLM_CPUS_PER_NODE; | 
|  | 156 | nlm_next_sp = (unsigned long)__KSTK_TOS(idle); | 
|  | 157 | nlm_next_gp = (unsigned long)task_thread_info(idle); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 158 |  | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 159 | /* barrier for sp/gp store above */ | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 160 | __sync(); | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 161 | nlm_pic_send_ipi(nlm_get_node(node)->picbase, cpu, 1, 1);  /* NMI */ | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 162 | } | 
|  | 163 |  | 
|  | 164 | void __init nlm_smp_setup(void) | 
|  | 165 | { | 
|  | 166 | unsigned int boot_cpu; | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 167 | int num_cpus, i, ncore; | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 168 |  | 
|  | 169 | boot_cpu = hard_smp_processor_id(); | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 170 | cpumask_clear(&phys_cpu_present_map); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 171 |  | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 172 | cpumask_set_cpu(boot_cpu, &phys_cpu_present_map); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 173 | __cpu_number_map[boot_cpu] = 0; | 
|  | 174 | __cpu_logical_map[0] = boot_cpu; | 
| Rusty Russell | 0b5f9c0 | 2012-03-29 15:38:30 +1030 | [diff] [blame] | 175 | set_cpu_possible(0, true); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 176 |  | 
|  | 177 | num_cpus = 1; | 
|  | 178 | for (i = 0; i < NR_CPUS; i++) { | 
| Hillf Danton | b278896 | 2011-09-24 02:29:54 +0200 | [diff] [blame] | 179 | /* | 
| Jayachandran C | 0c96540 | 2011-11-11 17:08:29 +0530 | [diff] [blame] | 180 | * nlm_cpu_ready array is not set for the boot_cpu, | 
|  | 181 | * it is only set for ASPs (see smpboot.S) | 
| Hillf Danton | b278896 | 2011-09-24 02:29:54 +0200 | [diff] [blame] | 182 | */ | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 183 | if (nlm_cpu_ready[i]) { | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 184 | cpumask_set_cpu(i, &phys_cpu_present_map); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 185 | __cpu_number_map[i] = num_cpus; | 
|  | 186 | __cpu_logical_map[num_cpus] = i; | 
| Rusty Russell | 0b5f9c0 | 2012-03-29 15:38:30 +1030 | [diff] [blame] | 187 | set_cpu_possible(num_cpus, true); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 188 | ++num_cpus; | 
|  | 189 | } | 
|  | 190 | } | 
|  | 191 |  | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 192 | /* check with the cores we have worken up */ | 
|  | 193 | for (ncore = 0, i = 0; i < NLM_NR_NODES; i++) | 
|  | 194 | ncore += hweight32(nlm_get_node(i)->coremask); | 
|  | 195 |  | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 196 | pr_info("Phys CPU present map: %lx, possible map %lx\n", | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 197 | (unsigned long)cpumask_bits(&phys_cpu_present_map)[0], | 
| Rusty Russell | 0b5f9c0 | 2012-03-29 15:38:30 +1030 | [diff] [blame] | 198 | (unsigned long)cpumask_bits(cpu_possible_mask)[0]); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 199 |  | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 200 | pr_info("Detected (%dc%dt) %d Slave CPU(s)\n", ncore, | 
|  | 201 | nlm_threads_per_core, num_cpus); | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 202 | nlm_set_nmi_handler(nlm_boot_secondary_cpus); | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 203 | } | 
|  | 204 |  | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 205 | static int nlm_parse_cpumask(cpumask_t *wakeup_mask) | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 206 | { | 
|  | 207 | uint32_t core0_thr_mask, core_thr_mask; | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 208 | int threadmode, i, j; | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 209 |  | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 210 | core0_thr_mask = 0; | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 211 | for (i = 0; i < NLM_THREADS_PER_CORE; i++) | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 212 | if (cpumask_test_cpu(i, wakeup_mask)) | 
|  | 213 | core0_thr_mask |= (1 << i); | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 214 | switch (core0_thr_mask) { | 
|  | 215 | case 1: | 
|  | 216 | nlm_threads_per_core = 1; | 
|  | 217 | threadmode = 0; | 
|  | 218 | break; | 
|  | 219 | case 3: | 
|  | 220 | nlm_threads_per_core = 2; | 
|  | 221 | threadmode = 2; | 
|  | 222 | break; | 
|  | 223 | case 0xf: | 
|  | 224 | nlm_threads_per_core = 4; | 
|  | 225 | threadmode = 3; | 
|  | 226 | break; | 
|  | 227 | default: | 
|  | 228 | goto unsupp; | 
|  | 229 | } | 
|  | 230 |  | 
|  | 231 | /* Verify other cores CPU masks */ | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 232 | for (i = 0; i < NR_CPUS; i += NLM_THREADS_PER_CORE) { | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 233 | core_thr_mask = 0; | 
| Jayachandran C | 77ae798 | 2012-10-31 12:01:39 +0000 | [diff] [blame] | 234 | for (j = 0; j < NLM_THREADS_PER_CORE; j++) | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 235 | if (cpumask_test_cpu(i + j, wakeup_mask)) | 
|  | 236 | core_thr_mask |= (1 << j); | 
|  | 237 | if (core_thr_mask != 0 && core_thr_mask != core0_thr_mask) | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 238 | goto unsupp; | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 239 | } | 
|  | 240 | return threadmode; | 
|  | 241 |  | 
|  | 242 | unsupp: | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 243 | panic("Unsupported CPU mask %lx\n", | 
|  | 244 | (unsigned long)cpumask_bits(wakeup_mask)[0]); | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 245 | return 0; | 
|  | 246 | } | 
|  | 247 |  | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 248 | int __cpuinit nlm_wakeup_secondary_cpus(void) | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 249 | { | 
|  | 250 | unsigned long reset_vec; | 
|  | 251 | char *reset_data; | 
|  | 252 | int threadmode; | 
|  | 253 |  | 
|  | 254 | /* Update reset entry point with CPU init code */ | 
|  | 255 | reset_vec = CKSEG1ADDR(RESET_VEC_PHYS); | 
|  | 256 | memcpy((void *)reset_vec, (void *)nlm_reset_entry, | 
|  | 257 | (nlm_reset_entry_end - nlm_reset_entry)); | 
|  | 258 |  | 
|  | 259 | /* verify the mask and setup core config variables */ | 
| Jayachandran C | 2a37b1a | 2012-10-31 12:01:37 +0000 | [diff] [blame] | 260 | threadmode = nlm_parse_cpumask(&nlm_cpumask); | 
| Jayachandran C | 66d2998 | 2011-11-16 00:21:29 +0000 | [diff] [blame] | 261 |  | 
|  | 262 | /* Setup CPU init parameters */ | 
|  | 263 | reset_data = (char *)CKSEG1ADDR(RESET_DATA_PHYS); | 
|  | 264 | *(int *)(reset_data + BOOT_THREAD_MODE) = threadmode; | 
|  | 265 |  | 
|  | 266 | #ifdef CONFIG_CPU_XLP | 
|  | 267 | xlp_wakeup_secondary_cpus(); | 
|  | 268 | #else | 
|  | 269 | xlr_wakeup_secondary_cpus(); | 
|  | 270 | #endif | 
|  | 271 | return 0; | 
|  | 272 | } | 
|  | 273 |  | 
| Jayachandran C | 5c64250 | 2011-05-07 01:36:40 +0530 | [diff] [blame] | 274 | struct plat_smp_ops nlm_smp_ops = { | 
|  | 275 | .send_ipi_single	= nlm_send_ipi_single, | 
|  | 276 | .send_ipi_mask		= nlm_send_ipi_mask, | 
|  | 277 | .init_secondary		= nlm_init_secondary, | 
|  | 278 | .smp_finish		= nlm_smp_finish, | 
|  | 279 | .cpus_done		= nlm_cpus_done, | 
|  | 280 | .boot_secondary		= nlm_boot_secondary, | 
|  | 281 | .smp_setup		= nlm_smp_setup, | 
|  | 282 | .prepare_cpus		= nlm_prepare_cpus, | 
|  | 283 | }; |