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