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