Home | History | Annotate | Download | only in arch-tegra
      1 /* SPDX-License-Identifier: GPL-2.0 */
      2 /*
      3  * Copyright (c) 2014-2016, NVIDIA CORPORATION.
      4  */
      5 
      6 #ifndef _ABI_BPMP_ABI_H_
      7 #define _ABI_BPMP_ABI_H_
      8 
      9 #ifdef LK
     10 #include <stdint.h>
     11 #endif
     12 
     13 #ifndef __ABI_PACKED
     14 #define __ABI_PACKED __attribute__((packed))
     15 #endif
     16 
     17 #ifdef NO_GCC_EXTENSIONS
     18 #define EMPTY char empty;
     19 #define EMPTY_ARRAY 1
     20 #else
     21 #define EMPTY
     22 #define EMPTY_ARRAY 0
     23 #endif
     24 
     25 #ifndef __UNION_ANON
     26 #define __UNION_ANON
     27 #endif
     28 /**
     29  * @file
     30  */
     31 
     32 
     33 /**
     34  * @defgroup MRQ MRQ Messages
     35  * @brief Messages sent to/from BPMP via IPC
     36  * @{
     37  *   @defgroup MRQ_Format Message Format
     38  *   @defgroup MRQ_Codes Message Request (MRQ) Codes
     39  *   @defgroup MRQ_Payloads Message Payloads
     40  *   @defgroup Error_Codes Error Codes
     41  * @}
     42  */
     43 
     44 /**
     45  * @addtogroup MRQ_Format Message Format
     46  * @{
     47  * The CPU requests the BPMP to perform a particular service by
     48  * sending it an IVC frame containing a single MRQ message. An MRQ
     49  * message consists of a @ref mrq_request followed by a payload whose
     50  * format depends on mrq_request::mrq.
     51  *
     52  * The BPMP processes the data and replies with an IVC frame (on the
     53  * same IVC channel) containing and MRQ response. An MRQ response
     54  * consists of a @ref mrq_response followed by a payload whose format
     55  * depends on the associated mrq_request::mrq.
     56  *
     57  * A well-defined subset of the MRQ messages that the CPU sends to the
     58  * BPMP can lead to BPMP eventually sending an MRQ message to the
     59  * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
     60  * a thermal trip point, the BPMP may eventually send a single
     61  * #MRQ_THERMAL message of its own to the CPU indicating that the trip
     62  * point has been crossed.
     63  * @}
     64  */
     65 
     66 /**
     67  * @ingroup MRQ_Format
     68  * @brief header for an MRQ message
     69  *
     70  * Provides the MRQ number for the MRQ message: #mrq. The remainder of
     71  * the MRQ message is a payload (immediately following the
     72  * mrq_request) whose format depends on mrq.
     73  *
     74  * @todo document the flags
     75  */
     76 struct mrq_request {
     77 	/** @brief MRQ number of the request */
     78 	uint32_t mrq;
     79 	/** @brief flags for the request */
     80 	uint32_t flags;
     81 } __ABI_PACKED;
     82 
     83 /**
     84  * @ingroup MRQ_Format
     85  * @brief header for an MRQ response
     86  *
     87  *  Provides an error code for the associated MRQ message. The
     88  *  remainder of the MRQ response is a payload (immediately following
     89  *  the mrq_response) whose format depends on the associated
     90  *  mrq_request::mrq
     91  *
     92  * @todo document the flags
     93  */
     94 struct mrq_response {
     95 	/** @brief error code for the MRQ request itself */
     96 	int32_t err;
     97 	/** @brief flags for the response */
     98 	uint32_t flags;
     99 } __ABI_PACKED;
    100 
    101 /**
    102  * @ingroup MRQ_Format
    103  * Minimum needed size for an IPC message buffer
    104  */
    105 #define MSG_MIN_SZ	128
    106 /**
    107  * @ingroup MRQ_Format
    108  *  Minimum size guaranteed for data in an IPC message buffer
    109  */
    110 #define MSG_DATA_MIN_SZ	120
    111 
    112 /**
    113  * @ingroup MRQ_Codes
    114  * @name Legal MRQ codes
    115  * These are the legal values for mrq_request::mrq
    116  * @{
    117  */
    118 
    119 #define MRQ_PING		0
    120 #define MRQ_QUERY_TAG		1
    121 #define MRQ_MODULE_LOAD		4
    122 #define MRQ_MODULE_UNLOAD	5
    123 #define MRQ_TRACE_MODIFY	7
    124 #define MRQ_WRITE_TRACE		8
    125 #define MRQ_THREADED_PING	9
    126 #define MRQ_MODULE_MAIL		11
    127 #define MRQ_DEBUGFS		19
    128 #define MRQ_RESET		20
    129 #define MRQ_I2C			21
    130 #define MRQ_CLK			22
    131 #define MRQ_QUERY_ABI		23
    132 #define MRQ_PG_READ_STATE	25
    133 #define MRQ_PG_UPDATE_STATE	26
    134 #define MRQ_THERMAL		27
    135 #define MRQ_CPU_VHINT		28
    136 #define MRQ_ABI_RATCHET		29
    137 #define MRQ_EMC_DVFS_LATENCY	31
    138 #define MRQ_TRACE_ITER		64
    139 
    140 /** @} */
    141 
    142 /**
    143  * @ingroup MRQ_Codes
    144  * @brief Maximum MRQ code to be sent by CPU software to
    145  * BPMP. Subject to change in future
    146  */
    147 #define MAX_CPU_MRQ_ID		64
    148 
    149 /**
    150  * @addtogroup MRQ_Payloads Message Payloads
    151  * @{
    152  *   @defgroup Ping
    153  *   @defgroup Query_Tag Query Tag
    154  *   @defgroup Module Loadable Modules
    155  *   @defgroup Trace
    156  *   @defgroup Debugfs
    157  *   @defgroup Reset
    158  *   @defgroup I2C
    159  *   @defgroup Clocks
    160  *   @defgroup ABI_info ABI Info
    161  *   @defgroup MC_Flush MC Flush
    162  *   @defgroup Powergating
    163  *   @defgroup Thermal
    164  *   @defgroup Vhint CPU Voltage hint
    165  *   @defgroup MRQ_Deprecated Deprecated MRQ messages
    166  *   @defgroup EMC
    167  * @}
    168  */
    169 
    170 
    171 /**
    172  * @ingroup MRQ_Codes
    173  * @def MRQ_PING
    174  * @brief A simple ping
    175  *
    176  * * Platforms: All
    177  * * Initiators: Any
    178  * * Targets: Any
    179  * * Request Payload: @ref mrq_ping_request
    180  * * Response Payload: @ref mrq_ping_response
    181  *
    182  * @ingroup MRQ_Codes
    183  * @def MRQ_THREADED_PING
    184  * @brief A deeper ping
    185  *
    186  * * Platforms: All
    187  * * Initiators: Any
    188  * * Targets: BPMP
    189  * * Request Payload: @ref mrq_ping_request
    190  * * Response Payload: @ref mrq_ping_response
    191  *
    192  * Behavior is equivalent to a simple #MRQ_PING except that BPMP
    193  * responds from a thread context (providing a slightly more robust
    194  * sign of life).
    195  *
    196  */
    197 
    198 /**
    199  * @ingroup Ping
    200  * @brief request with #MRQ_PING
    201  *
    202  * Used by the sender of an #MRQ_PING message to request a pong from
    203  * recipient. The response from the recipient is computed based on
    204  * #challenge.
    205  */
    206 struct mrq_ping_request {
    207 /** @brief arbitrarily chosen value */
    208 	uint32_t challenge;
    209 } __ABI_PACKED;
    210 
    211 /**
    212  * @ingroup Ping
    213  * @brief response to #MRQ_PING
    214  *
    215  * Sent in response to an #MRQ_PING message. #reply should be the
    216  * mrq_ping_request challenge left shifted by 1 with the carry-bit
    217  * dropped.
    218  *
    219  */
    220 struct mrq_ping_response {
    221 	/** @brief response to the MRQ_PING challege */
    222 	uint32_t reply;
    223 } __ABI_PACKED;
    224 
    225 /**
    226  * @ingroup MRQ_Codes
    227  * @def MRQ_QUERY_TAG
    228  * @brief Query BPMP firmware's tag (i.e. version information)
    229  *
    230  * * Platforms: All
    231  * * Initiators: CCPLEX
    232  * * Targets: BPMP
    233  * * Request Payload: @ref mrq_query_tag_request
    234  * * Response Payload: N/A
    235  *
    236  */
    237 
    238 /**
    239  * @ingroup Query_Tag
    240  * @brief request with #MRQ_QUERY_TAG
    241  *
    242  * Used by #MRQ_QUERY_TAG call to ask BPMP to fill in the memory
    243  * pointed by #addr with BPMP firmware header.
    244  *
    245  * The sender is reponsible for ensuring that #addr is mapped in to
    246  * the recipient's address map.
    247  */
    248 struct mrq_query_tag_request {
    249   /** @brief base address to store the firmware header */
    250 	uint32_t addr;
    251 } __ABI_PACKED;
    252 
    253 /**
    254  * @ingroup MRQ_Codes
    255  * @def MRQ_MODULE_LOAD
    256  * @brief dynamically load a BPMP code module
    257  *
    258  * * Platforms: All
    259  * * Initiators: CCPLEX
    260  * * Targets: BPMP
    261  * * Request Payload: @ref mrq_module_load_request
    262  * * Response Payload: @ref mrq_module_load_response
    263  *
    264  * @note This MRQ is disabled on production systems
    265  *
    266  */
    267 
    268 /**
    269  * @ingroup Module
    270  * @brief request with #MRQ_MODULE_LOAD
    271  *
    272  * Used by #MRQ_MODULE_LOAD calls to ask the recipient to dynamically
    273  * load the code located at #phys_addr and having size #size
    274  * bytes. #phys_addr is treated as a void pointer.
    275  *
    276  * The recipient copies the code from #phys_addr to locally allocated
    277  * memory prior to responding to this message.
    278  *
    279  * @todo document the module header format
    280  *
    281  * The sender is responsible for ensuring that the code is mapped in
    282  * the recipient's address map.
    283  *
    284  */
    285 struct mrq_module_load_request {
    286 	/** @brief base address of the code to load. Treated as (void *) */
    287 	uint32_t phys_addr; /* (void *) */
    288 	/** @brief size in bytes of code to load */
    289 	uint32_t size;
    290 } __ABI_PACKED;
    291 
    292 /**
    293  * @ingroup Module
    294  * @brief response to #MRQ_MODULE_LOAD
    295  *
    296  * @todo document mrq_response::err
    297  */
    298 struct mrq_module_load_response {
    299 	/** @brief handle to the loaded module */
    300 	uint32_t base;
    301 } __ABI_PACKED;
    302 
    303 /**
    304  * @ingroup MRQ_Codes
    305  * @def MRQ_MODULE_UNLOAD
    306  * @brief unload a previously loaded code module
    307  *
    308  * * Platforms: All
    309  * * Initiators: CCPLEX
    310  * * Targets: BPMP
    311  * * Request Payload: @ref mrq_module_unload_request
    312  * * Response Payload: N/A
    313  *
    314  * @note This MRQ is disabled on production systems
    315  */
    316 
    317 /**
    318  * @ingroup Module
    319  * @brief request with #MRQ_MODULE_UNLOAD
    320  *
    321  * Used by #MRQ_MODULE_UNLOAD calls to request that a previously loaded
    322  * module be unloaded.
    323  */
    324 struct mrq_module_unload_request {
    325 	/** @brief handle of the module to unload */
    326 	uint32_t base;
    327 } __ABI_PACKED;
    328 
    329 /**
    330  * @ingroup MRQ_Codes
    331  * @def MRQ_TRACE_MODIFY
    332  * @brief modify the set of enabled trace events
    333  *
    334  * * Platforms: All
    335  * * Initiators: CCPLEX
    336  * * Targets: BPMP
    337  * * Request Payload: @ref mrq_trace_modify_request
    338  * * Response Payload: @ref mrq_trace_modify_response
    339  *
    340  * @note This MRQ is disabled on production systems
    341  */
    342 
    343 /**
    344  * @ingroup Trace
    345  * @brief request with #MRQ_TRACE_MODIFY
    346  *
    347  * Used by %MRQ_TRACE_MODIFY calls to enable or disable specify trace
    348  * events.  #set takes precedence for any bit set in both #set and
    349  * #clr.
    350  */
    351 struct mrq_trace_modify_request {
    352 	/** @brief bit mask of trace events to disable */
    353 	uint32_t clr;
    354 	/** @brief bit mask of trace events to enable */
    355 	uint32_t set;
    356 } __ABI_PACKED;
    357 
    358 /**
    359  * @ingroup Trace
    360  * @brief response to #MRQ_TRACE_MODIFY
    361  *
    362  * Sent in repsonse to an #MRQ_TRACE_MODIFY message. #mask reflects the
    363  * state of which events are enabled after the recipient acted on the
    364  * message.
    365  *
    366  */
    367 struct mrq_trace_modify_response {
    368 	/** @brief bit mask of trace event enable states */
    369 	uint32_t mask;
    370 } __ABI_PACKED;
    371 
    372 /**
    373  * @ingroup MRQ_Codes
    374  * @def MRQ_WRITE_TRACE
    375  * @brief Write trace data to a buffer
    376  *
    377  * * Platforms: All
    378  * * Initiators: CCPLEX
    379  * * Targets: BPMP
    380  * * Request Payload: @ref mrq_write_trace_request
    381  * * Response Payload: @ref mrq_write_trace_response
    382  *
    383  * mrq_response::err depends on the @ref mrq_write_trace_request field
    384  * values. err is -#BPMP_EINVAL if size is zero or area is NULL or
    385  * area is in an illegal range. A positive value for err indicates the
    386  * number of bytes written to area.
    387  *
    388  * @note This MRQ is disabled on production systems
    389  */
    390 
    391 /**
    392  * @ingroup Trace
    393  * @brief request with #MRQ_WRITE_TRACE
    394  *
    395  * Used by MRQ_WRITE_TRACE calls to ask the recipient to copy trace
    396  * data from the recipient's local buffer to the output buffer. #area
    397  * is treated as a byte-aligned pointer in the recipient's address
    398  * space.
    399  *
    400  * The sender is responsible for ensuring that the output
    401  * buffer is mapped in the recipient's address map. The recipient is
    402  * responsible for protecting its own code and data from accidental
    403  * overwrites.
    404  */
    405 struct mrq_write_trace_request {
    406 	/** @brief base address of output buffer */
    407 	uint32_t area;
    408 	/** @brief size in bytes of the output buffer */
    409 	uint32_t size;
    410 } __ABI_PACKED;
    411 
    412 /**
    413  * @ingroup Trace
    414  * @brief response to #MRQ_WRITE_TRACE
    415  *
    416  * Once this response is sent, the respondent will not access the
    417  * output buffer further.
    418  */
    419 struct mrq_write_trace_response {
    420 	/**
    421 	 * @brief flag whether more data remains in local buffer
    422 	 *
    423 	 * Value is 1 if the entire local trace buffer has been
    424 	 * drained to the outputbuffer. Value is 0 otherwise.
    425 	 */
    426 	uint32_t eof;
    427 } __ABI_PACKED;
    428 
    429 /** @private */
    430 struct mrq_threaded_ping_request {
    431 	uint32_t challenge;
    432 } __ABI_PACKED;
    433 
    434 /** @private */
    435 struct mrq_threaded_ping_response {
    436 	uint32_t reply;
    437 } __ABI_PACKED;
    438 
    439 /**
    440  * @ingroup MRQ_Codes
    441  * @def MRQ_MODULE_MAIL
    442  * @brief send a message to a loadable module
    443  *
    444  * * Platforms: All
    445  * * Initiators: Any
    446  * * Targets: BPMP
    447  * * Request Payload: @ref mrq_module_mail_request
    448  * * Response Payload: @ref mrq_module_mail_response
    449  *
    450  * @note This MRQ is disabled on production systems
    451  */
    452 
    453 /**
    454  * @ingroup Module
    455  * @brief request with #MRQ_MODULE_MAIL
    456  */
    457 struct mrq_module_mail_request {
    458 	/** @brief handle to the previously loaded module */
    459 	uint32_t base;
    460 	/** @brief module-specific mail payload
    461 	 *
    462 	 * The length of data[ ] is unknown to the BPMP core firmware
    463 	 * but it is limited to the size of an IPC message.
    464 	 */
    465 	uint8_t data[EMPTY_ARRAY];
    466 } __ABI_PACKED;
    467 
    468 /**
    469  * @ingroup Module
    470  * @brief response to #MRQ_MODULE_MAIL
    471  */
    472 struct mrq_module_mail_response {
    473 	/** @brief module-specific mail payload
    474 	 *
    475 	 * The length of data[ ] is unknown to the BPMP core firmware
    476 	 * but it is limited to the size of an IPC message.
    477 	 */
    478 	uint8_t data[EMPTY_ARRAY];
    479 } __ABI_PACKED;
    480 
    481 /**
    482  * @ingroup MRQ_Codes
    483  * @def MRQ_DEBUGFS
    484  * @brief Interact with BPMP's debugfs file nodes
    485  *
    486  * * Platforms: T186
    487  * * Initiators: Any
    488  * * Targets: BPMP
    489  * * Request Payload: @ref mrq_debugfs_request
    490  * * Response Payload: @ref mrq_debugfs_response
    491  */
    492 
    493 /**
    494  * @addtogroup Debugfs
    495  * @{
    496  *
    497  * The BPMP firmware implements a pseudo-filesystem called
    498  * debugfs. Any driver within the firmware may register with debugfs
    499  * to expose an arbitrary set of "files" in the filesystem. When
    500  * software on the CPU writes to a debugfs file, debugfs passes the
    501  * written data to a callback provided by the driver. When software on
    502  * the CPU reads a debugfs file, debugfs queries the driver for the
    503  * data to return to the CPU. The intention of the debugfs filesystem
    504  * is to provide information useful for debugging the system at
    505  * runtime.
    506  *
    507  * @note The files exposed via debugfs are not part of the
    508  * BPMP firmware's ABI. debugfs files may be added or removed in any
    509  * given version of the firmware. Typically the semantics of a debugfs
    510  * file are consistent from version to version but even that is not
    511  * guaranteed.
    512  *
    513  * @}
    514  */
    515 /** @ingroup Debugfs */
    516 enum mrq_debugfs_commands {
    517 	CMD_DEBUGFS_READ = 1,
    518 	CMD_DEBUGFS_WRITE = 2,
    519 	CMD_DEBUGFS_DUMPDIR = 3,
    520 	CMD_DEBUGFS_MAX
    521 };
    522 
    523 /**
    524  * @ingroup Debugfs
    525  * @brief parameters for CMD_DEBUGFS_READ/WRITE command
    526  */
    527 struct cmd_debugfs_fileop_request {
    528 	/** @brief physical address pointing at filename */
    529 	uint32_t fnameaddr;
    530 	/** @brief length in bytes of filename buffer */
    531 	uint32_t fnamelen;
    532 	/** @brief physical address pointing to data buffer */
    533 	uint32_t dataaddr;
    534 	/** @brief length in bytes of data buffer */
    535 	uint32_t datalen;
    536 } __ABI_PACKED;
    537 
    538 /**
    539  * @ingroup Debugfs
    540  * @brief parameters for CMD_DEBUGFS_READ/WRITE command
    541  */
    542 struct cmd_debugfs_dumpdir_request {
    543 	/** @brief physical address pointing to data buffer */
    544 	uint32_t dataaddr;
    545 	/** @brief length in bytes of data buffer */
    546 	uint32_t datalen;
    547 } __ABI_PACKED;
    548 
    549 /**
    550  * @ingroup Debugfs
    551  * @brief response data for CMD_DEBUGFS_READ/WRITE command
    552  */
    553 struct cmd_debugfs_fileop_response {
    554 	/** @brief always 0 */
    555 	uint32_t reserved;
    556 	/** @brief number of bytes read from or written to data buffer */
    557 	uint32_t nbytes;
    558 } __ABI_PACKED;
    559 
    560 /**
    561  * @ingroup Debugfs
    562  * @brief response data for CMD_DEBUGFS_DUMPDIR command
    563  */
    564 struct cmd_debugfs_dumpdir_response {
    565 	/** @brief always 0 */
    566 	uint32_t reserved;
    567 	/** @brief number of bytes read from or written to data buffer */
    568 	uint32_t nbytes;
    569 } __ABI_PACKED;
    570 
    571 /**
    572  * @ingroup Debugfs
    573  * @brief request with #MRQ_DEBUGFS.
    574  *
    575  * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
    576  * command to execute. Legal commands are the values of @ref
    577  * mrq_debugfs_commands. Each command requires a specific additional
    578  * payload of data.
    579  *
    580  * |command            |payload|
    581  * |-------------------|-------|
    582  * |CMD_DEBUGFS_READ   |fop    |
    583  * |CMD_DEBUGFS_WRITE  |fop    |
    584  * |CMD_DEBUGFS_DUMPDIR|dumpdir|
    585  */
    586 struct mrq_debugfs_request {
    587 	uint32_t cmd;
    588 	union {
    589 		struct cmd_debugfs_fileop_request fop;
    590 		struct cmd_debugfs_dumpdir_request dumpdir;
    591 	} __UNION_ANON;
    592 } __ABI_PACKED;
    593 
    594 /**
    595  * @ingroup Debugfs
    596  */
    597 struct mrq_debugfs_response {
    598 	/** @brief always 0 */
    599 	int32_t reserved;
    600 	union {
    601 		/** @brief response data for CMD_DEBUGFS_READ OR
    602 		 * CMD_DEBUGFS_WRITE command
    603 		 */
    604 		struct cmd_debugfs_fileop_response fop;
    605 		/** @brief response data for CMD_DEBUGFS_DUMPDIR command */
    606 		struct cmd_debugfs_dumpdir_response dumpdir;
    607 	} __UNION_ANON;
    608 } __ABI_PACKED;
    609 
    610 /**
    611  * @addtogroup Debugfs
    612  * @{
    613  */
    614 #define DEBUGFS_S_ISDIR	(1 << 9)
    615 #define DEBUGFS_S_IRUSR	(1 << 8)
    616 #define DEBUGFS_S_IWUSR	(1 << 7)
    617 /** @} */
    618 
    619 
    620 /**
    621  * @ingroup MRQ_Codes
    622  * @def MRQ_RESET
    623  * @brief reset an IP block
    624  *
    625  * * Platforms: T186
    626  * * Initiators: Any
    627  * * Targets: BPMP
    628  * * Request Payload: @ref mrq_reset_request
    629  * * Response Payload: N/A
    630  */
    631 
    632 /**
    633  * @ingroup Reset
    634  */
    635 enum mrq_reset_commands {
    636 	CMD_RESET_ASSERT = 1,
    637 	CMD_RESET_DEASSERT = 2,
    638 	CMD_RESET_MODULE = 3,
    639 	CMD_RESET_MAX, /* not part of ABI and subject to change */
    640 };
    641 
    642 /**
    643  * @ingroup Reset
    644  * @brief request with MRQ_RESET
    645  *
    646  * Used by the sender of an #MRQ_RESET message to request BPMP to
    647  * assert or or deassert a given reset line.
    648  */
    649 struct mrq_reset_request {
    650 	/** @brief reset action to perform (@enum mrq_reset_commands) */
    651 	uint32_t cmd;
    652 	/** @brief id of the reset to affected */
    653 	uint32_t reset_id;
    654 } __ABI_PACKED;
    655 
    656 /**
    657  * @ingroup MRQ_Codes
    658  * @def MRQ_I2C
    659  * @brief issue an i2c transaction
    660  *
    661  * * Platforms: T186
    662  * * Initiators: Any
    663  * * Targets: BPMP
    664  * * Request Payload: @ref mrq_i2c_request
    665  * * Response Payload: @ref mrq_i2c_response
    666  */
    667 
    668 /**
    669  * @addtogroup I2C
    670  * @{
    671  */
    672 #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE	(MSG_DATA_MIN_SZ - 12)
    673 #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE	(MSG_DATA_MIN_SZ - 4)
    674 /** @} */
    675 
    676 /**
    677  * @ingroup I2C
    678  * @name Serial I2C flags
    679  * Use these flags with serial_i2c_request::flags
    680  * @{
    681  */
    682 #define SERIALI2C_TEN           0x0010
    683 #define SERIALI2C_RD            0x0001
    684 #define SERIALI2C_STOP          0x8000
    685 #define SERIALI2C_NOSTART       0x4000
    686 #define SERIALI2C_REV_DIR_ADDR  0x2000
    687 #define SERIALI2C_IGNORE_NAK    0x1000
    688 #define SERIALI2C_NO_RD_ACK     0x0800
    689 #define SERIALI2C_RECV_LEN      0x0400
    690 /** @} */
    691 /** @ingroup I2C */
    692 enum {
    693 	CMD_I2C_XFER = 1
    694 };
    695 
    696 /**
    697  * @ingroup I2C
    698  * @brief serializable i2c request
    699  *
    700  * Instances of this structure are packed (little-endian) into
    701  * cmd_i2c_xfer_request::data_buf. Each instance represents a single
    702  * transaction (or a portion of a transaction with repeated starts) on
    703  * an i2c bus.
    704  *
    705  * Because these structures are packed, some instances are likely to
    706  * be misaligned. Additionally because #data is variable length, it is
    707  * not possible to iterate through a serialized list of these
    708  * structures without inspecting #len in each instance.  It may be
    709  * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf
    710  * manually rather than using this structure definition.
    711 */
    712 struct serial_i2c_request {
    713 	/** @brief I2C slave address */
    714 	uint16_t addr;
    715 	/** @brief bitmask of SERIALI2C_ flags */
    716 	uint16_t flags;
    717 	/** @brief length of I2C transaction in bytes */
    718 	uint16_t len;
    719 	/** @brief for write transactions only, #len bytes of data */
    720 	uint8_t data[];
    721 } __ABI_PACKED;
    722 
    723 /**
    724  * @ingroup I2C
    725  * @brief trigger one or more i2c transactions
    726  */
    727 struct cmd_i2c_xfer_request {
    728 	/** @brief valid bus number from mach-t186/i2c-t186.h*/
    729 	uint32_t bus_id;
    730 
    731 	/** @brief count of valid bytes in #data_buf*/
    732 	uint32_t data_size;
    733 
    734 	/** @brief serialized packed instances of @ref serial_i2c_request*/
    735 	uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE];
    736 } __ABI_PACKED;
    737 
    738 /**
    739  * @ingroup I2C
    740  * @brief container for data read from the i2c bus
    741  *
    742  * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute
    743  * zero or more I2C reads. The data read from the bus is serialized
    744  * into #data_buf.
    745  */
    746 struct cmd_i2c_xfer_response {
    747 	/** @brief count of valid bytes in #data_buf*/
    748 	uint32_t data_size;
    749 	/** @brief i2c read data */
    750 	uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE];
    751 } __ABI_PACKED;
    752 
    753 /**
    754  * @ingroup I2C
    755  * @brief request with #MRQ_I2C
    756  */
    757 struct mrq_i2c_request {
    758 	/** @brief always CMD_I2C_XFER (i.e. 1) */
    759 	uint32_t cmd;
    760 	/** @brief parameters of the transfer request */
    761 	struct cmd_i2c_xfer_request xfer;
    762 } __ABI_PACKED;
    763 
    764 /**
    765  * @ingroup I2C
    766  * @brief response to #MRQ_I2C
    767  */
    768 struct mrq_i2c_response {
    769 	struct cmd_i2c_xfer_response xfer;
    770 } __ABI_PACKED;
    771 
    772 /**
    773  * @ingroup MRQ_Codes
    774  * @def MRQ_CLK
    775  *
    776  * * Platforms: T186
    777  * * Initiators: Any
    778  * * Targets: BPMP
    779  * * Request Payload: @ref mrq_clk_request
    780  * * Response Payload: @ref mrq_clk_response
    781  * @addtogroup Clocks
    782  * @{
    783  */
    784 
    785 /**
    786  * @name MRQ_CLK sub-commands
    787  * @{
    788  */
    789 enum {
    790 	CMD_CLK_GET_RATE = 1,
    791 	CMD_CLK_SET_RATE = 2,
    792 	CMD_CLK_ROUND_RATE = 3,
    793 	CMD_CLK_GET_PARENT = 4,
    794 	CMD_CLK_SET_PARENT = 5,
    795 	CMD_CLK_IS_ENABLED = 6,
    796 	CMD_CLK_ENABLE = 7,
    797 	CMD_CLK_DISABLE = 8,
    798 	CMD_CLK_GET_ALL_INFO = 14,
    799 	CMD_CLK_GET_MAX_CLK_ID = 15,
    800 	CMD_CLK_MAX,
    801 };
    802 /** @} */
    803 
    804 #define MRQ_CLK_NAME_MAXLEN	40
    805 #define MRQ_CLK_MAX_PARENTS	16
    806 
    807 /** @private */
    808 struct cmd_clk_get_rate_request {
    809 	EMPTY
    810 } __ABI_PACKED;
    811 
    812 struct cmd_clk_get_rate_response {
    813 	int64_t rate;
    814 } __ABI_PACKED;
    815 
    816 struct cmd_clk_set_rate_request {
    817 	int32_t unused;
    818 	int64_t rate;
    819 } __ABI_PACKED;
    820 
    821 struct cmd_clk_set_rate_response {
    822 	int64_t rate;
    823 } __ABI_PACKED;
    824 
    825 struct cmd_clk_round_rate_request {
    826 	int32_t unused;
    827 	int64_t rate;
    828 } __ABI_PACKED;
    829 
    830 struct cmd_clk_round_rate_response {
    831 	int64_t rate;
    832 } __ABI_PACKED;
    833 
    834 /** @private */
    835 struct cmd_clk_get_parent_request {
    836 	EMPTY
    837 } __ABI_PACKED;
    838 
    839 struct cmd_clk_get_parent_response {
    840 	uint32_t parent_id;
    841 } __ABI_PACKED;
    842 
    843 struct cmd_clk_set_parent_request {
    844 	uint32_t parent_id;
    845 } __ABI_PACKED;
    846 
    847 struct cmd_clk_set_parent_response {
    848 	uint32_t parent_id;
    849 } __ABI_PACKED;
    850 
    851 /** @private */
    852 struct cmd_clk_is_enabled_request {
    853 	EMPTY
    854 } __ABI_PACKED;
    855 
    856 struct cmd_clk_is_enabled_response {
    857 	int32_t state;
    858 } __ABI_PACKED;
    859 
    860 /** @private */
    861 struct cmd_clk_enable_request {
    862 	EMPTY
    863 } __ABI_PACKED;
    864 
    865 /** @private */
    866 struct cmd_clk_enable_response {
    867 	EMPTY
    868 } __ABI_PACKED;
    869 
    870 /** @private */
    871 struct cmd_clk_disable_request {
    872 	EMPTY
    873 } __ABI_PACKED;
    874 
    875 /** @private */
    876 struct cmd_clk_disable_response {
    877 	EMPTY
    878 } __ABI_PACKED;
    879 
    880 /** @private */
    881 struct cmd_clk_get_all_info_request {
    882 	EMPTY
    883 } __ABI_PACKED;
    884 
    885 struct cmd_clk_get_all_info_response {
    886 	uint32_t flags;
    887 	uint32_t parent;
    888 	uint32_t parents[MRQ_CLK_MAX_PARENTS];
    889 	uint8_t num_parents;
    890 	uint8_t name[MRQ_CLK_NAME_MAXLEN];
    891 } __ABI_PACKED;
    892 
    893 /** @private */
    894 struct cmd_clk_get_max_clk_id_request {
    895 	EMPTY
    896 } __ABI_PACKED;
    897 
    898 struct cmd_clk_get_max_clk_id_response {
    899 	uint32_t max_id;
    900 } __ABI_PACKED;
    901 /** @} */
    902 
    903 /**
    904  * @ingroup Clocks
    905  * @brief request with #MRQ_CLK
    906  *
    907  * Used by the sender of an #MRQ_CLK message to control clocks. The
    908  * clk_request is split into several sub-commands. Some sub-commands
    909  * require no additional data. Others have a sub-command specific
    910  * payload
    911  *
    912  * |sub-command                 |payload                |
    913  * |----------------------------|-----------------------|
    914  * |CMD_CLK_GET_RATE            |-                      |
    915  * |CMD_CLK_SET_RATE            |clk_set_rate           |
    916  * |CMD_CLK_ROUND_RATE          |clk_round_rate         |
    917  * |CMD_CLK_GET_PARENT          |-                      |
    918  * |CMD_CLK_SET_PARENT          |clk_set_parent         |
    919  * |CMD_CLK_IS_ENABLED          |-                      |
    920  * |CMD_CLK_ENABLE              |-                      |
    921  * |CMD_CLK_DISABLE             |-                      |
    922  * |CMD_CLK_GET_ALL_INFO        |-                      |
    923  * |CMD_CLK_GET_MAX_CLK_ID      |-                      |
    924  *
    925  */
    926 
    927 struct mrq_clk_request {
    928 	/** @brief sub-command and clock id concatenated to 32-bit word.
    929 	 * - bits[31..24] is the sub-cmd.
    930 	 * - bits[23..0] is the clock id
    931 	 */
    932 	uint32_t cmd_and_id;
    933 
    934 	union {
    935 		/** @private */
    936 		struct cmd_clk_get_rate_request clk_get_rate;
    937 		struct cmd_clk_set_rate_request clk_set_rate;
    938 		struct cmd_clk_round_rate_request clk_round_rate;
    939 		/** @private */
    940 		struct cmd_clk_get_parent_request clk_get_parent;
    941 		struct cmd_clk_set_parent_request clk_set_parent;
    942 		/** @private */
    943 		struct cmd_clk_enable_request clk_enable;
    944 		/** @private */
    945 		struct cmd_clk_disable_request clk_disable;
    946 		/** @private */
    947 		struct cmd_clk_is_enabled_request clk_is_enabled;
    948 		/** @private */
    949 		struct cmd_clk_get_all_info_request clk_get_all_info;
    950 		/** @private */
    951 		struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id;
    952 	} __UNION_ANON;
    953 } __ABI_PACKED;
    954 
    955 /**
    956  * @ingroup Clocks
    957  * @brief response to MRQ_CLK
    958  *
    959  * Each sub-command supported by @ref mrq_clk_request may return
    960  * sub-command-specific data. Some do and some do not as indicated in
    961  * the following table
    962  *
    963  * |sub-command                 |payload                 |
    964  * |----------------------------|------------------------|
    965  * |CMD_CLK_GET_RATE            |clk_get_rate            |
    966  * |CMD_CLK_SET_RATE            |clk_set_rate            |
    967  * |CMD_CLK_ROUND_RATE          |clk_round_rate          |
    968  * |CMD_CLK_GET_PARENT          |clk_get_parent          |
    969  * |CMD_CLK_SET_PARENT          |clk_set_parent          |
    970  * |CMD_CLK_IS_ENABLED          |clk_is_enabled          |
    971  * |CMD_CLK_ENABLE              |-                       |
    972  * |CMD_CLK_DISABLE             |-                       |
    973  * |CMD_CLK_GET_ALL_INFO        |clk_get_all_info        |
    974  * |CMD_CLK_GET_MAX_CLK_ID      |clk_get_max_id          |
    975  *
    976  */
    977 
    978 struct mrq_clk_response {
    979 	union {
    980 		struct cmd_clk_get_rate_response clk_get_rate;
    981 		struct cmd_clk_set_rate_response clk_set_rate;
    982 		struct cmd_clk_round_rate_response clk_round_rate;
    983 		struct cmd_clk_get_parent_response clk_get_parent;
    984 		struct cmd_clk_set_parent_response clk_set_parent;
    985 		/** @private */
    986 		struct cmd_clk_enable_response clk_enable;
    987 		/** @private */
    988 		struct cmd_clk_disable_response clk_disable;
    989 		struct cmd_clk_is_enabled_response clk_is_enabled;
    990 		struct cmd_clk_get_all_info_response clk_get_all_info;
    991 		struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id;
    992 	} __UNION_ANON;
    993 } __ABI_PACKED;
    994 
    995 /**
    996  * @ingroup MRQ_Codes
    997  * @def MRQ_QUERY_ABI
    998  * @brief check if an MRQ is implemented
    999  *
   1000  * * Platforms: All
   1001  * * Initiators: Any
   1002  * * Targets: Any
   1003  * * Request Payload: @ref mrq_query_abi_request
   1004  * * Response Payload: @ref mrq_query_abi_response
   1005  */
   1006 
   1007 /**
   1008  * @ingroup ABI_info
   1009  * @brief request with MRQ_QUERY_ABI
   1010  *
   1011  * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
   1012  * by the recipient.
   1013  */
   1014 struct mrq_query_abi_request {
   1015 	/** @brief MRQ code to query */
   1016 	uint32_t mrq;
   1017 } __ABI_PACKED;
   1018 
   1019 /**
   1020  * @ingroup ABI_info
   1021  * @brief response to MRQ_QUERY_ABI
   1022  */
   1023 struct mrq_query_abi_response {
   1024 	/** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
   1025 	int32_t status;
   1026 } __ABI_PACKED;
   1027 
   1028 /**
   1029  * @ingroup MRQ_Codes
   1030  * @def MRQ_PG_READ_STATE
   1031  * @brief read the power-gating state of a partition
   1032  *
   1033  * * Platforms: T186
   1034  * * Initiators: Any
   1035  * * Targets: BPMP
   1036  * * Request Payload: @ref mrq_pg_read_state_request
   1037  * * Response Payload: @ref mrq_pg_read_state_response
   1038  * @addtogroup Powergating
   1039  * @{
   1040  */
   1041 
   1042 /**
   1043  * @brief request with #MRQ_PG_READ_STATE
   1044  *
   1045  * Used by MRQ_PG_READ_STATE call to read the current state of a
   1046  * partition.
   1047  */
   1048 struct mrq_pg_read_state_request {
   1049 	/** @brief ID of partition */
   1050 	uint32_t partition_id;
   1051 } __ABI_PACKED;
   1052 
   1053 /**
   1054  * @brief response to MRQ_PG_READ_STATE
   1055  * @todo define possible errors.
   1056  */
   1057 struct mrq_pg_read_state_response {
   1058 	/** @brief read as don't care */
   1059 	uint32_t sram_state;
   1060 	/** @brief state of power partition
   1061 	 * * 0 : off
   1062 	 * * 1 : on
   1063 	 */
   1064 	uint32_t logic_state;
   1065 } __ABI_PACKED;
   1066 
   1067 /** @} */
   1068 
   1069 /**
   1070  * @ingroup MRQ_Codes
   1071  * @def MRQ_PG_UPDATE_STATE
   1072  * @brief modify the power-gating state of a partition
   1073  *
   1074  * * Platforms: T186
   1075  * * Initiators: Any
   1076  * * Targets: BPMP
   1077  * * Request Payload: @ref mrq_pg_update_state_request
   1078  * * Response Payload: N/A
   1079  * @addtogroup Powergating
   1080  * @{
   1081  */
   1082 
   1083 /**
   1084  * @brief request with mrq_pg_update_state_request
   1085  *
   1086  * Used by #MRQ_PG_UPDATE_STATE call to request BPMP to change the
   1087  * state of a power partition #partition_id.
   1088  */
   1089 struct mrq_pg_update_state_request {
   1090 	/** @brief ID of partition */
   1091 	uint32_t partition_id;
   1092 	/** @brief secondary control of power partition
   1093 	 *  @details Ignored by many versions of the BPMP
   1094 	 *  firmware. For maximum compatibility, set the value
   1095 	 *  according to @logic_state
   1096 	 * *  0x1: power ON partition (@ref logic_state == 0x3)
   1097 	 * *  0x3: power OFF partition (@ref logic_state == 0x1)
   1098 	 */
   1099 	uint32_t sram_state;
   1100 	/** @brief controls state of power partition, legal values are
   1101 	 * *  0x1 : power OFF partition
   1102 	 * *  0x3 : power ON partition
   1103 	 */
   1104 	uint32_t logic_state;
   1105 	/** @brief change state of clocks of the power partition, legal values
   1106 	 * *  0x0 : do not change clock state
   1107 	 * *  0x1 : disable partition clocks (only applicable when
   1108 	 *          @ref logic_state == 0x1)
   1109 	 * *  0x3 : enable partition clocks (only applicable when
   1110 	 *          @ref logic_state == 0x3)
   1111 	 */
   1112 	uint32_t clock_state;
   1113 } __ABI_PACKED;
   1114 /** @} */
   1115 
   1116 /**
   1117  * @ingroup MRQ_Codes
   1118  * @def MRQ_THERMAL
   1119  * @brief interact with BPMP thermal framework
   1120  *
   1121  * * Platforms: T186
   1122  * * Initiators: Any
   1123  * * Targets: Any
   1124  * * Request Payload: TODO
   1125  * * Response Payload: TODO
   1126  *
   1127  * @addtogroup Thermal
   1128  *
   1129  * The BPMP firmware includes a thermal framework. Drivers within the
   1130  * bpmp firmware register with the framework to provide thermal
   1131  * zones. Each thermal zone corresponds to an entity whose temperature
   1132  * can be measured. The framework also has a notion of trip points. A
   1133  * trip point consists of a thermal zone id, a temperature, and a
   1134  * callback routine. The framework invokes the callback when the zone
   1135  * hits the indicated temperature. The BPMP firmware uses this thermal
   1136  * framework interally to implement various temperature-dependent
   1137  * functions.
   1138  *
   1139  * Software on the CPU can use #MRQ_THERMAL (with payload @ref
   1140  * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal
   1141  * framework. The CPU must It can query the number of supported zones,
   1142  * query zone temperatures, and set trip points.
   1143  *
   1144  * When a trip point set by the CPU gets crossed, BPMP firmware issues
   1145  * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a
   1146  * payload of @ref mrq_thermal_bpmp_to_host_request.
   1147  * @{
   1148  */
   1149 enum mrq_thermal_host_to_bpmp_cmd {
   1150 	/**
   1151 	 * @brief Check whether the BPMP driver supports the specified
   1152 	 * request type.
   1153 	 *
   1154 	 * Host needs to supply request parameters.
   1155 	 *
   1156 	 * mrq_response::err is 0 if the specified request is
   1157 	 * supported and -#BPMP_ENODEV otherwise.
   1158 	 */
   1159 	CMD_THERMAL_QUERY_ABI = 0,
   1160 
   1161 	/**
   1162 	 * @brief Get the current temperature of the specified zone.
   1163 	 *
   1164 	 * Host needs to supply request parameters.
   1165 	 *
   1166 	 * mrq_response::err is
   1167 	 * *  0: Temperature query succeeded.
   1168 	 * *  -#BPMP_EINVAL: Invalid request parameters.
   1169 	 * *  -#BPMP_ENOENT: No driver registered for thermal zone..
   1170 	 * *  -#BPMP_EFAULT: Problem reading temperature measurement.
   1171 	 */
   1172 	CMD_THERMAL_GET_TEMP = 1,
   1173 
   1174 	/**
   1175 	 * @brief Enable or disable and set the lower and upper
   1176 	 *   thermal limits for a thermal trip point. Each zone has
   1177 	 *   one trip point.
   1178 	 *
   1179 	 * Host needs to supply request parameters. Once the
   1180 	 * temperature hits a trip point, the BPMP will send a message
   1181 	 * to the CPU having MRQ=MRQ_THERMAL and
   1182 	 * type=CMD_THERMAL_HOST_TRIP_REACHED
   1183 	 *
   1184 	 * mrq_response::err is
   1185 	 * *  0: Trip successfully set.
   1186 	 * *  -#BPMP_EINVAL: Invalid request parameters.
   1187 	 * *  -#BPMP_ENOENT: No driver registered for thermal zone.
   1188 	 * *  -#BPMP_EFAULT: Problem setting trip point.
   1189 	 */
   1190 	CMD_THERMAL_SET_TRIP = 2,
   1191 
   1192 	/**
   1193 	 * @brief Get the number of supported thermal zones.
   1194 	 *
   1195 	 * No request parameters required.
   1196 	 *
   1197 	 * mrq_response::err is always 0, indicating success.
   1198 	 */
   1199 	CMD_THERMAL_GET_NUM_ZONES = 3,
   1200 
   1201 	/** @brief: number of supported host-to-bpmp commands. May
   1202 	 * increase in future
   1203 	 */
   1204 	CMD_THERMAL_HOST_TO_BPMP_NUM
   1205 };
   1206 
   1207 enum mrq_thermal_bpmp_to_host_cmd {
   1208 	/**
   1209 	 * @brief Indication that the temperature for a zone has
   1210 	 *   exceeded the range indicated in the thermal trip point
   1211 	 *   for the zone.
   1212 	 *
   1213 	 * BPMP needs to supply request parameters. Host only needs to
   1214 	 * acknowledge.
   1215 	 */
   1216 	CMD_THERMAL_HOST_TRIP_REACHED = 100,
   1217 
   1218 	/** @brief: number of supported bpmp-to-host commands. May
   1219 	 * increase in future
   1220 	 */
   1221 	CMD_THERMAL_BPMP_TO_HOST_NUM
   1222 };
   1223 
   1224 /*
   1225  * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
   1226  *
   1227  * zone: Request type for which to check existence.
   1228  */
   1229 struct cmd_thermal_query_abi_request {
   1230 	uint32_t type;
   1231 } __ABI_PACKED;
   1232 
   1233 /*
   1234  * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
   1235  *
   1236  * zone: Number of thermal zone.
   1237  */
   1238 struct cmd_thermal_get_temp_request {
   1239 	uint32_t zone;
   1240 } __ABI_PACKED;
   1241 
   1242 /*
   1243  * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
   1244  *
   1245  * error: 0 if request succeeded.
   1246  *	-BPMP_EINVAL if request parameters were invalid.
   1247  *      -BPMP_ENOENT if no driver was registered for the specified thermal zone.
   1248  *      -BPMP_EFAULT for other thermal zone driver errors.
   1249  * temp: Current temperature in millicelsius.
   1250  */
   1251 struct cmd_thermal_get_temp_response {
   1252 	int32_t temp;
   1253 } __ABI_PACKED;
   1254 
   1255 /*
   1256  * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
   1257  *
   1258  * zone: Number of thermal zone.
   1259  * low: Temperature of lower trip point in millicelsius
   1260  * high: Temperature of upper trip point in millicelsius
   1261  * enabled: 1 to enable trip point, 0 to disable trip point
   1262  */
   1263 struct cmd_thermal_set_trip_request {
   1264 	uint32_t zone;
   1265 	int32_t low;
   1266 	int32_t high;
   1267 	uint32_t enabled;
   1268 } __ABI_PACKED;
   1269 
   1270 /*
   1271  * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
   1272  *
   1273  * zone: Number of thermal zone where trip point was reached.
   1274  */
   1275 struct cmd_thermal_host_trip_reached_request {
   1276 	uint32_t zone;
   1277 } __ABI_PACKED;
   1278 
   1279 /*
   1280  * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
   1281  *
   1282  * num: Number of supported thermal zones. The thermal zones are indexed
   1283  *      starting from zero.
   1284  */
   1285 struct cmd_thermal_get_num_zones_response {
   1286 	uint32_t num;
   1287 } __ABI_PACKED;
   1288 
   1289 /*
   1290  * Host->BPMP request data.
   1291  *
   1292  * Reply type is union mrq_thermal_bpmp_to_host_response.
   1293  *
   1294  * type: Type of request. Values listed in enum mrq_thermal_type.
   1295  * data: Request type specific parameters.
   1296  */
   1297 struct mrq_thermal_host_to_bpmp_request {
   1298 	uint32_t type;
   1299 	union {
   1300 		struct cmd_thermal_query_abi_request query_abi;
   1301 		struct cmd_thermal_get_temp_request get_temp;
   1302 		struct cmd_thermal_set_trip_request set_trip;
   1303 	} __UNION_ANON;
   1304 } __ABI_PACKED;
   1305 
   1306 /*
   1307  * BPMP->Host request data.
   1308  *
   1309  * type: Type of request. Values listed in enum mrq_thermal_type.
   1310  * data: Request type specific parameters.
   1311  */
   1312 struct mrq_thermal_bpmp_to_host_request {
   1313 	uint32_t type;
   1314 	union {
   1315 		struct cmd_thermal_host_trip_reached_request host_trip_reached;
   1316 	} __UNION_ANON;
   1317 } __ABI_PACKED;
   1318 
   1319 /*
   1320  * Data in reply to a Host->BPMP request.
   1321  */
   1322 union mrq_thermal_bpmp_to_host_response {
   1323 	struct cmd_thermal_get_temp_response get_temp;
   1324 	struct cmd_thermal_get_num_zones_response get_num_zones;
   1325 } __ABI_PACKED;
   1326 /** @} */
   1327 
   1328 /**
   1329  * @ingroup MRQ_Codes
   1330  * @def MRQ_CPU_VHINT
   1331  * @brief Query CPU voltage hint data
   1332  *
   1333  * * Platforms: T186
   1334  * * Initiators: CCPLEX
   1335  * * Targets: BPMP
   1336  * * Request Payload: @ref mrq_cpu_vhint_request
   1337  * * Response Payload: N/A
   1338  *
   1339  * @addtogroup Vhint CPU Voltage hint
   1340  * @{
   1341  */
   1342 
   1343 /**
   1344  * @brief request with #MRQ_CPU_VHINT
   1345  *
   1346  * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data
   1347  * from BPMP to memory space pointed by #addr. CCPLEX is responsible
   1348  * to allocate sizeof(cpu_vhint_data) sized block of memory and
   1349  * appropriately map it for BPMP before sending the request.
   1350  */
   1351 struct mrq_cpu_vhint_request {
   1352 	/** @brief IOVA address for the #cpu_vhint_data */
   1353 	uint32_t addr; /* struct cpu_vhint_data * */
   1354 	/** @brief ID of the cluster whose data is requested */
   1355 	uint32_t cluster_id; /* enum cluster_id */
   1356 } __ABI_PACKED;
   1357 
   1358 /**
   1359  * @brief description of the CPU v/f relation
   1360  *
   1361  * Used by #MRQ_CPU_VHINT call to carry data pointed by #addr of
   1362  * struct mrq_cpu_vhint_request
   1363  */
   1364 struct cpu_vhint_data {
   1365 	uint32_t ref_clk_hz; /**< reference frequency in Hz */
   1366 	uint16_t pdiv; /**< post divider value */
   1367 	uint16_t mdiv; /**< input divider value */
   1368 	uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */
   1369 	/** table of ndiv values as a function of vINDEX (voltage index) */
   1370 	uint16_t ndiv[80];
   1371 	/** minimum allowed NDIV value */
   1372 	uint16_t ndiv_min;
   1373 	/** minimum allowed voltage hint value (as in vINDEX) */
   1374 	uint16_t vfloor;
   1375 	/** maximum allowed voltage hint value (as in vINDEX) */
   1376 	uint16_t vceil;
   1377 	/** post-multiplier for vindex value */
   1378 	uint16_t vindex_mult;
   1379 	/** post-divider for vindex value */
   1380 	uint16_t vindex_div;
   1381 	/** reserved for future use */
   1382 	uint16_t reserved[328];
   1383 } __ABI_PACKED;
   1384 
   1385 /** @} */
   1386 
   1387 /**
   1388  * @ingroup MRQ_Codes
   1389  * @def MRQ_ABI_RATCHET
   1390  * @brief ABI ratchet value query
   1391  *
   1392  * * Platforms: T186
   1393  * * Initiators: Any
   1394  * * Targets: BPMP
   1395  * * Request Payload: @ref mrq_abi_ratchet_request
   1396  * * Response Payload: @ref mrq_abi_ratchet_response
   1397  * @addtogroup ABI_info
   1398  * @{
   1399  */
   1400 
   1401 /**
   1402  * @brief an ABI compatibility mechanism
   1403  *
   1404  * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future
   1405  * revision of this header file.
   1406  * 1. That future revision deprecates some MRQ
   1407  * 2. That future revision introduces a breaking change to an existing
   1408  *    MRQ or
   1409  * 3. A bug is discovered in an existing implementation of the BPMP-FW
   1410  *    (or possibly one of its clients) which warrants deprecating that
   1411  *    implementation.
   1412  */
   1413 #define BPMP_ABI_RATCHET_VALUE 3
   1414 
   1415 /**
   1416  * @brief request with #MRQ_ABI_RATCHET.
   1417  *
   1418  * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
   1419  * against which the requester was compiled.
   1420  *
   1421  * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may
   1422  * reply with mrq_response::err = -#BPMP_ERANGE to indicate that
   1423  * BPMP-FW cannot interoperate correctly with the requester. Requester
   1424  * should cease further communication with BPMP.
   1425  *
   1426  * Otherwise, err shall be 0.
   1427  */
   1428 struct mrq_abi_ratchet_request {
   1429 	/** @brief requester's ratchet value */
   1430 	uint16_t ratchet;
   1431 };
   1432 
   1433 /**
   1434  * @brief response to #MRQ_ABI_RATCHET
   1435  *
   1436  * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
   1437  * against which BPMP firwmare was compiled.
   1438  *
   1439  * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE,
   1440  * the requster must either interoperate with BPMP according to an ABI
   1441  * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease
   1442  * communication with BPMP.
   1443  *
   1444  * If mrq_response::err is 0 and ratchet is greater than or equal to the
   1445  * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue
   1446  * normal operation.
   1447  */
   1448 struct mrq_abi_ratchet_response {
   1449 	/** @brief BPMP's ratchet value */
   1450 	uint16_t ratchet;
   1451 };
   1452 /** @} */
   1453 
   1454 /**
   1455  * @ingroup MRQ_Codes
   1456  * @def MRQ_EMC_DVFS_LATENCY
   1457  * @brief query frequency dependent EMC DVFS latency
   1458  *
   1459  * * Platforms: T186
   1460  * * Initiators: CCPLEX
   1461  * * Targets: BPMP
   1462  * * Request Payload: N/A
   1463  * * Response Payload: @ref mrq_emc_dvfs_latency_response
   1464  * @addtogroup EMC
   1465  * @{
   1466  */
   1467 
   1468 /**
   1469  * @brief used by @ref mrq_emc_dvfs_latency_response
   1470  */
   1471 struct emc_dvfs_latency {
   1472 	/** @brief EMC frequency in kHz */
   1473 	uint32_t freq;
   1474 	/** @brief EMC DVFS latency in nanoseconds */
   1475 	uint32_t latency;
   1476 } __ABI_PACKED;
   1477 
   1478 #define EMC_DVFS_LATENCY_MAX_SIZE	14
   1479 /**
   1480  * @brief response to #MRQ_EMC_DVFS_LATENCY
   1481  */
   1482 struct mrq_emc_dvfs_latency_response {
   1483 	/** @brief the number valid entries in #pairs */
   1484 	uint32_t num_pairs;
   1485 	/** @brief EMC <frequency, latency> information */
   1486 	struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE];
   1487 } __ABI_PACKED;
   1488 
   1489 /** @} */
   1490 
   1491 /**
   1492  * @ingroup MRQ_Codes
   1493  * @def MRQ_TRACE_ITER
   1494  * @brief manage the trace iterator
   1495  *
   1496  * * Platforms: All
   1497  * * Initiators: CCPLEX
   1498  * * Targets: BPMP
   1499  * * Request Payload: N/A
   1500  * * Response Payload: @ref mrq_trace_iter_request
   1501  * @addtogroup Trace
   1502  * @{
   1503  */
   1504 enum {
   1505 	/** @brief (re)start the tracing now. Ignore older events */
   1506 	TRACE_ITER_INIT = 0,
   1507 	/** @brief clobber all events in the trace buffer */
   1508 	TRACE_ITER_CLEAN = 1
   1509 };
   1510 
   1511 /**
   1512  * @brief request with #MRQ_TRACE_ITER
   1513  */
   1514 struct mrq_trace_iter_request {
   1515 	/** @brief TRACE_ITER_INIT or TRACE_ITER_CLEAN */
   1516 	uint32_t cmd;
   1517 } __ABI_PACKED;
   1518 
   1519 /** @} */
   1520 
   1521 /*
   1522  *  4. Enumerations
   1523  */
   1524 
   1525 /*
   1526  *   4.1 CPU enumerations
   1527  *
   1528  * See <mach-t186/system-t186.h>
   1529  *
   1530  *   4.2 CPU Cluster enumerations
   1531  *
   1532  * See <mach-t186/system-t186.h>
   1533  *
   1534  *   4.3 System low power state enumerations
   1535  *
   1536  * See <mach-t186/system-t186.h>
   1537  */
   1538 
   1539 /*
   1540  *   4.4 Clock enumerations
   1541  *
   1542  * For clock enumerations, see <mach-t186/clk-t186.h>
   1543  */
   1544 
   1545 /*
   1546  *   4.5 Reset enumerations
   1547  *
   1548  * For reset enumerations, see <mach-t186/reset-t186.h>
   1549  */
   1550 
   1551 /*
   1552  *   4.6 Thermal sensor enumerations
   1553  *
   1554  * For thermal sensor enumerations, see <mach-t186/thermal-t186.h>
   1555  */
   1556 
   1557 /**
   1558  * @defgroup Error_Codes
   1559  * Negative values for mrq_response::err generally indicate some
   1560  * error. The ABI defines the following error codes. Negating these
   1561  * defines is an exercise left to the user.
   1562  * @{
   1563  */
   1564 /** @brief No such file or directory */
   1565 #define BPMP_ENOENT	2
   1566 /** @brief No MRQ handler */
   1567 #define BPMP_ENOHANDLER	3
   1568 /** @brief I/O error */
   1569 #define BPMP_EIO	5
   1570 /** @brief Bad sub-MRQ command */
   1571 #define BPMP_EBADCMD	6
   1572 /** @brief Not enough memory */
   1573 #define BPMP_ENOMEM	12
   1574 /** @brief Permission denied */
   1575 #define BPMP_EACCES	13
   1576 /** @brief Bad address */
   1577 #define BPMP_EFAULT	14
   1578 /** @brief No such device */
   1579 #define BPMP_ENODEV	19
   1580 /** @brief Argument is a directory */
   1581 #define BPMP_EISDIR	21
   1582 /** @brief Invalid argument */
   1583 #define BPMP_EINVAL	22
   1584 /** @brief Timeout during operation */
   1585 #define BPMP_ETIMEDOUT  23
   1586 /** @brief Out of range */
   1587 #define BPMP_ERANGE	34
   1588 /** @} */
   1589 /** @} */
   1590 #endif
   1591