xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/mt_spm_rc_api_common.h (revision af0370f25a6663a0d737bbfb3985df4232eaaa55)
1*532ac057SKun Lu /*
2*532ac057SKun Lu  * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*532ac057SKun Lu  *
4*532ac057SKun Lu  * SPDX-License-Identifier: BSD-3-Clause
5*532ac057SKun Lu  */
6*532ac057SKun Lu 
7*532ac057SKun Lu #ifndef MT_SPM_RC_API_COMMON_H
8*532ac057SKun Lu #define MT_SPM_RC_API_COMMON_H
9*532ac057SKun Lu 
10*532ac057SKun Lu #include <constraints/mt_spm_trace.h>
11*532ac057SKun Lu #include <mt_spm_constraint.h>
12*532ac057SKun Lu #include <mt_spm_internal.h>
13*532ac057SKun Lu 
14*532ac057SKun Lu enum mt_spm_rm_rc_type {
15*532ac057SKun Lu 	MT_RM_CONSTRAINT_ID_VCORE,
16*532ac057SKun Lu 	MT_RM_CONSTRAINT_ID_BUS26,
17*532ac057SKun Lu 	MT_RM_CONSTRAINT_ID_SYSPL,
18*532ac057SKun Lu 	MT_RM_CONSTRAINT_ID_ALL = 0xff,
19*532ac057SKun Lu };
20*532ac057SKun Lu 
21*532ac057SKun Lu enum mt_spm_rc_fp_type {
22*532ac057SKun Lu 	MT_SPM_RC_FP_INIT = 0,
23*532ac057SKun Lu 	MT_SPM_RC_FP_ENTER_START,
24*532ac057SKun Lu 	MT_SPM_RC_FP_ENTER_NOTIFY,
25*532ac057SKun Lu 	MT_SPM_RC_FP_ENTER_WAKE_SPM_BEFORE,
26*532ac057SKun Lu 	MT_SPM_RC_FP_ENTER_WAKE_SPM_AFTER,
27*532ac057SKun Lu 	MT_SPM_RC_FP_RESUME_START,
28*532ac057SKun Lu 	MT_SPM_RC_FP_RESUME_NOTIFY,
29*532ac057SKun Lu 	MT_SPM_RC_FP_RESUME_RESET_SPM_BEFORE,
30*532ac057SKun Lu 	MT_SPM_RC_FP_RESUME_BACKUP_EDGE_INT,
31*532ac057SKun Lu };
32*532ac057SKun Lu 
33*532ac057SKun Lu #define CONSTRAINT_VCORE_ALLOW (MT_RM_CONSTRAINT_ALLOW_CPU_BUCK_OFF | \
34*532ac057SKun Lu 				MT_RM_CONSTRAINT_ALLOW_DRAM_S0 | \
35*532ac057SKun Lu 				MT_RM_CONSTRAINT_ALLOW_DRAM_S1 | \
36*532ac057SKun Lu 				MT_RM_CONSTRAINT_ALLOW_VCORE_LP | \
37*532ac057SKun Lu 				MT_RM_CONSTRAINT_ALLOW_LVTS_STATE | \
38*532ac057SKun Lu 				MT_RM_CONSTRAINT_ALLOW_BUS26M_OFF | \
39*532ac057SKun Lu 				MT_RM_CONSTRAINT_ALLOW_VCORE_OFF)
40*532ac057SKun Lu 
41*532ac057SKun Lu #define MT_SPM_RC_INFO(_cpu, _stateid, _rc_id)                       \
42*532ac057SKun Lu 	({                                                           \
43*532ac057SKun Lu 		MT_SPM_TRACE_COMMON_U32_WR(                          \
44*532ac057SKun Lu 			MT_SPM_TRACE_COMM_RC_INFO,                   \
45*532ac057SKun Lu 			(_cpu << 28) | ((_stateid & 0xffff) << 12) | \
46*532ac057SKun Lu 				(_rc_id & 0xfff));                   \
47*532ac057SKun Lu 	})
48*532ac057SKun Lu 
49*532ac057SKun Lu #define MT_SPM_RC_LAST_TIME(_time)                                           \
50*532ac057SKun Lu 	({                                                                   \
51*532ac057SKun Lu 		MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_LAST_TIME_H, \
52*532ac057SKun Lu 					   (uint32_t)(_time >> 32));         \
53*532ac057SKun Lu 		MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_LAST_TIME_L, \
54*532ac057SKun Lu 					   (uint32_t)(_time & 0xffffffff));  \
55*532ac057SKun Lu 	})
56*532ac057SKun Lu 
57*532ac057SKun Lu #ifdef MT_SPM_TIMESTAMP_SUPPORT
58*532ac057SKun Lu #define MT_SPM_RC_TAG(_cpu, _stateid, _rc_id)           \
59*532ac057SKun Lu 	({                                              \
60*532ac057SKun Lu 		uint64_t ktime = 0;                     \
61*532ac057SKun Lu 		MT_SPM_TIME_GET(ktime);                 \
62*532ac057SKun Lu 		MT_SPM_RC_INFO(_cpu, _stateid, _rc_id); \
63*532ac057SKun Lu 		(void)ktime;                            \
64*532ac057SKun Lu 		MT_SPM_RC_LAST_TIME(ktime);             \
65*532ac057SKun Lu 	})
66*532ac057SKun Lu 
67*532ac057SKun Lu #else
68*532ac057SKun Lu #define MT_SPM_RC_TAG(_cpu, _stateid, _rc_id) \
69*532ac057SKun Lu 	MT_SPM_RC_INFO(_cpu, _stateid, _rc_id)
70*532ac057SKun Lu 
71*532ac057SKun Lu #endif
72*532ac057SKun Lu 
73*532ac057SKun Lu #define MT_SPM_RC_FP(fp) \
74*532ac057SKun Lu 	({ MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_FP, fp); })
75*532ac057SKun Lu 
76*532ac057SKun Lu #define MT_SPM_RC_TAG_VALID(_valid) \
77*532ac057SKun Lu 	({ MT_SPM_TRACE_COMMON_U32_WR(MT_SPM_TRACE_COMM_RC_VALID, _valid); })
78*532ac057SKun Lu 
79*532ac057SKun Lu int spm_rc_constraint_status_get(uint32_t id, uint32_t type, uint32_t act,
80*532ac057SKun Lu 				 enum mt_spm_rm_rc_type dest_rc_id,
81*532ac057SKun Lu 				 struct constraint_status *const src,
82*532ac057SKun Lu 				 struct constraint_status *const dest);
83*532ac057SKun Lu 
84*532ac057SKun Lu int spm_rc_constraint_status_set(uint32_t id, uint32_t type, uint32_t act,
85*532ac057SKun Lu 				 enum mt_spm_rm_rc_type dest_rc_id,
86*532ac057SKun Lu 				 struct constraint_status *const src,
87*532ac057SKun Lu 				 struct constraint_status *const dest);
88*532ac057SKun Lu 
89*532ac057SKun Lu int spm_rc_constraint_valid_set(enum mt_spm_rm_rc_type id,
90*532ac057SKun Lu 				enum mt_spm_rm_rc_type dest_rc_id,
91*532ac057SKun Lu 				uint32_t valid,
92*532ac057SKun Lu 				struct constraint_status *const dest);
93*532ac057SKun Lu 
94*532ac057SKun Lu int spm_rc_constraint_valid_clr(enum mt_spm_rm_rc_type id,
95*532ac057SKun Lu 				enum mt_spm_rm_rc_type dest_rc_id,
96*532ac057SKun Lu 				uint32_t valid,
97*532ac057SKun Lu 				struct constraint_status *const dest);
98*532ac057SKun Lu 
99*532ac057SKun Lu void mt_spm_dump_pmic_warp_reg(void);
100*532ac057SKun Lu uint32_t spm_allow_rc_vcore(int state_id);
101*532ac057SKun Lu int spm_hwcg_name(uint32_t idex, char *name, size_t sz);
102*532ac057SKun Lu 
103*532ac057SKun Lu #ifdef MTK_PLAT_CIRQ_UNSUPPORT
104*532ac057SKun Lu #define do_irqs_delivery(_x, _w)
105*532ac057SKun Lu #else
106*532ac057SKun Lu void do_irqs_delivery(struct mt_irqremain *irqs, struct wake_status *wakeup);
107*532ac057SKun Lu #endif
108*532ac057SKun Lu 
109*532ac057SKun Lu #endif
110