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 mtpmu_disable_el3(u_register_t sdcr)1283a4dae1SBoyan Karatotevstatic 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 pmuv3_init_el3(void)28*60d330dcSBoyan Karatotevvoid pmuv3_init_el3(void) 29c73686a1SBoyan Karatotev { 30c73686a1SBoyan Karatotev u_register_t sdcr = read_sdcr(); 31c73686a1SBoyan Karatotev 32c73686a1SBoyan Karatotev /* --------------------------------------------------------------------- 33c73686a1SBoyan Karatotev * Initialise SDCR, setting all the fields rather than relying on hw. 34c73686a1SBoyan Karatotev * 35c73686a1SBoyan Karatotev * SDCR.SCCD: Set to one so that cycle counting by PMCCNTR is prohibited 36c73686a1SBoyan Karatotev * in Secure state. This bit is RES0 in versions of the architecture 37c73686a1SBoyan Karatotev * earlier than ARMv8.5 38c73686a1SBoyan Karatotev * 39c73686a1SBoyan Karatotev * SDCR.SPME: Set to zero so that event counting is prohibited in Secure 40c73686a1SBoyan Karatotev * state (and explicitly EL3 with later revisions). If ARMv8.2 Debug is 41c73686a1SBoyan Karatotev * not implemented this bit does not have any effect on the counters 42c73686a1SBoyan Karatotev * unless there is support for the implementation defined 43c73686a1SBoyan Karatotev * authentication interface ExternalSecureNoninvasiveDebugEnabled(). 44c73686a1SBoyan Karatotev * --------------------------------------------------------------------- 45c73686a1SBoyan Karatotev */ 46c73686a1SBoyan Karatotev sdcr = (sdcr | SDCR_SCCD_BIT) & ~SDCR_SPME_BIT; 4783a4dae1SBoyan Karatotev sdcr = mtpmu_disable_el3(sdcr); 48c73686a1SBoyan Karatotev write_sdcr(sdcr); 49c73686a1SBoyan Karatotev 50c73686a1SBoyan Karatotev /* --------------------------------------------------------------------- 51c73686a1SBoyan Karatotev * Initialise PMCR, setting all fields rather than relying 52c73686a1SBoyan Karatotev * on hw. Some fields are architecturally UNKNOWN on reset. 53c73686a1SBoyan Karatotev * 54c73686a1SBoyan Karatotev * PMCR.DP: Set to one to prohibit cycle counting whilst in Secure mode. 55c73686a1SBoyan Karatotev * 56c73686a1SBoyan Karatotev * PMCR.X: Set to zero to disable export of events. 57c73686a1SBoyan Karatotev * 58c73686a1SBoyan Karatotev * PMCR.C: Set to one to reset PMCCNTR. 59c73686a1SBoyan Karatotev * 60c73686a1SBoyan Karatotev * PMCR.P: Set to one to reset each event counter PMEVCNTR<n> to zero. 61c73686a1SBoyan Karatotev * 62c73686a1SBoyan Karatotev * PMCR.E: Set to zero to disable cycle and event counters. 63c73686a1SBoyan Karatotev * --------------------------------------------------------------------- 64c73686a1SBoyan Karatotev */ 65c73686a1SBoyan Karatotev 66c73686a1SBoyan Karatotev write_pmcr(read_pmcr() | PMCR_DP_BIT | PMCR_C_BIT | PMCR_P_BIT | 67c73686a1SBoyan Karatotev ~(PMCR_X_BIT | PMCR_E_BIT)); 68c73686a1SBoyan Karatotev } 69