diff --git a/plat/juno/scpi.c b/plat/juno/scpi.c index 44498e5..6b7d9a7 100644 --- a/plat/juno/scpi.c +++ b/plat/juno/scpi.c @@ -112,3 +112,14 @@ return response == SCP_OK ? 0 : -1; } + +void scpi_set_css_power_state(unsigned mpidr, scpi_power_state cpu_state, + scpi_power_state cluster_state, scpi_power_state css_state) +{ + uint32_t state = mpidr & 0x0f; /* CPU ID */ + state |= (mpidr & 0xf00) >> 4; /* Cluster ID */ + state |= cpu_state << 8; + state |= cluster_state << 12; + state |= css_state << 16; + scpi_secure_send32(SCPI_CMD_SET_CSS_POWER_STATE, state); +} diff --git a/plat/juno/scpi.h b/plat/juno/scpi.h index 63c6c4a..9d77a92 100644 --- a/plat/juno/scpi.h +++ b/plat/juno/scpi.h @@ -58,8 +58,17 @@ typedef enum { SCPI_CMD_SCP_READY = 0x01, + SCPI_CMD_SET_CSS_POWER_STATE = 0x04, } spci_command; +typedef enum { + scpi_power_on = 0, + scpi_power_retention = 1, + scpi_power_off = 3, +} scpi_power_state; + extern int scpi_wait_ready(void); +extern void scpi_set_css_power_state(unsigned mpidr, scpi_power_state cpu_state, + scpi_power_state cluster_state, scpi_power_state css_state); #endif /* __SCPI_H__ */