1*df29ddf4SMarc Zyngier /* SPDX-License-Identifier: GPL-2.0 */ 2*df29ddf4SMarc Zyngier /* 3*df29ddf4SMarc Zyngier * Copyright (C) 2012 ARM Ltd. 4*df29ddf4SMarc Zyngier */ 5*df29ddf4SMarc Zyngier 6*df29ddf4SMarc Zyngier #ifndef __ASM_PMUV3_H 7*df29ddf4SMarc Zyngier #define __ASM_PMUV3_H 8*df29ddf4SMarc Zyngier 9*df29ddf4SMarc Zyngier #include <asm/cpufeature.h> 10*df29ddf4SMarc Zyngier #include <asm/sysreg.h> 11*df29ddf4SMarc Zyngier 12*df29ddf4SMarc Zyngier #define RETURN_READ_PMEVCNTRN(n) \ 13*df29ddf4SMarc Zyngier return read_sysreg(pmevcntr##n##_el0) 14*df29ddf4SMarc Zyngier static unsigned long read_pmevcntrn(int n) 15*df29ddf4SMarc Zyngier { 16*df29ddf4SMarc Zyngier PMEVN_SWITCH(n, RETURN_READ_PMEVCNTRN); 17*df29ddf4SMarc Zyngier return 0; 18*df29ddf4SMarc Zyngier } 19*df29ddf4SMarc Zyngier 20*df29ddf4SMarc Zyngier #define WRITE_PMEVCNTRN(n) \ 21*df29ddf4SMarc Zyngier write_sysreg(val, pmevcntr##n##_el0) 22*df29ddf4SMarc Zyngier static void write_pmevcntrn(int n, unsigned long val) 23*df29ddf4SMarc Zyngier { 24*df29ddf4SMarc Zyngier PMEVN_SWITCH(n, WRITE_PMEVCNTRN); 25*df29ddf4SMarc Zyngier } 26*df29ddf4SMarc Zyngier 27*df29ddf4SMarc Zyngier #define WRITE_PMEVTYPERN(n) \ 28*df29ddf4SMarc Zyngier write_sysreg(val, pmevtyper##n##_el0) 29*df29ddf4SMarc Zyngier static void write_pmevtypern(int n, unsigned long val) 30*df29ddf4SMarc Zyngier { 31*df29ddf4SMarc Zyngier PMEVN_SWITCH(n, WRITE_PMEVTYPERN); 32*df29ddf4SMarc Zyngier } 33*df29ddf4SMarc Zyngier 34*df29ddf4SMarc Zyngier static inline unsigned long read_pmmir(void) 35*df29ddf4SMarc Zyngier { 36*df29ddf4SMarc Zyngier return read_cpuid(PMMIR_EL1); 37*df29ddf4SMarc Zyngier } 38*df29ddf4SMarc Zyngier 39*df29ddf4SMarc Zyngier static inline u32 read_pmuver(void) 40*df29ddf4SMarc Zyngier { 41*df29ddf4SMarc Zyngier u64 dfr0 = read_sysreg(id_aa64dfr0_el1); 42*df29ddf4SMarc Zyngier 43*df29ddf4SMarc Zyngier return cpuid_feature_extract_unsigned_field(dfr0, 44*df29ddf4SMarc Zyngier ID_AA64DFR0_EL1_PMUVer_SHIFT); 45*df29ddf4SMarc Zyngier } 46*df29ddf4SMarc Zyngier 47*df29ddf4SMarc Zyngier static inline void write_pmcr(u32 val) 48*df29ddf4SMarc Zyngier { 49*df29ddf4SMarc Zyngier write_sysreg(val, pmcr_el0); 50*df29ddf4SMarc Zyngier } 51*df29ddf4SMarc Zyngier 52*df29ddf4SMarc Zyngier static inline u32 read_pmcr(void) 53*df29ddf4SMarc Zyngier { 54*df29ddf4SMarc Zyngier return read_sysreg(pmcr_el0); 55*df29ddf4SMarc Zyngier } 56*df29ddf4SMarc Zyngier 57*df29ddf4SMarc Zyngier static inline void write_pmselr(u32 val) 58*df29ddf4SMarc Zyngier { 59*df29ddf4SMarc Zyngier write_sysreg(val, pmselr_el0); 60*df29ddf4SMarc Zyngier } 61*df29ddf4SMarc Zyngier 62*df29ddf4SMarc Zyngier static inline void write_pmccntr(u64 val) 63*df29ddf4SMarc Zyngier { 64*df29ddf4SMarc Zyngier write_sysreg(val, pmccntr_el0); 65*df29ddf4SMarc Zyngier } 66*df29ddf4SMarc Zyngier 67*df29ddf4SMarc Zyngier static inline u64 read_pmccntr(void) 68*df29ddf4SMarc Zyngier { 69*df29ddf4SMarc Zyngier return read_sysreg(pmccntr_el0); 70*df29ddf4SMarc Zyngier } 71*df29ddf4SMarc Zyngier 72*df29ddf4SMarc Zyngier static inline void write_pmxevcntr(u32 val) 73*df29ddf4SMarc Zyngier { 74*df29ddf4SMarc Zyngier write_sysreg(val, pmxevcntr_el0); 75*df29ddf4SMarc Zyngier } 76*df29ddf4SMarc Zyngier 77*df29ddf4SMarc Zyngier static inline u32 read_pmxevcntr(void) 78*df29ddf4SMarc Zyngier { 79*df29ddf4SMarc Zyngier return read_sysreg(pmxevcntr_el0); 80*df29ddf4SMarc Zyngier } 81*df29ddf4SMarc Zyngier 82*df29ddf4SMarc Zyngier static inline void write_pmxevtyper(u32 val) 83*df29ddf4SMarc Zyngier { 84*df29ddf4SMarc Zyngier write_sysreg(val, pmxevtyper_el0); 85*df29ddf4SMarc Zyngier } 86*df29ddf4SMarc Zyngier 87*df29ddf4SMarc Zyngier static inline void write_pmcntenset(u32 val) 88*df29ddf4SMarc Zyngier { 89*df29ddf4SMarc Zyngier write_sysreg(val, pmcntenset_el0); 90*df29ddf4SMarc Zyngier } 91*df29ddf4SMarc Zyngier 92*df29ddf4SMarc Zyngier static inline void write_pmcntenclr(u32 val) 93*df29ddf4SMarc Zyngier { 94*df29ddf4SMarc Zyngier write_sysreg(val, pmcntenclr_el0); 95*df29ddf4SMarc Zyngier } 96*df29ddf4SMarc Zyngier 97*df29ddf4SMarc Zyngier static inline void write_pmintenset(u32 val) 98*df29ddf4SMarc Zyngier { 99*df29ddf4SMarc Zyngier write_sysreg(val, pmintenset_el1); 100*df29ddf4SMarc Zyngier } 101*df29ddf4SMarc Zyngier 102*df29ddf4SMarc Zyngier static inline void write_pmintenclr(u32 val) 103*df29ddf4SMarc Zyngier { 104*df29ddf4SMarc Zyngier write_sysreg(val, pmintenclr_el1); 105*df29ddf4SMarc Zyngier } 106*df29ddf4SMarc Zyngier 107*df29ddf4SMarc Zyngier static inline void write_pmccfiltr(u32 val) 108*df29ddf4SMarc Zyngier { 109*df29ddf4SMarc Zyngier write_sysreg(val, pmccfiltr_el0); 110*df29ddf4SMarc Zyngier } 111*df29ddf4SMarc Zyngier 112*df29ddf4SMarc Zyngier static inline void write_pmovsclr(u32 val) 113*df29ddf4SMarc Zyngier { 114*df29ddf4SMarc Zyngier write_sysreg(val, pmovsclr_el0); 115*df29ddf4SMarc Zyngier } 116*df29ddf4SMarc Zyngier 117*df29ddf4SMarc Zyngier static inline u32 read_pmovsclr(void) 118*df29ddf4SMarc Zyngier { 119*df29ddf4SMarc Zyngier return read_sysreg(pmovsclr_el0); 120*df29ddf4SMarc Zyngier } 121*df29ddf4SMarc Zyngier 122*df29ddf4SMarc Zyngier static inline void write_pmuserenr(u32 val) 123*df29ddf4SMarc Zyngier { 124*df29ddf4SMarc Zyngier write_sysreg(val, pmuserenr_el0); 125*df29ddf4SMarc Zyngier } 126*df29ddf4SMarc Zyngier 127*df29ddf4SMarc Zyngier static inline u32 read_pmceid0(void) 128*df29ddf4SMarc Zyngier { 129*df29ddf4SMarc Zyngier return read_sysreg(pmceid0_el0); 130*df29ddf4SMarc Zyngier } 131*df29ddf4SMarc Zyngier 132*df29ddf4SMarc Zyngier static inline u32 read_pmceid1(void) 133*df29ddf4SMarc Zyngier { 134*df29ddf4SMarc Zyngier return read_sysreg(pmceid1_el0); 135*df29ddf4SMarc Zyngier } 136*df29ddf4SMarc Zyngier 137*df29ddf4SMarc Zyngier #endif 138