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