3 Copyright (c) 2017-2018, Arm Limited. All rights reserved.
5 SPDX-License-Identifier: BSD-2-Clause-Patent
7 System Control and Management Interface V1.0
8 http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
9 DEN0056A_System_Control_and_Management_Interface.pdf
12 #ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_H_
13 #define ARM_SCMI_PERFORMANCE_PROTOCOL_H_
15 #include <Protocol/ArmScmi.h>
17 #define PERFORMANCE_PROTOCOL_VERSION 0x10000
19 #define ARM_SCMI_PERFORMANCE_PROTOCOL_GUID { \
20 0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \
23 extern EFI_GUID gArmScmiPerformanceProtocolGuid
;
25 typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL
;
29 #define POWER_IN_MW_SHIFT 16
30 #define POWER_IN_MW_MASK 0x1
31 #define NUM_PERF_DOMAINS_MASK 0xFFFF
33 // Total number of performance domains, Attr Bits [15:0]
34 #define SCMI_PERF_TOTAL_DOMAINS(Attr) (Attr & NUM_PERF_DOMAINS_MASK)
36 // A flag to express power values in mW or platform specific way, Attr Bit [16]
37 #define SCMI_PERF_POWER_IN_MW(Attr) ((Attr >> POWER_IN_MW_SHIFT) & \
40 // Performance protocol attributes return values.
43 UINT64 StatisticsAddress
;
45 } SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES
;
47 #define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr) ((Attr >> 28) & 0x1)
48 #define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr) ((Attr >> 29) & 0x1)
49 #define SCMI_PERF_SUPPORT_SET_LVL(Attr) ((Attr >> 30) & 0x1)
50 #define SCMI_PERF_SUPPORT_SET_LIM(Attr) ((Attr >> 31) & 0x1)
51 #define SCMI_PERF_RATE_LIMIT(RateLimit) (RateLimit & 0xFFF)
53 // Performance protocol domain attributes.
58 UINT32 SustainedPerfLevel
;
59 UINT8 Name
[SCMI_MAX_STR_LEN
];
60 } SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES
;
62 // Worst case latency in microseconds, Bits[15:0]
63 #define PERF_LATENCY_MASK 0xFFFF
64 #define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency) (Latency & PERF_LATENCY_MASK)
66 // Performance protocol performance level.
71 } SCMI_PERFORMANCE_LEVEL
;
73 // Performance protocol performance limit.
77 } SCMI_PERFORMANCE_LIMITS
;
81 /** Return version of the performance management protocol supported by SCP.
84 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
86 @param[out] Version Version of the supported SCMI performance management
89 @retval EFI_SUCCESS The version is returned.
90 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
91 @retval !(EFI_SUCCESS) Other errors.
95 (EFIAPI
*SCMI_PERFORMANCE_GET_VERSION
) (
96 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
100 /** Return protocol attributes of the performance management protocol.
102 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
104 @param[out] Attributes Protocol attributes.
106 @retval EFI_SUCCESS Protocol attributes are returned.
107 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
108 @retval !(EFI_SUCCESS) Other errors.
112 (EFIAPI
*SCMI_PERFORMANCE_GET_ATTRIBUTES
) (
113 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
114 OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES
*Attributes
118 /** Return performance domain attributes.
120 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
121 @param[in] DomainId Identifier for the performance domain.
123 @param[out] Attributes Performance domain attributes.
125 @retval EFI_SUCCESS Domain attributes are returned.
126 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
127 @retval !(EFI_SUCCESS) Other errors.
131 (EFIAPI
*SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES
) (
132 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
134 OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES
*DomainAttributes
137 /** Return list of performance domain levels of a given domain.
139 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
140 @param[in] DomainId Identifier for the performance domain.
142 @param[out] NumLevels Total number of levels a domain can support.
144 @param[in,out] LevelArraySize Size of the performance level array.
146 @param[out] LevelArray Array of the performance levels.
148 @retval EFI_SUCCESS Domain levels are returned.
149 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
150 @retval EFI_BUFFER_TOO_SMALL LevelArraySize is too small for the result.
151 It has been updated to the size needed.
152 @retval !(EFI_SUCCESS) Other errors.
156 (EFIAPI
*SCMI_PERFORMANCE_DESCRIBE_LEVELS
) (
157 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
159 OUT UINT32
*NumLevels
,
160 IN OUT UINT32
*LevelArraySize
,
161 OUT SCMI_PERFORMANCE_LEVEL
*LevelArray
164 /** Set performance limits of a domain.
166 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
167 @param[in] DomainId Identifier for the performance domain.
168 @param[in] Limit Performance limit to set.
170 @retval EFI_SUCCESS Performance limits set successfully.
171 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
172 @retval !(EFI_SUCCESS) Other errors.
176 (EFIAPI
*SCMI_PERFORMANCE_LIMITS_SET
) (
177 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
179 IN SCMI_PERFORMANCE_LIMITS
*Limits
182 /** Get performance limits of a domain.
184 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
185 @param[in] DomainId Identifier for the performance domain.
187 @param[out] Limit Performance Limits of the domain.
189 @retval EFI_SUCCESS Performance limits are returned.
190 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
191 @retval !(EFI_SUCCESS) Other errors.
195 (EFIAPI
*SCMI_PERFORMANCE_LIMITS_GET
) (
196 SCMI_PERFORMANCE_PROTOCOL
*This
,
198 SCMI_PERFORMANCE_LIMITS
*Limits
201 /** Set performance level of a domain.
203 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
204 @param[in] DomainId Identifier for the performance domain.
205 @param[in] Level Performance level of the domain.
207 @retval EFI_SUCCESS Performance level set successfully.
208 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
209 @retval !(EFI_SUCCESS) Other errors.
213 (EFIAPI
*SCMI_PERFORMANCE_LEVEL_SET
) (
214 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
219 /** Get performance level of a domain.
221 @param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
222 @param[in] DomainId Identifier for the performance domain.
224 @param[out] Level Performance level of the domain.
226 @retval EFI_SUCCESS Performance level got successfully.
227 @retval EFI_DEVICE_ERROR SCP returns an SCMI error.
228 @retval !(EFI_SUCCESS) Other errors.
232 (EFIAPI
*SCMI_PERFORMANCE_LEVEL_GET
) (
233 IN SCMI_PERFORMANCE_PROTOCOL
*This
,
238 typedef struct _SCMI_PERFORMANCE_PROTOCOL
{
239 SCMI_PERFORMANCE_GET_VERSION GetVersion
;
240 SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes
;
241 SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES GetDomainAttributes
;
242 SCMI_PERFORMANCE_DESCRIBE_LEVELS DescribeLevels
;
243 SCMI_PERFORMANCE_LIMITS_SET LimitsSet
;
244 SCMI_PERFORMANCE_LIMITS_GET LimitsGet
;
245 SCMI_PERFORMANCE_LEVEL_SET LevelSet
;
246 SCMI_PERFORMANCE_LEVEL_GET LevelGet
;
247 } SCMI_PERFORMANCE_PROTOCOL
;
250 SCMI_MESSAGE_ID_PERFORMANCE_DOMAIN_ATTRIBUTES
= 0x3,
251 SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS
= 0x4,
252 SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_SET
= 0x5,
253 SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_GET
= 0x6,
254 SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_SET
= 0x7,
255 SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_GET
= 0x8,
256 } SCMI_MESSAGE_ID_PERFORMANCE
;
258 #endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */