1c73686a1SBoyan Karatotev /* 2c73686a1SBoyan Karatotev * Copyright (c) 2023, Arm Limited. All rights reserved. 3c73686a1SBoyan Karatotev * 4c73686a1SBoyan Karatotev * SPDX-License-Identifier: BSD-3-Clause 5c73686a1SBoyan Karatotev */ 6c73686a1SBoyan Karatotev 7c73686a1SBoyan Karatotev #include <arch.h> 8c73686a1SBoyan Karatotev #include <arch_features.h> 9c73686a1SBoyan Karatotev #include <arch_helpers.h> 10c73686a1SBoyan Karatotev #include <lib/extensions/pmuv3.h> 11c73686a1SBoyan Karatotev 1283a4dae1SBoyan Karatotev static u_register_t mtpmu_disable_el3(u_register_t sdcr) 1383a4dae1SBoyan Karatotev { 1483a4dae1SBoyan Karatotev if (!is_feat_mtpmu_supported()) { 1583a4dae1SBoyan Karatotev return sdcr; 1683a4dae1SBoyan Karatotev } 1783a4dae1SBoyan Karatotev 1883a4dae1SBoyan Karatotev /* 1983a4dae1SBoyan Karatotev * SDCR.MTPME = 0 2083a4dae1SBoyan Karatotev * FEAT_MTPMU is disabled. The Effective value of PMEVTYPER<n>.MT is 2183a4dae1SBoyan Karatotev * zero. 2283a4dae1SBoyan Karatotev */ 2383a4dae1SBoyan Karatotev sdcr &= ~SDCR_MTPME_BIT; 2483a4dae1SBoyan Karatotev 2583a4dae1SBoyan Karatotev return sdcr; 2683a4dae1SBoyan Karatotev } 2783a4dae1SBoyan Karatotev 28c73686a1SBoyan Karatotev /* 29c73686a1SBoyan Karatotev * Applies to all PMU versions. Name is PMUv3 for compatibility with aarch64 and 30c73686a1SBoyan Karatotev * to not clash with platforms which reuse the PMU name 31c73686a1SBoyan Karatotev */ 32*60d330dcSBoyan Karatotev void pmuv3_init_el3(void) 33c73686a1SBoyan Karatotev { 34c73686a1SBoyan Karatotev u_register_t sdcr = read_sdcr(); 35c73686a1SBoyan Karatotev 36c73686a1SBoyan Karatotev /* --------------------------------------------------------------------- 37c73686a1SBoyan Karatotev * Initialise SDCR, setting all the fields rather than relying on hw. 38c73686a1SBoyan Karatotev * 39c73686a1SBoyan Karatotev * SDCR.SCCD: Set to one so that cycle counting by PMCCNTR is prohibited 40c73686a1SBoyan Karatotev * in Secure state. This bit is RES0 in versions of the architecture 41c73686a1SBoyan Karatotev * earlier than ARMv8.5 42c73686a1SBoyan Karatotev * 43c73686a1SBoyan Karatotev * SDCR.SPME: Set to zero so that event counting is prohibited in Secure 44c73686a1SBoyan Karatotev * state (and explicitly EL3 with later revisions). If ARMv8.2 Debug is 45c73686a1SBoyan Karatotev * not implemented this bit does not have any effect on the counters 46c73686a1SBoyan Karatotev * unless there is support for the implementation defined 47c73686a1SBoyan Karatotev * authentication interface ExternalSecureNoninvasiveDebugEnabled(). 48c73686a1SBoyan Karatotev * --------------------------------------------------------------------- 49c73686a1SBoyan Karatotev */ 50c73686a1SBoyan Karatotev sdcr = (sdcr | SDCR_SCCD_BIT) & ~SDCR_SPME_BIT; 5183a4dae1SBoyan Karatotev sdcr = mtpmu_disable_el3(sdcr); 52c73686a1SBoyan Karatotev write_sdcr(sdcr); 53c73686a1SBoyan Karatotev 54c73686a1SBoyan Karatotev /* --------------------------------------------------------------------- 55c73686a1SBoyan Karatotev * Initialise PMCR, setting all fields rather than relying 56c73686a1SBoyan Karatotev * on hw. Some fields are architecturally UNKNOWN on reset. 57c73686a1SBoyan Karatotev * 58c73686a1SBoyan Karatotev * PMCR.DP: Set to one to prohibit cycle counting whilst in Secure mode. 59c73686a1SBoyan Karatotev * 60c73686a1SBoyan Karatotev * PMCR.X: Set to zero to disable export of events. 61c73686a1SBoyan Karatotev * 62c73686a1SBoyan Karatotev * PMCR.C: Set to one to reset PMCCNTR. 63c73686a1SBoyan Karatotev * 64c73686a1SBoyan Karatotev * PMCR.P: Set to one to reset each event counter PMEVCNTR<n> to zero. 65c73686a1SBoyan Karatotev * 66c73686a1SBoyan Karatotev * PMCR.E: Set to zero to disable cycle and event counters. 67c73686a1SBoyan Karatotev * --------------------------------------------------------------------- 68c73686a1SBoyan Karatotev */ 69c73686a1SBoyan Karatotev 70c73686a1SBoyan Karatotev write_pmcr(read_pmcr() | PMCR_DP_BIT | PMCR_C_BIT | PMCR_P_BIT | 71c73686a1SBoyan Karatotev ~(PMCR_X_BIT | PMCR_E_BIT)); 72c73686a1SBoyan Karatotev } 73