Загрузка данных
ims system manager:
int32_t RPC_SCMI_LmmDispatchCommand(scmi_caller_t *caller, uint32_t messageId)
{
int32_t status = SM_ERR_SUCCESS;
const scmi_msg_t *in = caller->msgCopy;
scmi_msg_status_t *out = caller->msg;
uint32_t lenOut = sizeof(scmi_msg_status_t);
/* Handle standard messages */
switch (messageId)
{
case COMMAND_PROTOCOL_VERSION:
lenOut = sizeof(msg_tlmm0_t);
status = LmmProtocolVersion(caller, (const scmi_msg_header_t*) in,
(msg_tlmm0_t*) out);
break;
case COMMAND_PROTOCOL_ATTRIBUTES:
lenOut = sizeof(msg_tlmm1_t);
status = LmmProtocolAttributes(caller,
(const scmi_msg_header_t*) in, (msg_tlmm1_t*) out);
break;
case COMMAND_PROTOCOL_MESSAGE_ATTRIBUTES:
lenOut = sizeof(msg_tlmm2_t);
status = LmmProtocolMessageAttributes(caller,
(const msg_rlmm2_t*) in, (msg_tlmm2_t*) out);
break;
case COMMAND_LMM_ATTRIBUTES:
lenOut = sizeof(msg_tlmm3_t);
status = LmmAttributes(caller, (const msg_rlmm3_t*) in,
(msg_tlmm3_t*) out);
break;
case COMMAND_LMM_BOOT:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmBoot(caller, (const msg_rlmm4_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_RESET:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmReset(caller, (const msg_rlmm5_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_SHUTDOWN:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmShutdown(caller, (const msg_rlmm6_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_WAKE:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmWake(caller, (const msg_rlmm7_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_SUSPEND:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmSuspend(caller, (const msg_rlmm8_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_NOTIFY:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmNotify(caller, (const msg_rlmm9_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_RESET_REASON:
lenOut = sizeof(msg_tlmm10_t);
status = LmmResetReason(caller, (const msg_rlmm10_t*) in,
(msg_tlmm10_t*) out, &lenOut);
break;
case COMMAND_LMM_POWER_ON:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmPowerOn(caller, (const msg_rlmm11_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_LMM_RESET_VECTOR_SET:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmResetVectorSet(caller, (const msg_rlmm12_t*) in,
(const scmi_msg_status_t*) out);
break;
case COMMAND_NEGOTIATE_PROTOCOL_VERSION:
lenOut = sizeof(const scmi_msg_status_t);
status = LmmNegotiateProtocolVersion(caller,
(const msg_rlmm16_t*) in, (const scmi_msg_status_t*) out);
break;
default:
status = SM_ERR_NOT_SUPPORTED;
break;
}
/* Update length */
caller->lenMsg = lenOut;
/* Return status */
return status;
}
Надо добавить в протокол команду перезапуска M7 LMM и установку вектора запуска. Вот готовая функция:
int32_t sm_m7_vector_reboot(uint32_t lm_id, uint32_t cpu_id, uint32_t boot_vector)
{
lmm_rst_rec_t rstRec = {0};
int32_t status = SM_ERR_SUCCESS;
/* 1. Check the validity of the machine index */
if (lm_id >= SM_NUM_LM)
{
printf("Invalid use lm_id=%d\n",lm_id);
return SM_ERR_INVALID_PARAMETERS;
}
/* 2. Reset the RPC context to avoid SCMI communication channels hanging
* between U-Boot/Linux and M33 during kernel restart. */
status = LMM_RpcReset(lm_id);
if (status != SM_ERR_SUCCESS)
{
printf("Error LMM_RpcReset status=%d\n",status);
return status;
}
/* 3. Write the new startup vector to the hardware registers.*/
status = LMM_CpuResetVectorSet(lm_id, cpu_id, boot_vector, true, true, false, true);
if (status != SM_ERR_SUCCESS)
{
printf("Error DEV_SM_CpuResetVectorSet status=%d\n",status);
return status;
}
status = LMM_SystemLmReset(0U, 0U, lm_id, true, false, &rstRec);
printf("LMM_SystemLmReset status=%d\n",status);
return status;
}
Команда на перезапуск будет из A55 u-boot либо из M7