diff options
Diffstat (limited to 'plat')
-rw-r--r-- | plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.c | 33 | ||||
-rw-r--r-- | plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.h | 2 | ||||
-rw-r--r-- | plat/hisilicon/hikey960/hikey960_pm.c | 4 | ||||
-rw-r--r-- | plat/renesas/rcar/include/rcar_version.h | 2 | ||||
-rw-r--r-- | plat/renesas/rcar/plat_pm.c | 10 | ||||
-rw-r--r-- | plat/renesas/rcar/platform.mk | 2 |
6 files changed, 33 insertions, 20 deletions
diff --git a/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.c b/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.c index 659a1c4ad..bcf68650c 100644 --- a/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.c +++ b/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.c @@ -147,13 +147,19 @@ void hisi_clear_cpuidle_flag(unsigned int cluster, unsigned int core) } -int hisi_test_ap_suspend_flag(unsigned int cluster) +int hisi_test_ap_suspend_flag(void) { - unsigned int val; + unsigned int val1; + unsigned int val2; - val = mmio_read_32(CPUIDLE_FLAG_REG(cluster)); - val &= AP_SUSPEND_FLAG; - return !!val; + val1 = mmio_read_32(CPUIDLE_FLAG_REG(0)); + val1 &= AP_SUSPEND_FLAG; + + val2 = mmio_read_32(CPUIDLE_FLAG_REG(1)); + val2 &= AP_SUSPEND_FLAG; + + val1 |= val2; + return (val1 != 0); } void hisi_set_cluster_pwdn_flag(unsigned int cluster, @@ -164,7 +170,8 @@ void hisi_set_cluster_pwdn_flag(unsigned int cluster, hisi_cpuhotplug_lock(cluster, core); val = mmio_read_32(REG_SCBAKDATA3_OFFSET); - val = (value << (cluster << 1)) | (val & 0xFFFFFFF); + val &= ~(0x3U << ((2 * cluster) + 28)); + val |= (value << (2 * cluster)); mmio_write_32(REG_SCBAKDATA3_OFFSET, val); hisi_cpuhotplug_unlock(cluster, core); @@ -258,6 +265,17 @@ static unsigned int hisi_get_pdc_stat(unsigned int cluster) return val; } +static int check_hotplug(unsigned int cluster, unsigned int boot_flag) +{ + unsigned int mask = 0xF; + + if (hisi_test_ap_suspend_flag() || + ((boot_flag & mask) == mask)) + return 0; + + return 1; +} + int hisi_test_pwrdn_allcores(unsigned int cluster, unsigned int core) { unsigned int mask = 0xf << (core * 4); @@ -268,7 +286,8 @@ int hisi_test_pwrdn_allcores(unsigned int cluster, unsigned int core) mask = (PDC_COREPWRSTAT_MASK & (~mask)); pdc_stat &= mask; - if ((boot_flag ^ cpuidle_flag) || pdc_stat) + if ((boot_flag ^ cpuidle_flag) || pdc_stat || + check_hotplug(cluster, boot_flag)) return 0; else return 1; diff --git a/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.h b/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.h index c0170ad96..e0cb3815f 100644 --- a/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.h +++ b/plat/hisilicon/hikey960/drivers/pwrc/hisi_pwrc.h @@ -39,7 +39,7 @@ void hisi_clear_cpu_boot_flag(unsigned int cluster, unsigned int core); int cluster_is_powered_on(unsigned int cluster); void hisi_enter_core_idle(unsigned int cluster, unsigned int core); void hisi_enter_cluster_idle(unsigned int cluster, unsigned int core); -int hisi_test_ap_suspend_flag(unsigned int cluster); +int hisi_test_ap_suspend_flag(void); void hisi_enter_ap_suspend(unsigned int cluster, unsigned int core); diff --git a/plat/hisilicon/hikey960/hikey960_pm.c b/plat/hisilicon/hikey960/hikey960_pm.c index 676cfa3f3..ede893ecb 100644 --- a/plat/hisilicon/hikey960/hikey960_pm.c +++ b/plat/hisilicon/hikey960/hikey960_pm.c @@ -228,7 +228,7 @@ static void hikey960_pwr_domain_suspend(const psci_power_state_t *target_state) /* check the SR flag bit to determine * CLUSTER_IDLE_IPC or AP_SR_IPC to send */ - if (hisi_test_ap_suspend_flag(cluster)) + if (hisi_test_ap_suspend_flag()) hisi_enter_ap_suspend(cluster, core); else hisi_enter_cluster_idle(cluster, core); @@ -268,7 +268,7 @@ hikey960_pwr_domain_suspend_finish(const psci_power_state_t *target_state) hisi_clear_cpuidle_flag(cluster, core); hisi_cpuidle_unlock(cluster, core); - if (hisi_test_ap_suspend_flag(cluster)) { + if (hisi_test_ap_suspend_flag()) { hikey960_sr_dma_reinit(); gicv2_cpuif_enable(); console_pl011_register(uart_base, PL011_UART_CLK_IN_HZ, diff --git a/plat/renesas/rcar/include/rcar_version.h b/plat/renesas/rcar/include/rcar_version.h index e43632407..ff56f9277 100644 --- a/plat/renesas/rcar/include/rcar_version.h +++ b/plat/renesas/rcar/include/rcar_version.h @@ -9,7 +9,7 @@ #include <arch_helpers.h> -#define VERSION_OF_RENESAS "2.0.1" +#define VERSION_OF_RENESAS "2.0.3" #define VERSION_OF_RENESAS_MAXLEN (128) extern const uint8_t version_of_renesas[VERSION_OF_RENESAS_MAXLEN]; diff --git a/plat/renesas/rcar/plat_pm.c b/plat/renesas/rcar/plat_pm.c index f41c172a9..e678da5dc 100644 --- a/plat/renesas/rcar/plat_pm.c +++ b/plat/renesas/rcar/plat_pm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -35,8 +35,6 @@ #define CLUSTER_PWR_STATE(s) ((s)->pwr_domain_state[MPIDR_AFFLVL1]) #define CORE_PWR_STATE(s) ((s)->pwr_domain_state[MPIDR_AFFLVL0]) -uint64_t rcar_stack_generic_timer[5] __attribute__ ((section("data"))); - extern void rcar_pwrc_restore_generic_timer(uint64_t *stack); extern void plat_rcar_gic_driver_init(void); extern void plat_rcar_gic_init(void); @@ -150,11 +148,7 @@ static void rcar_pwr_domain_suspend_finish(const psci_power_state_t if (cluster_type == RCAR_CLUSTER_A53A57) plat_cci_init(); - rcar_pwrc_restore_generic_timer(rcar_stack_generic_timer); - - /* start generic timer */ - write_cntfrq_el0(plat_get_syscnt_freq2()); - mmio_write_32(RCAR_CNTC_BASE + CNTCR_OFF, CNTCR_FCREQ(U(0)) | CNTCR_EN); + rcar_pwrc_restore_timer_state(); rcar_pwrc_setup(); rcar_pwrc_code_copy_to_system_ram(); diff --git a/plat/renesas/rcar/platform.mk b/plat/renesas/rcar/platform.mk index ca5623d68..85cbe0701 100644 --- a/plat/renesas/rcar/platform.mk +++ b/plat/renesas/rcar/platform.mk @@ -265,7 +265,7 @@ $(eval $(call add_define,RCAR_REF_INT)) # Process RCAR_REWT_TRAINING flag ifndef RCAR_REWT_TRAINING -RCAR_REWT_TRAINING := 0 +RCAR_REWT_TRAINING := 1 endif $(eval $(call add_define,RCAR_REWT_TRAINING)) |