1 /** @file
2 
3   Copyright (c) 2017-2018, Arm Limited. All rights reserved.
4 
5   SPDX-License-Identifier: BSD-2-Clause-Patent
6 
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
10 **/
11 
12 #ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_H_
13 #define ARM_SCMI_PERFORMANCE_PROTOCOL_H_
14 
15 #include <Protocol/ArmScmi.h>
16 
17 #define PERFORMANCE_PROTOCOL_VERSION  0x10000
18 
19 #define ARM_SCMI_PERFORMANCE_PROTOCOL_GUID  { \
20   0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \
21   }
22 
23 extern EFI_GUID gArmScmiPerformanceProtocolGuid;
24 
25 typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;
26 
27 #pragma pack(1)
28 
29 #define POWER_IN_MW_SHIFT       16
30 #define POWER_IN_MW_MASK        0x1
31 #define NUM_PERF_DOMAINS_MASK   0xFFFF
32 
33 // Total number of performance domains, Attr Bits [15:0]
34 #define SCMI_PERF_TOTAL_DOMAINS(Attr)  (Attr & NUM_PERF_DOMAINS_MASK)
35 
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) &    \
38                                       POWER_IN_MW_MASK)
39 
40 // Performance protocol attributes return values.
41 typedef struct {
42   UINT32 Attributes;
43   UINT64 StatisticsAddress;
44   UINT32 StatisticsLen;
45 } SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES;
46 
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)
52 
53 // Performance protocol domain attributes.
54 typedef struct {
55   UINT32 Attributes;
56   UINT32 RateLimit;
57   UINT32 SustainedFreq;
58   UINT32 SustainedPerfLevel;
59   UINT8  Name[SCMI_MAX_STR_LEN];
60 } SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES;
61 
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)
65 
66 // Performance protocol performance level.
67 typedef  struct {
68   UINT32 Level;
69   UINT32 PowerCost;
70   UINT32 Latency;
71 } SCMI_PERFORMANCE_LEVEL;
72 
73 // Performance protocol performance limit.
74 typedef struct {
75   UINT32 RangeMax;
76   UINT32 RangeMin;
77 } SCMI_PERFORMANCE_LIMITS;
78 
79 #pragma pack()
80 
81 /** Return version of the performance management protocol supported by SCP.
82    firmware.
83 
84   @param[in]  This      A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
85 
86   @param[out] Version   Version of the supported SCMI performance management
87                         protocol.
88 
89   @retval EFI_SUCCESS       The version is returned.
90   @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
91   @retval !(EFI_SUCCESS)    Other errors.
92 **/
93 typedef
94 EFI_STATUS
95 (EFIAPI *SCMI_PERFORMANCE_GET_VERSION) (
96   IN  SCMI_PERFORMANCE_PROTOCOL  *This,
97   OUT UINT32                     *Version
98   );
99 
100 /** Return protocol attributes of the performance management protocol.
101 
102   @param[in] This         A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
103 
104   @param[out] Attributes  Protocol attributes.
105 
106   @retval EFI_SUCCESS       Protocol attributes are returned.
107   @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
108   @retval !(EFI_SUCCESS)    Other errors.
109 **/
110 typedef
111 EFI_STATUS
112 (EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES) (
113   IN  SCMI_PERFORMANCE_PROTOCOL              *This,
114   OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes
115 
116   );
117 
118 /** Return performance domain attributes.
119 
120   @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
121   @param[in]  DomainId    Identifier for the performance domain.
122 
123   @param[out] Attributes  Performance domain attributes.
124 
125   @retval EFI_SUCCESS       Domain attributes are returned.
126   @retval EFI_DEVICE_ERROR  SCP returns an SCMI error.
127   @retval !(EFI_SUCCESS)    Other errors.
128 **/
129 typedef
130 EFI_STATUS
131 (EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES) (
132   IN  SCMI_PERFORMANCE_PROTOCOL           *This,
133   IN  UINT32                               DomainId,
134   OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
135   );
136 
137 /** Return list of performance domain levels of a given domain.
138 
139   @param[in] This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
140   @param[in] DomainId    Identifier for the performance domain.
141 
142   @param[out] NumLevels   Total number of levels a domain can support.
143 
144   @param[in,out]  LevelArraySize Size of the performance level array.
145 
146   @param[out] LevelArray   Array of the performance levels.
147 
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.
153 **/
154 typedef
155 EFI_STATUS
156 (EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS) (
157   IN     SCMI_PERFORMANCE_PROTOCOL  *This,
158   IN     UINT32                     DomainId,
159   OUT    UINT32                     *NumLevels,
160   IN OUT UINT32                     *LevelArraySize,
161   OUT    SCMI_PERFORMANCE_LEVEL     *LevelArray
162   );
163 
164 /** Set performance limits of a domain.
165 
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.
169 
170   @retval EFI_SUCCESS          Performance limits set successfully.
171   @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
172   @retval !(EFI_SUCCESS)       Other errors.
173 **/
174 typedef
175 EFI_STATUS
176 (EFIAPI *SCMI_PERFORMANCE_LIMITS_SET) (
177   IN SCMI_PERFORMANCE_PROTOCOL *This,
178   IN UINT32                    DomainId,
179   IN SCMI_PERFORMANCE_LIMITS   *Limits
180   );
181 
182 /** Get performance limits of a domain.
183 
184   @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
185   @param[in]  DomainId    Identifier for the performance domain.
186 
187   @param[out] Limit       Performance Limits of the domain.
188 
189   @retval EFI_SUCCESS          Performance limits are returned.
190   @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
191   @retval !(EFI_SUCCESS)       Other errors.
192 **/
193 typedef
194 EFI_STATUS
195 (EFIAPI *SCMI_PERFORMANCE_LIMITS_GET) (
196   SCMI_PERFORMANCE_PROTOCOL *This,
197   UINT32                    DomainId,
198   SCMI_PERFORMANCE_LIMITS   *Limits
199   );
200 
201 /** Set performance level of a domain.
202 
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.
206 
207   @retval EFI_SUCCESS          Performance level set successfully.
208   @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
209   @retval !(EFI_SUCCESS)       Other errors.
210 **/
211 typedef
212 EFI_STATUS
213 (EFIAPI *SCMI_PERFORMANCE_LEVEL_SET) (
214   IN SCMI_PERFORMANCE_PROTOCOL *This,
215   IN UINT32                    DomainId,
216   IN UINT32                    Level
217   );
218 
219 /** Get performance level of a domain.
220 
221   @param[in]  This        A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
222   @param[in]  DomainId    Identifier for the performance domain.
223 
224   @param[out] Level       Performance level of the domain.
225 
226   @retval EFI_SUCCESS          Performance level got successfully.
227   @retval EFI_DEVICE_ERROR     SCP returns an SCMI error.
228   @retval !(EFI_SUCCESS)       Other errors.
229 **/
230 typedef
231 EFI_STATUS
232 (EFIAPI *SCMI_PERFORMANCE_LEVEL_GET) (
233   IN  SCMI_PERFORMANCE_PROTOCOL *This,
234   IN  UINT32                    DomainId,
235   OUT UINT32                    *Level
236   );
237 
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;
248 
249 typedef enum {
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;
257 
258 #endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
259 
260