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