mtd: rawnand: sunxi: Add A23/A33 DMA support
[linux/fpc-iii.git] / include / soc / tegra / bpmp-abi.h
blobab7f8796a260dea1f1f9faabe1f8d181d82a2af3
1 /*
2 * Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved.
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.
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.
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/>.
17 #ifndef _ABI_BPMP_ABI_H_
18 #define _ABI_BPMP_ABI_H_
20 #ifdef LK
21 #include <stdint.h>
22 #endif
24 #ifndef __ABI_PACKED
25 #define __ABI_PACKED __attribute__((packed))
26 #endif
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
36 #ifndef __UNION_ANON
37 #define __UNION_ANON
38 #endif
39 /**
40 * @file
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 * @}
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.
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.
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 * @}
76 /**
77 * @ingroup MRQ_Format
78 * @brief Header for an MRQ message
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.
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
90 * | Bit | Description |
91 * |-----|--------------------------------------------|
92 * | 1 | ring the sender's doorbell when responding |
93 * | 0 | should be 1 |
95 uint32_t flags;
96 } __ABI_PACKED;
98 /**
99 * @ingroup MRQ_Format
100 * @brief Header for an MRQ response
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
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;
115 * @ingroup MRQ_Format
116 * Minimum needed size for an IPC message buffer
118 #define MSG_MIN_SZ 128
120 * @ingroup MRQ_Format
121 * Minimum size guaranteed for data in an IPC message buffer
123 #define MSG_DATA_MIN_SZ 120
126 * @ingroup MRQ_Codes
127 * @name Legal MRQ codes
128 * These are the legal values for mrq_request::mrq
129 * @{
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
163 /** @} */
166 * @ingroup MRQ_Codes
167 * @brief Maximum MRQ code to be sent by CPU software to
168 * BPMP. Subject to change in future
170 #define MAX_CPU_MRQ_ID 74
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 * @}
200 * @ingroup MRQ_Codes
201 * @def MRQ_PING
202 * @brief A simple ping
204 * * Platforms: All
205 * * Initiators: Any
206 * * Targets: Any
207 * * Request Payload: @ref mrq_ping_request
208 * * Response Payload: @ref mrq_ping_response
210 * @ingroup MRQ_Codes
211 * @def MRQ_THREADED_PING
212 * @brief A deeper ping
214 * * Platforms: All
215 * * Initiators: Any
216 * * Targets: BPMP
217 * * Request Payload: @ref mrq_ping_request
218 * * Response Payload: @ref mrq_ping_response
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).
227 * @ingroup Ping
228 * @brief Request with #MRQ_PING
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.
234 struct mrq_ping_request {
235 /** @brief Arbitrarily chosen value */
236 uint32_t challenge;
237 } __ABI_PACKED;
240 * @ingroup Ping
241 * @brief Response to #MRQ_PING
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.
248 struct mrq_ping_response {
249 /** @brief Response to the MRQ_PING challege */
250 uint32_t reply;
251 } __ABI_PACKED;
254 * @ingroup MRQ_Codes
255 * @def MRQ_QUERY_TAG
256 * @brief Query BPMP firmware's tag (i.e. unique identifer)
258 * @deprecated Use #MRQ_QUERY_FW_TAG instead.
260 * * Platforms: All
261 * * Initiators: CCPLEX
262 * * Targets: BPMP
263 * * Request Payload: @ref mrq_query_tag_request
264 * * Response Payload: N/A
269 * @ingroup Query_Tag
270 * @brief Request with #MRQ_QUERY_TAG
272 * @deprecated This structure will be removed in future version.
273 * Use MRQ_QUERY_FW_TAG instead.
275 struct mrq_query_tag_request {
276 /** @brief Base address to store the firmware tag */
277 uint32_t addr;
278 } __ABI_PACKED;
282 * @ingroup MRQ_Codes
283 * @def MRQ_QUERY_FW_TAG
284 * @brief Query BPMP firmware's tag (i.e. unique identifier)
286 * * Platforms: All
287 * * Initiators: Any
288 * * Targets: BPMP
289 * * Request Payload: N/A
290 * * Response Payload: @ref mrq_query_fw_tag_response
295 * @ingroup Query_Tag
296 * @brief Response to #MRQ_QUERY_FW_TAG
298 * Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique
299 * identifier for the version of firmware issuing the reply.
302 struct mrq_query_fw_tag_response {
303 /** @brief Array to store tag information */
304 uint8_t tag[32];
305 } __ABI_PACKED;
308 * @ingroup MRQ_Codes
309 * @def MRQ_MODULE_LOAD
310 * @brief Dynamically load a BPMP code module
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
319 * @note This MRQ is disabled on production systems
324 * @ingroup Module
325 * @brief Request with #MRQ_MODULE_LOAD
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.
331 * The recipient copies the code from #phys_addr to locally allocated
332 * memory prior to responding to this message.
334 * @todo document the module header format
336 * The sender is responsible for ensuring that the code is mapped in
337 * the recipient's address map.
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;
348 * @ingroup Module
349 * @brief Response to #MRQ_MODULE_LOAD
351 * @todo document mrq_response::err
353 struct mrq_module_load_response {
354 /** @brief Handle to the loaded module */
355 uint32_t base;
356 } __ABI_PACKED;
357 /** @endcond*/
360 * @ingroup MRQ_Codes
361 * @def MRQ_MODULE_UNLOAD
362 * @brief Unload a previously loaded code module
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
371 * @note This MRQ is disabled on production systems
375 * @ingroup Module
376 * @brief Request with #MRQ_MODULE_UNLOAD
378 * Used by #MRQ_MODULE_UNLOAD calls to request that a previously loaded
379 * module be unloaded.
381 struct mrq_module_unload_request {
382 /** @brief Handle of the module to unload */
383 uint32_t base;
384 } __ABI_PACKED;
385 /** @endcond*/
388 * @ingroup MRQ_Codes
389 * @def MRQ_TRACE_MODIFY
390 * @brief Modify the set of enabled trace events
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
398 * @note This MRQ is disabled on production systems
402 * @ingroup Trace
403 * @brief Request with #MRQ_TRACE_MODIFY
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.
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;
417 * @ingroup Trace
418 * @brief Response to #MRQ_TRACE_MODIFY
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.
425 struct mrq_trace_modify_response {
426 /** @brief Bit mask of trace event enable states */
427 uint32_t mask;
428 } __ABI_PACKED;
431 * @ingroup MRQ_Codes
432 * @def MRQ_WRITE_TRACE
433 * @brief Write trace data to a buffer
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
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.
446 * @note This MRQ is disabled on production systems
450 * @ingroup Trace
451 * @brief Request with #MRQ_WRITE_TRACE
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.
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.
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;
471 * @ingroup Trace
472 * @brief Response to #MRQ_WRITE_TRACE
474 * Once this response is sent, the respondent will not access the
475 * output buffer further.
477 struct mrq_write_trace_response {
479 * @brief Flag whether more data remains in local buffer
481 * Value is 1 if the entire local trace buffer has been
482 * drained to the outputbuffer. Value is 0 otherwise.
484 uint32_t eof;
485 } __ABI_PACKED;
487 /** @private */
488 struct mrq_threaded_ping_request {
489 uint32_t challenge;
490 } __ABI_PACKED;
492 /** @private */
493 struct mrq_threaded_ping_response {
494 uint32_t reply;
495 } __ABI_PACKED;
498 * @ingroup MRQ_Codes
499 * @def MRQ_MODULE_MAIL
500 * @brief Send a message to a loadable module
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
509 * @note This MRQ is disabled on production systems
513 * @ingroup Module
514 * @brief Request with #MRQ_MODULE_MAIL
516 struct mrq_module_mail_request {
517 /** @brief Handle to the previously loaded module */
518 uint32_t base;
519 /** @brief Module-specific mail payload
521 * The length of data[ ] is unknown to the BPMP core firmware
522 * but it is limited to the size of an IPC message.
524 uint8_t data[EMPTY_ARRAY];
525 } __ABI_PACKED;
528 * @ingroup Module
529 * @brief Response to #MRQ_MODULE_MAIL
531 struct mrq_module_mail_response {
532 /** @brief Module-specific mail payload
534 * The length of data[ ] is unknown to the BPMP core firmware
535 * but it is limited to the size of an IPC message.
537 uint8_t data[EMPTY_ARRAY];
538 } __ABI_PACKED;
539 /** @endcond */
542 * @ingroup MRQ_Codes
543 * @def MRQ_DEBUGFS
544 * @brief Interact with BPMP's debugfs file nodes
546 * * Platforms: T186, T194
547 * * Initiators: Any
548 * * Targets: BPMP
549 * * Request Payload: @ref mrq_debugfs_request
550 * * Response Payload: @ref mrq_debugfs_response
554 * @addtogroup Debugfs
555 * @{
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.
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.
573 * @}
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
589 * @ingroup Debugfs
590 * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
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;
604 * @ingroup Debugfs
605 * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
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;
615 * @ingroup Debugfs
616 * @brief Response data for CMD_DEBUGFS_READ/WRITE command
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;
626 * @ingroup Debugfs
627 * @brief Response data for CMD_DEBUGFS_DUMPDIR command
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;
637 * @ingroup Debugfs
638 * @brief Request with #MRQ_DEBUGFS.
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.
645 * |command |payload|
646 * |-------------------|-------|
647 * |CMD_DEBUGFS_READ |fop |
648 * |CMD_DEBUGFS_WRITE |fop |
649 * |CMD_DEBUGFS_DUMPDIR|dumpdir|
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;
661 * @ingroup Debugfs
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
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;
677 * @addtogroup Debugfs
678 * @{
680 #define DEBUGFS_S_ISDIR (1 << 9)
681 #define DEBUGFS_S_IRUSR (1 << 8)
682 #define DEBUGFS_S_IWUSR (1 << 7)
683 /** @} */
686 * @ingroup MRQ_Codes
687 * @def MRQ_RESET
688 * @brief Reset an IP block
690 * * Platforms: T186, T194
691 * * Initiators: Any
692 * * Targets: BPMP
693 * * Request Payload: @ref mrq_reset_request
694 * * Response Payload: @ref mrq_reset_response
696 * @addtogroup Reset
697 * @{
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,
714 * @brief Request with MRQ_RESET
716 * Used by the sender of an #MRQ_RESET message to request BPMP to
717 * assert or or deassert a given reset line.
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;
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.
731 struct cmd_reset_get_max_id_response {
732 /** @brief Max reset id */
733 uint32_t max_id;
734 } __ABI_PACKED;
737 * @brief Response with MRQ_RESET
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
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 |
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;
756 /** @} */
759 * @ingroup MRQ_Codes
760 * @def MRQ_I2C
761 * @brief Issue an i2c transaction
763 * * Platforms: T186, T194
764 * * Initiators: Any
765 * * Targets: BPMP
766 * * Request Payload: @ref mrq_i2c_request
767 * * Response Payload: @ref mrq_i2c_response
769 * @addtogroup I2C
770 * @{
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)
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
784 enum {
785 CMD_I2C_XFER = 1
789 * @brief Serializable i2c request
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.
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.
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;
815 * @brief Trigger one or more i2c transactions
817 struct cmd_i2c_xfer_request {
818 /** @brief Valid bus number from @ref bpmp_i2c_ids*/
819 uint32_t bus_id;
821 /** @brief Count of valid bytes in #data_buf*/
822 uint32_t data_size;
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;
829 * @brief Container for data read from the i2c bus
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.
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;
843 * @brief Request with #MRQ_I2C
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;
853 * @brief Response to #MRQ_I2C
855 struct mrq_i2c_response {
856 struct cmd_i2c_xfer_response xfer;
857 } __ABI_PACKED;
859 /** @} */
862 * @ingroup MRQ_Codes
863 * @def MRQ_CLK
864 * @brief Perform a clock operation
866 * * Platforms: T186, T194
867 * * Initiators: Any
868 * * Targets: BPMP
869 * * Request Payload: @ref mrq_clk_request
870 * * Response Payload: @ref mrq_clk_response
872 * @addtogroup Clocks
873 * @{
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,
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)
894 #define MRQ_CLK_NAME_MAXLEN 40
895 #define MRQ_CLK_MAX_PARENTS 16
897 /** @private */
898 struct cmd_clk_get_rate_request {
899 EMPTY
900 } __ABI_PACKED;
902 struct cmd_clk_get_rate_response {
903 int64_t rate;
904 } __ABI_PACKED;
906 struct cmd_clk_set_rate_request {
907 int32_t unused;
908 int64_t rate;
909 } __ABI_PACKED;
911 struct cmd_clk_set_rate_response {
912 int64_t rate;
913 } __ABI_PACKED;
915 struct cmd_clk_round_rate_request {
916 int32_t unused;
917 int64_t rate;
918 } __ABI_PACKED;
920 struct cmd_clk_round_rate_response {
921 int64_t rate;
922 } __ABI_PACKED;
924 /** @private */
925 struct cmd_clk_get_parent_request {
926 EMPTY
927 } __ABI_PACKED;
929 struct cmd_clk_get_parent_response {
930 uint32_t parent_id;
931 } __ABI_PACKED;
933 struct cmd_clk_set_parent_request {
934 uint32_t parent_id;
935 } __ABI_PACKED;
937 struct cmd_clk_set_parent_response {
938 uint32_t parent_id;
939 } __ABI_PACKED;
941 /** @private */
942 struct cmd_clk_is_enabled_request {
943 EMPTY
944 } __ABI_PACKED;
946 struct cmd_clk_is_enabled_response {
947 int32_t state;
948 } __ABI_PACKED;
950 /** @private */
951 struct cmd_clk_enable_request {
952 EMPTY
953 } __ABI_PACKED;
955 /** @private */
956 struct cmd_clk_enable_response {
957 EMPTY
958 } __ABI_PACKED;
960 /** @private */
961 struct cmd_clk_disable_request {
962 EMPTY
963 } __ABI_PACKED;
965 /** @private */
966 struct cmd_clk_disable_response {
967 EMPTY
968 } __ABI_PACKED;
970 /** @private */
971 struct cmd_clk_get_all_info_request {
972 EMPTY
973 } __ABI_PACKED;
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;
983 /** @private */
984 struct cmd_clk_get_max_clk_id_request {
985 EMPTY
986 } __ABI_PACKED;
988 struct cmd_clk_get_max_clk_id_response {
989 uint32_t max_id;
990 } __ABI_PACKED;
992 /** @private */
993 struct cmd_clk_get_fmax_at_vmin_request {
994 EMPTY
995 } __ABI_PACKED;
997 struct cmd_clk_get_fmax_at_vmin_response {
998 int64_t rate;
999 } __ABI_PACKED;
1002 * @ingroup Clocks
1003 * @brief Request with #MRQ_CLK
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
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 |-
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
1032 uint32_t cmd_and_id;
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;
1058 * @ingroup Clocks
1059 * @brief Response to MRQ_CLK
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
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 |
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;
1099 /** @} */
1102 * @ingroup MRQ_Codes
1103 * @def MRQ_QUERY_ABI
1104 * @brief Check if an MRQ is implemented
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
1114 * @ingroup ABI_info
1115 * @brief Request with MRQ_QUERY_ABI
1117 * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
1118 * by the recipient.
1120 struct mrq_query_abi_request {
1121 /** @brief MRQ code to query */
1122 uint32_t mrq;
1123 } __ABI_PACKED;
1126 * @ingroup ABI_info
1127 * @brief Response to MRQ_QUERY_ABI
1129 * @note mrq_response::err of 0 indicates that the query was
1130 * successful, not that the MRQ itself is supported!
1132 struct mrq_query_abi_response {
1133 /** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
1134 int32_t status;
1135 } __ABI_PACKED;
1138 * @ingroup MRQ_Codes
1139 * @def MRQ_PG_READ_STATE
1140 * @brief Read the power-gating state of a partition
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
1151 * @ingroup Powergating
1152 * @brief Request with #MRQ_PG_READ_STATE
1154 * Used by MRQ_PG_READ_STATE call to read the current state of a
1155 * partition.
1157 struct mrq_pg_read_state_request {
1158 /** @brief ID of partition */
1159 uint32_t partition_id;
1160 } __ABI_PACKED;
1163 * @ingroup Powergating
1164 * @brief Response to MRQ_PG_READ_STATE
1165 * @todo define possible errors.
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
1174 uint32_t logic_state;
1175 } __ABI_PACKED;
1176 /** @endcond*/
1177 /** @} */
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.
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
1195 * @ingroup Powergating
1196 * @brief Request with mrq_pg_update_state_request
1198 * Used by #MRQ_PG_UPDATE_STATE call to request BPMP to change the
1199 * state of a power partition #partition_id.
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)
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
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)
1224 uint32_t clock_state;
1225 } __ABI_PACKED;
1226 /** @endcond*/
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
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.
1240 * * Platforms: T186, T194
1241 * * Initiators: Any
1242 * * Targets: BPMP
1243 * * Request Payload: @ref mrq_pg_request
1244 * * Response Payload: @ref mrq_pg_response
1246 * @addtogroup Powergating
1247 * @{
1249 enum mrq_pg_cmd {
1251 * @brief Check whether the BPMP driver supports the specified
1252 * request type
1254 * mrq_response::err is 0 if the specified request is
1255 * supported and -#BPMP_ENODEV otherwise.
1257 CMD_PG_QUERY_ABI = 0,
1260 * @brief Set the current state of specified power domain. The
1261 * possible values for power domains are defined in enum
1262 * pg_states
1264 * mrq_response:err is
1265 * 0: Success
1266 * -#BPMP_EINVAL: Invalid request parameters
1268 CMD_PG_SET_STATE = 1,
1271 * @brief Get the current state of specified power domain. The
1272 * possible values for power domains are defined in enum
1273 * pg_states
1275 * mrq_response:err is
1276 * 0: Success
1277 * -#BPMP_EINVAL: Invalid request parameters
1279 CMD_PG_GET_STATE = 2,
1282 * @brief Get the name string of specified power domain id.
1284 * mrq_response:err is
1285 * 0: Success
1286 * -#BPMP_EINVAL: Invalid request parameters
1288 CMD_PG_GET_NAME = 3,
1292 * @brief Get the highest power domain id in the system. Not
1293 * all IDs between 0 and max_id are valid IDs.
1295 * mrq_response:err is
1296 * 0: Success
1297 * -#BPMP_EINVAL: Invalid request parameters
1299 CMD_PG_GET_MAX_ID = 4,
1302 #define MRQ_PG_NAME_MAXLEN 40
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,
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.
1315 PG_STATE_RUNNING = 2,
1318 struct cmd_pg_query_abi_request {
1319 /** @ref mrq_pg_cmd */
1320 uint32_t type;
1321 } __ABI_PACKED;
1323 struct cmd_pg_set_state_request {
1324 /** @ref pg_states */
1325 uint32_t state;
1326 } __ABI_PACKED;
1328 struct cmd_pg_get_state_response {
1329 /** @ref pg_states */
1330 uint32_t state;
1331 } __ABI_PACKED;
1333 struct cmd_pg_get_name_response {
1334 uint8_t name[MRQ_PG_NAME_MAXLEN];
1335 } __ABI_PACKED;
1337 struct cmd_pg_get_max_id_response {
1338 uint32_t max_id;
1339 } __ABI_PACKED;
1342 * @brief Request with #MRQ_PG
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
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 | - |
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;
1368 * @brief Response to MRQ_PG
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
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 |
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;
1390 /** @} */
1393 * @ingroup MRQ_Codes
1394 * @def MRQ_THERMAL
1395 * @brief Interact with BPMP thermal framework
1397 * * Platforms: T186, T194
1398 * * Initiators: Any
1399 * * Targets: Any
1400 * * Request Payload: TODO
1401 * * Response Payload: TODO
1403 * @addtogroup Thermal
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.
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.
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 * @{
1425 enum mrq_thermal_host_to_bpmp_cmd {
1427 * @brief Check whether the BPMP driver supports the specified
1428 * request type.
1430 * Host needs to supply request parameters.
1432 * mrq_response::err is 0 if the specified request is
1433 * supported and -#BPMP_ENODEV otherwise.
1435 CMD_THERMAL_QUERY_ABI = 0,
1438 * @brief Get the current temperature of the specified zone.
1440 * Host needs to supply request parameters.
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.
1448 CMD_THERMAL_GET_TEMP = 1,
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.
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
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.
1466 CMD_THERMAL_SET_TRIP = 2,
1469 * @brief Get the number of supported thermal zones.
1471 * No request parameters required.
1473 * mrq_response::err is always 0, indicating success.
1475 CMD_THERMAL_GET_NUM_ZONES = 3,
1477 /** @brief: number of supported host-to-bpmp commands. May
1478 * increase in future
1480 CMD_THERMAL_HOST_TO_BPMP_NUM
1483 enum mrq_thermal_bpmp_to_host_cmd {
1485 * @brief Indication that the temperature for a zone has
1486 * exceeded the range indicated in the thermal trip point
1487 * for the zone.
1489 * BPMP needs to supply request parameters. Host only needs to
1490 * acknowledge.
1492 CMD_THERMAL_HOST_TRIP_REACHED = 100,
1494 /** @brief: number of supported bpmp-to-host commands. May
1495 * increase in future
1497 CMD_THERMAL_BPMP_TO_HOST_NUM
1501 * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
1503 * zone: Request type for which to check existence.
1505 struct cmd_thermal_query_abi_request {
1506 uint32_t type;
1507 } __ABI_PACKED;
1510 * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
1512 * zone: Number of thermal zone.
1514 struct cmd_thermal_get_temp_request {
1515 uint32_t zone;
1516 } __ABI_PACKED;
1519 * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
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.
1527 struct cmd_thermal_get_temp_response {
1528 int32_t temp;
1529 } __ABI_PACKED;
1532 * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
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
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;
1547 * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
1549 * zone: Number of thermal zone where trip point was reached.
1551 struct cmd_thermal_host_trip_reached_request {
1552 uint32_t zone;
1553 } __ABI_PACKED;
1556 * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
1558 * num: Number of supported thermal zones. The thermal zones are indexed
1559 * starting from zero.
1561 struct cmd_thermal_get_num_zones_response {
1562 uint32_t num;
1563 } __ABI_PACKED;
1566 * Host->BPMP request data.
1568 * Reply type is union mrq_thermal_bpmp_to_host_response.
1570 * type: Type of request. Values listed in enum mrq_thermal_type.
1571 * data: Request type specific parameters.
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;
1583 * BPMP->Host request data.
1585 * type: Type of request. Values listed in enum mrq_thermal_type.
1586 * data: Request type specific parameters.
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;
1596 * Data in reply to a Host->BPMP request.
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 /** @} */
1605 * @ingroup MRQ_Codes
1606 * @def MRQ_CPU_VHINT
1607 * @brief Query CPU voltage hint data
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
1616 * @addtogroup Vhint
1617 * @{
1621 * @brief Request with #MRQ_CPU_VHINT
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.
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;
1636 * @brief Description of the CPU v/f relation
1638 * Used by #MRQ_CPU_VHINT call to carry data pointed by
1639 * #mrq_cpu_vhint_request::addr
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 /** @} */
1665 * @ingroup MRQ_Codes
1666 * @def MRQ_ABI_RATCHET
1667 * @brief ABI ratchet value query
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 * @{
1679 * @brief An ABI compatibility mechanism
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.
1690 #define BPMP_ABI_RATCHET_VALUE 3
1693 * @brief Request with #MRQ_ABI_RATCHET.
1695 * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
1696 * against which the requester was compiled.
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.
1703 * Otherwise, err shall be 0.
1705 struct mrq_abi_ratchet_request {
1706 /** @brief Requester's ratchet value */
1707 uint16_t ratchet;
1711 * @brief Response to #MRQ_ABI_RATCHET
1713 * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
1714 * against which BPMP firwmare was compiled.
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.
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.
1725 struct mrq_abi_ratchet_response {
1726 /** @brief BPMP's ratchet value */
1727 uint16_t ratchet;
1729 /** @} */
1732 * @ingroup MRQ_Codes
1733 * @def MRQ_EMC_DVFS_LATENCY
1734 * @brief Query frequency dependent EMC DVFS latency
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 * @{
1746 * @brief Used by @ref mrq_emc_dvfs_latency_response
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;
1755 #define EMC_DVFS_LATENCY_MAX_SIZE 14
1757 * @brief Response to #MRQ_EMC_DVFS_LATENCY
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;
1766 /** @} */
1769 * @ingroup MRQ_Codes
1770 * @def MRQ_CPU_NDIV_LIMITS
1771 * @brief CPU freq. limits in ndiv
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 * @{
1784 * @brief Request for ndiv limits of a cluster
1786 struct mrq_cpu_ndiv_limits_request {
1787 /** @brief Enum cluster_id */
1788 uint32_t cluster_id;
1789 } __ABI_PACKED;
1792 * @brief Response to #MRQ_CPU_NDIV_LIMITS
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;
1807 /** @} */
1808 /** @endcond */
1811 * @ingroup MRQ_Codes
1812 * @def MRQ_CPU_AUTO_CC3
1813 * @brief Query CPU cluster auto-CC3 configuration
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
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.
1828 * @{
1832 * @brief Request for auto-CC3 configuration of a cluster
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;
1840 * @brief Response to #MRQ_CPU_AUTO_CC3
1842 struct mrq_cpu_auto_cc3_response {
1844 * @brief auto-CC3 configuration
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
1850 uint32_t auto_cc3_config;
1851 } __ABI_PACKED;
1853 /** @} */
1854 /** @endcond */
1857 * @ingroup MRQ_Codes
1858 * @def MRQ_TRACE_ITER
1859 * @brief Manage the trace iterator
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 * @{
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
1877 * @brief Request with #MRQ_TRACE_ITER
1879 struct mrq_trace_iter_request {
1880 /** @brief TRACE_ITER_INIT or TRACE_ITER_CLEAN */
1881 uint32_t cmd;
1882 } __ABI_PACKED;
1884 /** @} */
1887 * @ingroup MRQ_Codes
1888 * @def MRQ_RINGBUF_CONSOLE
1889 * @brief A ring buffer debug console for BPMP
1890 * @addtogroup RingbufConsole
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.
1897 * @{
1901 * @brief Maximum number of bytes transferred in a single write command to the
1902 * BPMP
1904 * This is determined by the number of free bytes in the message struct,
1905 * rounded down to a multiple of four.
1907 #define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112
1910 * @brief Maximum number of bytes transferred in a single read command to the
1911 * BPMP
1913 * This is determined by the number of free bytes in the message struct,
1914 * rounded down to a multiple of four.
1916 #define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116
1918 enum mrq_ringbuf_console_host_to_bpmp_cmd {
1920 * @brief Check whether the BPMP driver supports the specified request
1921 * type
1923 * mrq_response::err is 0 if the specified request is supported and
1924 * -#BPMP_ENODEV otherwise
1926 CMD_RINGBUF_CONSOLE_QUERY_ABI = 0,
1928 * @brief Perform a read operation on the BPMP TX buffer
1930 * mrq_response::err is 0
1932 CMD_RINGBUF_CONSOLE_READ = 1,
1934 * @brief Perform a write operation on the BPMP RX buffer
1936 * mrq_response::err is 0 if the operation was successful and
1937 * -#BPMP_ENODEV otherwise
1939 CMD_RINGBUF_CONSOLE_WRITE = 2,
1941 * @brief Get the length of the buffer and the physical addresses of
1942 * the buffer data and the head and tail counters
1944 * mrq_response::err is 0 if the operation was successful and
1945 * -#BPMP_ENODEV otherwise
1947 CMD_RINGBUF_CONSOLE_GET_FIFO = 3,
1951 * @ingroup RingbufConsole
1952 * @brief Host->BPMP request data for request type
1953 * #CMD_RINGBUF_CONSOLE_QUERY_ABI
1955 struct cmd_ringbuf_console_query_abi_req {
1956 /** @brief Command identifier to be queried */
1957 uint32_t cmd;
1958 } __ABI_PACKED;
1960 /** @private */
1961 struct cmd_ringbuf_console_query_abi_resp {
1962 EMPTY
1963 } __ABI_PACKED;
1966 * @ingroup RingbufConsole
1967 * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ
1969 struct cmd_ringbuf_console_read_req {
1971 * @brief Number of bytes requested to be read from the BPMP TX buffer
1973 uint8_t len;
1974 } __ABI_PACKED;
1977 * @ingroup RingbufConsole
1978 * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ
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;
1988 * @ingroup RingbufConsole
1989 * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE
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;
1999 * @ingroup RingbufConsole
2000 * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE
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;
2009 /** @private */
2010 struct cmd_ringbuf_console_get_fifo_req {
2011 EMPTY
2012 } __ABI_PACKED;
2015 * @ingroup RingbufConsole
2016 * @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO
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;
2030 * @ingroup RingbufConsole
2031 * @brief Host->BPMP request data.
2033 * Reply type is union #mrq_ringbuf_console_bpmp_to_host_response .
2035 struct mrq_ringbuf_console_host_to_bpmp_request {
2037 * @brief Type of request. Values listed in enum
2038 * #mrq_ringbuf_console_host_to_bpmp_cmd.
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;
2051 * @ingroup RingbufConsole
2052 * @brief Host->BPMP reply data
2054 * In response to struct #mrq_ringbuf_console_host_to_bpmp_request.
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 /** @} */
2065 * @ingroup MRQ_Codes
2066 * @def MRQ_STRAP
2067 * @brief Set a strap value controlled by BPMP
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
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.
2083 * BPMP owns registers which act as straps to various units. It
2084 * exposes limited control of those straps via #MRQ_STRAP.
2086 * @{
2088 enum mrq_strap_cmd {
2089 /** @private */
2090 STRAP_RESERVED = 0,
2091 /** @brief Set a strap value */
2092 STRAP_SET = 1
2096 * @brief Request with #MRQ_STRAP
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;
2108 * @defgroup Strap_Ids Strap Identifiers
2109 * @}
2111 /** @endcond */
2114 * @ingroup MRQ_Codes
2115 * @def MRQ_UPHY
2116 * @brief Perform a UPHY operation
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
2125 * @addtogroup UPHY
2126 * @{
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,
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;
2149 struct cmd_uphy_margin_status_response {
2150 /** @brief Number of errors observed */
2151 uint32_t status;
2152 } __ABI_PACKED;
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;
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;
2166 * @ingroup UPHY
2167 * @brief Request with #MRQ_UPHY
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
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 |
2182 struct mrq_uphy_request {
2183 /** @brief Lane number. */
2184 uint16_t lane;
2185 /** @brief Sub-command id. */
2186 uint16_t cmd;
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;
2196 * @ingroup UPHY
2197 * @brief Response to MRQ_UPHY
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
2203 * |sub-command |payload |
2204 * |---------------------------- |------------------------|
2205 * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | |
2206 * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS |uphy_get_margin_status |
2210 struct mrq_uphy_response {
2211 union {
2212 struct cmd_uphy_margin_status_response uphy_get_margin_status;
2213 } __UNION_ANON;
2214 } __ABI_PACKED;
2216 /** @} */
2217 /** @endcond */
2220 * @ingroup MRQ_Codes
2221 * @def MRQ_FMON
2222 * @brief Perform a frequency monitor configuration operations
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
2231 * @addtogroup FMON
2232 * @{
2234 enum {
2236 * @brief Clamp FMON configuration to specified rate.
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.
2242 CMD_FMON_GEAR_CLAMP = 1,
2244 * @brief Release clamped FMON configuration.
2246 * Allow FMON configuration to follow monitored clock rate
2247 * and/or state changes.
2249 CMD_FMON_GEAR_FREE = 2,
2251 * @brief Return rate FMON is clamped at, or 0 if FMON is not
2252 * clamped.
2254 * Inherently racy, since clamp state can be changed
2255 * concurrently. Useful for testing.
2257 CMD_FMON_GEAR_GET = 3,
2258 CMD_FMON_NUM,
2261 struct cmd_fmon_gear_clamp_request {
2262 int32_t unused;
2263 int64_t rate;
2264 } __ABI_PACKED;
2266 /** @private */
2267 struct cmd_fmon_gear_clamp_response {
2268 EMPTY
2269 } __ABI_PACKED;
2271 /** @private */
2272 struct cmd_fmon_gear_free_request {
2273 EMPTY
2274 } __ABI_PACKED;
2276 /** @private */
2277 struct cmd_fmon_gear_free_response {
2278 EMPTY
2279 } __ABI_PACKED;
2281 /** @private */
2282 struct cmd_fmon_gear_get_request {
2283 EMPTY
2284 } __ABI_PACKED;
2286 struct cmd_fmon_gear_get_response {
2287 int64_t rate;
2288 } __ABI_PACKED;
2291 * @ingroup FMON
2292 * @brief Request with #MRQ_FMON
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
2299 * |sub-command |payload |
2300 * |----------------------------|-----------------------|
2301 * |CMD_FMON_GEAR_CLAMP |fmon_gear_clamp |
2302 * |CMD_FMON_GEAR_FREE |- |
2303 * |CMD_FMON_GEAR_GET |- |
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
2313 uint32_t cmd_and_id;
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;
2325 * @ingroup FMON
2326 * @brief Response to MRQ_FMON
2328 * Each sub-command supported by @ref mrq_fmon_request may
2329 * return sub-command-specific data as indicated below.
2331 * |sub-command |payload |
2332 * |----------------------------|------------------------|
2333 * |CMD_FMON_GEAR_CLAMP |- |
2334 * |CMD_FMON_GEAR_FREE |- |
2335 * |CMD_FMON_GEAR_GET |fmon_gear_get |
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;
2349 /** @} */
2350 /** @endcond */
2353 * @ingroup MRQ_Codes
2354 * @def MRQ_EC
2355 * @brief Provide status information on faults reported by Error
2356 * Collator (EC) to HSM.
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
2365 * @note This MRQ ABI is under construction, and subject to change
2367 * @addtogroup EC
2368 * @{
2370 enum {
2372 * @brief Retrieve specified EC status.
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
2378 CMD_EC_STATUS_GET = 1,
2379 CMD_EC_NUM,
2382 /** @brief BPMP ECs error types */
2383 enum bpmp_ec_err_type {
2384 /** @brief Parity error on internal data path
2386 * Error descriptor @ref ec_err_simple_desc.
2388 EC_ERR_TYPE_PARITY_INTERNAL = 1,
2390 /** @brief ECC SEC error on internal data path
2392 * Error descriptor @ref ec_err_simple_desc.
2394 EC_ERR_TYPE_ECC_SEC_INTERNAL = 2,
2396 /** @brief ECC DED error on internal data path
2398 * Error descriptor @ref ec_err_simple_desc.
2400 EC_ERR_TYPE_ECC_DED_INTERNAL = 3,
2402 /** @brief Comparator error
2404 * Error descriptor @ref ec_err_simple_desc.
2406 EC_ERR_TYPE_COMPARATOR = 4,
2408 /** @brief Register parity error
2410 * Error descriptor @ref ec_err_reg_parity_desc.
2412 EC_ERR_TYPE_REGISTER_PARITY = 5,
2414 /** @brief Parity error from on-chip SRAM/FIFO
2416 * Error descriptor @ref ec_err_simple_desc.
2418 EC_ERR_TYPE_PARITY_SRAM = 6,
2420 /** @brief Clock Monitor error
2422 * Error descriptor @ref ec_err_fmon_desc.
2424 EC_ERR_TYPE_CLOCK_MONITOR = 9,
2426 /** @brief Voltage Monitor error
2428 * Error descriptor @ref ec_err_vmon_desc.
2430 EC_ERR_TYPE_VOLTAGE_MONITOR = 10,
2432 /** @brief SW Correctable error
2434 * Error descriptor @ref ec_err_simple_desc.
2436 EC_ERR_TYPE_SW_CORRECTABLE = 16,
2438 /** @brief SW Uncorrectable error
2440 * Error descriptor @ref ec_err_simple_desc.
2442 EC_ERR_TYPE_SW_UNCORRECTABLE = 17,
2444 /** @brief Other HW Correctable error
2446 * Error descriptor @ref ec_err_simple_desc.
2448 EC_ERR_TYPE_OTHER_HW_CORRECTABLE = 32,
2450 /** @brief Other HW Uncorrectable error
2452 * Error descriptor @ref ec_err_simple_desc.
2454 EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE = 33,
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,
2466 * @defgroup bpmp_ec_status_flags EC Status Flags
2467 * @addtogroup bpmp_ec_status_flags
2468 * @{
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 /** @} */
2479 * @defgroup bpmp_ec_desc_flags EC Descriptor Flags
2480 * @addtogroup bpmp_ec_desc_flags
2481 * @{
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 /** @} */
2490 * |error type | fmon_clk_id values |
2491 * |---------------------------------|---------------------------|
2492 * |@ref EC_ERR_TYPE_CLOCK_MONITOR |@ref bpmp_clock_ids |
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;
2506 * |error type | vmon_adc_id values |
2507 * |---------------------------------|---------------------------|
2508 * |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids |
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;
2522 * |error type | reg_id values |
2523 * |---------------------------------|---------------------------|
2524 * |@ref EC_ERR_TYPE_REGISTER_PARITY |@ref bpmp_ec_registers_ids |
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;
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 |
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;
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;
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;
2568 /** EC status maximum number of descriptors */
2569 #define EC_ERR_STATUS_DESC_MAX_NUM 4
2571 struct cmd_ec_status_get_response {
2572 /** @brief Target EC id (the same id received with request). */
2573 uint32_t ec_hsm_id;
2575 * @brief Bitmask of @ref bpmp_ec_status_flags
2577 * If NO_ERROR flag is set, error_ fields should be ignored
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;
2591 * @ingroup EC
2592 * @brief Request with #MRQ_EC
2594 * Used by the sender of an #MRQ_EC message to access ECs owned
2595 * by BPMP.
2597 * |sub-command |payload |
2598 * |----------------------------|-----------------------|
2599 * |@ref CMD_EC_STATUS_GET |ec_status_get |
2603 struct mrq_ec_request {
2604 /** @brief Sub-command id. */
2605 uint32_t cmd_id;
2607 union {
2608 struct cmd_ec_status_get_request ec_status_get;
2609 } __UNION_ANON;
2610 } __ABI_PACKED;
2613 * @ingroup EC
2614 * @brief Response to MRQ_EC
2616 * Each sub-command supported by @ref mrq_ec_request may return
2617 * sub-command-specific data as indicated below.
2619 * |sub-command |payload |
2620 * |----------------------------|------------------------|
2621 * |@ref CMD_EC_STATUS_GET |ec_status_get |
2625 struct mrq_ec_response {
2626 union {
2627 struct cmd_ec_status_get_response ec_status_get;
2628 } __UNION_ANON;
2629 } __ABI_PACKED;
2631 /** @} */
2632 /** @endcond */
2635 * @ingroup MRQ_Codes
2636 * @def MRQ_FBVOLT_STATUS
2637 * @brief Provides status information about voltage state for fuse burning
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 * @{
2649 * @ingroup Fbvolt_status
2650 * @brief Response to #MRQ_FBVOLT_STATUS
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.
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;
2663 /** @} */
2664 /** @endcond */
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 * @{
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
2703 /** @} */
2705 #endif