1*271d9497SJames Liao /* 2*271d9497SJames Liao * Copyright (c) 2020, MediaTek Inc. All rights reserved. 3*271d9497SJames Liao * 4*271d9497SJames Liao * SPDX-License-Identifier: BSD-3-Clause 5*271d9497SJames Liao */ 6*271d9497SJames Liao 7*271d9497SJames Liao #ifndef MT_CPU_PM_CPC_H 8*271d9497SJames Liao #define MT_CPU_PM_CPC_H 9*271d9497SJames Liao 10*271d9497SJames Liao #include <lib/mmio.h> 11*271d9497SJames Liao #include <lib/utils_def.h> 12*271d9497SJames Liao #include <mcucfg.h> 13*271d9497SJames Liao #include <platform_def.h> 14*271d9497SJames Liao 15*271d9497SJames Liao #define NEED_CPUSYS_PROT_WORKAROUND 1 16*271d9497SJames Liao 17*271d9497SJames Liao /* system sram registers */ 18*271d9497SJames Liao #define CPUIDLE_SRAM_REG(r) (uint32_t)(MTK_MCDI_SRAM_BASE + (r)) 19*271d9497SJames Liao 20*271d9497SJames Liao /* db dump */ 21*271d9497SJames Liao #define CPC_TRACE_SIZE U(0x20) 22*271d9497SJames Liao #define CPC_TRACE_ID_NUM U(10) 23*271d9497SJames Liao #define CPC_TRACE_SRAM(id) (CPUIDLE_SRAM_REG(0x10) + (id) * CPC_TRACE_SIZE) 24*271d9497SJames Liao 25*271d9497SJames Liao /* buckup off count */ 26*271d9497SJames Liao #define CPC_CLUSTER_CNT_BACKUP CPUIDLE_SRAM_REG(0x1F0) 27*271d9497SJames Liao #define CPC_MCUSYS_CNT CPUIDLE_SRAM_REG(0x1F4) 28*271d9497SJames Liao 29*271d9497SJames Liao /* CPC_MCUSYS_CPC_FLOW_CTRL_CFG(0xA814): debug setting */ 30*271d9497SJames Liao #define CPC_PWR_ON_SEQ_DIS BIT(1) 31*271d9497SJames Liao #define CPC_PWR_ON_PRIORITY BIT(2) 32*271d9497SJames Liao #define CPC_AUTO_OFF_EN BIT(5) 33*271d9497SJames Liao #define CPC_DORMANT_WAIT_EN BIT(14) 34*271d9497SJames Liao #define CPC_CTRL_EN BIT(16) 35*271d9497SJames Liao #define CPC_OFF_PRE_EN BIT(29) 36*271d9497SJames Liao 37*271d9497SJames Liao /* CPC_MCUSYS_LAST_CORE_REQ(0xA818) : last core protection */ 38*271d9497SJames Liao #define CPUSYS_PROT_SET BIT(0) 39*271d9497SJames Liao #define MCUSYS_PROT_SET BIT(8) 40*271d9497SJames Liao #define CPUSYS_PROT_CLR BIT(8) 41*271d9497SJames Liao #define MCUSYS_PROT_CLR BIT(9) 42*271d9497SJames Liao 43*271d9497SJames Liao #define CPC_PROT_RESP_MASK U(0x3) 44*271d9497SJames Liao #define CPUSYS_RESP_OFS U(16) 45*271d9497SJames Liao #define MCUSYS_RESP_OFS U(30) 46*271d9497SJames Liao 47*271d9497SJames Liao #define cpusys_resp(r) (((r) >> CPUSYS_RESP_OFS) & CPC_PROT_RESP_MASK) 48*271d9497SJames Liao #define mcusys_resp(r) (((r) >> MCUSYS_RESP_OFS) & CPC_PROT_RESP_MASK) 49*271d9497SJames Liao 50*271d9497SJames Liao #define RETRY_CNT_MAX U(1000) 51*271d9497SJames Liao 52*271d9497SJames Liao #define PROT_RETRY U(0) 53*271d9497SJames Liao #define PROT_SUCCESS U(1) 54*271d9497SJames Liao #define PROT_GIVEUP U(2) 55*271d9497SJames Liao 56*271d9497SJames Liao /* CPC_MCUSYS_CPC_DBG_SETTING(0xAB00): debug setting */ 57*271d9497SJames Liao #define CPC_PROF_EN BIT(0) 58*271d9497SJames Liao #define CPC_DBG_EN BIT(1) 59*271d9497SJames Liao #define CPC_FREEZE BIT(2) 60*271d9497SJames Liao #define CPC_CALC_EN BIT(3) 61*271d9497SJames Liao 62*271d9497SJames Liao enum { 63*271d9497SJames Liao CPC_SUCCESS = 0, 64*271d9497SJames Liao 65*271d9497SJames Liao CPC_ERR_FAIL, 66*271d9497SJames Liao CPC_ERR_TIMEOUT, 67*271d9497SJames Liao 68*271d9497SJames Liao NF_CPC_ERR 69*271d9497SJames Liao }; 70*271d9497SJames Liao 71*271d9497SJames Liao enum { 72*271d9497SJames Liao CPC_SMC_EVENT_DUMP_TRACE_DATA, 73*271d9497SJames Liao CPC_SMC_EVENT_GIC_DPG_SET, 74*271d9497SJames Liao CPC_SMC_EVENT_CPC_CONFIG, 75*271d9497SJames Liao CPC_SMC_EVENT_READ_CONFIG, 76*271d9497SJames Liao 77*271d9497SJames Liao NF_CPC_SMC_EVENT 78*271d9497SJames Liao }; 79*271d9497SJames Liao 80*271d9497SJames Liao enum { 81*271d9497SJames Liao CPC_SMC_CONFIG_PROF, 82*271d9497SJames Liao CPC_SMC_CONFIG_AUTO_OFF, 83*271d9497SJames Liao CPC_SMC_CONFIG_AUTO_OFF_THRES, 84*271d9497SJames Liao CPC_SMC_CONFIG_CNT_CLR, 85*271d9497SJames Liao CPC_SMC_CONFIG_TIME_SYNC, 86*271d9497SJames Liao 87*271d9497SJames Liao NF_CPC_SMC_CONFIG 88*271d9497SJames Liao }; 89*271d9497SJames Liao 90*271d9497SJames Liao #define us_to_ticks(us) ((us) * 13) 91*271d9497SJames Liao #define ticks_to_us(tick) ((tick) / 13) 92*271d9497SJames Liao 93*271d9497SJames Liao int mtk_cpu_pm_cluster_prot_aquire(unsigned int cluster); 94*271d9497SJames Liao void mtk_cpu_pm_cluster_prot_release(unsigned int cluster); 95*271d9497SJames Liao 96*271d9497SJames Liao void mtk_cpc_mcusys_off_reflect(void); 97*271d9497SJames Liao int mtk_cpc_mcusys_off_prepare(void); 98*271d9497SJames Liao 99*271d9497SJames Liao void mtk_cpc_core_on_hint_set(unsigned int cpu); 100*271d9497SJames Liao void mtk_cpc_core_on_hint_clr(unsigned int cpu); 101*271d9497SJames Liao void mtk_cpc_time_sync(void); 102*271d9497SJames Liao 103*271d9497SJames Liao uint64_t mtk_cpc_handler(uint64_t act, uint64_t arg1, uint64_t arg2); 104*271d9497SJames Liao void mtk_cpc_init(void); 105*271d9497SJames Liao 106*271d9497SJames Liao #endif /* MT_CPU_PM_CPC_H */ 107