xref: /linux/include/soc/tegra/bpmp-abi.h (revision 2da68a77)
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 succesfully
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