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