xref: /openbmc/u-boot/arch/arm/include/asm/arch-tegra/bpmp_abi.h (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */
273dd5c4cSStephen Warren /*
373dd5c4cSStephen Warren  * Copyright (c) 2014-2016, NVIDIA CORPORATION.
473dd5c4cSStephen Warren  */
573dd5c4cSStephen Warren 
673dd5c4cSStephen Warren #ifndef _ABI_BPMP_ABI_H_
773dd5c4cSStephen Warren #define _ABI_BPMP_ABI_H_
873dd5c4cSStephen Warren 
973dd5c4cSStephen Warren #ifdef LK
1073dd5c4cSStephen Warren #include <stdint.h>
1173dd5c4cSStephen Warren #endif
1273dd5c4cSStephen Warren 
1373dd5c4cSStephen Warren #ifndef __ABI_PACKED
1473dd5c4cSStephen Warren #define __ABI_PACKED __attribute__((packed))
1573dd5c4cSStephen Warren #endif
1673dd5c4cSStephen Warren 
1773dd5c4cSStephen Warren #ifdef NO_GCC_EXTENSIONS
1873dd5c4cSStephen Warren #define EMPTY char empty;
1973dd5c4cSStephen Warren #define EMPTY_ARRAY 1
2073dd5c4cSStephen Warren #else
2173dd5c4cSStephen Warren #define EMPTY
2273dd5c4cSStephen Warren #define EMPTY_ARRAY 0
2373dd5c4cSStephen Warren #endif
2473dd5c4cSStephen Warren 
2573dd5c4cSStephen Warren #ifndef __UNION_ANON
2673dd5c4cSStephen Warren #define __UNION_ANON
2773dd5c4cSStephen Warren #endif
2873dd5c4cSStephen Warren /**
2973dd5c4cSStephen Warren  * @file
3073dd5c4cSStephen Warren  */
3173dd5c4cSStephen Warren 
3273dd5c4cSStephen Warren 
3373dd5c4cSStephen Warren /**
3473dd5c4cSStephen Warren  * @defgroup MRQ MRQ Messages
3573dd5c4cSStephen Warren  * @brief Messages sent to/from BPMP via IPC
3673dd5c4cSStephen Warren  * @{
3773dd5c4cSStephen Warren  *   @defgroup MRQ_Format Message Format
3873dd5c4cSStephen Warren  *   @defgroup MRQ_Codes Message Request (MRQ) Codes
3973dd5c4cSStephen Warren  *   @defgroup MRQ_Payloads Message Payloads
4073dd5c4cSStephen Warren  *   @defgroup Error_Codes Error Codes
4173dd5c4cSStephen Warren  * @}
4273dd5c4cSStephen Warren  */
4373dd5c4cSStephen Warren 
4473dd5c4cSStephen Warren /**
4573dd5c4cSStephen Warren  * @addtogroup MRQ_Format Message Format
4673dd5c4cSStephen Warren  * @{
4773dd5c4cSStephen Warren  * The CPU requests the BPMP to perform a particular service by
4873dd5c4cSStephen Warren  * sending it an IVC frame containing a single MRQ message. An MRQ
4973dd5c4cSStephen Warren  * message consists of a @ref mrq_request followed by a payload whose
5073dd5c4cSStephen Warren  * format depends on mrq_request::mrq.
5173dd5c4cSStephen Warren  *
5273dd5c4cSStephen Warren  * The BPMP processes the data and replies with an IVC frame (on the
5373dd5c4cSStephen Warren  * same IVC channel) containing and MRQ response. An MRQ response
5473dd5c4cSStephen Warren  * consists of a @ref mrq_response followed by a payload whose format
5573dd5c4cSStephen Warren  * depends on the associated mrq_request::mrq.
5673dd5c4cSStephen Warren  *
5773dd5c4cSStephen Warren  * A well-defined subset of the MRQ messages that the CPU sends to the
5873dd5c4cSStephen Warren  * BPMP can lead to BPMP eventually sending an MRQ message to the
5973dd5c4cSStephen Warren  * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
6073dd5c4cSStephen Warren  * a thermal trip point, the BPMP may eventually send a single
6173dd5c4cSStephen Warren  * #MRQ_THERMAL message of its own to the CPU indicating that the trip
6273dd5c4cSStephen Warren  * point has been crossed.
6373dd5c4cSStephen Warren  * @}
6473dd5c4cSStephen Warren  */
6573dd5c4cSStephen Warren 
6673dd5c4cSStephen Warren /**
6773dd5c4cSStephen Warren  * @ingroup MRQ_Format
6873dd5c4cSStephen Warren  * @brief header for an MRQ message
6973dd5c4cSStephen Warren  *
7073dd5c4cSStephen Warren  * Provides the MRQ number for the MRQ message: #mrq. The remainder of
7173dd5c4cSStephen Warren  * the MRQ message is a payload (immediately following the
7273dd5c4cSStephen Warren  * mrq_request) whose format depends on mrq.
7373dd5c4cSStephen Warren  *
7473dd5c4cSStephen Warren  * @todo document the flags
7573dd5c4cSStephen Warren  */
7673dd5c4cSStephen Warren struct mrq_request {
7773dd5c4cSStephen Warren 	/** @brief MRQ number of the request */
7873dd5c4cSStephen Warren 	uint32_t mrq;
7973dd5c4cSStephen Warren 	/** @brief flags for the request */
8073dd5c4cSStephen Warren 	uint32_t flags;
8173dd5c4cSStephen Warren } __ABI_PACKED;
8273dd5c4cSStephen Warren 
8373dd5c4cSStephen Warren /**
8473dd5c4cSStephen Warren  * @ingroup MRQ_Format
8573dd5c4cSStephen Warren  * @brief header for an MRQ response
8673dd5c4cSStephen Warren  *
8773dd5c4cSStephen Warren  *  Provides an error code for the associated MRQ message. The
8873dd5c4cSStephen Warren  *  remainder of the MRQ response is a payload (immediately following
8973dd5c4cSStephen Warren  *  the mrq_response) whose format depends on the associated
9073dd5c4cSStephen Warren  *  mrq_request::mrq
9173dd5c4cSStephen Warren  *
9273dd5c4cSStephen Warren  * @todo document the flags
9373dd5c4cSStephen Warren  */
9473dd5c4cSStephen Warren struct mrq_response {
9573dd5c4cSStephen Warren 	/** @brief error code for the MRQ request itself */
9673dd5c4cSStephen Warren 	int32_t err;
9773dd5c4cSStephen Warren 	/** @brief flags for the response */
9873dd5c4cSStephen Warren 	uint32_t flags;
9973dd5c4cSStephen Warren } __ABI_PACKED;
10073dd5c4cSStephen Warren 
10173dd5c4cSStephen Warren /**
10273dd5c4cSStephen Warren  * @ingroup MRQ_Format
10373dd5c4cSStephen Warren  * Minimum needed size for an IPC message buffer
10473dd5c4cSStephen Warren  */
10573dd5c4cSStephen Warren #define MSG_MIN_SZ	128
10673dd5c4cSStephen Warren /**
10773dd5c4cSStephen Warren  * @ingroup MRQ_Format
10873dd5c4cSStephen Warren  *  Minimum size guaranteed for data in an IPC message buffer
10973dd5c4cSStephen Warren  */
11073dd5c4cSStephen Warren #define MSG_DATA_MIN_SZ	120
11173dd5c4cSStephen Warren 
11273dd5c4cSStephen Warren /**
11373dd5c4cSStephen Warren  * @ingroup MRQ_Codes
11473dd5c4cSStephen Warren  * @name Legal MRQ codes
11573dd5c4cSStephen Warren  * These are the legal values for mrq_request::mrq
11673dd5c4cSStephen Warren  * @{
11773dd5c4cSStephen Warren  */
11873dd5c4cSStephen Warren 
11973dd5c4cSStephen Warren #define MRQ_PING		0
12073dd5c4cSStephen Warren #define MRQ_QUERY_TAG		1
12173dd5c4cSStephen Warren #define MRQ_MODULE_LOAD		4
12273dd5c4cSStephen Warren #define MRQ_MODULE_UNLOAD	5
12373dd5c4cSStephen Warren #define MRQ_TRACE_MODIFY	7
12473dd5c4cSStephen Warren #define MRQ_WRITE_TRACE		8
12573dd5c4cSStephen Warren #define MRQ_THREADED_PING	9
12673dd5c4cSStephen Warren #define MRQ_MODULE_MAIL		11
12773dd5c4cSStephen Warren #define MRQ_DEBUGFS		19
12873dd5c4cSStephen Warren #define MRQ_RESET		20
12973dd5c4cSStephen Warren #define MRQ_I2C			21
13073dd5c4cSStephen Warren #define MRQ_CLK			22
13173dd5c4cSStephen Warren #define MRQ_QUERY_ABI		23
13273dd5c4cSStephen Warren #define MRQ_PG_READ_STATE	25
13373dd5c4cSStephen Warren #define MRQ_PG_UPDATE_STATE	26
13473dd5c4cSStephen Warren #define MRQ_THERMAL		27
13573dd5c4cSStephen Warren #define MRQ_CPU_VHINT		28
13673dd5c4cSStephen Warren #define MRQ_ABI_RATCHET		29
13773dd5c4cSStephen Warren #define MRQ_EMC_DVFS_LATENCY	31
13873dd5c4cSStephen Warren #define MRQ_TRACE_ITER		64
13973dd5c4cSStephen Warren 
14073dd5c4cSStephen Warren /** @} */
14173dd5c4cSStephen Warren 
14273dd5c4cSStephen Warren /**
14373dd5c4cSStephen Warren  * @ingroup MRQ_Codes
14473dd5c4cSStephen Warren  * @brief Maximum MRQ code to be sent by CPU software to
14573dd5c4cSStephen Warren  * BPMP. Subject to change in future
14673dd5c4cSStephen Warren  */
14773dd5c4cSStephen Warren #define MAX_CPU_MRQ_ID		64
14873dd5c4cSStephen Warren 
14973dd5c4cSStephen Warren /**
15073dd5c4cSStephen Warren  * @addtogroup MRQ_Payloads Message Payloads
15173dd5c4cSStephen Warren  * @{
15273dd5c4cSStephen Warren  *   @defgroup Ping
15373dd5c4cSStephen Warren  *   @defgroup Query_Tag Query Tag
15473dd5c4cSStephen Warren  *   @defgroup Module Loadable Modules
15573dd5c4cSStephen Warren  *   @defgroup Trace
15673dd5c4cSStephen Warren  *   @defgroup Debugfs
15773dd5c4cSStephen Warren  *   @defgroup Reset
15873dd5c4cSStephen Warren  *   @defgroup I2C
15973dd5c4cSStephen Warren  *   @defgroup Clocks
16073dd5c4cSStephen Warren  *   @defgroup ABI_info ABI Info
16173dd5c4cSStephen Warren  *   @defgroup MC_Flush MC Flush
16273dd5c4cSStephen Warren  *   @defgroup Powergating
16373dd5c4cSStephen Warren  *   @defgroup Thermal
16473dd5c4cSStephen Warren  *   @defgroup Vhint CPU Voltage hint
16573dd5c4cSStephen Warren  *   @defgroup MRQ_Deprecated Deprecated MRQ messages
16673dd5c4cSStephen Warren  *   @defgroup EMC
16773dd5c4cSStephen Warren  * @}
16873dd5c4cSStephen Warren  */
16973dd5c4cSStephen Warren 
17073dd5c4cSStephen Warren 
17173dd5c4cSStephen Warren /**
17273dd5c4cSStephen Warren  * @ingroup MRQ_Codes
17373dd5c4cSStephen Warren  * @def MRQ_PING
17473dd5c4cSStephen Warren  * @brief A simple ping
17573dd5c4cSStephen Warren  *
17673dd5c4cSStephen Warren  * * Platforms: All
17773dd5c4cSStephen Warren  * * Initiators: Any
17873dd5c4cSStephen Warren  * * Targets: Any
17973dd5c4cSStephen Warren  * * Request Payload: @ref mrq_ping_request
18073dd5c4cSStephen Warren  * * Response Payload: @ref mrq_ping_response
18173dd5c4cSStephen Warren  *
18273dd5c4cSStephen Warren  * @ingroup MRQ_Codes
18373dd5c4cSStephen Warren  * @def MRQ_THREADED_PING
18473dd5c4cSStephen Warren  * @brief A deeper ping
18573dd5c4cSStephen Warren  *
18673dd5c4cSStephen Warren  * * Platforms: All
18773dd5c4cSStephen Warren  * * Initiators: Any
18873dd5c4cSStephen Warren  * * Targets: BPMP
18973dd5c4cSStephen Warren  * * Request Payload: @ref mrq_ping_request
19073dd5c4cSStephen Warren  * * Response Payload: @ref mrq_ping_response
19173dd5c4cSStephen Warren  *
19273dd5c4cSStephen Warren  * Behavior is equivalent to a simple #MRQ_PING except that BPMP
19373dd5c4cSStephen Warren  * responds from a thread context (providing a slightly more robust
19473dd5c4cSStephen Warren  * sign of life).
19573dd5c4cSStephen Warren  *
19673dd5c4cSStephen Warren  */
19773dd5c4cSStephen Warren 
19873dd5c4cSStephen Warren /**
19973dd5c4cSStephen Warren  * @ingroup Ping
20073dd5c4cSStephen Warren  * @brief request with #MRQ_PING
20173dd5c4cSStephen Warren  *
20273dd5c4cSStephen Warren  * Used by the sender of an #MRQ_PING message to request a pong from
20373dd5c4cSStephen Warren  * recipient. The response from the recipient is computed based on
20473dd5c4cSStephen Warren  * #challenge.
20573dd5c4cSStephen Warren  */
20673dd5c4cSStephen Warren struct mrq_ping_request {
20773dd5c4cSStephen Warren /** @brief arbitrarily chosen value */
20873dd5c4cSStephen Warren 	uint32_t challenge;
20973dd5c4cSStephen Warren } __ABI_PACKED;
21073dd5c4cSStephen Warren 
21173dd5c4cSStephen Warren /**
21273dd5c4cSStephen Warren  * @ingroup Ping
21373dd5c4cSStephen Warren  * @brief response to #MRQ_PING
21473dd5c4cSStephen Warren  *
21573dd5c4cSStephen Warren  * Sent in response to an #MRQ_PING message. #reply should be the
21673dd5c4cSStephen Warren  * mrq_ping_request challenge left shifted by 1 with the carry-bit
21773dd5c4cSStephen Warren  * dropped.
21873dd5c4cSStephen Warren  *
21973dd5c4cSStephen Warren  */
22073dd5c4cSStephen Warren struct mrq_ping_response {
22173dd5c4cSStephen Warren 	/** @brief response to the MRQ_PING challege */
22273dd5c4cSStephen Warren 	uint32_t reply;
22373dd5c4cSStephen Warren } __ABI_PACKED;
22473dd5c4cSStephen Warren 
22573dd5c4cSStephen Warren /**
22673dd5c4cSStephen Warren  * @ingroup MRQ_Codes
22773dd5c4cSStephen Warren  * @def MRQ_QUERY_TAG
22873dd5c4cSStephen Warren  * @brief Query BPMP firmware's tag (i.e. version information)
22973dd5c4cSStephen Warren  *
23073dd5c4cSStephen Warren  * * Platforms: All
23173dd5c4cSStephen Warren  * * Initiators: CCPLEX
23273dd5c4cSStephen Warren  * * Targets: BPMP
23373dd5c4cSStephen Warren  * * Request Payload: @ref mrq_query_tag_request
23473dd5c4cSStephen Warren  * * Response Payload: N/A
23573dd5c4cSStephen Warren  *
23673dd5c4cSStephen Warren  */
23773dd5c4cSStephen Warren 
23873dd5c4cSStephen Warren /**
23973dd5c4cSStephen Warren  * @ingroup Query_Tag
24073dd5c4cSStephen Warren  * @brief request with #MRQ_QUERY_TAG
24173dd5c4cSStephen Warren  *
24273dd5c4cSStephen Warren  * Used by #MRQ_QUERY_TAG call to ask BPMP to fill in the memory
24373dd5c4cSStephen Warren  * pointed by #addr with BPMP firmware header.
24473dd5c4cSStephen Warren  *
24573dd5c4cSStephen Warren  * The sender is reponsible for ensuring that #addr is mapped in to
24673dd5c4cSStephen Warren  * the recipient's address map.
24773dd5c4cSStephen Warren  */
24873dd5c4cSStephen Warren struct mrq_query_tag_request {
24973dd5c4cSStephen Warren   /** @brief base address to store the firmware header */
25073dd5c4cSStephen Warren 	uint32_t addr;
25173dd5c4cSStephen Warren } __ABI_PACKED;
25273dd5c4cSStephen Warren 
25373dd5c4cSStephen Warren /**
25473dd5c4cSStephen Warren  * @ingroup MRQ_Codes
25573dd5c4cSStephen Warren  * @def MRQ_MODULE_LOAD
25673dd5c4cSStephen Warren  * @brief dynamically load a BPMP code module
25773dd5c4cSStephen Warren  *
25873dd5c4cSStephen Warren  * * Platforms: All
25973dd5c4cSStephen Warren  * * Initiators: CCPLEX
26073dd5c4cSStephen Warren  * * Targets: BPMP
26173dd5c4cSStephen Warren  * * Request Payload: @ref mrq_module_load_request
26273dd5c4cSStephen Warren  * * Response Payload: @ref mrq_module_load_response
26373dd5c4cSStephen Warren  *
26473dd5c4cSStephen Warren  * @note This MRQ is disabled on production systems
26573dd5c4cSStephen Warren  *
26673dd5c4cSStephen Warren  */
26773dd5c4cSStephen Warren 
26873dd5c4cSStephen Warren /**
26973dd5c4cSStephen Warren  * @ingroup Module
27073dd5c4cSStephen Warren  * @brief request with #MRQ_MODULE_LOAD
27173dd5c4cSStephen Warren  *
27273dd5c4cSStephen Warren  * Used by #MRQ_MODULE_LOAD calls to ask the recipient to dynamically
27373dd5c4cSStephen Warren  * load the code located at #phys_addr and having size #size
27473dd5c4cSStephen Warren  * bytes. #phys_addr is treated as a void pointer.
27573dd5c4cSStephen Warren  *
27673dd5c4cSStephen Warren  * The recipient copies the code from #phys_addr to locally allocated
27773dd5c4cSStephen Warren  * memory prior to responding to this message.
27873dd5c4cSStephen Warren  *
27973dd5c4cSStephen Warren  * @todo document the module header format
28073dd5c4cSStephen Warren  *
28173dd5c4cSStephen Warren  * The sender is responsible for ensuring that the code is mapped in
28273dd5c4cSStephen Warren  * the recipient's address map.
28373dd5c4cSStephen Warren  *
28473dd5c4cSStephen Warren  */
28573dd5c4cSStephen Warren struct mrq_module_load_request {
28673dd5c4cSStephen Warren 	/** @brief base address of the code to load. Treated as (void *) */
28773dd5c4cSStephen Warren 	uint32_t phys_addr; /* (void *) */
28873dd5c4cSStephen Warren 	/** @brief size in bytes of code to load */
28973dd5c4cSStephen Warren 	uint32_t size;
29073dd5c4cSStephen Warren } __ABI_PACKED;
29173dd5c4cSStephen Warren 
29273dd5c4cSStephen Warren /**
29373dd5c4cSStephen Warren  * @ingroup Module
29473dd5c4cSStephen Warren  * @brief response to #MRQ_MODULE_LOAD
29573dd5c4cSStephen Warren  *
29673dd5c4cSStephen Warren  * @todo document mrq_response::err
29773dd5c4cSStephen Warren  */
29873dd5c4cSStephen Warren struct mrq_module_load_response {
29973dd5c4cSStephen Warren 	/** @brief handle to the loaded module */
30073dd5c4cSStephen Warren 	uint32_t base;
30173dd5c4cSStephen Warren } __ABI_PACKED;
30273dd5c4cSStephen Warren 
30373dd5c4cSStephen Warren /**
30473dd5c4cSStephen Warren  * @ingroup MRQ_Codes
30573dd5c4cSStephen Warren  * @def MRQ_MODULE_UNLOAD
30673dd5c4cSStephen Warren  * @brief unload a previously loaded code module
30773dd5c4cSStephen Warren  *
30873dd5c4cSStephen Warren  * * Platforms: All
30973dd5c4cSStephen Warren  * * Initiators: CCPLEX
31073dd5c4cSStephen Warren  * * Targets: BPMP
31173dd5c4cSStephen Warren  * * Request Payload: @ref mrq_module_unload_request
31273dd5c4cSStephen Warren  * * Response Payload: N/A
31373dd5c4cSStephen Warren  *
31473dd5c4cSStephen Warren  * @note This MRQ is disabled on production systems
31573dd5c4cSStephen Warren  */
31673dd5c4cSStephen Warren 
31773dd5c4cSStephen Warren /**
31873dd5c4cSStephen Warren  * @ingroup Module
31973dd5c4cSStephen Warren  * @brief request with #MRQ_MODULE_UNLOAD
32073dd5c4cSStephen Warren  *
32173dd5c4cSStephen Warren  * Used by #MRQ_MODULE_UNLOAD calls to request that a previously loaded
32273dd5c4cSStephen Warren  * module be unloaded.
32373dd5c4cSStephen Warren  */
32473dd5c4cSStephen Warren struct mrq_module_unload_request {
32573dd5c4cSStephen Warren 	/** @brief handle of the module to unload */
32673dd5c4cSStephen Warren 	uint32_t base;
32773dd5c4cSStephen Warren } __ABI_PACKED;
32873dd5c4cSStephen Warren 
32973dd5c4cSStephen Warren /**
33073dd5c4cSStephen Warren  * @ingroup MRQ_Codes
33173dd5c4cSStephen Warren  * @def MRQ_TRACE_MODIFY
33273dd5c4cSStephen Warren  * @brief modify the set of enabled trace events
33373dd5c4cSStephen Warren  *
33473dd5c4cSStephen Warren  * * Platforms: All
33573dd5c4cSStephen Warren  * * Initiators: CCPLEX
33673dd5c4cSStephen Warren  * * Targets: BPMP
33773dd5c4cSStephen Warren  * * Request Payload: @ref mrq_trace_modify_request
33873dd5c4cSStephen Warren  * * Response Payload: @ref mrq_trace_modify_response
33973dd5c4cSStephen Warren  *
34073dd5c4cSStephen Warren  * @note This MRQ is disabled on production systems
34173dd5c4cSStephen Warren  */
34273dd5c4cSStephen Warren 
34373dd5c4cSStephen Warren /**
34473dd5c4cSStephen Warren  * @ingroup Trace
34573dd5c4cSStephen Warren  * @brief request with #MRQ_TRACE_MODIFY
34673dd5c4cSStephen Warren  *
34773dd5c4cSStephen Warren  * Used by %MRQ_TRACE_MODIFY calls to enable or disable specify trace
34873dd5c4cSStephen Warren  * events.  #set takes precedence for any bit set in both #set and
34973dd5c4cSStephen Warren  * #clr.
35073dd5c4cSStephen Warren  */
35173dd5c4cSStephen Warren struct mrq_trace_modify_request {
35273dd5c4cSStephen Warren 	/** @brief bit mask of trace events to disable */
35373dd5c4cSStephen Warren 	uint32_t clr;
35473dd5c4cSStephen Warren 	/** @brief bit mask of trace events to enable */
35573dd5c4cSStephen Warren 	uint32_t set;
35673dd5c4cSStephen Warren } __ABI_PACKED;
35773dd5c4cSStephen Warren 
35873dd5c4cSStephen Warren /**
35973dd5c4cSStephen Warren  * @ingroup Trace
36073dd5c4cSStephen Warren  * @brief response to #MRQ_TRACE_MODIFY
36173dd5c4cSStephen Warren  *
36273dd5c4cSStephen Warren  * Sent in repsonse to an #MRQ_TRACE_MODIFY message. #mask reflects the
36373dd5c4cSStephen Warren  * state of which events are enabled after the recipient acted on the
36473dd5c4cSStephen Warren  * message.
36573dd5c4cSStephen Warren  *
36673dd5c4cSStephen Warren  */
36773dd5c4cSStephen Warren struct mrq_trace_modify_response {
36873dd5c4cSStephen Warren 	/** @brief bit mask of trace event enable states */
36973dd5c4cSStephen Warren 	uint32_t mask;
37073dd5c4cSStephen Warren } __ABI_PACKED;
37173dd5c4cSStephen Warren 
37273dd5c4cSStephen Warren /**
37373dd5c4cSStephen Warren  * @ingroup MRQ_Codes
37473dd5c4cSStephen Warren  * @def MRQ_WRITE_TRACE
37573dd5c4cSStephen Warren  * @brief Write trace data to a buffer
37673dd5c4cSStephen Warren  *
37773dd5c4cSStephen Warren  * * Platforms: All
37873dd5c4cSStephen Warren  * * Initiators: CCPLEX
37973dd5c4cSStephen Warren  * * Targets: BPMP
38073dd5c4cSStephen Warren  * * Request Payload: @ref mrq_write_trace_request
38173dd5c4cSStephen Warren  * * Response Payload: @ref mrq_write_trace_response
38273dd5c4cSStephen Warren  *
38373dd5c4cSStephen Warren  * mrq_response::err depends on the @ref mrq_write_trace_request field
38473dd5c4cSStephen Warren  * values. err is -#BPMP_EINVAL if size is zero or area is NULL or
38573dd5c4cSStephen Warren  * area is in an illegal range. A positive value for err indicates the
38673dd5c4cSStephen Warren  * number of bytes written to area.
38773dd5c4cSStephen Warren  *
38873dd5c4cSStephen Warren  * @note This MRQ is disabled on production systems
38973dd5c4cSStephen Warren  */
39073dd5c4cSStephen Warren 
39173dd5c4cSStephen Warren /**
39273dd5c4cSStephen Warren  * @ingroup Trace
39373dd5c4cSStephen Warren  * @brief request with #MRQ_WRITE_TRACE
39473dd5c4cSStephen Warren  *
39573dd5c4cSStephen Warren  * Used by MRQ_WRITE_TRACE calls to ask the recipient to copy trace
39673dd5c4cSStephen Warren  * data from the recipient's local buffer to the output buffer. #area
39773dd5c4cSStephen Warren  * is treated as a byte-aligned pointer in the recipient's address
39873dd5c4cSStephen Warren  * space.
39973dd5c4cSStephen Warren  *
40073dd5c4cSStephen Warren  * The sender is responsible for ensuring that the output
40173dd5c4cSStephen Warren  * buffer is mapped in the recipient's address map. The recipient is
40273dd5c4cSStephen Warren  * responsible for protecting its own code and data from accidental
40373dd5c4cSStephen Warren  * overwrites.
40473dd5c4cSStephen Warren  */
40573dd5c4cSStephen Warren struct mrq_write_trace_request {
40673dd5c4cSStephen Warren 	/** @brief base address of output buffer */
40773dd5c4cSStephen Warren 	uint32_t area;
40873dd5c4cSStephen Warren 	/** @brief size in bytes of the output buffer */
40973dd5c4cSStephen Warren 	uint32_t size;
41073dd5c4cSStephen Warren } __ABI_PACKED;
41173dd5c4cSStephen Warren 
41273dd5c4cSStephen Warren /**
41373dd5c4cSStephen Warren  * @ingroup Trace
41473dd5c4cSStephen Warren  * @brief response to #MRQ_WRITE_TRACE
41573dd5c4cSStephen Warren  *
41673dd5c4cSStephen Warren  * Once this response is sent, the respondent will not access the
41773dd5c4cSStephen Warren  * output buffer further.
41873dd5c4cSStephen Warren  */
41973dd5c4cSStephen Warren struct mrq_write_trace_response {
42073dd5c4cSStephen Warren 	/**
42173dd5c4cSStephen Warren 	 * @brief flag whether more data remains in local buffer
42273dd5c4cSStephen Warren 	 *
42373dd5c4cSStephen Warren 	 * Value is 1 if the entire local trace buffer has been
42473dd5c4cSStephen Warren 	 * drained to the outputbuffer. Value is 0 otherwise.
42573dd5c4cSStephen Warren 	 */
42673dd5c4cSStephen Warren 	uint32_t eof;
42773dd5c4cSStephen Warren } __ABI_PACKED;
42873dd5c4cSStephen Warren 
42973dd5c4cSStephen Warren /** @private */
43073dd5c4cSStephen Warren struct mrq_threaded_ping_request {
43173dd5c4cSStephen Warren 	uint32_t challenge;
43273dd5c4cSStephen Warren } __ABI_PACKED;
43373dd5c4cSStephen Warren 
43473dd5c4cSStephen Warren /** @private */
43573dd5c4cSStephen Warren struct mrq_threaded_ping_response {
43673dd5c4cSStephen Warren 	uint32_t reply;
43773dd5c4cSStephen Warren } __ABI_PACKED;
43873dd5c4cSStephen Warren 
43973dd5c4cSStephen Warren /**
44073dd5c4cSStephen Warren  * @ingroup MRQ_Codes
44173dd5c4cSStephen Warren  * @def MRQ_MODULE_MAIL
44273dd5c4cSStephen Warren  * @brief send a message to a loadable module
44373dd5c4cSStephen Warren  *
44473dd5c4cSStephen Warren  * * Platforms: All
44573dd5c4cSStephen Warren  * * Initiators: Any
44673dd5c4cSStephen Warren  * * Targets: BPMP
44773dd5c4cSStephen Warren  * * Request Payload: @ref mrq_module_mail_request
44873dd5c4cSStephen Warren  * * Response Payload: @ref mrq_module_mail_response
44973dd5c4cSStephen Warren  *
45073dd5c4cSStephen Warren  * @note This MRQ is disabled on production systems
45173dd5c4cSStephen Warren  */
45273dd5c4cSStephen Warren 
45373dd5c4cSStephen Warren /**
45473dd5c4cSStephen Warren  * @ingroup Module
45573dd5c4cSStephen Warren  * @brief request with #MRQ_MODULE_MAIL
45673dd5c4cSStephen Warren  */
45773dd5c4cSStephen Warren struct mrq_module_mail_request {
45873dd5c4cSStephen Warren 	/** @brief handle to the previously loaded module */
45973dd5c4cSStephen Warren 	uint32_t base;
46073dd5c4cSStephen Warren 	/** @brief module-specific mail payload
46173dd5c4cSStephen Warren 	 *
46273dd5c4cSStephen Warren 	 * The length of data[ ] is unknown to the BPMP core firmware
46373dd5c4cSStephen Warren 	 * but it is limited to the size of an IPC message.
46473dd5c4cSStephen Warren 	 */
46573dd5c4cSStephen Warren 	uint8_t data[EMPTY_ARRAY];
46673dd5c4cSStephen Warren } __ABI_PACKED;
46773dd5c4cSStephen Warren 
46873dd5c4cSStephen Warren /**
46973dd5c4cSStephen Warren  * @ingroup Module
47073dd5c4cSStephen Warren  * @brief response to #MRQ_MODULE_MAIL
47173dd5c4cSStephen Warren  */
47273dd5c4cSStephen Warren struct mrq_module_mail_response {
47373dd5c4cSStephen Warren 	/** @brief module-specific mail payload
47473dd5c4cSStephen Warren 	 *
47573dd5c4cSStephen Warren 	 * The length of data[ ] is unknown to the BPMP core firmware
47673dd5c4cSStephen Warren 	 * but it is limited to the size of an IPC message.
47773dd5c4cSStephen Warren 	 */
47873dd5c4cSStephen Warren 	uint8_t data[EMPTY_ARRAY];
47973dd5c4cSStephen Warren } __ABI_PACKED;
48073dd5c4cSStephen Warren 
48173dd5c4cSStephen Warren /**
48273dd5c4cSStephen Warren  * @ingroup MRQ_Codes
48373dd5c4cSStephen Warren  * @def MRQ_DEBUGFS
48473dd5c4cSStephen Warren  * @brief Interact with BPMP's debugfs file nodes
48573dd5c4cSStephen Warren  *
48673dd5c4cSStephen Warren  * * Platforms: T186
48773dd5c4cSStephen Warren  * * Initiators: Any
48873dd5c4cSStephen Warren  * * Targets: BPMP
48973dd5c4cSStephen Warren  * * Request Payload: @ref mrq_debugfs_request
49073dd5c4cSStephen Warren  * * Response Payload: @ref mrq_debugfs_response
49173dd5c4cSStephen Warren  */
49273dd5c4cSStephen Warren 
49373dd5c4cSStephen Warren /**
49473dd5c4cSStephen Warren  * @addtogroup Debugfs
49573dd5c4cSStephen Warren  * @{
49673dd5c4cSStephen Warren  *
49773dd5c4cSStephen Warren  * The BPMP firmware implements a pseudo-filesystem called
49873dd5c4cSStephen Warren  * debugfs. Any driver within the firmware may register with debugfs
49973dd5c4cSStephen Warren  * to expose an arbitrary set of "files" in the filesystem. When
50073dd5c4cSStephen Warren  * software on the CPU writes to a debugfs file, debugfs passes the
50173dd5c4cSStephen Warren  * written data to a callback provided by the driver. When software on
50273dd5c4cSStephen Warren  * the CPU reads a debugfs file, debugfs queries the driver for the
50373dd5c4cSStephen Warren  * data to return to the CPU. The intention of the debugfs filesystem
50473dd5c4cSStephen Warren  * is to provide information useful for debugging the system at
50573dd5c4cSStephen Warren  * runtime.
50673dd5c4cSStephen Warren  *
50773dd5c4cSStephen Warren  * @note The files exposed via debugfs are not part of the
50873dd5c4cSStephen Warren  * BPMP firmware's ABI. debugfs files may be added or removed in any
50973dd5c4cSStephen Warren  * given version of the firmware. Typically the semantics of a debugfs
51073dd5c4cSStephen Warren  * file are consistent from version to version but even that is not
51173dd5c4cSStephen Warren  * guaranteed.
51273dd5c4cSStephen Warren  *
51373dd5c4cSStephen Warren  * @}
51473dd5c4cSStephen Warren  */
51573dd5c4cSStephen Warren /** @ingroup Debugfs */
51673dd5c4cSStephen Warren enum mrq_debugfs_commands {
51773dd5c4cSStephen Warren 	CMD_DEBUGFS_READ = 1,
51873dd5c4cSStephen Warren 	CMD_DEBUGFS_WRITE = 2,
51973dd5c4cSStephen Warren 	CMD_DEBUGFS_DUMPDIR = 3,
52073dd5c4cSStephen Warren 	CMD_DEBUGFS_MAX
52173dd5c4cSStephen Warren };
52273dd5c4cSStephen Warren 
52373dd5c4cSStephen Warren /**
52473dd5c4cSStephen Warren  * @ingroup Debugfs
52573dd5c4cSStephen Warren  * @brief parameters for CMD_DEBUGFS_READ/WRITE command
52673dd5c4cSStephen Warren  */
52773dd5c4cSStephen Warren struct cmd_debugfs_fileop_request {
52873dd5c4cSStephen Warren 	/** @brief physical address pointing at filename */
52973dd5c4cSStephen Warren 	uint32_t fnameaddr;
53073dd5c4cSStephen Warren 	/** @brief length in bytes of filename buffer */
53173dd5c4cSStephen Warren 	uint32_t fnamelen;
53273dd5c4cSStephen Warren 	/** @brief physical address pointing to data buffer */
53373dd5c4cSStephen Warren 	uint32_t dataaddr;
53473dd5c4cSStephen Warren 	/** @brief length in bytes of data buffer */
53573dd5c4cSStephen Warren 	uint32_t datalen;
53673dd5c4cSStephen Warren } __ABI_PACKED;
53773dd5c4cSStephen Warren 
53873dd5c4cSStephen Warren /**
53973dd5c4cSStephen Warren  * @ingroup Debugfs
54073dd5c4cSStephen Warren  * @brief parameters for CMD_DEBUGFS_READ/WRITE command
54173dd5c4cSStephen Warren  */
54273dd5c4cSStephen Warren struct cmd_debugfs_dumpdir_request {
54373dd5c4cSStephen Warren 	/** @brief physical address pointing to data buffer */
54473dd5c4cSStephen Warren 	uint32_t dataaddr;
54573dd5c4cSStephen Warren 	/** @brief length in bytes of data buffer */
54673dd5c4cSStephen Warren 	uint32_t datalen;
54773dd5c4cSStephen Warren } __ABI_PACKED;
54873dd5c4cSStephen Warren 
54973dd5c4cSStephen Warren /**
55073dd5c4cSStephen Warren  * @ingroup Debugfs
55173dd5c4cSStephen Warren  * @brief response data for CMD_DEBUGFS_READ/WRITE command
55273dd5c4cSStephen Warren  */
55373dd5c4cSStephen Warren struct cmd_debugfs_fileop_response {
55473dd5c4cSStephen Warren 	/** @brief always 0 */
55573dd5c4cSStephen Warren 	uint32_t reserved;
55673dd5c4cSStephen Warren 	/** @brief number of bytes read from or written to data buffer */
55773dd5c4cSStephen Warren 	uint32_t nbytes;
55873dd5c4cSStephen Warren } __ABI_PACKED;
55973dd5c4cSStephen Warren 
56073dd5c4cSStephen Warren /**
56173dd5c4cSStephen Warren  * @ingroup Debugfs
56273dd5c4cSStephen Warren  * @brief response data for CMD_DEBUGFS_DUMPDIR command
56373dd5c4cSStephen Warren  */
56473dd5c4cSStephen Warren struct cmd_debugfs_dumpdir_response {
56573dd5c4cSStephen Warren 	/** @brief always 0 */
56673dd5c4cSStephen Warren 	uint32_t reserved;
56773dd5c4cSStephen Warren 	/** @brief number of bytes read from or written to data buffer */
56873dd5c4cSStephen Warren 	uint32_t nbytes;
56973dd5c4cSStephen Warren } __ABI_PACKED;
57073dd5c4cSStephen Warren 
57173dd5c4cSStephen Warren /**
57273dd5c4cSStephen Warren  * @ingroup Debugfs
57373dd5c4cSStephen Warren  * @brief request with #MRQ_DEBUGFS.
57473dd5c4cSStephen Warren  *
57573dd5c4cSStephen Warren  * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
57673dd5c4cSStephen Warren  * command to execute. Legal commands are the values of @ref
57773dd5c4cSStephen Warren  * mrq_debugfs_commands. Each command requires a specific additional
57873dd5c4cSStephen Warren  * payload of data.
57973dd5c4cSStephen Warren  *
58073dd5c4cSStephen Warren  * |command            |payload|
58173dd5c4cSStephen Warren  * |-------------------|-------|
58273dd5c4cSStephen Warren  * |CMD_DEBUGFS_READ   |fop    |
58373dd5c4cSStephen Warren  * |CMD_DEBUGFS_WRITE  |fop    |
58473dd5c4cSStephen Warren  * |CMD_DEBUGFS_DUMPDIR|dumpdir|
58573dd5c4cSStephen Warren  */
58673dd5c4cSStephen Warren struct mrq_debugfs_request {
58773dd5c4cSStephen Warren 	uint32_t cmd;
58873dd5c4cSStephen Warren 	union {
58973dd5c4cSStephen Warren 		struct cmd_debugfs_fileop_request fop;
59073dd5c4cSStephen Warren 		struct cmd_debugfs_dumpdir_request dumpdir;
59173dd5c4cSStephen Warren 	} __UNION_ANON;
59273dd5c4cSStephen Warren } __ABI_PACKED;
59373dd5c4cSStephen Warren 
59473dd5c4cSStephen Warren /**
59573dd5c4cSStephen Warren  * @ingroup Debugfs
59673dd5c4cSStephen Warren  */
59773dd5c4cSStephen Warren struct mrq_debugfs_response {
59873dd5c4cSStephen Warren 	/** @brief always 0 */
59973dd5c4cSStephen Warren 	int32_t reserved;
60073dd5c4cSStephen Warren 	union {
60173dd5c4cSStephen Warren 		/** @brief response data for CMD_DEBUGFS_READ OR
60273dd5c4cSStephen Warren 		 * CMD_DEBUGFS_WRITE command
60373dd5c4cSStephen Warren 		 */
60473dd5c4cSStephen Warren 		struct cmd_debugfs_fileop_response fop;
60573dd5c4cSStephen Warren 		/** @brief response data for CMD_DEBUGFS_DUMPDIR command */
60673dd5c4cSStephen Warren 		struct cmd_debugfs_dumpdir_response dumpdir;
60773dd5c4cSStephen Warren 	} __UNION_ANON;
60873dd5c4cSStephen Warren } __ABI_PACKED;
60973dd5c4cSStephen Warren 
61073dd5c4cSStephen Warren /**
61173dd5c4cSStephen Warren  * @addtogroup Debugfs
61273dd5c4cSStephen Warren  * @{
61373dd5c4cSStephen Warren  */
61473dd5c4cSStephen Warren #define DEBUGFS_S_ISDIR	(1 << 9)
61573dd5c4cSStephen Warren #define DEBUGFS_S_IRUSR	(1 << 8)
61673dd5c4cSStephen Warren #define DEBUGFS_S_IWUSR	(1 << 7)
61773dd5c4cSStephen Warren /** @} */
61873dd5c4cSStephen Warren 
61973dd5c4cSStephen Warren 
62073dd5c4cSStephen Warren /**
62173dd5c4cSStephen Warren  * @ingroup MRQ_Codes
62273dd5c4cSStephen Warren  * @def MRQ_RESET
62373dd5c4cSStephen Warren  * @brief reset an IP block
62473dd5c4cSStephen Warren  *
62573dd5c4cSStephen Warren  * * Platforms: T186
62673dd5c4cSStephen Warren  * * Initiators: Any
62773dd5c4cSStephen Warren  * * Targets: BPMP
62873dd5c4cSStephen Warren  * * Request Payload: @ref mrq_reset_request
62973dd5c4cSStephen Warren  * * Response Payload: N/A
63073dd5c4cSStephen Warren  */
63173dd5c4cSStephen Warren 
63273dd5c4cSStephen Warren /**
63373dd5c4cSStephen Warren  * @ingroup Reset
63473dd5c4cSStephen Warren  */
63573dd5c4cSStephen Warren enum mrq_reset_commands {
63673dd5c4cSStephen Warren 	CMD_RESET_ASSERT = 1,
63773dd5c4cSStephen Warren 	CMD_RESET_DEASSERT = 2,
63873dd5c4cSStephen Warren 	CMD_RESET_MODULE = 3,
63973dd5c4cSStephen Warren 	CMD_RESET_MAX, /* not part of ABI and subject to change */
64073dd5c4cSStephen Warren };
64173dd5c4cSStephen Warren 
64273dd5c4cSStephen Warren /**
64373dd5c4cSStephen Warren  * @ingroup Reset
64473dd5c4cSStephen Warren  * @brief request with MRQ_RESET
64573dd5c4cSStephen Warren  *
64673dd5c4cSStephen Warren  * Used by the sender of an #MRQ_RESET message to request BPMP to
64773dd5c4cSStephen Warren  * assert or or deassert a given reset line.
64873dd5c4cSStephen Warren  */
64973dd5c4cSStephen Warren struct mrq_reset_request {
65073dd5c4cSStephen Warren 	/** @brief reset action to perform (@enum mrq_reset_commands) */
65173dd5c4cSStephen Warren 	uint32_t cmd;
65273dd5c4cSStephen Warren 	/** @brief id of the reset to affected */
65373dd5c4cSStephen Warren 	uint32_t reset_id;
65473dd5c4cSStephen Warren } __ABI_PACKED;
65573dd5c4cSStephen Warren 
65673dd5c4cSStephen Warren /**
65773dd5c4cSStephen Warren  * @ingroup MRQ_Codes
65873dd5c4cSStephen Warren  * @def MRQ_I2C
65973dd5c4cSStephen Warren  * @brief issue an i2c transaction
66073dd5c4cSStephen Warren  *
66173dd5c4cSStephen Warren  * * Platforms: T186
66273dd5c4cSStephen Warren  * * Initiators: Any
66373dd5c4cSStephen Warren  * * Targets: BPMP
66473dd5c4cSStephen Warren  * * Request Payload: @ref mrq_i2c_request
66573dd5c4cSStephen Warren  * * Response Payload: @ref mrq_i2c_response
66673dd5c4cSStephen Warren  */
66773dd5c4cSStephen Warren 
66873dd5c4cSStephen Warren /**
66973dd5c4cSStephen Warren  * @addtogroup I2C
67073dd5c4cSStephen Warren  * @{
67173dd5c4cSStephen Warren  */
67273dd5c4cSStephen Warren #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE	(MSG_DATA_MIN_SZ - 12)
67373dd5c4cSStephen Warren #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE	(MSG_DATA_MIN_SZ - 4)
67473dd5c4cSStephen Warren /** @} */
67573dd5c4cSStephen Warren 
67673dd5c4cSStephen Warren /**
67773dd5c4cSStephen Warren  * @ingroup I2C
67873dd5c4cSStephen Warren  * @name Serial I2C flags
67973dd5c4cSStephen Warren  * Use these flags with serial_i2c_request::flags
68073dd5c4cSStephen Warren  * @{
68173dd5c4cSStephen Warren  */
68273dd5c4cSStephen Warren #define SERIALI2C_TEN           0x0010
68373dd5c4cSStephen Warren #define SERIALI2C_RD            0x0001
68473dd5c4cSStephen Warren #define SERIALI2C_STOP          0x8000
68573dd5c4cSStephen Warren #define SERIALI2C_NOSTART       0x4000
68673dd5c4cSStephen Warren #define SERIALI2C_REV_DIR_ADDR  0x2000
68773dd5c4cSStephen Warren #define SERIALI2C_IGNORE_NAK    0x1000
68873dd5c4cSStephen Warren #define SERIALI2C_NO_RD_ACK     0x0800
68973dd5c4cSStephen Warren #define SERIALI2C_RECV_LEN      0x0400
69073dd5c4cSStephen Warren /** @} */
69173dd5c4cSStephen Warren /** @ingroup I2C */
69273dd5c4cSStephen Warren enum {
69373dd5c4cSStephen Warren 	CMD_I2C_XFER = 1
69473dd5c4cSStephen Warren };
69573dd5c4cSStephen Warren 
69673dd5c4cSStephen Warren /**
69773dd5c4cSStephen Warren  * @ingroup I2C
69873dd5c4cSStephen Warren  * @brief serializable i2c request
69973dd5c4cSStephen Warren  *
70073dd5c4cSStephen Warren  * Instances of this structure are packed (little-endian) into
70173dd5c4cSStephen Warren  * cmd_i2c_xfer_request::data_buf. Each instance represents a single
70273dd5c4cSStephen Warren  * transaction (or a portion of a transaction with repeated starts) on
70373dd5c4cSStephen Warren  * an i2c bus.
70473dd5c4cSStephen Warren  *
70573dd5c4cSStephen Warren  * Because these structures are packed, some instances are likely to
70673dd5c4cSStephen Warren  * be misaligned. Additionally because #data is variable length, it is
70773dd5c4cSStephen Warren  * not possible to iterate through a serialized list of these
70873dd5c4cSStephen Warren  * structures without inspecting #len in each instance.  It may be
70973dd5c4cSStephen Warren  * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf
71073dd5c4cSStephen Warren  * manually rather than using this structure definition.
71173dd5c4cSStephen Warren */
71273dd5c4cSStephen Warren struct serial_i2c_request {
71373dd5c4cSStephen Warren 	/** @brief I2C slave address */
71473dd5c4cSStephen Warren 	uint16_t addr;
71573dd5c4cSStephen Warren 	/** @brief bitmask of SERIALI2C_ flags */
71673dd5c4cSStephen Warren 	uint16_t flags;
71773dd5c4cSStephen Warren 	/** @brief length of I2C transaction in bytes */
71873dd5c4cSStephen Warren 	uint16_t len;
71973dd5c4cSStephen Warren 	/** @brief for write transactions only, #len bytes of data */
72073dd5c4cSStephen Warren 	uint8_t data[];
72173dd5c4cSStephen Warren } __ABI_PACKED;
72273dd5c4cSStephen Warren 
72373dd5c4cSStephen Warren /**
72473dd5c4cSStephen Warren  * @ingroup I2C
72573dd5c4cSStephen Warren  * @brief trigger one or more i2c transactions
72673dd5c4cSStephen Warren  */
72773dd5c4cSStephen Warren struct cmd_i2c_xfer_request {
72873dd5c4cSStephen Warren 	/** @brief valid bus number from mach-t186/i2c-t186.h*/
72973dd5c4cSStephen Warren 	uint32_t bus_id;
73073dd5c4cSStephen Warren 
73173dd5c4cSStephen Warren 	/** @brief count of valid bytes in #data_buf*/
73273dd5c4cSStephen Warren 	uint32_t data_size;
73373dd5c4cSStephen Warren 
73473dd5c4cSStephen Warren 	/** @brief serialized packed instances of @ref serial_i2c_request*/
73573dd5c4cSStephen Warren 	uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE];
73673dd5c4cSStephen Warren } __ABI_PACKED;
73773dd5c4cSStephen Warren 
73873dd5c4cSStephen Warren /**
73973dd5c4cSStephen Warren  * @ingroup I2C
74073dd5c4cSStephen Warren  * @brief container for data read from the i2c bus
74173dd5c4cSStephen Warren  *
74273dd5c4cSStephen Warren  * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute
74373dd5c4cSStephen Warren  * zero or more I2C reads. The data read from the bus is serialized
74473dd5c4cSStephen Warren  * into #data_buf.
74573dd5c4cSStephen Warren  */
74673dd5c4cSStephen Warren struct cmd_i2c_xfer_response {
74773dd5c4cSStephen Warren 	/** @brief count of valid bytes in #data_buf*/
74873dd5c4cSStephen Warren 	uint32_t data_size;
74973dd5c4cSStephen Warren 	/** @brief i2c read data */
75073dd5c4cSStephen Warren 	uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE];
75173dd5c4cSStephen Warren } __ABI_PACKED;
75273dd5c4cSStephen Warren 
75373dd5c4cSStephen Warren /**
75473dd5c4cSStephen Warren  * @ingroup I2C
75573dd5c4cSStephen Warren  * @brief request with #MRQ_I2C
75673dd5c4cSStephen Warren  */
75773dd5c4cSStephen Warren struct mrq_i2c_request {
75873dd5c4cSStephen Warren 	/** @brief always CMD_I2C_XFER (i.e. 1) */
75973dd5c4cSStephen Warren 	uint32_t cmd;
76073dd5c4cSStephen Warren 	/** @brief parameters of the transfer request */
76173dd5c4cSStephen Warren 	struct cmd_i2c_xfer_request xfer;
76273dd5c4cSStephen Warren } __ABI_PACKED;
76373dd5c4cSStephen Warren 
76473dd5c4cSStephen Warren /**
76573dd5c4cSStephen Warren  * @ingroup I2C
76673dd5c4cSStephen Warren  * @brief response to #MRQ_I2C
76773dd5c4cSStephen Warren  */
76873dd5c4cSStephen Warren struct mrq_i2c_response {
76973dd5c4cSStephen Warren 	struct cmd_i2c_xfer_response xfer;
77073dd5c4cSStephen Warren } __ABI_PACKED;
77173dd5c4cSStephen Warren 
77273dd5c4cSStephen Warren /**
77373dd5c4cSStephen Warren  * @ingroup MRQ_Codes
77473dd5c4cSStephen Warren  * @def MRQ_CLK
77573dd5c4cSStephen Warren  *
77673dd5c4cSStephen Warren  * * Platforms: T186
77773dd5c4cSStephen Warren  * * Initiators: Any
77873dd5c4cSStephen Warren  * * Targets: BPMP
77973dd5c4cSStephen Warren  * * Request Payload: @ref mrq_clk_request
78073dd5c4cSStephen Warren  * * Response Payload: @ref mrq_clk_response
78173dd5c4cSStephen Warren  * @addtogroup Clocks
78273dd5c4cSStephen Warren  * @{
78373dd5c4cSStephen Warren  */
78473dd5c4cSStephen Warren 
78573dd5c4cSStephen Warren /**
78673dd5c4cSStephen Warren  * @name MRQ_CLK sub-commands
78773dd5c4cSStephen Warren  * @{
78873dd5c4cSStephen Warren  */
78973dd5c4cSStephen Warren enum {
79073dd5c4cSStephen Warren 	CMD_CLK_GET_RATE = 1,
79173dd5c4cSStephen Warren 	CMD_CLK_SET_RATE = 2,
79273dd5c4cSStephen Warren 	CMD_CLK_ROUND_RATE = 3,
79373dd5c4cSStephen Warren 	CMD_CLK_GET_PARENT = 4,
79473dd5c4cSStephen Warren 	CMD_CLK_SET_PARENT = 5,
79573dd5c4cSStephen Warren 	CMD_CLK_IS_ENABLED = 6,
79673dd5c4cSStephen Warren 	CMD_CLK_ENABLE = 7,
79773dd5c4cSStephen Warren 	CMD_CLK_DISABLE = 8,
79873dd5c4cSStephen Warren 	CMD_CLK_GET_ALL_INFO = 14,
79973dd5c4cSStephen Warren 	CMD_CLK_GET_MAX_CLK_ID = 15,
80073dd5c4cSStephen Warren 	CMD_CLK_MAX,
80173dd5c4cSStephen Warren };
80273dd5c4cSStephen Warren /** @} */
80373dd5c4cSStephen Warren 
80473dd5c4cSStephen Warren #define MRQ_CLK_NAME_MAXLEN	40
80573dd5c4cSStephen Warren #define MRQ_CLK_MAX_PARENTS	16
80673dd5c4cSStephen Warren 
80773dd5c4cSStephen Warren /** @private */
80873dd5c4cSStephen Warren struct cmd_clk_get_rate_request {
80973dd5c4cSStephen Warren 	EMPTY
81073dd5c4cSStephen Warren } __ABI_PACKED;
81173dd5c4cSStephen Warren 
81273dd5c4cSStephen Warren struct cmd_clk_get_rate_response {
81373dd5c4cSStephen Warren 	int64_t rate;
81473dd5c4cSStephen Warren } __ABI_PACKED;
81573dd5c4cSStephen Warren 
81673dd5c4cSStephen Warren struct cmd_clk_set_rate_request {
81773dd5c4cSStephen Warren 	int32_t unused;
81873dd5c4cSStephen Warren 	int64_t rate;
81973dd5c4cSStephen Warren } __ABI_PACKED;
82073dd5c4cSStephen Warren 
82173dd5c4cSStephen Warren struct cmd_clk_set_rate_response {
82273dd5c4cSStephen Warren 	int64_t rate;
82373dd5c4cSStephen Warren } __ABI_PACKED;
82473dd5c4cSStephen Warren 
82573dd5c4cSStephen Warren struct cmd_clk_round_rate_request {
82673dd5c4cSStephen Warren 	int32_t unused;
82773dd5c4cSStephen Warren 	int64_t rate;
82873dd5c4cSStephen Warren } __ABI_PACKED;
82973dd5c4cSStephen Warren 
83073dd5c4cSStephen Warren struct cmd_clk_round_rate_response {
83173dd5c4cSStephen Warren 	int64_t rate;
83273dd5c4cSStephen Warren } __ABI_PACKED;
83373dd5c4cSStephen Warren 
83473dd5c4cSStephen Warren /** @private */
83573dd5c4cSStephen Warren struct cmd_clk_get_parent_request {
83673dd5c4cSStephen Warren 	EMPTY
83773dd5c4cSStephen Warren } __ABI_PACKED;
83873dd5c4cSStephen Warren 
83973dd5c4cSStephen Warren struct cmd_clk_get_parent_response {
84073dd5c4cSStephen Warren 	uint32_t parent_id;
84173dd5c4cSStephen Warren } __ABI_PACKED;
84273dd5c4cSStephen Warren 
84373dd5c4cSStephen Warren struct cmd_clk_set_parent_request {
84473dd5c4cSStephen Warren 	uint32_t parent_id;
84573dd5c4cSStephen Warren } __ABI_PACKED;
84673dd5c4cSStephen Warren 
84773dd5c4cSStephen Warren struct cmd_clk_set_parent_response {
84873dd5c4cSStephen Warren 	uint32_t parent_id;
84973dd5c4cSStephen Warren } __ABI_PACKED;
85073dd5c4cSStephen Warren 
85173dd5c4cSStephen Warren /** @private */
85273dd5c4cSStephen Warren struct cmd_clk_is_enabled_request {
85373dd5c4cSStephen Warren 	EMPTY
85473dd5c4cSStephen Warren } __ABI_PACKED;
85573dd5c4cSStephen Warren 
85673dd5c4cSStephen Warren struct cmd_clk_is_enabled_response {
85773dd5c4cSStephen Warren 	int32_t state;
85873dd5c4cSStephen Warren } __ABI_PACKED;
85973dd5c4cSStephen Warren 
86073dd5c4cSStephen Warren /** @private */
86173dd5c4cSStephen Warren struct cmd_clk_enable_request {
86273dd5c4cSStephen Warren 	EMPTY
86373dd5c4cSStephen Warren } __ABI_PACKED;
86473dd5c4cSStephen Warren 
86573dd5c4cSStephen Warren /** @private */
86673dd5c4cSStephen Warren struct cmd_clk_enable_response {
86773dd5c4cSStephen Warren 	EMPTY
86873dd5c4cSStephen Warren } __ABI_PACKED;
86973dd5c4cSStephen Warren 
87073dd5c4cSStephen Warren /** @private */
87173dd5c4cSStephen Warren struct cmd_clk_disable_request {
87273dd5c4cSStephen Warren 	EMPTY
87373dd5c4cSStephen Warren } __ABI_PACKED;
87473dd5c4cSStephen Warren 
87573dd5c4cSStephen Warren /** @private */
87673dd5c4cSStephen Warren struct cmd_clk_disable_response {
87773dd5c4cSStephen Warren 	EMPTY
87873dd5c4cSStephen Warren } __ABI_PACKED;
87973dd5c4cSStephen Warren 
88073dd5c4cSStephen Warren /** @private */
88173dd5c4cSStephen Warren struct cmd_clk_get_all_info_request {
88273dd5c4cSStephen Warren 	EMPTY
88373dd5c4cSStephen Warren } __ABI_PACKED;
88473dd5c4cSStephen Warren 
88573dd5c4cSStephen Warren struct cmd_clk_get_all_info_response {
88673dd5c4cSStephen Warren 	uint32_t flags;
88773dd5c4cSStephen Warren 	uint32_t parent;
88873dd5c4cSStephen Warren 	uint32_t parents[MRQ_CLK_MAX_PARENTS];
88973dd5c4cSStephen Warren 	uint8_t num_parents;
89073dd5c4cSStephen Warren 	uint8_t name[MRQ_CLK_NAME_MAXLEN];
89173dd5c4cSStephen Warren } __ABI_PACKED;
89273dd5c4cSStephen Warren 
89373dd5c4cSStephen Warren /** @private */
89473dd5c4cSStephen Warren struct cmd_clk_get_max_clk_id_request {
89573dd5c4cSStephen Warren 	EMPTY
89673dd5c4cSStephen Warren } __ABI_PACKED;
89773dd5c4cSStephen Warren 
89873dd5c4cSStephen Warren struct cmd_clk_get_max_clk_id_response {
89973dd5c4cSStephen Warren 	uint32_t max_id;
90073dd5c4cSStephen Warren } __ABI_PACKED;
90173dd5c4cSStephen Warren /** @} */
90273dd5c4cSStephen Warren 
90373dd5c4cSStephen Warren /**
90473dd5c4cSStephen Warren  * @ingroup Clocks
90573dd5c4cSStephen Warren  * @brief request with #MRQ_CLK
90673dd5c4cSStephen Warren  *
90773dd5c4cSStephen Warren  * Used by the sender of an #MRQ_CLK message to control clocks. The
90873dd5c4cSStephen Warren  * clk_request is split into several sub-commands. Some sub-commands
90973dd5c4cSStephen Warren  * require no additional data. Others have a sub-command specific
91073dd5c4cSStephen Warren  * payload
91173dd5c4cSStephen Warren  *
91273dd5c4cSStephen Warren  * |sub-command                 |payload                |
91373dd5c4cSStephen Warren  * |----------------------------|-----------------------|
91473dd5c4cSStephen Warren  * |CMD_CLK_GET_RATE            |-                      |
91573dd5c4cSStephen Warren  * |CMD_CLK_SET_RATE            |clk_set_rate           |
91673dd5c4cSStephen Warren  * |CMD_CLK_ROUND_RATE          |clk_round_rate         |
91773dd5c4cSStephen Warren  * |CMD_CLK_GET_PARENT          |-                      |
91873dd5c4cSStephen Warren  * |CMD_CLK_SET_PARENT          |clk_set_parent         |
91973dd5c4cSStephen Warren  * |CMD_CLK_IS_ENABLED          |-                      |
92073dd5c4cSStephen Warren  * |CMD_CLK_ENABLE              |-                      |
92173dd5c4cSStephen Warren  * |CMD_CLK_DISABLE             |-                      |
92273dd5c4cSStephen Warren  * |CMD_CLK_GET_ALL_INFO        |-                      |
92373dd5c4cSStephen Warren  * |CMD_CLK_GET_MAX_CLK_ID      |-                      |
92473dd5c4cSStephen Warren  *
92573dd5c4cSStephen Warren  */
92673dd5c4cSStephen Warren 
92773dd5c4cSStephen Warren struct mrq_clk_request {
92873dd5c4cSStephen Warren 	/** @brief sub-command and clock id concatenated to 32-bit word.
92973dd5c4cSStephen Warren 	 * - bits[31..24] is the sub-cmd.
93073dd5c4cSStephen Warren 	 * - bits[23..0] is the clock id
93173dd5c4cSStephen Warren 	 */
93273dd5c4cSStephen Warren 	uint32_t cmd_and_id;
93373dd5c4cSStephen Warren 
93473dd5c4cSStephen Warren 	union {
93573dd5c4cSStephen Warren 		/** @private */
93673dd5c4cSStephen Warren 		struct cmd_clk_get_rate_request clk_get_rate;
93773dd5c4cSStephen Warren 		struct cmd_clk_set_rate_request clk_set_rate;
93873dd5c4cSStephen Warren 		struct cmd_clk_round_rate_request clk_round_rate;
93973dd5c4cSStephen Warren 		/** @private */
94073dd5c4cSStephen Warren 		struct cmd_clk_get_parent_request clk_get_parent;
94173dd5c4cSStephen Warren 		struct cmd_clk_set_parent_request clk_set_parent;
94273dd5c4cSStephen Warren 		/** @private */
94373dd5c4cSStephen Warren 		struct cmd_clk_enable_request clk_enable;
94473dd5c4cSStephen Warren 		/** @private */
94573dd5c4cSStephen Warren 		struct cmd_clk_disable_request clk_disable;
94673dd5c4cSStephen Warren 		/** @private */
94773dd5c4cSStephen Warren 		struct cmd_clk_is_enabled_request clk_is_enabled;
94873dd5c4cSStephen Warren 		/** @private */
94973dd5c4cSStephen Warren 		struct cmd_clk_get_all_info_request clk_get_all_info;
95073dd5c4cSStephen Warren 		/** @private */
95173dd5c4cSStephen Warren 		struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id;
95273dd5c4cSStephen Warren 	} __UNION_ANON;
95373dd5c4cSStephen Warren } __ABI_PACKED;
95473dd5c4cSStephen Warren 
95573dd5c4cSStephen Warren /**
95673dd5c4cSStephen Warren  * @ingroup Clocks
95773dd5c4cSStephen Warren  * @brief response to MRQ_CLK
95873dd5c4cSStephen Warren  *
95973dd5c4cSStephen Warren  * Each sub-command supported by @ref mrq_clk_request may return
96073dd5c4cSStephen Warren  * sub-command-specific data. Some do and some do not as indicated in
96173dd5c4cSStephen Warren  * the following table
96273dd5c4cSStephen Warren  *
96373dd5c4cSStephen Warren  * |sub-command                 |payload                 |
96473dd5c4cSStephen Warren  * |----------------------------|------------------------|
96573dd5c4cSStephen Warren  * |CMD_CLK_GET_RATE            |clk_get_rate            |
96673dd5c4cSStephen Warren  * |CMD_CLK_SET_RATE            |clk_set_rate            |
96773dd5c4cSStephen Warren  * |CMD_CLK_ROUND_RATE          |clk_round_rate          |
96873dd5c4cSStephen Warren  * |CMD_CLK_GET_PARENT          |clk_get_parent          |
96973dd5c4cSStephen Warren  * |CMD_CLK_SET_PARENT          |clk_set_parent          |
97073dd5c4cSStephen Warren  * |CMD_CLK_IS_ENABLED          |clk_is_enabled          |
97173dd5c4cSStephen Warren  * |CMD_CLK_ENABLE              |-                       |
97273dd5c4cSStephen Warren  * |CMD_CLK_DISABLE             |-                       |
97373dd5c4cSStephen Warren  * |CMD_CLK_GET_ALL_INFO        |clk_get_all_info        |
97473dd5c4cSStephen Warren  * |CMD_CLK_GET_MAX_CLK_ID      |clk_get_max_id          |
97573dd5c4cSStephen Warren  *
97673dd5c4cSStephen Warren  */
97773dd5c4cSStephen Warren 
97873dd5c4cSStephen Warren struct mrq_clk_response {
97973dd5c4cSStephen Warren 	union {
98073dd5c4cSStephen Warren 		struct cmd_clk_get_rate_response clk_get_rate;
98173dd5c4cSStephen Warren 		struct cmd_clk_set_rate_response clk_set_rate;
98273dd5c4cSStephen Warren 		struct cmd_clk_round_rate_response clk_round_rate;
98373dd5c4cSStephen Warren 		struct cmd_clk_get_parent_response clk_get_parent;
98473dd5c4cSStephen Warren 		struct cmd_clk_set_parent_response clk_set_parent;
98573dd5c4cSStephen Warren 		/** @private */
98673dd5c4cSStephen Warren 		struct cmd_clk_enable_response clk_enable;
98773dd5c4cSStephen Warren 		/** @private */
98873dd5c4cSStephen Warren 		struct cmd_clk_disable_response clk_disable;
98973dd5c4cSStephen Warren 		struct cmd_clk_is_enabled_response clk_is_enabled;
99073dd5c4cSStephen Warren 		struct cmd_clk_get_all_info_response clk_get_all_info;
99173dd5c4cSStephen Warren 		struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id;
99273dd5c4cSStephen Warren 	} __UNION_ANON;
99373dd5c4cSStephen Warren } __ABI_PACKED;
99473dd5c4cSStephen Warren 
99573dd5c4cSStephen Warren /**
99673dd5c4cSStephen Warren  * @ingroup MRQ_Codes
99773dd5c4cSStephen Warren  * @def MRQ_QUERY_ABI
99873dd5c4cSStephen Warren  * @brief check if an MRQ is implemented
99973dd5c4cSStephen Warren  *
100073dd5c4cSStephen Warren  * * Platforms: All
100173dd5c4cSStephen Warren  * * Initiators: Any
100273dd5c4cSStephen Warren  * * Targets: Any
100373dd5c4cSStephen Warren  * * Request Payload: @ref mrq_query_abi_request
100473dd5c4cSStephen Warren  * * Response Payload: @ref mrq_query_abi_response
100573dd5c4cSStephen Warren  */
100673dd5c4cSStephen Warren 
100773dd5c4cSStephen Warren /**
100873dd5c4cSStephen Warren  * @ingroup ABI_info
100973dd5c4cSStephen Warren  * @brief request with MRQ_QUERY_ABI
101073dd5c4cSStephen Warren  *
101173dd5c4cSStephen Warren  * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
101273dd5c4cSStephen Warren  * by the recipient.
101373dd5c4cSStephen Warren  */
101473dd5c4cSStephen Warren struct mrq_query_abi_request {
101573dd5c4cSStephen Warren 	/** @brief MRQ code to query */
101673dd5c4cSStephen Warren 	uint32_t mrq;
101773dd5c4cSStephen Warren } __ABI_PACKED;
101873dd5c4cSStephen Warren 
101973dd5c4cSStephen Warren /**
102073dd5c4cSStephen Warren  * @ingroup ABI_info
102173dd5c4cSStephen Warren  * @brief response to MRQ_QUERY_ABI
102273dd5c4cSStephen Warren  */
102373dd5c4cSStephen Warren struct mrq_query_abi_response {
102473dd5c4cSStephen Warren 	/** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
102573dd5c4cSStephen Warren 	int32_t status;
102673dd5c4cSStephen Warren } __ABI_PACKED;
102773dd5c4cSStephen Warren 
102873dd5c4cSStephen Warren /**
102973dd5c4cSStephen Warren  * @ingroup MRQ_Codes
103073dd5c4cSStephen Warren  * @def MRQ_PG_READ_STATE
103173dd5c4cSStephen Warren  * @brief read the power-gating state of a partition
103273dd5c4cSStephen Warren  *
103373dd5c4cSStephen Warren  * * Platforms: T186
103473dd5c4cSStephen Warren  * * Initiators: Any
103573dd5c4cSStephen Warren  * * Targets: BPMP
103673dd5c4cSStephen Warren  * * Request Payload: @ref mrq_pg_read_state_request
103773dd5c4cSStephen Warren  * * Response Payload: @ref mrq_pg_read_state_response
103873dd5c4cSStephen Warren  * @addtogroup Powergating
103973dd5c4cSStephen Warren  * @{
104073dd5c4cSStephen Warren  */
104173dd5c4cSStephen Warren 
104273dd5c4cSStephen Warren /**
104373dd5c4cSStephen Warren  * @brief request with #MRQ_PG_READ_STATE
104473dd5c4cSStephen Warren  *
104573dd5c4cSStephen Warren  * Used by MRQ_PG_READ_STATE call to read the current state of a
104673dd5c4cSStephen Warren  * partition.
104773dd5c4cSStephen Warren  */
104873dd5c4cSStephen Warren struct mrq_pg_read_state_request {
104973dd5c4cSStephen Warren 	/** @brief ID of partition */
105073dd5c4cSStephen Warren 	uint32_t partition_id;
105173dd5c4cSStephen Warren } __ABI_PACKED;
105273dd5c4cSStephen Warren 
105373dd5c4cSStephen Warren /**
105473dd5c4cSStephen Warren  * @brief response to MRQ_PG_READ_STATE
105573dd5c4cSStephen Warren  * @todo define possible errors.
105673dd5c4cSStephen Warren  */
105773dd5c4cSStephen Warren struct mrq_pg_read_state_response {
105873dd5c4cSStephen Warren 	/** @brief read as don't care */
105973dd5c4cSStephen Warren 	uint32_t sram_state;
106073dd5c4cSStephen Warren 	/** @brief state of power partition
106173dd5c4cSStephen Warren 	 * * 0 : off
106273dd5c4cSStephen Warren 	 * * 1 : on
106373dd5c4cSStephen Warren 	 */
106473dd5c4cSStephen Warren 	uint32_t logic_state;
106573dd5c4cSStephen Warren } __ABI_PACKED;
106673dd5c4cSStephen Warren 
106773dd5c4cSStephen Warren /** @} */
106873dd5c4cSStephen Warren 
106973dd5c4cSStephen Warren /**
107073dd5c4cSStephen Warren  * @ingroup MRQ_Codes
107173dd5c4cSStephen Warren  * @def MRQ_PG_UPDATE_STATE
107273dd5c4cSStephen Warren  * @brief modify the power-gating state of a partition
107373dd5c4cSStephen Warren  *
107473dd5c4cSStephen Warren  * * Platforms: T186
107573dd5c4cSStephen Warren  * * Initiators: Any
107673dd5c4cSStephen Warren  * * Targets: BPMP
107773dd5c4cSStephen Warren  * * Request Payload: @ref mrq_pg_update_state_request
107873dd5c4cSStephen Warren  * * Response Payload: N/A
107973dd5c4cSStephen Warren  * @addtogroup Powergating
108073dd5c4cSStephen Warren  * @{
108173dd5c4cSStephen Warren  */
108273dd5c4cSStephen Warren 
108373dd5c4cSStephen Warren /**
108473dd5c4cSStephen Warren  * @brief request with mrq_pg_update_state_request
108573dd5c4cSStephen Warren  *
108673dd5c4cSStephen Warren  * Used by #MRQ_PG_UPDATE_STATE call to request BPMP to change the
108773dd5c4cSStephen Warren  * state of a power partition #partition_id.
108873dd5c4cSStephen Warren  */
108973dd5c4cSStephen Warren struct mrq_pg_update_state_request {
109073dd5c4cSStephen Warren 	/** @brief ID of partition */
109173dd5c4cSStephen Warren 	uint32_t partition_id;
109273dd5c4cSStephen Warren 	/** @brief secondary control of power partition
109373dd5c4cSStephen Warren 	 *  @details Ignored by many versions of the BPMP
109473dd5c4cSStephen Warren 	 *  firmware. For maximum compatibility, set the value
109573dd5c4cSStephen Warren 	 *  according to @logic_state
109673dd5c4cSStephen Warren 	 * *  0x1: power ON partition (@ref logic_state == 0x3)
109773dd5c4cSStephen Warren 	 * *  0x3: power OFF partition (@ref logic_state == 0x1)
109873dd5c4cSStephen Warren 	 */
109973dd5c4cSStephen Warren 	uint32_t sram_state;
110073dd5c4cSStephen Warren 	/** @brief controls state of power partition, legal values are
110173dd5c4cSStephen Warren 	 * *  0x1 : power OFF partition
110273dd5c4cSStephen Warren 	 * *  0x3 : power ON partition
110373dd5c4cSStephen Warren 	 */
110473dd5c4cSStephen Warren 	uint32_t logic_state;
110573dd5c4cSStephen Warren 	/** @brief change state of clocks of the power partition, legal values
110673dd5c4cSStephen Warren 	 * *  0x0 : do not change clock state
110773dd5c4cSStephen Warren 	 * *  0x1 : disable partition clocks (only applicable when
110873dd5c4cSStephen Warren 	 *          @ref logic_state == 0x1)
110973dd5c4cSStephen Warren 	 * *  0x3 : enable partition clocks (only applicable when
111073dd5c4cSStephen Warren 	 *          @ref logic_state == 0x3)
111173dd5c4cSStephen Warren 	 */
111273dd5c4cSStephen Warren 	uint32_t clock_state;
111373dd5c4cSStephen Warren } __ABI_PACKED;
111473dd5c4cSStephen Warren /** @} */
111573dd5c4cSStephen Warren 
111673dd5c4cSStephen Warren /**
111773dd5c4cSStephen Warren  * @ingroup MRQ_Codes
111873dd5c4cSStephen Warren  * @def MRQ_THERMAL
111973dd5c4cSStephen Warren  * @brief interact with BPMP thermal framework
112073dd5c4cSStephen Warren  *
112173dd5c4cSStephen Warren  * * Platforms: T186
112273dd5c4cSStephen Warren  * * Initiators: Any
112373dd5c4cSStephen Warren  * * Targets: Any
112473dd5c4cSStephen Warren  * * Request Payload: TODO
112573dd5c4cSStephen Warren  * * Response Payload: TODO
112673dd5c4cSStephen Warren  *
112773dd5c4cSStephen Warren  * @addtogroup Thermal
112873dd5c4cSStephen Warren  *
112973dd5c4cSStephen Warren  * The BPMP firmware includes a thermal framework. Drivers within the
113073dd5c4cSStephen Warren  * bpmp firmware register with the framework to provide thermal
113173dd5c4cSStephen Warren  * zones. Each thermal zone corresponds to an entity whose temperature
113273dd5c4cSStephen Warren  * can be measured. The framework also has a notion of trip points. A
113373dd5c4cSStephen Warren  * trip point consists of a thermal zone id, a temperature, and a
113473dd5c4cSStephen Warren  * callback routine. The framework invokes the callback when the zone
113573dd5c4cSStephen Warren  * hits the indicated temperature. The BPMP firmware uses this thermal
113673dd5c4cSStephen Warren  * framework interally to implement various temperature-dependent
113773dd5c4cSStephen Warren  * functions.
113873dd5c4cSStephen Warren  *
113973dd5c4cSStephen Warren  * Software on the CPU can use #MRQ_THERMAL (with payload @ref
114073dd5c4cSStephen Warren  * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal
114173dd5c4cSStephen Warren  * framework. The CPU must It can query the number of supported zones,
114273dd5c4cSStephen Warren  * query zone temperatures, and set trip points.
114373dd5c4cSStephen Warren  *
114473dd5c4cSStephen Warren  * When a trip point set by the CPU gets crossed, BPMP firmware issues
114573dd5c4cSStephen Warren  * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a
114673dd5c4cSStephen Warren  * payload of @ref mrq_thermal_bpmp_to_host_request.
114773dd5c4cSStephen Warren  * @{
114873dd5c4cSStephen Warren  */
114973dd5c4cSStephen Warren enum mrq_thermal_host_to_bpmp_cmd {
115073dd5c4cSStephen Warren 	/**
115173dd5c4cSStephen Warren 	 * @brief Check whether the BPMP driver supports the specified
115273dd5c4cSStephen Warren 	 * request type.
115373dd5c4cSStephen Warren 	 *
115473dd5c4cSStephen Warren 	 * Host needs to supply request parameters.
115573dd5c4cSStephen Warren 	 *
115673dd5c4cSStephen Warren 	 * mrq_response::err is 0 if the specified request is
115773dd5c4cSStephen Warren 	 * supported and -#BPMP_ENODEV otherwise.
115873dd5c4cSStephen Warren 	 */
115973dd5c4cSStephen Warren 	CMD_THERMAL_QUERY_ABI = 0,
116073dd5c4cSStephen Warren 
116173dd5c4cSStephen Warren 	/**
116273dd5c4cSStephen Warren 	 * @brief Get the current temperature of the specified zone.
116373dd5c4cSStephen Warren 	 *
116473dd5c4cSStephen Warren 	 * Host needs to supply request parameters.
116573dd5c4cSStephen Warren 	 *
116673dd5c4cSStephen Warren 	 * mrq_response::err is
116773dd5c4cSStephen Warren 	 * *  0: Temperature query succeeded.
116873dd5c4cSStephen Warren 	 * *  -#BPMP_EINVAL: Invalid request parameters.
116973dd5c4cSStephen Warren 	 * *  -#BPMP_ENOENT: No driver registered for thermal zone..
117073dd5c4cSStephen Warren 	 * *  -#BPMP_EFAULT: Problem reading temperature measurement.
117173dd5c4cSStephen Warren 	 */
117273dd5c4cSStephen Warren 	CMD_THERMAL_GET_TEMP = 1,
117373dd5c4cSStephen Warren 
117473dd5c4cSStephen Warren 	/**
117573dd5c4cSStephen Warren 	 * @brief Enable or disable and set the lower and upper
117673dd5c4cSStephen Warren 	 *   thermal limits for a thermal trip point. Each zone has
117773dd5c4cSStephen Warren 	 *   one trip point.
117873dd5c4cSStephen Warren 	 *
117973dd5c4cSStephen Warren 	 * Host needs to supply request parameters. Once the
118073dd5c4cSStephen Warren 	 * temperature hits a trip point, the BPMP will send a message
118173dd5c4cSStephen Warren 	 * to the CPU having MRQ=MRQ_THERMAL and
118273dd5c4cSStephen Warren 	 * type=CMD_THERMAL_HOST_TRIP_REACHED
118373dd5c4cSStephen Warren 	 *
118473dd5c4cSStephen Warren 	 * mrq_response::err is
118573dd5c4cSStephen Warren 	 * *  0: Trip successfully set.
118673dd5c4cSStephen Warren 	 * *  -#BPMP_EINVAL: Invalid request parameters.
118773dd5c4cSStephen Warren 	 * *  -#BPMP_ENOENT: No driver registered for thermal zone.
118873dd5c4cSStephen Warren 	 * *  -#BPMP_EFAULT: Problem setting trip point.
118973dd5c4cSStephen Warren 	 */
119073dd5c4cSStephen Warren 	CMD_THERMAL_SET_TRIP = 2,
119173dd5c4cSStephen Warren 
119273dd5c4cSStephen Warren 	/**
119373dd5c4cSStephen Warren 	 * @brief Get the number of supported thermal zones.
119473dd5c4cSStephen Warren 	 *
119573dd5c4cSStephen Warren 	 * No request parameters required.
119673dd5c4cSStephen Warren 	 *
119773dd5c4cSStephen Warren 	 * mrq_response::err is always 0, indicating success.
119873dd5c4cSStephen Warren 	 */
119973dd5c4cSStephen Warren 	CMD_THERMAL_GET_NUM_ZONES = 3,
120073dd5c4cSStephen Warren 
120173dd5c4cSStephen Warren 	/** @brief: number of supported host-to-bpmp commands. May
120273dd5c4cSStephen Warren 	 * increase in future
120373dd5c4cSStephen Warren 	 */
120473dd5c4cSStephen Warren 	CMD_THERMAL_HOST_TO_BPMP_NUM
120573dd5c4cSStephen Warren };
120673dd5c4cSStephen Warren 
120773dd5c4cSStephen Warren enum mrq_thermal_bpmp_to_host_cmd {
120873dd5c4cSStephen Warren 	/**
120973dd5c4cSStephen Warren 	 * @brief Indication that the temperature for a zone has
121073dd5c4cSStephen Warren 	 *   exceeded the range indicated in the thermal trip point
121173dd5c4cSStephen Warren 	 *   for the zone.
121273dd5c4cSStephen Warren 	 *
121373dd5c4cSStephen Warren 	 * BPMP needs to supply request parameters. Host only needs to
121473dd5c4cSStephen Warren 	 * acknowledge.
121573dd5c4cSStephen Warren 	 */
121673dd5c4cSStephen Warren 	CMD_THERMAL_HOST_TRIP_REACHED = 100,
121773dd5c4cSStephen Warren 
121873dd5c4cSStephen Warren 	/** @brief: number of supported bpmp-to-host commands. May
121973dd5c4cSStephen Warren 	 * increase in future
122073dd5c4cSStephen Warren 	 */
122173dd5c4cSStephen Warren 	CMD_THERMAL_BPMP_TO_HOST_NUM
122273dd5c4cSStephen Warren };
122373dd5c4cSStephen Warren 
122473dd5c4cSStephen Warren /*
122573dd5c4cSStephen Warren  * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
122673dd5c4cSStephen Warren  *
122773dd5c4cSStephen Warren  * zone: Request type for which to check existence.
122873dd5c4cSStephen Warren  */
122973dd5c4cSStephen Warren struct cmd_thermal_query_abi_request {
123073dd5c4cSStephen Warren 	uint32_t type;
123173dd5c4cSStephen Warren } __ABI_PACKED;
123273dd5c4cSStephen Warren 
123373dd5c4cSStephen Warren /*
123473dd5c4cSStephen Warren  * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
123573dd5c4cSStephen Warren  *
123673dd5c4cSStephen Warren  * zone: Number of thermal zone.
123773dd5c4cSStephen Warren  */
123873dd5c4cSStephen Warren struct cmd_thermal_get_temp_request {
123973dd5c4cSStephen Warren 	uint32_t zone;
124073dd5c4cSStephen Warren } __ABI_PACKED;
124173dd5c4cSStephen Warren 
124273dd5c4cSStephen Warren /*
124373dd5c4cSStephen Warren  * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
124473dd5c4cSStephen Warren  *
124573dd5c4cSStephen Warren  * error: 0 if request succeeded.
124673dd5c4cSStephen Warren  *	-BPMP_EINVAL if request parameters were invalid.
124773dd5c4cSStephen Warren  *      -BPMP_ENOENT if no driver was registered for the specified thermal zone.
124873dd5c4cSStephen Warren  *      -BPMP_EFAULT for other thermal zone driver errors.
124973dd5c4cSStephen Warren  * temp: Current temperature in millicelsius.
125073dd5c4cSStephen Warren  */
125173dd5c4cSStephen Warren struct cmd_thermal_get_temp_response {
125273dd5c4cSStephen Warren 	int32_t temp;
125373dd5c4cSStephen Warren } __ABI_PACKED;
125473dd5c4cSStephen Warren 
125573dd5c4cSStephen Warren /*
125673dd5c4cSStephen Warren  * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
125773dd5c4cSStephen Warren  *
125873dd5c4cSStephen Warren  * zone: Number of thermal zone.
125973dd5c4cSStephen Warren  * low: Temperature of lower trip point in millicelsius
126073dd5c4cSStephen Warren  * high: Temperature of upper trip point in millicelsius
126173dd5c4cSStephen Warren  * enabled: 1 to enable trip point, 0 to disable trip point
126273dd5c4cSStephen Warren  */
126373dd5c4cSStephen Warren struct cmd_thermal_set_trip_request {
126473dd5c4cSStephen Warren 	uint32_t zone;
126573dd5c4cSStephen Warren 	int32_t low;
126673dd5c4cSStephen Warren 	int32_t high;
126773dd5c4cSStephen Warren 	uint32_t enabled;
126873dd5c4cSStephen Warren } __ABI_PACKED;
126973dd5c4cSStephen Warren 
127073dd5c4cSStephen Warren /*
127173dd5c4cSStephen Warren  * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
127273dd5c4cSStephen Warren  *
127373dd5c4cSStephen Warren  * zone: Number of thermal zone where trip point was reached.
127473dd5c4cSStephen Warren  */
127573dd5c4cSStephen Warren struct cmd_thermal_host_trip_reached_request {
127673dd5c4cSStephen Warren 	uint32_t zone;
127773dd5c4cSStephen Warren } __ABI_PACKED;
127873dd5c4cSStephen Warren 
127973dd5c4cSStephen Warren /*
128073dd5c4cSStephen Warren  * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
128173dd5c4cSStephen Warren  *
128273dd5c4cSStephen Warren  * num: Number of supported thermal zones. The thermal zones are indexed
128373dd5c4cSStephen Warren  *      starting from zero.
128473dd5c4cSStephen Warren  */
128573dd5c4cSStephen Warren struct cmd_thermal_get_num_zones_response {
128673dd5c4cSStephen Warren 	uint32_t num;
128773dd5c4cSStephen Warren } __ABI_PACKED;
128873dd5c4cSStephen Warren 
128973dd5c4cSStephen Warren /*
129073dd5c4cSStephen Warren  * Host->BPMP request data.
129173dd5c4cSStephen Warren  *
129273dd5c4cSStephen Warren  * Reply type is union mrq_thermal_bpmp_to_host_response.
129373dd5c4cSStephen Warren  *
129473dd5c4cSStephen Warren  * type: Type of request. Values listed in enum mrq_thermal_type.
129573dd5c4cSStephen Warren  * data: Request type specific parameters.
129673dd5c4cSStephen Warren  */
129773dd5c4cSStephen Warren struct mrq_thermal_host_to_bpmp_request {
129873dd5c4cSStephen Warren 	uint32_t type;
129973dd5c4cSStephen Warren 	union {
130073dd5c4cSStephen Warren 		struct cmd_thermal_query_abi_request query_abi;
130173dd5c4cSStephen Warren 		struct cmd_thermal_get_temp_request get_temp;
130273dd5c4cSStephen Warren 		struct cmd_thermal_set_trip_request set_trip;
130373dd5c4cSStephen Warren 	} __UNION_ANON;
130473dd5c4cSStephen Warren } __ABI_PACKED;
130573dd5c4cSStephen Warren 
130673dd5c4cSStephen Warren /*
130773dd5c4cSStephen Warren  * BPMP->Host request data.
130873dd5c4cSStephen Warren  *
130973dd5c4cSStephen Warren  * type: Type of request. Values listed in enum mrq_thermal_type.
131073dd5c4cSStephen Warren  * data: Request type specific parameters.
131173dd5c4cSStephen Warren  */
131273dd5c4cSStephen Warren struct mrq_thermal_bpmp_to_host_request {
131373dd5c4cSStephen Warren 	uint32_t type;
131473dd5c4cSStephen Warren 	union {
131573dd5c4cSStephen Warren 		struct cmd_thermal_host_trip_reached_request host_trip_reached;
131673dd5c4cSStephen Warren 	} __UNION_ANON;
131773dd5c4cSStephen Warren } __ABI_PACKED;
131873dd5c4cSStephen Warren 
131973dd5c4cSStephen Warren /*
132073dd5c4cSStephen Warren  * Data in reply to a Host->BPMP request.
132173dd5c4cSStephen Warren  */
132273dd5c4cSStephen Warren union mrq_thermal_bpmp_to_host_response {
132373dd5c4cSStephen Warren 	struct cmd_thermal_get_temp_response get_temp;
132473dd5c4cSStephen Warren 	struct cmd_thermal_get_num_zones_response get_num_zones;
132573dd5c4cSStephen Warren } __ABI_PACKED;
132673dd5c4cSStephen Warren /** @} */
132773dd5c4cSStephen Warren 
132873dd5c4cSStephen Warren /**
132973dd5c4cSStephen Warren  * @ingroup MRQ_Codes
133073dd5c4cSStephen Warren  * @def MRQ_CPU_VHINT
133173dd5c4cSStephen Warren  * @brief Query CPU voltage hint data
133273dd5c4cSStephen Warren  *
133373dd5c4cSStephen Warren  * * Platforms: T186
133473dd5c4cSStephen Warren  * * Initiators: CCPLEX
133573dd5c4cSStephen Warren  * * Targets: BPMP
133673dd5c4cSStephen Warren  * * Request Payload: @ref mrq_cpu_vhint_request
133773dd5c4cSStephen Warren  * * Response Payload: N/A
133873dd5c4cSStephen Warren  *
133973dd5c4cSStephen Warren  * @addtogroup Vhint CPU Voltage hint
134073dd5c4cSStephen Warren  * @{
134173dd5c4cSStephen Warren  */
134273dd5c4cSStephen Warren 
134373dd5c4cSStephen Warren /**
134473dd5c4cSStephen Warren  * @brief request with #MRQ_CPU_VHINT
134573dd5c4cSStephen Warren  *
134673dd5c4cSStephen Warren  * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data
134773dd5c4cSStephen Warren  * from BPMP to memory space pointed by #addr. CCPLEX is responsible
134873dd5c4cSStephen Warren  * to allocate sizeof(cpu_vhint_data) sized block of memory and
134973dd5c4cSStephen Warren  * appropriately map it for BPMP before sending the request.
135073dd5c4cSStephen Warren  */
135173dd5c4cSStephen Warren struct mrq_cpu_vhint_request {
135273dd5c4cSStephen Warren 	/** @brief IOVA address for the #cpu_vhint_data */
135373dd5c4cSStephen Warren 	uint32_t addr; /* struct cpu_vhint_data * */
135473dd5c4cSStephen Warren 	/** @brief ID of the cluster whose data is requested */
135573dd5c4cSStephen Warren 	uint32_t cluster_id; /* enum cluster_id */
135673dd5c4cSStephen Warren } __ABI_PACKED;
135773dd5c4cSStephen Warren 
135873dd5c4cSStephen Warren /**
135973dd5c4cSStephen Warren  * @brief description of the CPU v/f relation
136073dd5c4cSStephen Warren  *
136173dd5c4cSStephen Warren  * Used by #MRQ_CPU_VHINT call to carry data pointed by #addr of
136273dd5c4cSStephen Warren  * struct mrq_cpu_vhint_request
136373dd5c4cSStephen Warren  */
136473dd5c4cSStephen Warren struct cpu_vhint_data {
136573dd5c4cSStephen Warren 	uint32_t ref_clk_hz; /**< reference frequency in Hz */
136673dd5c4cSStephen Warren 	uint16_t pdiv; /**< post divider value */
136773dd5c4cSStephen Warren 	uint16_t mdiv; /**< input divider value */
136873dd5c4cSStephen Warren 	uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */
136973dd5c4cSStephen Warren 	/** table of ndiv values as a function of vINDEX (voltage index) */
137073dd5c4cSStephen Warren 	uint16_t ndiv[80];
137173dd5c4cSStephen Warren 	/** minimum allowed NDIV value */
137273dd5c4cSStephen Warren 	uint16_t ndiv_min;
137373dd5c4cSStephen Warren 	/** minimum allowed voltage hint value (as in vINDEX) */
137473dd5c4cSStephen Warren 	uint16_t vfloor;
137573dd5c4cSStephen Warren 	/** maximum allowed voltage hint value (as in vINDEX) */
137673dd5c4cSStephen Warren 	uint16_t vceil;
137773dd5c4cSStephen Warren 	/** post-multiplier for vindex value */
137873dd5c4cSStephen Warren 	uint16_t vindex_mult;
137973dd5c4cSStephen Warren 	/** post-divider for vindex value */
138073dd5c4cSStephen Warren 	uint16_t vindex_div;
138173dd5c4cSStephen Warren 	/** reserved for future use */
138273dd5c4cSStephen Warren 	uint16_t reserved[328];
138373dd5c4cSStephen Warren } __ABI_PACKED;
138473dd5c4cSStephen Warren 
138573dd5c4cSStephen Warren /** @} */
138673dd5c4cSStephen Warren 
138773dd5c4cSStephen Warren /**
138873dd5c4cSStephen Warren  * @ingroup MRQ_Codes
138973dd5c4cSStephen Warren  * @def MRQ_ABI_RATCHET
139073dd5c4cSStephen Warren  * @brief ABI ratchet value query
139173dd5c4cSStephen Warren  *
139273dd5c4cSStephen Warren  * * Platforms: T186
139373dd5c4cSStephen Warren  * * Initiators: Any
139473dd5c4cSStephen Warren  * * Targets: BPMP
139573dd5c4cSStephen Warren  * * Request Payload: @ref mrq_abi_ratchet_request
139673dd5c4cSStephen Warren  * * Response Payload: @ref mrq_abi_ratchet_response
139773dd5c4cSStephen Warren  * @addtogroup ABI_info
139873dd5c4cSStephen Warren  * @{
139973dd5c4cSStephen Warren  */
140073dd5c4cSStephen Warren 
140173dd5c4cSStephen Warren /**
140273dd5c4cSStephen Warren  * @brief an ABI compatibility mechanism
140373dd5c4cSStephen Warren  *
140473dd5c4cSStephen Warren  * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future
140573dd5c4cSStephen Warren  * revision of this header file.
140673dd5c4cSStephen Warren  * 1. That future revision deprecates some MRQ
140773dd5c4cSStephen Warren  * 2. That future revision introduces a breaking change to an existing
140873dd5c4cSStephen Warren  *    MRQ or
140973dd5c4cSStephen Warren  * 3. A bug is discovered in an existing implementation of the BPMP-FW
141073dd5c4cSStephen Warren  *    (or possibly one of its clients) which warrants deprecating that
141173dd5c4cSStephen Warren  *    implementation.
141273dd5c4cSStephen Warren  */
141373dd5c4cSStephen Warren #define BPMP_ABI_RATCHET_VALUE 3
141473dd5c4cSStephen Warren 
141573dd5c4cSStephen Warren /**
141673dd5c4cSStephen Warren  * @brief request with #MRQ_ABI_RATCHET.
141773dd5c4cSStephen Warren  *
141873dd5c4cSStephen Warren  * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
141973dd5c4cSStephen Warren  * against which the requester was compiled.
142073dd5c4cSStephen Warren  *
142173dd5c4cSStephen Warren  * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may
142273dd5c4cSStephen Warren  * reply with mrq_response::err = -#BPMP_ERANGE to indicate that
142373dd5c4cSStephen Warren  * BPMP-FW cannot interoperate correctly with the requester. Requester
142473dd5c4cSStephen Warren  * should cease further communication with BPMP.
142573dd5c4cSStephen Warren  *
142673dd5c4cSStephen Warren  * Otherwise, err shall be 0.
142773dd5c4cSStephen Warren  */
142873dd5c4cSStephen Warren struct mrq_abi_ratchet_request {
142973dd5c4cSStephen Warren 	/** @brief requester's ratchet value */
143073dd5c4cSStephen Warren 	uint16_t ratchet;
143173dd5c4cSStephen Warren };
143273dd5c4cSStephen Warren 
143373dd5c4cSStephen Warren /**
143473dd5c4cSStephen Warren  * @brief response to #MRQ_ABI_RATCHET
143573dd5c4cSStephen Warren  *
143673dd5c4cSStephen Warren  * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
143773dd5c4cSStephen Warren  * against which BPMP firwmare was compiled.
143873dd5c4cSStephen Warren  *
143973dd5c4cSStephen Warren  * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE,
144073dd5c4cSStephen Warren  * the requster must either interoperate with BPMP according to an ABI
144173dd5c4cSStephen Warren  * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease
144273dd5c4cSStephen Warren  * communication with BPMP.
144373dd5c4cSStephen Warren  *
144473dd5c4cSStephen Warren  * If mrq_response::err is 0 and ratchet is greater than or equal to the
144573dd5c4cSStephen Warren  * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue
144673dd5c4cSStephen Warren  * normal operation.
144773dd5c4cSStephen Warren  */
144873dd5c4cSStephen Warren struct mrq_abi_ratchet_response {
144973dd5c4cSStephen Warren 	/** @brief BPMP's ratchet value */
145073dd5c4cSStephen Warren 	uint16_t ratchet;
145173dd5c4cSStephen Warren };
145273dd5c4cSStephen Warren /** @} */
145373dd5c4cSStephen Warren 
145473dd5c4cSStephen Warren /**
145573dd5c4cSStephen Warren  * @ingroup MRQ_Codes
145673dd5c4cSStephen Warren  * @def MRQ_EMC_DVFS_LATENCY
145773dd5c4cSStephen Warren  * @brief query frequency dependent EMC DVFS latency
145873dd5c4cSStephen Warren  *
145973dd5c4cSStephen Warren  * * Platforms: T186
146073dd5c4cSStephen Warren  * * Initiators: CCPLEX
146173dd5c4cSStephen Warren  * * Targets: BPMP
146273dd5c4cSStephen Warren  * * Request Payload: N/A
146373dd5c4cSStephen Warren  * * Response Payload: @ref mrq_emc_dvfs_latency_response
146473dd5c4cSStephen Warren  * @addtogroup EMC
146573dd5c4cSStephen Warren  * @{
146673dd5c4cSStephen Warren  */
146773dd5c4cSStephen Warren 
146873dd5c4cSStephen Warren /**
146973dd5c4cSStephen Warren  * @brief used by @ref mrq_emc_dvfs_latency_response
147073dd5c4cSStephen Warren  */
147173dd5c4cSStephen Warren struct emc_dvfs_latency {
147273dd5c4cSStephen Warren 	/** @brief EMC frequency in kHz */
147373dd5c4cSStephen Warren 	uint32_t freq;
147473dd5c4cSStephen Warren 	/** @brief EMC DVFS latency in nanoseconds */
147573dd5c4cSStephen Warren 	uint32_t latency;
147673dd5c4cSStephen Warren } __ABI_PACKED;
147773dd5c4cSStephen Warren 
147873dd5c4cSStephen Warren #define EMC_DVFS_LATENCY_MAX_SIZE	14
147973dd5c4cSStephen Warren /**
148073dd5c4cSStephen Warren  * @brief response to #MRQ_EMC_DVFS_LATENCY
148173dd5c4cSStephen Warren  */
148273dd5c4cSStephen Warren struct mrq_emc_dvfs_latency_response {
148373dd5c4cSStephen Warren 	/** @brief the number valid entries in #pairs */
148473dd5c4cSStephen Warren 	uint32_t num_pairs;
148573dd5c4cSStephen Warren 	/** @brief EMC <frequency, latency> information */
148673dd5c4cSStephen Warren 	struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE];
148773dd5c4cSStephen Warren } __ABI_PACKED;
148873dd5c4cSStephen Warren 
148973dd5c4cSStephen Warren /** @} */
149073dd5c4cSStephen Warren 
149173dd5c4cSStephen Warren /**
149273dd5c4cSStephen Warren  * @ingroup MRQ_Codes
149373dd5c4cSStephen Warren  * @def MRQ_TRACE_ITER
149473dd5c4cSStephen Warren  * @brief manage the trace iterator
149573dd5c4cSStephen Warren  *
149673dd5c4cSStephen Warren  * * Platforms: All
149773dd5c4cSStephen Warren  * * Initiators: CCPLEX
149873dd5c4cSStephen Warren  * * Targets: BPMP
149973dd5c4cSStephen Warren  * * Request Payload: N/A
150073dd5c4cSStephen Warren  * * Response Payload: @ref mrq_trace_iter_request
150173dd5c4cSStephen Warren  * @addtogroup Trace
150273dd5c4cSStephen Warren  * @{
150373dd5c4cSStephen Warren  */
150473dd5c4cSStephen Warren enum {
150573dd5c4cSStephen Warren 	/** @brief (re)start the tracing now. Ignore older events */
150673dd5c4cSStephen Warren 	TRACE_ITER_INIT = 0,
150773dd5c4cSStephen Warren 	/** @brief clobber all events in the trace buffer */
150873dd5c4cSStephen Warren 	TRACE_ITER_CLEAN = 1
150973dd5c4cSStephen Warren };
151073dd5c4cSStephen Warren 
151173dd5c4cSStephen Warren /**
151273dd5c4cSStephen Warren  * @brief request with #MRQ_TRACE_ITER
151373dd5c4cSStephen Warren  */
151473dd5c4cSStephen Warren struct mrq_trace_iter_request {
151573dd5c4cSStephen Warren 	/** @brief TRACE_ITER_INIT or TRACE_ITER_CLEAN */
151673dd5c4cSStephen Warren 	uint32_t cmd;
151773dd5c4cSStephen Warren } __ABI_PACKED;
151873dd5c4cSStephen Warren 
151973dd5c4cSStephen Warren /** @} */
152073dd5c4cSStephen Warren 
152173dd5c4cSStephen Warren /*
152273dd5c4cSStephen Warren  *  4. Enumerations
152373dd5c4cSStephen Warren  */
152473dd5c4cSStephen Warren 
152573dd5c4cSStephen Warren /*
152673dd5c4cSStephen Warren  *   4.1 CPU enumerations
152773dd5c4cSStephen Warren  *
152873dd5c4cSStephen Warren  * See <mach-t186/system-t186.h>
152973dd5c4cSStephen Warren  *
153073dd5c4cSStephen Warren  *   4.2 CPU Cluster enumerations
153173dd5c4cSStephen Warren  *
153273dd5c4cSStephen Warren  * See <mach-t186/system-t186.h>
153373dd5c4cSStephen Warren  *
153473dd5c4cSStephen Warren  *   4.3 System low power state enumerations
153573dd5c4cSStephen Warren  *
153673dd5c4cSStephen Warren  * See <mach-t186/system-t186.h>
153773dd5c4cSStephen Warren  */
153873dd5c4cSStephen Warren 
153973dd5c4cSStephen Warren /*
154073dd5c4cSStephen Warren  *   4.4 Clock enumerations
154173dd5c4cSStephen Warren  *
154273dd5c4cSStephen Warren  * For clock enumerations, see <mach-t186/clk-t186.h>
154373dd5c4cSStephen Warren  */
154473dd5c4cSStephen Warren 
154573dd5c4cSStephen Warren /*
154673dd5c4cSStephen Warren  *   4.5 Reset enumerations
154773dd5c4cSStephen Warren  *
154873dd5c4cSStephen Warren  * For reset enumerations, see <mach-t186/reset-t186.h>
154973dd5c4cSStephen Warren  */
155073dd5c4cSStephen Warren 
155173dd5c4cSStephen Warren /*
155273dd5c4cSStephen Warren  *   4.6 Thermal sensor enumerations
155373dd5c4cSStephen Warren  *
155473dd5c4cSStephen Warren  * For thermal sensor enumerations, see <mach-t186/thermal-t186.h>
155573dd5c4cSStephen Warren  */
155673dd5c4cSStephen Warren 
155773dd5c4cSStephen Warren /**
155873dd5c4cSStephen Warren  * @defgroup Error_Codes
155973dd5c4cSStephen Warren  * Negative values for mrq_response::err generally indicate some
156073dd5c4cSStephen Warren  * error. The ABI defines the following error codes. Negating these
156173dd5c4cSStephen Warren  * defines is an exercise left to the user.
156273dd5c4cSStephen Warren  * @{
156373dd5c4cSStephen Warren  */
156473dd5c4cSStephen Warren /** @brief No such file or directory */
156573dd5c4cSStephen Warren #define BPMP_ENOENT	2
156673dd5c4cSStephen Warren /** @brief No MRQ handler */
156773dd5c4cSStephen Warren #define BPMP_ENOHANDLER	3
156873dd5c4cSStephen Warren /** @brief I/O error */
156973dd5c4cSStephen Warren #define BPMP_EIO	5
157073dd5c4cSStephen Warren /** @brief Bad sub-MRQ command */
157173dd5c4cSStephen Warren #define BPMP_EBADCMD	6
157273dd5c4cSStephen Warren /** @brief Not enough memory */
157373dd5c4cSStephen Warren #define BPMP_ENOMEM	12
157473dd5c4cSStephen Warren /** @brief Permission denied */
157573dd5c4cSStephen Warren #define BPMP_EACCES	13
157673dd5c4cSStephen Warren /** @brief Bad address */
157773dd5c4cSStephen Warren #define BPMP_EFAULT	14
157873dd5c4cSStephen Warren /** @brief No such device */
157973dd5c4cSStephen Warren #define BPMP_ENODEV	19
158073dd5c4cSStephen Warren /** @brief Argument is a directory */
158173dd5c4cSStephen Warren #define BPMP_EISDIR	21
158273dd5c4cSStephen Warren /** @brief Invalid argument */
158373dd5c4cSStephen Warren #define BPMP_EINVAL	22
158473dd5c4cSStephen Warren /** @brief Timeout during operation */
158573dd5c4cSStephen Warren #define BPMP_ETIMEDOUT  23
158673dd5c4cSStephen Warren /** @brief Out of range */
158773dd5c4cSStephen Warren #define BPMP_ERANGE	34
158873dd5c4cSStephen Warren /** @} */
158973dd5c4cSStephen Warren /** @} */
159073dd5c4cSStephen Warren #endif
1591