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