diff options
Diffstat (limited to 'arch/mips/netlogic/common')
-rw-r--r-- | arch/mips/netlogic/common/irq.c | 10 | ||||
-rw-r--r-- | arch/mips/netlogic/common/reset.S | 22 | ||||
-rw-r--r-- | arch/mips/netlogic/common/smp.c | 25 | ||||
-rw-r--r-- | arch/mips/netlogic/common/time.c | 1 |
4 files changed, 40 insertions, 18 deletions
diff --git a/arch/mips/netlogic/common/irq.c b/arch/mips/netlogic/common/irq.c index c100b9afa0ab..5f5d18b0e94d 100644 --- a/arch/mips/netlogic/common/irq.c +++ b/arch/mips/netlogic/common/irq.c | |||
@@ -230,16 +230,16 @@ static void nlm_init_node_irqs(int node) | |||
230 | } | 230 | } |
231 | } | 231 | } |
232 | 232 | ||
233 | void nlm_smp_irq_init(int hwcpuid) | 233 | void nlm_smp_irq_init(int hwtid) |
234 | { | 234 | { |
235 | int node, cpu; | 235 | int cpu, node; |
236 | 236 | ||
237 | node = nlm_cpuid_to_node(hwcpuid); | 237 | cpu = hwtid % nlm_threads_per_node(); |
238 | cpu = hwcpuid % nlm_threads_per_node(); | 238 | node = hwtid / nlm_threads_per_node(); |
239 | 239 | ||
240 | if (cpu == 0 && node != 0) | 240 | if (cpu == 0 && node != 0) |
241 | nlm_init_node_irqs(node); | 241 | nlm_init_node_irqs(node); |
242 | write_c0_eimr(nlm_current_node()->irqmask); | 242 | write_c0_eimr(nlm_get_node(node)->irqmask); |
243 | } | 243 | } |
244 | 244 | ||
245 | asmlinkage void plat_irq_dispatch(void) | 245 | asmlinkage void plat_irq_dispatch(void) |
diff --git a/arch/mips/netlogic/common/reset.S b/arch/mips/netlogic/common/reset.S index 701c4bcb9e47..edbab9b8691f 100644 --- a/arch/mips/netlogic/common/reset.S +++ b/arch/mips/netlogic/common/reset.S | |||
@@ -60,7 +60,7 @@ | |||
60 | li t0, LSU_DEFEATURE | 60 | li t0, LSU_DEFEATURE |
61 | mfcr t1, t0 | 61 | mfcr t1, t0 |
62 | 62 | ||
63 | lui t2, 0xc080 /* SUE, Enable Unaligned Access, L2HPE */ | 63 | lui t2, 0x4080 /* Enable Unaligned Access, L2HPE */ |
64 | or t1, t1, t2 | 64 | or t1, t1, t2 |
65 | mtcr t1, t0 | 65 | mtcr t1, t0 |
66 | 66 | ||
@@ -235,6 +235,26 @@ EXPORT(nlm_boot_siblings) | |||
235 | mfc0 v0, CP0_EBASE, 1 | 235 | mfc0 v0, CP0_EBASE, 1 |
236 | andi v0, 0x3ff /* v0 <- node/core */ | 236 | andi v0, 0x3ff /* v0 <- node/core */ |
237 | 237 | ||
238 | /* | ||
239 | * Errata: to avoid potential live lock, setup IFU_BRUB_RESERVE | ||
240 | * when running 4 threads per core | ||
241 | */ | ||
242 | andi v1, v0, 0x3 /* v1 <- thread id */ | ||
243 | bnez v1, 2f | ||
244 | nop | ||
245 | |||
246 | /* thread 0 of each core. */ | ||
247 | li t0, CKSEG1ADDR(RESET_DATA_PHYS) | ||
248 | lw t1, BOOT_THREAD_MODE(t0) /* t1 <- thread mode */ | ||
249 | subu t1, 0x3 /* 4-thread per core mode? */ | ||
250 | bnez t1, 2f | ||
251 | nop | ||
252 | |||
253 | li t0, IFU_BRUB_RESERVE | ||
254 | li t1, 0x55 | ||
255 | mtcr t1, t0 | ||
256 | _ehb | ||
257 | 2: | ||
238 | beqz v0, 4f /* boot cpu (cpuid == 0)? */ | 258 | beqz v0, 4f /* boot cpu (cpuid == 0)? */ |
239 | nop | 259 | nop |
240 | 260 | ||
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c index e743bdd6e20c..dc3e327fbbac 100644 --- a/arch/mips/netlogic/common/smp.c +++ b/arch/mips/netlogic/common/smp.c | |||
@@ -59,17 +59,17 @@ | |||
59 | 59 | ||
60 | void nlm_send_ipi_single(int logical_cpu, unsigned int action) | 60 | void nlm_send_ipi_single(int logical_cpu, unsigned int action) |
61 | { | 61 | { |
62 | int cpu, node; | 62 | unsigned int hwtid; |
63 | uint64_t picbase; | 63 | uint64_t picbase; |
64 | 64 | ||
65 | cpu = cpu_logical_map(logical_cpu); | 65 | /* node id is part of hwtid, and needed for send_ipi */ |
66 | node = nlm_cpuid_to_node(cpu); | 66 | hwtid = cpu_logical_map(logical_cpu); |
67 | picbase = nlm_get_node(node)->picbase; | 67 | picbase = nlm_get_node(nlm_hwtid_to_node(hwtid))->picbase; |
68 | 68 | ||
69 | if (action & SMP_CALL_FUNCTION) | 69 | if (action & SMP_CALL_FUNCTION) |
70 | nlm_pic_send_ipi(picbase, cpu, IRQ_IPI_SMP_FUNCTION, 0); | 70 | nlm_pic_send_ipi(picbase, hwtid, IRQ_IPI_SMP_FUNCTION, 0); |
71 | if (action & SMP_RESCHEDULE_YOURSELF) | 71 | if (action & SMP_RESCHEDULE_YOURSELF) |
72 | nlm_pic_send_ipi(picbase, cpu, IRQ_IPI_SMP_RESCHEDULE, 0); | 72 | nlm_pic_send_ipi(picbase, hwtid, IRQ_IPI_SMP_RESCHEDULE, 0); |
73 | } | 73 | } |
74 | 74 | ||
75 | void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action) | 75 | void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action) |
@@ -120,6 +120,7 @@ static void nlm_init_secondary(void) | |||
120 | 120 | ||
121 | hwtid = hard_smp_processor_id(); | 121 | hwtid = hard_smp_processor_id(); |
122 | current_cpu_data.core = hwtid / NLM_THREADS_PER_CORE; | 122 | current_cpu_data.core = hwtid / NLM_THREADS_PER_CORE; |
123 | current_cpu_data.package = nlm_nodeid(); | ||
123 | nlm_percpu_init(hwtid); | 124 | nlm_percpu_init(hwtid); |
124 | nlm_smp_irq_init(hwtid); | 125 | nlm_smp_irq_init(hwtid); |
125 | } | 126 | } |
@@ -145,16 +146,18 @@ static cpumask_t phys_cpu_present_mask; | |||
145 | 146 | ||
146 | void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) | 147 | void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) |
147 | { | 148 | { |
148 | int cpu, node; | 149 | uint64_t picbase; |
150 | int hwtid; | ||
151 | |||
152 | hwtid = cpu_logical_map(logical_cpu); | ||
153 | picbase = nlm_get_node(nlm_hwtid_to_node(hwtid))->picbase; | ||
149 | 154 | ||
150 | cpu = cpu_logical_map(logical_cpu); | ||
151 | node = nlm_cpuid_to_node(logical_cpu); | ||
152 | nlm_next_sp = (unsigned long)__KSTK_TOS(idle); | 155 | nlm_next_sp = (unsigned long)__KSTK_TOS(idle); |
153 | nlm_next_gp = (unsigned long)task_thread_info(idle); | 156 | nlm_next_gp = (unsigned long)task_thread_info(idle); |
154 | 157 | ||
155 | /* barrier for sp/gp store above */ | 158 | /* barrier for sp/gp store above */ |
156 | __sync(); | 159 | __sync(); |
157 | nlm_pic_send_ipi(nlm_get_node(node)->picbase, cpu, 1, 1); /* NMI */ | 160 | nlm_pic_send_ipi(picbase, hwtid, 1, 1); /* NMI */ |
158 | } | 161 | } |
159 | 162 | ||
160 | void __init nlm_smp_setup(void) | 163 | void __init nlm_smp_setup(void) |
@@ -182,7 +185,7 @@ void __init nlm_smp_setup(void) | |||
182 | __cpu_number_map[i] = num_cpus; | 185 | __cpu_number_map[i] = num_cpus; |
183 | __cpu_logical_map[num_cpus] = i; | 186 | __cpu_logical_map[num_cpus] = i; |
184 | set_cpu_possible(num_cpus, true); | 187 | set_cpu_possible(num_cpus, true); |
185 | node = nlm_cpuid_to_node(i); | 188 | node = nlm_hwtid_to_node(i); |
186 | cpumask_set_cpu(num_cpus, &nlm_get_node(node)->cpumask); | 189 | cpumask_set_cpu(num_cpus, &nlm_get_node(node)->cpumask); |
187 | ++num_cpus; | 190 | ++num_cpus; |
188 | } | 191 | } |
diff --git a/arch/mips/netlogic/common/time.c b/arch/mips/netlogic/common/time.c index 0c0a1a606f73..5873c83e65be 100644 --- a/arch/mips/netlogic/common/time.c +++ b/arch/mips/netlogic/common/time.c | |||
@@ -40,7 +40,6 @@ | |||
40 | #include <asm/netlogic/interrupt.h> | 40 | #include <asm/netlogic/interrupt.h> |
41 | #include <asm/netlogic/common.h> | 41 | #include <asm/netlogic/common.h> |
42 | #include <asm/netlogic/haldefs.h> | 42 | #include <asm/netlogic/haldefs.h> |
43 | #include <asm/netlogic/common.h> | ||
44 | 43 | ||
45 | #if defined(CONFIG_CPU_XLP) | 44 | #if defined(CONFIG_CPU_XLP) |
46 | #include <asm/netlogic/xlp-hal/iomap.h> | 45 | #include <asm/netlogic/xlp-hal/iomap.h> |