Browse Source

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
pull/1993/merge
Andrew Davis 1 year ago
parent
commit
7ab782801f
  1. 36
      plat/ti/k3/common/drivers/ti_sci/ti_sci.c
  2. 3
      plat/ti/k3/common/drivers/ti_sci/ti_sci.h
  3. 25
      plat/ti/k3/common/drivers/ti_sci/ti_sci_protocol.h

36
plat/ti/k3/common/drivers/ti_sci/ti_sci.c

@ -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
*

3
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

25
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
@ -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

Loading…
Cancel
Save