aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJayachandran C <jchandra@broadcom.com>2015-01-07 06:28:30 -0500
committerRalf Baechle <ralf@linux-mips.org>2015-04-01 11:21:50 -0400
commitc2736525465a5d6fe1456da8cc2bc701f9128682 (patch)
tree702e2d39bc32f37a7d953243f876e19c89ffae13 /arch
parent65fecc2725e5c8d5ef988d971b798b28b94e1865 (diff)
MIPS: Netlogic: Move cores per node out of multi-node.h
Use the current_cpu_data package field to get the node of the current CPU. This allows us to remove xlp_cores_per_node and move nlm_threads_per_node() and nlm_cores_per_node() to netlogic/common.h, which simplifies code. Signed-off-by: Jayachandran C <jchandra@broadcom.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/8889/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/mips/include/asm/mach-netlogic/multi-node.h9
-rw-r--r--arch/mips/include/asm/netlogic/common.h21
-rw-r--r--arch/mips/netlogic/common/irq.c10
-rw-r--r--arch/mips/netlogic/common/smp.c26
-rw-r--r--arch/mips/netlogic/xlp/setup.c5
-rw-r--r--arch/mips/netlogic/xlp/wakeup.c8
6 files changed, 43 insertions, 36 deletions
diff --git a/arch/mips/include/asm/mach-netlogic/multi-node.h b/arch/mips/include/asm/mach-netlogic/multi-node.h
index 9ed8dacdc37c..8bdf47e29145 100644
--- a/arch/mips/include/asm/mach-netlogic/multi-node.h
+++ b/arch/mips/include/asm/mach-netlogic/multi-node.h
@@ -48,15 +48,6 @@
48#endif 48#endif
49 49
50#define NLM_THREADS_PER_CORE 4 50#define NLM_THREADS_PER_CORE 4
51#ifdef CONFIG_CPU_XLR
52#define nlm_cores_per_node() 8
53#else
54extern unsigned int xlp_cores_per_node;
55#define nlm_cores_per_node() xlp_cores_per_node
56#endif
57
58#define nlm_threads_per_node() (nlm_cores_per_node() * NLM_THREADS_PER_CORE)
59#define nlm_cpuid_to_node(c) ((c) / nlm_threads_per_node())
60 51
61struct nlm_soc_info { 52struct nlm_soc_info {
62 unsigned long coremask; /* cores enabled on the soc */ 53 unsigned long coremask; /* cores enabled on the soc */
diff --git a/arch/mips/include/asm/netlogic/common.h b/arch/mips/include/asm/netlogic/common.h
index c281f03eb312..2a4c128277e4 100644
--- a/arch/mips/include/asm/netlogic/common.h
+++ b/arch/mips/include/asm/netlogic/common.h
@@ -111,6 +111,25 @@ static inline int nlm_irq_to_xirq(int node, int irq)
111 return node * NR_IRQS / NLM_NR_NODES + irq; 111 return node * NR_IRQS / NLM_NR_NODES + irq;
112} 112}
113 113
114extern int nlm_cpu_ready[]; 114#ifdef CONFIG_CPU_XLR
115#define nlm_cores_per_node() 8
116#else
117static inline int nlm_cores_per_node(void)
118{
119 return ((read_c0_prid() & PRID_IMP_MASK)
120 == PRID_IMP_NETLOGIC_XLP9XX) ? 32 : 8;
121}
115#endif 122#endif
123static inline int nlm_threads_per_node(void)
124{
125 return nlm_cores_per_node() * NLM_THREADS_PER_CORE;
126}
127
128static inline int nlm_hwtid_to_node(int hwtid)
129{
130 return hwtid / nlm_threads_per_node();
131}
132
133extern int nlm_cpu_ready[];
134#endif /* __ASSEMBLY__ */
116#endif /* _NETLOGIC_COMMON_H_ */ 135#endif /* _NETLOGIC_COMMON_H_ */
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
233void nlm_smp_irq_init(int hwcpuid) 233void 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
245asmlinkage void plat_irq_dispatch(void) 245asmlinkage void plat_irq_dispatch(void)
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c
index 32f15aba745a..dc3e327fbbac 100644
--- a/arch/mips/netlogic/common/smp.c
+++ b/arch/mips/netlogic/common/smp.c
@@ -59,17 +59,17 @@
59 59
60void nlm_send_ipi_single(int logical_cpu, unsigned int action) 60void 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
75void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action) 75void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action)
@@ -120,7 +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_cpuid_to_node(hwtid); 123 current_cpu_data.package = nlm_nodeid();
124 nlm_percpu_init(hwtid); 124 nlm_percpu_init(hwtid);
125 nlm_smp_irq_init(hwtid); 125 nlm_smp_irq_init(hwtid);
126} 126}
@@ -146,16 +146,18 @@ static cpumask_t phys_cpu_present_mask;
146 146
147void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) 147void nlm_boot_secondary(int logical_cpu, struct task_struct *idle)
148{ 148{
149 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;
150 154
151 cpu = cpu_logical_map(logical_cpu);
152 node = nlm_cpuid_to_node(logical_cpu);
153 nlm_next_sp = (unsigned long)__KSTK_TOS(idle); 155 nlm_next_sp = (unsigned long)__KSTK_TOS(idle);
154 nlm_next_gp = (unsigned long)task_thread_info(idle); 156 nlm_next_gp = (unsigned long)task_thread_info(idle);
155 157
156 /* barrier for sp/gp store above */ 158 /* barrier for sp/gp store above */
157 __sync(); 159 __sync();
158 nlm_pic_send_ipi(nlm_get_node(node)->picbase, cpu, 1, 1); /* NMI */ 160 nlm_pic_send_ipi(picbase, hwtid, 1, 1); /* NMI */
159} 161}
160 162
161void __init nlm_smp_setup(void) 163void __init nlm_smp_setup(void)
@@ -183,7 +185,7 @@ void __init nlm_smp_setup(void)
183 __cpu_number_map[i] = num_cpus; 185 __cpu_number_map[i] = num_cpus;
184 __cpu_logical_map[num_cpus] = i; 186 __cpu_logical_map[num_cpus] = i;
185 set_cpu_possible(num_cpus, true); 187 set_cpu_possible(num_cpus, true);
186 node = nlm_cpuid_to_node(i); 188 node = nlm_hwtid_to_node(i);
187 cpumask_set_cpu(num_cpus, &nlm_get_node(node)->cpumask); 189 cpumask_set_cpu(num_cpus, &nlm_get_node(node)->cpumask);
188 ++num_cpus; 190 ++num_cpus;
189 } 191 }
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c
index 4fdd9fd29d1d..27113a17f18d 100644
--- a/arch/mips/netlogic/xlp/setup.c
+++ b/arch/mips/netlogic/xlp/setup.c
@@ -51,7 +51,6 @@ uint64_t nlm_io_base;
51struct nlm_soc_info nlm_nodes[NLM_NR_NODES]; 51struct nlm_soc_info nlm_nodes[NLM_NR_NODES];
52cpumask_t nlm_cpumask = CPU_MASK_CPU0; 52cpumask_t nlm_cpumask = CPU_MASK_CPU0;
53unsigned int nlm_threads_per_core; 53unsigned int nlm_threads_per_core;
54unsigned int xlp_cores_per_node;
55 54
56static void nlm_linux_exit(void) 55static void nlm_linux_exit(void)
57{ 56{
@@ -163,10 +162,6 @@ void __init prom_init(void)
163 void *reset_vec; 162 void *reset_vec;
164 163
165 nlm_io_base = CKSEG1ADDR(XLP_DEFAULT_IO_BASE); 164 nlm_io_base = CKSEG1ADDR(XLP_DEFAULT_IO_BASE);
166 if (cpu_is_xlp9xx())
167 xlp_cores_per_node = 32;
168 else
169 xlp_cores_per_node = 8;
170 nlm_init_boot_cpu(); 165 nlm_init_boot_cpu();
171 xlp_mmu_init(); 166 xlp_mmu_init();
172 nlm_node_init(0); 167 nlm_node_init(0);
diff --git a/arch/mips/netlogic/xlp/wakeup.c b/arch/mips/netlogic/xlp/wakeup.c
index 26d82f79ef29..87d7846af2d0 100644
--- a/arch/mips/netlogic/xlp/wakeup.c
+++ b/arch/mips/netlogic/xlp/wakeup.c
@@ -111,7 +111,7 @@ static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask)
111 struct nlm_soc_info *nodep; 111 struct nlm_soc_info *nodep;
112 uint64_t syspcibase, fusebase; 112 uint64_t syspcibase, fusebase;
113 uint32_t syscoremask, mask, fusemask; 113 uint32_t syscoremask, mask, fusemask;
114 int core, n, cpu; 114 int core, n, cpu, ncores;
115 115
116 for (n = 0; n < NLM_NR_NODES; n++) { 116 for (n = 0; n < NLM_NR_NODES; n++) {
117 if (n != 0) { 117 if (n != 0) {
@@ -168,7 +168,8 @@ static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask)
168 syscoremask = (1 << hweight32(~fusemask & mask)) - 1; 168 syscoremask = (1 << hweight32(~fusemask & mask)) - 1;
169 169
170 pr_info("Node %d - SYS/FUSE coremask %x\n", n, syscoremask); 170 pr_info("Node %d - SYS/FUSE coremask %x\n", n, syscoremask);
171 for (core = 0; core < nlm_cores_per_node(); core++) { 171 ncores = nlm_cores_per_node();
172 for (core = 0; core < ncores; core++) {
172 /* we will be on node 0 core 0 */ 173 /* we will be on node 0 core 0 */
173 if (n == 0 && core == 0) 174 if (n == 0 && core == 0)
174 continue; 175 continue;
@@ -178,8 +179,7 @@ static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask)
178 continue; 179 continue;
179 180
180 /* see if at least the first hw thread is enabled */ 181 /* see if at least the first hw thread is enabled */
181 cpu = (n * nlm_cores_per_node() + core) 182 cpu = (n * ncores + core) * NLM_THREADS_PER_CORE;
182 * NLM_THREADS_PER_CORE;
183 if (!cpumask_test_cpu(cpu, wakeup_mask)) 183 if (!cpumask_test_cpu(cpu, wakeup_mask))
184 continue; 184 continue;
185 185