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