xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/mt8189/mt_spm_stats.c (revision af0370f25a6663a0d737bbfb3985df4232eaaa55)
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 Lu void 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 Lu uint64_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