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