#include "sm.h"
#include "rpc_scmi.h"
#include "dev_sm.h"
/* Внешняя ссылка на конфигурацию логических машин из вашего файла */
extern const lmm_config_t g_lmmConfig[SM_NUM_LM];
/**
* @brief Функция полного сброса логической машины М7 с подменой вектора.
* Интегрируется напрямую в ваш код imx-system-manager (M33).
*
* @param lm_id ID логической машины для M7 (индекс из g_lmmConfig)
* @param boot_vector Целевой адрес старта (например, 0x80000000 для DDR)
* @return int32_t SM_ERR_SUCCESS в случае успеха
*/
int32_t sm_cli_test_m7_vector_reboot(uint32_t lm_id, uint32_t boot_vector)
{
int32_t status = SM_ERR_SUCCESS;
/* 1. Проверяем валидность индекса машины */
if (lm_id >= SM_NUM_LM)
{
return SM_ERR_INVALID_PARAMETERS;
}
/* 2. Сбрасываем RPC-контекст, чтобы избежать зависания SCMI-каналов связи
* между U-Boot/Linux и M33 при перезапуске ядра. */
status = LMM_RpcReset(lm_id);
if (status != SM_ERR_SUCCESS)
{
return status;
}
/* 3. Записываем новый вектор старта в аппаратные регистры.
* Поскольку LMM_Handler вызывает LMM_SystemLmBoot, который считывает
* вектор из настроек устройства, эта функция запишет адрес в регистры SRC/GPC,
* и при следующем старте М7 проснется по новому адресу. */
status = DEV_SM_CpuResetVectorSet(lm_id, boot_vector, true);
if (status != SM_ERR_SUCCESS)
{
return status;
}
/* 4. Запускаем штатный конвейер загрузки.
* Функция выставит статические переменные s_bootLm, s_bootSkip
* и вызовет SWI_Trigger(). Внутри прерывания отработает присланный вами
* LMM_Handler, который через LMM_SystemLmBoot поднимет М7 с новым вектором. */
status = LMM_Boot_core(lm_id);
return status;
}