1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef MCE_PRIVATE_H 8*91f16700Schasinglulu #define MCE_PRIVATE_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/mmio.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <tegra_def.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu /******************************************************************************* 15*91f16700Schasinglulu * Macros to prepare CSTATE info request 16*91f16700Schasinglulu ******************************************************************************/ 17*91f16700Schasinglulu /* Description of the parameters for UPDATE_CSTATE_INFO request */ 18*91f16700Schasinglulu #define CLUSTER_CSTATE_MASK ULL(0x7) 19*91f16700Schasinglulu #define CLUSTER_CSTATE_SHIFT U(0) 20*91f16700Schasinglulu #define CLUSTER_CSTATE_UPDATE_BIT (ULL(1) << 7) 21*91f16700Schasinglulu #define CCPLEX_CSTATE_MASK ULL(0x3) 22*91f16700Schasinglulu #define CCPLEX_CSTATE_SHIFT ULL(8) 23*91f16700Schasinglulu #define CCPLEX_CSTATE_UPDATE_BIT (ULL(1) << 15) 24*91f16700Schasinglulu #define SYSTEM_CSTATE_MASK ULL(0xF) 25*91f16700Schasinglulu #define SYSTEM_CSTATE_SHIFT ULL(16) 26*91f16700Schasinglulu #define SYSTEM_CSTATE_FORCE_UPDATE_SHIFT ULL(22) 27*91f16700Schasinglulu #define SYSTEM_CSTATE_FORCE_UPDATE_BIT (ULL(1) << 22) 28*91f16700Schasinglulu #define SYSTEM_CSTATE_UPDATE_BIT (ULL(1) << 23) 29*91f16700Schasinglulu #define CSTATE_WAKE_MASK_UPDATE_BIT (ULL(1) << 31) 30*91f16700Schasinglulu #define CSTATE_WAKE_MASK_SHIFT ULL(32) 31*91f16700Schasinglulu #define CSTATE_WAKE_MASK_CLEAR U(0xFFFFFFFF) 32*91f16700Schasinglulu 33*91f16700Schasinglulu /******************************************************************************* 34*91f16700Schasinglulu * Auto-CC3 control macros 35*91f16700Schasinglulu ******************************************************************************/ 36*91f16700Schasinglulu #define MCE_AUTO_CC3_FREQ_MASK U(0x1FF) 37*91f16700Schasinglulu #define MCE_AUTO_CC3_FREQ_SHIFT U(0) 38*91f16700Schasinglulu #define MCE_AUTO_CC3_VTG_MASK U(0x7F) 39*91f16700Schasinglulu #define MCE_AUTO_CC3_VTG_SHIFT U(16) 40*91f16700Schasinglulu #define MCE_AUTO_CC3_ENABLE_BIT (U(1) << 31) 41*91f16700Schasinglulu 42*91f16700Schasinglulu /******************************************************************************* 43*91f16700Schasinglulu * Macros for the 'IS_SC7_ALLOWED' command 44*91f16700Schasinglulu ******************************************************************************/ 45*91f16700Schasinglulu #define MCE_SC7_ALLOWED_MASK U(0x7) 46*91f16700Schasinglulu #define MCE_SC7_WAKE_TIME_SHIFT U(32) 47*91f16700Schasinglulu 48*91f16700Schasinglulu /******************************************************************************* 49*91f16700Schasinglulu * Macros for 'read/write ctats' commands 50*91f16700Schasinglulu ******************************************************************************/ 51*91f16700Schasinglulu #define MCE_CSTATE_STATS_TYPE_SHIFT ULL(32) 52*91f16700Schasinglulu #define MCE_CSTATE_WRITE_DATA_LO_MASK U(0xF) 53*91f16700Schasinglulu 54*91f16700Schasinglulu /******************************************************************************* 55*91f16700Schasinglulu * Macros for 'update crossover threshold' command 56*91f16700Schasinglulu ******************************************************************************/ 57*91f16700Schasinglulu #define MCE_CROSSOVER_THRESHOLD_TIME_SHIFT U(32) 58*91f16700Schasinglulu 59*91f16700Schasinglulu /******************************************************************************* 60*91f16700Schasinglulu * MCA argument macros 61*91f16700Schasinglulu ******************************************************************************/ 62*91f16700Schasinglulu #define MCA_ARG_ERROR_MASK U(0xFF) 63*91f16700Schasinglulu #define MCA_ARG_FINISH_SHIFT U(24) 64*91f16700Schasinglulu #define MCA_ARG_FINISH_MASK U(0xFF) 65*91f16700Schasinglulu 66*91f16700Schasinglulu /******************************************************************************* 67*91f16700Schasinglulu * Uncore PERFMON ARI macros 68*91f16700Schasinglulu ******************************************************************************/ 69*91f16700Schasinglulu #define UNCORE_PERFMON_CMD_READ U(0) 70*91f16700Schasinglulu #define UNCORE_PERFMON_CMD_WRITE U(1) 71*91f16700Schasinglulu 72*91f16700Schasinglulu #define UNCORE_PERFMON_CMD_MASK U(0xFF) 73*91f16700Schasinglulu #define UNCORE_PERFMON_UNIT_GRP_MASK U(0xF) 74*91f16700Schasinglulu #define UNCORE_PERFMON_SELECTOR_MASK U(0xF) 75*91f16700Schasinglulu #define UNCORE_PERFMON_REG_MASK U(0xFF) 76*91f16700Schasinglulu #define UNCORE_PERFMON_CTR_MASK U(0xFF) 77*91f16700Schasinglulu #define UNCORE_PERFMON_RESP_STATUS_MASK U(0xFF) 78*91f16700Schasinglulu 79*91f16700Schasinglulu /******************************************************************************* 80*91f16700Schasinglulu * Structure populated by arch specific code to export routines which perform 81*91f16700Schasinglulu * common low level MCE functions 82*91f16700Schasinglulu ******************************************************************************/ 83*91f16700Schasinglulu typedef struct arch_mce_ops { 84*91f16700Schasinglulu /* 85*91f16700Schasinglulu * This ARI request sets up the MCE to start execution on assertion 86*91f16700Schasinglulu * of STANDBYWFI, update the core power state and expected wake time, 87*91f16700Schasinglulu * then determine the proper power state to enter. 88*91f16700Schasinglulu */ 89*91f16700Schasinglulu int32_t (*enter_cstate)(uint32_t ari_base, uint32_t state, 90*91f16700Schasinglulu uint32_t wake_time); 91*91f16700Schasinglulu /* 92*91f16700Schasinglulu * This ARI request allows updating of the CLUSTER_CSTATE, 93*91f16700Schasinglulu * CCPLEX_CSTATE, and SYSTEM_CSTATE register values. 94*91f16700Schasinglulu */ 95*91f16700Schasinglulu int32_t (*update_cstate_info)(uint32_t ari_base, 96*91f16700Schasinglulu uint32_t cluster, 97*91f16700Schasinglulu uint32_t ccplex, 98*91f16700Schasinglulu uint32_t system, 99*91f16700Schasinglulu uint8_t sys_state_force, 100*91f16700Schasinglulu uint32_t wake_mask, 101*91f16700Schasinglulu uint8_t update_wake_mask); 102*91f16700Schasinglulu /* 103*91f16700Schasinglulu * This ARI request allows updating of power state crossover 104*91f16700Schasinglulu * threshold times. An index value specifies which crossover 105*91f16700Schasinglulu * state is being updated. 106*91f16700Schasinglulu */ 107*91f16700Schasinglulu int32_t (*update_crossover_time)(uint32_t ari_base, 108*91f16700Schasinglulu uint32_t type, 109*91f16700Schasinglulu uint32_t time); 110*91f16700Schasinglulu /* 111*91f16700Schasinglulu * This ARI request allows read access to statistical information 112*91f16700Schasinglulu * related to power states. 113*91f16700Schasinglulu */ 114*91f16700Schasinglulu uint64_t (*read_cstate_stats)(uint32_t ari_base, 115*91f16700Schasinglulu uint32_t state); 116*91f16700Schasinglulu /* 117*91f16700Schasinglulu * This ARI request allows write access to statistical information 118*91f16700Schasinglulu * related to power states. 119*91f16700Schasinglulu */ 120*91f16700Schasinglulu int32_t (*write_cstate_stats)(uint32_t ari_base, 121*91f16700Schasinglulu uint32_t state, 122*91f16700Schasinglulu uint32_t stats); 123*91f16700Schasinglulu /* 124*91f16700Schasinglulu * This ARI request allows the CPU to understand the features 125*91f16700Schasinglulu * supported by the MCE firmware. 126*91f16700Schasinglulu */ 127*91f16700Schasinglulu uint64_t (*call_enum_misc)(uint32_t ari_base, uint32_t cmd, 128*91f16700Schasinglulu uint32_t data); 129*91f16700Schasinglulu /* 130*91f16700Schasinglulu * This ARI request allows querying the CCPLEX to determine if 131*91f16700Schasinglulu * the CCx state is allowed given a target core C-state and wake 132*91f16700Schasinglulu * time. If the CCx state is allowed, the response indicates CCx 133*91f16700Schasinglulu * must be entered. If the CCx state is not allowed, the response 134*91f16700Schasinglulu * indicates CC6/CC7 can't be entered 135*91f16700Schasinglulu */ 136*91f16700Schasinglulu int32_t (*is_ccx_allowed)(uint32_t ari_base, uint32_t state, 137*91f16700Schasinglulu uint32_t wake_time); 138*91f16700Schasinglulu /* 139*91f16700Schasinglulu * This ARI request allows querying the CCPLEX to determine if 140*91f16700Schasinglulu * the SC7 state is allowed given a target core C-state and wake 141*91f16700Schasinglulu * time. If the SC7 state is allowed, all cores but the associated 142*91f16700Schasinglulu * core are offlined (WAKE_EVENTS are set to 0) and the response 143*91f16700Schasinglulu * indicates SC7 must be entered. If the SC7 state is not allowed, 144*91f16700Schasinglulu * the response indicates SC7 can't be entered 145*91f16700Schasinglulu */ 146*91f16700Schasinglulu int32_t (*is_sc7_allowed)(uint32_t ari_base, uint32_t state, 147*91f16700Schasinglulu uint32_t wake_time); 148*91f16700Schasinglulu /* 149*91f16700Schasinglulu * This ARI request allows a core to bring another offlined core 150*91f16700Schasinglulu * back online to the C0 state. Note that a core is offlined by 151*91f16700Schasinglulu * entering a C-state where the WAKE_MASK is all 0. 152*91f16700Schasinglulu */ 153*91f16700Schasinglulu int32_t (*online_core)(uint32_t ari_base, uint32_t cpuid); 154*91f16700Schasinglulu /* 155*91f16700Schasinglulu * This ARI request allows the CPU to enable/disable Auto-CC3 idle 156*91f16700Schasinglulu * state. 157*91f16700Schasinglulu */ 158*91f16700Schasinglulu int32_t (*cc3_ctrl)(uint32_t ari_base, 159*91f16700Schasinglulu uint32_t freq, 160*91f16700Schasinglulu uint32_t volt, 161*91f16700Schasinglulu uint8_t enable); 162*91f16700Schasinglulu /* 163*91f16700Schasinglulu * This ARI request allows updating the reset vector register for 164*91f16700Schasinglulu * D15 and A57 CPUs. 165*91f16700Schasinglulu */ 166*91f16700Schasinglulu int32_t (*update_reset_vector)(uint32_t ari_base); 167*91f16700Schasinglulu /* 168*91f16700Schasinglulu * This ARI request instructs the ROC to flush A57 data caches in 169*91f16700Schasinglulu * order to maintain coherency with the Denver cluster. 170*91f16700Schasinglulu */ 171*91f16700Schasinglulu int32_t (*roc_flush_cache)(uint32_t ari_base); 172*91f16700Schasinglulu /* 173*91f16700Schasinglulu * This ARI request instructs the ROC to flush A57 data caches along 174*91f16700Schasinglulu * with the caches covering ARM code in order to maintain coherency 175*91f16700Schasinglulu * with the Denver cluster. 176*91f16700Schasinglulu */ 177*91f16700Schasinglulu int32_t (*roc_flush_cache_trbits)(uint32_t ari_base); 178*91f16700Schasinglulu /* 179*91f16700Schasinglulu * This ARI request instructs the ROC to clean A57 data caches along 180*91f16700Schasinglulu * with the caches covering ARM code in order to maintain coherency 181*91f16700Schasinglulu * with the Denver cluster. 182*91f16700Schasinglulu */ 183*91f16700Schasinglulu int32_t (*roc_clean_cache)(uint32_t ari_base); 184*91f16700Schasinglulu /* 185*91f16700Schasinglulu * This ARI request reads/writes the Machine Check Arch. (MCA) 186*91f16700Schasinglulu * registers. 187*91f16700Schasinglulu */ 188*91f16700Schasinglulu uint64_t (*read_write_mca)(uint32_t ari_base, 189*91f16700Schasinglulu uint64_t cmd, 190*91f16700Schasinglulu uint64_t *data); 191*91f16700Schasinglulu /* 192*91f16700Schasinglulu * Some MC GSC (General Security Carveout) register values are 193*91f16700Schasinglulu * expected to be changed by TrustZone secure ARM code after boot. 194*91f16700Schasinglulu * Since there is no hardware mechanism for the CCPLEX to know 195*91f16700Schasinglulu * that an MC GSC register has changed to allow it to update its 196*91f16700Schasinglulu * own internal GSC register, there needs to be a mechanism that 197*91f16700Schasinglulu * can be used by ARM code to cause the CCPLEX to update its GSC 198*91f16700Schasinglulu * register value. This ARI request allows updating the GSC register 199*91f16700Schasinglulu * value for a certain carveout in the CCPLEX. 200*91f16700Schasinglulu */ 201*91f16700Schasinglulu int32_t (*update_ccplex_gsc)(uint32_t ari_base, uint32_t gsc_idx); 202*91f16700Schasinglulu /* 203*91f16700Schasinglulu * This ARI request instructs the CCPLEX to either shutdown or 204*91f16700Schasinglulu * reset the entire system 205*91f16700Schasinglulu */ 206*91f16700Schasinglulu void (*enter_ccplex_state)(uint32_t ari_base, uint32_t state_idx); 207*91f16700Schasinglulu /* 208*91f16700Schasinglulu * This ARI request reads/writes data from/to Uncore PERFMON 209*91f16700Schasinglulu * registers 210*91f16700Schasinglulu */ 211*91f16700Schasinglulu int32_t (*read_write_uncore_perfmon)(uint32_t ari_base, 212*91f16700Schasinglulu uint64_t req, uint64_t *data); 213*91f16700Schasinglulu /* 214*91f16700Schasinglulu * This ARI implements ARI_MISC_CCPLEX commands. This can be 215*91f16700Schasinglulu * used to enable/disable coresight clock gating. 216*91f16700Schasinglulu */ 217*91f16700Schasinglulu void (*misc_ccplex)(uint32_t ari_base, uint32_t index, 218*91f16700Schasinglulu uint32_t value); 219*91f16700Schasinglulu } arch_mce_ops_t; 220*91f16700Schasinglulu 221*91f16700Schasinglulu /* declarations for ARI/NVG handler functions */ 222*91f16700Schasinglulu int32_t ari_enter_cstate(uint32_t ari_base, uint32_t state, uint32_t wake_time); 223*91f16700Schasinglulu int32_t ari_update_cstate_info(uint32_t ari_base, uint32_t cluster, uint32_t ccplex, 224*91f16700Schasinglulu uint32_t system, uint8_t sys_state_force, uint32_t wake_mask, 225*91f16700Schasinglulu uint8_t update_wake_mask); 226*91f16700Schasinglulu int32_t ari_update_crossover_time(uint32_t ari_base, uint32_t type, uint32_t time); 227*91f16700Schasinglulu uint64_t ari_read_cstate_stats(uint32_t ari_base, uint32_t state); 228*91f16700Schasinglulu int32_t ari_write_cstate_stats(uint32_t ari_base, uint32_t state, uint32_t stats); 229*91f16700Schasinglulu uint64_t ari_enumeration_misc(uint32_t ari_base, uint32_t cmd, uint32_t data); 230*91f16700Schasinglulu int32_t ari_is_ccx_allowed(uint32_t ari_base, uint32_t state, uint32_t wake_time); 231*91f16700Schasinglulu int32_t ari_is_sc7_allowed(uint32_t ari_base, uint32_t state, uint32_t wake_time); 232*91f16700Schasinglulu int32_t ari_online_core(uint32_t ari_base, uint32_t core); 233*91f16700Schasinglulu int32_t ari_cc3_ctrl(uint32_t ari_base, uint32_t freq, uint32_t volt, uint8_t enable); 234*91f16700Schasinglulu int32_t ari_reset_vector_update(uint32_t ari_base); 235*91f16700Schasinglulu int32_t ari_roc_flush_cache_trbits(uint32_t ari_base); 236*91f16700Schasinglulu int32_t ari_roc_flush_cache(uint32_t ari_base); 237*91f16700Schasinglulu int32_t ari_roc_clean_cache(uint32_t ari_base); 238*91f16700Schasinglulu uint64_t ari_read_write_mca(uint32_t ari_base, uint64_t cmd, uint64_t *data); 239*91f16700Schasinglulu int32_t ari_update_ccplex_gsc(uint32_t ari_base, uint32_t gsc_idx); 240*91f16700Schasinglulu void ari_enter_ccplex_state(uint32_t ari_base, uint32_t state_idx); 241*91f16700Schasinglulu int32_t ari_read_write_uncore_perfmon(uint32_t ari_base, 242*91f16700Schasinglulu uint64_t req, uint64_t *data); 243*91f16700Schasinglulu void ari_misc_ccplex(uint32_t ari_base, uint32_t index, uint32_t value); 244*91f16700Schasinglulu 245*91f16700Schasinglulu int32_t nvg_enter_cstate(uint32_t ari_base, uint32_t state, uint32_t wake_time); 246*91f16700Schasinglulu int32_t nvg_update_cstate_info(uint32_t ari_base, uint32_t cluster, uint32_t ccplex, 247*91f16700Schasinglulu uint32_t system, uint8_t sys_state_force, uint32_t wake_mask, 248*91f16700Schasinglulu uint8_t update_wake_mask); 249*91f16700Schasinglulu int32_t nvg_update_crossover_time(uint32_t ari_base, uint32_t type, uint32_t time); 250*91f16700Schasinglulu uint64_t nvg_read_cstate_stats(uint32_t ari_base, uint32_t state); 251*91f16700Schasinglulu int32_t nvg_write_cstate_stats(uint32_t ari_base, uint32_t state, uint32_t stats); 252*91f16700Schasinglulu int32_t nvg_is_ccx_allowed(uint32_t ari_base, uint32_t state, uint32_t wake_time); 253*91f16700Schasinglulu int32_t nvg_is_sc7_allowed(uint32_t ari_base, uint32_t state, uint32_t wake_time); 254*91f16700Schasinglulu int32_t nvg_online_core(uint32_t ari_base, uint32_t core); 255*91f16700Schasinglulu int32_t nvg_cc3_ctrl(uint32_t ari_base, uint32_t freq, uint32_t volt, uint8_t enable); 256*91f16700Schasinglulu 257*91f16700Schasinglulu extern void nvg_set_request_data(uint64_t req, uint64_t data); 258*91f16700Schasinglulu extern void nvg_set_request(uint64_t req); 259*91f16700Schasinglulu extern uint64_t nvg_get_result(void); 260*91f16700Schasinglulu #endif /* MCE_PRIVATE_H */ 261