1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. |
4 | */ |
5 | |
6 | #ifndef ABI_BPMP_ABI_H |
7 | #define ABI_BPMP_ABI_H |
8 | |
9 | #if defined(LK) || defined(BPMP_ABI_HAVE_STDC) |
10 | #include <stddef.h> |
11 | #include <stdint.h> |
12 | #endif |
13 | |
14 | #ifndef BPMP_ABI_PACKED |
15 | #ifdef __ABI_PACKED |
16 | #define BPMP_ABI_PACKED __ABI_PACKED |
17 | #else |
18 | #define BPMP_ABI_PACKED __attribute__((packed)) |
19 | #endif |
20 | #endif |
21 | |
22 | #ifdef NO_GCC_EXTENSIONS |
23 | #define BPMP_ABI_EMPTY char empty; |
24 | #define BPMP_ABI_EMPTY_ARRAY 1 |
25 | #else |
26 | #define BPMP_ABI_EMPTY |
27 | #define BPMP_ABI_EMPTY_ARRAY 0 |
28 | #endif |
29 | |
30 | #ifndef BPMP_UNION_ANON |
31 | #ifdef __UNION_ANON |
32 | #define BPMP_UNION_ANON __UNION_ANON |
33 | #else |
34 | #define BPMP_UNION_ANON |
35 | #endif |
36 | #endif |
37 | |
38 | /** |
39 | * @file |
40 | */ |
41 | |
42 | /** |
43 | * @defgroup MRQ MRQ Messages |
44 | * @brief Messages sent to/from BPMP via IPC |
45 | * @{ |
46 | * @defgroup MRQ_Format Message Format |
47 | * @defgroup MRQ_Codes Message Request (MRQ) Codes |
48 | * @defgroup MRQ_Payloads Message Payloads |
49 | * @defgroup Error_Codes Error Codes |
50 | * @} |
51 | */ |
52 | |
53 | /** |
54 | * @addtogroup MRQ_Format |
55 | * @{ |
56 | * The CPU requests the BPMP to perform a particular service by |
57 | * sending it an IVC frame containing a single MRQ message. An MRQ |
58 | * message consists of a @ref mrq_request followed by a payload whose |
59 | * format depends on mrq_request::mrq. |
60 | * |
61 | * The BPMP processes the data and replies with an IVC frame (on the |
62 | * same IVC channel) containing and MRQ response. An MRQ response |
63 | * consists of a @ref mrq_response followed by a payload whose format |
64 | * depends on the associated mrq_request::mrq. |
65 | * |
66 | * A well-defined subset of the MRQ messages that the CPU sends to the |
67 | * BPMP can lead to BPMP eventually sending an MRQ message to the |
68 | * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set |
69 | * a thermal trip point, the BPMP may eventually send a single |
70 | * #MRQ_THERMAL message of its own to the CPU indicating that the trip |
71 | * point has been crossed. |
72 | * @} |
73 | */ |
74 | |
75 | /** |
76 | * @ingroup MRQ_Format |
77 | * Request an answer from the peer. |
78 | * This should be set in mrq_request::flags for all requests targetted |
79 | * at BPMP. For requests originating in BPMP, this flag is optional except |
80 | * for messages targeting MCE, for which the field must be set. |
81 | * When this flag is not set, the remote peer must not send a response |
82 | * back. |
83 | */ |
84 | #define BPMP_MAIL_DO_ACK (1U << 0U) |
85 | |
86 | /** |
87 | * @ingroup MRQ_Format |
88 | * Ring the sender's doorbell when responding. This should be set unless |
89 | * the sender wants to poll the underlying communications layer directly. |
90 | * |
91 | * An optional direction that can be specified in mrq_request::flags. |
92 | */ |
93 | #define BPMP_MAIL_RING_DB (1U << 1U) |
94 | |
95 | /** |
96 | * @ingroup MRQ_Format |
97 | * CRC present |
98 | */ |
99 | #define BPMP_MAIL_CRC_PRESENT (1U << 2U) |
100 | |
101 | /** |
102 | * @ingroup MRQ_Format |
103 | * @brief Header for an MRQ message |
104 | * |
105 | * Provides the MRQ number for the MRQ message: #mrq. The remainder of |
106 | * the MRQ message is a payload (immediately following the |
107 | * mrq_request) whose format depends on mrq. |
108 | */ |
109 | struct mrq_request { |
110 | /** @brief MRQ number of the request */ |
111 | uint32_t mrq; |
112 | |
113 | /** |
114 | * @brief 32bit word containing a number of fields as follows: |
115 | * |
116 | * struct { |
117 | * uint8_t options:4; |
118 | * uint8_t xid:4; |
119 | * uint8_t payload_length; |
120 | * uint16_t crc16; |
121 | * }; |
122 | * |
123 | * **options** directions to the receiver and indicates CRC presence. |
124 | * |
125 | * #BPMP_MAIL_DO_ACK and #BPMP_MAIL_RING_DB see documentation of respective options. |
126 | * #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms. It indicates the |
127 | * crc16, xid and length fields are present when set. |
128 | * Some platform configurations, especially when targeted to applications requiring |
129 | * functional safety, mandate this option being set or otherwise will respond with |
130 | * -BPMP_EBADMSG and ignore the request. |
131 | * |
132 | * **xid** is a transaction ID. |
133 | * |
134 | * Only used when #BPMP_MAIL_CRC_PRESENT is set. |
135 | * |
136 | * **payload_length** of the message expressed in bytes without the size of this header. |
137 | * See table below for minimum accepted payload lengths for each MRQ. |
138 | * Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes |
139 | * rather than bytes. |
140 | * |
141 | * Only used when #BPMP_MAIL_CRC_PRESENT is set. |
142 | * |
143 | * | MRQ | CMD | minimum payload length |
144 | * | -------------------- | ------------------------------------ | ------------------------------------------ | |
145 | * | MRQ_PING | | 4 | |
146 | * | MRQ_THREADED_PING | | 4 | |
147 | * | MRQ_RESET | any | 8 | |
148 | * | MRQ_I2C | | 12 + cmd_i2c_xfer_request.data_size | |
149 | * | MRQ_CLK | CMD_CLK_GET_RATE | 4 | |
150 | * | MRQ_CLK | CMD_CLK_SET_RATE | 16 | |
151 | * | MRQ_CLK | CMD_CLK_ROUND_RATE | 16 | |
152 | * | MRQ_CLK | CMD_CLK_GET_PARENT | 4 | |
153 | * | MRQ_CLK | CMD_CLK_SET_PARENT | 8 | |
154 | * | MRQ_CLK | CMD_CLK_ENABLE | 4 | |
155 | * | MRQ_CLK | CMD_CLK_DISABLE | 4 | |
156 | * | MRQ_CLK | CMD_CLK_IS_ENABLED | 4 | |
157 | * | MRQ_CLK | CMD_CLK_GET_ALL_INFO | 4 | |
158 | * | MRQ_CLK | CMD_CLK_GET_MAX_CLK_ID | 4 | |
159 | * | MRQ_CLK | CMD_CLK_GET_FMAX_AT_VMIN | 4 | |
160 | * | MRQ_QUERY_ABI | | 4 | |
161 | * | MRQ_PG | CMD_PG_QUERY_ABI | 12 | |
162 | * | MRQ_PG | CMD_PG_SET_STATE | 12 | |
163 | * | MRQ_PG | CMD_PG_GET_STATE | 8 | |
164 | * | MRQ_PG | CMD_PG_GET_NAME | 8 | |
165 | * | MRQ_PG | CMD_PG_GET_MAX_ID | 8 | |
166 | * | MRQ_THERMAL | CMD_THERMAL_QUERY_ABI | 8 | |
167 | * | MRQ_THERMAL | CMD_THERMAL_GET_TEMP | 8 | |
168 | * | MRQ_THERMAL | CMD_THERMAL_SET_TRIP | 20 | |
169 | * | MRQ_THERMAL | CMD_THERMAL_GET_NUM_ZONES | 4 | |
170 | * | MRQ_THERMAL | CMD_THERMAL_GET_THERMTRIP | 8 | |
171 | * | MRQ_CPU_VHINT | | 8 | |
172 | * | MRQ_ABI_RATCHET | | 2 | |
173 | * | MRQ_EMC_DVFS_LATENCY | | 8 | |
174 | * | MRQ_EMC_DVFS_EMCHUB | | 8 | |
175 | * | MRQ_EMC_DISP_RFL | | 4 | |
176 | * | MRQ_BWMGR | CMD_BWMGR_QUERY_ABI | 8 | |
177 | * | MRQ_BWMGR | CMD_BWMGR_CALC_RATE | 8 + 8 * bwmgr_rate_req.num_iso_clients | |
178 | * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_QUERY_ABI | 8 | |
179 | * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_CALCULATE_LA | 16 | |
180 | * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_SET_LA | 16 | |
181 | * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_GET_MAX_BW | 8 | |
182 | * | MRQ_CPU_NDIV_LIMITS | | 4 | |
183 | * | MRQ_CPU_AUTO_CC3 | | 4 | |
184 | * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_QUERY_ABI | 8 | |
185 | * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_READ | 5 | |
186 | * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_WRITE | 5 + cmd_ringbuf_console_write_req.len | |
187 | * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_GET_FIFO | 4 | |
188 | * | MRQ_STRAP | STRAP_SET | 12 | |
189 | * | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | 24 | |
190 | * | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_STATUS | 4 | |
191 | * | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT | 5 | |
192 | * | MRQ_UPHY | CMD_UPHY_PCIE_CONTROLLER_STATE | 6 | |
193 | * | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF | 5 | |
194 | * | MRQ_FMON | CMD_FMON_GEAR_CLAMP | 16 | |
195 | * | MRQ_FMON | CMD_FMON_GEAR_FREE | 4 | |
196 | * | MRQ_FMON | CMD_FMON_GEAR_GET | 4 | |
197 | * | MRQ_FMON | CMD_FMON_FAULT_STS_GET | 8 | |
198 | * | MRQ_EC | CMD_EC_STATUS_EX_GET | 12 | |
199 | * | MRQ_QUERY_FW_TAG | | 0 | |
200 | * | MRQ_DEBUG | CMD_DEBUG_OPEN_RO | 4 + length of cmd_debug_fopen_request.name | |
201 | * | MRQ_DEBUG | CMD_DEBUG_OPEN_WO | 4 + length of cmd_debug_fopen_request.name | |
202 | * | MRQ_DEBUG | CMD_DEBUG_READ | 8 | |
203 | * | MRQ_DEBUG | CMD_DEBUG_WRITE | 12 + cmd_debug_fwrite_request.datalen | |
204 | * | MRQ_DEBUG | CMD_DEBUG_CLOSE | 8 | |
205 | * | MRQ_TELEMETRY | | 8 | |
206 | * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_QUERY_ABI | 8 | |
207 | * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_SET | 20 | |
208 | * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_GET | 16 | |
209 | * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_CURR_CAP | 8 | |
210 | * | MRQ_GEARS | | 0 | |
211 | * | MRQ_BWMGR_INT | CMD_BWMGR_INT_QUERY_ABI | 8 | |
212 | * | MRQ_BWMGR_INT | CMD_BWMGR_INT_CALC_AND_SET | 16 | |
213 | * | MRQ_BWMGR_INT | CMD_BWMGR_INT_CAP_SET | 8 | |
214 | * | MRQ_OC_STATUS | | 0 | |
215 | * |
216 | * **crc16** |
217 | * |
218 | * CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1 |
219 | * and initialization value 0x4657. The CRC is calculated over all bytes of the message |
220 | * including this header. However the crc16 field is considered to be set to 0 when |
221 | * calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. If |
222 | * #BPMP_MAIL_CRC_PRESENT is set and this field does not match the CRC as |
223 | * calculated by BPMP, -BPMP_EBADMSG will be returned and the request will |
224 | * be ignored. See code snippet below on how to calculate the CRC. |
225 | * |
226 | * @code |
227 | * uint16_t calc_crc_digest(uint16_t crc, uint8_t *data, size_t size) |
228 | * { |
229 | * for (size_t i = 0; i < size; i++) { |
230 | * crc ^= data[i] << 8; |
231 | * for (size_t j = 0; j < 8; j++) { |
232 | * if ((crc & 0x8000) == 0x8000) { |
233 | * crc = (crc << 1) ^ 0xAC9A; |
234 | * } else { |
235 | * crc = (crc << 1); |
236 | * } |
237 | * } |
238 | * } |
239 | * return crc; |
240 | * } |
241 | * |
242 | * uint16_t calc_crc(uint8_t *data, size_t size) |
243 | * { |
244 | * return calc_crc_digest(0x4657, data, size); |
245 | * } |
246 | * @endcode |
247 | */ |
248 | uint32_t flags; |
249 | } BPMP_ABI_PACKED; |
250 | |
251 | /** |
252 | * @ingroup MRQ_Format |
253 | * @brief Header for an MRQ response |
254 | * |
255 | * Provides an error code for the associated MRQ message. The |
256 | * remainder of the MRQ response is a payload (immediately following |
257 | * the mrq_response) whose format depends on the associated |
258 | * mrq_request::mrq |
259 | */ |
260 | struct mrq_response { |
261 | /** @brief Error code for the MRQ request itself */ |
262 | int32_t err; |
263 | |
264 | /** |
265 | * @brief 32bit word containing a number of fields as follows: |
266 | * |
267 | * struct { |
268 | * uint8_t options:4; |
269 | * uint8_t xid:4; |
270 | * uint8_t payload_length; |
271 | * uint16_t crc16; |
272 | * }; |
273 | * |
274 | * **options** indicates CRC presence. |
275 | * |
276 | * #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms and |
277 | * indicates the crc16 related fields are present when set. |
278 | * |
279 | * **xid** is the transaction ID as sent by the requestor. |
280 | * |
281 | * **length** of the message expressed in bytes without the size of this header. |
282 | * Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes |
283 | * rather than bytes. |
284 | * |
285 | * **crc16** |
286 | * |
287 | * CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1 |
288 | * and initialization value 0x4657. The CRC is calculated over all bytes of the message |
289 | * including this header. However the crc16 field is considered to be set to 0 when |
290 | * calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. |
291 | */ |
292 | uint32_t flags; |
293 | } BPMP_ABI_PACKED; |
294 | |
295 | /** |
296 | * @ingroup MRQ_Format |
297 | * Minimum needed size for an IPC message buffer |
298 | */ |
299 | #define MSG_MIN_SZ 128U |
300 | /** |
301 | * @ingroup MRQ_Format |
302 | * Minimum size guaranteed for data in an IPC message buffer |
303 | */ |
304 | #define MSG_DATA_MIN_SZ 120U |
305 | |
306 | /** |
307 | * @ingroup MRQ_Codes |
308 | * @name Legal MRQ codes |
309 | * These are the legal values for mrq_request::mrq |
310 | * @{ |
311 | */ |
312 | |
313 | #define MRQ_PING 0U |
314 | #define MRQ_QUERY_TAG 1U |
315 | #define MRQ_THREADED_PING 9U |
316 | #define MRQ_DEBUGFS 19U |
317 | #define MRQ_RESET 20U |
318 | #define MRQ_I2C 21U |
319 | #define MRQ_CLK 22U |
320 | #define MRQ_QUERY_ABI 23U |
321 | #define MRQ_THERMAL 27U |
322 | #define MRQ_CPU_VHINT 28U |
323 | #define MRQ_ABI_RATCHET 29U |
324 | #define MRQ_EMC_DVFS_LATENCY 31U |
325 | #define MRQ_RINGBUF_CONSOLE 65U |
326 | #define MRQ_PG 66U |
327 | #define MRQ_CPU_NDIV_LIMITS 67U |
328 | #define MRQ_STRAP 68U |
329 | #define MRQ_UPHY 69U |
330 | #define MRQ_CPU_AUTO_CC3 70U |
331 | #define MRQ_QUERY_FW_TAG 71U |
332 | #define MRQ_FMON 72U |
333 | #define MRQ_EC 73U |
334 | #define MRQ_DEBUG 75U |
335 | #define MRQ_EMC_DVFS_EMCHUB 76U |
336 | #define MRQ_BWMGR 77U |
337 | #define MRQ_ISO_CLIENT 78U |
338 | #define MRQ_EMC_DISP_RFL 79U |
339 | #define MRQ_TELEMETRY 80U |
340 | #define MRQ_PWR_LIMIT 81U |
341 | #define MRQ_GEARS 82U |
342 | #define MRQ_BWMGR_INT 83U |
343 | #define MRQ_OC_STATUS 84U |
344 | |
345 | /** @cond DEPRECATED */ |
346 | #define MRQ_RESERVED_2 2U |
347 | #define MRQ_RESERVED_3 3U |
348 | #define MRQ_RESERVED_4 4U |
349 | #define MRQ_RESERVED_5 5U |
350 | #define MRQ_RESERVED_6 6U |
351 | #define MRQ_RESERVED_7 7U |
352 | #define MRQ_RESERVED_8 8U |
353 | #define MRQ_RESERVED_10 10U |
354 | #define MRQ_RESERVED_11 11U |
355 | #define MRQ_RESERVED_12 12U |
356 | #define MRQ_RESERVED_13 13U |
357 | #define MRQ_RESERVED_14 14U |
358 | #define MRQ_RESERVED_15 15U |
359 | #define MRQ_RESERVED_16 16U |
360 | #define MRQ_RESERVED_17 17U |
361 | #define MRQ_RESERVED_18 18U |
362 | #define MRQ_RESERVED_24 24U |
363 | #define MRQ_RESERVED_25 25U |
364 | #define MRQ_RESERVED_26 26U |
365 | #define MRQ_RESERVED_30 30U |
366 | #define MRQ_RESERVED_64 64U |
367 | #define MRQ_RESERVED_74 74U |
368 | /** @endcond DEPRECATED */ |
369 | |
370 | /** @} */ |
371 | |
372 | /** |
373 | * @ingroup MRQ_Codes |
374 | * @brief Maximum MRQ code to be sent by CPU software to |
375 | * BPMP. Subject to change in future |
376 | */ |
377 | #define MAX_CPU_MRQ_ID 84U |
378 | |
379 | /** |
380 | * @addtogroup MRQ_Payloads |
381 | * @{ |
382 | * @defgroup Ping Ping |
383 | * @defgroup Query_Tag Query Tag |
384 | * @defgroup Module Loadable Modules |
385 | * @defgroup Trace Trace |
386 | * @defgroup Debugfs Debug File System |
387 | * @defgroup Reset Reset |
388 | * @defgroup I2C I2C |
389 | * @defgroup Clocks Clocks |
390 | * @defgroup ABI_info ABI Info |
391 | * @defgroup Powergating Power Gating |
392 | * @defgroup Thermal Thermal |
393 | * @defgroup OC_status OC status |
394 | * @defgroup Vhint CPU Voltage hint |
395 | * @defgroup EMC EMC |
396 | * @defgroup BWMGR BWMGR |
397 | * @defgroup ISO_CLIENT ISO_CLIENT |
398 | * @defgroup CPU NDIV Limits |
399 | * @defgroup RingbufConsole Ring Buffer Console |
400 | * @defgroup Strap Straps |
401 | * @defgroup UPHY UPHY |
402 | * @defgroup CC3 Auto-CC3 |
403 | * @defgroup FMON FMON |
404 | * @defgroup EC EC |
405 | * @defgroup Telemetry Telemetry |
406 | * @defgroup Pwrlimit PWR_LIMIT |
407 | * @defgroup Gears Gears |
408 | * @defgroup BWMGR_INT Bandwidth Manager Integrated |
409 | * @} MRQ_Payloads |
410 | */ |
411 | |
412 | /** |
413 | * @ingroup MRQ_Codes |
414 | * @def MRQ_PING |
415 | * @brief A simple ping |
416 | * |
417 | * * Platforms: All |
418 | * * Initiators: Any |
419 | * * Targets: Any |
420 | * * Request Payload: @ref mrq_ping_request |
421 | * * Response Payload: @ref mrq_ping_response |
422 | * |
423 | * @ingroup MRQ_Codes |
424 | * @def MRQ_THREADED_PING |
425 | * @brief A deeper ping |
426 | * |
427 | * * Platforms: All |
428 | * * Initiators: Any |
429 | * * Targets: BPMP |
430 | * * Request Payload: @ref mrq_ping_request |
431 | * * Response Payload: @ref mrq_ping_response |
432 | * |
433 | * Behavior is equivalent to a simple #MRQ_PING except that BPMP |
434 | * responds from a thread context (providing a slightly more robust |
435 | * sign of life). |
436 | * |
437 | */ |
438 | |
439 | /** |
440 | * @ingroup Ping |
441 | * @brief Request with #MRQ_PING |
442 | * |
443 | * Used by the sender of an #MRQ_PING message to request a pong from |
444 | * recipient. The response from the recipient is computed based on |
445 | * #challenge. |
446 | */ |
447 | struct mrq_ping_request { |
448 | /** @brief Arbitrarily chosen value */ |
449 | uint32_t challenge; |
450 | } BPMP_ABI_PACKED; |
451 | |
452 | /** |
453 | * @ingroup Ping |
454 | * @brief Response to #MRQ_PING |
455 | * |
456 | * Sent in response to an #MRQ_PING message. #reply should be the |
457 | * mrq_ping_request challenge left shifted by 1 with the carry-bit |
458 | * dropped. |
459 | * |
460 | */ |
461 | struct mrq_ping_response { |
462 | /** @brief Response to the MRQ_PING challege */ |
463 | uint32_t reply; |
464 | } BPMP_ABI_PACKED; |
465 | |
466 | /** |
467 | * @ingroup MRQ_Codes |
468 | * @def MRQ_QUERY_TAG |
469 | * @brief Query BPMP firmware's tag (i.e. unique identifer) |
470 | * |
471 | * @deprecated Use #MRQ_QUERY_FW_TAG instead. |
472 | * |
473 | * * Platforms: All |
474 | * * Initiators: CCPLEX |
475 | * * Targets: BPMP |
476 | * * Request Payload: @ref mrq_query_tag_request |
477 | * * Response Payload: N/A |
478 | * |
479 | */ |
480 | |
481 | /** |
482 | * @ingroup Query_Tag |
483 | * @brief Request with #MRQ_QUERY_TAG |
484 | * |
485 | * @deprecated This structure will be removed in future version. |
486 | * Use MRQ_QUERY_FW_TAG instead. |
487 | */ |
488 | struct mrq_query_tag_request { |
489 | /** @brief Base address to store the firmware tag */ |
490 | uint32_t addr; |
491 | } BPMP_ABI_PACKED; |
492 | |
493 | |
494 | /** |
495 | * @ingroup MRQ_Codes |
496 | * @def MRQ_QUERY_FW_TAG |
497 | * @brief Query BPMP firmware's tag (i.e. unique identifier) |
498 | * |
499 | * * Platforms: All |
500 | * * Initiators: Any |
501 | * * Targets: BPMP |
502 | * * Request Payload: N/A |
503 | * * Response Payload: @ref mrq_query_fw_tag_response |
504 | * |
505 | */ |
506 | |
507 | /** |
508 | * @ingroup Query_Tag |
509 | * @brief Response to #MRQ_QUERY_FW_TAG |
510 | * |
511 | * Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique |
512 | * identifier for the version of firmware issuing the reply. |
513 | * |
514 | */ |
515 | struct mrq_query_fw_tag_response { |
516 | /** @brief Array to store tag information */ |
517 | uint8_t tag[32]; |
518 | } BPMP_ABI_PACKED; |
519 | |
520 | /** @private */ |
521 | struct mrq_threaded_ping_request { |
522 | uint32_t challenge; |
523 | } BPMP_ABI_PACKED; |
524 | |
525 | /** @private */ |
526 | struct mrq_threaded_ping_response { |
527 | uint32_t reply; |
528 | } BPMP_ABI_PACKED; |
529 | |
530 | /** |
531 | * @ingroup MRQ_Codes |
532 | * @def MRQ_DEBUGFS |
533 | * @brief Interact with BPMP's debugfs file nodes |
534 | * |
535 | * @deprecated use MRQ_DEBUG instead. |
536 | * |
537 | * * Platforms: T186, T194 |
538 | * * Initiators: Any |
539 | * * Targets: BPMP |
540 | * * Request Payload: @ref mrq_debugfs_request |
541 | * * Response Payload: @ref mrq_debugfs_response |
542 | */ |
543 | |
544 | /** |
545 | * @addtogroup Debugfs |
546 | * @{ |
547 | * |
548 | * The BPMP firmware implements a pseudo-filesystem called |
549 | * debugfs. Any driver within the firmware may register with debugfs |
550 | * to expose an arbitrary set of "files" in the filesystem. When |
551 | * software on the CPU writes to a debugfs file, debugfs passes the |
552 | * written data to a callback provided by the driver. When software on |
553 | * the CPU reads a debugfs file, debugfs queries the driver for the |
554 | * data to return to the CPU. The intention of the debugfs filesystem |
555 | * is to provide information useful for debugging the system at |
556 | * runtime. |
557 | * |
558 | * @note The files exposed via debugfs are not part of the |
559 | * BPMP firmware's ABI. debugfs files may be added or removed in any |
560 | * given version of the firmware. Typically the semantics of a debugfs |
561 | * file are consistent from version to version but even that is not |
562 | * guaranteed. |
563 | * |
564 | * @} |
565 | */ |
566 | |
567 | /** @ingroup Debugfs */ |
568 | enum mrq_debugfs_commands { |
569 | /** @brief Perform read */ |
570 | CMD_DEBUGFS_READ = 1, |
571 | /** @brief Perform write */ |
572 | CMD_DEBUGFS_WRITE = 2, |
573 | /** @brief Perform dumping directory */ |
574 | CMD_DEBUGFS_DUMPDIR = 3, |
575 | /** @brief Not a command */ |
576 | CMD_DEBUGFS_MAX |
577 | }; |
578 | |
579 | /** |
580 | * @ingroup Debugfs |
581 | * @brief Parameters for CMD_DEBUGFS_READ/WRITE command |
582 | */ |
583 | struct cmd_debugfs_fileop_request { |
584 | /** @brief Physical address pointing at filename */ |
585 | uint32_t fnameaddr; |
586 | /** @brief Length in bytes of filename buffer */ |
587 | uint32_t fnamelen; |
588 | /** @brief Physical address pointing to data buffer */ |
589 | uint32_t dataaddr; |
590 | /** @brief Length in bytes of data buffer */ |
591 | uint32_t datalen; |
592 | } BPMP_ABI_PACKED; |
593 | |
594 | /** |
595 | * @ingroup Debugfs |
596 | * @brief Parameters for CMD_DEBUGFS_READ/WRITE command |
597 | */ |
598 | struct cmd_debugfs_dumpdir_request { |
599 | /** @brief Physical address pointing to data buffer */ |
600 | uint32_t dataaddr; |
601 | /** @brief Length in bytes of data buffer */ |
602 | uint32_t datalen; |
603 | } BPMP_ABI_PACKED; |
604 | |
605 | /** |
606 | * @ingroup Debugfs |
607 | * @brief Response data for CMD_DEBUGFS_READ/WRITE command |
608 | */ |
609 | struct cmd_debugfs_fileop_response { |
610 | /** @brief Always 0 */ |
611 | uint32_t reserved; |
612 | /** @brief Number of bytes read from or written to data buffer */ |
613 | uint32_t nbytes; |
614 | } BPMP_ABI_PACKED; |
615 | |
616 | /** |
617 | * @ingroup Debugfs |
618 | * @brief Response data for CMD_DEBUGFS_DUMPDIR command |
619 | */ |
620 | struct cmd_debugfs_dumpdir_response { |
621 | /** @brief Always 0 */ |
622 | uint32_t reserved; |
623 | /** @brief Number of bytes read from or written to data buffer */ |
624 | uint32_t nbytes; |
625 | } BPMP_ABI_PACKED; |
626 | |
627 | /** |
628 | * @ingroup Debugfs |
629 | * @brief Request with #MRQ_DEBUGFS. |
630 | * |
631 | * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs |
632 | * command to execute. Legal commands are the values of @ref |
633 | * mrq_debugfs_commands. Each command requires a specific additional |
634 | * payload of data. |
635 | * |
636 | * |command |payload| |
637 | * |-------------------|-------| |
638 | * |CMD_DEBUGFS_READ |fop | |
639 | * |CMD_DEBUGFS_WRITE |fop | |
640 | * |CMD_DEBUGFS_DUMPDIR|dumpdir| |
641 | */ |
642 | struct mrq_debugfs_request { |
643 | /** @brief Sub-command (@ref mrq_debugfs_commands) */ |
644 | uint32_t cmd; |
645 | union { |
646 | struct cmd_debugfs_fileop_request fop; |
647 | struct cmd_debugfs_dumpdir_request dumpdir; |
648 | } BPMP_UNION_ANON; |
649 | } BPMP_ABI_PACKED; |
650 | |
651 | /** |
652 | * @ingroup Debugfs |
653 | */ |
654 | struct mrq_debugfs_response { |
655 | /** @brief Always 0 */ |
656 | int32_t reserved; |
657 | union { |
658 | /** @brief Response data for CMD_DEBUGFS_READ OR |
659 | * CMD_DEBUGFS_WRITE command |
660 | */ |
661 | struct cmd_debugfs_fileop_response fop; |
662 | /** @brief Response data for CMD_DEBUGFS_DUMPDIR command */ |
663 | struct cmd_debugfs_dumpdir_response dumpdir; |
664 | } BPMP_UNION_ANON; |
665 | } BPMP_ABI_PACKED; |
666 | |
667 | /** |
668 | * @addtogroup Debugfs |
669 | * @{ |
670 | */ |
671 | #define DEBUGFS_S_ISDIR (1 << 9) |
672 | #define DEBUGFS_S_IRUSR (1 << 8) |
673 | #define DEBUGFS_S_IWUSR (1 << 7) |
674 | /** @} Debugfs */ |
675 | |
676 | /** |
677 | * @ingroup MRQ_Codes |
678 | * @def MRQ_DEBUG |
679 | * @brief Interact with BPMP's debugfs file nodes. Use message payload |
680 | * for exchanging data. This is functionally equivalent to |
681 | * @ref MRQ_DEBUGFS. But the way in which data is exchanged is different. |
682 | * When software running on CPU tries to read a debugfs file, |
683 | * the file path and read data will be stored in message payload. |
684 | * Since the message payload size is limited, a debugfs file |
685 | * transaction might require multiple frames of data exchanged |
686 | * between BPMP and CPU until the transaction completes. |
687 | * |
688 | * * Platforms: T194 |
689 | * * Initiators: Any |
690 | * * Targets: BPMP |
691 | * * Request Payload: @ref mrq_debug_request |
692 | * * Response Payload: @ref mrq_debug_response |
693 | */ |
694 | |
695 | /** @ingroup Debugfs */ |
696 | enum mrq_debug_commands { |
697 | /** @brief Open required file for read operation */ |
698 | CMD_DEBUG_OPEN_RO = 0, |
699 | /** @brief Open required file for write operation */ |
700 | CMD_DEBUG_OPEN_WO = 1, |
701 | /** @brief Perform read */ |
702 | CMD_DEBUG_READ = 2, |
703 | /** @brief Perform write */ |
704 | CMD_DEBUG_WRITE = 3, |
705 | /** @brief Close file */ |
706 | CMD_DEBUG_CLOSE = 4, |
707 | /** @brief Not a command */ |
708 | CMD_DEBUG_MAX |
709 | }; |
710 | |
711 | /** |
712 | * @ingroup Debugfs |
713 | * @brief Maximum number of files that can be open at a given time |
714 | */ |
715 | #define DEBUG_MAX_OPEN_FILES 1 |
716 | |
717 | /** |
718 | * @ingroup Debugfs |
719 | * @brief Maximum size of null-terminated file name string in bytes. |
720 | * Value is derived from memory available in message payload while |
721 | * using @ref cmd_debug_fopen_request |
722 | * Value 4 corresponds to size of @ref mrq_debug_commands |
723 | * in @ref mrq_debug_request. |
724 | * 120 - 4 dbg_cmd(32bit) = 116 |
725 | */ |
726 | #define DEBUG_FNAME_MAX_SZ (MSG_DATA_MIN_SZ - 4) |
727 | |
728 | /** |
729 | * @ingroup Debugfs |
730 | * @brief Parameters for CMD_DEBUG_OPEN command |
731 | */ |
732 | struct cmd_debug_fopen_request { |
733 | /** @brief File name - Null-terminated string with maximum |
734 | * length @ref DEBUG_FNAME_MAX_SZ |
735 | */ |
736 | char name[DEBUG_FNAME_MAX_SZ]; |
737 | } BPMP_ABI_PACKED; |
738 | |
739 | /** |
740 | * @ingroup Debugfs |
741 | * @brief Response data for CMD_DEBUG_OPEN_RO/WO command |
742 | */ |
743 | struct cmd_debug_fopen_response { |
744 | /** @brief Identifier for file access */ |
745 | uint32_t fd; |
746 | /** @brief Data length. File data size for READ command. |
747 | * Maximum allowed length for WRITE command |
748 | */ |
749 | uint32_t datalen; |
750 | } BPMP_ABI_PACKED; |
751 | |
752 | /** |
753 | * @ingroup Debugfs |
754 | * @brief Parameters for CMD_DEBUG_READ command |
755 | */ |
756 | struct cmd_debug_fread_request { |
757 | /** @brief File access identifier received in response |
758 | * to CMD_DEBUG_OPEN_RO request |
759 | */ |
760 | uint32_t fd; |
761 | } BPMP_ABI_PACKED; |
762 | |
763 | /** |
764 | * @ingroup Debugfs |
765 | * @brief Maximum size of read data in bytes. |
766 | * Value is derived from memory available in message payload while |
767 | * using @ref cmd_debug_fread_response. |
768 | */ |
769 | #define DEBUG_READ_MAX_SZ (MSG_DATA_MIN_SZ - 4) |
770 | |
771 | /** |
772 | * @ingroup Debugfs |
773 | * @brief Response data for CMD_DEBUG_READ command |
774 | */ |
775 | struct cmd_debug_fread_response { |
776 | /** @brief Size of data provided in this response in bytes */ |
777 | uint32_t readlen; |
778 | /** @brief File data from seek position */ |
779 | char data[DEBUG_READ_MAX_SZ]; |
780 | } BPMP_ABI_PACKED; |
781 | |
782 | /** |
783 | * @ingroup Debugfs |
784 | * @brief Maximum size of write data in bytes. |
785 | * Value is derived from memory available in message payload while |
786 | * using @ref cmd_debug_fwrite_request. |
787 | */ |
788 | #define DEBUG_WRITE_MAX_SZ (MSG_DATA_MIN_SZ - 12) |
789 | |
790 | /** |
791 | * @ingroup Debugfs |
792 | * @brief Parameters for CMD_DEBUG_WRITE command |
793 | */ |
794 | struct cmd_debug_fwrite_request { |
795 | /** @brief File access identifier received in response |
796 | * to CMD_DEBUG_OPEN_RO request |
797 | */ |
798 | uint32_t fd; |
799 | /** @brief Size of write data in bytes */ |
800 | uint32_t datalen; |
801 | /** @brief Data to be written */ |
802 | char data[DEBUG_WRITE_MAX_SZ]; |
803 | } BPMP_ABI_PACKED; |
804 | |
805 | /** |
806 | * @ingroup Debugfs |
807 | * @brief Parameters for CMD_DEBUG_CLOSE command |
808 | */ |
809 | struct cmd_debug_fclose_request { |
810 | /** @brief File access identifier received in response |
811 | * to CMD_DEBUG_OPEN_RO request |
812 | */ |
813 | uint32_t fd; |
814 | } BPMP_ABI_PACKED; |
815 | |
816 | /** |
817 | * @ingroup Debugfs |
818 | * @brief Request with #MRQ_DEBUG. |
819 | * |
820 | * The sender of an MRQ_DEBUG message uses #cmd to specify a debugfs |
821 | * command to execute. Legal commands are the values of @ref |
822 | * mrq_debug_commands. Each command requires a specific additional |
823 | * payload of data. |
824 | * |
825 | * |command |payload| |
826 | * |-------------------|-------| |
827 | * |CMD_DEBUG_OPEN_RO |fop | |
828 | * |CMD_DEBUG_OPEN_WO |fop | |
829 | * |CMD_DEBUG_READ |frd | |
830 | * |CMD_DEBUG_WRITE |fwr | |
831 | * |CMD_DEBUG_CLOSE |fcl | |
832 | */ |
833 | struct mrq_debug_request { |
834 | /** @brief Sub-command (@ref mrq_debug_commands) */ |
835 | uint32_t cmd; |
836 | union { |
837 | /** @brief Request payload for CMD_DEBUG_OPEN_RO/WO command */ |
838 | struct cmd_debug_fopen_request fop; |
839 | /** @brief Request payload for CMD_DEBUG_READ command */ |
840 | struct cmd_debug_fread_request frd; |
841 | /** @brief Request payload for CMD_DEBUG_WRITE command */ |
842 | struct cmd_debug_fwrite_request fwr; |
843 | /** @brief Request payload for CMD_DEBUG_CLOSE command */ |
844 | struct cmd_debug_fclose_request fcl; |
845 | } BPMP_UNION_ANON; |
846 | } BPMP_ABI_PACKED; |
847 | |
848 | /** |
849 | * @ingroup Debugfs |
850 | */ |
851 | struct mrq_debug_response { |
852 | union { |
853 | /** @brief Response data for CMD_DEBUG_OPEN_RO/WO command */ |
854 | struct cmd_debug_fopen_response fop; |
855 | /** @brief Response data for CMD_DEBUG_READ command */ |
856 | struct cmd_debug_fread_response frd; |
857 | } BPMP_UNION_ANON; |
858 | } BPMP_ABI_PACKED; |
859 | |
860 | /** |
861 | * @ingroup MRQ_Codes |
862 | * @def MRQ_RESET |
863 | * @brief Reset an IP block |
864 | * |
865 | * * Platforms: T186, T194 |
866 | * * Initiators: Any |
867 | * * Targets: BPMP |
868 | * * Request Payload: @ref mrq_reset_request |
869 | * * Response Payload: @ref mrq_reset_response |
870 | * |
871 | * @addtogroup Reset |
872 | * @{ |
873 | */ |
874 | |
875 | enum mrq_reset_commands { |
876 | /** |
877 | * @brief Assert module reset |
878 | * |
879 | * mrq_response::err is 0 if the operation was successful, or @n |
880 | * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n |
881 | * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n |
882 | * -#BPMP_ENOTSUP if target domain h/w state does not allow reset |
883 | */ |
884 | CMD_RESET_ASSERT = 1, |
885 | /** |
886 | * @brief Deassert module reset |
887 | * |
888 | * mrq_response::err is 0 if the operation was successful, or @n |
889 | * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n |
890 | * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n |
891 | * -#BPMP_ENOTSUP if target domain h/w state does not allow reset |
892 | */ |
893 | CMD_RESET_DEASSERT = 2, |
894 | /** |
895 | * @brief Assert and deassert the module reset |
896 | * |
897 | * mrq_response::err is 0 if the operation was successful, or @n |
898 | * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n |
899 | * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n |
900 | * -#BPMP_ENOTSUP if target domain h/w state does not allow reset |
901 | */ |
902 | CMD_RESET_MODULE = 3, |
903 | /** |
904 | * @brief Get the highest reset ID |
905 | * |
906 | * mrq_response::err is 0 if the operation was successful, or @n |
907 | * -#BPMP_ENODEV if no reset domains are supported (number of IDs is 0) |
908 | */ |
909 | CMD_RESET_GET_MAX_ID = 4, |
910 | |
911 | /** @brief Not part of ABI and subject to change */ |
912 | CMD_RESET_MAX, |
913 | }; |
914 | |
915 | /** |
916 | * @brief Request with MRQ_RESET |
917 | * |
918 | * Used by the sender of an #MRQ_RESET message to request BPMP to |
919 | * assert or or deassert a given reset line. |
920 | */ |
921 | struct mrq_reset_request { |
922 | /** @brief Reset action to perform (@ref mrq_reset_commands) */ |
923 | uint32_t cmd; |
924 | /** @brief Id of the reset to affected */ |
925 | uint32_t reset_id; |
926 | } BPMP_ABI_PACKED; |
927 | |
928 | /** |
929 | * @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When |
930 | * this sub-command is not supported, firmware will return -BPMP_EBADCMD |
931 | * in mrq_response::err. |
932 | */ |
933 | struct cmd_reset_get_max_id_response { |
934 | /** @brief Max reset id */ |
935 | uint32_t max_id; |
936 | } BPMP_ABI_PACKED; |
937 | |
938 | /** |
939 | * @brief Response with MRQ_RESET |
940 | * |
941 | * Each sub-command supported by @ref mrq_reset_request may return |
942 | * sub-command-specific data. Some do and some do not as indicated |
943 | * in the following table |
944 | * |
945 | * | sub-command | payload | |
946 | * |----------------------|------------------| |
947 | * | CMD_RESET_ASSERT | - | |
948 | * | CMD_RESET_DEASSERT | - | |
949 | * | CMD_RESET_MODULE | - | |
950 | * | CMD_RESET_GET_MAX_ID | reset_get_max_id | |
951 | */ |
952 | struct mrq_reset_response { |
953 | union { |
954 | struct cmd_reset_get_max_id_response reset_get_max_id; |
955 | } BPMP_UNION_ANON; |
956 | } BPMP_ABI_PACKED; |
957 | |
958 | /** @} Reset */ |
959 | |
960 | /** |
961 | * @ingroup MRQ_Codes |
962 | * @def MRQ_I2C |
963 | * @brief Issue an i2c transaction |
964 | * |
965 | * * Platforms: T186, T194 |
966 | * * Initiators: Any |
967 | * * Targets: BPMP |
968 | * * Request Payload: @ref mrq_i2c_request |
969 | * * Response Payload: @ref mrq_i2c_response |
970 | * |
971 | * @addtogroup I2C |
972 | * @{ |
973 | */ |
974 | #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE (MSG_DATA_MIN_SZ - 12U) |
975 | #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE (MSG_DATA_MIN_SZ - 4U) |
976 | |
977 | #define SERIALI2C_TEN 0x0010U |
978 | #define SERIALI2C_RD 0x0001U |
979 | #define SERIALI2C_STOP 0x8000U |
980 | #define SERIALI2C_NOSTART 0x4000U |
981 | #define SERIALI2C_REV_DIR_ADDR 0x2000U |
982 | #define SERIALI2C_IGNORE_NAK 0x1000U |
983 | #define SERIALI2C_NO_RD_ACK 0x0800U |
984 | #define SERIALI2C_RECV_LEN 0x0400U |
985 | |
986 | enum { |
987 | CMD_I2C_XFER = 1 |
988 | }; |
989 | |
990 | /** |
991 | * @brief Serializable i2c request |
992 | * |
993 | * Instances of this structure are packed (little-endian) into |
994 | * cmd_i2c_xfer_request::data_buf. Each instance represents a single |
995 | * transaction (or a portion of a transaction with repeated starts) on |
996 | * an i2c bus. |
997 | * |
998 | * Because these structures are packed, some instances are likely to |
999 | * be misaligned. Additionally because #data is variable length, it is |
1000 | * not possible to iterate through a serialized list of these |
1001 | * structures without inspecting #len in each instance. It may be |
1002 | * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf |
1003 | * manually rather than using this structure definition. |
1004 | */ |
1005 | struct serial_i2c_request { |
1006 | /** @brief I2C slave address */ |
1007 | uint16_t addr; |
1008 | /** @brief Bitmask of SERIALI2C_ flags */ |
1009 | uint16_t flags; |
1010 | /** @brief Length of I2C transaction in bytes */ |
1011 | uint16_t len; |
1012 | /** @brief For write transactions only, #len bytes of data */ |
1013 | uint8_t data[]; |
1014 | } BPMP_ABI_PACKED; |
1015 | |
1016 | /** |
1017 | * @brief Trigger one or more i2c transactions |
1018 | */ |
1019 | struct cmd_i2c_xfer_request { |
1020 | /** |
1021 | * @brief Tegra PWR_I2C bus identifier |
1022 | * |
1023 | * @cond (bpmp_t234 || bpmp_t239 || bpmp_t194) |
1024 | * Must be set to 5. |
1025 | * @endcond (bpmp_t234 || bpmp_t239 || bpmp_t194) |
1026 | * @cond bpmp_th500 |
1027 | * Must be set to 1. |
1028 | * @endcond bpmp_th500 |
1029 | * |
1030 | */ |
1031 | uint32_t bus_id; |
1032 | |
1033 | /** @brief Count of valid bytes in #data_buf*/ |
1034 | uint32_t data_size; |
1035 | |
1036 | /** @brief Serialized packed instances of @ref serial_i2c_request*/ |
1037 | uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE]; |
1038 | } BPMP_ABI_PACKED; |
1039 | |
1040 | /** |
1041 | * @brief Container for data read from the i2c bus |
1042 | * |
1043 | * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute |
1044 | * zero or more I2C reads. The data read from the bus is serialized |
1045 | * into #data_buf. |
1046 | */ |
1047 | struct cmd_i2c_xfer_response { |
1048 | /** @brief Count of valid bytes in #data_buf*/ |
1049 | uint32_t data_size; |
1050 | /** @brief I2c read data */ |
1051 | uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE]; |
1052 | } BPMP_ABI_PACKED; |
1053 | |
1054 | /** |
1055 | * @brief Request with #MRQ_I2C |
1056 | */ |
1057 | struct mrq_i2c_request { |
1058 | /** @brief Always CMD_I2C_XFER (i.e. 1) */ |
1059 | uint32_t cmd; |
1060 | /** @brief Parameters of the transfer request */ |
1061 | struct cmd_i2c_xfer_request xfer; |
1062 | } BPMP_ABI_PACKED; |
1063 | |
1064 | /** |
1065 | * @brief Response to #MRQ_I2C |
1066 | * |
1067 | * mrq_response:err is |
1068 | * 0: Success |
1069 | * -#BPMP_EBADCMD: if mrq_i2c_request::cmd is other than 1 |
1070 | * -#BPMP_EINVAL: if cmd_i2c_xfer_request does not contain correctly formatted request |
1071 | * -#BPMP_ENODEV: if cmd_i2c_xfer_request::bus_id is not supported by BPMP |
1072 | * -#BPMP_EACCES: if i2c transaction is not allowed due to firewall rules |
1073 | * -#BPMP_ETIMEDOUT: if i2c transaction times out |
1074 | * -#BPMP_ENXIO: if i2c slave device does not reply with ACK to the transaction |
1075 | * -#BPMP_EAGAIN: if ARB_LOST condition is detected by the i2c controller |
1076 | * -#BPMP_EIO: any other i2c controller error code than NO_ACK or ARB_LOST |
1077 | */ |
1078 | struct mrq_i2c_response { |
1079 | struct cmd_i2c_xfer_response xfer; |
1080 | } BPMP_ABI_PACKED; |
1081 | |
1082 | /** @} I2C */ |
1083 | |
1084 | /** |
1085 | * @ingroup MRQ_Codes |
1086 | * @def MRQ_CLK |
1087 | * @brief Perform a clock operation |
1088 | * |
1089 | * * Platforms: T186, T194 |
1090 | * * Initiators: Any |
1091 | * * Targets: BPMP |
1092 | * * Request Payload: @ref mrq_clk_request |
1093 | * * Response Payload: @ref mrq_clk_response |
1094 | * |
1095 | * @addtogroup Clocks |
1096 | * @{ |
1097 | */ |
1098 | enum { |
1099 | CMD_CLK_GET_RATE = 1, |
1100 | CMD_CLK_SET_RATE = 2, |
1101 | CMD_CLK_ROUND_RATE = 3, |
1102 | CMD_CLK_GET_PARENT = 4, |
1103 | CMD_CLK_SET_PARENT = 5, |
1104 | CMD_CLK_IS_ENABLED = 6, |
1105 | CMD_CLK_ENABLE = 7, |
1106 | CMD_CLK_DISABLE = 8, |
1107 | /** @cond DEPRECATED */ |
1108 | CMD_CLK_PROPERTIES = 9, |
1109 | CMD_CLK_POSSIBLE_PARENTS = 10, |
1110 | CMD_CLK_NUM_POSSIBLE_PARENTS = 11, |
1111 | CMD_CLK_GET_POSSIBLE_PARENT = 12, |
1112 | CMD_CLK_RESET_REFCOUNTS = 13, |
1113 | /** @endcond DEPRECATED */ |
1114 | CMD_CLK_GET_ALL_INFO = 14, |
1115 | CMD_CLK_GET_MAX_CLK_ID = 15, |
1116 | CMD_CLK_GET_FMAX_AT_VMIN = 16, |
1117 | CMD_CLK_MAX, |
1118 | }; |
1119 | |
1120 | #define BPMP_CLK_HAS_MUX (1U << 0U) |
1121 | #define BPMP_CLK_HAS_SET_RATE (1U << 1U) |
1122 | #define BPMP_CLK_IS_ROOT (1U << 2U) |
1123 | #define BPMP_CLK_IS_VAR_ROOT (1U << 3U) |
1124 | /** |
1125 | * @brief Protection against rate and parent changes |
1126 | * |
1127 | * #MRQ_CLK command #CMD_CLK_SET_RATE or #MRQ_CLK command #CMD_CLK_SET_PARENT will return |
1128 | * -#BPMP_EACCES. |
1129 | */ |
1130 | #define BPMP_CLK_RATE_PARENT_CHANGE_DENIED (1U << 30) |
1131 | |
1132 | /** |
1133 | * @brief Protection against state changes |
1134 | * |
1135 | * #MRQ_CLK command #CMD_CLK_ENABLE or #MRQ_CLK command #CMD_CLK_DISABLE will return |
1136 | * -#BPMP_EACCES. |
1137 | */ |
1138 | #define BPMP_CLK_STATE_CHANGE_DENIED (1U << 31) |
1139 | |
1140 | #define MRQ_CLK_NAME_MAXLEN 40U |
1141 | #define MRQ_CLK_MAX_PARENTS 16U |
1142 | |
1143 | /** @private */ |
1144 | struct cmd_clk_get_rate_request { |
1145 | BPMP_ABI_EMPTY |
1146 | } BPMP_ABI_PACKED; |
1147 | |
1148 | struct cmd_clk_get_rate_response { |
1149 | int64_t rate; |
1150 | } BPMP_ABI_PACKED; |
1151 | |
1152 | struct cmd_clk_set_rate_request { |
1153 | int32_t unused; |
1154 | int64_t rate; |
1155 | } BPMP_ABI_PACKED; |
1156 | |
1157 | struct cmd_clk_set_rate_response { |
1158 | int64_t rate; |
1159 | } BPMP_ABI_PACKED; |
1160 | |
1161 | struct cmd_clk_round_rate_request { |
1162 | int32_t unused; |
1163 | int64_t rate; |
1164 | } BPMP_ABI_PACKED; |
1165 | |
1166 | struct cmd_clk_round_rate_response { |
1167 | int64_t rate; |
1168 | } BPMP_ABI_PACKED; |
1169 | |
1170 | /** @private */ |
1171 | struct cmd_clk_get_parent_request { |
1172 | BPMP_ABI_EMPTY |
1173 | } BPMP_ABI_PACKED; |
1174 | |
1175 | struct cmd_clk_get_parent_response { |
1176 | uint32_t parent_id; |
1177 | } BPMP_ABI_PACKED; |
1178 | |
1179 | struct cmd_clk_set_parent_request { |
1180 | uint32_t parent_id; |
1181 | } BPMP_ABI_PACKED; |
1182 | |
1183 | struct cmd_clk_set_parent_response { |
1184 | uint32_t parent_id; |
1185 | } BPMP_ABI_PACKED; |
1186 | |
1187 | /** @private */ |
1188 | struct cmd_clk_is_enabled_request { |
1189 | BPMP_ABI_EMPTY |
1190 | } BPMP_ABI_PACKED; |
1191 | |
1192 | /** |
1193 | * @brief Response data to #MRQ_CLK sub-command CMD_CLK_IS_ENABLED |
1194 | */ |
1195 | struct cmd_clk_is_enabled_response { |
1196 | /** |
1197 | * @brief The state of the clock that has been successfully |
1198 | * requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the |
1199 | * master invoking the command earlier. |
1200 | * |
1201 | * The state may not reflect the physical state of the clock |
1202 | * if there are some other masters requesting it to be |
1203 | * enabled. |
1204 | * |
1205 | * Value 0 is disabled, all other values indicate enabled. |
1206 | */ |
1207 | int32_t state; |
1208 | } BPMP_ABI_PACKED; |
1209 | |
1210 | /** @private */ |
1211 | struct cmd_clk_enable_request { |
1212 | BPMP_ABI_EMPTY |
1213 | } BPMP_ABI_PACKED; |
1214 | |
1215 | /** @private */ |
1216 | struct cmd_clk_enable_response { |
1217 | BPMP_ABI_EMPTY |
1218 | } BPMP_ABI_PACKED; |
1219 | |
1220 | /** @private */ |
1221 | struct cmd_clk_disable_request { |
1222 | BPMP_ABI_EMPTY |
1223 | } BPMP_ABI_PACKED; |
1224 | |
1225 | /** @private */ |
1226 | struct cmd_clk_disable_response { |
1227 | BPMP_ABI_EMPTY |
1228 | } BPMP_ABI_PACKED; |
1229 | |
1230 | /** @cond DEPRECATED */ |
1231 | /** @private */ |
1232 | struct cmd_clk_properties_request { |
1233 | BPMP_ABI_EMPTY |
1234 | } BPMP_ABI_PACKED; |
1235 | |
1236 | /** @todo flags need to be spelled out here */ |
1237 | struct cmd_clk_properties_response { |
1238 | uint32_t flags; |
1239 | } BPMP_ABI_PACKED; |
1240 | |
1241 | /** @private */ |
1242 | struct cmd_clk_possible_parents_request { |
1243 | BPMP_ABI_EMPTY |
1244 | } BPMP_ABI_PACKED; |
1245 | |
1246 | struct cmd_clk_possible_parents_response { |
1247 | uint8_t num_parents; |
1248 | uint8_t reserved[3]; |
1249 | uint32_t parent_id[MRQ_CLK_MAX_PARENTS]; |
1250 | } BPMP_ABI_PACKED; |
1251 | |
1252 | /** @private */ |
1253 | struct cmd_clk_num_possible_parents_request { |
1254 | BPMP_ABI_EMPTY |
1255 | } BPMP_ABI_PACKED; |
1256 | |
1257 | struct cmd_clk_num_possible_parents_response { |
1258 | uint8_t num_parents; |
1259 | } BPMP_ABI_PACKED; |
1260 | |
1261 | struct cmd_clk_get_possible_parent_request { |
1262 | uint8_t parent_idx; |
1263 | } BPMP_ABI_PACKED; |
1264 | |
1265 | struct cmd_clk_get_possible_parent_response { |
1266 | uint32_t parent_id; |
1267 | } BPMP_ABI_PACKED; |
1268 | /** @endcond DEPRECATED */ |
1269 | |
1270 | /** @private */ |
1271 | struct cmd_clk_get_all_info_request { |
1272 | BPMP_ABI_EMPTY |
1273 | } BPMP_ABI_PACKED; |
1274 | |
1275 | struct cmd_clk_get_all_info_response { |
1276 | uint32_t flags; |
1277 | uint32_t parent; |
1278 | uint32_t parents[MRQ_CLK_MAX_PARENTS]; |
1279 | uint8_t num_parents; |
1280 | uint8_t name[MRQ_CLK_NAME_MAXLEN]; |
1281 | } BPMP_ABI_PACKED; |
1282 | |
1283 | /** @private */ |
1284 | struct cmd_clk_get_max_clk_id_request { |
1285 | BPMP_ABI_EMPTY |
1286 | } BPMP_ABI_PACKED; |
1287 | |
1288 | struct cmd_clk_get_max_clk_id_response { |
1289 | uint32_t max_id; |
1290 | } BPMP_ABI_PACKED; |
1291 | |
1292 | /** @private */ |
1293 | struct cmd_clk_get_fmax_at_vmin_request { |
1294 | BPMP_ABI_EMPTY |
1295 | } BPMP_ABI_PACKED; |
1296 | |
1297 | struct cmd_clk_get_fmax_at_vmin_response { |
1298 | int64_t rate; |
1299 | } BPMP_ABI_PACKED; |
1300 | |
1301 | |
1302 | /** |
1303 | * @ingroup Clocks |
1304 | * @brief Request with #MRQ_CLK |
1305 | * |
1306 | * Used by the sender of an #MRQ_CLK message to control clocks. The |
1307 | * clk_request is split into several sub-commands. Some sub-commands |
1308 | * require no additional data. Others have a sub-command specific |
1309 | * payload |
1310 | * |
1311 | * |sub-command |payload | |
1312 | * |----------------------------|-----------------------| |
1313 | * |CMD_CLK_GET_RATE |- | |
1314 | * |CMD_CLK_SET_RATE |clk_set_rate | |
1315 | * |CMD_CLK_ROUND_RATE |clk_round_rate | |
1316 | * |CMD_CLK_GET_PARENT |- | |
1317 | * |CMD_CLK_SET_PARENT |clk_set_parent | |
1318 | * |CMD_CLK_IS_ENABLED |- | |
1319 | * |CMD_CLK_ENABLE |- | |
1320 | * |CMD_CLK_DISABLE |- | |
1321 | * |CMD_CLK_GET_ALL_INFO |- | |
1322 | * |CMD_CLK_GET_MAX_CLK_ID |- | |
1323 | * |CMD_CLK_GET_FMAX_AT_VMIN |- |
1324 | * | |
1325 | * |
1326 | */ |
1327 | |
1328 | /** @cond DEPRECATED |
1329 | * |
1330 | * Older versions of firmware also supported following sub-commands: |
1331 | * |CMD_CLK_PROPERTIES |- | |
1332 | * |CMD_CLK_POSSIBLE_PARENTS |- | |
1333 | * |CMD_CLK_NUM_POSSIBLE_PARENTS|- | |
1334 | * |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parent| |
1335 | * |CMD_CLK_RESET_REFCOUNTS |- | |
1336 | * |
1337 | * @endcond DEPRECATED */ |
1338 | |
1339 | struct mrq_clk_request { |
1340 | /** @brief Sub-command and clock id concatenated to 32-bit word. |
1341 | * - bits[31..24] is the sub-cmd. |
1342 | * - bits[23..0] is the clock id |
1343 | */ |
1344 | uint32_t cmd_and_id; |
1345 | |
1346 | union { |
1347 | /** @private */ |
1348 | struct cmd_clk_get_rate_request clk_get_rate; |
1349 | struct cmd_clk_set_rate_request clk_set_rate; |
1350 | struct cmd_clk_round_rate_request clk_round_rate; |
1351 | /** @private */ |
1352 | struct cmd_clk_get_parent_request clk_get_parent; |
1353 | struct cmd_clk_set_parent_request clk_set_parent; |
1354 | /** @private */ |
1355 | struct cmd_clk_enable_request clk_enable; |
1356 | /** @private */ |
1357 | struct cmd_clk_disable_request clk_disable; |
1358 | /** @private */ |
1359 | struct cmd_clk_is_enabled_request clk_is_enabled; |
1360 | /** @cond DEPRECATED */ |
1361 | /** @private */ |
1362 | struct cmd_clk_properties_request clk_properties; |
1363 | /** @private */ |
1364 | struct cmd_clk_possible_parents_request clk_possible_parents; |
1365 | /** @private */ |
1366 | struct cmd_clk_num_possible_parents_request clk_num_possible_parents; |
1367 | struct cmd_clk_get_possible_parent_request clk_get_possible_parent; |
1368 | /** @endcond DEPRECATED */ |
1369 | /** @private */ |
1370 | struct cmd_clk_get_all_info_request clk_get_all_info; |
1371 | /** @private */ |
1372 | struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id; |
1373 | /** @private */ |
1374 | struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin; |
1375 | } BPMP_UNION_ANON; |
1376 | } BPMP_ABI_PACKED; |
1377 | |
1378 | /** |
1379 | * @ingroup Clocks |
1380 | * @brief Response to MRQ_CLK |
1381 | * |
1382 | * Each sub-command supported by @ref mrq_clk_request may return |
1383 | * sub-command-specific data. Some do and some do not as indicated in |
1384 | * the following table |
1385 | * |
1386 | * |sub-command |payload | |
1387 | * |----------------------------|------------------------| |
1388 | * |CMD_CLK_GET_RATE |clk_get_rate | |
1389 | * |CMD_CLK_SET_RATE |clk_set_rate | |
1390 | * |CMD_CLK_ROUND_RATE |clk_round_rate | |
1391 | * |CMD_CLK_GET_PARENT |clk_get_parent | |
1392 | * |CMD_CLK_SET_PARENT |clk_set_parent | |
1393 | * |CMD_CLK_IS_ENABLED |clk_is_enabled | |
1394 | * |CMD_CLK_ENABLE |- | |
1395 | * |CMD_CLK_DISABLE |- | |
1396 | * |CMD_CLK_GET_ALL_INFO |clk_get_all_info | |
1397 | * |CMD_CLK_GET_MAX_CLK_ID |clk_get_max_id | |
1398 | * |CMD_CLK_GET_FMAX_AT_VMIN |clk_get_fmax_at_vmin | |
1399 | * |
1400 | */ |
1401 | |
1402 | /** @cond DEPRECATED |
1403 | * |
1404 | * Older versions of firmware also supported following sub-commands: |
1405 | * |CMD_CLK_PROPERTIES |clk_properties | |
1406 | * |CMD_CLK_POSSIBLE_PARENTS |clk_possible_parents | |
1407 | * |CMD_CLK_NUM_POSSIBLE_PARENTS|clk_num_possible_parents| |
1408 | * |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parents| |
1409 | * |CMD_CLK_RESET_REFCOUNTS |- | |
1410 | * |
1411 | * @endcond DEPRECATED */ |
1412 | |
1413 | struct mrq_clk_response { |
1414 | union { |
1415 | struct cmd_clk_get_rate_response clk_get_rate; |
1416 | struct cmd_clk_set_rate_response clk_set_rate; |
1417 | struct cmd_clk_round_rate_response clk_round_rate; |
1418 | struct cmd_clk_get_parent_response clk_get_parent; |
1419 | struct cmd_clk_set_parent_response clk_set_parent; |
1420 | /** @private */ |
1421 | struct cmd_clk_enable_response clk_enable; |
1422 | /** @private */ |
1423 | struct cmd_clk_disable_response clk_disable; |
1424 | struct cmd_clk_is_enabled_response clk_is_enabled; |
1425 | /** @cond DEPRECATED */ |
1426 | struct cmd_clk_properties_response clk_properties; |
1427 | struct cmd_clk_possible_parents_response clk_possible_parents; |
1428 | struct cmd_clk_num_possible_parents_response clk_num_possible_parents; |
1429 | struct cmd_clk_get_possible_parent_response clk_get_possible_parent; |
1430 | /** @endcond DEPRECATED */ |
1431 | struct cmd_clk_get_all_info_response clk_get_all_info; |
1432 | struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id; |
1433 | struct cmd_clk_get_fmax_at_vmin_response clk_get_fmax_at_vmin; |
1434 | } BPMP_UNION_ANON; |
1435 | } BPMP_ABI_PACKED; |
1436 | |
1437 | /** @} Clocks */ |
1438 | |
1439 | /** |
1440 | * @ingroup MRQ_Codes |
1441 | * @def MRQ_QUERY_ABI |
1442 | * @brief Check if an MRQ is implemented |
1443 | * |
1444 | * * Platforms: All |
1445 | * * Initiators: Any |
1446 | * * Targets: Any except DMCE |
1447 | * * Request Payload: @ref mrq_query_abi_request |
1448 | * * Response Payload: @ref mrq_query_abi_response |
1449 | */ |
1450 | |
1451 | /** |
1452 | * @ingroup ABI_info |
1453 | * @brief Request with MRQ_QUERY_ABI |
1454 | * |
1455 | * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported |
1456 | * by the recipient. |
1457 | */ |
1458 | struct mrq_query_abi_request { |
1459 | /** @brief MRQ code to query */ |
1460 | uint32_t mrq; |
1461 | } BPMP_ABI_PACKED; |
1462 | |
1463 | /** |
1464 | * @ingroup ABI_info |
1465 | * @brief Response to MRQ_QUERY_ABI |
1466 | * |
1467 | * @note mrq_response::err of 0 indicates that the query was |
1468 | * successful, not that the MRQ itself is supported! |
1469 | */ |
1470 | struct mrq_query_abi_response { |
1471 | /** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */ |
1472 | int32_t status; |
1473 | } BPMP_ABI_PACKED; |
1474 | |
1475 | /** |
1476 | * |
1477 | * @ingroup MRQ_Codes |
1478 | * @def MRQ_PG |
1479 | * @brief Control power-gating state of a partition. In contrast to |
1480 | * MRQ_PG_UPDATE_STATE, operations that change the power partition |
1481 | * state are NOT reference counted |
1482 | * |
1483 | * @cond (bpmp_t194 || bpmp_t186) |
1484 | * @note On T194 and earlier BPMP-FW forcefully turns off some partitions as |
1485 | * part of SC7 entry because their state cannot be adequately restored on exit. |
1486 | * Therefore, it is recommended to power off all domains via MRQ_PG prior to SC7 |
1487 | * entry. |
1488 | * See @ref bpmp_pdomain_ids for further detail. |
1489 | * @endcond (bpmp_t194 || bpmp_t186) |
1490 | * |
1491 | * * Platforms: T186, T194 |
1492 | * * Initiators: Any |
1493 | * * Targets: BPMP |
1494 | * * Request Payload: @ref mrq_pg_request |
1495 | * * Response Payload: @ref mrq_pg_response |
1496 | * |
1497 | * @addtogroup Powergating |
1498 | * @{ |
1499 | */ |
1500 | enum mrq_pg_cmd { |
1501 | /** |
1502 | * @brief Check whether the BPMP driver supports the specified |
1503 | * request type |
1504 | * |
1505 | * mrq_response::err is 0 if the specified request is |
1506 | * supported and -#BPMP_ENODEV otherwise. |
1507 | */ |
1508 | CMD_PG_QUERY_ABI = 0, |
1509 | |
1510 | /** |
1511 | * @brief Set the current state of specified power domain. The |
1512 | * possible values for power domains are defined in enum |
1513 | * pg_states |
1514 | * |
1515 | * mrq_response:err is |
1516 | * 0: Success |
1517 | * -#BPMP_EINVAL: Invalid request parameters |
1518 | */ |
1519 | CMD_PG_SET_STATE = 1, |
1520 | |
1521 | /** |
1522 | * @brief Get the current state of specified power domain. The |
1523 | * possible values for power domains are defined in enum |
1524 | * pg_states |
1525 | * |
1526 | * mrq_response:err is |
1527 | * 0: Success |
1528 | * -#BPMP_EINVAL: Invalid request parameters |
1529 | */ |
1530 | CMD_PG_GET_STATE = 2, |
1531 | |
1532 | /** |
1533 | * @brief Get the name string of specified power domain id. |
1534 | * |
1535 | * mrq_response:err is |
1536 | * 0: Success |
1537 | * -#BPMP_EINVAL: Invalid request parameters |
1538 | */ |
1539 | CMD_PG_GET_NAME = 3, |
1540 | |
1541 | |
1542 | /** |
1543 | * @brief Get the highest power domain id in the system. Not |
1544 | * all IDs between 0 and max_id are valid IDs. |
1545 | * |
1546 | * mrq_response:err is |
1547 | * 0: Success |
1548 | * -#BPMP_EINVAL: Invalid request parameters |
1549 | */ |
1550 | CMD_PG_GET_MAX_ID = 4, |
1551 | }; |
1552 | |
1553 | #define MRQ_PG_NAME_MAXLEN 40 |
1554 | |
1555 | enum pg_states { |
1556 | /** @brief Power domain is OFF */ |
1557 | PG_STATE_OFF = 0, |
1558 | /** @brief Power domain is ON */ |
1559 | PG_STATE_ON = 1, |
1560 | /** |
1561 | * @brief a legacy state where power domain and the clock |
1562 | * associated to the domain are ON. |
1563 | * This state is only supported in T186, and the use of it is |
1564 | * deprecated. |
1565 | */ |
1566 | PG_STATE_RUNNING = 2, |
1567 | }; |
1568 | |
1569 | struct cmd_pg_query_abi_request { |
1570 | /** @ref mrq_pg_cmd */ |
1571 | uint32_t type; |
1572 | } BPMP_ABI_PACKED; |
1573 | |
1574 | struct cmd_pg_set_state_request { |
1575 | /** @ref pg_states */ |
1576 | uint32_t state; |
1577 | } BPMP_ABI_PACKED; |
1578 | |
1579 | /** |
1580 | * @brief Response data to #MRQ_PG sub command #CMD_PG_GET_STATE |
1581 | */ |
1582 | struct cmd_pg_get_state_response { |
1583 | /** |
1584 | * @brief The state of the power partition that has been |
1585 | * succesfuly requested by the master earlier using #MRQ_PG |
1586 | * command #CMD_PG_SET_STATE. |
1587 | * |
1588 | * The state may not reflect the physical state of the power |
1589 | * partition if there are some other masters requesting it to |
1590 | * be enabled. |
1591 | * |
1592 | * See @ref pg_states for possible values |
1593 | */ |
1594 | uint32_t state; |
1595 | } BPMP_ABI_PACKED; |
1596 | |
1597 | struct cmd_pg_get_name_response { |
1598 | uint8_t name[MRQ_PG_NAME_MAXLEN]; |
1599 | } BPMP_ABI_PACKED; |
1600 | |
1601 | struct cmd_pg_get_max_id_response { |
1602 | uint32_t max_id; |
1603 | } BPMP_ABI_PACKED; |
1604 | |
1605 | /** |
1606 | * @brief Request with #MRQ_PG |
1607 | * |
1608 | * Used by the sender of an #MRQ_PG message to control power |
1609 | * partitions. The pg_request is split into several sub-commands. Some |
1610 | * sub-commands require no additional data. Others have a sub-command |
1611 | * specific payload |
1612 | * |
1613 | * |sub-command |payload | |
1614 | * |----------------------------|-----------------------| |
1615 | * |CMD_PG_QUERY_ABI | query_abi | |
1616 | * |CMD_PG_SET_STATE | set_state | |
1617 | * |CMD_PG_GET_STATE | - | |
1618 | * |CMD_PG_GET_NAME | - | |
1619 | * |CMD_PG_GET_MAX_ID | - | |
1620 | * |
1621 | */ |
1622 | struct mrq_pg_request { |
1623 | uint32_t cmd; |
1624 | uint32_t id; |
1625 | union { |
1626 | struct cmd_pg_query_abi_request query_abi; |
1627 | struct cmd_pg_set_state_request set_state; |
1628 | } BPMP_UNION_ANON; |
1629 | } BPMP_ABI_PACKED; |
1630 | |
1631 | /** |
1632 | * @brief Response to MRQ_PG |
1633 | * |
1634 | * Each sub-command supported by @ref mrq_pg_request may return |
1635 | * sub-command-specific data. Some do and some do not as indicated in |
1636 | * the following table |
1637 | * |
1638 | * |sub-command |payload | |
1639 | * |----------------------------|-----------------------| |
1640 | * |CMD_PG_QUERY_ABI | - | |
1641 | * |CMD_PG_SET_STATE | - | |
1642 | * |CMD_PG_GET_STATE | get_state | |
1643 | * |CMD_PG_GET_NAME | get_name | |
1644 | * |CMD_PG_GET_MAX_ID | get_max_id | |
1645 | */ |
1646 | struct mrq_pg_response { |
1647 | union { |
1648 | struct cmd_pg_get_state_response get_state; |
1649 | struct cmd_pg_get_name_response get_name; |
1650 | struct cmd_pg_get_max_id_response get_max_id; |
1651 | } BPMP_UNION_ANON; |
1652 | } BPMP_ABI_PACKED; |
1653 | |
1654 | /** @} Powergating */ |
1655 | |
1656 | /** |
1657 | * @ingroup MRQ_Codes |
1658 | * @def MRQ_THERMAL |
1659 | * @brief Interact with BPMP thermal framework |
1660 | * |
1661 | * * Platforms: T186, T194 |
1662 | * * Initiators: Any |
1663 | * * Targets: Any |
1664 | * * Request Payload: TODO |
1665 | * * Response Payload: TODO |
1666 | * |
1667 | * @addtogroup Thermal |
1668 | * |
1669 | * The BPMP firmware includes a thermal framework. Drivers within the |
1670 | * bpmp firmware register with the framework to provide thermal |
1671 | * zones. Each thermal zone corresponds to an entity whose temperature |
1672 | * can be measured. The framework also has a notion of trip points. A |
1673 | * trip point consists of a thermal zone id, a temperature, and a |
1674 | * callback routine. The framework invokes the callback when the zone |
1675 | * hits the indicated temperature. The BPMP firmware uses this thermal |
1676 | * framework interally to implement various temperature-dependent |
1677 | * functions. |
1678 | * |
1679 | * Software on the CPU can use #MRQ_THERMAL (with payload @ref |
1680 | * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal |
1681 | * framework. The CPU must It can query the number of supported zones, |
1682 | * query zone temperatures, and set trip points. |
1683 | * |
1684 | * When a trip point set by the CPU gets crossed, BPMP firmware issues |
1685 | * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a |
1686 | * payload of @ref mrq_thermal_bpmp_to_host_request. |
1687 | * @{ |
1688 | */ |
1689 | enum mrq_thermal_host_to_bpmp_cmd { |
1690 | /** |
1691 | * @brief Check whether the BPMP driver supports the specified |
1692 | * request type. |
1693 | * |
1694 | * Host needs to supply request parameters. |
1695 | * |
1696 | * mrq_response::err is 0 if the specified request is |
1697 | * supported and -#BPMP_ENODEV otherwise. |
1698 | */ |
1699 | CMD_THERMAL_QUERY_ABI = 0, |
1700 | |
1701 | /** |
1702 | * @brief Get the current temperature of the specified zone. |
1703 | * |
1704 | * Host needs to supply request parameters. |
1705 | * |
1706 | * mrq_response::err is |
1707 | * * 0: Temperature query succeeded. |
1708 | * * -#BPMP_EINVAL: Invalid request parameters. |
1709 | * * -#BPMP_ENOENT: No driver registered for thermal zone.. |
1710 | * * -#BPMP_EFAULT: Problem reading temperature measurement. |
1711 | */ |
1712 | CMD_THERMAL_GET_TEMP = 1, |
1713 | |
1714 | /** |
1715 | * @brief Enable or disable and set the lower and upper |
1716 | * thermal limits for a thermal trip point. Each zone has |
1717 | * one trip point. |
1718 | * |
1719 | * Host needs to supply request parameters. Once the |
1720 | * temperature hits a trip point, the BPMP will send a message |
1721 | * to the CPU having MRQ=MRQ_THERMAL and |
1722 | * type=CMD_THERMAL_HOST_TRIP_REACHED |
1723 | * |
1724 | * mrq_response::err is |
1725 | * * 0: Trip successfully set. |
1726 | * * -#BPMP_EINVAL: Invalid request parameters. |
1727 | * * -#BPMP_ENOENT: No driver registered for thermal zone. |
1728 | * * -#BPMP_EFAULT: Problem setting trip point. |
1729 | */ |
1730 | CMD_THERMAL_SET_TRIP = 2, |
1731 | |
1732 | /** |
1733 | * @brief Get the number of supported thermal zones. |
1734 | * |
1735 | * No request parameters required. |
1736 | * |
1737 | * mrq_response::err is always 0, indicating success. |
1738 | */ |
1739 | CMD_THERMAL_GET_NUM_ZONES = 3, |
1740 | |
1741 | /** |
1742 | * @brief Get the thermtrip of the specified zone. |
1743 | * |
1744 | * Host needs to supply request parameters. |
1745 | * |
1746 | * mrq_response::err is |
1747 | * * 0: Valid zone information returned. |
1748 | * * -#BPMP_EINVAL: Invalid request parameters. |
1749 | * * -#BPMP_ENOENT: No driver registered for thermal zone. |
1750 | * * -#BPMP_ERANGE if thermtrip is invalid or disabled. |
1751 | * * -#BPMP_EFAULT: Problem reading zone information. |
1752 | */ |
1753 | CMD_THERMAL_GET_THERMTRIP = 4, |
1754 | |
1755 | /** @brief: number of supported host-to-bpmp commands. May |
1756 | * increase in future |
1757 | */ |
1758 | CMD_THERMAL_HOST_TO_BPMP_NUM |
1759 | }; |
1760 | |
1761 | enum mrq_thermal_bpmp_to_host_cmd { |
1762 | /** |
1763 | * @brief Indication that the temperature for a zone has |
1764 | * exceeded the range indicated in the thermal trip point |
1765 | * for the zone. |
1766 | * |
1767 | * BPMP needs to supply request parameters. Host only needs to |
1768 | * acknowledge. |
1769 | */ |
1770 | CMD_THERMAL_HOST_TRIP_REACHED = 100, |
1771 | |
1772 | /** @brief: number of supported bpmp-to-host commands. May |
1773 | * increase in future |
1774 | */ |
1775 | CMD_THERMAL_BPMP_TO_HOST_NUM |
1776 | }; |
1777 | |
1778 | /* |
1779 | * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI |
1780 | * |
1781 | * zone: Request type for which to check existence. |
1782 | */ |
1783 | struct cmd_thermal_query_abi_request { |
1784 | uint32_t type; |
1785 | } BPMP_ABI_PACKED; |
1786 | |
1787 | /* |
1788 | * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP |
1789 | * |
1790 | * zone: Number of thermal zone. |
1791 | */ |
1792 | struct cmd_thermal_get_temp_request { |
1793 | uint32_t zone; |
1794 | } BPMP_ABI_PACKED; |
1795 | |
1796 | /* |
1797 | * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP |
1798 | * |
1799 | * error: 0 if request succeeded. |
1800 | * -BPMP_EINVAL if request parameters were invalid. |
1801 | * -BPMP_ENOENT if no driver was registered for the specified thermal zone. |
1802 | * -BPMP_EFAULT for other thermal zone driver errors. |
1803 | * temp: Current temperature in millicelsius. |
1804 | */ |
1805 | struct cmd_thermal_get_temp_response { |
1806 | int32_t temp; |
1807 | } BPMP_ABI_PACKED; |
1808 | |
1809 | /* |
1810 | * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP |
1811 | * |
1812 | * zone: Number of thermal zone. |
1813 | * low: Temperature of lower trip point in millicelsius |
1814 | * high: Temperature of upper trip point in millicelsius |
1815 | * enabled: 1 to enable trip point, 0 to disable trip point |
1816 | */ |
1817 | struct cmd_thermal_set_trip_request { |
1818 | uint32_t zone; |
1819 | int32_t low; |
1820 | int32_t high; |
1821 | uint32_t enabled; |
1822 | } BPMP_ABI_PACKED; |
1823 | |
1824 | /* |
1825 | * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED |
1826 | * |
1827 | * zone: Number of thermal zone where trip point was reached. |
1828 | */ |
1829 | struct cmd_thermal_host_trip_reached_request { |
1830 | uint32_t zone; |
1831 | } BPMP_ABI_PACKED; |
1832 | |
1833 | /* |
1834 | * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES |
1835 | * |
1836 | * num: Number of supported thermal zones. The thermal zones are indexed |
1837 | * starting from zero. |
1838 | */ |
1839 | struct cmd_thermal_get_num_zones_response { |
1840 | uint32_t num; |
1841 | } BPMP_ABI_PACKED; |
1842 | |
1843 | /* |
1844 | * Host->BPMP request data for request type CMD_THERMAL_GET_THERMTRIP |
1845 | * |
1846 | * zone: Number of thermal zone. |
1847 | */ |
1848 | struct cmd_thermal_get_thermtrip_request { |
1849 | uint32_t zone; |
1850 | } BPMP_ABI_PACKED; |
1851 | |
1852 | /* |
1853 | * BPMP->Host reply data for request CMD_THERMAL_GET_THERMTRIP |
1854 | * |
1855 | * thermtrip: HW shutdown temperature in millicelsius. |
1856 | */ |
1857 | struct cmd_thermal_get_thermtrip_response { |
1858 | int32_t thermtrip; |
1859 | } BPMP_ABI_PACKED; |
1860 | |
1861 | /* |
1862 | * Host->BPMP request data. |
1863 | * |
1864 | * Reply type is union mrq_thermal_bpmp_to_host_response. |
1865 | * |
1866 | * type: Type of request. Values listed in enum mrq_thermal_type. |
1867 | * data: Request type specific parameters. |
1868 | */ |
1869 | struct mrq_thermal_host_to_bpmp_request { |
1870 | uint32_t type; |
1871 | union { |
1872 | struct cmd_thermal_query_abi_request query_abi; |
1873 | struct cmd_thermal_get_temp_request get_temp; |
1874 | struct cmd_thermal_set_trip_request set_trip; |
1875 | struct cmd_thermal_get_thermtrip_request get_thermtrip; |
1876 | } BPMP_UNION_ANON; |
1877 | } BPMP_ABI_PACKED; |
1878 | |
1879 | /* |
1880 | * BPMP->Host request data. |
1881 | * |
1882 | * type: Type of request. Values listed in enum mrq_thermal_type. |
1883 | * data: Request type specific parameters. |
1884 | */ |
1885 | struct mrq_thermal_bpmp_to_host_request { |
1886 | uint32_t type; |
1887 | union { |
1888 | struct cmd_thermal_host_trip_reached_request host_trip_reached; |
1889 | } BPMP_UNION_ANON; |
1890 | } BPMP_ABI_PACKED; |
1891 | |
1892 | /* |
1893 | * Data in reply to a Host->BPMP request. |
1894 | */ |
1895 | union mrq_thermal_bpmp_to_host_response { |
1896 | struct cmd_thermal_get_temp_response get_temp; |
1897 | struct cmd_thermal_get_thermtrip_response get_thermtrip; |
1898 | struct cmd_thermal_get_num_zones_response get_num_zones; |
1899 | } BPMP_ABI_PACKED; |
1900 | |
1901 | /** @} Thermal */ |
1902 | |
1903 | /** |
1904 | * @ingroup MRQ_Codes |
1905 | * @def MRQ_OC_STATUS |
1906 | * @brief Query over current status |
1907 | * |
1908 | * * Platforms: T234 |
1909 | * @cond bpmp_t234 |
1910 | * * Initiators: CCPLEX |
1911 | * * Targets: BPMP |
1912 | * * Request Payload: N/A |
1913 | * * Response Payload: @ref mrq_oc_status_response |
1914 | * |
1915 | * @addtogroup OC_status |
1916 | * @{ |
1917 | */ |
1918 | |
1919 | #define OC_STATUS_MAX_SIZE 24U |
1920 | |
1921 | /* |
1922 | * @brief Response to #MRQ_OC_STATUS |
1923 | * |
1924 | * throt_en: Value for each OC alarm where zero signifies throttle is |
1925 | * disabled, and non-zero throttle is enabled. |
1926 | * event_cnt: Total number of OC events for each OC alarm. |
1927 | * |
1928 | * mrq_response::err is 0 if the operation was successful and |
1929 | * -#BPMP_ENODEV otherwise. |
1930 | */ |
1931 | struct mrq_oc_status_response { |
1932 | uint8_t throt_en[OC_STATUS_MAX_SIZE]; |
1933 | uint32_t event_cnt[OC_STATUS_MAX_SIZE]; |
1934 | } BPMP_ABI_PACKED; |
1935 | |
1936 | /** @} OC_status */ |
1937 | /** @endcond bpmp_t234 */ |
1938 | |
1939 | /** |
1940 | * @ingroup MRQ_Codes |
1941 | * @def MRQ_CPU_VHINT |
1942 | * @brief Query CPU voltage hint data |
1943 | * |
1944 | * * Platforms: T186 |
1945 | * @cond bpmp_t186 |
1946 | * * Initiators: CCPLEX |
1947 | * * Targets: BPMP |
1948 | * * Request Payload: @ref mrq_cpu_vhint_request |
1949 | * * Response Payload: N/A |
1950 | * |
1951 | * @addtogroup Vhint |
1952 | * @{ |
1953 | */ |
1954 | |
1955 | /** |
1956 | * @brief Request with #MRQ_CPU_VHINT |
1957 | * |
1958 | * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data |
1959 | * from BPMP to memory space pointed by #addr. CCPLEX is responsible |
1960 | * to allocate sizeof(cpu_vhint_data) sized block of memory and |
1961 | * appropriately map it for BPMP before sending the request. |
1962 | */ |
1963 | struct mrq_cpu_vhint_request { |
1964 | /** @brief IOVA address for the #cpu_vhint_data */ |
1965 | uint32_t addr; |
1966 | /** @brief ID of the cluster whose data is requested */ |
1967 | uint32_t cluster_id; |
1968 | } BPMP_ABI_PACKED; |
1969 | |
1970 | /** |
1971 | * @brief Description of the CPU v/f relation |
1972 | * |
1973 | * Used by #MRQ_CPU_VHINT call to carry data pointed by |
1974 | * #mrq_cpu_vhint_request::addr |
1975 | */ |
1976 | struct cpu_vhint_data { |
1977 | uint32_t ref_clk_hz; /**< reference frequency in Hz */ |
1978 | uint16_t pdiv; /**< post divider value */ |
1979 | uint16_t mdiv; /**< input divider value */ |
1980 | uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */ |
1981 | /** table of ndiv values as a function of vINDEX (voltage index) */ |
1982 | uint16_t ndiv[80]; |
1983 | /** minimum allowed NDIV value */ |
1984 | uint16_t ndiv_min; |
1985 | /** minimum allowed voltage hint value (as in vINDEX) */ |
1986 | uint16_t vfloor; |
1987 | /** maximum allowed voltage hint value (as in vINDEX) */ |
1988 | uint16_t vceil; |
1989 | /** post-multiplier for vindex value */ |
1990 | uint16_t vindex_mult; |
1991 | /** post-divider for vindex value */ |
1992 | uint16_t vindex_div; |
1993 | /** reserved for future use */ |
1994 | uint16_t reserved[328]; |
1995 | } BPMP_ABI_PACKED; |
1996 | |
1997 | /** @} Vhint */ |
1998 | /** @endcond bpmp_t186 */ |
1999 | |
2000 | /** |
2001 | * @ingroup MRQ_Codes |
2002 | * @def MRQ_ABI_RATCHET |
2003 | * @brief ABI ratchet value query |
2004 | * |
2005 | * * Platforms: T186, T194 |
2006 | * * Initiators: Any |
2007 | * * Targets: BPMP |
2008 | * * Request Payload: @ref mrq_abi_ratchet_request |
2009 | * * Response Payload: @ref mrq_abi_ratchet_response |
2010 | * @addtogroup ABI_info |
2011 | * @{ |
2012 | */ |
2013 | |
2014 | /** |
2015 | * @brief An ABI compatibility mechanism |
2016 | * |
2017 | * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future |
2018 | * revision of this header file. |
2019 | * 1. That future revision deprecates some MRQ |
2020 | * 2. That future revision introduces a breaking change to an existing |
2021 | * MRQ or |
2022 | * 3. A bug is discovered in an existing implementation of the BPMP-FW |
2023 | * (or possibly one of its clients) which warrants deprecating that |
2024 | * implementation. |
2025 | */ |
2026 | #define BPMP_ABI_RATCHET_VALUE 3 |
2027 | |
2028 | /** |
2029 | * @brief Request with #MRQ_ABI_RATCHET. |
2030 | * |
2031 | * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header |
2032 | * against which the requester was compiled. |
2033 | * |
2034 | * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may |
2035 | * reply with mrq_response::err = -#BPMP_ERANGE to indicate that |
2036 | * BPMP-FW cannot interoperate correctly with the requester. Requester |
2037 | * should cease further communication with BPMP. |
2038 | * |
2039 | * Otherwise, err shall be 0. |
2040 | */ |
2041 | struct mrq_abi_ratchet_request { |
2042 | /** @brief Requester's ratchet value */ |
2043 | uint16_t ratchet; |
2044 | }; |
2045 | |
2046 | /** |
2047 | * @brief Response to #MRQ_ABI_RATCHET |
2048 | * |
2049 | * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header |
2050 | * against which BPMP firwmare was compiled. |
2051 | * |
2052 | * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE, |
2053 | * the requster must either interoperate with BPMP according to an ABI |
2054 | * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease |
2055 | * communication with BPMP. |
2056 | * |
2057 | * If mrq_response::err is 0 and ratchet is greater than or equal to the |
2058 | * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue |
2059 | * normal operation. |
2060 | */ |
2061 | struct mrq_abi_ratchet_response { |
2062 | /** @brief BPMP's ratchet value */ |
2063 | uint16_t ratchet; |
2064 | }; |
2065 | |
2066 | /** @} ABI_info */ |
2067 | |
2068 | /** |
2069 | * @ingroup MRQ_Codes |
2070 | * @def MRQ_EMC_DVFS_LATENCY |
2071 | * @brief Query frequency dependent EMC DVFS latency |
2072 | * |
2073 | * * Platforms: T186, T194, T234 |
2074 | * * Initiators: CCPLEX |
2075 | * * Targets: BPMP |
2076 | * * Request Payload: N/A |
2077 | * * Response Payload: @ref mrq_emc_dvfs_latency_response |
2078 | * @addtogroup EMC |
2079 | * @{ |
2080 | */ |
2081 | |
2082 | /** |
2083 | * @brief Used by @ref mrq_emc_dvfs_latency_response |
2084 | */ |
2085 | struct emc_dvfs_latency { |
2086 | /** @brief EMC DVFS node frequency in kHz */ |
2087 | uint32_t freq; |
2088 | /** @brief EMC DVFS latency in nanoseconds */ |
2089 | uint32_t latency; |
2090 | } BPMP_ABI_PACKED; |
2091 | |
2092 | #define EMC_DVFS_LATENCY_MAX_SIZE 14 |
2093 | /** |
2094 | * @brief Response to #MRQ_EMC_DVFS_LATENCY |
2095 | */ |
2096 | struct mrq_emc_dvfs_latency_response { |
2097 | /** @brief The number valid entries in #pairs */ |
2098 | uint32_t num_pairs; |
2099 | /** @brief EMC DVFS node <frequency, latency> information */ |
2100 | struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE]; |
2101 | } BPMP_ABI_PACKED; |
2102 | |
2103 | /** @} EMC */ |
2104 | |
2105 | /** |
2106 | * @ingroup MRQ_Codes |
2107 | * @def MRQ_EMC_DVFS_EMCHUB |
2108 | * @brief Query EMC HUB frequencies |
2109 | * |
2110 | * * Platforms: T234 onwards |
2111 | * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) |
2112 | * * Initiators: CCPLEX |
2113 | * * Targets: BPMP |
2114 | * * Request Payload: N/A |
2115 | * * Response Payload: @ref mrq_emc_dvfs_emchub_response |
2116 | * @addtogroup EMC |
2117 | * @{ |
2118 | */ |
2119 | |
2120 | /** |
2121 | * @brief Used by @ref mrq_emc_dvfs_emchub_response |
2122 | */ |
2123 | struct emc_dvfs_emchub { |
2124 | /** @brief EMC DVFS node frequency in kHz */ |
2125 | uint32_t freq; |
2126 | /** @brief EMC HUB frequency in kHz */ |
2127 | uint32_t hub_freq; |
2128 | } BPMP_ABI_PACKED; |
2129 | |
2130 | #define EMC_DVFS_EMCHUB_MAX_SIZE EMC_DVFS_LATENCY_MAX_SIZE |
2131 | /** |
2132 | * @brief Response to #MRQ_EMC_DVFS_EMCHUB |
2133 | */ |
2134 | struct mrq_emc_dvfs_emchub_response { |
2135 | /** @brief The number valid entries in #pairs */ |
2136 | uint32_t num_pairs; |
2137 | /** @brief EMC DVFS node <frequency, hub frequency> information */ |
2138 | struct emc_dvfs_emchub pairs[EMC_DVFS_EMCHUB_MAX_SIZE]; |
2139 | } BPMP_ABI_PACKED; |
2140 | |
2141 | /** @} EMC */ |
2142 | /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2143 | |
2144 | /** |
2145 | * @ingroup MRQ_Codes |
2146 | * @def MRQ_EMC_DISP_RFL |
2147 | * @brief Set EMC display RFL handshake mode of operations |
2148 | * |
2149 | * * Platforms: T234 onwards |
2150 | * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) |
2151 | * * Initiators: CCPLEX |
2152 | * * Targets: BPMP |
2153 | * * Request Payload: @ref mrq_emc_disp_rfl_request |
2154 | * * Response Payload: N/A |
2155 | * |
2156 | * @addtogroup EMC |
2157 | * @{ |
2158 | */ |
2159 | |
2160 | enum mrq_emc_disp_rfl_mode { |
2161 | /** @brief EMC display RFL handshake disabled */ |
2162 | EMC_DISP_RFL_MODE_DISABLED = 0, |
2163 | /** @brief EMC display RFL handshake enabled */ |
2164 | EMC_DISP_RFL_MODE_ENABLED = 1, |
2165 | }; |
2166 | |
2167 | /** |
2168 | * @ingroup EMC |
2169 | * @brief Request with #MRQ_EMC_DISP_RFL |
2170 | * |
2171 | * Used by the sender of an #MRQ_EMC_DISP_RFL message to |
2172 | * request the mode of EMC display RFL handshake. |
2173 | * |
2174 | * mrq_response::err is |
2175 | * * 0: RFL mode is set successfully |
2176 | * * -#BPMP_EINVAL: invalid mode requested |
2177 | * * -#BPMP_ENOSYS: RFL handshake is not supported |
2178 | * * -#BPMP_EACCES: Permission denied |
2179 | * * -#BPMP_ENODEV: if disp rfl mrq is not supported by BPMP-FW |
2180 | */ |
2181 | struct mrq_emc_disp_rfl_request { |
2182 | /** @brief EMC display RFL mode (@ref mrq_emc_disp_rfl_mode) */ |
2183 | uint32_t mode; |
2184 | } BPMP_ABI_PACKED; |
2185 | |
2186 | /** @} EMC */ |
2187 | /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2188 | |
2189 | /** |
2190 | * @ingroup MRQ_Codes |
2191 | * @def MRQ_BWMGR |
2192 | * @brief bwmgr requests |
2193 | * |
2194 | * * Platforms: T234 onwards |
2195 | * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) |
2196 | * * Initiators: CCPLEX |
2197 | * * Targets: BPMP |
2198 | * * Request Payload: @ref mrq_bwmgr_request |
2199 | * * Response Payload: @ref mrq_bwmgr_response |
2200 | * |
2201 | * @addtogroup BWMGR |
2202 | * |
2203 | * @{ |
2204 | */ |
2205 | |
2206 | enum mrq_bwmgr_cmd { |
2207 | /** |
2208 | * @brief Check whether the BPMP driver supports the specified |
2209 | * request type |
2210 | * |
2211 | * mrq_response::err is 0 if the specified request is |
2212 | * supported and -#BPMP_ENODEV otherwise. |
2213 | */ |
2214 | CMD_BWMGR_QUERY_ABI = 0, |
2215 | |
2216 | /** |
2217 | * @brief Determine dram rate to satisfy iso/niso bw requests |
2218 | * |
2219 | * mrq_response::err is |
2220 | * * 0: calc_rate succeeded. |
2221 | * * -#BPMP_EINVAL: Invalid request parameters. |
2222 | * * -#BPMP_ENOTSUP: Requested bw is not available. |
2223 | */ |
2224 | CMD_BWMGR_CALC_RATE = 1 |
2225 | }; |
2226 | |
2227 | /* |
2228 | * request data for request type CMD_BWMGR_QUERY_ABI |
2229 | * |
2230 | * type: Request type for which to check existence. |
2231 | */ |
2232 | struct cmd_bwmgr_query_abi_request { |
2233 | uint32_t type; |
2234 | } BPMP_ABI_PACKED; |
2235 | |
2236 | /** |
2237 | * @brief Used by @ref cmd_bwmgr_calc_rate_request |
2238 | */ |
2239 | struct iso_req { |
2240 | /* @brief bwmgr client ID @ref bpmp_bwmgr_ids */ |
2241 | uint32_t id; |
2242 | /* @brief bw in kBps requested by client */ |
2243 | uint32_t iso_bw; |
2244 | } BPMP_ABI_PACKED; |
2245 | |
2246 | #define MAX_ISO_CLIENTS 13U |
2247 | /* |
2248 | * request data for request type CMD_BWMGR_CALC_RATE |
2249 | */ |
2250 | struct cmd_bwmgr_calc_rate_request { |
2251 | /* @brief total bw in kBps requested by all niso clients */ |
2252 | uint32_t sum_niso_bw; |
2253 | /* @brief The number of iso clients */ |
2254 | uint32_t num_iso_clients; |
2255 | /* @brief iso_req <id, iso_bw> information */ |
2256 | struct iso_req isobw_reqs[MAX_ISO_CLIENTS]; |
2257 | } BPMP_ABI_PACKED; |
2258 | |
2259 | /* |
2260 | * response data for request type CMD_BWMGR_CALC_RATE |
2261 | * |
2262 | * iso_rate_min: min dram data clk rate in kHz to satisfy all iso bw reqs |
2263 | * total_rate_min: min dram data clk rate in kHz to satisfy all bw reqs |
2264 | */ |
2265 | struct cmd_bwmgr_calc_rate_response { |
2266 | uint32_t iso_rate_min; |
2267 | uint32_t total_rate_min; |
2268 | } BPMP_ABI_PACKED; |
2269 | |
2270 | /* |
2271 | * @brief Request with #MRQ_BWMGR |
2272 | * |
2273 | * |
2274 | * |sub-command |payload | |
2275 | * |----------------------------|------------------------------| |
2276 | * |CMD_BWMGR_QUERY_ABI | cmd_bwmgr_query_abi_request | |
2277 | * |CMD_BWMGR_CALC_RATE | cmd_bwmgr_calc_rate_request | |
2278 | * |
2279 | */ |
2280 | struct mrq_bwmgr_request { |
2281 | uint32_t cmd; |
2282 | union { |
2283 | struct cmd_bwmgr_query_abi_request query_abi; |
2284 | struct cmd_bwmgr_calc_rate_request bwmgr_rate_req; |
2285 | } BPMP_UNION_ANON; |
2286 | } BPMP_ABI_PACKED; |
2287 | |
2288 | /* |
2289 | * @brief Response to MRQ_BWMGR |
2290 | * |
2291 | * |sub-command |payload | |
2292 | * |----------------------------|------------------------------| |
2293 | * |CMD_BWMGR_CALC_RATE | cmd_bwmgr_calc_rate_response | |
2294 | */ |
2295 | struct mrq_bwmgr_response { |
2296 | union { |
2297 | struct cmd_bwmgr_calc_rate_response bwmgr_rate_resp; |
2298 | } BPMP_UNION_ANON; |
2299 | } BPMP_ABI_PACKED; |
2300 | |
2301 | /** @} BWMGR */ |
2302 | /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2303 | |
2304 | /** |
2305 | * @ingroup MRQ_Codes |
2306 | * @def MRQ_BWMGR_INT |
2307 | * @brief bpmp-integrated bwmgr requests |
2308 | * |
2309 | * * Platforms: T234 onwards |
2310 | * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) |
2311 | * * Initiators: CCPLEX |
2312 | * * Targets: BPMP |
2313 | * * Request Payload: @ref mrq_bwmgr_int_request |
2314 | * * Response Payload: @ref mrq_bwmgr_int_response |
2315 | * |
2316 | * @addtogroup BWMGR_INT |
2317 | * @{ |
2318 | */ |
2319 | |
2320 | enum mrq_bwmgr_int_cmd { |
2321 | /** |
2322 | * @brief Check whether the BPMP-FW supports the specified |
2323 | * request type |
2324 | * |
2325 | * mrq_response::err is 0 if the specified request is |
2326 | * supported and -#BPMP_ENODEV otherwise. |
2327 | */ |
2328 | CMD_BWMGR_INT_QUERY_ABI = 1, |
2329 | |
2330 | /** |
2331 | * @brief Determine and set dram rate to satisfy iso/niso bw request |
2332 | * |
2333 | * mrq_response::err is |
2334 | * * 0: request succeeded. |
2335 | * * -#BPMP_EINVAL: Invalid request parameters. |
2336 | * set_frequency in @ref cmd_bwmgr_int_calc_and_set_response |
2337 | * will not be set. |
2338 | * * -#BPMP_ENOTSUP: Requested bw is not available. |
2339 | * set_frequency in @ref cmd_bwmgr_int_calc_and_set_response |
2340 | * will be current dram-clk rate. |
2341 | */ |
2342 | CMD_BWMGR_INT_CALC_AND_SET = 2, |
2343 | |
2344 | /** |
2345 | * @brief Set a max DRAM frequency for the bandwidth-manager |
2346 | * |
2347 | * mrq_response::err is |
2348 | * * 0: request succeeded. |
2349 | * * -#BPMP_ENOTSUP: Requested cap frequency is not possible. |
2350 | */ |
2351 | CMD_BWMGR_INT_CAP_SET = 3 |
2352 | }; |
2353 | |
2354 | /* |
2355 | * request structure for request type CMD_BWMGR_QUERY_ABI |
2356 | * |
2357 | * type: Request type for which to check existence. |
2358 | */ |
2359 | struct cmd_bwmgr_int_query_abi_request { |
2360 | /* @brief request type determined by @ref mrq_bwmgr_int_cmd */ |
2361 | uint32_t type; |
2362 | } BPMP_ABI_PACKED; |
2363 | |
2364 | /** |
2365 | * @defgroup bwmgr_int_unit_type BWMGR_INT floor unit-types |
2366 | * @addtogroup bwmgr_int_unit_type |
2367 | * @{ |
2368 | */ |
2369 | /** @brief kilobytes per second unit-type */ |
2370 | #define BWMGR_INT_UNIT_KBPS 0U |
2371 | /** @brief kilohertz unit-type */ |
2372 | #define BWMGR_INT_UNIT_KHZ 1U |
2373 | |
2374 | /** @} bwmgr_int_unit_type */ |
2375 | |
2376 | /* |
2377 | * request data for request type CMD_BWMGR_INT_CALC_AND_SET |
2378 | */ |
2379 | struct cmd_bwmgr_int_calc_and_set_request { |
2380 | /* @brief bwmgr client ID @ref bpmp_bwmgr_ids */ |
2381 | uint32_t client_id; |
2382 | /* @brief average niso bw usage in kBps requested by client. */ |
2383 | uint32_t niso_bw; |
2384 | /* |
2385 | * @brief average iso bw usage in kBps requested by client. |
2386 | * Value is ignored if client is niso. Determined by client_id. |
2387 | */ |
2388 | uint32_t iso_bw; |
2389 | /* |
2390 | * @brief memory clock floor requested by client. |
2391 | * Unit determined by floor_unit. |
2392 | */ |
2393 | uint32_t mc_floor; |
2394 | /* |
2395 | * @brief toggle to determine the unit-type of floor value. |
2396 | * See @ref bwmgr_int_unit_type definitions for unit-type mappings. |
2397 | */ |
2398 | uint8_t floor_unit; |
2399 | } BPMP_ABI_PACKED; |
2400 | |
2401 | struct cmd_bwmgr_int_cap_set_request { |
2402 | /* @brief requested cap frequency in Hz. */ |
2403 | uint64_t rate; |
2404 | } BPMP_ABI_PACKED; |
2405 | |
2406 | /* |
2407 | * response data for request type CMD_BWMGR_CALC_AND_SET |
2408 | */ |
2409 | struct cmd_bwmgr_int_calc_and_set_response { |
2410 | /* @brief current set memory clock frequency in Hz */ |
2411 | uint64_t rate; |
2412 | } BPMP_ABI_PACKED; |
2413 | |
2414 | /* |
2415 | * @brief Request with #MRQ_BWMGR_INT |
2416 | * |
2417 | * |
2418 | * |sub-command |payload | |
2419 | * |----------------------------|-----------------------------------| |
2420 | * |CMD_BWMGR_INT_QUERY_ABI | cmd_bwmgr_int_query_abi_request | |
2421 | * |CMD_BWMGR_INT_CALC_AND_SET | cmd_bwmgr_int_calc_and_set_request| |
2422 | * |CMD_BWMGR_INT_CAP_SET | cmd_bwmgr_int_cap_set_request | |
2423 | * |
2424 | */ |
2425 | struct mrq_bwmgr_int_request { |
2426 | uint32_t cmd; |
2427 | union { |
2428 | struct cmd_bwmgr_int_query_abi_request query_abi; |
2429 | struct cmd_bwmgr_int_calc_and_set_request bwmgr_calc_set_req; |
2430 | struct cmd_bwmgr_int_cap_set_request bwmgr_cap_set_req; |
2431 | } BPMP_UNION_ANON; |
2432 | } BPMP_ABI_PACKED; |
2433 | |
2434 | /* |
2435 | * @brief Response to MRQ_BWMGR_INT |
2436 | * |
2437 | * |sub-command |payload | |
2438 | * |----------------------------|---------------------------------------| |
2439 | * |CMD_BWMGR_INT_CALC_AND_SET | cmd_bwmgr_int_calc_and_set_response | |
2440 | */ |
2441 | struct mrq_bwmgr_int_response { |
2442 | union { |
2443 | struct cmd_bwmgr_int_calc_and_set_response bwmgr_calc_set_resp; |
2444 | } BPMP_UNION_ANON; |
2445 | } BPMP_ABI_PACKED; |
2446 | |
2447 | /** @} BWMGR_INT */ |
2448 | /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2449 | |
2450 | /** |
2451 | * @ingroup MRQ_Codes |
2452 | * @def MRQ_ISO_CLIENT |
2453 | * @brief ISO client requests |
2454 | * |
2455 | * * Platforms: T234 onwards |
2456 | * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) |
2457 | * * Initiators: CCPLEX |
2458 | * * Targets: BPMP |
2459 | * * Request Payload: @ref mrq_iso_client_request |
2460 | * * Response Payload: @ref mrq_iso_client_response |
2461 | * |
2462 | * @addtogroup ISO_CLIENT |
2463 | * @{ |
2464 | */ |
2465 | |
2466 | enum mrq_iso_client_cmd { |
2467 | /** |
2468 | * @brief Check whether the BPMP driver supports the specified |
2469 | * request type |
2470 | * |
2471 | * mrq_response::err is 0 if the specified request is |
2472 | * supported and -#BPMP_ENODEV otherwise. |
2473 | */ |
2474 | CMD_ISO_CLIENT_QUERY_ABI = 0, |
2475 | |
2476 | /* |
2477 | * @brief check for legal LA for the iso client. Without programming |
2478 | * LA MC registers, calculate and ensure that legal LA is possible for |
2479 | * iso bw requested by the ISO client. |
2480 | * |
2481 | * mrq_response::err is |
2482 | * * 0: check la succeeded. |
2483 | * * -#BPMP_EINVAL: Invalid request parameters. |
2484 | * * -#BPMP_EFAULT: Legal LA is not possible for client requested iso_bw |
2485 | */ |
2486 | CMD_ISO_CLIENT_CALCULATE_LA = 1, |
2487 | |
2488 | /* |
2489 | * @brief set LA for the iso client. Calculate and program the LA/PTSA |
2490 | * MC registers corresponding to the client making bw request |
2491 | * |
2492 | * mrq_response::err is |
2493 | * * 0: set la succeeded. |
2494 | * * -#BPMP_EINVAL: Invalid request parameters. |
2495 | * * -#BPMP_EFAULT: Failed to calculate or program MC registers. |
2496 | */ |
2497 | CMD_ISO_CLIENT_SET_LA = 2, |
2498 | |
2499 | /* |
2500 | * @brief Get max possible bw for iso client |
2501 | * |
2502 | * mrq_response::err is |
2503 | * * 0: get_max_bw succeeded. |
2504 | * * -#BPMP_EINVAL: Invalid request parameters. |
2505 | */ |
2506 | CMD_ISO_CLIENT_GET_MAX_BW = 3 |
2507 | }; |
2508 | |
2509 | /* |
2510 | * request data for request type CMD_ISO_CLIENT_QUERY_ABI |
2511 | * |
2512 | * type: Request type for which to check existence. |
2513 | */ |
2514 | struct cmd_iso_client_query_abi_request { |
2515 | uint32_t type; |
2516 | } BPMP_ABI_PACKED; |
2517 | |
2518 | /* |
2519 | * request data for request type CMD_ISO_CLIENT_CALCULATE_LA |
2520 | * |
2521 | * id: client ID in @ref bpmp_bwmgr_ids |
2522 | * bw: bw requested in kBps by client ID. |
2523 | * init_bw_floor: initial dram_bw_floor in kBps passed by client ID. |
2524 | * ISO client will perform mempool allocation and DVFS buffering based |
2525 | * on this dram_bw_floor. |
2526 | */ |
2527 | struct cmd_iso_client_calculate_la_request { |
2528 | uint32_t id; |
2529 | uint32_t bw; |
2530 | uint32_t init_bw_floor; |
2531 | } BPMP_ABI_PACKED; |
2532 | |
2533 | /* |
2534 | * request data for request type CMD_ISO_CLIENT_SET_LA |
2535 | * |
2536 | * id: client ID in @ref bpmp_bwmgr_ids |
2537 | * bw: bw requested in kBps by client ID. |
2538 | * final_bw_floor: final dram_bw_floor in kBps. |
2539 | * Sometimes the initial dram_bw_floor passed by ISO client may need to be |
2540 | * updated by considering higher dram freq's. This is the final dram_bw_floor |
2541 | * used to calculate and program MC registers. |
2542 | */ |
2543 | struct cmd_iso_client_set_la_request { |
2544 | uint32_t id; |
2545 | uint32_t bw; |
2546 | uint32_t final_bw_floor; |
2547 | } BPMP_ABI_PACKED; |
2548 | |
2549 | /* |
2550 | * request data for request type CMD_ISO_CLIENT_GET_MAX_BW |
2551 | * |
2552 | * id: client ID in @ref bpmp_bwmgr_ids |
2553 | */ |
2554 | struct cmd_iso_client_get_max_bw_request { |
2555 | uint32_t id; |
2556 | } BPMP_ABI_PACKED; |
2557 | |
2558 | /* |
2559 | * response data for request type CMD_ISO_CLIENT_CALCULATE_LA |
2560 | * |
2561 | * la_rate_floor: minimum dram_rate_floor in kHz at which a legal la is possible |
2562 | * iso_client_only_rate: Minimum dram freq in kHz required to satisfy this clients |
2563 | * iso bw request, assuming all other iso clients are inactive |
2564 | */ |
2565 | struct cmd_iso_client_calculate_la_response { |
2566 | uint32_t la_rate_floor; |
2567 | uint32_t iso_client_only_rate; |
2568 | } BPMP_ABI_PACKED; |
2569 | |
2570 | /** |
2571 | * @brief Used by @ref cmd_iso_client_get_max_bw_response |
2572 | */ |
2573 | struct iso_max_bw { |
2574 | /* @brief dram frequency in kHz */ |
2575 | uint32_t freq; |
2576 | /* @brief max possible iso-bw in kBps */ |
2577 | uint32_t iso_bw; |
2578 | } BPMP_ABI_PACKED; |
2579 | |
2580 | #define ISO_MAX_BW_MAX_SIZE 14U |
2581 | /* |
2582 | * response data for request type CMD_ISO_CLIENT_GET_MAX_BW |
2583 | */ |
2584 | struct cmd_iso_client_get_max_bw_response { |
2585 | /* @brief The number valid entries in iso_max_bw pairs */ |
2586 | uint32_t num_pairs; |
2587 | /* @brief max ISOBW <dram freq, max bw> information */ |
2588 | struct iso_max_bw pairs[ISO_MAX_BW_MAX_SIZE]; |
2589 | } BPMP_ABI_PACKED; |
2590 | |
2591 | /** |
2592 | * @brief Request with #MRQ_ISO_CLIENT |
2593 | * |
2594 | * Used by the sender of an #MRQ_ISO_CLIENT message. |
2595 | * |
2596 | * |sub-command |payload | |
2597 | * |------------------------------------ |----------------------------------------| |
2598 | * |CMD_ISO_CLIENT_QUERY_ABI |cmd_iso_client_query_abi_request | |
2599 | * |CMD_ISO_CLIENT_CALCULATE_LA |cmd_iso_client_calculate_la_request | |
2600 | * |CMD_ISO_CLIENT_SET_LA |cmd_iso_client_set_la_request | |
2601 | * |CMD_ISO_CLIENT_GET_MAX_BW |cmd_iso_client_get_max_bw_request | |
2602 | * |
2603 | */ |
2604 | |
2605 | struct mrq_iso_client_request { |
2606 | /* Type of request. Values listed in enum mrq_iso_client_cmd */ |
2607 | uint32_t cmd; |
2608 | union { |
2609 | struct cmd_iso_client_query_abi_request query_abi; |
2610 | struct cmd_iso_client_calculate_la_request calculate_la_req; |
2611 | struct cmd_iso_client_set_la_request set_la_req; |
2612 | struct cmd_iso_client_get_max_bw_request max_isobw_req; |
2613 | } BPMP_UNION_ANON; |
2614 | } BPMP_ABI_PACKED; |
2615 | |
2616 | /** |
2617 | * @brief Response to MRQ_ISO_CLIENT |
2618 | * |
2619 | * Each sub-command supported by @ref mrq_iso_client_request may return |
2620 | * sub-command-specific data. Some do and some do not as indicated in |
2621 | * the following table |
2622 | * |
2623 | * |sub-command |payload | |
2624 | * |---------------------------- |------------------------------------| |
2625 | * |CMD_ISO_CLIENT_CALCULATE_LA |cmd_iso_client_calculate_la_response| |
2626 | * |CMD_ISO_CLIENT_SET_LA |N/A | |
2627 | * |CMD_ISO_CLIENT_GET_MAX_BW |cmd_iso_client_get_max_bw_response | |
2628 | * |
2629 | */ |
2630 | |
2631 | struct mrq_iso_client_response { |
2632 | union { |
2633 | struct cmd_iso_client_calculate_la_response calculate_la_resp; |
2634 | struct cmd_iso_client_get_max_bw_response max_isobw_resp; |
2635 | } BPMP_UNION_ANON; |
2636 | } BPMP_ABI_PACKED; |
2637 | |
2638 | /** @} ISO_CLIENT */ |
2639 | /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2640 | |
2641 | /** |
2642 | * @ingroup MRQ_Codes |
2643 | * @def MRQ_CPU_NDIV_LIMITS |
2644 | * @brief CPU freq. limits in ndiv |
2645 | * |
2646 | * * Platforms: T194 onwards |
2647 | * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) |
2648 | * * Initiators: CCPLEX |
2649 | * * Targets: BPMP |
2650 | * * Request Payload: @ref mrq_cpu_ndiv_limits_request |
2651 | * * Response Payload: @ref mrq_cpu_ndiv_limits_response |
2652 | * @addtogroup CPU |
2653 | * @{ |
2654 | */ |
2655 | |
2656 | /** |
2657 | * @brief Request for ndiv limits of a cluster |
2658 | */ |
2659 | struct mrq_cpu_ndiv_limits_request { |
2660 | /** @brief Enum cluster_id */ |
2661 | uint32_t cluster_id; |
2662 | } BPMP_ABI_PACKED; |
2663 | |
2664 | /** |
2665 | * @brief Response to #MRQ_CPU_NDIV_LIMITS |
2666 | */ |
2667 | struct mrq_cpu_ndiv_limits_response { |
2668 | /** @brief Reference frequency in Hz */ |
2669 | uint32_t ref_clk_hz; |
2670 | /** @brief Post divider value */ |
2671 | uint16_t pdiv; |
2672 | /** @brief Input divider value */ |
2673 | uint16_t mdiv; |
2674 | /** @brief FMAX expressed with max NDIV value */ |
2675 | uint16_t ndiv_max; |
2676 | /** @brief Minimum allowed NDIV value */ |
2677 | uint16_t ndiv_min; |
2678 | } BPMP_ABI_PACKED; |
2679 | |
2680 | /** @} CPU */ |
2681 | /** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2682 | |
2683 | /** |
2684 | * @ingroup MRQ_Codes |
2685 | * @def MRQ_CPU_AUTO_CC3 |
2686 | * @brief Query CPU cluster auto-CC3 configuration |
2687 | * |
2688 | * * Platforms: T194 |
2689 | * @cond bpmp_t194 |
2690 | * * Initiators: CCPLEX |
2691 | * * Targets: BPMP |
2692 | * * Request Payload: @ref mrq_cpu_auto_cc3_request |
2693 | * * Response Payload: @ref mrq_cpu_auto_cc3_response |
2694 | * @addtogroup CC3 |
2695 | * |
2696 | * Queries from BPMP auto-CC3 configuration (allowed/not allowed) for a |
2697 | * specified cluster. CCPLEX s/w uses this information to override its own |
2698 | * device tree auto-CC3 settings, so that BPMP device tree is a single source of |
2699 | * auto-CC3 platform configuration. |
2700 | * |
2701 | * @{ |
2702 | */ |
2703 | |
2704 | /** |
2705 | * @brief Request for auto-CC3 configuration of a cluster |
2706 | */ |
2707 | struct mrq_cpu_auto_cc3_request { |
2708 | /** @brief Enum cluster_id (logical cluster id, known to CCPLEX s/w) */ |
2709 | uint32_t cluster_id; |
2710 | } BPMP_ABI_PACKED; |
2711 | |
2712 | /** |
2713 | * @brief Response to #MRQ_CPU_AUTO_CC3 |
2714 | */ |
2715 | struct mrq_cpu_auto_cc3_response { |
2716 | /** |
2717 | * @brief auto-CC3 configuration |
2718 | * |
2719 | * - bits[31..10] reserved. |
2720 | * - bits[9..1] cc3 ndiv |
2721 | * - bit [0] if "1" auto-CC3 is allowed, if "0" auto-CC3 is not allowed |
2722 | */ |
2723 | uint32_t auto_cc3_config; |
2724 | } BPMP_ABI_PACKED; |
2725 | |
2726 | /** @} CC3 */ |
2727 | /** @endcond bpmp_t194 */ |
2728 | |
2729 | /** |
2730 | * @ingroup MRQ_Codes |
2731 | * @def MRQ_RINGBUF_CONSOLE |
2732 | * @brief A ring buffer debug console for BPMP |
2733 | * @addtogroup RingbufConsole |
2734 | * |
2735 | * The ring buffer debug console aims to be a substitute for the UART debug |
2736 | * console. The debug console is implemented with two ring buffers in the |
2737 | * BPMP-FW, the RX (receive) and TX (transmit) buffers. Characters can be read |
2738 | * and written to the buffers by the host via the MRQ interface. |
2739 | * |
2740 | * @{ |
2741 | */ |
2742 | |
2743 | /** |
2744 | * @brief Maximum number of bytes transferred in a single write command to the |
2745 | * BPMP |
2746 | * |
2747 | * This is determined by the number of free bytes in the message struct, |
2748 | * rounded down to a multiple of four. |
2749 | */ |
2750 | #define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112 |
2751 | |
2752 | /** |
2753 | * @brief Maximum number of bytes transferred in a single read command to the |
2754 | * BPMP |
2755 | * |
2756 | * This is determined by the number of free bytes in the message struct, |
2757 | * rounded down to a multiple of four. |
2758 | */ |
2759 | #define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116 |
2760 | |
2761 | enum mrq_ringbuf_console_host_to_bpmp_cmd { |
2762 | /** |
2763 | * @brief Check whether the BPMP driver supports the specified request |
2764 | * type |
2765 | * |
2766 | * mrq_response::err is 0 if the specified request is supported and |
2767 | * -#BPMP_ENODEV otherwise |
2768 | */ |
2769 | CMD_RINGBUF_CONSOLE_QUERY_ABI = 0, |
2770 | /** |
2771 | * @brief Perform a read operation on the BPMP TX buffer |
2772 | * |
2773 | * mrq_response::err is 0 |
2774 | */ |
2775 | CMD_RINGBUF_CONSOLE_READ = 1, |
2776 | /** |
2777 | * @brief Perform a write operation on the BPMP RX buffer |
2778 | * |
2779 | * mrq_response::err is 0 if the operation was successful and |
2780 | * -#BPMP_ENODEV otherwise |
2781 | */ |
2782 | CMD_RINGBUF_CONSOLE_WRITE = 2, |
2783 | /** |
2784 | * @brief Get the length of the buffer and the physical addresses of |
2785 | * the buffer data and the head and tail counters |
2786 | * |
2787 | * mrq_response::err is 0 if the operation was successful and |
2788 | * -#BPMP_ENODEV otherwise |
2789 | */ |
2790 | CMD_RINGBUF_CONSOLE_GET_FIFO = 3, |
2791 | }; |
2792 | |
2793 | /** |
2794 | * @ingroup RingbufConsole |
2795 | * @brief Host->BPMP request data for request type |
2796 | * #CMD_RINGBUF_CONSOLE_QUERY_ABI |
2797 | */ |
2798 | struct cmd_ringbuf_console_query_abi_req { |
2799 | /** @brief Command identifier to be queried */ |
2800 | uint32_t cmd; |
2801 | } BPMP_ABI_PACKED; |
2802 | |
2803 | /** @private */ |
2804 | struct cmd_ringbuf_console_query_abi_resp { |
2805 | BPMP_ABI_EMPTY |
2806 | } BPMP_ABI_PACKED; |
2807 | |
2808 | /** |
2809 | * @ingroup RingbufConsole |
2810 | * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ |
2811 | */ |
2812 | struct cmd_ringbuf_console_read_req { |
2813 | /** |
2814 | * @brief Number of bytes requested to be read from the BPMP TX buffer |
2815 | */ |
2816 | uint8_t len; |
2817 | } BPMP_ABI_PACKED; |
2818 | |
2819 | /** |
2820 | * @ingroup RingbufConsole |
2821 | * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ |
2822 | */ |
2823 | struct cmd_ringbuf_console_read_resp { |
2824 | /** @brief The actual data read from the BPMP TX buffer */ |
2825 | uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_READ_LEN]; |
2826 | /** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */ |
2827 | uint8_t len; |
2828 | } BPMP_ABI_PACKED; |
2829 | |
2830 | /** |
2831 | * @ingroup RingbufConsole |
2832 | * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE |
2833 | */ |
2834 | struct cmd_ringbuf_console_write_req { |
2835 | /** @brief The actual data to be written to the BPMP RX buffer */ |
2836 | uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN]; |
2837 | /** @brief Number of bytes in cmd_ringbuf_console_write_req::data */ |
2838 | uint8_t len; |
2839 | } BPMP_ABI_PACKED; |
2840 | |
2841 | /** |
2842 | * @ingroup RingbufConsole |
2843 | * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE |
2844 | */ |
2845 | struct cmd_ringbuf_console_write_resp { |
2846 | /** @brief Number of bytes of available space in the BPMP RX buffer */ |
2847 | uint32_t space_avail; |
2848 | /** @brief Number of bytes that were written to the BPMP RX buffer */ |
2849 | uint8_t len; |
2850 | } BPMP_ABI_PACKED; |
2851 | |
2852 | /** @private */ |
2853 | struct cmd_ringbuf_console_get_fifo_req { |
2854 | BPMP_ABI_EMPTY |
2855 | } BPMP_ABI_PACKED; |
2856 | |
2857 | /** |
2858 | * @ingroup RingbufConsole |
2859 | * @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO |
2860 | */ |
2861 | struct cmd_ringbuf_console_get_fifo_resp { |
2862 | /** @brief Physical address of the BPMP TX buffer */ |
2863 | uint64_t bpmp_tx_buf_addr; |
2864 | /** @brief Physical address of the BPMP TX buffer head counter */ |
2865 | uint64_t bpmp_tx_head_addr; |
2866 | /** @brief Physical address of the BPMP TX buffer tail counter */ |
2867 | uint64_t bpmp_tx_tail_addr; |
2868 | /** @brief Length of the BPMP TX buffer */ |
2869 | uint32_t bpmp_tx_buf_len; |
2870 | } BPMP_ABI_PACKED; |
2871 | |
2872 | /** |
2873 | * @ingroup RingbufConsole |
2874 | * @brief Host->BPMP request data. |
2875 | * |
2876 | * Reply type is union #mrq_ringbuf_console_bpmp_to_host_response . |
2877 | */ |
2878 | struct mrq_ringbuf_console_host_to_bpmp_request { |
2879 | /** |
2880 | * @brief Type of request. Values listed in enum |
2881 | * #mrq_ringbuf_console_host_to_bpmp_cmd. |
2882 | */ |
2883 | uint32_t type; |
2884 | /** @brief request type specific parameters. */ |
2885 | union { |
2886 | struct cmd_ringbuf_console_query_abi_req query_abi; |
2887 | struct cmd_ringbuf_console_read_req read; |
2888 | struct cmd_ringbuf_console_write_req write; |
2889 | struct cmd_ringbuf_console_get_fifo_req get_fifo; |
2890 | } BPMP_UNION_ANON; |
2891 | } BPMP_ABI_PACKED; |
2892 | |
2893 | /** |
2894 | * @ingroup RingbufConsole |
2895 | * @brief Host->BPMP reply data |
2896 | * |
2897 | * In response to struct #mrq_ringbuf_console_host_to_bpmp_request. |
2898 | */ |
2899 | union mrq_ringbuf_console_bpmp_to_host_response { |
2900 | struct cmd_ringbuf_console_query_abi_resp query_abi; |
2901 | struct cmd_ringbuf_console_read_resp read; |
2902 | struct cmd_ringbuf_console_write_resp write; |
2903 | struct cmd_ringbuf_console_get_fifo_resp get_fifo; |
2904 | } BPMP_ABI_PACKED; |
2905 | |
2906 | /** @} RingbufConsole */ |
2907 | |
2908 | /** |
2909 | * @ingroup MRQ_Codes |
2910 | * @def MRQ_STRAP |
2911 | * @brief Set a strap value controlled by BPMP |
2912 | * |
2913 | * * Platforms: T194 onwards |
2914 | * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) |
2915 | * * Initiators: CCPLEX |
2916 | * * Targets: BPMP |
2917 | * * Request Payload: @ref mrq_strap_request |
2918 | * * Response Payload: N/A |
2919 | * @addtogroup Strap |
2920 | * |
2921 | * A strap is an input that is sampled by a hardware unit during the |
2922 | * unit's startup process. The sampled value of a strap affects the |
2923 | * behavior of the unit until the unit is restarted. Many hardware |
2924 | * units sample their straps at the instant that their resets are |
2925 | * deasserted. |
2926 | * |
2927 | * BPMP owns registers which act as straps to various units. It |
2928 | * exposes limited control of those straps via #MRQ_STRAP. |
2929 | * |
2930 | * @{ |
2931 | */ |
2932 | enum mrq_strap_cmd { |
2933 | /** @private */ |
2934 | STRAP_RESERVED = 0, |
2935 | /** @brief Set a strap value */ |
2936 | STRAP_SET = 1 |
2937 | }; |
2938 | |
2939 | /** |
2940 | * @brief Request with #MRQ_STRAP |
2941 | */ |
2942 | struct mrq_strap_request { |
2943 | /** @brief @ref mrq_strap_cmd */ |
2944 | uint32_t cmd; |
2945 | /** @brief Strap ID from @ref Strap_Identifiers */ |
2946 | uint32_t id; |
2947 | /** @brief Desired value for strap (if cmd is #STRAP_SET) */ |
2948 | uint32_t value; |
2949 | } BPMP_ABI_PACKED; |
2950 | |
2951 | /** @} Strap */ |
2952 | /** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
2953 | |
2954 | /** |
2955 | * @ingroup MRQ_Codes |
2956 | * @def MRQ_UPHY |
2957 | * @brief Perform a UPHY operation |
2958 | * |
2959 | * * Platforms: T194 onwards |
2960 | * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) |
2961 | * * Initiators: CCPLEX |
2962 | * * Targets: BPMP |
2963 | * * Request Payload: @ref mrq_uphy_request |
2964 | * * Response Payload: @ref mrq_uphy_response |
2965 | * |
2966 | * @addtogroup UPHY |
2967 | * @{ |
2968 | */ |
2969 | enum { |
2970 | CMD_UPHY_PCIE_LANE_MARGIN_CONTROL = 1, |
2971 | CMD_UPHY_PCIE_LANE_MARGIN_STATUS = 2, |
2972 | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT = 3, |
2973 | CMD_UPHY_PCIE_CONTROLLER_STATE = 4, |
2974 | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF = 5, |
2975 | CMD_UPHY_DISPLAY_PORT_INIT = 6, |
2976 | CMD_UPHY_DISPLAY_PORT_OFF = 7, |
2977 | CMD_UPHY_XUSB_DYN_LANES_RESTORE = 8, |
2978 | CMD_UPHY_MAX, |
2979 | }; |
2980 | |
2981 | struct cmd_uphy_margin_control_request { |
2982 | /** @brief Enable margin */ |
2983 | int32_t en; |
2984 | /** @brief Clear the number of error and sections */ |
2985 | int32_t clr; |
2986 | /** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */ |
2987 | uint32_t x; |
2988 | /** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */ |
2989 | uint32_t y; |
2990 | /** @brief Set number of bit blocks for each margin section */ |
2991 | uint32_t nblks; |
2992 | } BPMP_ABI_PACKED; |
2993 | |
2994 | struct cmd_uphy_margin_status_response { |
2995 | /** @brief Number of errors observed */ |
2996 | uint32_t status; |
2997 | } BPMP_ABI_PACKED; |
2998 | |
2999 | struct cmd_uphy_ep_controller_pll_init_request { |
3000 | /** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */ |
3001 | uint8_t ep_controller; |
3002 | } BPMP_ABI_PACKED; |
3003 | |
3004 | struct cmd_uphy_pcie_controller_state_request { |
3005 | /** @brief PCIE controller number, T194 valid: 0-4; T234 valid: 0-10; T239 valid: 0-3 */ |
3006 | uint8_t pcie_controller; |
3007 | uint8_t enable; |
3008 | } BPMP_ABI_PACKED; |
3009 | |
3010 | struct cmd_uphy_ep_controller_pll_off_request { |
3011 | /** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */ |
3012 | uint8_t ep_controller; |
3013 | } BPMP_ABI_PACKED; |
3014 | |
3015 | struct cmd_uphy_display_port_init_request { |
3016 | /** @brief DisplayPort link rate, T239 valid: 1620, 2700, 5400, 8100, 2160, 2430, 3240, 4320, 6750 */ |
3017 | uint16_t link_rate; |
3018 | /** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */ |
3019 | uint16_t lanes_bitmap; |
3020 | } BPMP_ABI_PACKED; |
3021 | |
3022 | struct cmd_uphy_xusb_dyn_lanes_restore_request { |
3023 | /** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */ |
3024 | uint16_t lanes_bitmap; |
3025 | } BPMP_ABI_PACKED; |
3026 | |
3027 | /** |
3028 | * @ingroup UPHY |
3029 | * @brief Request with #MRQ_UPHY |
3030 | * |
3031 | * Used by the sender of an #MRQ_UPHY message to control UPHY. |
3032 | * The uphy_request is split into several sub-commands. CMD_UPHY_PCIE_LANE_MARGIN_STATUS |
3033 | * requires no additional data. Others have a sub-command specific payload. Below table |
3034 | * shows sub-commands with their corresponding payload data. |
3035 | * |
3036 | * |sub-command |payload | |
3037 | * |------------------------------------ |----------------------------------------| |
3038 | * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL |uphy_set_margin_control | |
3039 | * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS | | |
3040 | * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT |cmd_uphy_ep_controller_pll_init_request | |
3041 | * |CMD_UPHY_PCIE_CONTROLLER_STATE |cmd_uphy_pcie_controller_state_request | |
3042 | * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF |cmd_uphy_ep_controller_pll_off_request | |
3043 | * |CMD_UPHY_PCIE_DISPLAY_PORT_INIT |cmd_uphy_display_port_init_request | |
3044 | * |CMD_UPHY_PCIE_DISPLAY_PORT_OFF | | |
3045 | * |CMD_UPHY_XUSB_DYN_LANES_RESTORE |cmd_uphy_xusb_dyn_lanes_restore_request | |
3046 | * |
3047 | */ |
3048 | |
3049 | struct mrq_uphy_request { |
3050 | /** @brief Lane number. */ |
3051 | uint16_t lane; |
3052 | /** @brief Sub-command id. */ |
3053 | uint16_t cmd; |
3054 | |
3055 | union { |
3056 | struct cmd_uphy_margin_control_request uphy_set_margin_control; |
3057 | struct cmd_uphy_ep_controller_pll_init_request ep_ctrlr_pll_init; |
3058 | struct cmd_uphy_pcie_controller_state_request controller_state; |
3059 | struct cmd_uphy_ep_controller_pll_off_request ep_ctrlr_pll_off; |
3060 | struct cmd_uphy_display_port_init_request display_port_init; |
3061 | struct cmd_uphy_xusb_dyn_lanes_restore_request xusb_dyn_lanes_restore; |
3062 | } BPMP_UNION_ANON; |
3063 | } BPMP_ABI_PACKED; |
3064 | |
3065 | /** |
3066 | * @ingroup UPHY |
3067 | * @brief Response to MRQ_UPHY |
3068 | * |
3069 | * Each sub-command supported by @ref mrq_uphy_request may return |
3070 | * sub-command-specific data. Some do and some do not as indicated in |
3071 | * the following table |
3072 | * |
3073 | * |sub-command |payload | |
3074 | * |---------------------------- |------------------------| |
3075 | * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | | |
3076 | * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS |uphy_get_margin_status | |
3077 | * |
3078 | */ |
3079 | |
3080 | struct mrq_uphy_response { |
3081 | union { |
3082 | struct cmd_uphy_margin_status_response uphy_get_margin_status; |
3083 | } BPMP_UNION_ANON; |
3084 | } BPMP_ABI_PACKED; |
3085 | |
3086 | /** @} UPHY */ |
3087 | /** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */ |
3088 | |
3089 | /** |
3090 | * @ingroup MRQ_Codes |
3091 | * @def MRQ_FMON |
3092 | * @brief Perform a frequency monitor configuration operations |
3093 | * |
3094 | * * Platforms: T194 onwards |
3095 | * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) |
3096 | * * Initiators: CCPLEX |
3097 | * * Targets: BPMP |
3098 | * * Request Payload: @ref mrq_fmon_request |
3099 | * * Response Payload: @ref mrq_fmon_response |
3100 | * @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) |
3101 | * |
3102 | * @addtogroup FMON |
3103 | * @{ |
3104 | * @cond (bpmp_t194 || bpmp_t234) |
3105 | */ |
3106 | enum { |
3107 | /** |
3108 | * @brief Clamp FMON configuration to specified rate. |
3109 | * |
3110 | * The monitored clock must be running for clamp to succeed. If |
3111 | * clamped, FMON configuration is preserved when clock rate |
3112 | * and/or state is changed. |
3113 | * |
3114 | * mrq_response::err is 0 if the operation was successful, or @n |
3115 | * -#BPMP_EACCES: FMON access error @n |
3116 | * -#BPMP_EBADCMD if subcommand is not supported @n |
3117 | * -#BPMP_EBADSLT: clamp FMON on cluster with auto-CC3 enabled @n |
3118 | * -#BPMP_EBUSY: fmon is already clamped at different rate @n |
3119 | * -#BPMP_EFAULT: self-diagnostic error @n |
3120 | * -#BPMP_EINVAL: invalid FMON configuration @n |
3121 | * -#BPMP_EOPNOTSUPP: not in production mode @n |
3122 | * -#BPMP_ENODEV: invalid clk_id @n |
3123 | * -#BPMP_ENOENT: no calibration data, uninitialized @n |
3124 | * -#BPMP_ENOTSUP: avfs config not set @n |
3125 | * -#BPMP_ENOSYS: clamp FMON on cluster clock w/ no NAFLL @n |
3126 | * -#BPMP_ETIMEDOUT: operation timed out @n |
3127 | */ |
3128 | CMD_FMON_GEAR_CLAMP = 1, |
3129 | /** |
3130 | * @brief Release clamped FMON configuration. |
3131 | * |
3132 | * Allow FMON configuration to follow monitored clock rate |
3133 | * and/or state changes. |
3134 | * |
3135 | * mrq_response::err is 0 if the operation was successful, or @n |
3136 | * -#BPMP_EBADCMD if subcommand is not supported @n |
3137 | * -#BPMP_ENODEV: invalid clk_id @n |
3138 | * -#BPMP_ENOENT: no calibration data, uninitialized @n |
3139 | * -#BPMP_ENOTSUP: avfs config not set @n |
3140 | * -#BPMP_EOPNOTSUPP: not in production mode @n |
3141 | */ |
3142 | CMD_FMON_GEAR_FREE = 2, |
3143 | /** |
3144 | * @brief Return rate FMON is clamped at, or 0 if FMON is not |
3145 | * clamped. |
3146 | * |
3147 | * Inherently racy, since clamp state can be changed |
3148 | * concurrently. Useful for testing. |
3149 | * |
3150 | * mrq_response::err is 0 if the operation was successful, or @n |
3151 | * -#BPMP_EBADCMD if subcommand is not supported @n |
3152 | * -#BPMP_ENODEV: invalid clk_id @n |
3153 | * -#BPMP_ENOENT: no calibration data, uninitialized @n |
3154 | * -#BPMP_ENOTSUP: avfs config not set @n |
3155 | * -#BPMP_EOPNOTSUPP: not in production mode @n |
3156 | */ |
3157 | CMD_FMON_GEAR_GET = 3, |
3158 | /** |
3159 | * @brief Return current status of FMON faults detected by FMON |
3160 | * h/w or s/w since last invocation of this command. |
3161 | * Clears fault status. |
3162 | * |
3163 | * mrq_response::err is 0 if the operation was successful, or @n |
3164 | * -#BPMP_EBADCMD if subcommand is not supported @n |
3165 | * -#BPMP_EINVAL: invalid fault type @n |
3166 | * -#BPMP_ENODEV: invalid clk_id @n |
3167 | * -#BPMP_ENOENT: no calibration data, uninitialized @n |
3168 | * -#BPMP_ENOTSUP: avfs config not set @n |
3169 | * -#BPMP_EOPNOTSUPP: not in production mode @n |
3170 | */ |
3171 | CMD_FMON_FAULT_STS_GET = 4, |
3172 | }; |
3173 | |
3174 | /** |
3175 | * @cond DEPRECATED |
3176 | * Kept for backward compatibility |
3177 | */ |
3178 | #define CMD_FMON_NUM 4 |
3179 | |
3180 | /** @endcond DEPRECATED */ |
3181 | |
3182 | /** |
3183 | * @defgroup fmon_fault_type FMON fault type |
3184 | * @addtogroup fmon_fault_type |
3185 | * @{ |
3186 | */ |
3187 | /** @brief All detected FMON faults (h/w or s/w) */ |
3188 | #define FMON_FAULT_TYPE_ALL 0U |
3189 | /** @brief FMON faults detected by h/w */ |
3190 | #define FMON_FAULT_TYPE_HW 1U |
3191 | /** @brief FMON faults detected by s/w */ |
3192 | #define FMON_FAULT_TYPE_SW 2U |
3193 | |
3194 | /** @} fmon_fault_type */ |
3195 | |
3196 | |
3197 | struct cmd_fmon_gear_clamp_request { |
3198 | int32_t unused; |
3199 | int64_t rate; |
3200 | } BPMP_ABI_PACKED; |
3201 | |
3202 | /** @private */ |
3203 | struct cmd_fmon_gear_clamp_response { |
3204 | BPMP_ABI_EMPTY |
3205 | } BPMP_ABI_PACKED; |
3206 | |
3207 | /** @private */ |
3208 | struct cmd_fmon_gear_free_request { |
3209 | BPMP_ABI_EMPTY |
3210 | } BPMP_ABI_PACKED; |
3211 | |
3212 | /** @private */ |
3213 | struct cmd_fmon_gear_free_response { |
3214 | BPMP_ABI_EMPTY |
3215 | } BPMP_ABI_PACKED; |
3216 | |
3217 | /** @private */ |
3218 | struct cmd_fmon_gear_get_request { |
3219 | BPMP_ABI_EMPTY |
3220 | } BPMP_ABI_PACKED; |
3221 | |
3222 | struct cmd_fmon_gear_get_response { |
3223 | int64_t rate; |
3224 | } BPMP_ABI_PACKED; |
3225 | |
3226 | struct cmd_fmon_fault_sts_get_request { |
3227 | uint32_t fault_type; /**< @ref fmon_fault_type */ |
3228 | } BPMP_ABI_PACKED; |
3229 | |
3230 | struct cmd_fmon_fault_sts_get_response { |
3231 | uint32_t fault_sts; |
3232 | } BPMP_ABI_PACKED; |
3233 | |
3234 | /** |
3235 | * @ingroup FMON |
3236 | * @brief Request with #MRQ_FMON |
3237 | * |
3238 | * Used by the sender of an #MRQ_FMON message to configure clock |
3239 | * frequency monitors. The FMON request is split into several |
3240 | * sub-commands. Some sub-commands require no additional data. |
3241 | * Others have a sub-command specific payload |
3242 | * |
3243 | * |sub-command |payload | |
3244 | * |----------------------------|-----------------------| |
3245 | * |CMD_FMON_GEAR_CLAMP |fmon_gear_clamp | |
3246 | * |CMD_FMON_GEAR_FREE |- | |
3247 | * |CMD_FMON_GEAR_GET |- | |
3248 | * |CMD_FMON_FAULT_STS_GET |fmon_fault_sts_get | |
3249 | * |
3250 | */ |
3251 | struct mrq_fmon_request { |
3252 | /** @brief Sub-command and clock id concatenated to 32-bit word. |
3253 | * - bits[31..24] is the sub-cmd. |
3254 | * - bits[23..0] is monitored clock id used to select target |
3255 | * FMON |
3256 | */ |
3257 | uint32_t cmd_and_id; |
3258 | |
3259 | union { |
3260 | struct cmd_fmon_gear_clamp_request fmon_gear_clamp; |
3261 | /** @private */ |
3262 | struct cmd_fmon_gear_free_request fmon_gear_free; |
3263 | /** @private */ |
3264 | struct cmd_fmon_gear_get_request fmon_gear_get; |
3265 | struct cmd_fmon_fault_sts_get_request fmon_fault_sts_get; |
3266 | } BPMP_UNION_ANON; |
3267 | } BPMP_ABI_PACKED; |
3268 | |
3269 | /** |
3270 | * @ingroup FMON |
3271 | * @brief Response to MRQ_FMON |
3272 | * |
3273 | * Each sub-command supported by @ref mrq_fmon_request may |
3274 | * return sub-command-specific data as indicated below. |
3275 | * |
3276 | * |sub-command |payload | |
3277 | * |----------------------------|------------------------| |
3278 | * |CMD_FMON_GEAR_CLAMP |- | |
3279 | * |CMD_FMON_GEAR_FREE |- | |
3280 | * |CMD_FMON_GEAR_GET |fmon_gear_get | |
3281 | * |CMD_FMON_FAULT_STS_GET |fmon_fault_sts_get | |
3282 | * |
3283 | */ |
3284 | |
3285 | struct mrq_fmon_response { |
3286 | union { |
3287 | /** @private */ |
3288 | struct cmd_fmon_gear_clamp_response fmon_gear_clamp; |
3289 | /** @private */ |
3290 | struct cmd_fmon_gear_free_response fmon_gear_free; |
3291 | struct cmd_fmon_gear_get_response fmon_gear_get; |
3292 | struct cmd_fmon_fault_sts_get_response fmon_fault_sts_get; |
3293 | } BPMP_UNION_ANON; |
3294 | } BPMP_ABI_PACKED; |
3295 | |
3296 | /** @endcond (bpmp_t194 || bpmp_t234) */ |
3297 | /** @} FMON */ |
3298 | |
3299 | /** |
3300 | * @ingroup MRQ_Codes |
3301 | * @def MRQ_EC |
3302 | * @brief Provide status information on faults reported by Error |
3303 | * Collator (EC) to HSM. |
3304 | * |
3305 | * * Platforms: T194 |
3306 | * @cond bpmp_t194 |
3307 | * * Initiators: CCPLEX |
3308 | * * Targets: BPMP |
3309 | * * Request Payload: @ref mrq_ec_request |
3310 | * * Response Payload: @ref mrq_ec_response |
3311 | * |
3312 | * @note This MRQ ABI is under construction, and subject to change |
3313 | * |
3314 | * @endcond bpmp_t194 |
3315 | * @addtogroup EC |
3316 | * @{ |
3317 | * @cond bpmp_t194 |
3318 | */ |
3319 | enum { |
3320 | /** |
3321 | * @cond DEPRECATED |
3322 | * @brief Retrieve specified EC status. |
3323 | * |
3324 | * mrq_response::err is 0 if the operation was successful, or @n |
3325 | * -#BPMP_ENODEV if target EC is not owned by BPMP @n |
3326 | * -#BPMP_EACCES if target EC power domain is turned off @n |
3327 | * -#BPMP_EBADCMD if subcommand is not supported |
3328 | * @endcond DEPRECATED |
3329 | */ |
3330 | CMD_EC_STATUS_GET = 1, /* deprecated */ |
3331 | |
3332 | /** |
3333 | * @brief Retrieve specified EC extended status (includes error |
3334 | * counter and user values). |
3335 | * |
3336 | * mrq_response::err is 0 if the operation was successful, or @n |
3337 | * -#BPMP_ENODEV if target EC is not owned by BPMP @n |
3338 | * -#BPMP_EACCES if target EC power domain is turned off @n |
3339 | * -#BPMP_EBADCMD if subcommand is not supported |
3340 | */ |
3341 | CMD_EC_STATUS_EX_GET = 2, |
3342 | CMD_EC_NUM, |
3343 | }; |
3344 | |
3345 | /** @brief BPMP ECs error types */ |
3346 | enum bpmp_ec_err_type { |
3347 | /** @brief Parity error on internal data path |
3348 | * |
3349 | * Error descriptor @ref ec_err_simple_desc. |
3350 | */ |
3351 | EC_ERR_TYPE_PARITY_INTERNAL = 1, |
3352 | |
3353 | /** @brief ECC SEC error on internal data path |
3354 | * |
3355 | * Error descriptor @ref ec_err_simple_desc. |
3356 | */ |
3357 | EC_ERR_TYPE_ECC_SEC_INTERNAL = 2, |
3358 | |
3359 | /** @brief ECC DED error on internal data path |
3360 | * |
3361 | * Error descriptor @ref ec_err_simple_desc. |
3362 | */ |
3363 | EC_ERR_TYPE_ECC_DED_INTERNAL = 3, |
3364 | |
3365 | /** @brief Comparator error |
3366 | * |
3367 | * Error descriptor @ref ec_err_simple_desc. |
3368 | */ |
3369 | EC_ERR_TYPE_COMPARATOR = 4, |
3370 | |
3371 | /** @brief Register parity error |
3372 | * |
3373 | * Error descriptor @ref ec_err_reg_parity_desc. |
3374 | */ |
3375 | EC_ERR_TYPE_REGISTER_PARITY = 5, |
3376 | |
3377 | /** @brief Parity error from on-chip SRAM/FIFO |
3378 | * |
3379 | * Error descriptor @ref ec_err_simple_desc. |
3380 | */ |
3381 | EC_ERR_TYPE_PARITY_SRAM = 6, |
3382 | |
3383 | /** @brief Clock Monitor error |
3384 | * |
3385 | * Error descriptor @ref ec_err_fmon_desc. |
3386 | */ |
3387 | EC_ERR_TYPE_CLOCK_MONITOR = 9, |
3388 | |
3389 | /** @brief Voltage Monitor error |
3390 | * |
3391 | * Error descriptor @ref ec_err_vmon_desc. |
3392 | */ |
3393 | EC_ERR_TYPE_VOLTAGE_MONITOR = 10, |
3394 | |
3395 | /** @brief SW Correctable error |
3396 | * |
3397 | * Error descriptor @ref ec_err_sw_error_desc. |
3398 | */ |
3399 | EC_ERR_TYPE_SW_CORRECTABLE = 16, |
3400 | |
3401 | /** @brief SW Uncorrectable error |
3402 | * |
3403 | * Error descriptor @ref ec_err_sw_error_desc. |
3404 | */ |
3405 | EC_ERR_TYPE_SW_UNCORRECTABLE = 17, |
3406 | |
3407 | /** @brief Other HW Correctable error |
3408 | * |
3409 | * Error descriptor @ref ec_err_simple_desc. |
3410 | */ |
3411 | EC_ERR_TYPE_OTHER_HW_CORRECTABLE = 32, |
3412 | |
3413 | /** @brief Other HW Uncorrectable error |
3414 | * |
3415 | * Error descriptor @ref ec_err_simple_desc. |
3416 | */ |
3417 | EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE = 33, |
3418 | }; |
3419 | |
3420 | /** @brief Group of registers with parity error. */ |
3421 | enum ec_registers_group { |
3422 | /** @brief Functional registers group */ |
3423 | EC_ERR_GROUP_FUNC_REG = 0U, |
3424 | /** @brief SCR registers group */ |
3425 | EC_ERR_GROUP_SCR_REG = 1U, |
3426 | }; |
3427 | |
3428 | /** |
3429 | * @defgroup bpmp_ec_status_flags EC Status Flags |
3430 | * @addtogroup bpmp_ec_status_flags |
3431 | * @{ |
3432 | */ |
3433 | /** @brief No EC error found flag */ |
3434 | #define EC_STATUS_FLAG_NO_ERROR 0x0001U |
3435 | /** @brief Last EC error found flag */ |
3436 | #define EC_STATUS_FLAG_LAST_ERROR 0x0002U |
3437 | /** @brief EC latent error flag */ |
3438 | #define EC_STATUS_FLAG_LATENT_ERROR 0x0004U |
3439 | |
3440 | /** @} bpmp_ec_status_flags */ |
3441 | |
3442 | /** |
3443 | * @defgroup bpmp_ec_desc_flags EC Descriptor Flags |
3444 | * @addtogroup bpmp_ec_desc_flags |
3445 | * @{ |
3446 | */ |
3447 | /** @brief EC descriptor error resolved flag */ |
3448 | #define EC_DESC_FLAG_RESOLVED 0x0001U |
3449 | /** @brief EC descriptor failed to retrieve id flag */ |
3450 | #define EC_DESC_FLAG_NO_ID 0x0002U |
3451 | |
3452 | /** @} bpmp_ec_desc_flags */ |
3453 | |
3454 | /** |
3455 | * |error type | fmon_clk_id values | |
3456 | * |---------------------------------|---------------------------| |
3457 | * |@ref EC_ERR_TYPE_CLOCK_MONITOR |@ref bpmp_clock_ids | |
3458 | */ |
3459 | struct ec_err_fmon_desc { |
3460 | /** @brief Bitmask of @ref bpmp_ec_desc_flags */ |
3461 | uint16_t desc_flags; |
3462 | /** @brief FMON monitored clock id */ |
3463 | uint16_t fmon_clk_id; |
3464 | /** |
3465 | * @brief Bitmask of fault flags |
3466 | * |
3467 | * @ref bpmp_fmon_faults_flags |
3468 | */ |
3469 | uint32_t fmon_faults; |
3470 | /** @brief FMON faults access error */ |
3471 | int32_t fmon_access_error; |
3472 | } BPMP_ABI_PACKED; |
3473 | |
3474 | /** |
3475 | * | error type | vmon_adc_id values | |
3476 | * |---------------------------------|---------------------------| |
3477 | * |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids | |
3478 | */ |
3479 | struct ec_err_vmon_desc { |
3480 | /** @brief Bitmask of @ref bpmp_ec_desc_flags */ |
3481 | uint16_t desc_flags; |
3482 | /** @brief VMON rail adc id */ |
3483 | uint16_t vmon_adc_id; |
3484 | /** @brief Bitmask of bpmp_vmon_faults_flags */ |
3485 | uint32_t vmon_faults; |
3486 | /** @brief VMON faults access error */ |
3487 | int32_t vmon_access_error; |
3488 | } BPMP_ABI_PACKED; |
3489 | |
3490 | /** |
3491 | * |error type | reg_id values | |
3492 | * |---------------------------------|-----------------------| |
3493 | * |@ref EC_ERR_TYPE_REGISTER_PARITY | bpmp_ec_registers_ids | |
3494 | */ |
3495 | struct ec_err_reg_parity_desc { |
3496 | /** @brief Bitmask of @ref bpmp_ec_desc_flags */ |
3497 | uint16_t desc_flags; |
3498 | /** @brief Register id */ |
3499 | uint16_t reg_id; |
3500 | /** @brief Register group @ref ec_registers_group */ |
3501 | uint16_t reg_group; |
3502 | } BPMP_ABI_PACKED; |
3503 | |
3504 | /** |
3505 | * |error type | err_source_id values | |
3506 | * |--------------------------------- |----------------------| |
3507 | * |@ref EC_ERR_TYPE_SW_CORRECTABLE | bpmp_ec_ce_swd_ids | |
3508 | * |@ref EC_ERR_TYPE_SW_UNCORRECTABLE | bpmp_ec_ue_swd_ids | |
3509 | */ |
3510 | struct ec_err_sw_error_desc { |
3511 | /** @brief Bitmask of @ref bpmp_ec_desc_flags */ |
3512 | uint16_t desc_flags; |
3513 | /** @brief Error source id */ |
3514 | uint16_t err_source_id; |
3515 | /** @brief Sw error data */ |
3516 | uint32_t sw_error_data; |
3517 | } BPMP_ABI_PACKED; |
3518 | |
3519 | /** |
3520 | * |error type | err_source_id values | |
3521 | * |----------------------------------------|------------------------| |
3522 | * |@ref EC_ERR_TYPE_PARITY_INTERNAL | bpmp_ec_ipath_ids | |
3523 | * |@ref EC_ERR_TYPE_ECC_SEC_INTERNAL | bpmp_ec_ipath_ids | |
3524 | * |@ref EC_ERR_TYPE_ECC_DED_INTERNAL | bpmp_ec_ipath_ids | |
3525 | * |@ref EC_ERR_TYPE_COMPARATOR | bpmp_ec_comparator_ids| |
3526 | * |@ref EC_ERR_TYPE_OTHER_HW_CORRECTABLE | bpmp_ec_misc_hwd_ids | |
3527 | * |@ref EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE | bpmp_ec_misc_hwd_ids | |
3528 | * |@ref EC_ERR_TYPE_PARITY_SRAM | bpmp_clock_ids | |
3529 | */ |
3530 | struct ec_err_simple_desc { |
3531 | /** @brief Bitmask of @ref bpmp_ec_desc_flags */ |
3532 | uint16_t desc_flags; |
3533 | /** @brief Error source id. Id space depends on error type. */ |
3534 | uint16_t err_source_id; |
3535 | } BPMP_ABI_PACKED; |
3536 | |
3537 | /** @brief Union of EC error descriptors */ |
3538 | union ec_err_desc { |
3539 | struct ec_err_fmon_desc fmon_desc; |
3540 | struct ec_err_vmon_desc vmon_desc; |
3541 | struct ec_err_reg_parity_desc reg_parity_desc; |
3542 | struct ec_err_sw_error_desc sw_error_desc; |
3543 | struct ec_err_simple_desc simple_desc; |
3544 | } BPMP_ABI_PACKED; |
3545 | |
3546 | struct cmd_ec_status_get_request { |
3547 | /** @brief HSM error line number that identifies target EC. */ |
3548 | uint32_t ec_hsm_id; |
3549 | } BPMP_ABI_PACKED; |
3550 | |
3551 | /** EC status maximum number of descriptors */ |
3552 | #define EC_ERR_STATUS_DESC_MAX_NUM 4U |
3553 | |
3554 | /** |
3555 | * @cond DEPRECATED |
3556 | */ |
3557 | struct cmd_ec_status_get_response { |
3558 | /** @brief Target EC id (the same id received with request). */ |
3559 | uint32_t ec_hsm_id; |
3560 | /** |
3561 | * @brief Bitmask of @ref bpmp_ec_status_flags |
3562 | * |
3563 | * If NO_ERROR flag is set, error_ fields should be ignored |
3564 | */ |
3565 | uint32_t ec_status_flags; |
3566 | /** @brief Found EC error index. */ |
3567 | uint32_t error_idx; |
3568 | /** @brief Found EC error type @ref bpmp_ec_err_type. */ |
3569 | uint32_t error_type; |
3570 | /** @brief Number of returned EC error descriptors */ |
3571 | uint32_t error_desc_num; |
3572 | /** @brief EC error descriptors */ |
3573 | union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM]; |
3574 | } BPMP_ABI_PACKED; |
3575 | /** @endcond DEPRECATED */ |
3576 | |
3577 | struct cmd_ec_status_ex_get_response { |
3578 | /** @brief Target EC id (the same id received with request). */ |
3579 | uint32_t ec_hsm_id; |
3580 | /** |
3581 | * @brief Bitmask of @ref bpmp_ec_status_flags |
3582 | * |
3583 | * If NO_ERROR flag is set, error_ fields should be ignored |
3584 | */ |
3585 | uint32_t ec_status_flags; |
3586 | /** @brief Found EC error index. */ |
3587 | uint32_t error_idx; |
3588 | /** @brief Found EC error type @ref bpmp_ec_err_type. */ |
3589 | uint32_t error_type; |
3590 | /** @brief Found EC mission error counter value */ |
3591 | uint32_t error_counter; |
3592 | /** @brief Found EC mission error user value */ |
3593 | uint32_t error_uval; |
3594 | /** @brief Reserved entry */ |
3595 | uint32_t reserved; |
3596 | /** @brief Number of returned EC error descriptors */ |
3597 | uint32_t error_desc_num; |
3598 | /** @brief EC error descriptors */ |
3599 | union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM]; |
3600 | } BPMP_ABI_PACKED; |
3601 | |
3602 | /** |
3603 | * @ingroup EC |
3604 | * @brief Request with #MRQ_EC |
3605 | * |
3606 | * Used by the sender of an #MRQ_EC message to access ECs owned |
3607 | * by BPMP. |
3608 | * |
3609 | * @cond DEPRECATED |
3610 | * |sub-command |payload | |
3611 | * |----------------------------|-----------------------| |
3612 | * |@ref CMD_EC_STATUS_GET |ec_status_get | |
3613 | * @endcond DEPRECATED |
3614 | * |
3615 | * |sub-command |payload | |
3616 | * |----------------------------|-----------------------| |
3617 | * |@ref CMD_EC_STATUS_EX_GET |ec_status_get | |
3618 | * |
3619 | */ |
3620 | |
3621 | struct mrq_ec_request { |
3622 | /** @brief Sub-command id. */ |
3623 | uint32_t cmd_id; |
3624 | |
3625 | union { |
3626 | struct cmd_ec_status_get_request ec_status_get; |
3627 | } BPMP_UNION_ANON; |
3628 | } BPMP_ABI_PACKED; |
3629 | |
3630 | /** |
3631 | * @ingroup EC |
3632 | * @brief Response to MRQ_EC |
3633 | * |
3634 | * Each sub-command supported by @ref mrq_ec_request may return |
3635 | * sub-command-specific data as indicated below. |
3636 | * |
3637 | * @cond DEPRECATED |
3638 | * |sub-command |payload | |
3639 | * |----------------------------|------------------------| |
3640 | * |@ref CMD_EC_STATUS_GET |ec_status_get | |
3641 | * @endcond DEPRECATED |
3642 | * |
3643 | * |sub-command |payload | |
3644 | * |----------------------------|------------------------| |
3645 | * |@ref CMD_EC_STATUS_EX_GET |ec_status_ex_get | |
3646 | * |
3647 | */ |
3648 | |
3649 | struct mrq_ec_response { |
3650 | union { |
3651 | /** |
3652 | * @cond DEPRECATED |
3653 | */ |
3654 | struct cmd_ec_status_get_response ec_status_get; |
3655 | /** @endcond DEPRECATED */ |
3656 | struct cmd_ec_status_ex_get_response ec_status_ex_get; |
3657 | } BPMP_UNION_ANON; |
3658 | } BPMP_ABI_PACKED; |
3659 | |
3660 | /** @endcond bpmp_t194 */ |
3661 | /** @} EC */ |
3662 | |
3663 | /** |
3664 | * @ingroup MRQ_Codes |
3665 | * @def MRQ_TELEMETRY |
3666 | * @brief Get address of memory buffer refreshed with recently sampled |
3667 | * telemetry data |
3668 | * |
3669 | * * Platforms: TH500 onwards |
3670 | * @cond bpmp_th500 |
3671 | * * Initiators: CCPLEX |
3672 | * * Targets: BPMP |
3673 | * * Request Payload: N/A |
3674 | * * Response Payload: @ref mrq_telemetry_response |
3675 | * @addtogroup Telemetry |
3676 | * @{ |
3677 | */ |
3678 | |
3679 | /** |
3680 | * @brief Response to #MRQ_TELEMETRY |
3681 | * |
3682 | * mrq_response::err is |
3683 | * * 0: Telemetry data is available at returned address |
3684 | * * -#BPMP_EACCES: MRQ master is not allowed to request buffer refresh |
3685 | * * -#BPMP_ENAVAIL: Telemetry buffer cannot be refreshed via this MRQ channel |
3686 | * * -#BPMP_ENOTSUP: Telemetry buffer is not supported by BPMP-FW |
3687 | * * -#BPMP_ENODEV: Telemetry mrq is not supported by BPMP-FW |
3688 | */ |
3689 | struct mrq_telemetry_response { |
3690 | /** @brief Physical address of telemetry data buffer */ |
3691 | uint64_t data_buf_addr; /**< see @ref bpmp_telemetry_layout */ |
3692 | } BPMP_ABI_PACKED; |
3693 | |
3694 | /** @} Telemetry */ |
3695 | /** @endcond bpmp_th500 */ |
3696 | |
3697 | /** |
3698 | * @ingroup MRQ_Codes |
3699 | * @def MRQ_PWR_LIMIT |
3700 | * @brief Control power limits. |
3701 | * |
3702 | * * Platforms: TH500 onwards |
3703 | * @cond bpmp_th500 |
3704 | * * Initiators: Any |
3705 | * * Targets: BPMP |
3706 | * * Request Payload: @ref mrq_pwr_limit_request |
3707 | * * Response Payload: @ref mrq_pwr_limit_response |
3708 | * |
3709 | * @addtogroup Pwrlimit |
3710 | * @{ |
3711 | */ |
3712 | enum mrq_pwr_limit_cmd { |
3713 | /** |
3714 | * @brief Check whether the BPMP-FW supports the specified |
3715 | * command |
3716 | * |
3717 | * mrq_response::err is 0 if the specified request is |
3718 | * supported and -#BPMP_ENODEV otherwise. |
3719 | */ |
3720 | CMD_PWR_LIMIT_QUERY_ABI = 0, |
3721 | |
3722 | /** |
3723 | * @brief Set power limit |
3724 | * |
3725 | * mrq_response:err is |
3726 | * * 0: Success |
3727 | * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW |
3728 | * * -#BPMP_ENAVAIL: Invalid request parameters |
3729 | * * -#BPMP_EACCES: Request is not accepted |
3730 | */ |
3731 | CMD_PWR_LIMIT_SET = 1, |
3732 | |
3733 | /** |
3734 | * @brief Get power limit setting |
3735 | * |
3736 | * mrq_response:err is |
3737 | * * 0: Success |
3738 | * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW |
3739 | * * -#BPMP_ENAVAIL: Invalid request parameters |
3740 | */ |
3741 | CMD_PWR_LIMIT_GET = 2, |
3742 | |
3743 | /** |
3744 | * @brief Get current power cap |
3745 | * |
3746 | * mrq_response:err is |
3747 | * * 0: Success |
3748 | * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW |
3749 | * * -#BPMP_ENAVAIL: Invalid request parameters |
3750 | */ |
3751 | CMD_PWR_LIMIT_CURR_CAP = 3, |
3752 | }; |
3753 | |
3754 | /** |
3755 | * @defgroup bpmp_pwr_limit_type PWR_LIMIT TYPEs |
3756 | * @{ |
3757 | */ |
3758 | /** @brief Limit value specifies traget cap */ |
3759 | #define PWR_LIMIT_TYPE_TARGET_CAP 0U |
3760 | /** @brief Limit value specifies maximum possible target cap */ |
3761 | #define PWR_LIMIT_TYPE_BOUND_MAX 1U |
3762 | /** @brief Limit value specifies minimum possible target cap */ |
3763 | #define PWR_LIMIT_TYPE_BOUND_MIN 2U |
3764 | /** @brief Number of limit types supported by mrq interface */ |
3765 | #define PWR_LIMIT_TYPE_NUM 3U |
3766 | |
3767 | /** @} bpmp_pwr_limit_type */ |
3768 | |
3769 | /** |
3770 | * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_QUERY_ABI |
3771 | */ |
3772 | struct cmd_pwr_limit_query_abi_request { |
3773 | uint32_t cmd_code; /**< @ref mrq_pwr_limit_cmd */ |
3774 | } BPMP_ABI_PACKED; |
3775 | |
3776 | /** |
3777 | * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_SET |
3778 | * |
3779 | * Set specified limit of specified type from specified source. The success of |
3780 | * the request means that specified value is accepted as input to arbitration |
3781 | * with other sources settings for the same limit of the same type. Zero limit |
3782 | * is ignored by the arbitration (i.e., indicates "no limit set"). |
3783 | */ |
3784 | struct cmd_pwr_limit_set_request { |
3785 | uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */ |
3786 | uint32_t limit_src; /**< @ref bpmp_pwr_limit_src */ |
3787 | uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */ |
3788 | uint32_t limit_setting; |
3789 | } BPMP_ABI_PACKED; |
3790 | |
3791 | /** |
3792 | * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET |
3793 | * |
3794 | * Get previously set from specified source specified limit value of specified |
3795 | * type. |
3796 | */ |
3797 | struct cmd_pwr_limit_get_request { |
3798 | uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */ |
3799 | uint32_t limit_src; /**< @ref bpmp_pwr_limit_src */ |
3800 | uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */ |
3801 | } BPMP_ABI_PACKED; |
3802 | |
3803 | /** |
3804 | * @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET |
3805 | */ |
3806 | struct cmd_pwr_limit_get_response { |
3807 | uint32_t limit_setting; |
3808 | } BPMP_ABI_PACKED; |
3809 | |
3810 | /** |
3811 | * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP |
3812 | * |
3813 | * For specified limit get current power cap aggregated from all sources. |
3814 | */ |
3815 | struct cmd_pwr_limit_curr_cap_request { |
3816 | uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */ |
3817 | } BPMP_ABI_PACKED; |
3818 | |
3819 | /** |
3820 | * @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP |
3821 | */ |
3822 | struct cmd_pwr_limit_curr_cap_response { |
3823 | uint32_t curr_cap; |
3824 | } BPMP_ABI_PACKED; |
3825 | |
3826 | /** |
3827 | * @brief Request with #MRQ_PWR_LIMIT |
3828 | * |
3829 | * |sub-command |payload | |
3830 | * |----------------------------|---------------------------------| |
3831 | * |CMD_PWR_LIMIT_QUERY_ABI | cmd_pwr_limit_query_abi_request | |
3832 | * |CMD_PWR_LIMIT_SET | cmd_pwr_limit_set_request | |
3833 | * |CMD_PWR_LIMIT_GET | cmd_pwr_limit_get_request | |
3834 | * |CMD_PWR_LIMIT_CURR_CAP | cmd_pwr_limit_curr_cap_request | |
3835 | */ |
3836 | struct mrq_pwr_limit_request { |
3837 | uint32_t cmd; |
3838 | union { |
3839 | struct cmd_pwr_limit_query_abi_request pwr_limit_query_abi_req; |
3840 | struct cmd_pwr_limit_set_request pwr_limit_set_req; |
3841 | struct cmd_pwr_limit_get_request pwr_limit_get_req; |
3842 | struct cmd_pwr_limit_curr_cap_request pwr_limit_curr_cap_req; |
3843 | } BPMP_UNION_ANON; |
3844 | } BPMP_ABI_PACKED; |
3845 | |
3846 | /** |
3847 | * @brief Response to MRQ_PWR_LIMIT |
3848 | * |
3849 | * |sub-command |payload | |
3850 | * |----------------------------|---------------------------------| |
3851 | * |CMD_PWR_LIMIT_QUERY_ABI | - | |
3852 | * |CMD_PWR_LIMIT_SET | - | |
3853 | * |CMD_PWR_LIMIT_GET | cmd_pwr_limit_get_response | |
3854 | * |CMD_PWR_LIMIT_CURR_CAP | cmd_pwr_limit_curr_cap_response | |
3855 | */ |
3856 | struct mrq_pwr_limit_response { |
3857 | union { |
3858 | struct cmd_pwr_limit_get_response pwr_limit_get_rsp; |
3859 | struct cmd_pwr_limit_curr_cap_response pwr_limit_curr_cap_rsp; |
3860 | } BPMP_UNION_ANON; |
3861 | } BPMP_ABI_PACKED; |
3862 | |
3863 | /** @} PwrLimit */ |
3864 | /** @endcond bpmp_th500 */ |
3865 | |
3866 | |
3867 | /** |
3868 | * @ingroup MRQ_Codes |
3869 | * @def MRQ_GEARS |
3870 | * @brief Get thresholds for NDIV offset switching |
3871 | * |
3872 | * * Platforms: TH500 onwards |
3873 | * @cond bpmp_th500 |
3874 | * * Initiators: CCPLEX |
3875 | * * Targets: BPMP |
3876 | * * Request Payload: N/A |
3877 | * * Response Payload: @ref mrq_gears_response |
3878 | * @addtogroup Gears |
3879 | * @{ |
3880 | */ |
3881 | |
3882 | /** |
3883 | * @brief Response to #MRQ_GEARS |
3884 | * |
3885 | * Used by the sender of an #MRQ_GEARS message to request thresholds |
3886 | * for NDIV offset switching. |
3887 | * |
3888 | * The mrq_gears_response::ncpu array defines four thresholds in units |
3889 | * of number of online CPUS to be used for choosing between five different |
3890 | * NDIV offset settings for CCPLEX cluster NAFLLs |
3891 | * |
3892 | * 1. If number of online CPUs < ncpu[0] use offset0 |
3893 | * 2. If number of online CPUs < ncpu[1] use offset1 |
3894 | * 3. If number of online CPUs < ncpu[2] use offset2 |
3895 | * 4. If number of online CPUs < ncpu[3] use offset3 |
3896 | * 5. If number of online CPUs >= ncpu[3] disable offsetting |
3897 | * |
3898 | * For TH500 mrq_gears_response::ncpu array has four valid entries. |
3899 | * |
3900 | * mrq_response::err is |
3901 | * * 0: gears defined and response data valid |
3902 | * * -#BPMP_ENODEV: MRQ is not supported by BPMP-FW |
3903 | * * -#BPMP_EACCES: Operation not permitted for the MRQ master |
3904 | * * -#BPMP_ENAVAIL: NDIV offsetting is disabled |
3905 | */ |
3906 | struct mrq_gears_response { |
3907 | /** @brief number of online CPUs for each gear */ |
3908 | uint32_t ncpu[16]; |
3909 | } BPMP_ABI_PACKED; |
3910 | |
3911 | /** @} Gears */ |
3912 | /** @endcond bpmp_th500 */ |
3913 | |
3914 | /** |
3915 | * @addtogroup Error_Codes |
3916 | * Negative values for mrq_response::err generally indicate some |
3917 | * error. The ABI defines the following error codes. Negating these |
3918 | * defines is an exercise left to the user. |
3919 | * @{ |
3920 | */ |
3921 | |
3922 | /** @brief Operation not permitted */ |
3923 | #define BPMP_EPERM 1 |
3924 | /** @brief No such file or directory */ |
3925 | #define BPMP_ENOENT 2 |
3926 | /** @brief No MRQ handler */ |
3927 | #define BPMP_ENOHANDLER 3 |
3928 | /** @brief I/O error */ |
3929 | #define BPMP_EIO 5 |
3930 | /** @brief Bad sub-MRQ command */ |
3931 | #define BPMP_EBADCMD 6 |
3932 | /** @brief Resource temporarily unavailable */ |
3933 | #define BPMP_EAGAIN 11 |
3934 | /** @brief Not enough memory */ |
3935 | #define BPMP_ENOMEM 12 |
3936 | /** @brief Permission denied */ |
3937 | #define BPMP_EACCES 13 |
3938 | /** @brief Bad address */ |
3939 | #define BPMP_EFAULT 14 |
3940 | /** @brief Resource busy */ |
3941 | #define BPMP_EBUSY 16 |
3942 | /** @brief No such device */ |
3943 | #define BPMP_ENODEV 19 |
3944 | /** @brief Argument is a directory */ |
3945 | #define BPMP_EISDIR 21 |
3946 | /** @brief Invalid argument */ |
3947 | #define BPMP_EINVAL 22 |
3948 | /** @brief Timeout during operation */ |
3949 | #define BPMP_ETIMEDOUT 23 |
3950 | /** @brief Out of range */ |
3951 | #define BPMP_ERANGE 34 |
3952 | /** @brief Function not implemented */ |
3953 | #define BPMP_ENOSYS 38 |
3954 | /** @brief Invalid slot */ |
3955 | #define BPMP_EBADSLT 57 |
3956 | /** @brief Invalid message */ |
3957 | #define BPMP_EBADMSG 77 |
3958 | /** @brief Operation not supported */ |
3959 | #define BPMP_EOPNOTSUPP 95 |
3960 | /** @brief Targeted resource not available */ |
3961 | #define BPMP_ENAVAIL 119 |
3962 | /** @brief Not supported */ |
3963 | #define BPMP_ENOTSUP 134 |
3964 | /** @brief No such device or address */ |
3965 | #define BPMP_ENXIO 140 |
3966 | |
3967 | /** @} Error_Codes */ |
3968 | |
3969 | #if defined(BPMP_ABI_CHECKS) |
3970 | #include "bpmp_abi_checks.h" |
3971 | #endif |
3972 | |
3973 | #endif |
3974 | |