1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
27520fa99SSuzuki K Poulose /*
37520fa99SSuzuki K Poulose  * ARM DynamIQ Shared Unit (DSU) PMU Low level register access routines.
47520fa99SSuzuki K Poulose  *
57520fa99SSuzuki K Poulose  * Copyright (C) ARM Limited, 2017.
67520fa99SSuzuki K Poulose  *
77520fa99SSuzuki K Poulose  * Author: Suzuki K Poulose <suzuki.poulose@arm.com>
87520fa99SSuzuki K Poulose  */
97520fa99SSuzuki K Poulose 
107520fa99SSuzuki K Poulose #include <linux/bitops.h>
117520fa99SSuzuki K Poulose #include <linux/build_bug.h>
127520fa99SSuzuki K Poulose #include <linux/compiler.h>
137520fa99SSuzuki K Poulose #include <linux/types.h>
147520fa99SSuzuki K Poulose #include <asm/barrier.h>
157520fa99SSuzuki K Poulose #include <asm/sysreg.h>
167520fa99SSuzuki K Poulose 
177520fa99SSuzuki K Poulose 
187520fa99SSuzuki K Poulose #define CLUSTERPMCR_EL1			sys_reg(3, 0, 15, 5, 0)
197520fa99SSuzuki K Poulose #define CLUSTERPMCNTENSET_EL1		sys_reg(3, 0, 15, 5, 1)
207520fa99SSuzuki K Poulose #define CLUSTERPMCNTENCLR_EL1		sys_reg(3, 0, 15, 5, 2)
217520fa99SSuzuki K Poulose #define CLUSTERPMOVSSET_EL1		sys_reg(3, 0, 15, 5, 3)
227520fa99SSuzuki K Poulose #define CLUSTERPMOVSCLR_EL1		sys_reg(3, 0, 15, 5, 4)
237520fa99SSuzuki K Poulose #define CLUSTERPMSELR_EL1		sys_reg(3, 0, 15, 5, 5)
247520fa99SSuzuki K Poulose #define CLUSTERPMINTENSET_EL1		sys_reg(3, 0, 15, 5, 6)
257520fa99SSuzuki K Poulose #define CLUSTERPMINTENCLR_EL1		sys_reg(3, 0, 15, 5, 7)
267520fa99SSuzuki K Poulose #define CLUSTERPMCCNTR_EL1		sys_reg(3, 0, 15, 6, 0)
277520fa99SSuzuki K Poulose #define CLUSTERPMXEVTYPER_EL1		sys_reg(3, 0, 15, 6, 1)
287520fa99SSuzuki K Poulose #define CLUSTERPMXEVCNTR_EL1		sys_reg(3, 0, 15, 6, 2)
297520fa99SSuzuki K Poulose #define CLUSTERPMMDCR_EL1		sys_reg(3, 0, 15, 6, 3)
307520fa99SSuzuki K Poulose #define CLUSTERPMCEID0_EL1		sys_reg(3, 0, 15, 6, 4)
317520fa99SSuzuki K Poulose #define CLUSTERPMCEID1_EL1		sys_reg(3, 0, 15, 6, 5)
327520fa99SSuzuki K Poulose 
__dsu_pmu_read_pmcr(void)337520fa99SSuzuki K Poulose static inline u32 __dsu_pmu_read_pmcr(void)
347520fa99SSuzuki K Poulose {
357520fa99SSuzuki K Poulose 	return read_sysreg_s(CLUSTERPMCR_EL1);
367520fa99SSuzuki K Poulose }
377520fa99SSuzuki K Poulose 
__dsu_pmu_write_pmcr(u32 val)387520fa99SSuzuki K Poulose static inline void __dsu_pmu_write_pmcr(u32 val)
397520fa99SSuzuki K Poulose {
407520fa99SSuzuki K Poulose 	write_sysreg_s(val, CLUSTERPMCR_EL1);
417520fa99SSuzuki K Poulose 	isb();
427520fa99SSuzuki K Poulose }
437520fa99SSuzuki K Poulose 
__dsu_pmu_get_reset_overflow(void)447520fa99SSuzuki K Poulose static inline u32 __dsu_pmu_get_reset_overflow(void)
457520fa99SSuzuki K Poulose {
467520fa99SSuzuki K Poulose 	u32 val = read_sysreg_s(CLUSTERPMOVSCLR_EL1);
477520fa99SSuzuki K Poulose 	/* Clear the bit */
487520fa99SSuzuki K Poulose 	write_sysreg_s(val, CLUSTERPMOVSCLR_EL1);
497520fa99SSuzuki K Poulose 	isb();
507520fa99SSuzuki K Poulose 	return val;
517520fa99SSuzuki K Poulose }
527520fa99SSuzuki K Poulose 
__dsu_pmu_select_counter(int counter)537520fa99SSuzuki K Poulose static inline void __dsu_pmu_select_counter(int counter)
547520fa99SSuzuki K Poulose {
557520fa99SSuzuki K Poulose 	write_sysreg_s(counter, CLUSTERPMSELR_EL1);
567520fa99SSuzuki K Poulose 	isb();
577520fa99SSuzuki K Poulose }
587520fa99SSuzuki K Poulose 
__dsu_pmu_read_counter(int counter)597520fa99SSuzuki K Poulose static inline u64 __dsu_pmu_read_counter(int counter)
607520fa99SSuzuki K Poulose {
617520fa99SSuzuki K Poulose 	__dsu_pmu_select_counter(counter);
627520fa99SSuzuki K Poulose 	return read_sysreg_s(CLUSTERPMXEVCNTR_EL1);
637520fa99SSuzuki K Poulose }
647520fa99SSuzuki K Poulose 
__dsu_pmu_write_counter(int counter,u64 val)657520fa99SSuzuki K Poulose static inline void __dsu_pmu_write_counter(int counter, u64 val)
667520fa99SSuzuki K Poulose {
677520fa99SSuzuki K Poulose 	__dsu_pmu_select_counter(counter);
687520fa99SSuzuki K Poulose 	write_sysreg_s(val, CLUSTERPMXEVCNTR_EL1);
697520fa99SSuzuki K Poulose 	isb();
707520fa99SSuzuki K Poulose }
717520fa99SSuzuki K Poulose 
__dsu_pmu_set_event(int counter,u32 event)727520fa99SSuzuki K Poulose static inline void __dsu_pmu_set_event(int counter, u32 event)
737520fa99SSuzuki K Poulose {
747520fa99SSuzuki K Poulose 	__dsu_pmu_select_counter(counter);
757520fa99SSuzuki K Poulose 	write_sysreg_s(event, CLUSTERPMXEVTYPER_EL1);
767520fa99SSuzuki K Poulose 	isb();
777520fa99SSuzuki K Poulose }
787520fa99SSuzuki K Poulose 
__dsu_pmu_read_pmccntr(void)797520fa99SSuzuki K Poulose static inline u64 __dsu_pmu_read_pmccntr(void)
807520fa99SSuzuki K Poulose {
817520fa99SSuzuki K Poulose 	return read_sysreg_s(CLUSTERPMCCNTR_EL1);
827520fa99SSuzuki K Poulose }
837520fa99SSuzuki K Poulose 
__dsu_pmu_write_pmccntr(u64 val)847520fa99SSuzuki K Poulose static inline void __dsu_pmu_write_pmccntr(u64 val)
857520fa99SSuzuki K Poulose {
867520fa99SSuzuki K Poulose 	write_sysreg_s(val, CLUSTERPMCCNTR_EL1);
877520fa99SSuzuki K Poulose 	isb();
887520fa99SSuzuki K Poulose }
897520fa99SSuzuki K Poulose 
__dsu_pmu_disable_counter(int counter)907520fa99SSuzuki K Poulose static inline void __dsu_pmu_disable_counter(int counter)
917520fa99SSuzuki K Poulose {
927520fa99SSuzuki K Poulose 	write_sysreg_s(BIT(counter), CLUSTERPMCNTENCLR_EL1);
937520fa99SSuzuki K Poulose 	isb();
947520fa99SSuzuki K Poulose }
957520fa99SSuzuki K Poulose 
__dsu_pmu_enable_counter(int counter)967520fa99SSuzuki K Poulose static inline void __dsu_pmu_enable_counter(int counter)
977520fa99SSuzuki K Poulose {
987520fa99SSuzuki K Poulose 	write_sysreg_s(BIT(counter), CLUSTERPMCNTENSET_EL1);
997520fa99SSuzuki K Poulose 	isb();
1007520fa99SSuzuki K Poulose }
1017520fa99SSuzuki K Poulose 
__dsu_pmu_counter_interrupt_enable(int counter)1027520fa99SSuzuki K Poulose static inline void __dsu_pmu_counter_interrupt_enable(int counter)
1037520fa99SSuzuki K Poulose {
1047520fa99SSuzuki K Poulose 	write_sysreg_s(BIT(counter), CLUSTERPMINTENSET_EL1);
1057520fa99SSuzuki K Poulose 	isb();
1067520fa99SSuzuki K Poulose }
1077520fa99SSuzuki K Poulose 
__dsu_pmu_counter_interrupt_disable(int counter)1087520fa99SSuzuki K Poulose static inline void __dsu_pmu_counter_interrupt_disable(int counter)
1097520fa99SSuzuki K Poulose {
1107520fa99SSuzuki K Poulose 	write_sysreg_s(BIT(counter), CLUSTERPMINTENCLR_EL1);
1117520fa99SSuzuki K Poulose 	isb();
1127520fa99SSuzuki K Poulose }
1137520fa99SSuzuki K Poulose 
1147520fa99SSuzuki K Poulose 
__dsu_pmu_read_pmceid(int n)1157520fa99SSuzuki K Poulose static inline u32 __dsu_pmu_read_pmceid(int n)
1167520fa99SSuzuki K Poulose {
1177520fa99SSuzuki K Poulose 	switch (n) {
1187520fa99SSuzuki K Poulose 	case 0:
1197520fa99SSuzuki K Poulose 		return read_sysreg_s(CLUSTERPMCEID0_EL1);
1207520fa99SSuzuki K Poulose 	case 1:
1217520fa99SSuzuki K Poulose 		return read_sysreg_s(CLUSTERPMCEID1_EL1);
1227520fa99SSuzuki K Poulose 	default:
1237520fa99SSuzuki K Poulose 		BUILD_BUG();
1247520fa99SSuzuki K Poulose 		return 0;
1257520fa99SSuzuki K Poulose 	}
1267520fa99SSuzuki K Poulose }
127