diff options
author | Nicolas Pitre <nicolas.pitre@linaro.org> | 2012-07-05 21:33:26 -0400 |
---|---|---|
committer | Nicolas Pitre <nicolas.pitre@linaro.org> | 2013-07-30 09:02:16 -0400 |
commit | ed96762e3241f57aa812977cf1920d3ee0363f4d (patch) | |
tree | 18849feb3008c15c4affc370119821a4b1c72458 /arch/arm/common/bL_switcher.c | |
parent | 9797a0e95ead7bfe52260c369ee9fe6ba445afaf (diff) |
ARM: bL_switcher: do not hardcode GIC IDs in the code
Currently, GIC IDs are hardcoded making the code dependent on the 4+4 b.L
configuration. Let's allow for GIC IDs to be discovered upon switcher
initialization to support other b.L configurations such as the 1+1 one,
or 2+3 as on the VExpress TC2.
Signed-off-by: Nicolas Pitre <nico@linaro.org>
Diffstat (limited to 'arch/arm/common/bL_switcher.c')
-rw-r--r-- | arch/arm/common/bL_switcher.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/arch/arm/common/bL_switcher.c b/arch/arm/common/bL_switcher.c index 50e95d894e35..1c2e5bcfb1f7 100644 --- a/arch/arm/common/bL_switcher.c +++ b/arch/arm/common/bL_switcher.c | |||
@@ -110,6 +110,8 @@ static int bL_switchpoint(unsigned long _arg) | |||
110 | * Generic switcher interface | 110 | * Generic switcher interface |
111 | */ | 111 | */ |
112 | 112 | ||
113 | static unsigned int bL_gic_id[MAX_CPUS_PER_CLUSTER][MAX_NR_CLUSTERS]; | ||
114 | |||
113 | /* | 115 | /* |
114 | * bL_switch_to - Switch to a specific cluster for the current CPU | 116 | * bL_switch_to - Switch to a specific cluster for the current CPU |
115 | * @new_cluster_id: the ID of the cluster to switch to. | 117 | * @new_cluster_id: the ID of the cluster to switch to. |
@@ -159,7 +161,7 @@ static int bL_switch_to(unsigned int new_cluster_id) | |||
159 | this_cpu = smp_processor_id(); | 161 | this_cpu = smp_processor_id(); |
160 | 162 | ||
161 | /* redirect GIC's SGIs to our counterpart */ | 163 | /* redirect GIC's SGIs to our counterpart */ |
162 | gic_migrate_target(cpuid + ib_cluster*4); | 164 | gic_migrate_target(bL_gic_id[cpuid][ib_cluster]); |
163 | 165 | ||
164 | /* | 166 | /* |
165 | * Raise a SGI on the inbound CPU to make sure it doesn't stall | 167 | * Raise a SGI on the inbound CPU to make sure it doesn't stall |
@@ -332,6 +334,16 @@ static int __init bL_switcher_halve_cpus(void) | |||
332 | cluster = (cpu_logical_map(i) >> 8) & 0xff; | 334 | cluster = (cpu_logical_map(i) >> 8) & 0xff; |
333 | 335 | ||
334 | if (cpumask_test_cpu(cpu, &common_mask)) { | 336 | if (cpumask_test_cpu(cpu, &common_mask)) { |
337 | /* Let's take note of the GIC ID for this CPU */ | ||
338 | int gic_id = gic_get_cpu_id(i); | ||
339 | if (gic_id < 0) { | ||
340 | pr_err("%s: bad GIC ID for CPU %d\n", __func__, i); | ||
341 | return -EINVAL; | ||
342 | } | ||
343 | bL_gic_id[cpu][cluster] = gic_id; | ||
344 | pr_info("GIC ID for CPU %u cluster %u is %u\n", | ||
345 | cpu, cluster, gic_id); | ||
346 | |||
335 | /* | 347 | /* |
336 | * We keep only those logical CPUs which number | 348 | * We keep only those logical CPUs which number |
337 | * is equal to their physical CPU number. This is | 349 | * is equal to their physical CPU number. This is |