1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * exynos_ppmu.h - Exynos PPMU header file 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2015 Samsung Electronics Co., Ltd. 6*4882a593Smuzhiyun * Author : Chanwoo Choi <cw00.choi@samsung.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __EXYNOS_PPMU_H__ 10*4882a593Smuzhiyun #define __EXYNOS_PPMU_H__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun enum ppmu_state { 13*4882a593Smuzhiyun PPMU_DISABLE = 0, 14*4882a593Smuzhiyun PPMU_ENABLE, 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun enum ppmu_counter { 18*4882a593Smuzhiyun PPMU_PMNCNT0 = 0, 19*4882a593Smuzhiyun PPMU_PMNCNT1, 20*4882a593Smuzhiyun PPMU_PMNCNT2, 21*4882a593Smuzhiyun PPMU_PMNCNT3, 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun PPMU_PMNCNT_MAX, 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /*** 27*4882a593Smuzhiyun * PPMUv1.1 Definitions 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun enum ppmu_event_type { 30*4882a593Smuzhiyun PPMU_RO_BUSY_CYCLE_CNT = 0x0, 31*4882a593Smuzhiyun PPMU_WO_BUSY_CYCLE_CNT = 0x1, 32*4882a593Smuzhiyun PPMU_RW_BUSY_CYCLE_CNT = 0x2, 33*4882a593Smuzhiyun PPMU_RO_REQUEST_CNT = 0x3, 34*4882a593Smuzhiyun PPMU_WO_REQUEST_CNT = 0x4, 35*4882a593Smuzhiyun PPMU_RO_DATA_CNT = 0x5, 36*4882a593Smuzhiyun PPMU_WO_DATA_CNT = 0x6, 37*4882a593Smuzhiyun PPMU_RO_LATENCY = 0x12, 38*4882a593Smuzhiyun PPMU_WO_LATENCY = 0x16, 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun enum ppmu_reg { 42*4882a593Smuzhiyun /* PPC control register */ 43*4882a593Smuzhiyun PPMU_PMNC = 0x00, 44*4882a593Smuzhiyun PPMU_CNTENS = 0x10, 45*4882a593Smuzhiyun PPMU_CNTENC = 0x20, 46*4882a593Smuzhiyun PPMU_INTENS = 0x30, 47*4882a593Smuzhiyun PPMU_INTENC = 0x40, 48*4882a593Smuzhiyun PPMU_FLAG = 0x50, 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* Cycle Counter and Performance Event Counter Register */ 51*4882a593Smuzhiyun PPMU_CCNT = 0x100, 52*4882a593Smuzhiyun PPMU_PMCNT0 = 0x110, 53*4882a593Smuzhiyun PPMU_PMCNT1 = 0x120, 54*4882a593Smuzhiyun PPMU_PMCNT2 = 0x130, 55*4882a593Smuzhiyun PPMU_PMCNT3_HIGH = 0x140, 56*4882a593Smuzhiyun PPMU_PMCNT3_LOW = 0x150, 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Bus Event Generator */ 59*4882a593Smuzhiyun PPMU_BEVT0SEL = 0x1000, 60*4882a593Smuzhiyun PPMU_BEVT1SEL = 0x1100, 61*4882a593Smuzhiyun PPMU_BEVT2SEL = 0x1200, 62*4882a593Smuzhiyun PPMU_BEVT3SEL = 0x1300, 63*4882a593Smuzhiyun PPMU_COUNTER_RESET = 0x1810, 64*4882a593Smuzhiyun PPMU_READ_OVERFLOW_CNT = 0x1810, 65*4882a593Smuzhiyun PPMU_READ_UNDERFLOW_CNT = 0x1814, 66*4882a593Smuzhiyun PPMU_WRITE_OVERFLOW_CNT = 0x1850, 67*4882a593Smuzhiyun PPMU_WRITE_UNDERFLOW_CNT = 0x1854, 68*4882a593Smuzhiyun PPMU_READ_PENDING_CNT = 0x1880, 69*4882a593Smuzhiyun PPMU_WRITE_PENDING_CNT = 0x1884 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* PMNC register */ 73*4882a593Smuzhiyun #define PPMU_PMNC_CC_RESET_SHIFT 2 74*4882a593Smuzhiyun #define PPMU_PMNC_COUNTER_RESET_SHIFT 1 75*4882a593Smuzhiyun #define PPMU_PMNC_ENABLE_SHIFT 0 76*4882a593Smuzhiyun #define PPMU_PMNC_START_MODE_MASK BIT(16) 77*4882a593Smuzhiyun #define PPMU_PMNC_CC_DIVIDER_MASK BIT(3) 78*4882a593Smuzhiyun #define PPMU_PMNC_CC_RESET_MASK BIT(2) 79*4882a593Smuzhiyun #define PPMU_PMNC_COUNTER_RESET_MASK BIT(1) 80*4882a593Smuzhiyun #define PPMU_PMNC_ENABLE_MASK BIT(0) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* CNTENS/CNTENC/INTENS/INTENC/FLAG register */ 83*4882a593Smuzhiyun #define PPMU_CCNT_MASK BIT(31) 84*4882a593Smuzhiyun #define PPMU_PMCNT3_MASK BIT(3) 85*4882a593Smuzhiyun #define PPMU_PMCNT2_MASK BIT(2) 86*4882a593Smuzhiyun #define PPMU_PMCNT1_MASK BIT(1) 87*4882a593Smuzhiyun #define PPMU_PMCNT0_MASK BIT(0) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* PPMU_PMNCTx/PPMU_BETxSEL registers */ 90*4882a593Smuzhiyun #define PPMU_PMNCT(x) (PPMU_PMCNT0 + (0x10 * x)) 91*4882a593Smuzhiyun #define PPMU_BEVTxSEL(x) (PPMU_BEVT0SEL + (0x100 * x)) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /*** 94*4882a593Smuzhiyun * PPMU_V2.0 definitions 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun enum ppmu_v2_mode { 97*4882a593Smuzhiyun PPMU_V2_MODE_MANUAL = 0, 98*4882a593Smuzhiyun PPMU_V2_MODE_AUTO = 1, 99*4882a593Smuzhiyun PPMU_V2_MODE_CIG = 2, /* CIG (Conditional Interrupt Generation) */ 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun enum ppmu_v2_event_type { 103*4882a593Smuzhiyun PPMU_V2_RO_DATA_CNT = 0x4, 104*4882a593Smuzhiyun PPMU_V2_WO_DATA_CNT = 0x5, 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun PPMU_V2_EVT3_RW_DATA_CNT = 0x22, /* Only for Event3 */ 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun enum ppmu_V2_reg { 110*4882a593Smuzhiyun /* PPC control register */ 111*4882a593Smuzhiyun PPMU_V2_PMNC = 0x04, 112*4882a593Smuzhiyun PPMU_V2_CNTENS = 0x08, 113*4882a593Smuzhiyun PPMU_V2_CNTENC = 0x0c, 114*4882a593Smuzhiyun PPMU_V2_INTENS = 0x10, 115*4882a593Smuzhiyun PPMU_V2_INTENC = 0x14, 116*4882a593Smuzhiyun PPMU_V2_FLAG = 0x18, 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* Cycle Counter and Performance Event Counter Register */ 119*4882a593Smuzhiyun PPMU_V2_CCNT = 0x48, 120*4882a593Smuzhiyun PPMU_V2_PMCNT0 = 0x34, 121*4882a593Smuzhiyun PPMU_V2_PMCNT1 = 0x38, 122*4882a593Smuzhiyun PPMU_V2_PMCNT2 = 0x3c, 123*4882a593Smuzhiyun PPMU_V2_PMCNT3_LOW = 0x40, 124*4882a593Smuzhiyun PPMU_V2_PMCNT3_HIGH = 0x44, 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Bus Event Generator */ 127*4882a593Smuzhiyun PPMU_V2_CIG_CFG0 = 0x1c, 128*4882a593Smuzhiyun PPMU_V2_CIG_CFG1 = 0x20, 129*4882a593Smuzhiyun PPMU_V2_CIG_CFG2 = 0x24, 130*4882a593Smuzhiyun PPMU_V2_CIG_RESULT = 0x28, 131*4882a593Smuzhiyun PPMU_V2_CNT_RESET = 0x2c, 132*4882a593Smuzhiyun PPMU_V2_CNT_AUTO = 0x30, 133*4882a593Smuzhiyun PPMU_V2_CH_EV0_TYPE = 0x200, 134*4882a593Smuzhiyun PPMU_V2_CH_EV1_TYPE = 0x204, 135*4882a593Smuzhiyun PPMU_V2_CH_EV2_TYPE = 0x208, 136*4882a593Smuzhiyun PPMU_V2_CH_EV3_TYPE = 0x20c, 137*4882a593Smuzhiyun PPMU_V2_SM_ID_V = 0x220, 138*4882a593Smuzhiyun PPMU_V2_SM_ID_A = 0x224, 139*4882a593Smuzhiyun PPMU_V2_SM_OTHERS_V = 0x228, 140*4882a593Smuzhiyun PPMU_V2_SM_OTHERS_A = 0x22c, 141*4882a593Smuzhiyun PPMU_V2_INTERRUPT_RESET = 0x260, 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* PMNC register */ 145*4882a593Smuzhiyun #define PPMU_V2_PMNC_START_MODE_SHIFT 20 146*4882a593Smuzhiyun #define PPMU_V2_PMNC_START_MODE_MASK (0x3 << PPMU_V2_PMNC_START_MODE_SHIFT) 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define PPMU_PMNC_CC_RESET_SHIFT 2 149*4882a593Smuzhiyun #define PPMU_PMNC_COUNTER_RESET_SHIFT 1 150*4882a593Smuzhiyun #define PPMU_PMNC_ENABLE_SHIFT 0 151*4882a593Smuzhiyun #define PPMU_PMNC_START_MODE_MASK BIT(16) 152*4882a593Smuzhiyun #define PPMU_PMNC_CC_DIVIDER_MASK BIT(3) 153*4882a593Smuzhiyun #define PPMU_PMNC_CC_RESET_MASK BIT(2) 154*4882a593Smuzhiyun #define PPMU_PMNC_COUNTER_RESET_MASK BIT(1) 155*4882a593Smuzhiyun #define PPMU_PMNC_ENABLE_MASK BIT(0) 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #define PPMU_V2_PMNCT(x) (PPMU_V2_PMCNT0 + (0x4 * x)) 158*4882a593Smuzhiyun #define PPMU_V2_CH_EVx_TYPE(x) (PPMU_V2_CH_EV0_TYPE + (0x4 * x)) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #endif /* __EXYNOS_PPMU_H__ */ 161