fix(intel): extend SDM command to return the SDM firmware version

Updates intel_smc_fw_version function to read SDM
firmware version in major/minor ACDS release number.
Update CONFIG_STATUS Response Data [1] bit0-23.

Return INTEL_SIP_SMC_STATUS_ERROR if unexpected
firmware version is being retrieved.

Signed-off-by: Sieu Mun Tang <sieu.mun.tang@intel.com>
Signed-off-by: Jit Loon Lim <jit.loon.lim@intel.com>
Change-Id: I018ccbb961786a75dc6eb873b0f232e71341e1d2
This commit is contained in:
Sieu Mun Tang 2022-04-27 18:54:10 +08:00
parent c34b2a7a1a
commit c026dfe38c
2 changed files with 21 additions and 2 deletions

View File

@ -145,6 +145,10 @@
#define RSU_VERSION_ACMF BIT(8)
#define RSU_VERSION_ACMF_MASK 0xff00
/* Config Status Macros */
#define CONFIG_STATUS_WORD_SIZE 16U
#define CONFIG_STATUS_FW_VER_OFFSET 1
#define CONFIG_STATUS_FW_VER_MASK 0x00FFFFFF
/* Mailbox Function Definitions */

View File

@ -437,7 +437,22 @@ static uint32_t intel_rsu_copy_dcmf_status(uint64_t dcmf_stat)
/* Mailbox services */
static uint32_t intel_smc_fw_version(uint32_t *fw_version)
{
*fw_version = 0U;
int status;
unsigned int resp_len = CONFIG_STATUS_WORD_SIZE;
uint32_t resp_data[CONFIG_STATUS_WORD_SIZE] = {0U};
status = mailbox_send_cmd(MBOX_JOB_ID, MBOX_CONFIG_STATUS, NULL, 0U,
CMD_CASUAL, resp_data, &resp_len);
if (status < 0) {
return INTEL_SIP_SMC_STATUS_ERROR;
}
if (resp_len <= CONFIG_STATUS_FW_VER_OFFSET) {
return INTEL_SIP_SMC_STATUS_ERROR;
}
*fw_version = resp_data[CONFIG_STATUS_FW_VER_OFFSET] & CONFIG_STATUS_FW_VER_MASK;
return INTEL_SIP_SMC_STATUS_OK;
}
@ -624,7 +639,7 @@ uintptr_t sip_smc_handler(uint32_t smc_fid,
case INTEL_SIP_SMC_FIRMWARE_VERSION:
status = intel_smc_fw_version(&retval);
SMC_RET1(handle, status);
SMC_RET2(handle, status, retval);
case INTEL_SIP_SMC_MBOX_SEND_CMD:
x5 = SMC_GET_GP(handle, CTX_GPREG_X5);