diff options
author | Madhukar Pappireddy <madhukar.pappireddy@arm.com> | 2023-11-01 21:26:33 +0100 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2023-11-01 21:26:33 +0100 |
commit | 857c7643253d01e3e7ff8078a7812e2ed561ff67 (patch) | |
tree | df6b24ccc9865d7f095733edf2770ab622ed5f2a | |
parent | 899bcc84581062bf583527d6a2652efc99f2b12e (diff) | |
parent | ce1008fef1ace613bc36886fd1627164edfef245 (diff) |
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
-rw-r--r-- | plat/ti/k3/board/generic/include/board_def.h | 4 | ||||
-rw-r--r-- | plat/ti/k3/common/drivers/ti_sci/ti_sci.c | 36 | ||||
-rw-r--r-- | plat/ti/k3/common/drivers/ti_sci/ti_sci.h | 3 | ||||
-rw-r--r-- | plat/ti/k3/common/drivers/ti_sci/ti_sci_protocol.h | 25 | ||||
-rw-r--r-- | plat/ti/k3/common/k3_gicv3.c | 4 | ||||
-rw-r--r-- | plat/ti/k3/common/k3_psci.c | 25 | ||||
-rw-r--r-- | plat/ti/k3/common/plat_common.mk | 4 |
7 files changed, 86 insertions, 15 deletions
diff --git a/plat/ti/k3/board/generic/include/board_def.h b/plat/ti/k3/board/generic/include/board_def.h index edfa73fda..ade6d7a72 100644 --- a/plat/ti/k3/board/generic/include/board_def.h +++ b/plat/ti/k3/board/generic/include/board_def.h @@ -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) diff --git a/plat/ti/k3/common/drivers/ti_sci/ti_sci.c b/plat/ti/k3/common/drivers/ti_sci/ti_sci.c index 495f0c7e4..3f22bfdae 100644 --- a/plat/ti/k3/common/drivers/ti_sci/ti_sci.c +++ b/plat/ti/k3/common/drivers/ti_sci/ti_sci.c @@ -211,6 +211,42 @@ int ti_sci_get_revision(struct ti_sci_msg_resp_version *rev_info) } /** + * 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 * * @id: Device identifier diff --git a/plat/ti/k3/common/drivers/ti_sci/ti_sci.h b/plat/ti/k3/common/drivers/ti_sci/ti_sci.h index 06944a74b..c702a711f 100644 --- a/plat/ti/k3/common/drivers/ti_sci/ti_sci.h +++ b/plat/ti/k3/common/drivers/ti_sci/ti_sci.h @@ -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 diff --git a/plat/ti/k3/common/drivers/ti_sci/ti_sci_protocol.h b/plat/ti/k3/common/drivers/ti_sci/ti_sci_protocol.h index 36909f57d..7f1c3683a 100644 --- a/plat/ti/k3/common/drivers/ti_sci/ti_sci_protocol.h +++ b/plat/ti/k3/common/drivers/ti_sci/ti_sci_protocol.h @@ -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 @@ -124,6 +125,30 @@ struct ti_sci_msg_req_reboot { } __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 * @id: Indicates which device to modify diff --git a/plat/ti/k3/common/k3_gicv3.c b/plat/ti/k3/common/k3_gicv3.c index 019982261..eda943033 100644 --- a/plat/ti/k3/common/k3_gicv3.c +++ b/plat/ti/k3/common/k3_gicv3.c @@ -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 diff --git a/plat/ti/k3/common/k3_psci.c b/plat/ti/k3/common/k3_psci.c index d84649567..e8d73dbd5 100644 --- a/plat/ti/k3/common/k3_psci.c +++ b/plat/ti/k3/common/k3_psci.c @@ -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; diff --git a/plat/ti/k3/common/plat_common.mk b/plat/ti/k3/common/plat_common.mk index fb633a832..23efa3194 100644 --- a/plat/ti/k3/common/plat_common.mk +++ b/plat/ti/k3/common/plat_common.mk @@ -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 |