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