162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ARM DynamIQ Shared Unit (DSU) PMU Low level register access routines. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) ARM Limited, 2017. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Suzuki K Poulose <suzuki.poulose@arm.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/bitops.h> 1162306a36Sopenharmony_ci#include <linux/build_bug.h> 1262306a36Sopenharmony_ci#include <linux/compiler.h> 1362306a36Sopenharmony_ci#include <linux/types.h> 1462306a36Sopenharmony_ci#include <asm/barrier.h> 1562306a36Sopenharmony_ci#include <asm/sysreg.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define CLUSTERPMCR_EL1 sys_reg(3, 0, 15, 5, 0) 1962306a36Sopenharmony_ci#define CLUSTERPMCNTENSET_EL1 sys_reg(3, 0, 15, 5, 1) 2062306a36Sopenharmony_ci#define CLUSTERPMCNTENCLR_EL1 sys_reg(3, 0, 15, 5, 2) 2162306a36Sopenharmony_ci#define CLUSTERPMOVSSET_EL1 sys_reg(3, 0, 15, 5, 3) 2262306a36Sopenharmony_ci#define CLUSTERPMOVSCLR_EL1 sys_reg(3, 0, 15, 5, 4) 2362306a36Sopenharmony_ci#define CLUSTERPMSELR_EL1 sys_reg(3, 0, 15, 5, 5) 2462306a36Sopenharmony_ci#define CLUSTERPMINTENSET_EL1 sys_reg(3, 0, 15, 5, 6) 2562306a36Sopenharmony_ci#define CLUSTERPMINTENCLR_EL1 sys_reg(3, 0, 15, 5, 7) 2662306a36Sopenharmony_ci#define CLUSTERPMCCNTR_EL1 sys_reg(3, 0, 15, 6, 0) 2762306a36Sopenharmony_ci#define CLUSTERPMXEVTYPER_EL1 sys_reg(3, 0, 15, 6, 1) 2862306a36Sopenharmony_ci#define CLUSTERPMXEVCNTR_EL1 sys_reg(3, 0, 15, 6, 2) 2962306a36Sopenharmony_ci#define CLUSTERPMMDCR_EL1 sys_reg(3, 0, 15, 6, 3) 3062306a36Sopenharmony_ci#define CLUSTERPMCEID0_EL1 sys_reg(3, 0, 15, 6, 4) 3162306a36Sopenharmony_ci#define CLUSTERPMCEID1_EL1 sys_reg(3, 0, 15, 6, 5) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic inline u32 __dsu_pmu_read_pmcr(void) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci return read_sysreg_s(CLUSTERPMCR_EL1); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic inline void __dsu_pmu_write_pmcr(u32 val) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci write_sysreg_s(val, CLUSTERPMCR_EL1); 4162306a36Sopenharmony_ci isb(); 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic inline u32 __dsu_pmu_get_reset_overflow(void) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci u32 val = read_sysreg_s(CLUSTERPMOVSCLR_EL1); 4762306a36Sopenharmony_ci /* Clear the bit */ 4862306a36Sopenharmony_ci write_sysreg_s(val, CLUSTERPMOVSCLR_EL1); 4962306a36Sopenharmony_ci isb(); 5062306a36Sopenharmony_ci return val; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic inline void __dsu_pmu_select_counter(int counter) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci write_sysreg_s(counter, CLUSTERPMSELR_EL1); 5662306a36Sopenharmony_ci isb(); 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistatic inline u64 __dsu_pmu_read_counter(int counter) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci __dsu_pmu_select_counter(counter); 6262306a36Sopenharmony_ci return read_sysreg_s(CLUSTERPMXEVCNTR_EL1); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic inline void __dsu_pmu_write_counter(int counter, u64 val) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci __dsu_pmu_select_counter(counter); 6862306a36Sopenharmony_ci write_sysreg_s(val, CLUSTERPMXEVCNTR_EL1); 6962306a36Sopenharmony_ci isb(); 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic inline void __dsu_pmu_set_event(int counter, u32 event) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci __dsu_pmu_select_counter(counter); 7562306a36Sopenharmony_ci write_sysreg_s(event, CLUSTERPMXEVTYPER_EL1); 7662306a36Sopenharmony_ci isb(); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic inline u64 __dsu_pmu_read_pmccntr(void) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci return read_sysreg_s(CLUSTERPMCCNTR_EL1); 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic inline void __dsu_pmu_write_pmccntr(u64 val) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci write_sysreg_s(val, CLUSTERPMCCNTR_EL1); 8762306a36Sopenharmony_ci isb(); 8862306a36Sopenharmony_ci} 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic inline void __dsu_pmu_disable_counter(int counter) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci write_sysreg_s(BIT(counter), CLUSTERPMCNTENCLR_EL1); 9362306a36Sopenharmony_ci isb(); 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cistatic inline void __dsu_pmu_enable_counter(int counter) 9762306a36Sopenharmony_ci{ 9862306a36Sopenharmony_ci write_sysreg_s(BIT(counter), CLUSTERPMCNTENSET_EL1); 9962306a36Sopenharmony_ci isb(); 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic inline void __dsu_pmu_counter_interrupt_enable(int counter) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci write_sysreg_s(BIT(counter), CLUSTERPMINTENSET_EL1); 10562306a36Sopenharmony_ci isb(); 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic inline void __dsu_pmu_counter_interrupt_disable(int counter) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci write_sysreg_s(BIT(counter), CLUSTERPMINTENCLR_EL1); 11162306a36Sopenharmony_ci isb(); 11262306a36Sopenharmony_ci} 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic inline u32 __dsu_pmu_read_pmceid(int n) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci switch (n) { 11862306a36Sopenharmony_ci case 0: 11962306a36Sopenharmony_ci return read_sysreg_s(CLUSTERPMCEID0_EL1); 12062306a36Sopenharmony_ci case 1: 12162306a36Sopenharmony_ci return read_sysreg_s(CLUSTERPMCEID1_EL1); 12262306a36Sopenharmony_ci default: 12362306a36Sopenharmony_ci BUILD_BUG(); 12462306a36Sopenharmony_ci return 0; 12562306a36Sopenharmony_ci } 12662306a36Sopenharmony_ci} 127