xref: /openbmc/linux/arch/arm64/include/asm/arm_pmuv3.h (revision df29ddf4)
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