1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2014-2018, NVIDIA CORPORATION.  All rights reserved.
4  */
5 
6 #ifndef _ABI_BPMP_ABI_H_
7 #define _ABI_BPMP_ABI_H_
8 
9 #ifdef LK
10 #include <stdint.h>
11 #endif
12 
13 #ifndef __ABI_PACKED
14 #define __ABI_PACKED __attribute__((packed))
15 #endif
16 
17 #ifdef NO_GCC_EXTENSIONS
18 #define EMPTY char empty;
19 #define EMPTY_ARRAY 1
20 #else
21 #define EMPTY
22 #define EMPTY_ARRAY 0
23 #endif
24 
25 #ifndef __UNION_ANON
26 #define __UNION_ANON
27 #endif
28 /**
29  * @file
30  */
31 
32 /**
33  * @defgroup MRQ MRQ Messages
34  * @brief Messages sent to/from BPMP via IPC
35  * @{
36  *   @defgroup MRQ_Format Message Format
37  *   @defgroup MRQ_Codes Message Request (MRQ) Codes
38  *   @defgroup MRQ_Payloads Message Payloads
39  *   @defgroup Error_Codes Error Codes
40  * @}
41  */
42 
43 /**
44  * @addtogroup MRQ_Format
45  * @{
46  * The CPU requests the BPMP to perform a particular service by
47  * sending it an IVC frame containing a single MRQ message. An MRQ
48  * message consists of a @ref mrq_request followed by a payload whose
49  * format depends on mrq_request::mrq.
50  *
51  * The BPMP processes the data and replies with an IVC frame (on the
52  * same IVC channel) containing and MRQ response. An MRQ response
53  * consists of a @ref mrq_response followed by a payload whose format
54  * depends on the associated mrq_request::mrq.
55  *
56  * A well-defined subset of the MRQ messages that the CPU sends to the
57  * BPMP can lead to BPMP eventually sending an MRQ message to the
58  * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
59  * a thermal trip point, the BPMP may eventually send a single
60  * #MRQ_THERMAL message of its own to the CPU indicating that the trip
61  * point has been crossed.
62  * @}
63  */
64 
65 /**
66  * @ingroup MRQ_Format
67  * @brief Header for an MRQ message
68  *
69  * Provides the MRQ number for the MRQ message: #mrq. The remainder of
70  * the MRQ message is a payload (immediately following the
71  * mrq_request) whose format depends on mrq.
72  */
73 struct mrq_request {
74 	/** @brief MRQ number of the request */
75 	uint32_t mrq;
76 	/**
77 	 * @brief Flags providing follow up directions to the receiver
78 	 *
79 	 * | Bit | Description                                |
80 	 * |-----|--------------------------------------------|
81 	 * | 1   | ring the sender's doorbell when responding |
82 	 * | 0   | should be 1                                |
83 	 */
84 	uint32_t flags;
85 } __ABI_PACKED;
86 
87 /**
88  * @ingroup MRQ_Format
89  * @brief Header for an MRQ response
90  *
91  *  Provides an error code for the associated MRQ message. The
92  *  remainder of the MRQ response is a payload (immediately following
93  *  the mrq_response) whose format depends on the associated
94  *  mrq_request::mrq
95  */
96 struct mrq_response {
97 	/** @brief Error code for the MRQ request itself */
98 	int32_t err;
99 	/** @brief Reserved for future use */
100 	uint32_t flags;
101 } __ABI_PACKED;
102 
103 /**
104  * @ingroup MRQ_Format
105  * Minimum needed size for an IPC message buffer
106  */
107 #define MSG_MIN_SZ	128
108 /**
109  * @ingroup MRQ_Format
110  *  Minimum size guaranteed for data in an IPC message buffer
111  */
112 #define MSG_DATA_MIN_SZ	120
113 
114 /**
115  * @ingroup MRQ_Codes
116  * @name Legal MRQ codes
117  * These are the legal values for mrq_request::mrq
118  * @{
119  */
120 
121 #define MRQ_PING		0
122 #define MRQ_QUERY_TAG		1
123 #define MRQ_MODULE_LOAD		4
124 #define MRQ_MODULE_UNLOAD	5
125 #define MRQ_TRACE_MODIFY	7
126 #define MRQ_WRITE_TRACE		8
127 #define MRQ_THREADED_PING	9
128 #define MRQ_MODULE_MAIL		11
129 #define MRQ_DEBUGFS		19
130 #define MRQ_RESET		20
131 #define MRQ_I2C			21
132 #define MRQ_CLK			22
133 #define MRQ_QUERY_ABI		23
134 #define MRQ_PG_READ_STATE	25
135 #define MRQ_PG_UPDATE_STATE	26
136 #define MRQ_THERMAL		27
137 #define MRQ_CPU_VHINT		28
138 #define MRQ_ABI_RATCHET		29
139 #define MRQ_EMC_DVFS_LATENCY	31
140 #define MRQ_TRACE_ITER		64
141 #define MRQ_RINGBUF_CONSOLE	65
142 #define MRQ_PG			66
143 #define MRQ_CPU_NDIV_LIMITS	67
144 #define MRQ_STRAP               68
145 #define MRQ_UPHY		69
146 #define MRQ_CPU_AUTO_CC3	70
147 #define MRQ_QUERY_FW_TAG	71
148 #define MRQ_FMON		72
149 #define MRQ_EC			73
150 #define MRQ_FBVOLT_STATUS	74
151 
152 /** @} */
153 
154 /**
155  * @ingroup MRQ_Codes
156  * @brief Maximum MRQ code to be sent by CPU software to
157  * BPMP. Subject to change in future
158  */
159 #define MAX_CPU_MRQ_ID		74
160 
161 /**
162  * @addtogroup MRQ_Payloads
163  * @{
164  *   @defgroup Ping Ping
165  *   @defgroup Query_Tag Query Tag
166  *   @defgroup Module Loadable Modules
167  *   @defgroup Trace Trace
168  *   @defgroup Debugfs Debug File System
169  *   @defgroup Reset Reset
170  *   @defgroup I2C I2C
171  *   @defgroup Clocks Clocks
172  *   @defgroup ABI_info ABI Info
173  *   @defgroup Powergating Power Gating
174  *   @defgroup Thermal Thermal
175  *   @defgroup Vhint CPU Voltage hint
176  *   @defgroup EMC EMC
177  *   @defgroup CPU NDIV Limits
178  *   @defgroup RingbufConsole Ring Buffer Console
179  *   @defgroup Strap Straps
180  *   @defgroup UPHY UPHY
181  *   @defgroup CC3 Auto-CC3
182  *   @defgroup FMON FMON
183  *   @defgroup EC EC
184  *   @defgroup Fbvolt_status Fuse Burn Voltage Status
185  * @}
186  */
187 
188 /**
189  * @ingroup MRQ_Codes
190  * @def MRQ_PING
191  * @brief A simple ping
192  *
193  * * Platforms: All
194  * * Initiators: Any
195  * * Targets: Any
196  * * Request Payload: @ref mrq_ping_request
197  * * Response Payload: @ref mrq_ping_response
198  *
199  * @ingroup MRQ_Codes
200  * @def MRQ_THREADED_PING
201  * @brief A deeper ping
202  *
203  * * Platforms: All
204  * * Initiators: Any
205  * * Targets: BPMP
206  * * Request Payload: @ref mrq_ping_request
207  * * Response Payload: @ref mrq_ping_response
208  *
209  * Behavior is equivalent to a simple #MRQ_PING except that BPMP
210  * responds from a thread context (providing a slightly more robust
211  * sign of life).
212  *
213  */
214 
215 /**
216  * @ingroup Ping
217  * @brief Request with #MRQ_PING
218  *
219  * Used by the sender of an #MRQ_PING message to request a pong from
220  * recipient. The response from the recipient is computed based on
221  * #challenge.
222  */
223 struct mrq_ping_request {
224 /** @brief Arbitrarily chosen value */
225 	uint32_t challenge;
226 } __ABI_PACKED;
227 
228 /**
229  * @ingroup Ping
230  * @brief Response to #MRQ_PING
231  *
232  * Sent in response to an #MRQ_PING message. #reply should be the
233  * mrq_ping_request challenge left shifted by 1 with the carry-bit
234  * dropped.
235  *
236  */
237 struct mrq_ping_response {
238 	/** @brief Response to the MRQ_PING challege */
239 	uint32_t reply;
240 } __ABI_PACKED;
241 
242 /**
243  * @ingroup MRQ_Codes
244  * @def MRQ_QUERY_TAG
245  * @brief Query BPMP firmware's tag (i.e. unique identifer)
246  *
247  * @deprecated Use #MRQ_QUERY_FW_TAG instead.
248  *
249  * * Platforms: All
250  * * Initiators: CCPLEX
251  * * Targets: BPMP
252  * * Request Payload: @ref mrq_query_tag_request
253  * * Response Payload: N/A
254  *
255  */
256 
257 /**
258  * @ingroup Query_Tag
259  * @brief Request with #MRQ_QUERY_TAG
260  *
261  * @deprecated This structure will be removed in future version.
262  * Use MRQ_QUERY_FW_TAG instead.
263  */
264 struct mrq_query_tag_request {
265   /** @brief Base address to store the firmware tag */
266 	uint32_t addr;
267 } __ABI_PACKED;
268 
269 
270 /**
271  * @ingroup MRQ_Codes
272  * @def MRQ_QUERY_FW_TAG
273  * @brief Query BPMP firmware's tag (i.e. unique identifier)
274  *
275  * * Platforms: All
276  * * Initiators: Any
277  * * Targets: BPMP
278  * * Request Payload: N/A
279  * * Response Payload: @ref mrq_query_fw_tag_response
280  *
281  */
282 
283 /**
284  * @ingroup Query_Tag
285  * @brief Response to #MRQ_QUERY_FW_TAG
286  *
287  * Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique
288  * identifier for the version of firmware issuing the reply.
289  *
290  */
291 struct mrq_query_fw_tag_response {
292   /** @brief Array to store tag information */
293 	uint8_t tag[32];
294 } __ABI_PACKED;
295 
296 /**
297  * @ingroup MRQ_Codes
298  * @def MRQ_MODULE_LOAD
299  * @brief Dynamically load a BPMP code module
300  *
301  * * Platforms: T210, T214, T186
302  * @cond (bpmp_t210 || bpmp_t214 || bpmp_t186)
303  * * Initiators: CCPLEX
304  * * Targets: BPMP
305  * * Request Payload: @ref mrq_module_load_request
306  * * Response Payload: @ref mrq_module_load_response
307  *
308  * @note This MRQ is disabled on production systems
309  *
310  */
311 
312 /**
313  * @ingroup Module
314  * @brief Request with #MRQ_MODULE_LOAD
315  *
316  * Used by #MRQ_MODULE_LOAD calls to ask the recipient to dynamically
317  * load the code located at #phys_addr and having size #size
318  * bytes. #phys_addr is treated as a void pointer.
319  *
320  * The recipient copies the code from #phys_addr to locally allocated
321  * memory prior to responding to this message.
322  *
323  * @todo document the module header format
324  *
325  * The sender is responsible for ensuring that the code is mapped in
326  * the recipient's address map.
327  *
328  */
329 struct mrq_module_load_request {
330 	/** @brief Base address of the code to load. Treated as (void *) */
331 	uint32_t phys_addr; /* (void *) */
332 	/** @brief Size in bytes of code to load */
333 	uint32_t size;
334 } __ABI_PACKED;
335 
336 /**
337  * @ingroup Module
338  * @brief Response to #MRQ_MODULE_LOAD
339  *
340  * @todo document mrq_response::err
341  */
342 struct mrq_module_load_response {
343 	/** @brief Handle to the loaded module */
344 	uint32_t base;
345 } __ABI_PACKED;
346 /** @endcond*/
347 
348 /**
349  * @ingroup MRQ_Codes
350  * @def MRQ_MODULE_UNLOAD
351  * @brief Unload a previously loaded code module
352  *
353  * * Platforms: T210, T214, T186
354  * @cond (bpmp_t210 || bpmp_t214 || bpmp_t186)
355  * * Initiators: CCPLEX
356  * * Targets: BPMP
357  * * Request Payload: @ref mrq_module_unload_request
358  * * Response Payload: N/A
359  *
360  * @note This MRQ is disabled on production systems
361  */
362 
363 /**
364  * @ingroup Module
365  * @brief Request with #MRQ_MODULE_UNLOAD
366  *
367  * Used by #MRQ_MODULE_UNLOAD calls to request that a previously loaded
368  * module be unloaded.
369  */
370 struct mrq_module_unload_request {
371 	/** @brief Handle of the module to unload */
372 	uint32_t base;
373 } __ABI_PACKED;
374 /** @endcond*/
375 
376 /**
377  * @ingroup MRQ_Codes
378  * @def MRQ_TRACE_MODIFY
379  * @brief Modify the set of enabled trace events
380  *
381  * * Platforms: All
382  * * Initiators: CCPLEX
383  * * Targets: BPMP
384  * * Request Payload: @ref mrq_trace_modify_request
385  * * Response Payload: @ref mrq_trace_modify_response
386  *
387  * @note This MRQ is disabled on production systems
388  */
389 
390 /**
391  * @ingroup Trace
392  * @brief Request with #MRQ_TRACE_MODIFY
393  *
394  * Used by %MRQ_TRACE_MODIFY calls to enable or disable specify trace
395  * events.  #set takes precedence for any bit set in both #set and
396  * #clr.
397  */
398 struct mrq_trace_modify_request {
399 	/** @brief Bit mask of trace events to disable */
400 	uint32_t clr;
401 	/** @brief Bit mask of trace events to enable */
402 	uint32_t set;
403 } __ABI_PACKED;
404 
405 /**
406  * @ingroup Trace
407  * @brief Response to #MRQ_TRACE_MODIFY
408  *
409  * Sent in repsonse to an #MRQ_TRACE_MODIFY message. #mask reflects the
410  * state of which events are enabled after the recipient acted on the
411  * message.
412  *
413  */
414 struct mrq_trace_modify_response {
415 	/** @brief Bit mask of trace event enable states */
416 	uint32_t mask;
417 } __ABI_PACKED;
418 
419 /**
420  * @ingroup MRQ_Codes
421  * @def MRQ_WRITE_TRACE
422  * @brief Write trace data to a buffer
423  *
424  * * Platforms: All
425  * * Initiators: CCPLEX
426  * * Targets: BPMP
427  * * Request Payload: @ref mrq_write_trace_request
428  * * Response Payload: @ref mrq_write_trace_response
429  *
430  * mrq_response::err depends on the @ref mrq_write_trace_request field
431  * values. err is -#BPMP_EINVAL if size is zero or area is NULL or
432  * area is in an illegal range. A positive value for err indicates the
433  * number of bytes written to area.
434  *
435  * @note This MRQ is disabled on production systems
436  */
437 
438 /**
439  * @ingroup Trace
440  * @brief Request with #MRQ_WRITE_TRACE
441  *
442  * Used by MRQ_WRITE_TRACE calls to ask the recipient to copy trace
443  * data from the recipient's local buffer to the output buffer. #area
444  * is treated as a byte-aligned pointer in the recipient's address
445  * space.
446  *
447  * The sender is responsible for ensuring that the output
448  * buffer is mapped in the recipient's address map. The recipient is
449  * responsible for protecting its own code and data from accidental
450  * overwrites.
451  */
452 struct mrq_write_trace_request {
453 	/** @brief Base address of output buffer */
454 	uint32_t area;
455 	/** @brief Size in bytes of the output buffer */
456 	uint32_t size;
457 } __ABI_PACKED;
458 
459 /**
460  * @ingroup Trace
461  * @brief Response to #MRQ_WRITE_TRACE
462  *
463  * Once this response is sent, the respondent will not access the
464  * output buffer further.
465  */
466 struct mrq_write_trace_response {
467 	/**
468 	 * @brief Flag whether more data remains in local buffer
469 	 *
470 	 * Value is 1 if the entire local trace buffer has been
471 	 * drained to the outputbuffer. Value is 0 otherwise.
472 	 */
473 	uint32_t eof;
474 } __ABI_PACKED;
475 
476 /** @private */
477 struct mrq_threaded_ping_request {
478 	uint32_t challenge;
479 } __ABI_PACKED;
480 
481 /** @private */
482 struct mrq_threaded_ping_response {
483 	uint32_t reply;
484 } __ABI_PACKED;
485 
486 /**
487  * @ingroup MRQ_Codes
488  * @def MRQ_MODULE_MAIL
489  * @brief Send a message to a loadable module
490  *
491  * * Platforms: T210, T214, T186
492  * @cond (bpmp_t210 || bpmp_t214 || bpmp_t186)
493  * * Initiators: Any
494  * * Targets: BPMP
495  * * Request Payload: @ref mrq_module_mail_request
496  * * Response Payload: @ref mrq_module_mail_response
497  *
498  * @note This MRQ is disabled on production systems
499  */
500 
501 /**
502  * @ingroup Module
503  * @brief Request with #MRQ_MODULE_MAIL
504  */
505 struct mrq_module_mail_request {
506 	/** @brief Handle to the previously loaded module */
507 	uint32_t base;
508 	/** @brief Module-specific mail payload
509 	 *
510 	 * The length of data[ ] is unknown to the BPMP core firmware
511 	 * but it is limited to the size of an IPC message.
512 	 */
513 	uint8_t data[EMPTY_ARRAY];
514 } __ABI_PACKED;
515 
516 /**
517  * @ingroup Module
518  * @brief Response to #MRQ_MODULE_MAIL
519  */
520 struct mrq_module_mail_response {
521 	/** @brief Module-specific mail payload
522 	 *
523 	 * The length of data[ ] is unknown to the BPMP core firmware
524 	 * but it is limited to the size of an IPC message.
525 	 */
526 	uint8_t data[EMPTY_ARRAY];
527 } __ABI_PACKED;
528 /** @endcond */
529 
530 /**
531  * @ingroup MRQ_Codes
532  * @def MRQ_DEBUGFS
533  * @brief Interact with BPMP's debugfs file nodes
534  *
535  * * Platforms: T186, T194
536  * * Initiators: Any
537  * * Targets: BPMP
538  * * Request Payload: @ref mrq_debugfs_request
539  * * Response Payload: @ref mrq_debugfs_response
540  */
541 
542 /**
543  * @addtogroup Debugfs
544  * @{
545  *
546  * The BPMP firmware implements a pseudo-filesystem called
547  * debugfs. Any driver within the firmware may register with debugfs
548  * to expose an arbitrary set of "files" in the filesystem. When
549  * software on the CPU writes to a debugfs file, debugfs passes the
550  * written data to a callback provided by the driver. When software on
551  * the CPU reads a debugfs file, debugfs queries the driver for the
552  * data to return to the CPU. The intention of the debugfs filesystem
553  * is to provide information useful for debugging the system at
554  * runtime.
555  *
556  * @note The files exposed via debugfs are not part of the
557  * BPMP firmware's ABI. debugfs files may be added or removed in any
558  * given version of the firmware. Typically the semantics of a debugfs
559  * file are consistent from version to version but even that is not
560  * guaranteed.
561  *
562  * @}
563  */
564 
565 /** @ingroup Debugfs */
566 enum mrq_debugfs_commands {
567 	/** @brief Perform read */
568 	CMD_DEBUGFS_READ = 1,
569 	/** @brief Perform write */
570 	CMD_DEBUGFS_WRITE = 2,
571 	/** @brief Perform dumping directory */
572 	CMD_DEBUGFS_DUMPDIR = 3,
573 	/** @brief Not a command */
574 	CMD_DEBUGFS_MAX
575 };
576 
577 /**
578  * @ingroup Debugfs
579  * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
580  */
581 struct cmd_debugfs_fileop_request {
582 	/** @brief Physical address pointing at filename */
583 	uint32_t fnameaddr;
584 	/** @brief Length in bytes of filename buffer */
585 	uint32_t fnamelen;
586 	/** @brief Physical address pointing to data buffer */
587 	uint32_t dataaddr;
588 	/** @brief Length in bytes of data buffer */
589 	uint32_t datalen;
590 } __ABI_PACKED;
591 
592 /**
593  * @ingroup Debugfs
594  * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
595  */
596 struct cmd_debugfs_dumpdir_request {
597 	/** @brief Physical address pointing to data buffer */
598 	uint32_t dataaddr;
599 	/** @brief Length in bytes of data buffer */
600 	uint32_t datalen;
601 } __ABI_PACKED;
602 
603 /**
604  * @ingroup Debugfs
605  * @brief Response data for CMD_DEBUGFS_READ/WRITE command
606  */
607 struct cmd_debugfs_fileop_response {
608 	/** @brief Always 0 */
609 	uint32_t reserved;
610 	/** @brief Number of bytes read from or written to data buffer */
611 	uint32_t nbytes;
612 } __ABI_PACKED;
613 
614 /**
615  * @ingroup Debugfs
616  * @brief Response data for CMD_DEBUGFS_DUMPDIR command
617  */
618 struct cmd_debugfs_dumpdir_response {
619 	/** @brief Always 0 */
620 	uint32_t reserved;
621 	/** @brief Number of bytes read from or written to data buffer */
622 	uint32_t nbytes;
623 } __ABI_PACKED;
624 
625 /**
626  * @ingroup Debugfs
627  * @brief Request with #MRQ_DEBUGFS.
628  *
629  * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
630  * command to execute. Legal commands are the values of @ref
631  * mrq_debugfs_commands. Each command requires a specific additional
632  * payload of data.
633  *
634  * |command            |payload|
635  * |-------------------|-------|
636  * |CMD_DEBUGFS_READ   |fop    |
637  * |CMD_DEBUGFS_WRITE  |fop    |
638  * |CMD_DEBUGFS_DUMPDIR|dumpdir|
639  */
640 struct mrq_debugfs_request {
641 	/** @brief Sub-command (@ref mrq_debugfs_commands) */
642 	uint32_t cmd;
643 	union {
644 		struct cmd_debugfs_fileop_request fop;
645 		struct cmd_debugfs_dumpdir_request dumpdir;
646 	} __UNION_ANON;
647 } __ABI_PACKED;
648 
649 /**
650  * @ingroup Debugfs
651  */
652 struct mrq_debugfs_response {
653 	/** @brief Always 0 */
654 	int32_t reserved;
655 	union {
656 		/** @brief Response data for CMD_DEBUGFS_READ OR
657 		 * CMD_DEBUGFS_WRITE command
658 		 */
659 		struct cmd_debugfs_fileop_response fop;
660 		/** @brief Response data for CMD_DEBUGFS_DUMPDIR command */
661 		struct cmd_debugfs_dumpdir_response dumpdir;
662 	} __UNION_ANON;
663 } __ABI_PACKED;
664 
665 /**
666  * @addtogroup Debugfs
667  * @{
668  */
669 #define DEBUGFS_S_ISDIR	(1 << 9)
670 #define DEBUGFS_S_IRUSR	(1 << 8)
671 #define DEBUGFS_S_IWUSR	(1 << 7)
672 /** @} */
673 
674 /**
675  * @ingroup MRQ_Codes
676  * @def MRQ_RESET
677  * @brief Reset an IP block
678  *
679  * * Platforms: T186, T194
680  * * Initiators: Any
681  * * Targets: BPMP
682  * * Request Payload: @ref mrq_reset_request
683  * * Response Payload: @ref mrq_reset_response
684  *
685  * @addtogroup Reset
686  * @{
687  */
688 
689 enum mrq_reset_commands {
690 	/** @brief Assert module reset */
691 	CMD_RESET_ASSERT = 1,
692 	/** @brief Deassert module reset */
693 	CMD_RESET_DEASSERT = 2,
694 	/** @brief Assert and deassert the module reset */
695 	CMD_RESET_MODULE = 3,
696 	/** @brief Get the highest reset ID */
697 	CMD_RESET_GET_MAX_ID = 4,
698 	/** @brief Not part of ABI and subject to change */
699 	CMD_RESET_MAX,
700 };
701 
702 /**
703  * @brief Request with MRQ_RESET
704  *
705  * Used by the sender of an #MRQ_RESET message to request BPMP to
706  * assert or or deassert a given reset line.
707  */
708 struct mrq_reset_request {
709 	/** @brief Reset action to perform (@ref mrq_reset_commands) */
710 	uint32_t cmd;
711 	/** @brief Id of the reset to affected */
712 	uint32_t reset_id;
713 } __ABI_PACKED;
714 
715 /**
716  * @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When
717  * this sub-command is not supported, firmware will return -BPMP_EBADCMD
718  * in mrq_response::err.
719  */
720 struct cmd_reset_get_max_id_response {
721 	/** @brief Max reset id */
722 	uint32_t max_id;
723 } __ABI_PACKED;
724 
725 /**
726  * @brief Response with MRQ_RESET
727  *
728  * Each sub-command supported by @ref mrq_reset_request may return
729  * sub-command-specific data. Some do and some do not as indicated
730  * in the following table
731  *
732  * | sub-command          | payload          |
733  * |----------------------|------------------|
734  * | CMD_RESET_ASSERT     | -                |
735  * | CMD_RESET_DEASSERT   | -                |
736  * | CMD_RESET_MODULE     | -                |
737  * | CMD_RESET_GET_MAX_ID | reset_get_max_id |
738  */
739 struct mrq_reset_response {
740 	union {
741 		struct cmd_reset_get_max_id_response reset_get_max_id;
742 	} __UNION_ANON;
743 } __ABI_PACKED;
744 
745 /** @} */
746 
747 /**
748  * @ingroup MRQ_Codes
749  * @def MRQ_I2C
750  * @brief Issue an i2c transaction
751  *
752  * * Platforms: T186, T194
753  * * Initiators: Any
754  * * Targets: BPMP
755  * * Request Payload: @ref mrq_i2c_request
756  * * Response Payload: @ref mrq_i2c_response
757  *
758  * @addtogroup I2C
759  * @{
760  */
761 #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE	(MSG_DATA_MIN_SZ - 12)
762 #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE	(MSG_DATA_MIN_SZ - 4)
763 
764 #define SERIALI2C_TEN           0x0010
765 #define SERIALI2C_RD            0x0001
766 #define SERIALI2C_STOP          0x8000
767 #define SERIALI2C_NOSTART       0x4000
768 #define SERIALI2C_REV_DIR_ADDR  0x2000
769 #define SERIALI2C_IGNORE_NAK    0x1000
770 #define SERIALI2C_NO_RD_ACK     0x0800
771 #define SERIALI2C_RECV_LEN      0x0400
772 
773 enum {
774 	CMD_I2C_XFER = 1
775 };
776 
777 /**
778  * @brief Serializable i2c request
779  *
780  * Instances of this structure are packed (little-endian) into
781  * cmd_i2c_xfer_request::data_buf. Each instance represents a single
782  * transaction (or a portion of a transaction with repeated starts) on
783  * an i2c bus.
784  *
785  * Because these structures are packed, some instances are likely to
786  * be misaligned. Additionally because #data is variable length, it is
787  * not possible to iterate through a serialized list of these
788  * structures without inspecting #len in each instance.  It may be
789  * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf
790  * manually rather than using this structure definition.
791 */
792 struct serial_i2c_request {
793 	/** @brief I2C slave address */
794 	uint16_t addr;
795 	/** @brief Bitmask of SERIALI2C_ flags */
796 	uint16_t flags;
797 	/** @brief Length of I2C transaction in bytes */
798 	uint16_t len;
799 	/** @brief For write transactions only, #len bytes of data */
800 	uint8_t data[];
801 } __ABI_PACKED;
802 
803 /**
804  * @brief Trigger one or more i2c transactions
805  */
806 struct cmd_i2c_xfer_request {
807 	/** @brief Valid bus number from @ref bpmp_i2c_ids*/
808 	uint32_t bus_id;
809 
810 	/** @brief Count of valid bytes in #data_buf*/
811 	uint32_t data_size;
812 
813 	/** @brief Serialized packed instances of @ref serial_i2c_request*/
814 	uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE];
815 } __ABI_PACKED;
816 
817 /**
818  * @brief Container for data read from the i2c bus
819  *
820  * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute
821  * zero or more I2C reads. The data read from the bus is serialized
822  * into #data_buf.
823  */
824 struct cmd_i2c_xfer_response {
825 	/** @brief Count of valid bytes in #data_buf*/
826 	uint32_t data_size;
827 	/** @brief I2c read data */
828 	uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE];
829 } __ABI_PACKED;
830 
831 /**
832  * @brief Request with #MRQ_I2C
833  */
834 struct mrq_i2c_request {
835 	/** @brief Always CMD_I2C_XFER (i.e. 1) */
836 	uint32_t cmd;
837 	/** @brief Parameters of the transfer request */
838 	struct cmd_i2c_xfer_request xfer;
839 } __ABI_PACKED;
840 
841 /**
842  * @brief Response to #MRQ_I2C
843  */
844 struct mrq_i2c_response {
845 	struct cmd_i2c_xfer_response xfer;
846 } __ABI_PACKED;
847 
848 /** @} */
849 
850 /**
851  * @ingroup MRQ_Codes
852  * @def MRQ_CLK
853  * @brief Perform a clock operation
854  *
855  * * Platforms: T186, T194
856  * * Initiators: Any
857  * * Targets: BPMP
858  * * Request Payload: @ref mrq_clk_request
859  * * Response Payload: @ref mrq_clk_response
860  *
861  * @addtogroup Clocks
862  * @{
863  */
864 enum {
865 	CMD_CLK_GET_RATE = 1,
866 	CMD_CLK_SET_RATE = 2,
867 	CMD_CLK_ROUND_RATE = 3,
868 	CMD_CLK_GET_PARENT = 4,
869 	CMD_CLK_SET_PARENT = 5,
870 	CMD_CLK_IS_ENABLED = 6,
871 	CMD_CLK_ENABLE = 7,
872 	CMD_CLK_DISABLE = 8,
873 	CMD_CLK_GET_ALL_INFO = 14,
874 	CMD_CLK_GET_MAX_CLK_ID = 15,
875 	CMD_CLK_GET_FMAX_AT_VMIN = 16,
876 	CMD_CLK_MAX,
877 };
878 
879 #define BPMP_CLK_HAS_MUX	(1 << 0)
880 #define BPMP_CLK_HAS_SET_RATE	(1 << 1)
881 #define BPMP_CLK_IS_ROOT	(1 << 2)
882 
883 #define MRQ_CLK_NAME_MAXLEN	40
884 #define MRQ_CLK_MAX_PARENTS	16
885 
886 /** @private */
887 struct cmd_clk_get_rate_request {
888 	EMPTY
889 } __ABI_PACKED;
890 
891 struct cmd_clk_get_rate_response {
892 	int64_t rate;
893 } __ABI_PACKED;
894 
895 struct cmd_clk_set_rate_request {
896 	int32_t unused;
897 	int64_t rate;
898 } __ABI_PACKED;
899 
900 struct cmd_clk_set_rate_response {
901 	int64_t rate;
902 } __ABI_PACKED;
903 
904 struct cmd_clk_round_rate_request {
905 	int32_t unused;
906 	int64_t rate;
907 } __ABI_PACKED;
908 
909 struct cmd_clk_round_rate_response {
910 	int64_t rate;
911 } __ABI_PACKED;
912 
913 /** @private */
914 struct cmd_clk_get_parent_request {
915 	EMPTY
916 } __ABI_PACKED;
917 
918 struct cmd_clk_get_parent_response {
919 	uint32_t parent_id;
920 } __ABI_PACKED;
921 
922 struct cmd_clk_set_parent_request {
923 	uint32_t parent_id;
924 } __ABI_PACKED;
925 
926 struct cmd_clk_set_parent_response {
927 	uint32_t parent_id;
928 } __ABI_PACKED;
929 
930 /** @private */
931 struct cmd_clk_is_enabled_request {
932 	EMPTY
933 } __ABI_PACKED;
934 
935 struct cmd_clk_is_enabled_response {
936 	int32_t state;
937 } __ABI_PACKED;
938 
939 /** @private */
940 struct cmd_clk_enable_request {
941 	EMPTY
942 } __ABI_PACKED;
943 
944 /** @private */
945 struct cmd_clk_enable_response {
946 	EMPTY
947 } __ABI_PACKED;
948 
949 /** @private */
950 struct cmd_clk_disable_request {
951 	EMPTY
952 } __ABI_PACKED;
953 
954 /** @private */
955 struct cmd_clk_disable_response {
956 	EMPTY
957 } __ABI_PACKED;
958 
959 /** @private */
960 struct cmd_clk_get_all_info_request {
961 	EMPTY
962 } __ABI_PACKED;
963 
964 struct cmd_clk_get_all_info_response {
965 	uint32_t flags;
966 	uint32_t parent;
967 	uint32_t parents[MRQ_CLK_MAX_PARENTS];
968 	uint8_t num_parents;
969 	uint8_t name[MRQ_CLK_NAME_MAXLEN];
970 } __ABI_PACKED;
971 
972 /** @private */
973 struct cmd_clk_get_max_clk_id_request {
974 	EMPTY
975 } __ABI_PACKED;
976 
977 struct cmd_clk_get_max_clk_id_response {
978 	uint32_t max_id;
979 } __ABI_PACKED;
980 
981 /** @private */
982 struct cmd_clk_get_fmax_at_vmin_request {
983 	EMPTY
984 } __ABI_PACKED;
985 
986 struct cmd_clk_get_fmax_at_vmin_response {
987 	int64_t rate;
988 } __ABI_PACKED;
989 
990 /**
991  * @ingroup Clocks
992  * @brief Request with #MRQ_CLK
993  *
994  * Used by the sender of an #MRQ_CLK message to control clocks. The
995  * clk_request is split into several sub-commands. Some sub-commands
996  * require no additional data. Others have a sub-command specific
997  * payload
998  *
999  * |sub-command                 |payload                |
1000  * |----------------------------|-----------------------|
1001  * |CMD_CLK_GET_RATE            |-                      |
1002  * |CMD_CLK_SET_RATE            |clk_set_rate           |
1003  * |CMD_CLK_ROUND_RATE          |clk_round_rate         |
1004  * |CMD_CLK_GET_PARENT          |-                      |
1005  * |CMD_CLK_SET_PARENT          |clk_set_parent         |
1006  * |CMD_CLK_IS_ENABLED          |-                      |
1007  * |CMD_CLK_ENABLE              |-                      |
1008  * |CMD_CLK_DISABLE             |-                      |
1009  * |CMD_CLK_GET_ALL_INFO        |-                      |
1010  * |CMD_CLK_GET_MAX_CLK_ID      |-                      |
1011  * |CMD_CLK_GET_FMAX_AT_VMIN    |-
1012  * |
1013  *
1014  */
1015 
1016 struct mrq_clk_request {
1017 	/** @brief Sub-command and clock id concatenated to 32-bit word.
1018 	 * - bits[31..24] is the sub-cmd.
1019 	 * - bits[23..0] is the clock id
1020 	 */
1021 	uint32_t cmd_and_id;
1022 
1023 	union {
1024 		/** @private */
1025 		struct cmd_clk_get_rate_request clk_get_rate;
1026 		struct cmd_clk_set_rate_request clk_set_rate;
1027 		struct cmd_clk_round_rate_request clk_round_rate;
1028 		/** @private */
1029 		struct cmd_clk_get_parent_request clk_get_parent;
1030 		struct cmd_clk_set_parent_request clk_set_parent;
1031 		/** @private */
1032 		struct cmd_clk_enable_request clk_enable;
1033 		/** @private */
1034 		struct cmd_clk_disable_request clk_disable;
1035 		/** @private */
1036 		struct cmd_clk_is_enabled_request clk_is_enabled;
1037 		/** @private */
1038 		struct cmd_clk_get_all_info_request clk_get_all_info;
1039 		/** @private */
1040 		struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id;
1041 		/** @private */
1042 		struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin;
1043 	} __UNION_ANON;
1044 } __ABI_PACKED;
1045 
1046 /**
1047  * @ingroup Clocks
1048  * @brief Response to MRQ_CLK
1049  *
1050  * Each sub-command supported by @ref mrq_clk_request may return
1051  * sub-command-specific data. Some do and some do not as indicated in
1052  * the following table
1053  *
1054  * |sub-command                 |payload                 |
1055  * |----------------------------|------------------------|
1056  * |CMD_CLK_GET_RATE            |clk_get_rate            |
1057  * |CMD_CLK_SET_RATE            |clk_set_rate            |
1058  * |CMD_CLK_ROUND_RATE          |clk_round_rate          |
1059  * |CMD_CLK_GET_PARENT          |clk_get_parent          |
1060  * |CMD_CLK_SET_PARENT          |clk_set_parent          |
1061  * |CMD_CLK_IS_ENABLED          |clk_is_enabled          |
1062  * |CMD_CLK_ENABLE              |-                       |
1063  * |CMD_CLK_DISABLE             |-                       |
1064  * |CMD_CLK_GET_ALL_INFO        |clk_get_all_info        |
1065  * |CMD_CLK_GET_MAX_CLK_ID      |clk_get_max_id          |
1066  * |CMD_CLK_GET_FMAX_AT_VMIN    |clk_get_fmax_at_vmin    |
1067  *
1068  */
1069 
1070 struct mrq_clk_response {
1071 	union {
1072 		struct cmd_clk_get_rate_response clk_get_rate;
1073 		struct cmd_clk_set_rate_response clk_set_rate;
1074 		struct cmd_clk_round_rate_response clk_round_rate;
1075 		struct cmd_clk_get_parent_response clk_get_parent;
1076 		struct cmd_clk_set_parent_response clk_set_parent;
1077 		/** @private */
1078 		struct cmd_clk_enable_response clk_enable;
1079 		/** @private */
1080 		struct cmd_clk_disable_response clk_disable;
1081 		struct cmd_clk_is_enabled_response clk_is_enabled;
1082 		struct cmd_clk_get_all_info_response clk_get_all_info;
1083 		struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id;
1084 		struct cmd_clk_get_fmax_at_vmin_response clk_get_fmax_at_vmin;
1085 	} __UNION_ANON;
1086 } __ABI_PACKED;
1087 
1088 /** @} */
1089 
1090 /**
1091  * @ingroup MRQ_Codes
1092  * @def MRQ_QUERY_ABI
1093  * @brief Check if an MRQ is implemented
1094  *
1095  * * Platforms: All
1096  * * Initiators: Any
1097  * * Targets: Any except DMCE
1098  * * Request Payload: @ref mrq_query_abi_request
1099  * * Response Payload: @ref mrq_query_abi_response
1100  */
1101 
1102 /**
1103  * @ingroup ABI_info
1104  * @brief Request with MRQ_QUERY_ABI
1105  *
1106  * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
1107  * by the recipient.
1108  */
1109 struct mrq_query_abi_request {
1110 	/** @brief MRQ code to query */
1111 	uint32_t mrq;
1112 } __ABI_PACKED;
1113 
1114 /**
1115  * @ingroup ABI_info
1116  * @brief Response to MRQ_QUERY_ABI
1117  *
1118  * @note mrq_response::err of 0 indicates that the query was
1119  * successful, not that the MRQ itself is supported!
1120  */
1121 struct mrq_query_abi_response {
1122 	/** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
1123 	int32_t status;
1124 } __ABI_PACKED;
1125 
1126 /**
1127  * @ingroup MRQ_Codes
1128  * @def MRQ_PG_READ_STATE
1129  * @brief Read the power-gating state of a partition
1130  *
1131  * * Platforms: T186
1132  * @cond bpmp_t186
1133  * * Initiators: Any
1134  * * Targets: BPMP
1135  * * Request Payload: @ref mrq_pg_read_state_request
1136  * * Response Payload: @ref mrq_pg_read_state_response
1137  */
1138 
1139 /**
1140  * @ingroup Powergating
1141  * @brief Request with #MRQ_PG_READ_STATE
1142  *
1143  * Used by MRQ_PG_READ_STATE call to read the current state of a
1144  * partition.
1145  */
1146 struct mrq_pg_read_state_request {
1147 	/** @brief ID of partition */
1148 	uint32_t partition_id;
1149 } __ABI_PACKED;
1150 
1151 /**
1152  * @ingroup Powergating
1153  * @brief Response to MRQ_PG_READ_STATE
1154  * @todo define possible errors.
1155  */
1156 struct mrq_pg_read_state_response {
1157 	/** @brief Read as don't care */
1158 	uint32_t sram_state;
1159 	/** @brief State of power partition
1160 	 * * 0 : off
1161 	 * * 1 : on
1162 	 */
1163 	uint32_t logic_state;
1164 } __ABI_PACKED;
1165 /** @endcond*/
1166 /** @} */
1167 
1168 /**
1169  * @ingroup MRQ_Codes
1170  * @def MRQ_PG_UPDATE_STATE
1171  * @brief Modify the power-gating state of a partition. In contrast to
1172  * MRQ_PG calls, the operations that change state (on/off) of power
1173  * partition are reference counted.
1174  *
1175  * * Platforms: T186
1176  * @cond bpmp_t186
1177  * * Initiators: Any
1178  * * Targets: BPMP
1179  * * Request Payload: @ref mrq_pg_update_state_request
1180  * * Response Payload: N/A
1181  */
1182 
1183 /**
1184  * @ingroup Powergating
1185  * @brief Request with mrq_pg_update_state_request
1186  *
1187  * Used by #MRQ_PG_UPDATE_STATE call to request BPMP to change the
1188  * state of a power partition #partition_id.
1189  */
1190 struct mrq_pg_update_state_request {
1191 	/** @brief ID of partition */
1192 	uint32_t partition_id;
1193 	/** @brief Secondary control of power partition
1194 	 *  @details Ignored by many versions of the BPMP
1195 	 *  firmware. For maximum compatibility, set the value
1196 	 *  according to @ref logic_state
1197 	 * *  0x1: power ON partition (@ref logic_state == 0x3)
1198 	 * *  0x3: power OFF partition (@ref logic_state == 0x1)
1199 	 */
1200 	uint32_t sram_state;
1201 	/** @brief Controls state of power partition, legal values are
1202 	 * *  0x1 : power OFF partition
1203 	 * *  0x3 : power ON partition
1204 	 */
1205 	uint32_t logic_state;
1206 	/** @brief Change state of clocks of the power partition, legal values
1207 	 * *  0x0 : do not change clock state
1208 	 * *  0x1 : disable partition clocks (only applicable when
1209 	 *          @ref logic_state == 0x1)
1210 	 * *  0x3 : enable partition clocks (only applicable when
1211 	 *          @ref logic_state == 0x3)
1212 	 */
1213 	uint32_t clock_state;
1214 } __ABI_PACKED;
1215 /** @endcond*/
1216 
1217 /**
1218  * @ingroup MRQ_Codes
1219  * @def MRQ_PG
1220  * @brief Control power-gating state of a partition. In contrast to
1221  * MRQ_PG_UPDATE_STATE, operations that change the power partition
1222  * state are NOT reference counted
1223  *
1224  * @note BPMP-FW forcefully turns off some partitions as part of SC7 entry
1225  * because their state cannot be adequately restored on exit. Therefore,
1226  * it is recommended to power off all domains via MRQ_PG prior to SC7 entry.
1227  * See @ref bpmp_pdomain_ids for further detail.
1228  *
1229  * * Platforms: T186, T194
1230  * * Initiators: Any
1231  * * Targets: BPMP
1232  * * Request Payload: @ref mrq_pg_request
1233  * * Response Payload: @ref mrq_pg_response
1234  *
1235  * @addtogroup Powergating
1236  * @{
1237  */
1238 enum mrq_pg_cmd {
1239 	/**
1240 	 * @brief Check whether the BPMP driver supports the specified
1241 	 * request type
1242 	 *
1243 	 * mrq_response::err is 0 if the specified request is
1244 	 * supported and -#BPMP_ENODEV otherwise.
1245 	 */
1246 	CMD_PG_QUERY_ABI = 0,
1247 
1248 	/**
1249 	 * @brief Set the current state of specified power domain. The
1250 	 * possible values for power domains are defined in enum
1251 	 * pg_states
1252 	 *
1253 	 * mrq_response:err is
1254 	 * 0: Success
1255 	 * -#BPMP_EINVAL: Invalid request parameters
1256 	 */
1257 	CMD_PG_SET_STATE = 1,
1258 
1259 	/**
1260 	 * @brief Get the current state of specified power domain. The
1261 	 * possible values for power domains are defined in enum
1262 	 * pg_states
1263 	 *
1264 	 * mrq_response:err is
1265 	 * 0: Success
1266 	 * -#BPMP_EINVAL: Invalid request parameters
1267 	 */
1268 	CMD_PG_GET_STATE = 2,
1269 
1270 	/**
1271 	 * @brief Get the name string of specified power domain id.
1272 	 *
1273 	 * mrq_response:err is
1274 	 * 0: Success
1275 	 * -#BPMP_EINVAL: Invalid request parameters
1276 	 */
1277 	CMD_PG_GET_NAME = 3,
1278 
1279 
1280 	/**
1281 	 * @brief Get the highest power domain id in the system. Not
1282 	 * all IDs between 0 and max_id are valid IDs.
1283 	 *
1284 	 * mrq_response:err is
1285 	 * 0: Success
1286 	 * -#BPMP_EINVAL: Invalid request parameters
1287 	 */
1288 	CMD_PG_GET_MAX_ID = 4,
1289 };
1290 
1291 #define MRQ_PG_NAME_MAXLEN	40
1292 
1293 enum pg_states {
1294 	/** @brief Power domain is OFF */
1295 	PG_STATE_OFF = 0,
1296 	/** @brief Power domain is ON */
1297 	PG_STATE_ON = 1,
1298 	/**
1299 	 * @brief a legacy state where power domain and the clock
1300 	 * associated to the domain are ON.
1301 	 * This state is only supported in T186, and the use of it is
1302 	 * deprecated.
1303 	 */
1304 	PG_STATE_RUNNING = 2,
1305 };
1306 
1307 struct cmd_pg_query_abi_request {
1308 	/** @ref mrq_pg_cmd */
1309 	uint32_t type;
1310 } __ABI_PACKED;
1311 
1312 struct cmd_pg_set_state_request {
1313 	/** @ref pg_states */
1314 	uint32_t state;
1315 } __ABI_PACKED;
1316 
1317 struct cmd_pg_get_state_response {
1318 	/** @ref pg_states */
1319 	uint32_t state;
1320 } __ABI_PACKED;
1321 
1322 struct cmd_pg_get_name_response {
1323 	uint8_t name[MRQ_PG_NAME_MAXLEN];
1324 } __ABI_PACKED;
1325 
1326 struct cmd_pg_get_max_id_response {
1327 	uint32_t max_id;
1328 } __ABI_PACKED;
1329 
1330 /**
1331  * @brief Request with #MRQ_PG
1332  *
1333  * Used by the sender of an #MRQ_PG message to control power
1334  * partitions. The pg_request is split into several sub-commands. Some
1335  * sub-commands require no additional data. Others have a sub-command
1336  * specific payload
1337  *
1338  * |sub-command                 |payload                |
1339  * |----------------------------|-----------------------|
1340  * |CMD_PG_QUERY_ABI            | query_abi             |
1341  * |CMD_PG_SET_STATE            | set_state             |
1342  * |CMD_PG_GET_STATE            | -                     |
1343  * |CMD_PG_GET_NAME             | -                     |
1344  * |CMD_PG_GET_MAX_ID           | -                     |
1345  *
1346  */
1347 struct mrq_pg_request {
1348 	uint32_t cmd;
1349 	uint32_t id;
1350 	union {
1351 		struct cmd_pg_query_abi_request query_abi;
1352 		struct cmd_pg_set_state_request set_state;
1353 	} __UNION_ANON;
1354 } __ABI_PACKED;
1355 
1356 /**
1357  * @brief Response to MRQ_PG
1358  *
1359  * Each sub-command supported by @ref mrq_pg_request may return
1360  * sub-command-specific data. Some do and some do not as indicated in
1361  * the following table
1362  *
1363  * |sub-command                 |payload                |
1364  * |----------------------------|-----------------------|
1365  * |CMD_PG_QUERY_ABI            | -                     |
1366  * |CMD_PG_SET_STATE            | -                     |
1367  * |CMD_PG_GET_STATE            | get_state             |
1368  * |CMD_PG_GET_NAME             | get_name              |
1369  * |CMD_PG_GET_MAX_ID           | get_max_id            |
1370  */
1371 struct mrq_pg_response {
1372 	union {
1373 		struct cmd_pg_get_state_response get_state;
1374 		struct cmd_pg_get_name_response get_name;
1375 		struct cmd_pg_get_max_id_response get_max_id;
1376 	} __UNION_ANON;
1377 } __ABI_PACKED;
1378 
1379 /** @} */
1380 
1381 /**
1382  * @ingroup MRQ_Codes
1383  * @def MRQ_THERMAL
1384  * @brief Interact with BPMP thermal framework
1385  *
1386  * * Platforms: T186, T194
1387  * * Initiators: Any
1388  * * Targets: Any
1389  * * Request Payload: TODO
1390  * * Response Payload: TODO
1391  *
1392  * @addtogroup Thermal
1393  *
1394  * The BPMP firmware includes a thermal framework. Drivers within the
1395  * bpmp firmware register with the framework to provide thermal
1396  * zones. Each thermal zone corresponds to an entity whose temperature
1397  * can be measured. The framework also has a notion of trip points. A
1398  * trip point consists of a thermal zone id, a temperature, and a
1399  * callback routine. The framework invokes the callback when the zone
1400  * hits the indicated temperature. The BPMP firmware uses this thermal
1401  * framework interally to implement various temperature-dependent
1402  * functions.
1403  *
1404  * Software on the CPU can use #MRQ_THERMAL (with payload @ref
1405  * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal
1406  * framework. The CPU must It can query the number of supported zones,
1407  * query zone temperatures, and set trip points.
1408  *
1409  * When a trip point set by the CPU gets crossed, BPMP firmware issues
1410  * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a
1411  * payload of @ref mrq_thermal_bpmp_to_host_request.
1412  * @{
1413  */
1414 enum mrq_thermal_host_to_bpmp_cmd {
1415 	/**
1416 	 * @brief Check whether the BPMP driver supports the specified
1417 	 * request type.
1418 	 *
1419 	 * Host needs to supply request parameters.
1420 	 *
1421 	 * mrq_response::err is 0 if the specified request is
1422 	 * supported and -#BPMP_ENODEV otherwise.
1423 	 */
1424 	CMD_THERMAL_QUERY_ABI = 0,
1425 
1426 	/**
1427 	 * @brief Get the current temperature of the specified zone.
1428 	 *
1429 	 * Host needs to supply request parameters.
1430 	 *
1431 	 * mrq_response::err is
1432 	 * *  0: Temperature query succeeded.
1433 	 * *  -#BPMP_EINVAL: Invalid request parameters.
1434 	 * *  -#BPMP_ENOENT: No driver registered for thermal zone..
1435 	 * *  -#BPMP_EFAULT: Problem reading temperature measurement.
1436 	 */
1437 	CMD_THERMAL_GET_TEMP = 1,
1438 
1439 	/**
1440 	 * @brief Enable or disable and set the lower and upper
1441 	 *   thermal limits for a thermal trip point. Each zone has
1442 	 *   one trip point.
1443 	 *
1444 	 * Host needs to supply request parameters. Once the
1445 	 * temperature hits a trip point, the BPMP will send a message
1446 	 * to the CPU having MRQ=MRQ_THERMAL and
1447 	 * type=CMD_THERMAL_HOST_TRIP_REACHED
1448 	 *
1449 	 * mrq_response::err is
1450 	 * *  0: Trip successfully set.
1451 	 * *  -#BPMP_EINVAL: Invalid request parameters.
1452 	 * *  -#BPMP_ENOENT: No driver registered for thermal zone.
1453 	 * *  -#BPMP_EFAULT: Problem setting trip point.
1454 	 */
1455 	CMD_THERMAL_SET_TRIP = 2,
1456 
1457 	/**
1458 	 * @brief Get the number of supported thermal zones.
1459 	 *
1460 	 * No request parameters required.
1461 	 *
1462 	 * mrq_response::err is always 0, indicating success.
1463 	 */
1464 	CMD_THERMAL_GET_NUM_ZONES = 3,
1465 
1466 	/** @brief: number of supported host-to-bpmp commands. May
1467 	 * increase in future
1468 	 */
1469 	CMD_THERMAL_HOST_TO_BPMP_NUM
1470 };
1471 
1472 enum mrq_thermal_bpmp_to_host_cmd {
1473 	/**
1474 	 * @brief Indication that the temperature for a zone has
1475 	 *   exceeded the range indicated in the thermal trip point
1476 	 *   for the zone.
1477 	 *
1478 	 * BPMP needs to supply request parameters. Host only needs to
1479 	 * acknowledge.
1480 	 */
1481 	CMD_THERMAL_HOST_TRIP_REACHED = 100,
1482 
1483 	/** @brief: number of supported bpmp-to-host commands. May
1484 	 * increase in future
1485 	 */
1486 	CMD_THERMAL_BPMP_TO_HOST_NUM
1487 };
1488 
1489 /*
1490  * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
1491  *
1492  * zone: Request type for which to check existence.
1493  */
1494 struct cmd_thermal_query_abi_request {
1495 	uint32_t type;
1496 } __ABI_PACKED;
1497 
1498 /*
1499  * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
1500  *
1501  * zone: Number of thermal zone.
1502  */
1503 struct cmd_thermal_get_temp_request {
1504 	uint32_t zone;
1505 } __ABI_PACKED;
1506 
1507 /*
1508  * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
1509  *
1510  * error: 0 if request succeeded.
1511  *	-BPMP_EINVAL if request parameters were invalid.
1512  *      -BPMP_ENOENT if no driver was registered for the specified thermal zone.
1513  *      -BPMP_EFAULT for other thermal zone driver errors.
1514  * temp: Current temperature in millicelsius.
1515  */
1516 struct cmd_thermal_get_temp_response {
1517 	int32_t temp;
1518 } __ABI_PACKED;
1519 
1520 /*
1521  * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
1522  *
1523  * zone: Number of thermal zone.
1524  * low: Temperature of lower trip point in millicelsius
1525  * high: Temperature of upper trip point in millicelsius
1526  * enabled: 1 to enable trip point, 0 to disable trip point
1527  */
1528 struct cmd_thermal_set_trip_request {
1529 	uint32_t zone;
1530 	int32_t low;
1531 	int32_t high;
1532 	uint32_t enabled;
1533 } __ABI_PACKED;
1534 
1535 /*
1536  * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
1537  *
1538  * zone: Number of thermal zone where trip point was reached.
1539  */
1540 struct cmd_thermal_host_trip_reached_request {
1541 	uint32_t zone;
1542 } __ABI_PACKED;
1543 
1544 /*
1545  * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
1546  *
1547  * num: Number of supported thermal zones. The thermal zones are indexed
1548  *      starting from zero.
1549  */
1550 struct cmd_thermal_get_num_zones_response {
1551 	uint32_t num;
1552 } __ABI_PACKED;
1553 
1554 /*
1555  * Host->BPMP request data.
1556  *
1557  * Reply type is union mrq_thermal_bpmp_to_host_response.
1558  *
1559  * type: Type of request. Values listed in enum mrq_thermal_type.
1560  * data: Request type specific parameters.
1561  */
1562 struct mrq_thermal_host_to_bpmp_request {
1563 	uint32_t type;
1564 	union {
1565 		struct cmd_thermal_query_abi_request query_abi;
1566 		struct cmd_thermal_get_temp_request get_temp;
1567 		struct cmd_thermal_set_trip_request set_trip;
1568 	} __UNION_ANON;
1569 } __ABI_PACKED;
1570 
1571 /*
1572  * BPMP->Host request data.
1573  *
1574  * type: Type of request. Values listed in enum mrq_thermal_type.
1575  * data: Request type specific parameters.
1576  */
1577 struct mrq_thermal_bpmp_to_host_request {
1578 	uint32_t type;
1579 	union {
1580 		struct cmd_thermal_host_trip_reached_request host_trip_reached;
1581 	} __UNION_ANON;
1582 } __ABI_PACKED;
1583 
1584 /*
1585  * Data in reply to a Host->BPMP request.
1586  */
1587 union mrq_thermal_bpmp_to_host_response {
1588 	struct cmd_thermal_get_temp_response get_temp;
1589 	struct cmd_thermal_get_num_zones_response get_num_zones;
1590 } __ABI_PACKED;
1591 /** @} */
1592 
1593 /**
1594  * @ingroup MRQ_Codes
1595  * @def MRQ_CPU_VHINT
1596  * @brief Query CPU voltage hint data
1597  *
1598  * * Platforms: T186
1599  * @cond bpmp_t186
1600  * * Initiators: CCPLEX
1601  * * Targets: BPMP
1602  * * Request Payload: @ref mrq_cpu_vhint_request
1603  * * Response Payload: N/A
1604  *
1605  * @addtogroup Vhint
1606  * @{
1607  */
1608 
1609 /**
1610  * @brief Request with #MRQ_CPU_VHINT
1611  *
1612  * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data
1613  * from BPMP to memory space pointed by #addr. CCPLEX is responsible
1614  * to allocate sizeof(cpu_vhint_data) sized block of memory and
1615  * appropriately map it for BPMP before sending the request.
1616  */
1617 struct mrq_cpu_vhint_request {
1618 	/** @brief IOVA address for the #cpu_vhint_data */
1619 	uint32_t addr;
1620 	/** @brief ID of the cluster whose data is requested */
1621 	uint32_t cluster_id;
1622 } __ABI_PACKED;
1623 
1624 /**
1625  * @brief Description of the CPU v/f relation
1626  *
1627  * Used by #MRQ_CPU_VHINT call to carry data pointed by
1628  * #mrq_cpu_vhint_request::addr
1629  */
1630 struct cpu_vhint_data {
1631 	uint32_t ref_clk_hz; /**< reference frequency in Hz */
1632 	uint16_t pdiv; /**< post divider value */
1633 	uint16_t mdiv; /**< input divider value */
1634 	uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */
1635 	/** table of ndiv values as a function of vINDEX (voltage index) */
1636 	uint16_t ndiv[80];
1637 	/** minimum allowed NDIV value */
1638 	uint16_t ndiv_min;
1639 	/** minimum allowed voltage hint value (as in vINDEX) */
1640 	uint16_t vfloor;
1641 	/** maximum allowed voltage hint value (as in vINDEX) */
1642 	uint16_t vceil;
1643 	/** post-multiplier for vindex value */
1644 	uint16_t vindex_mult;
1645 	/** post-divider for vindex value */
1646 	uint16_t vindex_div;
1647 	/** reserved for future use */
1648 	uint16_t reserved[328];
1649 } __ABI_PACKED;
1650 /** @endcond */
1651 /** @} */
1652 
1653 /**
1654  * @ingroup MRQ_Codes
1655  * @def MRQ_ABI_RATCHET
1656  * @brief ABI ratchet value query
1657  *
1658  * * Platforms: T186, T194
1659  * * Initiators: Any
1660  * * Targets: BPMP
1661  * * Request Payload: @ref mrq_abi_ratchet_request
1662  * * Response Payload: @ref mrq_abi_ratchet_response
1663  * @addtogroup ABI_info
1664  * @{
1665  */
1666 
1667 /**
1668  * @brief An ABI compatibility mechanism
1669  *
1670  * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future
1671  * revision of this header file.
1672  * 1. That future revision deprecates some MRQ
1673  * 2. That future revision introduces a breaking change to an existing
1674  *    MRQ or
1675  * 3. A bug is discovered in an existing implementation of the BPMP-FW
1676  *    (or possibly one of its clients) which warrants deprecating that
1677  *    implementation.
1678  */
1679 #define BPMP_ABI_RATCHET_VALUE 3
1680 
1681 /**
1682  * @brief Request with #MRQ_ABI_RATCHET.
1683  *
1684  * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
1685  * against which the requester was compiled.
1686  *
1687  * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may
1688  * reply with mrq_response::err = -#BPMP_ERANGE to indicate that
1689  * BPMP-FW cannot interoperate correctly with the requester. Requester
1690  * should cease further communication with BPMP.
1691  *
1692  * Otherwise, err shall be 0.
1693  */
1694 struct mrq_abi_ratchet_request {
1695 	/** @brief Requester's ratchet value */
1696 	uint16_t ratchet;
1697 };
1698 
1699 /**
1700  * @brief Response to #MRQ_ABI_RATCHET
1701  *
1702  * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
1703  * against which BPMP firwmare was compiled.
1704  *
1705  * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE,
1706  * the requster must either interoperate with BPMP according to an ABI
1707  * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease
1708  * communication with BPMP.
1709  *
1710  * If mrq_response::err is 0 and ratchet is greater than or equal to the
1711  * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue
1712  * normal operation.
1713  */
1714 struct mrq_abi_ratchet_response {
1715 	/** @brief BPMP's ratchet value */
1716 	uint16_t ratchet;
1717 };
1718 /** @} */
1719 
1720 /**
1721  * @ingroup MRQ_Codes
1722  * @def MRQ_EMC_DVFS_LATENCY
1723  * @brief Query frequency dependent EMC DVFS latency
1724  *
1725  * * Platforms: T186, T194
1726  * * Initiators: CCPLEX
1727  * * Targets: BPMP
1728  * * Request Payload: N/A
1729  * * Response Payload: @ref mrq_emc_dvfs_latency_response
1730  * @addtogroup EMC
1731  * @{
1732  */
1733 
1734 /**
1735  * @brief Used by @ref mrq_emc_dvfs_latency_response
1736  */
1737 struct emc_dvfs_latency {
1738 	/** @brief EMC frequency in kHz */
1739 	uint32_t freq;
1740 	/** @brief EMC DVFS latency in nanoseconds */
1741 	uint32_t latency;
1742 } __ABI_PACKED;
1743 
1744 #define EMC_DVFS_LATENCY_MAX_SIZE	14
1745 /**
1746  * @brief Response to #MRQ_EMC_DVFS_LATENCY
1747  */
1748 struct mrq_emc_dvfs_latency_response {
1749 	/** @brief The number valid entries in #pairs */
1750 	uint32_t num_pairs;
1751 	/** @brief EMC <frequency, latency> information */
1752 	struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE];
1753 } __ABI_PACKED;
1754 
1755 /** @} */
1756 
1757 /**
1758  * @ingroup MRQ_Codes
1759  * @def MRQ_CPU_NDIV_LIMITS
1760  * @brief CPU freq. limits in ndiv
1761  *
1762  * * Platforms: T194 onwards
1763  * @cond bpmp_t194
1764  * * Initiators: CCPLEX
1765  * * Targets: BPMP
1766  * * Request Payload: @ref mrq_cpu_ndiv_limits_request
1767  * * Response Payload: @ref mrq_cpu_ndiv_limits_response
1768  * @addtogroup CPU
1769  * @{
1770  */
1771 
1772 /**
1773  * @brief Request for ndiv limits of a cluster
1774  */
1775 struct mrq_cpu_ndiv_limits_request {
1776 	/** @brief Enum cluster_id */
1777 	uint32_t cluster_id;
1778 } __ABI_PACKED;
1779 
1780 /**
1781  * @brief Response to #MRQ_CPU_NDIV_LIMITS
1782  */
1783 struct mrq_cpu_ndiv_limits_response {
1784 	/** @brief Reference frequency in Hz */
1785 	uint32_t ref_clk_hz;
1786 	/** @brief Post divider value */
1787 	uint16_t pdiv;
1788 	/** @brief Input divider value */
1789 	uint16_t mdiv;
1790 	/** @brief FMAX expressed with max NDIV value */
1791 	uint16_t ndiv_max;
1792 	/** @brief Minimum allowed NDIV value */
1793 	uint16_t ndiv_min;
1794 } __ABI_PACKED;
1795 
1796 /** @} */
1797 /** @endcond */
1798 
1799 /**
1800  * @ingroup MRQ_Codes
1801  * @def MRQ_CPU_AUTO_CC3
1802  * @brief Query CPU cluster auto-CC3 configuration
1803  *
1804  * * Platforms: T194 onwards
1805  * @cond bpmp_t194
1806  * * Initiators: CCPLEX
1807  * * Targets: BPMP
1808  * * Request Payload: @ref mrq_cpu_auto_cc3_request
1809  * * Response Payload: @ref mrq_cpu_auto_cc3_response
1810  * @addtogroup CC3
1811  *
1812  * Queries from BPMP auto-CC3 configuration (allowed/not allowed) for a
1813  * specified cluster. CCPLEX s/w uses this information to override its own
1814  * device tree auto-CC3 settings, so that BPMP device tree is a single source of
1815  * auto-CC3 platform configuration.
1816  *
1817  * @{
1818  */
1819 
1820 /**
1821  * @brief Request for auto-CC3 configuration of a cluster
1822  */
1823 struct mrq_cpu_auto_cc3_request {
1824 	/** @brief Enum cluster_id (logical cluster id, known to CCPLEX s/w) */
1825 	uint32_t cluster_id;
1826 } __ABI_PACKED;
1827 
1828 /**
1829  * @brief Response to #MRQ_CPU_AUTO_CC3
1830  */
1831 struct mrq_cpu_auto_cc3_response {
1832 	/**
1833 	 * @brief auto-CC3 configuration
1834 	 *
1835 	 * - bits[31..10] reserved.
1836 	 * - bits[9..1] cc3 ndiv
1837 	 * - bit [0] if "1" auto-CC3 is allowed, if "0" auto-CC3 is not allowed
1838 	 */
1839 	uint32_t auto_cc3_config;
1840 } __ABI_PACKED;
1841 
1842 /** @} */
1843 /** @endcond */
1844 
1845 /**
1846  * @ingroup MRQ_Codes
1847  * @def MRQ_TRACE_ITER
1848  * @brief Manage the trace iterator
1849  *
1850  * * Platforms: All
1851  * * Initiators: CCPLEX
1852  * * Targets: BPMP
1853  * * Request Payload: N/A
1854  * * Response Payload: @ref mrq_trace_iter_request
1855  * @addtogroup Trace
1856  * @{
1857  */
1858 enum {
1859 	/** @brief (re)start the tracing now. Ignore older events */
1860 	TRACE_ITER_INIT = 0,
1861 	/** @brief Clobber all events in the trace buffer */
1862 	TRACE_ITER_CLEAN = 1
1863 };
1864 
1865 /**
1866  * @brief Request with #MRQ_TRACE_ITER
1867  */
1868 struct mrq_trace_iter_request {
1869 	/** @brief TRACE_ITER_INIT or TRACE_ITER_CLEAN */
1870 	uint32_t cmd;
1871 } __ABI_PACKED;
1872 
1873 /** @} */
1874 
1875 /**
1876  * @ingroup MRQ_Codes
1877  * @def MRQ_RINGBUF_CONSOLE
1878  * @brief A ring buffer debug console for BPMP
1879  * @addtogroup RingbufConsole
1880  *
1881  * The ring buffer debug console aims to be a substitute for the UART debug
1882  * console. The debug console is implemented with two ring buffers in the
1883  * BPMP-FW, the RX (receive) and TX (transmit) buffers. Characters can be read
1884  * and written to the buffers by the host via the MRQ interface.
1885  *
1886  * @{
1887  */
1888 
1889 /**
1890  * @brief Maximum number of bytes transferred in a single write command to the
1891  * BPMP
1892  *
1893  * This is determined by the number of free bytes in the message struct,
1894  * rounded down to a multiple of four.
1895  */
1896 #define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112
1897 
1898 /**
1899  * @brief Maximum number of bytes transferred in a single read command to the
1900  * BPMP
1901  *
1902  * This is determined by the number of free bytes in the message struct,
1903  * rounded down to a multiple of four.
1904  */
1905 #define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116
1906 
1907 enum mrq_ringbuf_console_host_to_bpmp_cmd {
1908 	/**
1909 	 * @brief Check whether the BPMP driver supports the specified request
1910 	 * type
1911 	 *
1912 	 * mrq_response::err is 0 if the specified request is supported and
1913 	 * -#BPMP_ENODEV otherwise
1914 	 */
1915 	CMD_RINGBUF_CONSOLE_QUERY_ABI = 0,
1916 	/**
1917 	 * @brief Perform a read operation on the BPMP TX buffer
1918 	 *
1919 	 * mrq_response::err is 0
1920 	 */
1921 	CMD_RINGBUF_CONSOLE_READ = 1,
1922 	/**
1923 	 * @brief Perform a write operation on the BPMP RX buffer
1924 	 *
1925 	 * mrq_response::err is 0 if the operation was successful and
1926 	 * -#BPMP_ENODEV otherwise
1927 	 */
1928 	CMD_RINGBUF_CONSOLE_WRITE = 2,
1929 	/**
1930 	 * @brief Get the length of the buffer and the physical addresses of
1931 	 * the buffer data and the head and tail counters
1932 	 *
1933 	 * mrq_response::err is 0 if the operation was successful and
1934 	 * -#BPMP_ENODEV otherwise
1935 	 */
1936 	CMD_RINGBUF_CONSOLE_GET_FIFO = 3,
1937 };
1938 
1939 /**
1940  * @ingroup RingbufConsole
1941  * @brief Host->BPMP request data for request type
1942  * #CMD_RINGBUF_CONSOLE_QUERY_ABI
1943  */
1944 struct cmd_ringbuf_console_query_abi_req {
1945 	/** @brief Command identifier to be queried */
1946 	uint32_t cmd;
1947 } __ABI_PACKED;
1948 
1949 /** @private */
1950 struct cmd_ringbuf_console_query_abi_resp {
1951 	EMPTY
1952 } __ABI_PACKED;
1953 
1954 /**
1955  * @ingroup RingbufConsole
1956  * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ
1957  */
1958 struct cmd_ringbuf_console_read_req {
1959 	/**
1960 	 * @brief Number of bytes requested to be read from the BPMP TX buffer
1961 	 */
1962 	uint8_t len;
1963 } __ABI_PACKED;
1964 
1965 /**
1966  * @ingroup RingbufConsole
1967  * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ
1968  */
1969 struct cmd_ringbuf_console_read_resp {
1970 	/** @brief The actual data read from the BPMP TX buffer */
1971 	uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_READ_LEN];
1972 	/** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */
1973 	uint8_t len;
1974 } __ABI_PACKED;
1975 
1976 /**
1977  * @ingroup RingbufConsole
1978  * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE
1979  */
1980 struct cmd_ringbuf_console_write_req {
1981 	/** @brief The actual data to be written to the BPMP RX buffer */
1982 	uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN];
1983 	/** @brief Number of bytes in cmd_ringbuf_console_write_req::data */
1984 	uint8_t len;
1985 } __ABI_PACKED;
1986 
1987 /**
1988  * @ingroup RingbufConsole
1989  * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE
1990  */
1991 struct cmd_ringbuf_console_write_resp {
1992 	/** @brief Number of bytes of available space in the BPMP RX buffer */
1993 	uint32_t space_avail;
1994 	/** @brief Number of bytes that were written to the BPMP RX buffer */
1995 	uint8_t len;
1996 } __ABI_PACKED;
1997 
1998 /** @private */
1999 struct cmd_ringbuf_console_get_fifo_req {
2000 	EMPTY
2001 } __ABI_PACKED;
2002 
2003 /**
2004  * @ingroup RingbufConsole
2005  * @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO
2006  */
2007 struct cmd_ringbuf_console_get_fifo_resp {
2008 	/** @brief Physical address of the BPMP TX buffer */
2009 	uint64_t bpmp_tx_buf_addr;
2010 	/** @brief Physical address of the BPMP TX buffer head counter */
2011 	uint64_t bpmp_tx_head_addr;
2012 	/** @brief Physical address of the BPMP TX buffer tail counter */
2013 	uint64_t bpmp_tx_tail_addr;
2014 	/** @brief Length of the BPMP TX buffer */
2015 	uint32_t bpmp_tx_buf_len;
2016 } __ABI_PACKED;
2017 
2018 /**
2019  * @ingroup RingbufConsole
2020  * @brief Host->BPMP request data.
2021  *
2022  * Reply type is union #mrq_ringbuf_console_bpmp_to_host_response .
2023  */
2024 struct mrq_ringbuf_console_host_to_bpmp_request {
2025 	/**
2026 	 * @brief Type of request. Values listed in enum
2027 	 * #mrq_ringbuf_console_host_to_bpmp_cmd.
2028 	 */
2029 	uint32_t type;
2030 	/** @brief  request type specific parameters. */
2031 	union {
2032 		struct cmd_ringbuf_console_query_abi_req query_abi;
2033 		struct cmd_ringbuf_console_read_req read;
2034 		struct cmd_ringbuf_console_write_req write;
2035 		struct cmd_ringbuf_console_get_fifo_req get_fifo;
2036 	} __UNION_ANON;
2037 } __ABI_PACKED;
2038 
2039 /**
2040  * @ingroup RingbufConsole
2041  * @brief Host->BPMP reply data
2042  *
2043  * In response to struct #mrq_ringbuf_console_host_to_bpmp_request.
2044  */
2045 union mrq_ringbuf_console_bpmp_to_host_response {
2046 	struct cmd_ringbuf_console_query_abi_resp query_abi;
2047 	struct cmd_ringbuf_console_read_resp read;
2048 	struct cmd_ringbuf_console_write_resp write;
2049 	struct cmd_ringbuf_console_get_fifo_resp get_fifo;
2050 } __ABI_PACKED;
2051 /** @} */
2052 
2053 /**
2054  * @ingroup MRQ_Codes
2055  * @def MRQ_STRAP
2056  * @brief Set a strap value controlled by BPMP
2057  *
2058  * * Platforms: T194 onwards
2059  * @cond bpmp_t194
2060  * * Initiators: CCPLEX
2061  * * Targets: BPMP
2062  * * Request Payload: @ref mrq_strap_request
2063  * * Response Payload: N/A
2064  * @addtogroup Strap
2065  *
2066  * A strap is an input that is sampled by a hardware unit during the
2067  * unit's startup process. The sampled value of a strap affects the
2068  * behavior of the unit until the unit is restarted. Many hardware
2069  * units sample their straps at the instant that their resets are
2070  * deasserted.
2071  *
2072  * BPMP owns registers which act as straps to various units. It
2073  * exposes limited control of those straps via #MRQ_STRAP.
2074  *
2075  * @{
2076  */
2077 enum mrq_strap_cmd {
2078 	/** @private */
2079 	STRAP_RESERVED = 0,
2080 	/** @brief Set a strap value */
2081 	STRAP_SET = 1
2082 };
2083 
2084 /**
2085  * @brief Request with #MRQ_STRAP
2086  */
2087 struct mrq_strap_request {
2088 	/** @brief @ref mrq_strap_cmd */
2089 	uint32_t cmd;
2090 	/** @brief Strap ID from @ref Strap_Ids */
2091 	uint32_t id;
2092 	/** @brief Desired value for strap (if cmd is #STRAP_SET) */
2093 	uint32_t value;
2094 } __ABI_PACKED;
2095 
2096 /**
2097  * @defgroup Strap_Ids Strap Identifiers
2098  * @}
2099  */
2100 /** @endcond */
2101 
2102 /**
2103  * @ingroup MRQ_Codes
2104  * @def MRQ_UPHY
2105  * @brief Perform a UPHY operation
2106  *
2107  * * Platforms: T194 onwards
2108  * @cond bpmp_t194
2109  * * Initiators: CCPLEX
2110  * * Targets: BPMP
2111  * * Request Payload: @ref mrq_uphy_request
2112  * * Response Payload: @ref mrq_uphy_response
2113  *
2114  * @addtogroup UPHY
2115  * @{
2116  */
2117 enum {
2118 	CMD_UPHY_PCIE_LANE_MARGIN_CONTROL = 1,
2119 	CMD_UPHY_PCIE_LANE_MARGIN_STATUS = 2,
2120 	CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT = 3,
2121 	CMD_UPHY_PCIE_CONTROLLER_STATE = 4,
2122 	CMD_UPHY_MAX,
2123 };
2124 
2125 struct cmd_uphy_margin_control_request {
2126 	/** @brief Enable margin */
2127 	int32_t en;
2128 	/** @brief Clear the number of error and sections */
2129 	int32_t clr;
2130 	/** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */
2131 	uint32_t x;
2132 	/** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */
2133 	uint32_t y;
2134 	/** @brief Set number of bit blocks for each margin section */
2135 	uint32_t nblks;
2136 } __ABI_PACKED;
2137 
2138 struct cmd_uphy_margin_status_response {
2139 	/** @brief Number of errors observed */
2140 	uint32_t status;
2141 } __ABI_PACKED;
2142 
2143 struct cmd_uphy_ep_controller_pll_init_request {
2144 	/** @brief EP controller number, valid: 0, 4, 5 */
2145 	uint8_t ep_controller;
2146 } __ABI_PACKED;
2147 
2148 struct cmd_uphy_pcie_controller_state_request {
2149 	/** @brief PCIE controller number, valid: 0, 1, 2, 3, 4 */
2150 	uint8_t pcie_controller;
2151 	uint8_t enable;
2152 } __ABI_PACKED;
2153 
2154 /**
2155  * @ingroup UPHY
2156  * @brief Request with #MRQ_UPHY
2157  *
2158  * Used by the sender of an #MRQ_UPHY message to control UPHY Lane RX margining.
2159  * The uphy_request is split into several sub-commands. Some sub-commands
2160  * require no additional data. Others have a sub-command specific payload
2161  *
2162  * |sub-command                          |payload                                 |
2163  * |------------------------------------ |----------------------------------------|
2164  * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL    |uphy_set_margin_control                 |
2165  * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS     |                                        |
2166  * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT |cmd_uphy_ep_controller_pll_init_request |
2167  * |CMD_UPHY_PCIE_CONTROLLER_STATE       |cmd_uphy_pcie_controller_state_request  |
2168  *
2169  */
2170 
2171 struct mrq_uphy_request {
2172 	/** @brief Lane number. */
2173 	uint16_t lane;
2174 	/** @brief Sub-command id. */
2175 	uint16_t cmd;
2176 
2177 	union {
2178 		struct cmd_uphy_margin_control_request uphy_set_margin_control;
2179 		struct cmd_uphy_ep_controller_pll_init_request ep_ctrlr_pll_init;
2180 		struct cmd_uphy_pcie_controller_state_request controller_state;
2181 	} __UNION_ANON;
2182 } __ABI_PACKED;
2183 
2184 /**
2185  * @ingroup UPHY
2186  * @brief Response to MRQ_UPHY
2187  *
2188  * Each sub-command supported by @ref mrq_uphy_request may return
2189  * sub-command-specific data. Some do and some do not as indicated in
2190  * the following table
2191  *
2192  * |sub-command                       |payload                 |
2193  * |----------------------------      |------------------------|
2194  * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL |                        |
2195  * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS  |uphy_get_margin_status  |
2196  *
2197  */
2198 
2199 struct mrq_uphy_response {
2200 	union {
2201 		struct cmd_uphy_margin_status_response uphy_get_margin_status;
2202 	} __UNION_ANON;
2203 } __ABI_PACKED;
2204 
2205 /** @} */
2206 /** @endcond */
2207 
2208 /**
2209  * @ingroup MRQ_Codes
2210  * @def MRQ_FMON
2211  * @brief Perform a frequency monitor configuration operations
2212  *
2213  * * Platforms: T194 onwards
2214  * @cond bpmp_t194
2215  * * Initiators: CCPLEX
2216  * * Targets: BPMP
2217  * * Request Payload: @ref mrq_fmon_request
2218  * * Response Payload: @ref mrq_fmon_response
2219  *
2220  * @addtogroup FMON
2221  * @{
2222  */
2223 enum {
2224 	/**
2225 	 * @brief Clamp FMON configuration to specified rate.
2226 	 *
2227 	 * The monitored clock must be running for clamp to succeed. If
2228 	 * clamped, FMON configuration is preserved when clock rate
2229 	 * and/or state is changed.
2230 	 */
2231 	CMD_FMON_GEAR_CLAMP = 1,
2232 	/**
2233 	 * @brief Release clamped FMON configuration.
2234 	 *
2235 	 * Allow FMON configuration to follow monitored clock rate
2236 	 * and/or state changes.
2237 	 */
2238 	CMD_FMON_GEAR_FREE = 2,
2239 	/**
2240 	 * @brief Return rate FMON is clamped at, or 0 if FMON is not
2241 	 *         clamped.
2242 	 *
2243 	 * Inherently racy, since clamp state can be changed
2244 	 * concurrently. Useful for testing.
2245 	 */
2246 	CMD_FMON_GEAR_GET = 3,
2247 	CMD_FMON_NUM,
2248 };
2249 
2250 struct cmd_fmon_gear_clamp_request {
2251 	int32_t unused;
2252 	int64_t rate;
2253 } __ABI_PACKED;
2254 
2255 /** @private */
2256 struct cmd_fmon_gear_clamp_response {
2257 	EMPTY
2258 } __ABI_PACKED;
2259 
2260 /** @private */
2261 struct cmd_fmon_gear_free_request {
2262 	EMPTY
2263 } __ABI_PACKED;
2264 
2265 /** @private */
2266 struct cmd_fmon_gear_free_response {
2267 	EMPTY
2268 } __ABI_PACKED;
2269 
2270 /** @private */
2271 struct cmd_fmon_gear_get_request {
2272 	EMPTY
2273 } __ABI_PACKED;
2274 
2275 struct cmd_fmon_gear_get_response {
2276 	int64_t rate;
2277 } __ABI_PACKED;
2278 
2279 /**
2280  * @ingroup FMON
2281  * @brief Request with #MRQ_FMON
2282  *
2283  * Used by the sender of an #MRQ_FMON message to configure clock
2284  * frequency monitors. The FMON request is split into several
2285  * sub-commands. Some sub-commands require no additional data.
2286  * Others have a sub-command specific payload
2287  *
2288  * |sub-command                 |payload                |
2289  * |----------------------------|-----------------------|
2290  * |CMD_FMON_GEAR_CLAMP         |fmon_gear_clamp        |
2291  * |CMD_FMON_GEAR_FREE          |-                      |
2292  * |CMD_FMON_GEAR_GET           |-                      |
2293  *
2294  */
2295 
2296 struct mrq_fmon_request {
2297 	/** @brief Sub-command and clock id concatenated to 32-bit word.
2298 	 * - bits[31..24] is the sub-cmd.
2299 	 * - bits[23..0] is monitored clock id used to select target
2300 	 *   FMON
2301 	 */
2302 	uint32_t cmd_and_id;
2303 
2304 	union {
2305 		struct cmd_fmon_gear_clamp_request fmon_gear_clamp;
2306 		/** @private */
2307 		struct cmd_fmon_gear_free_request fmon_gear_free;
2308 		/** @private */
2309 		struct cmd_fmon_gear_get_request fmon_gear_get;
2310 	} __UNION_ANON;
2311 } __ABI_PACKED;
2312 
2313 /**
2314  * @ingroup FMON
2315  * @brief Response to MRQ_FMON
2316  *
2317  * Each sub-command supported by @ref mrq_fmon_request may
2318  * return sub-command-specific data as indicated below.
2319  *
2320  * |sub-command                 |payload                 |
2321  * |----------------------------|------------------------|
2322  * |CMD_FMON_GEAR_CLAMP         |-                       |
2323  * |CMD_FMON_GEAR_FREE          |-                       |
2324  * |CMD_FMON_GEAR_GET           |fmon_gear_get           |
2325  *
2326  */
2327 
2328 struct mrq_fmon_response {
2329 	union {
2330 		/** @private */
2331 		struct cmd_fmon_gear_clamp_response fmon_gear_clamp;
2332 		/** @private */
2333 		struct cmd_fmon_gear_free_response fmon_gear_free;
2334 		struct cmd_fmon_gear_get_response fmon_gear_get;
2335 	} __UNION_ANON;
2336 } __ABI_PACKED;
2337 
2338 /** @} */
2339 /** @endcond */
2340 
2341 /**
2342  * @ingroup MRQ_Codes
2343  * @def MRQ_EC
2344  * @brief Provide status information on faults reported by Error
2345  *        Collator (EC) to HSM.
2346  *
2347  * * Platforms: T194 onwards
2348  * @cond bpmp_t194
2349  * * Initiators: CCPLEX
2350  * * Targets: BPMP
2351  * * Request Payload: @ref mrq_ec_request
2352  * * Response Payload: @ref mrq_ec_response
2353  *
2354  * @note This MRQ ABI is under construction, and subject to change
2355  *
2356  * @addtogroup EC
2357  * @{
2358  */
2359 enum {
2360 	/**
2361 	 * @brief Retrieve specified EC status.
2362 	 *
2363 	 * mrq_response::err is 0 if the operation was successful, or @n
2364 	 * -#BPMP_ENODEV if target EC is not owned by BPMP @n
2365 	 * -#BPMP_EACCES if target EC power domain is turned off
2366 	 */
2367 	CMD_EC_STATUS_GET = 1,
2368 	CMD_EC_NUM,
2369 };
2370 
2371 /** @brief BPMP ECs error types */
2372 enum bpmp_ec_err_type {
2373 	/** @brief Parity error on internal data path
2374 	 *
2375 	 *  Error descriptor @ref ec_err_simple_desc.
2376 	 */
2377 	EC_ERR_TYPE_PARITY_INTERNAL		= 1,
2378 
2379 	/** @brief ECC SEC error on internal data path
2380 	 *
2381 	 *  Error descriptor @ref ec_err_simple_desc.
2382 	 */
2383 	EC_ERR_TYPE_ECC_SEC_INTERNAL		= 2,
2384 
2385 	/** @brief ECC DED error on internal data path
2386 	 *
2387 	 *  Error descriptor @ref ec_err_simple_desc.
2388 	 */
2389 	EC_ERR_TYPE_ECC_DED_INTERNAL		= 3,
2390 
2391 	/** @brief Comparator error
2392 	 *
2393 	 *  Error descriptor @ref ec_err_simple_desc.
2394 	 */
2395 	EC_ERR_TYPE_COMPARATOR			= 4,
2396 
2397 	/** @brief Register parity error
2398 	 *
2399 	 *  Error descriptor @ref ec_err_reg_parity_desc.
2400 	 */
2401 	EC_ERR_TYPE_REGISTER_PARITY		= 5,
2402 
2403 	/** @brief Parity error from on-chip SRAM/FIFO
2404 	 *
2405 	 *  Error descriptor @ref ec_err_simple_desc.
2406 	 */
2407 	EC_ERR_TYPE_PARITY_SRAM			= 6,
2408 
2409 	/** @brief Clock Monitor error
2410 	 *
2411 	 *  Error descriptor @ref ec_err_fmon_desc.
2412 	 */
2413 	EC_ERR_TYPE_CLOCK_MONITOR		= 9,
2414 
2415 	/** @brief Voltage Monitor error
2416 	 *
2417 	 *  Error descriptor @ref ec_err_vmon_desc.
2418 	 */
2419 	EC_ERR_TYPE_VOLTAGE_MONITOR		= 10,
2420 
2421 	/** @brief SW Correctable error
2422 	 *
2423 	 *  Error descriptor @ref ec_err_simple_desc.
2424 	 */
2425 	EC_ERR_TYPE_SW_CORRECTABLE		= 16,
2426 
2427 	/** @brief SW Uncorrectable error
2428 	 *
2429 	 *  Error descriptor @ref ec_err_simple_desc.
2430 	 */
2431 	EC_ERR_TYPE_SW_UNCORRECTABLE		= 17,
2432 
2433 	/** @brief Other HW Correctable error
2434 	 *
2435 	 *  Error descriptor @ref ec_err_simple_desc.
2436 	 */
2437 	EC_ERR_TYPE_OTHER_HW_CORRECTABLE	= 32,
2438 
2439 	/** @brief Other HW Uncorrectable error
2440 	 *
2441 	 *  Error descriptor @ref ec_err_simple_desc.
2442 	 */
2443 	EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE	= 33,
2444 };
2445 
2446 /** @brief Group of registers with parity error. */
2447 enum ec_registers_group {
2448 	/** @brief Functional registers group */
2449 	EC_ERR_GROUP_FUNC_REG		= 0,
2450 	/** @brief SCR registers group */
2451 	EC_ERR_GROUP_SCR_REG		= 1,
2452 };
2453 
2454 /**
2455  * @defgroup bpmp_ec_status_flags EC Status Flags
2456  * @addtogroup bpmp_ec_status_flags
2457  * @{
2458  */
2459 /** @brief No EC error found flag */
2460 #define EC_STATUS_FLAG_NO_ERROR		0x0001
2461 /** @brief Last EC error found flag */
2462 #define EC_STATUS_FLAG_LAST_ERROR	0x0002
2463 /** @brief EC latent error flag */
2464 #define EC_STATUS_FLAG_LATENT_ERROR	0x0004
2465 /** @} */
2466 
2467 /**
2468  * @defgroup bpmp_ec_desc_flags EC Descriptor Flags
2469  * @addtogroup bpmp_ec_desc_flags
2470  * @{
2471  */
2472 /** @brief EC descriptor error resolved flag */
2473 #define EC_DESC_FLAG_RESOLVED		0x0001
2474 /** @brief EC descriptor failed to retrieve id flag */
2475 #define EC_DESC_FLAG_NO_ID		0x0002
2476 /** @} */
2477 
2478 /**
2479  * |error type                       | fmon_clk_id values        |
2480  * |---------------------------------|---------------------------|
2481  * |@ref EC_ERR_TYPE_CLOCK_MONITOR   |@ref bpmp_clock_ids        |
2482  */
2483 struct ec_err_fmon_desc {
2484 	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
2485 	uint16_t desc_flags;
2486 	/** @brief FMON monitored clock id */
2487 	uint16_t fmon_clk_id;
2488 	/** @brief Bitmask of @ref bpmp_fmon_faults_flags */
2489 	uint32_t fmon_faults;
2490 	/** @brief FMON faults access error */
2491 	int32_t fmon_access_error;
2492 } __ABI_PACKED;
2493 
2494 /**
2495  * |error type                       | vmon_adc_id values        |
2496  * |---------------------------------|---------------------------|
2497  * |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids          |
2498  */
2499 struct ec_err_vmon_desc {
2500 	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
2501 	uint16_t desc_flags;
2502 	/** @brief VMON rail adc id */
2503 	uint16_t vmon_adc_id;
2504 	/** @brief Bitmask of @ref bpmp_vmon_faults_flags */
2505 	uint32_t vmon_faults;
2506 	/** @brief VMON faults access error */
2507 	int32_t vmon_access_error;
2508 } __ABI_PACKED;
2509 
2510 /**
2511  * |error type                       | reg_id values             |
2512  * |---------------------------------|---------------------------|
2513  * |@ref EC_ERR_TYPE_REGISTER_PARITY |@ref bpmp_ec_registers_ids |
2514  */
2515 struct ec_err_reg_parity_desc {
2516 	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
2517 	uint16_t desc_flags;
2518 	/** @brief Register id */
2519 	uint16_t reg_id;
2520 	/** @brief Register group @ref ec_registers_group */
2521 	uint16_t reg_group;
2522 } __ABI_PACKED;
2523 
2524 /**
2525  * |error type                              | err_source_id values      |
2526  * |----------------------------------------|---------------------------|
2527  * |@ref EC_ERR_TYPE_PARITY_INTERNAL        |@ref bpmp_ec_ipath_ids     |
2528  * |@ref EC_ERR_TYPE_ECC_SEC_INTERNAL       |@ref bpmp_ec_ipath_ids     |
2529  * |@ref EC_ERR_TYPE_ECC_DED_INTERNAL       |@ref bpmp_ec_ipath_ids     |
2530  * |@ref EC_ERR_TYPE_COMPARATOR             |@ref bpmp_ec_comparator_ids|
2531  * |@ref EC_ERR_TYPE_PARITY_SRAM            |@ref bpmp_clock_ids        |
2532  * |@ref EC_ERR_TYPE_SW_CORRECTABLE         |@ref bpmp_ec_misc_ids      |
2533  * |@ref EC_ERR_TYPE_SW_UNCORRECTABLE       |@ref bpmp_ec_misc_ids      |
2534  * |@ref EC_ERR_TYPE_OTHER_HW_CORRECTABLE   |@ref bpmp_ec_misc_ids      |
2535  * |@ref EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE |@ref bpmp_ec_misc_ids      |
2536  */
2537 struct ec_err_simple_desc {
2538 	/** @brief Bitmask of @ref bpmp_ec_desc_flags  */
2539 	uint16_t desc_flags;
2540 	/** @brief Error source id. Id space depends on error type. */
2541 	uint16_t err_source_id;
2542 } __ABI_PACKED;
2543 
2544 /** @brief Union of EC error descriptors */
2545 union ec_err_desc {
2546 	struct ec_err_fmon_desc fmon_desc;
2547 	struct ec_err_vmon_desc vmon_desc;
2548 	struct ec_err_reg_parity_desc reg_parity_desc;
2549 	struct ec_err_simple_desc simple_desc;
2550 } __ABI_PACKED;
2551 
2552 struct cmd_ec_status_get_request {
2553 	/** @brief HSM error line number that identifies target EC. */
2554 	uint32_t ec_hsm_id;
2555 } __ABI_PACKED;
2556 
2557 /** EC status maximum number of descriptors */
2558 #define EC_ERR_STATUS_DESC_MAX_NUM	4
2559 
2560 struct cmd_ec_status_get_response {
2561 	/** @brief Target EC id (the same id received with request). */
2562 	uint32_t ec_hsm_id;
2563 	/**
2564 	 * @brief Bitmask of @ref bpmp_ec_status_flags
2565 	 *
2566 	 * If NO_ERROR flag is set, error_ fields should be ignored
2567 	 */
2568 	uint32_t ec_status_flags;
2569 	/** @brief Found EC error index. */
2570 	uint32_t error_idx;
2571 	/** @brief  Found EC error type @ref bpmp_ec_err_type. */
2572 	uint32_t error_type;
2573 	/** @brief  Number of returned EC error descriptors */
2574 	uint32_t error_desc_num;
2575 	/** @brief  EC error descriptors */
2576 	union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM];
2577 } __ABI_PACKED;
2578 
2579 /**
2580  * @ingroup EC
2581  * @brief Request with #MRQ_EC
2582  *
2583  * Used by the sender of an #MRQ_EC message to access ECs owned
2584  * by BPMP.
2585  *
2586  * |sub-command                 |payload                |
2587  * |----------------------------|-----------------------|
2588  * |@ref CMD_EC_STATUS_GET      |ec_status_get          |
2589  *
2590  */
2591 
2592 struct mrq_ec_request {
2593 	/** @brief Sub-command id. */
2594 	uint32_t cmd_id;
2595 
2596 	union {
2597 		struct cmd_ec_status_get_request ec_status_get;
2598 	} __UNION_ANON;
2599 } __ABI_PACKED;
2600 
2601 /**
2602  * @ingroup EC
2603  * @brief Response to MRQ_EC
2604  *
2605  * Each sub-command supported by @ref mrq_ec_request may return
2606  * sub-command-specific data as indicated below.
2607  *
2608  * |sub-command                 |payload                 |
2609  * |----------------------------|------------------------|
2610  * |@ref CMD_EC_STATUS_GET      |ec_status_get           |
2611  *
2612  */
2613 
2614 struct mrq_ec_response {
2615 	union {
2616 		struct cmd_ec_status_get_response ec_status_get;
2617 	} __UNION_ANON;
2618 } __ABI_PACKED;
2619 
2620 /** @} */
2621 /** @endcond */
2622 
2623 /**
2624  * @ingroup MRQ_Codes
2625  * @def MRQ_FBVOLT_STATUS
2626  * @brief Provides status information about voltage state for fuse burning
2627  *
2628  * * Platforms: T194 onwards
2629  * @cond bpmp_t194
2630  * * Initiators: CCPLEX
2631  * * Target: BPMP
2632  * * Request Payload: None
2633  * * Response Payload: @ref mrq_fbvolt_status_response
2634  * @{
2635  */
2636 
2637 /**
2638  * @ingroup Fbvolt_status
2639  * @brief Response to #MRQ_FBVOLT_STATUS
2640  *
2641  * Value of #ready reflects if core voltages are in a suitable state for buring
2642  * fuses. A value of 0x1 indicates that core voltages are ready for burning
2643  * fuses. A value of 0x0 indicates that core voltages are not ready.
2644  */
2645 struct mrq_fbvolt_status_response {
2646 	/** @brief Bit [0:0] - ready status, bits [31:1] - reserved */
2647 	uint32_t ready;
2648 	/** @brief Reserved */
2649 	uint32_t unused;
2650 } __ABI_PACKED;
2651 
2652 /** @} */
2653 /** @endcond */
2654 
2655 /**
2656  * @addtogroup Error_Codes
2657  * Negative values for mrq_response::err generally indicate some
2658  * error. The ABI defines the following error codes. Negating these
2659  * defines is an exercise left to the user.
2660  * @{
2661  */
2662 
2663 /** @brief No such file or directory */
2664 #define BPMP_ENOENT	2
2665 /** @brief No MRQ handler */
2666 #define BPMP_ENOHANDLER	3
2667 /** @brief I/O error */
2668 #define BPMP_EIO	5
2669 /** @brief Bad sub-MRQ command */
2670 #define BPMP_EBADCMD	6
2671 /** @brief Not enough memory */
2672 #define BPMP_ENOMEM	12
2673 /** @brief Permission denied */
2674 #define BPMP_EACCES	13
2675 /** @brief Bad address */
2676 #define BPMP_EFAULT	14
2677 /** @brief No such device */
2678 #define BPMP_ENODEV	19
2679 /** @brief Argument is a directory */
2680 #define BPMP_EISDIR	21
2681 /** @brief Invalid argument */
2682 #define BPMP_EINVAL	22
2683 /** @brief Timeout during operation */
2684 #define BPMP_ETIMEDOUT  23
2685 /** @brief Out of range */
2686 #define BPMP_ERANGE	34
2687 /** @brief Function not implemented */
2688 #define  BPMP_ENOSYS	38
2689 /** @brief Invalid slot */
2690 #define BPMP_EBADSLT	57
2691 
2692 /** @} */
2693 
2694 #endif
2695