1*fb57af70SWenzhen Yu /* 2*fb57af70SWenzhen Yu * Copyright (c) 2025, Mediatek Inc. All rights reserved. 3*fb57af70SWenzhen Yu * 4*fb57af70SWenzhen Yu * SPDX-License-Identifier: BSD-3-Clause 5*fb57af70SWenzhen Yu */ 6*fb57af70SWenzhen Yu 7*fb57af70SWenzhen Yu #include <lib/mmio.h> 8*fb57af70SWenzhen Yu 9*fb57af70SWenzhen Yu #include <mt_spm.h> 10*fb57af70SWenzhen Yu #include <mt_spm_reg.h> 11*fb57af70SWenzhen Yu #include <mt_spm_stats.h> 12*fb57af70SWenzhen Yu 13*fb57af70SWenzhen Yu #define READ_AND_MASK_16BIT(addr) (mmio_read_32(addr) & 0xFFFF) 14*fb57af70SWenzhen Yu mt_spm_update_lp_stat(struct spm_lp_stat * stat)15*fb57af70SWenzhen Yuvoid mt_spm_update_lp_stat(struct spm_lp_stat *stat) 16*fb57af70SWenzhen Yu { 17*fb57af70SWenzhen Yu if (!stat) 18*fb57af70SWenzhen Yu return; 19*fb57af70SWenzhen Yu 20*fb57af70SWenzhen Yu stat->record[SPM_STAT_MCUSYS].count += 1; 21*fb57af70SWenzhen Yu stat->record[SPM_STAT_MCUSYS].duration += 22*fb57af70SWenzhen Yu mmio_read_32(SPM_BK_PCM_TIMER); 23*fb57af70SWenzhen Yu stat->record[SPM_STAT_D1_2].count += 24*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_APSRC_EVENT_COUNT_STA); 25*fb57af70SWenzhen Yu stat->record[SPM_STAT_D2].count += 26*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_EMI_EVENT_COUNT_STA); 27*fb57af70SWenzhen Yu stat->record[SPM_STAT_D3].count += 28*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_VRF18_EVENT_COUNT_STA); 29*fb57af70SWenzhen Yu stat->record[SPM_STAT_D4].count += 30*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_INFRA_EVENT_COUNT_STA); 31*fb57af70SWenzhen Yu stat->record[SPM_STAT_D6X].count += 32*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_PMIC_EVENT_COUNT_STA); 33*fb57af70SWenzhen Yu stat->record[SPM_STAT_F26M].count += 34*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_SRCCLKENA_EVENT_COUNT_STA); 35*fb57af70SWenzhen Yu stat->record[SPM_STAT_F26M].duration += 36*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_BK_VTCXO_DUR); 37*fb57af70SWenzhen Yu stat->record[SPM_STAT_VCORE].count += 38*fb57af70SWenzhen Yu READ_AND_MASK_16BIT(SPM_VCORE_EVENT_COUNT_STA); 39*fb57af70SWenzhen Yu stat->record[SPM_STAT_VCORE].duration += 40*fb57af70SWenzhen Yu mmio_read_32(SPM_SW_RSV_4); 41*fb57af70SWenzhen Yu } 42*fb57af70SWenzhen Yu mt_spm_get_lp_stat(struct spm_lp_stat * stat,uint32_t index,uint32_t type)43*fb57af70SWenzhen Yuuint64_t mt_spm_get_lp_stat(struct spm_lp_stat *stat, 44*fb57af70SWenzhen Yu uint32_t index, uint32_t type) 45*fb57af70SWenzhen Yu { 46*fb57af70SWenzhen Yu 47*fb57af70SWenzhen Yu uint64_t ret; 48*fb57af70SWenzhen Yu 49*fb57af70SWenzhen Yu if (!stat || index >= NUM_SPM_STAT) 50*fb57af70SWenzhen Yu return 0; 51*fb57af70SWenzhen Yu 52*fb57af70SWenzhen Yu switch (type) { 53*fb57af70SWenzhen Yu case SPM_SLP_COUNT: 54*fb57af70SWenzhen Yu ret = stat->record[index].count; 55*fb57af70SWenzhen Yu break; 56*fb57af70SWenzhen Yu case SPM_SLP_DURATION: 57*fb57af70SWenzhen Yu ret = stat->record[index].duration; 58*fb57af70SWenzhen Yu break; 59*fb57af70SWenzhen Yu default: 60*fb57af70SWenzhen Yu ret = 0; 61*fb57af70SWenzhen Yu break; 62*fb57af70SWenzhen Yu } 63*fb57af70SWenzhen Yu 64*fb57af70SWenzhen Yu return ret; 65*fb57af70SWenzhen Yu } 66