1afdda571Sdp-arm /* 29fb8af33SRoberto Vargas * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 3afdda571Sdp-arm * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5afdda571Sdp-arm */ 6afdda571Sdp-arm 7bef9a10fSAntonio Nino Diaz #ifndef PMF_H 8bef9a10fSAntonio Nino Diaz #define PMF_H 9afdda571Sdp-arm 10*09d40e0eSAntonio Nino Diaz #include <lib/cassert.h> 11*09d40e0eSAntonio Nino Diaz #include <lib/pmf/pmf_helpers.h> 12*09d40e0eSAntonio Nino Diaz #include <lib/utils_def.h> 13afdda571Sdp-arm 14afdda571Sdp-arm /* 15afdda571Sdp-arm * Constants used for/by PMF services. 16afdda571Sdp-arm */ 17195e363fSAntonio Nino Diaz #define PMF_ARM_TIF_IMPL_ID U(0x41) 18afdda571Sdp-arm #define PMF_TID_SHIFT 0 19195e363fSAntonio Nino Diaz #define PMF_TID_MASK (U(0xFF) << PMF_TID_SHIFT) 20afdda571Sdp-arm #define PMF_SVC_ID_SHIFT 10 21195e363fSAntonio Nino Diaz #define PMF_SVC_ID_MASK (U(0x3F) << PMF_SVC_ID_SHIFT) 22afdda571Sdp-arm #define PMF_IMPL_ID_SHIFT 24 23195e363fSAntonio Nino Diaz #define PMF_IMPL_ID_MASK (U(0xFF) << PMF_IMPL_ID_SHIFT) 24afdda571Sdp-arm 25afdda571Sdp-arm /* 26afdda571Sdp-arm * Flags passed to PMF_REGISTER_SERVICE 27afdda571Sdp-arm */ 28afdda571Sdp-arm #define PMF_STORE_ENABLE (1 << 0) 29afdda571Sdp-arm #define PMF_DUMP_ENABLE (1 << 1) 30afdda571Sdp-arm 31afdda571Sdp-arm /* 32afdda571Sdp-arm * Flags passed to PMF_GET_TIMESTAMP_XXX 33afdda571Sdp-arm * and PMF_CAPTURE_TIMESTAMP 34afdda571Sdp-arm */ 35bef9a10fSAntonio Nino Diaz #define PMF_CACHE_MAINT (U(1) << 0) 36bef9a10fSAntonio Nino Diaz #define PMF_NO_CACHE_MAINT U(0) 37afdda571Sdp-arm 38afdda571Sdp-arm /* 39afdda571Sdp-arm * Defines for PMF SMC function ids. 40afdda571Sdp-arm */ 41195e363fSAntonio Nino Diaz #define PMF_SMC_GET_TIMESTAMP_32 U(0x82000010) 42195e363fSAntonio Nino Diaz #define PMF_SMC_GET_TIMESTAMP_64 U(0xC2000010) 43afdda571Sdp-arm #define PMF_NUM_SMC_CALLS 2 44afdda571Sdp-arm 45afdda571Sdp-arm /* 46afdda571Sdp-arm * The macros below are used to identify 47afdda571Sdp-arm * PMF calls from the SMC function ID. 48afdda571Sdp-arm */ 49195e363fSAntonio Nino Diaz #define PMF_FID_MASK U(0xffe0) 50195e363fSAntonio Nino Diaz #define PMF_FID_VALUE U(0) 51afdda571Sdp-arm #define is_pmf_fid(_fid) (((_fid) & PMF_FID_MASK) == PMF_FID_VALUE) 52afdda571Sdp-arm 53afdda571Sdp-arm /* Following are the supported PMF service IDs */ 54afdda571Sdp-arm #define PMF_PSCI_STAT_SVC_ID 0 55872be88aSdp-arm #define PMF_RT_INSTR_SVC_ID 1 56afdda571Sdp-arm 57afdda571Sdp-arm #if ENABLE_PMF 58afdda571Sdp-arm /* 59afdda571Sdp-arm * Convenience macros for capturing time-stamp. 60afdda571Sdp-arm */ 61afdda571Sdp-arm #define PMF_DECLARE_CAPTURE_TIMESTAMP(_name) \ 62afdda571Sdp-arm void pmf_capture_timestamp_with_cache_maint_ ## _name( \ 63afdda571Sdp-arm unsigned int tid, \ 64afdda571Sdp-arm unsigned long long ts); \ 65afdda571Sdp-arm void pmf_capture_timestamp_ ## _name( \ 66afdda571Sdp-arm unsigned int tid, \ 67afdda571Sdp-arm unsigned long long ts); 68afdda571Sdp-arm 69afdda571Sdp-arm #define PMF_CAPTURE_TIMESTAMP(_name, _tid, _flags) \ 70afdda571Sdp-arm do { \ 71afdda571Sdp-arm unsigned long long ts = read_cntpct_el0(); \ 72bef9a10fSAntonio Nino Diaz if (((_flags) & PMF_CACHE_MAINT) != 0U) \ 73afdda571Sdp-arm pmf_capture_timestamp_with_cache_maint_ ## _name((_tid), ts);\ 74afdda571Sdp-arm else \ 75afdda571Sdp-arm pmf_capture_timestamp_ ## _name((_tid), ts); \ 76afdda571Sdp-arm } while (0) 77afdda571Sdp-arm 78afdda571Sdp-arm #define PMF_CAPTURE_AND_GET_TIMESTAMP(_name, _tid, _flags, _tsval) \ 79afdda571Sdp-arm do { \ 80afdda571Sdp-arm (_tsval) = read_cntpct_el0(); \ 81afdda571Sdp-arm CASSERT(sizeof(_tsval) == sizeof(unsigned long long), invalid_tsval_size);\ 82bef9a10fSAntonio Nino Diaz if (((_flags) & PMF_CACHE_MAINT) != 0U) \ 83afdda571Sdp-arm pmf_capture_timestamp_with_cache_maint_ ## _name((_tid), (_tsval));\ 84afdda571Sdp-arm else \ 85afdda571Sdp-arm pmf_capture_timestamp_ ## _name((_tid), (_tsval));\ 86afdda571Sdp-arm } while (0) 87afdda571Sdp-arm 88afdda571Sdp-arm #define PMF_WRITE_TIMESTAMP(_name, _tid, _flags, _wrval) \ 89afdda571Sdp-arm do { \ 90afdda571Sdp-arm CASSERT(sizeof(_wrval) == sizeof(unsigned long long), invalid_wrval_size);\ 91bef9a10fSAntonio Nino Diaz if (((_flags) & PMF_CACHE_MAINT) != 0U) \ 92afdda571Sdp-arm pmf_capture_timestamp_with_cache_maint_ ## _name((_tid), (_wrval));\ 93afdda571Sdp-arm else \ 94afdda571Sdp-arm pmf_capture_timestamp_ ## _name((_tid), (_wrval));\ 95afdda571Sdp-arm } while (0) 96afdda571Sdp-arm 97afdda571Sdp-arm /* 98afdda571Sdp-arm * Convenience macros for retrieving time-stamp. 99afdda571Sdp-arm */ 100afdda571Sdp-arm #define PMF_DECLARE_GET_TIMESTAMP(_name) \ 101afdda571Sdp-arm unsigned long long pmf_get_timestamp_by_index_ ## _name(\ 102afdda571Sdp-arm unsigned int tid, \ 103afdda571Sdp-arm unsigned int cpuid, \ 104afdda571Sdp-arm unsigned int flags); \ 105afdda571Sdp-arm unsigned long long pmf_get_timestamp_by_mpidr_ ## _name(\ 106afdda571Sdp-arm unsigned int tid, \ 107afdda571Sdp-arm u_register_t mpidr, \ 108afdda571Sdp-arm unsigned int flags); 109afdda571Sdp-arm 110afdda571Sdp-arm #define PMF_GET_TIMESTAMP_BY_MPIDR(_name, _tid, _mpidr, _flags, _tsval)\ 111afdda571Sdp-arm _tsval = pmf_get_timestamp_by_mpidr_ ## _name(_tid, _mpidr, _flags) 112afdda571Sdp-arm 113afdda571Sdp-arm #define PMF_GET_TIMESTAMP_BY_INDEX(_name, _tid, _cpuid, _flags, _tsval)\ 114afdda571Sdp-arm _tsval = pmf_get_timestamp_by_index_ ## _name(_tid, _cpuid, _flags) 115afdda571Sdp-arm 116afdda571Sdp-arm /* Convenience macros to register a PMF service.*/ 117afdda571Sdp-arm /* 118afdda571Sdp-arm * This macro is used to register a PMF Service. It allocates PMF memory 119afdda571Sdp-arm * and defines default service-specific PMF functions. 120afdda571Sdp-arm */ 121afdda571Sdp-arm #define PMF_REGISTER_SERVICE(_name, _svcid, _totalid, _flags) \ 122afdda571Sdp-arm PMF_ALLOCATE_TIMESTAMP_MEMORY(_name, _totalid) \ 123afdda571Sdp-arm PMF_DEFINE_CAPTURE_TIMESTAMP(_name, _flags) \ 124afdda571Sdp-arm PMF_DEFINE_GET_TIMESTAMP(_name) 125afdda571Sdp-arm 126afdda571Sdp-arm /* 127afdda571Sdp-arm * This macro is used to register a PMF service, including an 128afdda571Sdp-arm * SMC interface to that service. 129afdda571Sdp-arm */ 130afdda571Sdp-arm #define PMF_REGISTER_SERVICE_SMC(_name, _svcid, _totalid, _flags)\ 131afdda571Sdp-arm PMF_REGISTER_SERVICE(_name, _svcid, _totalid, _flags) \ 132afdda571Sdp-arm PMF_DEFINE_SERVICE_DESC(_name, PMF_ARM_TIF_IMPL_ID, \ 133afdda571Sdp-arm _svcid, _totalid, NULL, \ 134afdda571Sdp-arm pmf_get_timestamp_by_mpidr_ ## _name) 135afdda571Sdp-arm 136afdda571Sdp-arm /* 137afdda571Sdp-arm * This macro is used to register a PMF service that has an SMC interface 138afdda571Sdp-arm * but provides its own service-specific PMF functions. 139afdda571Sdp-arm */ 140afdda571Sdp-arm #define PMF_REGISTER_SERVICE_SMC_OWN(_name, _implid, _svcid, _totalid, \ 141afdda571Sdp-arm _init, _getts) \ 142afdda571Sdp-arm PMF_DEFINE_SERVICE_DESC(_name, _implid, _svcid, _totalid, \ 143afdda571Sdp-arm _init, _getts) 144afdda571Sdp-arm 145afdda571Sdp-arm #else 146afdda571Sdp-arm 147afdda571Sdp-arm #define PMF_REGISTER_SERVICE(_name, _svcid, _totalid, _flags) 148afdda571Sdp-arm #define PMF_REGISTER_SERVICE_SMC(_name, _svcid, _totalid, _flags) 149afdda571Sdp-arm #define PMF_REGISTER_SERVICE_SMC_OWN(_name, _implid, _svcid, _totalid, \ 150afdda571Sdp-arm _init, _getts) 151afdda571Sdp-arm #define PMF_DECLARE_CAPTURE_TIMESTAMP(_name) 152afdda571Sdp-arm #define PMF_DECLARE_GET_TIMESTAMP(_name) 153afdda571Sdp-arm #define PMF_CAPTURE_TIMESTAMP(_name, _tid, _flags) 154afdda571Sdp-arm #define PMF_GET_TIMESTAMP_BY_MPIDR(_name, _tid, _mpidr, _flags, _tsval) 155afdda571Sdp-arm #define PMF_GET_TIMESTAMP_BY_INDEX(_name, _tid, _cpuid, _flags, _tsval) 156afdda571Sdp-arm 157afdda571Sdp-arm #endif /* ENABLE_PMF */ 158afdda571Sdp-arm 159afdda571Sdp-arm /******************************************************************************* 160afdda571Sdp-arm * Function & variable prototypes 161afdda571Sdp-arm ******************************************************************************/ 162afdda571Sdp-arm /* PMF common functions */ 163afdda571Sdp-arm int pmf_get_timestamp_smc(unsigned int tid, 164afdda571Sdp-arm u_register_t mpidr, 165afdda571Sdp-arm unsigned int flags, 1669fb8af33SRoberto Vargas unsigned long long *ts_value); 167afdda571Sdp-arm int pmf_setup(void); 168afdda571Sdp-arm uintptr_t pmf_smc_handler(unsigned int smc_fid, 169afdda571Sdp-arm u_register_t x1, 170afdda571Sdp-arm u_register_t x2, 171afdda571Sdp-arm u_register_t x3, 172afdda571Sdp-arm u_register_t x4, 173afdda571Sdp-arm void *cookie, 174afdda571Sdp-arm void *handle, 175afdda571Sdp-arm u_register_t flags); 176afdda571Sdp-arm 177bef9a10fSAntonio Nino Diaz #endif /* PMF_H */ 178