]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
ArmPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / ArmPkg / Include / Protocol / ArmScmiPerformanceProtocol.h
CommitLineData
4f2494cf
GP
1/** @file\r
2\r
3 Copyright (c) 2017-2018, Arm Limited. All rights reserved.\r
4\r
4059386c 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
4f2494cf
GP
6\r
7 System Control and Management Interface V1.0\r
8 http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/\r
9 DEN0056A_System_Control_and_Management_Interface.pdf\r
10**/\r
11\r
12#ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_H_\r
13#define ARM_SCMI_PERFORMANCE_PROTOCOL_H_\r
14\r
15#include <Protocol/ArmScmi.h>\r
16\r
17#define PERFORMANCE_PROTOCOL_VERSION 0x10000\r
18\r
19#define ARM_SCMI_PERFORMANCE_PROTOCOL_GUID { \\r
20 0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \\r
21 }\r
22\r
23extern EFI_GUID gArmScmiPerformanceProtocolGuid;\r
24\r
25typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;\r
26\r
27#pragma pack(1)\r
28\r
29#define POWER_IN_MW_SHIFT 16\r
30#define POWER_IN_MW_MASK 0x1\r
31#define NUM_PERF_DOMAINS_MASK 0xFFFF\r
32\r
33// Total number of performance domains, Attr Bits [15:0]\r
34#define SCMI_PERF_TOTAL_DOMAINS(Attr) (Attr & NUM_PERF_DOMAINS_MASK)\r
35\r
36// A flag to express power values in mW or platform specific way, Attr Bit [16]\r
37#define SCMI_PERF_POWER_IN_MW(Attr) ((Attr >> POWER_IN_MW_SHIFT) & \\r
38 POWER_IN_MW_MASK)\r
39\r
40// Performance protocol attributes return values.\r
41typedef struct {\r
42 UINT32 Attributes;\r
43 UINT64 StatisticsAddress;\r
44 UINT32 StatisticsLen;\r
45} SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES;\r
46\r
47#define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr) ((Attr >> 28) & 0x1)\r
48#define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr) ((Attr >> 29) & 0x1)\r
49#define SCMI_PERF_SUPPORT_SET_LVL(Attr) ((Attr >> 30) & 0x1)\r
50#define SCMI_PERF_SUPPORT_SET_LIM(Attr) ((Attr >> 31) & 0x1)\r
51#define SCMI_PERF_RATE_LIMIT(RateLimit) (RateLimit & 0xFFF)\r
52\r
53// Performance protocol domain attributes.\r
54typedef struct {\r
55 UINT32 Attributes;\r
56 UINT32 RateLimit;\r
57 UINT32 SustainedFreq;\r
58 UINT32 SustainedPerfLevel;\r
59 UINT8 Name[SCMI_MAX_STR_LEN];\r
60} SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES;\r
61\r
62// Worst case latency in microseconds, Bits[15:0]\r
63#define PERF_LATENCY_MASK 0xFFFF\r
64#define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency) (Latency & PERF_LATENCY_MASK)\r
65\r
66// Performance protocol performance level.\r
67typedef struct {\r
68 UINT32 Level;\r
69 UINT32 PowerCost;\r
70 UINT32 Latency;\r
71} SCMI_PERFORMANCE_LEVEL;\r
72\r
73// Performance protocol performance limit.\r
74typedef struct {\r
75 UINT32 RangeMax;\r
76 UINT32 RangeMin;\r
77} SCMI_PERFORMANCE_LIMITS;\r
78\r
79#pragma pack()\r
80\r
81/** Return version of the performance management protocol supported by SCP.\r
82 firmware.\r
83\r
84 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
85\r
86 @param[out] Version Version of the supported SCMI performance management\r
87 protocol.\r
88\r
89 @retval EFI_SUCCESS The version is returned.\r
90 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
91 @retval !(EFI_SUCCESS) Other errors.\r
92**/\r
93typedef\r
94EFI_STATUS\r
95(EFIAPI *SCMI_PERFORMANCE_GET_VERSION) (\r
96 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
97 OUT UINT32 *Version\r
98 );\r
99\r
100/** Return protocol attributes of the performance management protocol.\r
101\r
102 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
103\r
104 @param[out] Attributes Protocol attributes.\r
105\r
106 @retval EFI_SUCCESS Protocol attributes are returned.\r
107 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
108 @retval !(EFI_SUCCESS) Other errors.\r
109**/\r
110typedef\r
111EFI_STATUS\r
112(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES) (\r
113 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
114 OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES *Attributes\r
115\r
116 );\r
117\r
118/** Return performance domain attributes.\r
119\r
120 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
121 @param[in] DomainId Identifier for the performance domain.\r
122\r
123 @param[out] Attributes Performance domain attributes.\r
124\r
125 @retval EFI_SUCCESS Domain attributes are returned.\r
126 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
127 @retval !(EFI_SUCCESS) Other errors.\r
128**/\r
129typedef\r
130EFI_STATUS\r
131(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES) (\r
132 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
133 IN UINT32 DomainId,\r
134 OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES *DomainAttributes\r
135 );\r
136\r
137/** Return list of performance domain levels of a given domain.\r
138\r
139 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
140 @param[in] DomainId Identifier for the performance domain.\r
141\r
142 @param[out] NumLevels Total number of levels a domain can support.\r
143\r
144 @param[in,out] LevelArraySize Size of the performance level array.\r
145\r
146 @param[out] LevelArray Array of the performance levels.\r
147\r
148 @retval EFI_SUCCESS Domain levels are returned.\r
149 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
150 @retval EFI_BUFFER_TOO_SMALL LevelArraySize is too small for the result.\r
151 It has been updated to the size needed.\r
152 @retval !(EFI_SUCCESS) Other errors.\r
153**/\r
154typedef\r
155EFI_STATUS\r
156(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS) (\r
157 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
158 IN UINT32 DomainId,\r
159 OUT UINT32 *NumLevels,\r
160 IN OUT UINT32 *LevelArraySize,\r
161 OUT SCMI_PERFORMANCE_LEVEL *LevelArray\r
162 );\r
163\r
164/** Set performance limits of a domain.\r
165\r
166 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
167 @param[in] DomainId Identifier for the performance domain.\r
168 @param[in] Limit Performance limit to set.\r
169\r
170 @retval EFI_SUCCESS Performance limits set successfully.\r
171 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
172 @retval !(EFI_SUCCESS) Other errors.\r
173**/\r
174typedef\r
175EFI_STATUS\r
176(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET) (\r
177 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
178 IN UINT32 DomainId,\r
179 IN SCMI_PERFORMANCE_LIMITS *Limits\r
180 );\r
181\r
182/** Get performance limits of a domain.\r
183\r
184 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
185 @param[in] DomainId Identifier for the performance domain.\r
186\r
187 @param[out] Limit Performance Limits of the domain.\r
188\r
189 @retval EFI_SUCCESS Performance limits are returned.\r
190 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
191 @retval !(EFI_SUCCESS) Other errors.\r
192**/\r
193typedef\r
194EFI_STATUS\r
195(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET) (\r
196 SCMI_PERFORMANCE_PROTOCOL *This,\r
197 UINT32 DomainId,\r
198 SCMI_PERFORMANCE_LIMITS *Limits\r
199 );\r
200\r
201/** Set performance level of a domain.\r
202\r
203 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
204 @param[in] DomainId Identifier for the performance domain.\r
205 @param[in] Level Performance level of the domain.\r
206\r
207 @retval EFI_SUCCESS Performance level set successfully.\r
208 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
209 @retval !(EFI_SUCCESS) Other errors.\r
210**/\r
211typedef\r
212EFI_STATUS\r
213(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET) (\r
214 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
215 IN UINT32 DomainId,\r
216 IN UINT32 Level\r
217 );\r
218\r
219/** Get performance level of a domain.\r
220\r
221 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.\r
222 @param[in] DomainId Identifier for the performance domain.\r
223\r
224 @param[out] Level Performance level of the domain.\r
225\r
226 @retval EFI_SUCCESS Performance level got successfully.\r
227 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.\r
228 @retval !(EFI_SUCCESS) Other errors.\r
229**/\r
230typedef\r
231EFI_STATUS\r
232(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET) (\r
233 IN SCMI_PERFORMANCE_PROTOCOL *This,\r
234 IN UINT32 DomainId,\r
235 OUT UINT32 *Level\r
236 );\r
237\r
238typedef struct _SCMI_PERFORMANCE_PROTOCOL {\r
239 SCMI_PERFORMANCE_GET_VERSION GetVersion;\r
240 SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes;\r
241 SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES GetDomainAttributes;\r
242 SCMI_PERFORMANCE_DESCRIBE_LEVELS DescribeLevels;\r
243 SCMI_PERFORMANCE_LIMITS_SET LimitsSet;\r
244 SCMI_PERFORMANCE_LIMITS_GET LimitsGet;\r
245 SCMI_PERFORMANCE_LEVEL_SET LevelSet;\r
246 SCMI_PERFORMANCE_LEVEL_GET LevelGet;\r
247} SCMI_PERFORMANCE_PROTOCOL;\r
248\r
249typedef enum {\r
250 SCMI_MESSAGE_ID_PERFORMANCE_DOMAIN_ATTRIBUTES = 0x3,\r
251 SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS = 0x4,\r
252 SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_SET = 0x5,\r
253 SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_GET = 0x6,\r
254 SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_SET = 0x7,\r
255 SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_GET = 0x8,\r
256} SCMI_MESSAGE_ID_PERFORMANCE;\r
257\r
258#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */\r
259\r