1 /*
2  * Copyright (c) 2016-2024, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef PMF_H
8 #define PMF_H
9 
10 #include <lib/cassert.h>
11 #include <lib/pmf/pmf_helpers.h>
12 #include <lib/utils_def.h>
13 
14 /*
15  * Constants used for/by PMF services.
16  */
17 #define PMF_ARM_TIF_IMPL_ID	UL(0x41)
18 #define PMF_TID_SHIFT		0
19 #define PMF_TID_MASK		(UL(0xFF) << PMF_TID_SHIFT)
20 #define PMF_SVC_ID_SHIFT	10
21 #define PMF_SVC_ID_MASK		(UL(0x3F) << PMF_SVC_ID_SHIFT)
22 #define PMF_IMPL_ID_SHIFT	24
23 #define PMF_IMPL_ID_MASK	(UL(0xFF) << PMF_IMPL_ID_SHIFT)
24 
25 /*
26  * Flags passed to PMF_REGISTER_SERVICE
27  */
28 #define PMF_STORE_ENABLE	(1 << 0)
29 #define PMF_DUMP_ENABLE		(1 << 1)
30 
31 /*
32  * Flags passed to PMF_GET_TIMESTAMP_XXX
33  * and PMF_CAPTURE_TIMESTAMP
34  */
35 #define PMF_CACHE_MAINT		(U(1) << 0)
36 #define PMF_NO_CACHE_MAINT	U(0)
37 
38 /*
39  * Defines for PMF SMC function ids used with arm-sip
40  * range, this is now deprecated and will be removed.
41  */
42 #define PMF_SMC_GET_TIMESTAMP_32_DEP	U(0x82000010)
43 #define PMF_SMC_GET_TIMESTAMP_64_DEP	U(0xC2000010)
44 
45 #define PMF_FID_VALUE_DEPRECATED	U(0x10)
46 #define is_pmf_fid_deprecated(_fid) \
47 	(GET_SMC_NUM(_fid) == PMF_FID_VALUE_DEPRECATED)
48 
49 /*
50  * Defines for PMF SMC function ids used with Vendor-Specific
51  * EL3 range.
52  */
53 #define PMF_SMC_GET_TIMESTAMP_32	U(0x87000020)
54 #define PMF_SMC_GET_TIMESTAMP_64	U(0xC7000020)
55 #define PMF_NUM_SMC_CALLS		2
56 
57 #define PMF_SMC_GET_VERSION_32		U(0x87000021)
58 #define PMF_SMC_GET_VERSION_64		U(0xC7000021)
59 
60 #define PMF_SMC_VERSION			U(0x00000001)
61 
62 /*
63  * The macros below are used to identify
64  * PMF calls from the SMC function ID.
65  */
66 #define PMF_FID_VALUE		U(0x20)
67 #define PMF_ID_MASK		(FUNCID_NUM_MASK & ~(0xf))
68 #define is_pmf_fid(_fid)	((GET_SMC_NUM(_fid) & PMF_ID_MASK) == PMF_FID_VALUE)
69 
70 /* Following are the supported PMF service IDs */
71 #define PMF_PSCI_STAT_SVC_ID	0
72 #define PMF_RT_INSTR_SVC_ID	1
73 
74 /*******************************************************************************
75  * Function & variable prototypes
76  ******************************************************************************/
77 /* PMF common functions */
78 int pmf_get_timestamp_smc(unsigned int tid,
79 		u_register_t mpidr,
80 		unsigned int flags,
81 		unsigned long long *ts_value);
82 int pmf_setup(void);
83 uintptr_t pmf_smc_handler(unsigned int smc_fid,
84 		u_register_t x1,
85 		u_register_t x2,
86 		u_register_t x3,
87 		u_register_t x4,
88 		void *cookie,
89 		void *handle,
90 		u_register_t flags);
91 
92 #endif /* PMF_H */
93