xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/mt8189/mt_spm_cond.h (revision af0370f25a6663a0d737bbfb3985df4232eaaa55)
1*083cfadbSKun Lu /*
2*083cfadbSKun Lu  * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*083cfadbSKun Lu  *
4*083cfadbSKun Lu  * SPDX-License-Identifier: BSD-3-Clause
5*083cfadbSKun Lu  */
6*083cfadbSKun Lu 
7*083cfadbSKun Lu #ifndef MT_SPM_COND_H
8*083cfadbSKun Lu #define MT_SPM_COND_H
9*083cfadbSKun Lu 
10*083cfadbSKun Lu #include <lpm_v2/mt_lp_rm.h>
11*083cfadbSKun Lu 
12*083cfadbSKun Lu #define SPM_RC_UPDATE_COND_ID_MASK 0xffff
13*083cfadbSKun Lu #define SPM_RC_UPDATE_COND_RC_ID_MASK 0xffff
14*083cfadbSKun Lu #define SPM_RC_UPDATE_COND_RC_ID_SHIFT (16)
15*083cfadbSKun Lu 
16*083cfadbSKun Lu #define SPM_RC_UPDATE_COND_RC_ID_GET(val)          \
17*083cfadbSKun Lu 	((val >> SPM_RC_UPDATE_COND_RC_ID_SHIFT) & \
18*083cfadbSKun Lu 	 SPM_RC_UPDATE_COND_RC_ID_MASK)
19*083cfadbSKun Lu 
20*083cfadbSKun Lu #define SPM_RC_UPDATE_COND_ID_GET(val) (val & SPM_RC_UPDATE_COND_ID_MASK)
21*083cfadbSKun Lu /*
22*083cfadbSKun Lu  * Definition about SPM_COND_CHECK_BLOCKED
23*083cfadbSKun Lu  * bit [00 ~ 15]: cg blocking index
24*083cfadbSKun Lu  * bit [16 ~ 29]: pll blocking index
25*083cfadbSKun Lu  * bit [62]	: pll blocking information
26*083cfadbSKun Lu  * bit [63]	: idle condition check fail
27*083cfadbSKun Lu  */
28*083cfadbSKun Lu #define SPM_COND_BLOCKED_CG_IDX (0)
29*083cfadbSKun Lu #define SPM_COND_BLOCKED_PLL_IDX (16)
30*083cfadbSKun Lu #define SPM_COND_CHECK_BLOCKED_PLL ((uint64_t)1 << 62L)
31*083cfadbSKun Lu #define SPM_COND_CHECK_FAIL ((uint64_t)1 << 63L)
32*083cfadbSKun Lu 
33*083cfadbSKun Lu enum plat_spm_cond_pll {
34*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_UNIV = 0,
35*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_UNIV2,
36*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MFG,
37*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MFGSC,
38*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_SENSON,
39*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MSDC,
40*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_UFS,
41*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_TVD,
42*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MM,
43*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MM2,
44*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MAIN2,
45*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_IMG,
46*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_USB,
47*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_ADSP,
48*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_APLL1,
49*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_APLL2,
50*083cfadbSKun Lu 	PLAT_SPM_COND_PLL_MAX
51*083cfadbSKun Lu };
52*083cfadbSKun Lu 
53*083cfadbSKun Lu #define PLL_BIT_MFG (1 << PLAT_SPM_COND_PLL_MFG)
54*083cfadbSKun Lu #define PLL_BIT_MFGSC (1 << PLAT_SPM_COND_PLL_MFGSC)
55*083cfadbSKun Lu #define PLL_BIT_SENSON (1 << PLAT_SPM_COND_PLL_SENSON)
56*083cfadbSKun Lu #define PLL_BIT_MM (1 << PLAT_SPM_COND_PLL_MM)
57*083cfadbSKun Lu #define PLL_BIT_MM2 (1 << PLAT_SPM_COND_PLL_MM2)
58*083cfadbSKun Lu #define PLL_BIT_MAIN2 (1 << PLAT_SPM_COND_PLL_MAIN2)
59*083cfadbSKun Lu #define PLL_BIT_UNIV (1 << PLAT_SPM_COND_PLL_UNIV)
60*083cfadbSKun Lu #define PLL_BIT_UNIV2 (1 << PLAT_SPM_COND_PLL_UNIV2)
61*083cfadbSKun Lu #define PLL_BIT_MSDC (1 << PLAT_SPM_COND_PLL_MSDC)
62*083cfadbSKun Lu #define PLL_BIT_UFS (1 << PLAT_SPM_COND_PLL_UFS)
63*083cfadbSKun Lu #define PLL_BIT_TVD (1 << PLAT_SPM_COND_PLL_TVD)
64*083cfadbSKun Lu #define PLL_BIT_IMG (1 << PLAT_SPM_COND_PLL_IMG)
65*083cfadbSKun Lu #define PLL_BIT_USB (1 << PLAT_SPM_COND_PLL_USB)
66*083cfadbSKun Lu #define PLL_BIT_ADSP (1 << PLAT_SPM_COND_PLL_ADSP)
67*083cfadbSKun Lu #define PLL_BIT_APLL1 (1 << PLAT_SPM_COND_PLL_APLL1)
68*083cfadbSKun Lu #define PLL_BIT_APLL2 (1 << PLAT_SPM_COND_PLL_APLL2)
69*083cfadbSKun Lu #define PLL_BIT_MAX (1 << PLAT_SPM_COND_PLL_MAX)
70*083cfadbSKun Lu 
71*083cfadbSKun Lu struct mt_spm_cond_tables {
72*083cfadbSKun Lu 	unsigned int *table_cg;
73*083cfadbSKun Lu 	uint64_t table_pll;
74*083cfadbSKun Lu 	void *priv;
75*083cfadbSKun Lu };
76*083cfadbSKun Lu 
77*083cfadbSKun Lu struct plat_idle_cond_info {
78*083cfadbSKun Lu 	/* check SPM_PWR_STATUS for bit definition */
79*083cfadbSKun Lu 	unsigned int pwr_status_mask;
80*083cfadbSKun Lu 	/* cg address */
81*083cfadbSKun Lu 	uintptr_t cg_addr;
82*083cfadbSKun Lu 	/* bitflip value from *addr ? */
83*083cfadbSKun Lu 	bool bBitflip;
84*083cfadbSKun Lu 	/* check clkmux */
85*083cfadbSKun Lu 	uintptr_t clkmux_addr;
86*083cfadbSKun Lu 	unsigned int clkmux_mask;
87*083cfadbSKun Lu };
88*083cfadbSKun Lu 
89*083cfadbSKun Lu struct plat_pll_cond_info {
90*083cfadbSKun Lu 	uintptr_t pll_addr;
91*083cfadbSKun Lu 	unsigned int pll_mask;
92*083cfadbSKun Lu 	unsigned int pll_bit_set;
93*083cfadbSKun Lu };
94*083cfadbSKun Lu 
95*083cfadbSKun Lu struct plat_cond_info_t {
96*083cfadbSKun Lu 	uintptr_t spm_pwr_status_addr;
97*083cfadbSKun Lu 	uintptr_t spm_pwr_status_2nd_addr;
98*083cfadbSKun Lu 	struct plat_idle_cond_info *idle_cond_table;
99*083cfadbSKun Lu 	struct plat_pll_cond_info *pll_cond_table;
100*083cfadbSKun Lu 	unsigned int idle_cond_num;
101*083cfadbSKun Lu 	struct mt_spm_cond_tables cond_table_buf;
102*083cfadbSKun Lu };
103*083cfadbSKun Lu 
104*083cfadbSKun Lu uint64_t mt_spm_cond_check(const struct mt_spm_cond_tables *src,
105*083cfadbSKun Lu 			   const struct mt_spm_cond_tables *dest,
106*083cfadbSKun Lu 			   struct mt_spm_cond_tables *res);
107*083cfadbSKun Lu uint64_t mt_spm_dump_all_pll(const struct mt_spm_cond_tables *src,
108*083cfadbSKun Lu 			     const struct mt_spm_cond_tables *dest,
109*083cfadbSKun Lu 			     struct mt_spm_cond_tables *res);
110*083cfadbSKun Lu 
111*083cfadbSKun Lu int mt_spm_cond_update(struct mt_resource_constraint **con, int num,
112*083cfadbSKun Lu 		       int stateid, void *priv);
113*083cfadbSKun Lu int register_plat_cond_info(struct plat_cond_info_t *cond);
114*083cfadbSKun Lu 
115*083cfadbSKun Lu #endif
116