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
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_
25 #define __ABI_PACKED __attribute__((packed))
28 #ifdef NO_GCC_EXTENSIONS
29 #define EMPTY char empty;
44 * @defgroup MRQ MRQ Messages
45 * @brief Messages sent to/from BPMP via IPC
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
55 * @addtogroup MRQ_Format
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.
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.
85 /** @brief MRQ number of the request */
88 * @brief Flags providing follow up directions to the receiver
90 * | Bit | Description |
91 * |-----|--------------------------------------------|
92 * | 1 | ring the sender's doorbell when responding |
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
107 struct mrq_response
{
108 /** @brief Error code for the MRQ request itself */
110 /** @brief Reserved for future use */
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
127 * @name Legal MRQ codes
128 * These are the legal values for mrq_request::mrq
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
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
154 #define MRQ_CPU_NDIV_LIMITS 67
157 #define MRQ_CPU_AUTO_CC3 70
158 #define MRQ_QUERY_FW_TAG 71
161 #define MRQ_FBVOLT_STATUS 74
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
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
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
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
195 * @defgroup Fbvolt_status Fuse Burn Voltage Status
202 * @brief A simple ping
207 * * Request Payload: @ref mrq_ping_request
208 * * Response Payload: @ref mrq_ping_response
211 * @def MRQ_THREADED_PING
212 * @brief A deeper ping
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
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
234 struct mrq_ping_request
{
235 /** @brief Arbitrarily chosen value */
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
248 struct mrq_ping_response
{
249 /** @brief Response to the MRQ_PING challege */
256 * @brief Query BPMP firmware's tag (i.e. unique identifer)
258 * @deprecated Use #MRQ_QUERY_FW_TAG instead.
261 * * Initiators: CCPLEX
263 * * Request Payload: @ref mrq_query_tag_request
264 * * Response Payload: N/A
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 */
283 * @def MRQ_QUERY_FW_TAG
284 * @brief Query BPMP firmware's tag (i.e. unique identifier)
289 * * Request Payload: N/A
290 * * Response Payload: @ref mrq_query_fw_tag_response
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 */
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
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
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 */
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 */
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
368 * * Request Payload: @ref mrq_module_unload_request
369 * * Response Payload: N/A
371 * @note This MRQ is disabled on production systems
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 */
389 * @def MRQ_TRACE_MODIFY
390 * @brief Modify the set of enabled trace events
393 * * Initiators: CCPLEX
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
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
409 struct mrq_trace_modify_request
{
410 /** @brief Bit mask of trace events to disable */
412 /** @brief Bit mask of trace events to enable */
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
425 struct mrq_trace_modify_response
{
426 /** @brief Bit mask of trace event enable states */
432 * @def MRQ_WRITE_TRACE
433 * @brief Write trace data to a buffer
436 * * Initiators: CCPLEX
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
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
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
463 struct mrq_write_trace_request
{
464 /** @brief Base address of output buffer */
466 /** @brief Size in bytes of the output buffer */
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.
488 struct mrq_threaded_ping_request
{
493 struct mrq_threaded_ping_response
{
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)
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
514 * @brief Request with #MRQ_MODULE_MAIL
516 struct mrq_module_mail_request
{
517 /** @brief Handle to the previously loaded module */
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
];
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
];
544 * @brief Interact with BPMP's debugfs file nodes
546 * * Platforms: T186, T194
549 * * Request Payload: @ref mrq_debugfs_request
550 * * Response Payload: @ref mrq_debugfs_response
554 * @addtogroup Debugfs
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
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
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 */
590 * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
592 struct cmd_debugfs_fileop_request
{
593 /** @brief Physical address pointing at filename */
595 /** @brief Length in bytes of filename buffer */
597 /** @brief Physical address pointing to data buffer */
599 /** @brief Length in bytes of data buffer */
605 * @brief Parameters for CMD_DEBUGFS_READ/WRITE command
607 struct cmd_debugfs_dumpdir_request
{
608 /** @brief Physical address pointing to data buffer */
610 /** @brief Length in bytes of data buffer */
616 * @brief Response data for CMD_DEBUGFS_READ/WRITE command
618 struct cmd_debugfs_fileop_response
{
619 /** @brief Always 0 */
621 /** @brief Number of bytes read from or written to data buffer */
627 * @brief Response data for CMD_DEBUGFS_DUMPDIR command
629 struct cmd_debugfs_dumpdir_response
{
630 /** @brief Always 0 */
632 /** @brief Number of bytes read from or written to data buffer */
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
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) */
655 struct cmd_debugfs_fileop_request fop
;
656 struct cmd_debugfs_dumpdir_request dumpdir
;
663 struct mrq_debugfs_response
{
664 /** @brief Always 0 */
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
;
677 * @addtogroup Debugfs
680 #define DEBUGFS_S_ISDIR (1 << 9)
681 #define DEBUGFS_S_IRUSR (1 << 8)
682 #define DEBUGFS_S_IWUSR (1 << 7)
688 * @brief Reset an IP block
690 * * Platforms: T186, T194
693 * * Request Payload: @ref mrq_reset_request
694 * * Response Payload: @ref mrq_reset_response
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 */
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) */
722 /** @brief Id of the reset to affected */
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 */
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
{
752 struct cmd_reset_get_max_id_response reset_get_max_id
;
761 * @brief Issue an i2c transaction
763 * * Platforms: T186, T194
766 * * Request Payload: @ref mrq_i2c_request
767 * * Response Payload: @ref mrq_i2c_response
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
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
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 */
806 /** @brief Bitmask of SERIALI2C_ flags */
808 /** @brief Length of I2C transaction in bytes */
810 /** @brief For write transactions only, #len bytes of data */
815 * @brief Trigger one or more i2c transactions
817 struct cmd_i2c_xfer_request
{
818 /** @brief Valid bus number from @ref bpmp_i2c_ids*/
821 /** @brief Count of valid bytes in #data_buf*/
824 /** @brief Serialized packed instances of @ref serial_i2c_request*/
825 uint8_t data_buf
[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE
];
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
835 struct cmd_i2c_xfer_response
{
836 /** @brief Count of valid bytes in #data_buf*/
838 /** @brief I2c read data */
839 uint8_t data_buf
[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE
];
843 * @brief Request with #MRQ_I2C
845 struct mrq_i2c_request
{
846 /** @brief Always CMD_I2C_XFER (i.e. 1) */
848 /** @brief Parameters of the transfer request */
849 struct cmd_i2c_xfer_request xfer
;
853 * @brief Response to #MRQ_I2C
855 struct mrq_i2c_response
{
856 struct cmd_i2c_xfer_response xfer
;
864 * @brief Perform a clock operation
866 * * Platforms: T186, T194
869 * * Request Payload: @ref mrq_clk_request
870 * * Response Payload: @ref mrq_clk_response
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,
884 CMD_CLK_GET_ALL_INFO
= 14,
885 CMD_CLK_GET_MAX_CLK_ID
= 15,
886 CMD_CLK_GET_FMAX_AT_VMIN
= 16,
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
898 struct cmd_clk_get_rate_request
{
902 struct cmd_clk_get_rate_response
{
906 struct cmd_clk_set_rate_request
{
911 struct cmd_clk_set_rate_response
{
915 struct cmd_clk_round_rate_request
{
920 struct cmd_clk_round_rate_response
{
925 struct cmd_clk_get_parent_request
{
929 struct cmd_clk_get_parent_response
{
933 struct cmd_clk_set_parent_request
{
937 struct cmd_clk_set_parent_response
{
942 struct cmd_clk_is_enabled_request
{
946 struct cmd_clk_is_enabled_response
{
951 struct cmd_clk_enable_request
{
956 struct cmd_clk_enable_response
{
961 struct cmd_clk_disable_request
{
966 struct cmd_clk_disable_response
{
971 struct cmd_clk_get_all_info_request
{
975 struct cmd_clk_get_all_info_response
{
978 uint32_t parents
[MRQ_CLK_MAX_PARENTS
];
980 uint8_t name
[MRQ_CLK_NAME_MAXLEN
];
984 struct cmd_clk_get_max_clk_id_request
{
988 struct cmd_clk_get_max_clk_id_response
{
993 struct cmd_clk_get_fmax_at_vmin_request
{
997 struct cmd_clk_get_fmax_at_vmin_response
{
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
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
;
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
;
1040 struct cmd_clk_get_parent_request clk_get_parent
;
1041 struct cmd_clk_set_parent_request clk_set_parent
;
1043 struct cmd_clk_enable_request clk_enable
;
1045 struct cmd_clk_disable_request clk_disable
;
1047 struct cmd_clk_is_enabled_request clk_is_enabled
;
1049 struct cmd_clk_get_all_info_request clk_get_all_info
;
1051 struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id
;
1053 struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin
;
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
{
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
;
1089 struct cmd_clk_enable_response clk_enable
;
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
;
1102 * @ingroup MRQ_Codes
1103 * @def MRQ_QUERY_ABI
1104 * @brief Check if an MRQ is implemented
1108 * * Targets: Any except DMCE
1109 * * Request Payload: @ref mrq_query_abi_request
1110 * * Response Payload: @ref mrq_query_abi_response
1115 * @brief Request with MRQ_QUERY_ABI
1117 * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
1120 struct mrq_query_abi_request
{
1121 /** @brief MRQ code to query */
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 */
1138 * @ingroup MRQ_Codes
1139 * @def MRQ_PG_READ_STATE
1140 * @brief Read the power-gating state of a partition
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
1157 struct mrq_pg_read_state_request
{
1158 /** @brief ID of partition */
1159 uint32_t partition_id
;
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
1174 uint32_t logic_state
;
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.
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
;
1229 * @ingroup MRQ_Codes
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
1243 * * Request Payload: @ref mrq_pg_request
1244 * * Response Payload: @ref mrq_pg_response
1246 * @addtogroup Powergating
1251 * @brief Check whether the BPMP driver supports the specified
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
1264 * mrq_response:err is
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
1275 * mrq_response:err is
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
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
1297 * -#BPMP_EINVAL: Invalid request parameters
1299 CMD_PG_GET_MAX_ID
= 4,
1302 #define MRQ_PG_NAME_MAXLEN 40
1305 /** @brief Power domain is OFF */
1307 /** @brief Power domain is ON */
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
1315 PG_STATE_RUNNING
= 2,
1318 struct cmd_pg_query_abi_request
{
1319 /** @ref mrq_pg_cmd */
1323 struct cmd_pg_set_state_request
{
1324 /** @ref pg_states */
1328 struct cmd_pg_get_state_response
{
1329 /** @ref pg_states */
1333 struct cmd_pg_get_name_response
{
1334 uint8_t name
[MRQ_PG_NAME_MAXLEN
];
1337 struct cmd_pg_get_max_id_response
{
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
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
{
1362 struct cmd_pg_query_abi_request query_abi
;
1363 struct cmd_pg_set_state_request set_state
;
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
{
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
;
1393 * @ingroup MRQ_Codes
1395 * @brief Interact with BPMP thermal framework
1397 * * Platforms: T186, T194
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
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.
1425 enum mrq_thermal_host_to_bpmp_cmd
{
1427 * @brief Check whether the BPMP driver supports the specified
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
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
1489 * BPMP needs to supply request parameters. Host only needs to
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
{
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
{
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
{
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
{
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
{
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
{
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
{
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
;
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
{
1591 struct cmd_thermal_host_trip_reached_request host_trip_reached
;
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
;
1605 * @ingroup MRQ_Codes
1606 * @def MRQ_CPU_VHINT
1607 * @brief Query CPU voltage hint data
1611 * * Initiators: CCPLEX
1613 * * Request Payload: @ref mrq_cpu_vhint_request
1614 * * Response Payload: N/A
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 */
1631 /** @brief ID of the cluster whose data is requested */
1632 uint32_t cluster_id
;
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) */
1648 /** minimum allowed NDIV value */
1650 /** minimum allowed voltage hint value (as in vINDEX) */
1652 /** maximum allowed voltage hint value (as in vINDEX) */
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];
1665 * @ingroup MRQ_Codes
1666 * @def MRQ_ABI_RATCHET
1667 * @brief ABI ratchet value query
1669 * * Platforms: T186, T194
1672 * * Request Payload: @ref mrq_abi_ratchet_request
1673 * * Response Payload: @ref mrq_abi_ratchet_response
1674 * @addtogroup ABI_info
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
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
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 */
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
1725 struct mrq_abi_ratchet_response
{
1726 /** @brief BPMP's ratchet value */
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
1739 * * Request Payload: N/A
1740 * * Response Payload: @ref mrq_emc_dvfs_latency_response
1746 * @brief Used by @ref mrq_emc_dvfs_latency_response
1748 struct emc_dvfs_latency
{
1749 /** @brief EMC frequency in kHz */
1751 /** @brief EMC DVFS latency in nanoseconds */
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 */
1762 /** @brief EMC <frequency, latency> information */
1763 struct emc_dvfs_latency pairs
[EMC_DVFS_LATENCY_MAX_SIZE
];
1769 * @ingroup MRQ_Codes
1770 * @def MRQ_CPU_NDIV_LIMITS
1771 * @brief CPU freq. limits in ndiv
1773 * * Platforms: T194 onwards
1775 * * Initiators: CCPLEX
1777 * * Request Payload: @ref mrq_cpu_ndiv_limits_request
1778 * * Response Payload: @ref mrq_cpu_ndiv_limits_response
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
;
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 */
1799 /** @brief Input divider value */
1801 /** @brief FMAX expressed with max NDIV value */
1803 /** @brief Minimum allowed NDIV value */
1811 * @ingroup MRQ_Codes
1812 * @def MRQ_CPU_AUTO_CC3
1813 * @brief Query CPU cluster auto-CC3 configuration
1815 * * Platforms: T194 onwards
1817 * * Initiators: CCPLEX
1819 * * Request Payload: @ref mrq_cpu_auto_cc3_request
1820 * * Response Payload: @ref mrq_cpu_auto_cc3_response
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.
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
;
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
;
1857 * @ingroup MRQ_Codes
1858 * @def MRQ_TRACE_ITER
1859 * @brief Manage the trace iterator
1862 * * Initiators: CCPLEX
1864 * * Request Payload: N/A
1865 * * Response Payload: @ref mrq_trace_iter_request
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 */
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.
1901 * @brief Maximum number of bytes transferred in a single write command to the
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
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
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 */
1961 struct cmd_ringbuf_console_query_abi_resp
{
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
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 */
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 */
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 */
2010 struct cmd_ringbuf_console_get_fifo_req
{
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
;
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.
2041 /** @brief request type specific parameters. */
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
;
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
;
2065 * @ingroup MRQ_Codes
2067 * @brief Set a strap value controlled by BPMP
2069 * * Platforms: T194 onwards
2071 * * Initiators: CCPLEX
2073 * * Request Payload: @ref mrq_strap_request
2074 * * Response Payload: N/A
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
2083 * BPMP owns registers which act as straps to various units. It
2084 * exposes limited control of those straps via #MRQ_STRAP.
2088 enum mrq_strap_cmd
{
2091 /** @brief Set a strap value */
2096 * @brief Request with #MRQ_STRAP
2098 struct mrq_strap_request
{
2099 /** @brief @ref mrq_strap_cmd */
2101 /** @brief Strap ID from @ref Strap_Ids */
2103 /** @brief Desired value for strap (if cmd is #STRAP_SET) */
2108 * @defgroup Strap_Ids Strap Identifiers
2114 * @ingroup MRQ_Codes
2116 * @brief Perform a UPHY operation
2118 * * Platforms: T194 onwards
2120 * * Initiators: CCPLEX
2122 * * Request Payload: @ref mrq_uphy_request
2123 * * Response Payload: @ref mrq_uphy_response
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,
2136 struct cmd_uphy_margin_control_request
{
2137 /** @brief Enable margin */
2139 /** @brief Clear the number of error and sections */
2141 /** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */
2143 /** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */
2145 /** @brief Set number of bit blocks for each margin section */
2149 struct cmd_uphy_margin_status_response
{
2150 /** @brief Number of errors observed */
2154 struct cmd_uphy_ep_controller_pll_init_request
{
2155 /** @brief EP controller number, valid: 0, 4, 5 */
2156 uint8_t ep_controller
;
2159 struct cmd_uphy_pcie_controller_state_request
{
2160 /** @brief PCIE controller number, valid: 0, 1, 2, 3, 4 */
2161 uint8_t pcie_controller
;
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. */
2185 /** @brief Sub-command id. */
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
;
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
{
2212 struct cmd_uphy_margin_status_response uphy_get_margin_status
;
2220 * @ingroup MRQ_Codes
2222 * @brief Perform a frequency monitor configuration operations
2224 * * Platforms: T194 onwards
2226 * * Initiators: CCPLEX
2228 * * Request Payload: @ref mrq_fmon_request
2229 * * Response Payload: @ref mrq_fmon_response
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
2254 * Inherently racy, since clamp state can be changed
2255 * concurrently. Useful for testing.
2257 CMD_FMON_GEAR_GET
= 3,
2261 struct cmd_fmon_gear_clamp_request
{
2267 struct cmd_fmon_gear_clamp_response
{
2272 struct cmd_fmon_gear_free_request
{
2277 struct cmd_fmon_gear_free_response
{
2282 struct cmd_fmon_gear_get_request
{
2286 struct cmd_fmon_gear_get_response
{
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
2313 uint32_t cmd_and_id
;
2316 struct cmd_fmon_gear_clamp_request fmon_gear_clamp
;
2318 struct cmd_fmon_gear_free_request fmon_gear_free
;
2320 struct cmd_fmon_gear_get_request fmon_gear_get
;
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
{
2342 struct cmd_fmon_gear_clamp_response fmon_gear_clamp
;
2344 struct cmd_fmon_gear_free_response fmon_gear_free
;
2345 struct cmd_fmon_gear_get_response fmon_gear_get
;
2353 * @ingroup MRQ_Codes
2355 * @brief Provide status information on faults reported by Error
2356 * Collator (EC) to HSM.
2358 * * Platforms: T194 onwards
2360 * * Initiators: CCPLEX
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
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,
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
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
2479 * @defgroup bpmp_ec_desc_flags EC Descriptor Flags
2480 * @addtogroup bpmp_ec_desc_flags
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
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
;
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
;
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 */
2531 /** @brief Register group @ref ec_registers_group */
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
;
2555 /** @brief Union of EC error descriptors */
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
;
2563 struct cmd_ec_status_get_request
{
2564 /** @brief HSM error line number that identifies target EC. */
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). */
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. */
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
];
2592 * @brief Request with #MRQ_EC
2594 * Used by the sender of an #MRQ_EC message to access ECs owned
2597 * |sub-command |payload |
2598 * |----------------------------|-----------------------|
2599 * |@ref CMD_EC_STATUS_GET |ec_status_get |
2603 struct mrq_ec_request
{
2604 /** @brief Sub-command id. */
2608 struct cmd_ec_status_get_request ec_status_get
;
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
{
2627 struct cmd_ec_status_get_response ec_status_get
;
2635 * @ingroup MRQ_Codes
2636 * @def MRQ_FBVOLT_STATUS
2637 * @brief Provides status information about voltage state for fuse burning
2639 * * Platforms: T194 onwards
2641 * * Initiators: CCPLEX
2643 * * Request Payload: None
2644 * * Response Payload: @ref mrq_fbvolt_status_response
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 */
2659 /** @brief Reserved */
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.
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 */
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