mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 18:14:24 +00:00
Merge changes from topic "fw-caps" into integration
* changes: feat(ti): query firmware for suspend capability feat(ti): add TI-SCI query firmware capabilities command support feat(ti): remove extra core counts in cluster 2 and 3
This commit is contained in:
commit
857c764325
7 changed files with 86 additions and 15 deletions
|
@ -12,8 +12,8 @@
|
|||
/* The ports must be in order and contiguous */
|
||||
#define K3_CLUSTER0_CORE_COUNT U(2)
|
||||
#define K3_CLUSTER1_CORE_COUNT U(2)
|
||||
#define K3_CLUSTER2_CORE_COUNT U(2)
|
||||
#define K3_CLUSTER3_CORE_COUNT U(2)
|
||||
#define K3_CLUSTER2_CORE_COUNT U(0)
|
||||
#define K3_CLUSTER3_CORE_COUNT U(0)
|
||||
|
||||
#define PLAT_PROC_START_ID U(32)
|
||||
#define PLAT_PROC_DEVICE_START_ID U(202)
|
||||
|
|
|
@ -210,6 +210,42 @@ int ti_sci_get_revision(struct ti_sci_msg_resp_version *rev_info)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_sci_query_fw_caps() - Get the FW/SoC capabilities
|
||||
* @handle: Pointer to TI SCI handle
|
||||
* @fw_caps: Each bit in fw_caps indicating one FW/SOC capability
|
||||
*
|
||||
* Return: 0 if all went well, else returns appropriate error value.
|
||||
*/
|
||||
int ti_sci_query_fw_caps(uint64_t *fw_caps)
|
||||
{
|
||||
struct ti_sci_msg_hdr req;
|
||||
struct ti_sci_msg_resp_query_fw_caps resp;
|
||||
|
||||
struct ti_sci_xfer xfer;
|
||||
int ret;
|
||||
|
||||
ret = ti_sci_setup_one_xfer(TI_SCI_MSG_QUERY_FW_CAPS, 0,
|
||||
&req, sizeof(req),
|
||||
&resp, sizeof(resp),
|
||||
&xfer);
|
||||
if (ret != 0U) {
|
||||
ERROR("Message alloc failed (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ti_sci_do_xfer(&xfer);
|
||||
if (ret != 0U) {
|
||||
ERROR("Transfer send failed (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (fw_caps)
|
||||
*fw_caps = resp.fw_caps;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_sci_device_set_state() - Set device state
|
||||
*
|
||||
|
|
|
@ -141,10 +141,13 @@ int ti_sci_clock_get_freq(uint32_t dev_id, uint8_t clk_id, uint64_t *freq);
|
|||
* Core control operations
|
||||
*
|
||||
* - ti_sci_core_reboot() - Command to request system reset
|
||||
* - ti_sci_query_fw_caps() - Get the FW/SoC capabilities
|
||||
* @fw_caps: Each bit in fw_caps indicating one FW/SOC capability
|
||||
*
|
||||
* Return: 0 if all went well, else returns appropriate error value.
|
||||
*/
|
||||
int ti_sci_core_reboot(void);
|
||||
int ti_sci_query_fw_caps(uint64_t *fw_caps);
|
||||
|
||||
/**
|
||||
* Processor control operations
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#define TI_SCI_MSG_WAKE_REASON 0x0003
|
||||
#define TI_SCI_MSG_GOODBYE 0x0004
|
||||
#define TI_SCI_MSG_SYS_RESET 0x0005
|
||||
#define TI_SCI_MSG_QUERY_FW_CAPS 0x0022
|
||||
|
||||
/* Device requests */
|
||||
#define TI_SCI_MSG_SET_DEVICE_STATE 0x0200
|
||||
|
@ -123,6 +124,30 @@ struct ti_sci_msg_req_reboot {
|
|||
uint8_t domain;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ti_sci_msg_resp_query_fw_caps - Response for query firmware caps
|
||||
* @hdr: Generic header
|
||||
* @fw_caps: Each bit in fw_caps indicating one FW/SOC capability
|
||||
* MSG_FLAG_CAPS_GENERIC: Generic capability (LPM not supported)
|
||||
* MSG_FLAG_CAPS_LPM_DEEP_SLEEP: Deep Sleep LPM
|
||||
* MSG_FLAG_CAPS_LPM_MCU_ONLY: MCU only LPM
|
||||
* MSG_FLAG_CAPS_LPM_STANDBY: Standby LPM
|
||||
* MSG_FLAG_CAPS_LPM_PARTIAL_IO: Partial IO in LPM
|
||||
*
|
||||
* Response to a generic message with message type TI_SCI_MSG_QUERY_FW_CAPS
|
||||
* providing currently available SOC/firmware capabilities. SoC that don't
|
||||
* support low power modes return only MSG_FLAG_CAPS_GENERIC capability.
|
||||
*/
|
||||
struct ti_sci_msg_resp_query_fw_caps {
|
||||
struct ti_sci_msg_hdr hdr;
|
||||
#define MSG_FLAG_CAPS_GENERIC TI_SCI_MSG_FLAG(0)
|
||||
#define MSG_FLAG_CAPS_LPM_DEEP_SLEEP TI_SCI_MSG_FLAG(1)
|
||||
#define MSG_FLAG_CAPS_LPM_MCU_ONLY TI_SCI_MSG_FLAG(2)
|
||||
#define MSG_FLAG_CAPS_LPM_STANDBY TI_SCI_MSG_FLAG(3)
|
||||
#define MSG_FLAG_CAPS_LPM_PARTIAL_IO TI_SCI_MSG_FLAG(4)
|
||||
uint64_t fw_caps;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct ti_sci_msg_req_set_device_state - Set the desired state of the device
|
||||
* @hdr: Generic header
|
||||
|
|
|
@ -19,10 +19,8 @@
|
|||
/* The GICv3 driver only needs to be initialized in EL3 */
|
||||
uintptr_t rdistif_base_addrs[PLATFORM_CORE_COUNT];
|
||||
|
||||
#if K3_PM_SYSTEM_SUSPEND
|
||||
static gicv3_redist_ctx_t rdist_ctx[PLATFORM_CORE_COUNT];
|
||||
static gicv3_dist_ctx_t dist_ctx;
|
||||
#endif
|
||||
|
||||
static const interrupt_prop_t k3_interrupt_props[] = {
|
||||
PLAT_ARM_G1S_IRQ_PROPS(INTR_GROUP1S),
|
||||
|
@ -94,7 +92,6 @@ void k3_gic_pcpu_init(void)
|
|||
gicv3_rdistif_init(plat_my_core_pos());
|
||||
}
|
||||
|
||||
#if K3_PM_SYSTEM_SUSPEND
|
||||
void k3_gic_save_context(void)
|
||||
{
|
||||
for (unsigned int i = 0U; i < PLATFORM_CORE_COUNT; i++) {
|
||||
|
@ -110,4 +107,3 @@ void k3_gic_restore_context(void)
|
|||
gicv3_rdistif_init_restore(i, &rdist_ctx[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -234,7 +234,6 @@ static int k3_validate_power_state(unsigned int power_state,
|
|||
return PSCI_E_SUCCESS;
|
||||
}
|
||||
|
||||
#if K3_PM_SYSTEM_SUSPEND
|
||||
static void k3_pwr_domain_suspend(const psci_power_state_t *target_state)
|
||||
{
|
||||
unsigned int core, proc_id;
|
||||
|
@ -266,18 +265,15 @@ static void k3_get_sys_suspend_power_state(psci_power_state_t *req_state)
|
|||
req_state->pwr_domain_state[i] = PLAT_MAX_OFF_STATE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static const plat_psci_ops_t k3_plat_psci_ops = {
|
||||
static plat_psci_ops_t k3_plat_psci_ops = {
|
||||
.cpu_standby = k3_cpu_standby,
|
||||
.pwr_domain_on = k3_pwr_domain_on,
|
||||
.pwr_domain_off = k3_pwr_domain_off,
|
||||
.pwr_domain_on_finish = k3_pwr_domain_on_finish,
|
||||
#if K3_PM_SYSTEM_SUSPEND
|
||||
.pwr_domain_suspend = k3_pwr_domain_suspend,
|
||||
.pwr_domain_suspend_finish = k3_pwr_domain_suspend_finish,
|
||||
.get_sys_suspend_power_state = k3_get_sys_suspend_power_state,
|
||||
#endif
|
||||
.system_off = k3_system_off,
|
||||
.system_reset = k3_system_reset,
|
||||
.validate_power_state = k3_validate_power_state,
|
||||
|
@ -286,8 +282,27 @@ static const plat_psci_ops_t k3_plat_psci_ops = {
|
|||
int plat_setup_psci_ops(uintptr_t sec_entrypoint,
|
||||
const plat_psci_ops_t **psci_ops)
|
||||
{
|
||||
uint64_t fw_caps = 0;
|
||||
int ret;
|
||||
|
||||
k3_sec_entrypoint = sec_entrypoint;
|
||||
|
||||
ret = ti_sci_query_fw_caps(&fw_caps);
|
||||
if (ret) {
|
||||
ERROR("Unable to query firmware capabilities (%d)\n", ret);
|
||||
}
|
||||
|
||||
/* If firmware does not support any known suspend mode */
|
||||
if (!(fw_caps & (MSG_FLAG_CAPS_LPM_DEEP_SLEEP |
|
||||
MSG_FLAG_CAPS_LPM_MCU_ONLY |
|
||||
MSG_FLAG_CAPS_LPM_STANDBY |
|
||||
MSG_FLAG_CAPS_LPM_PARTIAL_IO))) {
|
||||
/* Disable PSCI suspend support */
|
||||
k3_plat_psci_ops.pwr_domain_suspend = NULL;
|
||||
k3_plat_psci_ops.pwr_domain_suspend_finish = NULL;
|
||||
k3_plat_psci_ops.get_sys_suspend_power_state = NULL;
|
||||
}
|
||||
|
||||
*psci_ops = &k3_plat_psci_ops;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -44,10 +44,6 @@ $(eval $(call add_define,K3_USART))
|
|||
K3_USART_BAUD := 115200
|
||||
$(eval $(call add_define,K3_USART_BAUD))
|
||||
|
||||
# Enable system suspend modes
|
||||
K3_PM_SYSTEM_SUSPEND := 0
|
||||
$(eval $(call add_define,K3_PM_SYSTEM_SUSPEND))
|
||||
|
||||
# Libraries
|
||||
include lib/xlat_tables_v2/xlat_tables.mk
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue