/*--------------------------------------------------------------------------*/
/* Get system-level sleep status */
/*--------------------------------------------------------------------------*/
bool CPU_SystemSleepStatusGet(uint32_t *sysSleepStat)
{
bool rc = true;
uint32_t targetSysSleepStat = CPU_SLEEP_MODE_SUSPEND;
/* Проверяем: если текущее запрашиваемое ядро (например, M7)
уже переведено в наш кастомный режим, делаем его базовым таргетом */
uint32_t m7ModeStat = s_gpcCpuCtrlPtrs[CPU_IDX_CM7]->CMC_MODE_STAT;
if ((m7ModeStat & GPC_CPU_CTRL_CMC_MODE_STAT_SLEEPING_IDLE_MASK) != 0U)
{
uint32_t m7ModeCur = (m7ModeStat & GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_MASK) >>
GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_SHIFT;
if (m7ModeCur == CPU_SLEEP_MODE_SUSPEND_NO_DDR)
{
targetSysSleepStat = CPU_SLEEP_MODE_SUSPEND_NO_DDR;
}
}
*sysSleepStat = targetSysSleepStat;
uint32_t cpuIdx = 0U;
for (cpuIdx = 0U; cpuIdx < CPU_NUM_IDX; cpuIdx++)
{
if ((cpuIdx != CPU_IDX_M33P) &&
((s_cpuLpComputeList & (1UL << cpuIdx)) == 0U))
{
/* Check if sleep is forced for the CPU */
bool sleepForce;
if (CPU_SleepForceGet(cpuIdx, &sleepForce))
{
/* If sleep is not forced, consider the CPU mode */
if (!sleepForce)
{
/* Get GPC CPU mode status */
uint32_t cpuModeStat =
s_gpcCpuCtrlPtrs[cpuIdx]->CMC_MODE_STAT;
/* Default CPU mode as RUN until SLEEPING_IDLE confirmed */
uint32_t cpuModeCur = CPU_SLEEP_MODE_RUN;
/* Check if CPU in SLEEPING_IDLE state */
if ((cpuModeStat &
GPC_CPU_CTRL_CMC_MODE_STAT_SLEEPING_IDLE_MASK) != 0U)
{
/* CPU_MODE_CURRENT reflects active mode */
cpuModeCur = (cpuModeStat &
GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_MASK) >>
GPC_CPU_CTRL_CMC_MODE_STAT_CPU_MODE_CURRENT_SHIFT;
}
/* Корректируем математику сравнения для кастомного режима:
Если целевой статус SUSPEND_NO_DDR (4), а текущее проверяемое ядро (например, A55)
находится в обычном SUSPEND (3), то это валидное состояние сна для всей платформы.
Но если ядро в RUN (0), STOP (2) или WAIT (1) — сбрасываем статус вниз. */
if (*sysSleepStat == CPU_SLEEP_MODE_SUSPEND_NO_DDR)
{
if (cpuModeCur < CPU_SLEEP_MODE_SUSPEND)
{
*sysSleepStat = cpuModeCur;
}
}
else
{
/* Стандартная заводская логика NXP для обычного SUSPEND */
if (cpuModeCur < *sysSleepStat)
{
*sysSleepStat = cpuModeCur;
}
}
}
}
}
}
return rc;
}