mirror of
https://gitee.com/bianbu-linux/opensbi
synced 2025-04-23 14:27:08 -04:00
Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
|
08916e4fe0 | ||
|
6cf0c8e6ed | ||
|
a26e37daae |
3 changed files with 37 additions and 11 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue