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