1*d52ff2b3SArvind Ram Prakash /* 2*d52ff2b3SArvind Ram Prakash * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved. 3*d52ff2b3SArvind Ram Prakash * 4*d52ff2b3SArvind Ram Prakash * SPDX-License-Identifier: BSD-3-Clause 5*d52ff2b3SArvind Ram Prakash */ 6*d52ff2b3SArvind Ram Prakash 7*d52ff2b3SArvind Ram Prakash #ifndef DSU_H 8*d52ff2b3SArvind Ram Prakash #define DSU_H 9*d52ff2b3SArvind Ram Prakash 10*d52ff2b3SArvind Ram Prakash #if defined(__aarch64__) 11*d52ff2b3SArvind Ram Prakash #include <dsu_def.h> 12*d52ff2b3SArvind Ram Prakash 13*d52ff2b3SArvind Ram Prakash /* 14*d52ff2b3SArvind Ram Prakash * Power Control Registers enable bit of Auxilary Control register. 15*d52ff2b3SArvind Ram Prakash * ACTLR_EL3_PWREN_BIT definition is same among cores like Cortex-X925, 16*d52ff2b3SArvind Ram Prakash * Cortex-X4, Cortex-A520, Cortex-A725 that are used in a cluster 17*d52ff2b3SArvind Ram Prakash * with DSU. 18*d52ff2b3SArvind Ram Prakash */ 19*d52ff2b3SArvind Ram Prakash #define ACTLR_EL3_PWREN_BIT BIT(7) 20*d52ff2b3SArvind Ram Prakash 21*d52ff2b3SArvind Ram Prakash #define PMCR_N_MAX 0x1f 22*d52ff2b3SArvind Ram Prakash 23*d52ff2b3SArvind Ram Prakash #define save_pmu_reg(state, reg) state->reg = read_##reg() 24*d52ff2b3SArvind Ram Prakash 25*d52ff2b3SArvind Ram Prakash #define restore_pmu_reg(context, reg) write_##reg(context->reg) 26*d52ff2b3SArvind Ram Prakash 27*d52ff2b3SArvind Ram Prakash typedef struct cluster_pmu_state { 28*d52ff2b3SArvind Ram Prakash uint64_t clusterpmcr; 29*d52ff2b3SArvind Ram Prakash uint64_t clusterpmcntenset; 30*d52ff2b3SArvind Ram Prakash uint64_t clusterpmccntr; 31*d52ff2b3SArvind Ram Prakash uint64_t clusterpmovsset; 32*d52ff2b3SArvind Ram Prakash uint64_t clusterpmselr; 33*d52ff2b3SArvind Ram Prakash uint64_t clusterpmsevtyper; 34*d52ff2b3SArvind Ram Prakash uint64_t counter_val[PMCR_N_MAX]; 35*d52ff2b3SArvind Ram Prakash uint64_t counter_type[PMCR_N_MAX]; 36*d52ff2b3SArvind Ram Prakash } cluster_pmu_state_t; 37*d52ff2b3SArvind Ram Prakash 38*d52ff2b3SArvind Ram Prakash typedef struct dsu_driver_data { 39*d52ff2b3SArvind Ram Prakash uint8_t clusterpwrdwn_pwrdn; 40*d52ff2b3SArvind Ram Prakash uint8_t clusterpwrdwn_memret; 41*d52ff2b3SArvind Ram Prakash uint8_t clusterpwrctlr_cachepwr; 42*d52ff2b3SArvind Ram Prakash uint8_t clusterpwrctlr_funcret; 43*d52ff2b3SArvind Ram Prakash } dsu_driver_data_t; 44*d52ff2b3SArvind Ram Prakash 45*d52ff2b3SArvind Ram Prakash extern const dsu_driver_data_t plat_dsu_data; 46*d52ff2b3SArvind Ram Prakash 47*d52ff2b3SArvind Ram Prakash static inline unsigned int read_cluster_eventctr_num(void) 48*d52ff2b3SArvind Ram Prakash { 49*d52ff2b3SArvind Ram Prakash return ((read_clusterpmcr() >> CLUSTERPMCR_N_SHIFT) & 50*d52ff2b3SArvind Ram Prakash CLUSTERPMCR_N_MASK); 51*d52ff2b3SArvind Ram Prakash } 52*d52ff2b3SArvind Ram Prakash 53*d52ff2b3SArvind Ram Prakash void save_dsu_pmu_state(cluster_pmu_state_t *cluster_pmu_context); 54*d52ff2b3SArvind Ram Prakash 55*d52ff2b3SArvind Ram Prakash void restore_dsu_pmu_state(cluster_pmu_state_t *cluster_pmu_context); 56*d52ff2b3SArvind Ram Prakash 57*d52ff2b3SArvind Ram Prakash void cluster_on_dsu_pmu_context_restore(void); 58*d52ff2b3SArvind Ram Prakash 59*d52ff2b3SArvind Ram Prakash void cluster_off_dsu_pmu_context_save(void); 60*d52ff2b3SArvind Ram Prakash 61*d52ff2b3SArvind Ram Prakash void dsu_driver_init(const dsu_driver_data_t *data); 62*d52ff2b3SArvind Ram Prakash #endif 63*d52ff2b3SArvind Ram Prakash #endif /* DSU_H */ 64