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