Commit 5d4bd66d authored by Samuel Holland's avatar Samuel Holland
Browse files

allwinner: Clean up CPU ops functions



Convert them to take an mpidr instead of a (cluster, core) pair. This
simplifies all of the call sites, and actually makes the functions a bit
smaller.
Signed-off-by: default avatarSamuel Holland <samuel@sholland.org>
parent 50811682
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
void sunxi_configure_mmu_el3(int flags); void sunxi_configure_mmu_el3(int flags);
void sunxi_cpu_on(unsigned int cluster, unsigned int core); void sunxi_cpu_on(u_register_t mpidr);
void sunxi_cpu_off(unsigned int cluster, unsigned int core); void sunxi_cpu_off(u_register_t mpidr);
void sunxi_disable_secondary_cpus(unsigned int primary_cpu); void sunxi_disable_secondary_cpus(u_register_t primary_mpidr);
void __dead2 sunxi_power_down(void); void __dead2 sunxi_power_down(void);
int sunxi_pmic_setup(uint16_t socid, const void *fdt); int sunxi_pmic_setup(uint16_t socid, const void *fdt);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <platform_def.h> #include <platform_def.h>
#include <arch.h> #include <arch.h>
#include <arch_helpers.h>
#include <common/debug.h> #include <common/debug.h>
#include <drivers/arm/gicv2.h> #include <drivers/arm/gicv2.h>
#include <drivers/console.h> #include <drivers/console.h>
...@@ -101,7 +102,7 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, ...@@ -101,7 +102,7 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE); SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
/* Turn off all secondary CPUs */ /* Turn off all secondary CPUs */
sunxi_disable_secondary_cpus(plat_my_core_pos()); sunxi_disable_secondary_cpus(read_mpidr());
} }
void bl31_plat_arch_setup(void) void bl31_plat_arch_setup(void)
......
/* /*
* Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -45,9 +45,10 @@ static void sunxi_cpu_enable_power(unsigned int cluster, unsigned int core) ...@@ -45,9 +45,10 @@ static void sunxi_cpu_enable_power(unsigned int cluster, unsigned int core)
mmio_write_32(SUNXI_CPU_POWER_CLAMP_REG(cluster, core), 0x00); mmio_write_32(SUNXI_CPU_POWER_CLAMP_REG(cluster, core), 0x00);
} }
void sunxi_cpu_off(unsigned int cluster, unsigned int core) void sunxi_cpu_off(u_register_t mpidr)
{ {
int corenr = cluster * PLATFORM_MAX_CPUS_PER_CLUSTER + core; unsigned int cluster = MPIDR_AFFLVL1_VAL(mpidr);
unsigned int core = MPIDR_AFFLVL0_VAL(mpidr);
VERBOSE("PSCI: Powering off cluster %d core %d\n", cluster, core); VERBOSE("PSCI: Powering off cluster %d core %d\n", cluster, core);
...@@ -55,9 +56,9 @@ void sunxi_cpu_off(unsigned int cluster, unsigned int core) ...@@ -55,9 +56,9 @@ void sunxi_cpu_off(unsigned int cluster, unsigned int core)
mmio_clrbits_32(SUNXI_CPUCFG_DBG_REG0, BIT(core)); mmio_clrbits_32(SUNXI_CPUCFG_DBG_REG0, BIT(core));
/* We can't turn ourself off like this, but it works for other cores. */ /* We can't turn ourself off like this, but it works for other cores. */
if (plat_my_core_pos() != corenr) { if (read_mpidr() != mpidr) {
/* Activate the core output clamps, but not for core 0. */ /* Activate the core output clamps, but not for core 0. */
if (corenr != 0) if (core != 0)
mmio_setbits_32(SUNXI_POWEROFF_GATING_REG(cluster), mmio_setbits_32(SUNXI_POWEROFF_GATING_REG(cluster),
BIT(core)); BIT(core));
/* Assert CPU power-on reset */ /* Assert CPU power-on reset */
...@@ -80,8 +81,11 @@ void sunxi_cpu_off(unsigned int cluster, unsigned int core) ...@@ -80,8 +81,11 @@ void sunxi_cpu_off(unsigned int cluster, unsigned int core)
0, BIT_32(core)); 0, BIT_32(core));
} }
void sunxi_cpu_on(unsigned int cluster, unsigned int core) void sunxi_cpu_on(u_register_t mpidr)
{ {
unsigned int cluster = MPIDR_AFFLVL1_VAL(mpidr);
unsigned int core = MPIDR_AFFLVL0_VAL(mpidr);
VERBOSE("PSCI: Powering on cluster %d core %d\n", cluster, core); VERBOSE("PSCI: Powering on cluster %d core %d\n", cluster, core);
/* Assert CPU core reset */ /* Assert CPU core reset */
...@@ -102,12 +106,18 @@ void sunxi_cpu_on(unsigned int cluster, unsigned int core) ...@@ -102,12 +106,18 @@ void sunxi_cpu_on(unsigned int cluster, unsigned int core)
mmio_setbits_32(SUNXI_CPUCFG_DBG_REG0, BIT(core)); mmio_setbits_32(SUNXI_CPUCFG_DBG_REG0, BIT(core));
} }
void sunxi_disable_secondary_cpus(unsigned int primary_cpu) void sunxi_disable_secondary_cpus(u_register_t primary_mpidr)
{ {
for (unsigned int cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu += 1) { unsigned int cluster;
if (cpu == primary_cpu) unsigned int core;
continue;
sunxi_cpu_off(cpu / PLATFORM_MAX_CPUS_PER_CLUSTER, for (cluster = 0; cluster < PLATFORM_CLUSTER_COUNT; ++cluster) {
cpu % PLATFORM_MAX_CPUS_PER_CLUSTER); for (core = 0; core < PLATFORM_MAX_CPUS_PER_CLUSTER; ++core) {
u_register_t mpidr = (cluster << MPIDR_AFF1_SHIFT) |
(core << MPIDR_AFF0_SHIFT) |
BIT(31);
if (mpidr != primary_mpidr)
sunxi_cpu_off(mpidr);
}
} }
} }
...@@ -35,7 +35,7 @@ static int sunxi_pwr_domain_on(u_register_t mpidr) ...@@ -35,7 +35,7 @@ static int sunxi_pwr_domain_on(u_register_t mpidr)
if (mpidr_is_valid(mpidr) == 0) if (mpidr_is_valid(mpidr) == 0)
return PSCI_E_INTERN_FAIL; return PSCI_E_INTERN_FAIL;
sunxi_cpu_on(MPIDR_AFFLVL1_VAL(mpidr), MPIDR_AFFLVL0_VAL(mpidr)); sunxi_cpu_on(mpidr);
return PSCI_E_SUCCESS; return PSCI_E_SUCCESS;
} }
...@@ -47,9 +47,7 @@ static void sunxi_pwr_domain_off(const psci_power_state_t *target_state) ...@@ -47,9 +47,7 @@ static void sunxi_pwr_domain_off(const psci_power_state_t *target_state)
static void __dead2 sunxi_pwr_down_wfi(const psci_power_state_t *target_state) static void __dead2 sunxi_pwr_down_wfi(const psci_power_state_t *target_state)
{ {
u_register_t mpidr = read_mpidr(); sunxi_cpu_off(read_mpidr());
sunxi_cpu_off(MPIDR_AFFLVL1_VAL(mpidr), MPIDR_AFFLVL0_VAL(mpidr));
while (1) while (1)
wfi(); wfi();
...@@ -64,7 +62,7 @@ static void sunxi_pwr_domain_on_finish(const psci_power_state_t *target_state) ...@@ -64,7 +62,7 @@ static void sunxi_pwr_domain_on_finish(const psci_power_state_t *target_state)
static void __dead2 sunxi_system_off(void) static void __dead2 sunxi_system_off(void)
{ {
/* Turn off all secondary CPUs */ /* Turn off all secondary CPUs */
sunxi_disable_secondary_cpus(plat_my_core_pos()); sunxi_disable_secondary_cpus(read_mpidr());
sunxi_power_down(); sunxi_power_down();
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment