Compare commits

..

3 commits

Author SHA1 Message Date
James Deng
08916e4fe0 Update for v1.0.15 2024-09-07 21:08:45 +08:00
James Deng
6cf0c8e6ed Update for v1.0.14 2024-08-31 14:23:34 +08:00
James Deng
a26e37daae Update for v1.0.13 2024-08-16 23:44:13 +08:00
3 changed files with 37 additions and 11 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);