From 08916e4fe06451080a8882d6955df9e5947e352e Mon Sep 17 00:00:00 2001 From: James Deng Date: Sat, 7 Sep 2024 21:08:45 +0800 Subject: Update for v1.0.15 --- .../spacemit/plat/k1x/underly_implement.c | 20 ++++++++++++++ lib/utils/psci/spacemit/plat/plat_pm.c | 27 +++++++++++-------- .../psci/spacemit/plat/underly_implement.h | 1 + 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/lib/utils/psci/spacemit/plat/k1x/underly_implement.c b/lib/utils/psci/spacemit/plat/k1x/underly_implement.c index f87bacc7297d..825db86dddfe 100644 --- a/lib/utils/psci/spacemit/plat/k1x/underly_implement.c +++ b/lib/utils/psci/spacemit/plat/k1x/underly_implement.c @@ -319,6 +319,26 @@ int spacemit_core_enter_c2(u_register_t mpidr) return 0; } +int spacemit_cluster_enter_m2(u_register_t mpidr) +{ + unsigned int value; + + /* wait the cpu enter M2 */ + value = readl((unsigned int *)0xd4282890); + + if (mpidr == 0 || mpidr == 1 || mpidr == 2 || mpidr == 3) { + if (value & (1 << 3)) + return 1; + } else if (mpidr == 4 || mpidr == 5 || mpidr == 6 || mpidr == 7) { + if (value & (1 << 19)) + return 1; + } else { + return 0; + } + + return 0; +} + void spacemit_wait_core_enter_c2(u_register_t mpidr) { unsigned int value; diff --git a/lib/utils/psci/spacemit/plat/plat_pm.c b/lib/utils/psci/spacemit/plat/plat_pm.c index 32aec9d308ab..e3f494065f23 100644 --- a/lib/utils/psci/spacemit/plat/plat_pm.c +++ b/lib/utils/psci/spacemit/plat/plat_pm.c @@ -228,7 +228,7 @@ static int spacemit_validate_power_state(unsigned int power_state, static void spacemit_pwr_domain_suspend(const psci_power_state_t *target_state) { unsigned int hartid = current_hartid(); - + /* * CSS currently supports retention only at cpu level. Just return * as nothing is to be done for retention. @@ -250,22 +250,27 @@ static void spacemit_pwr_domain_suspend(const psci_power_state_t *target_state) /* disable the tcm */ csr_write(CSR_TCMCFG, 0); #endif - wake_idle_harts(NULL, hartid); + if (!spacemit_cluster_enter_m2(PLATFORM_MAX_CPUS_PER_CLUSTER)) { + wake_idle_harts(NULL, hartid); - /* D1P & D2 */ - csi_flush_l2_cache_hart(0, 0); - csi_flush_l2_cache_hart(0, PLATFORM_MAX_CPUS_PER_CLUSTER); + csi_flush_l2_cache_hart(0, 0); + csi_flush_l2_cache_hart(0, PLATFORM_MAX_CPUS_PER_CLUSTER); - cci_disable_snoop_dvm_reqs(0); - cci_disable_snoop_dvm_reqs(1); + cci_disable_snoop_dvm_reqs(0); + cci_disable_snoop_dvm_reqs(1); - /* assert othter cpu & wait other cpu enter c2 */ - for (u32 i = 0; i < PLATFORM_MAX_CPUS_PER_CLUSTER * PLATFORM_CLUSTER_COUNT; i++) { - if (i != hartid) { - spacemit_wait_core_enter_c2(i); + /* assert othter cpu & wait other cpu enter c2 */ + for (u32 i = 0; i < PLATFORM_MAX_CPUS_PER_CLUSTER * PLATFORM_CLUSTER_COUNT; i++) { + if (i != hartid) { + spacemit_wait_core_enter_c2(i); + } } + } else { + csi_flush_l2_cache_hart(0, 0); + cci_disable_snoop_dvm_reqs(0); } + spacemit_assert_cpu(hartid); spacemit_top_off(hartid); diff --git a/lib/utils/psci/spacemit/plat/underly_implement.h b/lib/utils/psci/spacemit/plat/underly_implement.h index 7c11db518a3f..80f1377d1116 100644 --- a/lib/utils/psci/spacemit/plat/underly_implement.h +++ b/lib/utils/psci/spacemit/plat/underly_implement.h @@ -10,6 +10,7 @@ void spacemit_cluster_off(u_register_t mpidr); void spacemit_wakeup_cpu(u_register_t mpidr); void spacemit_assert_cpu(u_register_t mpidr); int spacemit_core_enter_c2(u_register_t mpidr); +int spacemit_cluster_enter_m2(u_register_t mpidr); void spacemit_wait_core_enter_c2(u_register_t mpidr); void spacemit_deassert_cpu(void); -- 2.35.3