diff options
author | Andrew Davis <afd@ti.com> | 2023-06-26 12:49:17 -0500 |
---|---|---|
committer | Andrew Davis <afd@ti.com> | 2023-10-27 10:26:50 -0500 |
commit | 7ab782801f8c78ae6a8293d25cad687c86a4ac4e (patch) | |
tree | 14d69f13fef7a2fec7aca3630cc12eea73dffe3b | |
parent | e9868458e6de2ffb3c08e2fafa444a812b895337 (diff) |
feat(ti): add TI-SCI query firmware capabilities command support
This TISCI API is used to retrieve the firmware capabilities of the
currently running system-firmware.
Signed-off-by: Andrew Davis <afd@ti.com>
Change-Id: I55402dcf876e997eb21bb1f31c725e167c507c47
-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 |
3 files changed, 64 insertions, 0 deletions
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 |