1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef ABI_BPMP_ABI_H 7*4882a593Smuzhiyun #define ABI_BPMP_ABI_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #if defined(LK) || defined(BPMP_ABI_HAVE_STDC) 10*4882a593Smuzhiyun #include <stddef.h> 11*4882a593Smuzhiyun #include <stdint.h> 12*4882a593Smuzhiyun #endif 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef BPMP_ABI_PACKED 15*4882a593Smuzhiyun #ifdef __ABI_PACKED 16*4882a593Smuzhiyun #define BPMP_ABI_PACKED __ABI_PACKED 17*4882a593Smuzhiyun #else 18*4882a593Smuzhiyun #define BPMP_ABI_PACKED __attribute__((packed)) 19*4882a593Smuzhiyun #endif 20*4882a593Smuzhiyun #endif 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #ifdef NO_GCC_EXTENSIONS 23*4882a593Smuzhiyun #define BPMP_ABI_EMPTY char empty; 24*4882a593Smuzhiyun #define BPMP_ABI_EMPTY_ARRAY 1 25*4882a593Smuzhiyun #else 26*4882a593Smuzhiyun #define BPMP_ABI_EMPTY 27*4882a593Smuzhiyun #define BPMP_ABI_EMPTY_ARRAY 0 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #ifndef BPMP_UNION_ANON 31*4882a593Smuzhiyun #ifdef __UNION_ANON 32*4882a593Smuzhiyun #define BPMP_UNION_ANON __UNION_ANON 33*4882a593Smuzhiyun #else 34*4882a593Smuzhiyun #define BPMP_UNION_ANON 35*4882a593Smuzhiyun #endif 36*4882a593Smuzhiyun #endif 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /** 39*4882a593Smuzhiyun * @file 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /** 43*4882a593Smuzhiyun * @defgroup MRQ MRQ Messages 44*4882a593Smuzhiyun * @brief Messages sent to/from BPMP via IPC 45*4882a593Smuzhiyun * @{ 46*4882a593Smuzhiyun * @defgroup MRQ_Format Message Format 47*4882a593Smuzhiyun * @defgroup MRQ_Codes Message Request (MRQ) Codes 48*4882a593Smuzhiyun * @defgroup MRQ_Payloads Message Payloads 49*4882a593Smuzhiyun * @defgroup Error_Codes Error Codes 50*4882a593Smuzhiyun * @} 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /** 54*4882a593Smuzhiyun * @addtogroup MRQ_Format 55*4882a593Smuzhiyun * @{ 56*4882a593Smuzhiyun * The CPU requests the BPMP to perform a particular service by 57*4882a593Smuzhiyun * sending it an IVC frame containing a single MRQ message. An MRQ 58*4882a593Smuzhiyun * message consists of a @ref mrq_request followed by a payload whose 59*4882a593Smuzhiyun * format depends on mrq_request::mrq. 60*4882a593Smuzhiyun * 61*4882a593Smuzhiyun * The BPMP processes the data and replies with an IVC frame (on the 62*4882a593Smuzhiyun * same IVC channel) containing and MRQ response. An MRQ response 63*4882a593Smuzhiyun * consists of a @ref mrq_response followed by a payload whose format 64*4882a593Smuzhiyun * depends on the associated mrq_request::mrq. 65*4882a593Smuzhiyun * 66*4882a593Smuzhiyun * A well-defined subset of the MRQ messages that the CPU sends to the 67*4882a593Smuzhiyun * BPMP can lead to BPMP eventually sending an MRQ message to the 68*4882a593Smuzhiyun * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set 69*4882a593Smuzhiyun * a thermal trip point, the BPMP may eventually send a single 70*4882a593Smuzhiyun * #MRQ_THERMAL message of its own to the CPU indicating that the trip 71*4882a593Smuzhiyun * point has been crossed. 72*4882a593Smuzhiyun * @} 73*4882a593Smuzhiyun */ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /** 76*4882a593Smuzhiyun * @ingroup MRQ_Format 77*4882a593Smuzhiyun * @brief Header for an MRQ message 78*4882a593Smuzhiyun * 79*4882a593Smuzhiyun * Provides the MRQ number for the MRQ message: #mrq. The remainder of 80*4882a593Smuzhiyun * the MRQ message is a payload (immediately following the 81*4882a593Smuzhiyun * mrq_request) whose format depends on mrq. 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun struct mrq_request { 84*4882a593Smuzhiyun /** @brief MRQ number of the request */ 85*4882a593Smuzhiyun uint32_t mrq; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /** 88*4882a593Smuzhiyun * @brief Flags providing follow up directions to the receiver 89*4882a593Smuzhiyun * 90*4882a593Smuzhiyun * | Bit | Description | 91*4882a593Smuzhiyun * |-----|--------------------------------------------| 92*4882a593Smuzhiyun * | 1 | ring the sender's doorbell when responding | 93*4882a593Smuzhiyun * | 0 | should be 1 | 94*4882a593Smuzhiyun */ 95*4882a593Smuzhiyun uint32_t flags; 96*4882a593Smuzhiyun } BPMP_ABI_PACKED; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /** 99*4882a593Smuzhiyun * @ingroup MRQ_Format 100*4882a593Smuzhiyun * @brief Header for an MRQ response 101*4882a593Smuzhiyun * 102*4882a593Smuzhiyun * Provides an error code for the associated MRQ message. The 103*4882a593Smuzhiyun * remainder of the MRQ response is a payload (immediately following 104*4882a593Smuzhiyun * the mrq_response) whose format depends on the associated 105*4882a593Smuzhiyun * mrq_request::mrq 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun struct mrq_response { 108*4882a593Smuzhiyun /** @brief Error code for the MRQ request itself */ 109*4882a593Smuzhiyun int32_t err; 110*4882a593Smuzhiyun /** @brief Reserved for future use */ 111*4882a593Smuzhiyun uint32_t flags; 112*4882a593Smuzhiyun } BPMP_ABI_PACKED; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /** 115*4882a593Smuzhiyun * @ingroup MRQ_Format 116*4882a593Smuzhiyun * Minimum needed size for an IPC message buffer 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun #define MSG_MIN_SZ 128U 119*4882a593Smuzhiyun /** 120*4882a593Smuzhiyun * @ingroup MRQ_Format 121*4882a593Smuzhiyun * Minimum size guaranteed for data in an IPC message buffer 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun #define MSG_DATA_MIN_SZ 120U 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /** 126*4882a593Smuzhiyun * @ingroup MRQ_Codes 127*4882a593Smuzhiyun * @name Legal MRQ codes 128*4882a593Smuzhiyun * These are the legal values for mrq_request::mrq 129*4882a593Smuzhiyun * @{ 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define MRQ_PING 0U 133*4882a593Smuzhiyun #define MRQ_QUERY_TAG 1U 134*4882a593Smuzhiyun #define MRQ_MODULE_LOAD 4U 135*4882a593Smuzhiyun #define MRQ_MODULE_UNLOAD 5U 136*4882a593Smuzhiyun #define MRQ_TRACE_MODIFY 7U 137*4882a593Smuzhiyun #define MRQ_WRITE_TRACE 8U 138*4882a593Smuzhiyun #define MRQ_THREADED_PING 9U 139*4882a593Smuzhiyun #define MRQ_MODULE_MAIL 11U 140*4882a593Smuzhiyun #define MRQ_DEBUGFS 19U 141*4882a593Smuzhiyun #define MRQ_RESET 20U 142*4882a593Smuzhiyun #define MRQ_I2C 21U 143*4882a593Smuzhiyun #define MRQ_CLK 22U 144*4882a593Smuzhiyun #define MRQ_QUERY_ABI 23U 145*4882a593Smuzhiyun #define MRQ_PG_READ_STATE 25U 146*4882a593Smuzhiyun #define MRQ_PG_UPDATE_STATE 26U 147*4882a593Smuzhiyun #define MRQ_THERMAL 27U 148*4882a593Smuzhiyun #define MRQ_CPU_VHINT 28U 149*4882a593Smuzhiyun #define MRQ_ABI_RATCHET 29U 150*4882a593Smuzhiyun #define MRQ_EMC_DVFS_LATENCY 31U 151*4882a593Smuzhiyun #define MRQ_TRACE_ITER 64U 152*4882a593Smuzhiyun #define MRQ_RINGBUF_CONSOLE 65U 153*4882a593Smuzhiyun #define MRQ_PG 66U 154*4882a593Smuzhiyun #define MRQ_CPU_NDIV_LIMITS 67U 155*4882a593Smuzhiyun #define MRQ_STRAP 68U 156*4882a593Smuzhiyun #define MRQ_UPHY 69U 157*4882a593Smuzhiyun #define MRQ_CPU_AUTO_CC3 70U 158*4882a593Smuzhiyun #define MRQ_QUERY_FW_TAG 71U 159*4882a593Smuzhiyun #define MRQ_FMON 72U 160*4882a593Smuzhiyun #define MRQ_EC 73U 161*4882a593Smuzhiyun #define MRQ_DEBUG 75U 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun /** @} */ 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /** 166*4882a593Smuzhiyun * @ingroup MRQ_Codes 167*4882a593Smuzhiyun * @brief Maximum MRQ code to be sent by CPU software to 168*4882a593Smuzhiyun * BPMP. Subject to change in future 169*4882a593Smuzhiyun */ 170*4882a593Smuzhiyun #define MAX_CPU_MRQ_ID 75U 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /** 173*4882a593Smuzhiyun * @addtogroup MRQ_Payloads 174*4882a593Smuzhiyun * @{ 175*4882a593Smuzhiyun * @defgroup Ping Ping 176*4882a593Smuzhiyun * @defgroup Query_Tag Query Tag 177*4882a593Smuzhiyun * @defgroup Module Loadable Modules 178*4882a593Smuzhiyun * @defgroup Trace Trace 179*4882a593Smuzhiyun * @defgroup Debugfs Debug File System 180*4882a593Smuzhiyun * @defgroup Reset Reset 181*4882a593Smuzhiyun * @defgroup I2C I2C 182*4882a593Smuzhiyun * @defgroup Clocks Clocks 183*4882a593Smuzhiyun * @defgroup ABI_info ABI Info 184*4882a593Smuzhiyun * @defgroup Powergating Power Gating 185*4882a593Smuzhiyun * @defgroup Thermal Thermal 186*4882a593Smuzhiyun * @defgroup Vhint CPU Voltage hint 187*4882a593Smuzhiyun * @defgroup EMC EMC 188*4882a593Smuzhiyun * @defgroup CPU NDIV Limits 189*4882a593Smuzhiyun * @defgroup RingbufConsole Ring Buffer Console 190*4882a593Smuzhiyun * @defgroup Strap Straps 191*4882a593Smuzhiyun * @defgroup UPHY UPHY 192*4882a593Smuzhiyun * @defgroup CC3 Auto-CC3 193*4882a593Smuzhiyun * @defgroup FMON FMON 194*4882a593Smuzhiyun * @defgroup EC EC 195*4882a593Smuzhiyun * @defgroup Fbvolt_status Fuse Burn Voltage Status 196*4882a593Smuzhiyun * @} 197*4882a593Smuzhiyun */ 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /** 200*4882a593Smuzhiyun * @ingroup MRQ_Codes 201*4882a593Smuzhiyun * @def MRQ_PING 202*4882a593Smuzhiyun * @brief A simple ping 203*4882a593Smuzhiyun * 204*4882a593Smuzhiyun * * Platforms: All 205*4882a593Smuzhiyun * * Initiators: Any 206*4882a593Smuzhiyun * * Targets: Any 207*4882a593Smuzhiyun * * Request Payload: @ref mrq_ping_request 208*4882a593Smuzhiyun * * Response Payload: @ref mrq_ping_response 209*4882a593Smuzhiyun * 210*4882a593Smuzhiyun * @ingroup MRQ_Codes 211*4882a593Smuzhiyun * @def MRQ_THREADED_PING 212*4882a593Smuzhiyun * @brief A deeper ping 213*4882a593Smuzhiyun * 214*4882a593Smuzhiyun * * Platforms: All 215*4882a593Smuzhiyun * * Initiators: Any 216*4882a593Smuzhiyun * * Targets: BPMP 217*4882a593Smuzhiyun * * Request Payload: @ref mrq_ping_request 218*4882a593Smuzhiyun * * Response Payload: @ref mrq_ping_response 219*4882a593Smuzhiyun * 220*4882a593Smuzhiyun * Behavior is equivalent to a simple #MRQ_PING except that BPMP 221*4882a593Smuzhiyun * responds from a thread context (providing a slightly more robust 222*4882a593Smuzhiyun * sign of life). 223*4882a593Smuzhiyun * 224*4882a593Smuzhiyun */ 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /** 227*4882a593Smuzhiyun * @ingroup Ping 228*4882a593Smuzhiyun * @brief Request with #MRQ_PING 229*4882a593Smuzhiyun * 230*4882a593Smuzhiyun * Used by the sender of an #MRQ_PING message to request a pong from 231*4882a593Smuzhiyun * recipient. The response from the recipient is computed based on 232*4882a593Smuzhiyun * #challenge. 233*4882a593Smuzhiyun */ 234*4882a593Smuzhiyun struct mrq_ping_request { 235*4882a593Smuzhiyun /** @brief Arbitrarily chosen value */ 236*4882a593Smuzhiyun uint32_t challenge; 237*4882a593Smuzhiyun } BPMP_ABI_PACKED; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /** 240*4882a593Smuzhiyun * @ingroup Ping 241*4882a593Smuzhiyun * @brief Response to #MRQ_PING 242*4882a593Smuzhiyun * 243*4882a593Smuzhiyun * Sent in response to an #MRQ_PING message. #reply should be the 244*4882a593Smuzhiyun * mrq_ping_request challenge left shifted by 1 with the carry-bit 245*4882a593Smuzhiyun * dropped. 246*4882a593Smuzhiyun * 247*4882a593Smuzhiyun */ 248*4882a593Smuzhiyun struct mrq_ping_response { 249*4882a593Smuzhiyun /** @brief Response to the MRQ_PING challege */ 250*4882a593Smuzhiyun uint32_t reply; 251*4882a593Smuzhiyun } BPMP_ABI_PACKED; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /** 254*4882a593Smuzhiyun * @ingroup MRQ_Codes 255*4882a593Smuzhiyun * @def MRQ_QUERY_TAG 256*4882a593Smuzhiyun * @brief Query BPMP firmware's tag (i.e. unique identifer) 257*4882a593Smuzhiyun * 258*4882a593Smuzhiyun * @deprecated Use #MRQ_QUERY_FW_TAG instead. 259*4882a593Smuzhiyun * 260*4882a593Smuzhiyun * * Platforms: All 261*4882a593Smuzhiyun * * Initiators: CCPLEX 262*4882a593Smuzhiyun * * Targets: BPMP 263*4882a593Smuzhiyun * * Request Payload: @ref mrq_query_tag_request 264*4882a593Smuzhiyun * * Response Payload: N/A 265*4882a593Smuzhiyun * 266*4882a593Smuzhiyun */ 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /** 269*4882a593Smuzhiyun * @ingroup Query_Tag 270*4882a593Smuzhiyun * @brief Request with #MRQ_QUERY_TAG 271*4882a593Smuzhiyun * 272*4882a593Smuzhiyun * @deprecated This structure will be removed in future version. 273*4882a593Smuzhiyun * Use MRQ_QUERY_FW_TAG instead. 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun struct mrq_query_tag_request { 276*4882a593Smuzhiyun /** @brief Base address to store the firmware tag */ 277*4882a593Smuzhiyun uint32_t addr; 278*4882a593Smuzhiyun } BPMP_ABI_PACKED; 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun /** 282*4882a593Smuzhiyun * @ingroup MRQ_Codes 283*4882a593Smuzhiyun * @def MRQ_QUERY_FW_TAG 284*4882a593Smuzhiyun * @brief Query BPMP firmware's tag (i.e. unique identifier) 285*4882a593Smuzhiyun * 286*4882a593Smuzhiyun * * Platforms: All 287*4882a593Smuzhiyun * * Initiators: Any 288*4882a593Smuzhiyun * * Targets: BPMP 289*4882a593Smuzhiyun * * Request Payload: N/A 290*4882a593Smuzhiyun * * Response Payload: @ref mrq_query_fw_tag_response 291*4882a593Smuzhiyun * 292*4882a593Smuzhiyun */ 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /** 295*4882a593Smuzhiyun * @ingroup Query_Tag 296*4882a593Smuzhiyun * @brief Response to #MRQ_QUERY_FW_TAG 297*4882a593Smuzhiyun * 298*4882a593Smuzhiyun * Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique 299*4882a593Smuzhiyun * identifier for the version of firmware issuing the reply. 300*4882a593Smuzhiyun * 301*4882a593Smuzhiyun */ 302*4882a593Smuzhiyun struct mrq_query_fw_tag_response { 303*4882a593Smuzhiyun /** @brief Array to store tag information */ 304*4882a593Smuzhiyun uint8_t tag[32]; 305*4882a593Smuzhiyun } BPMP_ABI_PACKED; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /** 308*4882a593Smuzhiyun * @ingroup MRQ_Codes 309*4882a593Smuzhiyun * @def MRQ_MODULE_LOAD 310*4882a593Smuzhiyun * @brief Dynamically load a BPMP code module 311*4882a593Smuzhiyun * 312*4882a593Smuzhiyun * * Platforms: T210, T210B01, T186 313*4882a593Smuzhiyun * @cond (bpmp_t210 || bpmp_t210b01 || bpmp_t186) 314*4882a593Smuzhiyun * * Initiators: CCPLEX 315*4882a593Smuzhiyun * * Targets: BPMP 316*4882a593Smuzhiyun * * Request Payload: @ref mrq_module_load_request 317*4882a593Smuzhiyun * * Response Payload: @ref mrq_module_load_response 318*4882a593Smuzhiyun * 319*4882a593Smuzhiyun * @note This MRQ is disabled on production systems 320*4882a593Smuzhiyun * 321*4882a593Smuzhiyun */ 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun /** 324*4882a593Smuzhiyun * @ingroup Module 325*4882a593Smuzhiyun * @brief Request with #MRQ_MODULE_LOAD 326*4882a593Smuzhiyun * 327*4882a593Smuzhiyun * Used by #MRQ_MODULE_LOAD calls to ask the recipient to dynamically 328*4882a593Smuzhiyun * load the code located at #phys_addr and having size #size 329*4882a593Smuzhiyun * bytes. #phys_addr is treated as a void pointer. 330*4882a593Smuzhiyun * 331*4882a593Smuzhiyun * The recipient copies the code from #phys_addr to locally allocated 332*4882a593Smuzhiyun * memory prior to responding to this message. 333*4882a593Smuzhiyun * 334*4882a593Smuzhiyun * @todo document the module header format 335*4882a593Smuzhiyun * 336*4882a593Smuzhiyun * The sender is responsible for ensuring that the code is mapped in 337*4882a593Smuzhiyun * the recipient's address map. 338*4882a593Smuzhiyun * 339*4882a593Smuzhiyun */ 340*4882a593Smuzhiyun struct mrq_module_load_request { 341*4882a593Smuzhiyun /** @brief Base address of the code to load */ 342*4882a593Smuzhiyun uint32_t phys_addr; 343*4882a593Smuzhiyun /** @brief Size in bytes of code to load */ 344*4882a593Smuzhiyun uint32_t size; 345*4882a593Smuzhiyun } BPMP_ABI_PACKED; 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /** 348*4882a593Smuzhiyun * @ingroup Module 349*4882a593Smuzhiyun * @brief Response to #MRQ_MODULE_LOAD 350*4882a593Smuzhiyun * 351*4882a593Smuzhiyun * @todo document mrq_response::err 352*4882a593Smuzhiyun */ 353*4882a593Smuzhiyun struct mrq_module_load_response { 354*4882a593Smuzhiyun /** @brief Handle to the loaded module */ 355*4882a593Smuzhiyun uint32_t base; 356*4882a593Smuzhiyun } BPMP_ABI_PACKED; 357*4882a593Smuzhiyun /** @endcond*/ 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun /** 360*4882a593Smuzhiyun * @ingroup MRQ_Codes 361*4882a593Smuzhiyun * @def MRQ_MODULE_UNLOAD 362*4882a593Smuzhiyun * @brief Unload a previously loaded code module 363*4882a593Smuzhiyun * 364*4882a593Smuzhiyun * * Platforms: T210, T210B01, T186 365*4882a593Smuzhiyun * @cond (bpmp_t210 || bpmp_t210b01 || bpmp_t186) 366*4882a593Smuzhiyun * * Initiators: CCPLEX 367*4882a593Smuzhiyun * * Targets: BPMP 368*4882a593Smuzhiyun * * Request Payload: @ref mrq_module_unload_request 369*4882a593Smuzhiyun * * Response Payload: N/A 370*4882a593Smuzhiyun * 371*4882a593Smuzhiyun * @note This MRQ is disabled on production systems 372*4882a593Smuzhiyun */ 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun /** 375*4882a593Smuzhiyun * @ingroup Module 376*4882a593Smuzhiyun * @brief Request with #MRQ_MODULE_UNLOAD 377*4882a593Smuzhiyun * 378*4882a593Smuzhiyun * Used by #MRQ_MODULE_UNLOAD calls to request that a previously loaded 379*4882a593Smuzhiyun * module be unloaded. 380*4882a593Smuzhiyun */ 381*4882a593Smuzhiyun struct mrq_module_unload_request { 382*4882a593Smuzhiyun /** @brief Handle of the module to unload */ 383*4882a593Smuzhiyun uint32_t base; 384*4882a593Smuzhiyun } BPMP_ABI_PACKED; 385*4882a593Smuzhiyun /** @endcond*/ 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun /** 388*4882a593Smuzhiyun * @ingroup MRQ_Codes 389*4882a593Smuzhiyun * @def MRQ_TRACE_MODIFY 390*4882a593Smuzhiyun * @brief Modify the set of enabled trace events 391*4882a593Smuzhiyun * 392*4882a593Smuzhiyun * @deprecated 393*4882a593Smuzhiyun * 394*4882a593Smuzhiyun * * Platforms: All 395*4882a593Smuzhiyun * * Initiators: CCPLEX 396*4882a593Smuzhiyun * * Targets: BPMP 397*4882a593Smuzhiyun * * Request Payload: @ref mrq_trace_modify_request 398*4882a593Smuzhiyun * * Response Payload: @ref mrq_trace_modify_response 399*4882a593Smuzhiyun * 400*4882a593Smuzhiyun * @note This MRQ is disabled on production systems 401*4882a593Smuzhiyun */ 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /** 404*4882a593Smuzhiyun * @ingroup Trace 405*4882a593Smuzhiyun * @brief Request with #MRQ_TRACE_MODIFY 406*4882a593Smuzhiyun * 407*4882a593Smuzhiyun * Used by %MRQ_TRACE_MODIFY calls to enable or disable specify trace 408*4882a593Smuzhiyun * events. #set takes precedence for any bit set in both #set and 409*4882a593Smuzhiyun * #clr. 410*4882a593Smuzhiyun */ 411*4882a593Smuzhiyun struct mrq_trace_modify_request { 412*4882a593Smuzhiyun /** @brief Bit mask of trace events to disable */ 413*4882a593Smuzhiyun uint32_t clr; 414*4882a593Smuzhiyun /** @brief Bit mask of trace events to enable */ 415*4882a593Smuzhiyun uint32_t set; 416*4882a593Smuzhiyun } BPMP_ABI_PACKED; 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun /** 419*4882a593Smuzhiyun * @ingroup Trace 420*4882a593Smuzhiyun * @brief Response to #MRQ_TRACE_MODIFY 421*4882a593Smuzhiyun * 422*4882a593Smuzhiyun * Sent in repsonse to an #MRQ_TRACE_MODIFY message. #mask reflects the 423*4882a593Smuzhiyun * state of which events are enabled after the recipient acted on the 424*4882a593Smuzhiyun * message. 425*4882a593Smuzhiyun * 426*4882a593Smuzhiyun */ 427*4882a593Smuzhiyun struct mrq_trace_modify_response { 428*4882a593Smuzhiyun /** @brief Bit mask of trace event enable states */ 429*4882a593Smuzhiyun uint32_t mask; 430*4882a593Smuzhiyun } BPMP_ABI_PACKED; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /** 433*4882a593Smuzhiyun * @ingroup MRQ_Codes 434*4882a593Smuzhiyun * @def MRQ_WRITE_TRACE 435*4882a593Smuzhiyun * @brief Write trace data to a buffer 436*4882a593Smuzhiyun * 437*4882a593Smuzhiyun * @deprecated 438*4882a593Smuzhiyun * 439*4882a593Smuzhiyun * * Platforms: All 440*4882a593Smuzhiyun * * Initiators: CCPLEX 441*4882a593Smuzhiyun * * Targets: BPMP 442*4882a593Smuzhiyun * * Request Payload: @ref mrq_write_trace_request 443*4882a593Smuzhiyun * * Response Payload: @ref mrq_write_trace_response 444*4882a593Smuzhiyun * 445*4882a593Smuzhiyun * mrq_response::err depends on the @ref mrq_write_trace_request field 446*4882a593Smuzhiyun * values. err is -#BPMP_EINVAL if size is zero or area is NULL or 447*4882a593Smuzhiyun * area is in an illegal range. A positive value for err indicates the 448*4882a593Smuzhiyun * number of bytes written to area. 449*4882a593Smuzhiyun * 450*4882a593Smuzhiyun * @note This MRQ is disabled on production systems 451*4882a593Smuzhiyun */ 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun /** 454*4882a593Smuzhiyun * @ingroup Trace 455*4882a593Smuzhiyun * @brief Request with #MRQ_WRITE_TRACE 456*4882a593Smuzhiyun * 457*4882a593Smuzhiyun * Used by MRQ_WRITE_TRACE calls to ask the recipient to copy trace 458*4882a593Smuzhiyun * data from the recipient's local buffer to the output buffer. #area 459*4882a593Smuzhiyun * is treated as a byte-aligned pointer in the recipient's address 460*4882a593Smuzhiyun * space. 461*4882a593Smuzhiyun * 462*4882a593Smuzhiyun * The sender is responsible for ensuring that the output 463*4882a593Smuzhiyun * buffer is mapped in the recipient's address map. The recipient is 464*4882a593Smuzhiyun * responsible for protecting its own code and data from accidental 465*4882a593Smuzhiyun * overwrites. 466*4882a593Smuzhiyun */ 467*4882a593Smuzhiyun struct mrq_write_trace_request { 468*4882a593Smuzhiyun /** @brief Base address of output buffer */ 469*4882a593Smuzhiyun uint32_t area; 470*4882a593Smuzhiyun /** @brief Size in bytes of the output buffer */ 471*4882a593Smuzhiyun uint32_t size; 472*4882a593Smuzhiyun } BPMP_ABI_PACKED; 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun /** 475*4882a593Smuzhiyun * @ingroup Trace 476*4882a593Smuzhiyun * @brief Response to #MRQ_WRITE_TRACE 477*4882a593Smuzhiyun * 478*4882a593Smuzhiyun * Once this response is sent, the respondent will not access the 479*4882a593Smuzhiyun * output buffer further. 480*4882a593Smuzhiyun */ 481*4882a593Smuzhiyun struct mrq_write_trace_response { 482*4882a593Smuzhiyun /** 483*4882a593Smuzhiyun * @brief Flag whether more data remains in local buffer 484*4882a593Smuzhiyun * 485*4882a593Smuzhiyun * Value is 1 if the entire local trace buffer has been 486*4882a593Smuzhiyun * drained to the outputbuffer. Value is 0 otherwise. 487*4882a593Smuzhiyun */ 488*4882a593Smuzhiyun uint32_t eof; 489*4882a593Smuzhiyun } BPMP_ABI_PACKED; 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun /** @private */ 492*4882a593Smuzhiyun struct mrq_threaded_ping_request { 493*4882a593Smuzhiyun uint32_t challenge; 494*4882a593Smuzhiyun } BPMP_ABI_PACKED; 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun /** @private */ 497*4882a593Smuzhiyun struct mrq_threaded_ping_response { 498*4882a593Smuzhiyun uint32_t reply; 499*4882a593Smuzhiyun } BPMP_ABI_PACKED; 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun /** 502*4882a593Smuzhiyun * @ingroup MRQ_Codes 503*4882a593Smuzhiyun * @def MRQ_MODULE_MAIL 504*4882a593Smuzhiyun * @brief Send a message to a loadable module 505*4882a593Smuzhiyun * 506*4882a593Smuzhiyun * * Platforms: T210, T210B01, T186 507*4882a593Smuzhiyun * @cond (bpmp_t210 || bpmp_t210b01 || bpmp_t186) 508*4882a593Smuzhiyun * * Initiators: Any 509*4882a593Smuzhiyun * * Targets: BPMP 510*4882a593Smuzhiyun * * Request Payload: @ref mrq_module_mail_request 511*4882a593Smuzhiyun * * Response Payload: @ref mrq_module_mail_response 512*4882a593Smuzhiyun * 513*4882a593Smuzhiyun * @note This MRQ is disabled on production systems 514*4882a593Smuzhiyun */ 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun /** 517*4882a593Smuzhiyun * @ingroup Module 518*4882a593Smuzhiyun * @brief Request with #MRQ_MODULE_MAIL 519*4882a593Smuzhiyun */ 520*4882a593Smuzhiyun struct mrq_module_mail_request { 521*4882a593Smuzhiyun /** @brief Handle to the previously loaded module */ 522*4882a593Smuzhiyun uint32_t base; 523*4882a593Smuzhiyun /** @brief Module-specific mail payload 524*4882a593Smuzhiyun * 525*4882a593Smuzhiyun * The length of data[ ] is unknown to the BPMP core firmware 526*4882a593Smuzhiyun * but it is limited to the size of an IPC message. 527*4882a593Smuzhiyun */ 528*4882a593Smuzhiyun uint8_t data[BPMP_ABI_EMPTY_ARRAY]; 529*4882a593Smuzhiyun } BPMP_ABI_PACKED; 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun /** 532*4882a593Smuzhiyun * @ingroup Module 533*4882a593Smuzhiyun * @brief Response to #MRQ_MODULE_MAIL 534*4882a593Smuzhiyun */ 535*4882a593Smuzhiyun struct mrq_module_mail_response { 536*4882a593Smuzhiyun /** @brief Module-specific mail payload 537*4882a593Smuzhiyun * 538*4882a593Smuzhiyun * The length of data[ ] is unknown to the BPMP core firmware 539*4882a593Smuzhiyun * but it is limited to the size of an IPC message. 540*4882a593Smuzhiyun */ 541*4882a593Smuzhiyun uint8_t data[BPMP_ABI_EMPTY_ARRAY]; 542*4882a593Smuzhiyun } BPMP_ABI_PACKED; 543*4882a593Smuzhiyun /** @endcond */ 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun /** 546*4882a593Smuzhiyun * @ingroup MRQ_Codes 547*4882a593Smuzhiyun * @def MRQ_DEBUGFS 548*4882a593Smuzhiyun * @brief Interact with BPMP's debugfs file nodes 549*4882a593Smuzhiyun * 550*4882a593Smuzhiyun * @deprecated use MRQ_DEBUG instead. 551*4882a593Smuzhiyun * 552*4882a593Smuzhiyun * * Platforms: T186, T194 553*4882a593Smuzhiyun * * Initiators: Any 554*4882a593Smuzhiyun * * Targets: BPMP 555*4882a593Smuzhiyun * * Request Payload: @ref mrq_debugfs_request 556*4882a593Smuzhiyun * * Response Payload: @ref mrq_debugfs_response 557*4882a593Smuzhiyun */ 558*4882a593Smuzhiyun 559*4882a593Smuzhiyun /** 560*4882a593Smuzhiyun * @addtogroup Debugfs 561*4882a593Smuzhiyun * @{ 562*4882a593Smuzhiyun * 563*4882a593Smuzhiyun * The BPMP firmware implements a pseudo-filesystem called 564*4882a593Smuzhiyun * debugfs. Any driver within the firmware may register with debugfs 565*4882a593Smuzhiyun * to expose an arbitrary set of "files" in the filesystem. When 566*4882a593Smuzhiyun * software on the CPU writes to a debugfs file, debugfs passes the 567*4882a593Smuzhiyun * written data to a callback provided by the driver. When software on 568*4882a593Smuzhiyun * the CPU reads a debugfs file, debugfs queries the driver for the 569*4882a593Smuzhiyun * data to return to the CPU. The intention of the debugfs filesystem 570*4882a593Smuzhiyun * is to provide information useful for debugging the system at 571*4882a593Smuzhiyun * runtime. 572*4882a593Smuzhiyun * 573*4882a593Smuzhiyun * @note The files exposed via debugfs are not part of the 574*4882a593Smuzhiyun * BPMP firmware's ABI. debugfs files may be added or removed in any 575*4882a593Smuzhiyun * given version of the firmware. Typically the semantics of a debugfs 576*4882a593Smuzhiyun * file are consistent from version to version but even that is not 577*4882a593Smuzhiyun * guaranteed. 578*4882a593Smuzhiyun * 579*4882a593Smuzhiyun * @} 580*4882a593Smuzhiyun */ 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun /** @ingroup Debugfs */ 583*4882a593Smuzhiyun enum mrq_debugfs_commands { 584*4882a593Smuzhiyun /** @brief Perform read */ 585*4882a593Smuzhiyun CMD_DEBUGFS_READ = 1, 586*4882a593Smuzhiyun /** @brief Perform write */ 587*4882a593Smuzhiyun CMD_DEBUGFS_WRITE = 2, 588*4882a593Smuzhiyun /** @brief Perform dumping directory */ 589*4882a593Smuzhiyun CMD_DEBUGFS_DUMPDIR = 3, 590*4882a593Smuzhiyun /** @brief Not a command */ 591*4882a593Smuzhiyun CMD_DEBUGFS_MAX 592*4882a593Smuzhiyun }; 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun /** 595*4882a593Smuzhiyun * @ingroup Debugfs 596*4882a593Smuzhiyun * @brief Parameters for CMD_DEBUGFS_READ/WRITE command 597*4882a593Smuzhiyun */ 598*4882a593Smuzhiyun struct cmd_debugfs_fileop_request { 599*4882a593Smuzhiyun /** @brief Physical address pointing at filename */ 600*4882a593Smuzhiyun uint32_t fnameaddr; 601*4882a593Smuzhiyun /** @brief Length in bytes of filename buffer */ 602*4882a593Smuzhiyun uint32_t fnamelen; 603*4882a593Smuzhiyun /** @brief Physical address pointing to data buffer */ 604*4882a593Smuzhiyun uint32_t dataaddr; 605*4882a593Smuzhiyun /** @brief Length in bytes of data buffer */ 606*4882a593Smuzhiyun uint32_t datalen; 607*4882a593Smuzhiyun } BPMP_ABI_PACKED; 608*4882a593Smuzhiyun 609*4882a593Smuzhiyun /** 610*4882a593Smuzhiyun * @ingroup Debugfs 611*4882a593Smuzhiyun * @brief Parameters for CMD_DEBUGFS_READ/WRITE command 612*4882a593Smuzhiyun */ 613*4882a593Smuzhiyun struct cmd_debugfs_dumpdir_request { 614*4882a593Smuzhiyun /** @brief Physical address pointing to data buffer */ 615*4882a593Smuzhiyun uint32_t dataaddr; 616*4882a593Smuzhiyun /** @brief Length in bytes of data buffer */ 617*4882a593Smuzhiyun uint32_t datalen; 618*4882a593Smuzhiyun } BPMP_ABI_PACKED; 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun /** 621*4882a593Smuzhiyun * @ingroup Debugfs 622*4882a593Smuzhiyun * @brief Response data for CMD_DEBUGFS_READ/WRITE command 623*4882a593Smuzhiyun */ 624*4882a593Smuzhiyun struct cmd_debugfs_fileop_response { 625*4882a593Smuzhiyun /** @brief Always 0 */ 626*4882a593Smuzhiyun uint32_t reserved; 627*4882a593Smuzhiyun /** @brief Number of bytes read from or written to data buffer */ 628*4882a593Smuzhiyun uint32_t nbytes; 629*4882a593Smuzhiyun } BPMP_ABI_PACKED; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun /** 632*4882a593Smuzhiyun * @ingroup Debugfs 633*4882a593Smuzhiyun * @brief Response data for CMD_DEBUGFS_DUMPDIR command 634*4882a593Smuzhiyun */ 635*4882a593Smuzhiyun struct cmd_debugfs_dumpdir_response { 636*4882a593Smuzhiyun /** @brief Always 0 */ 637*4882a593Smuzhiyun uint32_t reserved; 638*4882a593Smuzhiyun /** @brief Number of bytes read from or written to data buffer */ 639*4882a593Smuzhiyun uint32_t nbytes; 640*4882a593Smuzhiyun } BPMP_ABI_PACKED; 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun /** 643*4882a593Smuzhiyun * @ingroup Debugfs 644*4882a593Smuzhiyun * @brief Request with #MRQ_DEBUGFS. 645*4882a593Smuzhiyun * 646*4882a593Smuzhiyun * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs 647*4882a593Smuzhiyun * command to execute. Legal commands are the values of @ref 648*4882a593Smuzhiyun * mrq_debugfs_commands. Each command requires a specific additional 649*4882a593Smuzhiyun * payload of data. 650*4882a593Smuzhiyun * 651*4882a593Smuzhiyun * |command |payload| 652*4882a593Smuzhiyun * |-------------------|-------| 653*4882a593Smuzhiyun * |CMD_DEBUGFS_READ |fop | 654*4882a593Smuzhiyun * |CMD_DEBUGFS_WRITE |fop | 655*4882a593Smuzhiyun * |CMD_DEBUGFS_DUMPDIR|dumpdir| 656*4882a593Smuzhiyun */ 657*4882a593Smuzhiyun struct mrq_debugfs_request { 658*4882a593Smuzhiyun /** @brief Sub-command (@ref mrq_debugfs_commands) */ 659*4882a593Smuzhiyun uint32_t cmd; 660*4882a593Smuzhiyun union { 661*4882a593Smuzhiyun struct cmd_debugfs_fileop_request fop; 662*4882a593Smuzhiyun struct cmd_debugfs_dumpdir_request dumpdir; 663*4882a593Smuzhiyun } BPMP_UNION_ANON; 664*4882a593Smuzhiyun } BPMP_ABI_PACKED; 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun /** 667*4882a593Smuzhiyun * @ingroup Debugfs 668*4882a593Smuzhiyun */ 669*4882a593Smuzhiyun struct mrq_debugfs_response { 670*4882a593Smuzhiyun /** @brief Always 0 */ 671*4882a593Smuzhiyun int32_t reserved; 672*4882a593Smuzhiyun union { 673*4882a593Smuzhiyun /** @brief Response data for CMD_DEBUGFS_READ OR 674*4882a593Smuzhiyun * CMD_DEBUGFS_WRITE command 675*4882a593Smuzhiyun */ 676*4882a593Smuzhiyun struct cmd_debugfs_fileop_response fop; 677*4882a593Smuzhiyun /** @brief Response data for CMD_DEBUGFS_DUMPDIR command */ 678*4882a593Smuzhiyun struct cmd_debugfs_dumpdir_response dumpdir; 679*4882a593Smuzhiyun } BPMP_UNION_ANON; 680*4882a593Smuzhiyun } BPMP_ABI_PACKED; 681*4882a593Smuzhiyun 682*4882a593Smuzhiyun /** 683*4882a593Smuzhiyun * @addtogroup Debugfs 684*4882a593Smuzhiyun * @{ 685*4882a593Smuzhiyun */ 686*4882a593Smuzhiyun #define DEBUGFS_S_ISDIR (1 << 9) 687*4882a593Smuzhiyun #define DEBUGFS_S_IRUSR (1 << 8) 688*4882a593Smuzhiyun #define DEBUGFS_S_IWUSR (1 << 7) 689*4882a593Smuzhiyun /** @} */ 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun /** 692*4882a593Smuzhiyun * @ingroup MRQ_Codes 693*4882a593Smuzhiyun * @def MRQ_DEBUG 694*4882a593Smuzhiyun * @brief Interact with BPMP's debugfs file nodes. Use message payload 695*4882a593Smuzhiyun * for exchanging data. This is functionally equivalent to 696*4882a593Smuzhiyun * @ref MRQ_DEBUGFS. But the way in which data is exchanged is different. 697*4882a593Smuzhiyun * When software running on CPU tries to read a debugfs file, 698*4882a593Smuzhiyun * the file path and read data will be stored in message payload. 699*4882a593Smuzhiyun * Since the message payload size is limited, a debugfs file 700*4882a593Smuzhiyun * transaction might require multiple frames of data exchanged 701*4882a593Smuzhiyun * between BPMP and CPU until the transaction completes. 702*4882a593Smuzhiyun * 703*4882a593Smuzhiyun * * Platforms: T194 704*4882a593Smuzhiyun * * Initiators: Any 705*4882a593Smuzhiyun * * Targets: BPMP 706*4882a593Smuzhiyun * * Request Payload: @ref mrq_debug_request 707*4882a593Smuzhiyun * * Response Payload: @ref mrq_debug_response 708*4882a593Smuzhiyun */ 709*4882a593Smuzhiyun 710*4882a593Smuzhiyun /** @ingroup Debugfs */ 711*4882a593Smuzhiyun enum mrq_debug_commands { 712*4882a593Smuzhiyun /** @brief Open required file for read operation */ 713*4882a593Smuzhiyun CMD_DEBUG_OPEN_RO = 0, 714*4882a593Smuzhiyun /** @brief Open required file for write operation */ 715*4882a593Smuzhiyun CMD_DEBUG_OPEN_WO = 1, 716*4882a593Smuzhiyun /** @brief Perform read */ 717*4882a593Smuzhiyun CMD_DEBUG_READ = 2, 718*4882a593Smuzhiyun /** @brief Perform write */ 719*4882a593Smuzhiyun CMD_DEBUG_WRITE = 3, 720*4882a593Smuzhiyun /** @brief Close file */ 721*4882a593Smuzhiyun CMD_DEBUG_CLOSE = 4, 722*4882a593Smuzhiyun /** @brief Not a command */ 723*4882a593Smuzhiyun CMD_DEBUG_MAX 724*4882a593Smuzhiyun }; 725*4882a593Smuzhiyun 726*4882a593Smuzhiyun /** 727*4882a593Smuzhiyun * @ingroup Debugfs 728*4882a593Smuzhiyun * @brief Maximum number of files that can be open at a given time 729*4882a593Smuzhiyun */ 730*4882a593Smuzhiyun #define DEBUG_MAX_OPEN_FILES 1 731*4882a593Smuzhiyun 732*4882a593Smuzhiyun /** 733*4882a593Smuzhiyun * @ingroup Debugfs 734*4882a593Smuzhiyun * @brief Maximum size of null-terminated file name string in bytes. 735*4882a593Smuzhiyun * Value is derived from memory available in message payload while 736*4882a593Smuzhiyun * using @ref cmd_debug_fopen_request 737*4882a593Smuzhiyun * Value 4 corresponds to size of @ref mrq_debug_commands 738*4882a593Smuzhiyun * in @ref mrq_debug_request. 739*4882a593Smuzhiyun * 120 - 4 dbg_cmd(32bit) = 116 740*4882a593Smuzhiyun */ 741*4882a593Smuzhiyun #define DEBUG_FNAME_MAX_SZ (MSG_DATA_MIN_SZ - 4) 742*4882a593Smuzhiyun 743*4882a593Smuzhiyun /** 744*4882a593Smuzhiyun * @ingroup Debugfs 745*4882a593Smuzhiyun * @brief Parameters for CMD_DEBUG_OPEN command 746*4882a593Smuzhiyun */ 747*4882a593Smuzhiyun struct cmd_debug_fopen_request { 748*4882a593Smuzhiyun /** @brief File name - Null-terminated string with maximum 749*4882a593Smuzhiyun * length @ref DEBUG_FNAME_MAX_SZ 750*4882a593Smuzhiyun */ 751*4882a593Smuzhiyun char name[DEBUG_FNAME_MAX_SZ]; 752*4882a593Smuzhiyun } BPMP_ABI_PACKED; 753*4882a593Smuzhiyun 754*4882a593Smuzhiyun /** 755*4882a593Smuzhiyun * @ingroup Debugfs 756*4882a593Smuzhiyun * @brief Response data for CMD_DEBUG_OPEN_RO/WO command 757*4882a593Smuzhiyun */ 758*4882a593Smuzhiyun struct cmd_debug_fopen_response { 759*4882a593Smuzhiyun /** @brief Identifier for file access */ 760*4882a593Smuzhiyun uint32_t fd; 761*4882a593Smuzhiyun /** @brief Data length. File data size for READ command. 762*4882a593Smuzhiyun * Maximum allowed length for WRITE command 763*4882a593Smuzhiyun */ 764*4882a593Smuzhiyun uint32_t datalen; 765*4882a593Smuzhiyun } BPMP_ABI_PACKED; 766*4882a593Smuzhiyun 767*4882a593Smuzhiyun /** 768*4882a593Smuzhiyun * @ingroup Debugfs 769*4882a593Smuzhiyun * @brief Parameters for CMD_DEBUG_READ command 770*4882a593Smuzhiyun */ 771*4882a593Smuzhiyun struct cmd_debug_fread_request { 772*4882a593Smuzhiyun /** @brief File access identifier received in response 773*4882a593Smuzhiyun * to CMD_DEBUG_OPEN_RO request 774*4882a593Smuzhiyun */ 775*4882a593Smuzhiyun uint32_t fd; 776*4882a593Smuzhiyun } BPMP_ABI_PACKED; 777*4882a593Smuzhiyun 778*4882a593Smuzhiyun /** 779*4882a593Smuzhiyun * @ingroup Debugfs 780*4882a593Smuzhiyun * @brief Maximum size of read data in bytes. 781*4882a593Smuzhiyun * Value is derived from memory available in message payload while 782*4882a593Smuzhiyun * using @ref cmd_debug_fread_response. 783*4882a593Smuzhiyun */ 784*4882a593Smuzhiyun #define DEBUG_READ_MAX_SZ (MSG_DATA_MIN_SZ - 4) 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun /** 787*4882a593Smuzhiyun * @ingroup Debugfs 788*4882a593Smuzhiyun * @brief Response data for CMD_DEBUG_READ command 789*4882a593Smuzhiyun */ 790*4882a593Smuzhiyun struct cmd_debug_fread_response { 791*4882a593Smuzhiyun /** @brief Size of data provided in this response in bytes */ 792*4882a593Smuzhiyun uint32_t readlen; 793*4882a593Smuzhiyun /** @brief File data from seek position */ 794*4882a593Smuzhiyun char data[DEBUG_READ_MAX_SZ]; 795*4882a593Smuzhiyun } BPMP_ABI_PACKED; 796*4882a593Smuzhiyun 797*4882a593Smuzhiyun /** 798*4882a593Smuzhiyun * @ingroup Debugfs 799*4882a593Smuzhiyun * @brief Maximum size of write data in bytes. 800*4882a593Smuzhiyun * Value is derived from memory available in message payload while 801*4882a593Smuzhiyun * using @ref cmd_debug_fwrite_request. 802*4882a593Smuzhiyun */ 803*4882a593Smuzhiyun #define DEBUG_WRITE_MAX_SZ (MSG_DATA_MIN_SZ - 12) 804*4882a593Smuzhiyun 805*4882a593Smuzhiyun /** 806*4882a593Smuzhiyun * @ingroup Debugfs 807*4882a593Smuzhiyun * @brief Parameters for CMD_DEBUG_WRITE command 808*4882a593Smuzhiyun */ 809*4882a593Smuzhiyun struct cmd_debug_fwrite_request { 810*4882a593Smuzhiyun /** @brief File access identifier received in response 811*4882a593Smuzhiyun * to CMD_DEBUG_OPEN_RO request 812*4882a593Smuzhiyun */ 813*4882a593Smuzhiyun uint32_t fd; 814*4882a593Smuzhiyun /** @brief Size of write data in bytes */ 815*4882a593Smuzhiyun uint32_t datalen; 816*4882a593Smuzhiyun /** @brief Data to be written */ 817*4882a593Smuzhiyun char data[DEBUG_WRITE_MAX_SZ]; 818*4882a593Smuzhiyun } BPMP_ABI_PACKED; 819*4882a593Smuzhiyun 820*4882a593Smuzhiyun /** 821*4882a593Smuzhiyun * @ingroup Debugfs 822*4882a593Smuzhiyun * @brief Parameters for CMD_DEBUG_CLOSE command 823*4882a593Smuzhiyun */ 824*4882a593Smuzhiyun struct cmd_debug_fclose_request { 825*4882a593Smuzhiyun /** @brief File access identifier received in response 826*4882a593Smuzhiyun * to CMD_DEBUG_OPEN_RO request 827*4882a593Smuzhiyun */ 828*4882a593Smuzhiyun uint32_t fd; 829*4882a593Smuzhiyun } BPMP_ABI_PACKED; 830*4882a593Smuzhiyun 831*4882a593Smuzhiyun /** 832*4882a593Smuzhiyun * @ingroup Debugfs 833*4882a593Smuzhiyun * @brief Request with #MRQ_DEBUG. 834*4882a593Smuzhiyun * 835*4882a593Smuzhiyun * The sender of an MRQ_DEBUG message uses #cmd to specify a debugfs 836*4882a593Smuzhiyun * command to execute. Legal commands are the values of @ref 837*4882a593Smuzhiyun * mrq_debug_commands. Each command requires a specific additional 838*4882a593Smuzhiyun * payload of data. 839*4882a593Smuzhiyun * 840*4882a593Smuzhiyun * |command |payload| 841*4882a593Smuzhiyun * |-------------------|-------| 842*4882a593Smuzhiyun * |CMD_DEBUG_OPEN_RO |fop | 843*4882a593Smuzhiyun * |CMD_DEBUG_OPEN_WO |fop | 844*4882a593Smuzhiyun * |CMD_DEBUG_READ |frd | 845*4882a593Smuzhiyun * |CMD_DEBUG_WRITE |fwr | 846*4882a593Smuzhiyun * |CMD_DEBUG_CLOSE |fcl | 847*4882a593Smuzhiyun */ 848*4882a593Smuzhiyun struct mrq_debug_request { 849*4882a593Smuzhiyun /** @brief Sub-command (@ref mrq_debug_commands) */ 850*4882a593Smuzhiyun uint32_t cmd; 851*4882a593Smuzhiyun union { 852*4882a593Smuzhiyun /** @brief Request payload for CMD_DEBUG_OPEN_RO/WO command */ 853*4882a593Smuzhiyun struct cmd_debug_fopen_request fop; 854*4882a593Smuzhiyun /** @brief Request payload for CMD_DEBUG_READ command */ 855*4882a593Smuzhiyun struct cmd_debug_fread_request frd; 856*4882a593Smuzhiyun /** @brief Request payload for CMD_DEBUG_WRITE command */ 857*4882a593Smuzhiyun struct cmd_debug_fwrite_request fwr; 858*4882a593Smuzhiyun /** @brief Request payload for CMD_DEBUG_CLOSE command */ 859*4882a593Smuzhiyun struct cmd_debug_fclose_request fcl; 860*4882a593Smuzhiyun } BPMP_UNION_ANON; 861*4882a593Smuzhiyun } BPMP_ABI_PACKED; 862*4882a593Smuzhiyun 863*4882a593Smuzhiyun /** 864*4882a593Smuzhiyun * @ingroup Debugfs 865*4882a593Smuzhiyun */ 866*4882a593Smuzhiyun struct mrq_debug_response { 867*4882a593Smuzhiyun union { 868*4882a593Smuzhiyun /** @brief Response data for CMD_DEBUG_OPEN_RO/WO command */ 869*4882a593Smuzhiyun struct cmd_debug_fopen_response fop; 870*4882a593Smuzhiyun /** @brief Response data for CMD_DEBUG_READ command */ 871*4882a593Smuzhiyun struct cmd_debug_fread_response frd; 872*4882a593Smuzhiyun } BPMP_UNION_ANON; 873*4882a593Smuzhiyun } BPMP_ABI_PACKED; 874*4882a593Smuzhiyun 875*4882a593Smuzhiyun /** 876*4882a593Smuzhiyun * @ingroup MRQ_Codes 877*4882a593Smuzhiyun * @def MRQ_RESET 878*4882a593Smuzhiyun * @brief Reset an IP block 879*4882a593Smuzhiyun * 880*4882a593Smuzhiyun * * Platforms: T186, T194 881*4882a593Smuzhiyun * * Initiators: Any 882*4882a593Smuzhiyun * * Targets: BPMP 883*4882a593Smuzhiyun * * Request Payload: @ref mrq_reset_request 884*4882a593Smuzhiyun * * Response Payload: @ref mrq_reset_response 885*4882a593Smuzhiyun * 886*4882a593Smuzhiyun * @addtogroup Reset 887*4882a593Smuzhiyun * @{ 888*4882a593Smuzhiyun */ 889*4882a593Smuzhiyun 890*4882a593Smuzhiyun enum mrq_reset_commands { 891*4882a593Smuzhiyun /** 892*4882a593Smuzhiyun * @brief Assert module reset 893*4882a593Smuzhiyun * 894*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful, or @n 895*4882a593Smuzhiyun * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n 896*4882a593Smuzhiyun * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n 897*4882a593Smuzhiyun * -#BPMP_ENOTSUP if target domain h/w state does not allow reset 898*4882a593Smuzhiyun */ 899*4882a593Smuzhiyun CMD_RESET_ASSERT = 1, 900*4882a593Smuzhiyun /** 901*4882a593Smuzhiyun * @brief Deassert module reset 902*4882a593Smuzhiyun * 903*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful, or @n 904*4882a593Smuzhiyun * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n 905*4882a593Smuzhiyun * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n 906*4882a593Smuzhiyun * -#BPMP_ENOTSUP if target domain h/w state does not allow reset 907*4882a593Smuzhiyun */ 908*4882a593Smuzhiyun CMD_RESET_DEASSERT = 2, 909*4882a593Smuzhiyun /** 910*4882a593Smuzhiyun * @brief Assert and deassert the module reset 911*4882a593Smuzhiyun * 912*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful, or @n 913*4882a593Smuzhiyun * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n 914*4882a593Smuzhiyun * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n 915*4882a593Smuzhiyun * -#BPMP_ENOTSUP if target domain h/w state does not allow reset 916*4882a593Smuzhiyun */ 917*4882a593Smuzhiyun CMD_RESET_MODULE = 3, 918*4882a593Smuzhiyun /** 919*4882a593Smuzhiyun * @brief Get the highest reset ID 920*4882a593Smuzhiyun * 921*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful, or @n 922*4882a593Smuzhiyun * -#BPMP_ENODEV if no reset domains are supported (number of IDs is 0) 923*4882a593Smuzhiyun */ 924*4882a593Smuzhiyun CMD_RESET_GET_MAX_ID = 4, 925*4882a593Smuzhiyun 926*4882a593Smuzhiyun /** @brief Not part of ABI and subject to change */ 927*4882a593Smuzhiyun CMD_RESET_MAX, 928*4882a593Smuzhiyun }; 929*4882a593Smuzhiyun 930*4882a593Smuzhiyun /** 931*4882a593Smuzhiyun * @brief Request with MRQ_RESET 932*4882a593Smuzhiyun * 933*4882a593Smuzhiyun * Used by the sender of an #MRQ_RESET message to request BPMP to 934*4882a593Smuzhiyun * assert or or deassert a given reset line. 935*4882a593Smuzhiyun */ 936*4882a593Smuzhiyun struct mrq_reset_request { 937*4882a593Smuzhiyun /** @brief Reset action to perform (@ref mrq_reset_commands) */ 938*4882a593Smuzhiyun uint32_t cmd; 939*4882a593Smuzhiyun /** @brief Id of the reset to affected */ 940*4882a593Smuzhiyun uint32_t reset_id; 941*4882a593Smuzhiyun } BPMP_ABI_PACKED; 942*4882a593Smuzhiyun 943*4882a593Smuzhiyun /** 944*4882a593Smuzhiyun * @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When 945*4882a593Smuzhiyun * this sub-command is not supported, firmware will return -BPMP_EBADCMD 946*4882a593Smuzhiyun * in mrq_response::err. 947*4882a593Smuzhiyun */ 948*4882a593Smuzhiyun struct cmd_reset_get_max_id_response { 949*4882a593Smuzhiyun /** @brief Max reset id */ 950*4882a593Smuzhiyun uint32_t max_id; 951*4882a593Smuzhiyun } BPMP_ABI_PACKED; 952*4882a593Smuzhiyun 953*4882a593Smuzhiyun /** 954*4882a593Smuzhiyun * @brief Response with MRQ_RESET 955*4882a593Smuzhiyun * 956*4882a593Smuzhiyun * Each sub-command supported by @ref mrq_reset_request may return 957*4882a593Smuzhiyun * sub-command-specific data. Some do and some do not as indicated 958*4882a593Smuzhiyun * in the following table 959*4882a593Smuzhiyun * 960*4882a593Smuzhiyun * | sub-command | payload | 961*4882a593Smuzhiyun * |----------------------|------------------| 962*4882a593Smuzhiyun * | CMD_RESET_ASSERT | - | 963*4882a593Smuzhiyun * | CMD_RESET_DEASSERT | - | 964*4882a593Smuzhiyun * | CMD_RESET_MODULE | - | 965*4882a593Smuzhiyun * | CMD_RESET_GET_MAX_ID | reset_get_max_id | 966*4882a593Smuzhiyun */ 967*4882a593Smuzhiyun struct mrq_reset_response { 968*4882a593Smuzhiyun union { 969*4882a593Smuzhiyun struct cmd_reset_get_max_id_response reset_get_max_id; 970*4882a593Smuzhiyun } BPMP_UNION_ANON; 971*4882a593Smuzhiyun } BPMP_ABI_PACKED; 972*4882a593Smuzhiyun 973*4882a593Smuzhiyun /** @} */ 974*4882a593Smuzhiyun 975*4882a593Smuzhiyun /** 976*4882a593Smuzhiyun * @ingroup MRQ_Codes 977*4882a593Smuzhiyun * @def MRQ_I2C 978*4882a593Smuzhiyun * @brief Issue an i2c transaction 979*4882a593Smuzhiyun * 980*4882a593Smuzhiyun * * Platforms: T186, T194 981*4882a593Smuzhiyun * * Initiators: Any 982*4882a593Smuzhiyun * * Targets: BPMP 983*4882a593Smuzhiyun * * Request Payload: @ref mrq_i2c_request 984*4882a593Smuzhiyun * * Response Payload: @ref mrq_i2c_response 985*4882a593Smuzhiyun * 986*4882a593Smuzhiyun * @addtogroup I2C 987*4882a593Smuzhiyun * @{ 988*4882a593Smuzhiyun */ 989*4882a593Smuzhiyun #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE (MSG_DATA_MIN_SZ - 12U) 990*4882a593Smuzhiyun #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE (MSG_DATA_MIN_SZ - 4U) 991*4882a593Smuzhiyun 992*4882a593Smuzhiyun #define SERIALI2C_TEN 0x0010U 993*4882a593Smuzhiyun #define SERIALI2C_RD 0x0001U 994*4882a593Smuzhiyun #define SERIALI2C_STOP 0x8000U 995*4882a593Smuzhiyun #define SERIALI2C_NOSTART 0x4000U 996*4882a593Smuzhiyun #define SERIALI2C_REV_DIR_ADDR 0x2000U 997*4882a593Smuzhiyun #define SERIALI2C_IGNORE_NAK 0x1000U 998*4882a593Smuzhiyun #define SERIALI2C_NO_RD_ACK 0x0800U 999*4882a593Smuzhiyun #define SERIALI2C_RECV_LEN 0x0400U 1000*4882a593Smuzhiyun 1001*4882a593Smuzhiyun enum { 1002*4882a593Smuzhiyun CMD_I2C_XFER = 1 1003*4882a593Smuzhiyun }; 1004*4882a593Smuzhiyun 1005*4882a593Smuzhiyun /** 1006*4882a593Smuzhiyun * @brief Serializable i2c request 1007*4882a593Smuzhiyun * 1008*4882a593Smuzhiyun * Instances of this structure are packed (little-endian) into 1009*4882a593Smuzhiyun * cmd_i2c_xfer_request::data_buf. Each instance represents a single 1010*4882a593Smuzhiyun * transaction (or a portion of a transaction with repeated starts) on 1011*4882a593Smuzhiyun * an i2c bus. 1012*4882a593Smuzhiyun * 1013*4882a593Smuzhiyun * Because these structures are packed, some instances are likely to 1014*4882a593Smuzhiyun * be misaligned. Additionally because #data is variable length, it is 1015*4882a593Smuzhiyun * not possible to iterate through a serialized list of these 1016*4882a593Smuzhiyun * structures without inspecting #len in each instance. It may be 1017*4882a593Smuzhiyun * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf 1018*4882a593Smuzhiyun * manually rather than using this structure definition. 1019*4882a593Smuzhiyun */ 1020*4882a593Smuzhiyun struct serial_i2c_request { 1021*4882a593Smuzhiyun /** @brief I2C slave address */ 1022*4882a593Smuzhiyun uint16_t addr; 1023*4882a593Smuzhiyun /** @brief Bitmask of SERIALI2C_ flags */ 1024*4882a593Smuzhiyun uint16_t flags; 1025*4882a593Smuzhiyun /** @brief Length of I2C transaction in bytes */ 1026*4882a593Smuzhiyun uint16_t len; 1027*4882a593Smuzhiyun /** @brief For write transactions only, #len bytes of data */ 1028*4882a593Smuzhiyun uint8_t data[]; 1029*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1030*4882a593Smuzhiyun 1031*4882a593Smuzhiyun /** 1032*4882a593Smuzhiyun * @brief Trigger one or more i2c transactions 1033*4882a593Smuzhiyun */ 1034*4882a593Smuzhiyun struct cmd_i2c_xfer_request { 1035*4882a593Smuzhiyun /** @brief Valid bus number from @ref bpmp_i2c_ids*/ 1036*4882a593Smuzhiyun uint32_t bus_id; 1037*4882a593Smuzhiyun 1038*4882a593Smuzhiyun /** @brief Count of valid bytes in #data_buf*/ 1039*4882a593Smuzhiyun uint32_t data_size; 1040*4882a593Smuzhiyun 1041*4882a593Smuzhiyun /** @brief Serialized packed instances of @ref serial_i2c_request*/ 1042*4882a593Smuzhiyun uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE]; 1043*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1044*4882a593Smuzhiyun 1045*4882a593Smuzhiyun /** 1046*4882a593Smuzhiyun * @brief Container for data read from the i2c bus 1047*4882a593Smuzhiyun * 1048*4882a593Smuzhiyun * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute 1049*4882a593Smuzhiyun * zero or more I2C reads. The data read from the bus is serialized 1050*4882a593Smuzhiyun * into #data_buf. 1051*4882a593Smuzhiyun */ 1052*4882a593Smuzhiyun struct cmd_i2c_xfer_response { 1053*4882a593Smuzhiyun /** @brief Count of valid bytes in #data_buf*/ 1054*4882a593Smuzhiyun uint32_t data_size; 1055*4882a593Smuzhiyun /** @brief I2c read data */ 1056*4882a593Smuzhiyun uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE]; 1057*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1058*4882a593Smuzhiyun 1059*4882a593Smuzhiyun /** 1060*4882a593Smuzhiyun * @brief Request with #MRQ_I2C 1061*4882a593Smuzhiyun */ 1062*4882a593Smuzhiyun struct mrq_i2c_request { 1063*4882a593Smuzhiyun /** @brief Always CMD_I2C_XFER (i.e. 1) */ 1064*4882a593Smuzhiyun uint32_t cmd; 1065*4882a593Smuzhiyun /** @brief Parameters of the transfer request */ 1066*4882a593Smuzhiyun struct cmd_i2c_xfer_request xfer; 1067*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1068*4882a593Smuzhiyun 1069*4882a593Smuzhiyun /** 1070*4882a593Smuzhiyun * @brief Response to #MRQ_I2C 1071*4882a593Smuzhiyun * 1072*4882a593Smuzhiyun * mrq_response:err is 1073*4882a593Smuzhiyun * 0: Success 1074*4882a593Smuzhiyun * -#BPMP_EBADCMD: if mrq_i2c_request::cmd is other than 1 1075*4882a593Smuzhiyun * -#BPMP_EINVAL: if cmd_i2c_xfer_request does not contain correctly formatted request 1076*4882a593Smuzhiyun * -#BPMP_ENODEV: if cmd_i2c_xfer_request::bus_id is not supported by BPMP 1077*4882a593Smuzhiyun * -#BPMP_EACCES: if i2c transaction is not allowed due to firewall rules 1078*4882a593Smuzhiyun * -#BPMP_ETIMEDOUT: if i2c transaction times out 1079*4882a593Smuzhiyun * -#BPMP_ENXIO: if i2c slave device does not reply with ACK to the transaction 1080*4882a593Smuzhiyun * -#BPMP_EAGAIN: if ARB_LOST condition is detected by the i2c controller 1081*4882a593Smuzhiyun * -#BPMP_EIO: any other i2c controller error code than NO_ACK or ARB_LOST 1082*4882a593Smuzhiyun */ 1083*4882a593Smuzhiyun struct mrq_i2c_response { 1084*4882a593Smuzhiyun struct cmd_i2c_xfer_response xfer; 1085*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1086*4882a593Smuzhiyun 1087*4882a593Smuzhiyun /** @} */ 1088*4882a593Smuzhiyun 1089*4882a593Smuzhiyun /** 1090*4882a593Smuzhiyun * @ingroup MRQ_Codes 1091*4882a593Smuzhiyun * @def MRQ_CLK 1092*4882a593Smuzhiyun * @brief Perform a clock operation 1093*4882a593Smuzhiyun * 1094*4882a593Smuzhiyun * * Platforms: T186, T194 1095*4882a593Smuzhiyun * * Initiators: Any 1096*4882a593Smuzhiyun * * Targets: BPMP 1097*4882a593Smuzhiyun * * Request Payload: @ref mrq_clk_request 1098*4882a593Smuzhiyun * * Response Payload: @ref mrq_clk_response 1099*4882a593Smuzhiyun * 1100*4882a593Smuzhiyun * @addtogroup Clocks 1101*4882a593Smuzhiyun * @{ 1102*4882a593Smuzhiyun */ 1103*4882a593Smuzhiyun enum { 1104*4882a593Smuzhiyun CMD_CLK_GET_RATE = 1, 1105*4882a593Smuzhiyun CMD_CLK_SET_RATE = 2, 1106*4882a593Smuzhiyun CMD_CLK_ROUND_RATE = 3, 1107*4882a593Smuzhiyun CMD_CLK_GET_PARENT = 4, 1108*4882a593Smuzhiyun CMD_CLK_SET_PARENT = 5, 1109*4882a593Smuzhiyun CMD_CLK_IS_ENABLED = 6, 1110*4882a593Smuzhiyun CMD_CLK_ENABLE = 7, 1111*4882a593Smuzhiyun CMD_CLK_DISABLE = 8, 1112*4882a593Smuzhiyun CMD_CLK_GET_ALL_INFO = 14, 1113*4882a593Smuzhiyun CMD_CLK_GET_MAX_CLK_ID = 15, 1114*4882a593Smuzhiyun CMD_CLK_GET_FMAX_AT_VMIN = 16, 1115*4882a593Smuzhiyun CMD_CLK_MAX, 1116*4882a593Smuzhiyun }; 1117*4882a593Smuzhiyun 1118*4882a593Smuzhiyun #define BPMP_CLK_HAS_MUX (1U << 0U) 1119*4882a593Smuzhiyun #define BPMP_CLK_HAS_SET_RATE (1U << 1U) 1120*4882a593Smuzhiyun #define BPMP_CLK_IS_ROOT (1U << 2U) 1121*4882a593Smuzhiyun #define BPMP_CLK_IS_VAR_ROOT (1U << 3U) 1122*4882a593Smuzhiyun 1123*4882a593Smuzhiyun #define MRQ_CLK_NAME_MAXLEN 40U 1124*4882a593Smuzhiyun #define MRQ_CLK_MAX_PARENTS 16U 1125*4882a593Smuzhiyun 1126*4882a593Smuzhiyun /** @private */ 1127*4882a593Smuzhiyun struct cmd_clk_get_rate_request { 1128*4882a593Smuzhiyun BPMP_ABI_EMPTY 1129*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1130*4882a593Smuzhiyun 1131*4882a593Smuzhiyun struct cmd_clk_get_rate_response { 1132*4882a593Smuzhiyun int64_t rate; 1133*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1134*4882a593Smuzhiyun 1135*4882a593Smuzhiyun struct cmd_clk_set_rate_request { 1136*4882a593Smuzhiyun int32_t unused; 1137*4882a593Smuzhiyun int64_t rate; 1138*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1139*4882a593Smuzhiyun 1140*4882a593Smuzhiyun struct cmd_clk_set_rate_response { 1141*4882a593Smuzhiyun int64_t rate; 1142*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1143*4882a593Smuzhiyun 1144*4882a593Smuzhiyun struct cmd_clk_round_rate_request { 1145*4882a593Smuzhiyun int32_t unused; 1146*4882a593Smuzhiyun int64_t rate; 1147*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1148*4882a593Smuzhiyun 1149*4882a593Smuzhiyun struct cmd_clk_round_rate_response { 1150*4882a593Smuzhiyun int64_t rate; 1151*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1152*4882a593Smuzhiyun 1153*4882a593Smuzhiyun /** @private */ 1154*4882a593Smuzhiyun struct cmd_clk_get_parent_request { 1155*4882a593Smuzhiyun BPMP_ABI_EMPTY 1156*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1157*4882a593Smuzhiyun 1158*4882a593Smuzhiyun struct cmd_clk_get_parent_response { 1159*4882a593Smuzhiyun uint32_t parent_id; 1160*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1161*4882a593Smuzhiyun 1162*4882a593Smuzhiyun struct cmd_clk_set_parent_request { 1163*4882a593Smuzhiyun uint32_t parent_id; 1164*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1165*4882a593Smuzhiyun 1166*4882a593Smuzhiyun struct cmd_clk_set_parent_response { 1167*4882a593Smuzhiyun uint32_t parent_id; 1168*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1169*4882a593Smuzhiyun 1170*4882a593Smuzhiyun /** @private */ 1171*4882a593Smuzhiyun struct cmd_clk_is_enabled_request { 1172*4882a593Smuzhiyun BPMP_ABI_EMPTY 1173*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1174*4882a593Smuzhiyun 1175*4882a593Smuzhiyun /** 1176*4882a593Smuzhiyun * @brief Response data to #MRQ_CLK sub-command CMD_CLK_IS_ENABLED 1177*4882a593Smuzhiyun */ 1178*4882a593Smuzhiyun struct cmd_clk_is_enabled_response { 1179*4882a593Smuzhiyun /** 1180*4882a593Smuzhiyun * @brief The state of the clock that has been succesfully 1181*4882a593Smuzhiyun * requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the 1182*4882a593Smuzhiyun * master invoking the command earlier. 1183*4882a593Smuzhiyun * 1184*4882a593Smuzhiyun * The state may not reflect the physical state of the clock 1185*4882a593Smuzhiyun * if there are some other masters requesting it to be 1186*4882a593Smuzhiyun * enabled. 1187*4882a593Smuzhiyun * 1188*4882a593Smuzhiyun * Value 0 is disabled, all other values indicate enabled. 1189*4882a593Smuzhiyun */ 1190*4882a593Smuzhiyun int32_t state; 1191*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1192*4882a593Smuzhiyun 1193*4882a593Smuzhiyun /** @private */ 1194*4882a593Smuzhiyun struct cmd_clk_enable_request { 1195*4882a593Smuzhiyun BPMP_ABI_EMPTY 1196*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1197*4882a593Smuzhiyun 1198*4882a593Smuzhiyun /** @private */ 1199*4882a593Smuzhiyun struct cmd_clk_enable_response { 1200*4882a593Smuzhiyun BPMP_ABI_EMPTY 1201*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1202*4882a593Smuzhiyun 1203*4882a593Smuzhiyun /** @private */ 1204*4882a593Smuzhiyun struct cmd_clk_disable_request { 1205*4882a593Smuzhiyun BPMP_ABI_EMPTY 1206*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1207*4882a593Smuzhiyun 1208*4882a593Smuzhiyun /** @private */ 1209*4882a593Smuzhiyun struct cmd_clk_disable_response { 1210*4882a593Smuzhiyun BPMP_ABI_EMPTY 1211*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1212*4882a593Smuzhiyun 1213*4882a593Smuzhiyun /** @private */ 1214*4882a593Smuzhiyun struct cmd_clk_get_all_info_request { 1215*4882a593Smuzhiyun BPMP_ABI_EMPTY 1216*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1217*4882a593Smuzhiyun 1218*4882a593Smuzhiyun struct cmd_clk_get_all_info_response { 1219*4882a593Smuzhiyun uint32_t flags; 1220*4882a593Smuzhiyun uint32_t parent; 1221*4882a593Smuzhiyun uint32_t parents[MRQ_CLK_MAX_PARENTS]; 1222*4882a593Smuzhiyun uint8_t num_parents; 1223*4882a593Smuzhiyun uint8_t name[MRQ_CLK_NAME_MAXLEN]; 1224*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1225*4882a593Smuzhiyun 1226*4882a593Smuzhiyun /** @private */ 1227*4882a593Smuzhiyun struct cmd_clk_get_max_clk_id_request { 1228*4882a593Smuzhiyun BPMP_ABI_EMPTY 1229*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1230*4882a593Smuzhiyun 1231*4882a593Smuzhiyun struct cmd_clk_get_max_clk_id_response { 1232*4882a593Smuzhiyun uint32_t max_id; 1233*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1234*4882a593Smuzhiyun 1235*4882a593Smuzhiyun /** @private */ 1236*4882a593Smuzhiyun struct cmd_clk_get_fmax_at_vmin_request { 1237*4882a593Smuzhiyun BPMP_ABI_EMPTY 1238*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1239*4882a593Smuzhiyun 1240*4882a593Smuzhiyun struct cmd_clk_get_fmax_at_vmin_response { 1241*4882a593Smuzhiyun int64_t rate; 1242*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1243*4882a593Smuzhiyun 1244*4882a593Smuzhiyun /** 1245*4882a593Smuzhiyun * @ingroup Clocks 1246*4882a593Smuzhiyun * @brief Request with #MRQ_CLK 1247*4882a593Smuzhiyun * 1248*4882a593Smuzhiyun * Used by the sender of an #MRQ_CLK message to control clocks. The 1249*4882a593Smuzhiyun * clk_request is split into several sub-commands. Some sub-commands 1250*4882a593Smuzhiyun * require no additional data. Others have a sub-command specific 1251*4882a593Smuzhiyun * payload 1252*4882a593Smuzhiyun * 1253*4882a593Smuzhiyun * |sub-command |payload | 1254*4882a593Smuzhiyun * |----------------------------|-----------------------| 1255*4882a593Smuzhiyun * |CMD_CLK_GET_RATE |- | 1256*4882a593Smuzhiyun * |CMD_CLK_SET_RATE |clk_set_rate | 1257*4882a593Smuzhiyun * |CMD_CLK_ROUND_RATE |clk_round_rate | 1258*4882a593Smuzhiyun * |CMD_CLK_GET_PARENT |- | 1259*4882a593Smuzhiyun * |CMD_CLK_SET_PARENT |clk_set_parent | 1260*4882a593Smuzhiyun * |CMD_CLK_IS_ENABLED |- | 1261*4882a593Smuzhiyun * |CMD_CLK_ENABLE |- | 1262*4882a593Smuzhiyun * |CMD_CLK_DISABLE |- | 1263*4882a593Smuzhiyun * |CMD_CLK_GET_ALL_INFO |- | 1264*4882a593Smuzhiyun * |CMD_CLK_GET_MAX_CLK_ID |- | 1265*4882a593Smuzhiyun * |CMD_CLK_GET_FMAX_AT_VMIN |- 1266*4882a593Smuzhiyun * | 1267*4882a593Smuzhiyun * 1268*4882a593Smuzhiyun */ 1269*4882a593Smuzhiyun 1270*4882a593Smuzhiyun struct mrq_clk_request { 1271*4882a593Smuzhiyun /** @brief Sub-command and clock id concatenated to 32-bit word. 1272*4882a593Smuzhiyun * - bits[31..24] is the sub-cmd. 1273*4882a593Smuzhiyun * - bits[23..0] is the clock id 1274*4882a593Smuzhiyun */ 1275*4882a593Smuzhiyun uint32_t cmd_and_id; 1276*4882a593Smuzhiyun 1277*4882a593Smuzhiyun union { 1278*4882a593Smuzhiyun /** @private */ 1279*4882a593Smuzhiyun struct cmd_clk_get_rate_request clk_get_rate; 1280*4882a593Smuzhiyun struct cmd_clk_set_rate_request clk_set_rate; 1281*4882a593Smuzhiyun struct cmd_clk_round_rate_request clk_round_rate; 1282*4882a593Smuzhiyun /** @private */ 1283*4882a593Smuzhiyun struct cmd_clk_get_parent_request clk_get_parent; 1284*4882a593Smuzhiyun struct cmd_clk_set_parent_request clk_set_parent; 1285*4882a593Smuzhiyun /** @private */ 1286*4882a593Smuzhiyun struct cmd_clk_enable_request clk_enable; 1287*4882a593Smuzhiyun /** @private */ 1288*4882a593Smuzhiyun struct cmd_clk_disable_request clk_disable; 1289*4882a593Smuzhiyun /** @private */ 1290*4882a593Smuzhiyun struct cmd_clk_is_enabled_request clk_is_enabled; 1291*4882a593Smuzhiyun /** @private */ 1292*4882a593Smuzhiyun struct cmd_clk_get_all_info_request clk_get_all_info; 1293*4882a593Smuzhiyun /** @private */ 1294*4882a593Smuzhiyun struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id; 1295*4882a593Smuzhiyun /** @private */ 1296*4882a593Smuzhiyun struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin; 1297*4882a593Smuzhiyun } BPMP_UNION_ANON; 1298*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1299*4882a593Smuzhiyun 1300*4882a593Smuzhiyun /** 1301*4882a593Smuzhiyun * @ingroup Clocks 1302*4882a593Smuzhiyun * @brief Response to MRQ_CLK 1303*4882a593Smuzhiyun * 1304*4882a593Smuzhiyun * Each sub-command supported by @ref mrq_clk_request may return 1305*4882a593Smuzhiyun * sub-command-specific data. Some do and some do not as indicated in 1306*4882a593Smuzhiyun * the following table 1307*4882a593Smuzhiyun * 1308*4882a593Smuzhiyun * |sub-command |payload | 1309*4882a593Smuzhiyun * |----------------------------|------------------------| 1310*4882a593Smuzhiyun * |CMD_CLK_GET_RATE |clk_get_rate | 1311*4882a593Smuzhiyun * |CMD_CLK_SET_RATE |clk_set_rate | 1312*4882a593Smuzhiyun * |CMD_CLK_ROUND_RATE |clk_round_rate | 1313*4882a593Smuzhiyun * |CMD_CLK_GET_PARENT |clk_get_parent | 1314*4882a593Smuzhiyun * |CMD_CLK_SET_PARENT |clk_set_parent | 1315*4882a593Smuzhiyun * |CMD_CLK_IS_ENABLED |clk_is_enabled | 1316*4882a593Smuzhiyun * |CMD_CLK_ENABLE |- | 1317*4882a593Smuzhiyun * |CMD_CLK_DISABLE |- | 1318*4882a593Smuzhiyun * |CMD_CLK_GET_ALL_INFO |clk_get_all_info | 1319*4882a593Smuzhiyun * |CMD_CLK_GET_MAX_CLK_ID |clk_get_max_id | 1320*4882a593Smuzhiyun * |CMD_CLK_GET_FMAX_AT_VMIN |clk_get_fmax_at_vmin | 1321*4882a593Smuzhiyun * 1322*4882a593Smuzhiyun */ 1323*4882a593Smuzhiyun 1324*4882a593Smuzhiyun struct mrq_clk_response { 1325*4882a593Smuzhiyun union { 1326*4882a593Smuzhiyun struct cmd_clk_get_rate_response clk_get_rate; 1327*4882a593Smuzhiyun struct cmd_clk_set_rate_response clk_set_rate; 1328*4882a593Smuzhiyun struct cmd_clk_round_rate_response clk_round_rate; 1329*4882a593Smuzhiyun struct cmd_clk_get_parent_response clk_get_parent; 1330*4882a593Smuzhiyun struct cmd_clk_set_parent_response clk_set_parent; 1331*4882a593Smuzhiyun /** @private */ 1332*4882a593Smuzhiyun struct cmd_clk_enable_response clk_enable; 1333*4882a593Smuzhiyun /** @private */ 1334*4882a593Smuzhiyun struct cmd_clk_disable_response clk_disable; 1335*4882a593Smuzhiyun struct cmd_clk_is_enabled_response clk_is_enabled; 1336*4882a593Smuzhiyun struct cmd_clk_get_all_info_response clk_get_all_info; 1337*4882a593Smuzhiyun struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id; 1338*4882a593Smuzhiyun struct cmd_clk_get_fmax_at_vmin_response clk_get_fmax_at_vmin; 1339*4882a593Smuzhiyun } BPMP_UNION_ANON; 1340*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1341*4882a593Smuzhiyun 1342*4882a593Smuzhiyun /** @} */ 1343*4882a593Smuzhiyun 1344*4882a593Smuzhiyun /** 1345*4882a593Smuzhiyun * @ingroup MRQ_Codes 1346*4882a593Smuzhiyun * @def MRQ_QUERY_ABI 1347*4882a593Smuzhiyun * @brief Check if an MRQ is implemented 1348*4882a593Smuzhiyun * 1349*4882a593Smuzhiyun * * Platforms: All 1350*4882a593Smuzhiyun * * Initiators: Any 1351*4882a593Smuzhiyun * * Targets: Any except DMCE 1352*4882a593Smuzhiyun * * Request Payload: @ref mrq_query_abi_request 1353*4882a593Smuzhiyun * * Response Payload: @ref mrq_query_abi_response 1354*4882a593Smuzhiyun */ 1355*4882a593Smuzhiyun 1356*4882a593Smuzhiyun /** 1357*4882a593Smuzhiyun * @ingroup ABI_info 1358*4882a593Smuzhiyun * @brief Request with MRQ_QUERY_ABI 1359*4882a593Smuzhiyun * 1360*4882a593Smuzhiyun * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported 1361*4882a593Smuzhiyun * by the recipient. 1362*4882a593Smuzhiyun */ 1363*4882a593Smuzhiyun struct mrq_query_abi_request { 1364*4882a593Smuzhiyun /** @brief MRQ code to query */ 1365*4882a593Smuzhiyun uint32_t mrq; 1366*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1367*4882a593Smuzhiyun 1368*4882a593Smuzhiyun /** 1369*4882a593Smuzhiyun * @ingroup ABI_info 1370*4882a593Smuzhiyun * @brief Response to MRQ_QUERY_ABI 1371*4882a593Smuzhiyun * 1372*4882a593Smuzhiyun * @note mrq_response::err of 0 indicates that the query was 1373*4882a593Smuzhiyun * successful, not that the MRQ itself is supported! 1374*4882a593Smuzhiyun */ 1375*4882a593Smuzhiyun struct mrq_query_abi_response { 1376*4882a593Smuzhiyun /** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */ 1377*4882a593Smuzhiyun int32_t status; 1378*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1379*4882a593Smuzhiyun 1380*4882a593Smuzhiyun /** 1381*4882a593Smuzhiyun * @ingroup MRQ_Codes 1382*4882a593Smuzhiyun * @def MRQ_PG_READ_STATE 1383*4882a593Smuzhiyun * @brief Read the power-gating state of a partition 1384*4882a593Smuzhiyun * 1385*4882a593Smuzhiyun * * Platforms: T186 1386*4882a593Smuzhiyun * @cond bpmp_t186 1387*4882a593Smuzhiyun * * Initiators: Any 1388*4882a593Smuzhiyun * * Targets: BPMP 1389*4882a593Smuzhiyun * * Request Payload: @ref mrq_pg_read_state_request 1390*4882a593Smuzhiyun * * Response Payload: @ref mrq_pg_read_state_response 1391*4882a593Smuzhiyun */ 1392*4882a593Smuzhiyun 1393*4882a593Smuzhiyun /** 1394*4882a593Smuzhiyun * @ingroup Powergating 1395*4882a593Smuzhiyun * @brief Request with #MRQ_PG_READ_STATE 1396*4882a593Smuzhiyun * 1397*4882a593Smuzhiyun * Used by MRQ_PG_READ_STATE call to read the current state of a 1398*4882a593Smuzhiyun * partition. 1399*4882a593Smuzhiyun */ 1400*4882a593Smuzhiyun struct mrq_pg_read_state_request { 1401*4882a593Smuzhiyun /** @brief ID of partition */ 1402*4882a593Smuzhiyun uint32_t partition_id; 1403*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1404*4882a593Smuzhiyun 1405*4882a593Smuzhiyun /** 1406*4882a593Smuzhiyun * @ingroup Powergating 1407*4882a593Smuzhiyun * @brief Response to MRQ_PG_READ_STATE 1408*4882a593Smuzhiyun * @todo define possible errors. 1409*4882a593Smuzhiyun */ 1410*4882a593Smuzhiyun struct mrq_pg_read_state_response { 1411*4882a593Smuzhiyun /** @brief Read as don't care */ 1412*4882a593Smuzhiyun uint32_t sram_state; 1413*4882a593Smuzhiyun /** @brief State of power partition 1414*4882a593Smuzhiyun * * 0 : off 1415*4882a593Smuzhiyun * * 1 : on 1416*4882a593Smuzhiyun */ 1417*4882a593Smuzhiyun uint32_t logic_state; 1418*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1419*4882a593Smuzhiyun /** @endcond*/ 1420*4882a593Smuzhiyun /** @} */ 1421*4882a593Smuzhiyun 1422*4882a593Smuzhiyun /** 1423*4882a593Smuzhiyun * @ingroup MRQ_Codes 1424*4882a593Smuzhiyun * @def MRQ_PG_UPDATE_STATE 1425*4882a593Smuzhiyun * @brief Modify the power-gating state of a partition. In contrast to 1426*4882a593Smuzhiyun * MRQ_PG calls, the operations that change state (on/off) of power 1427*4882a593Smuzhiyun * partition are reference counted. 1428*4882a593Smuzhiyun * 1429*4882a593Smuzhiyun * * Platforms: T186 1430*4882a593Smuzhiyun * @cond bpmp_t186 1431*4882a593Smuzhiyun * * Initiators: Any 1432*4882a593Smuzhiyun * * Targets: BPMP 1433*4882a593Smuzhiyun * * Request Payload: @ref mrq_pg_update_state_request 1434*4882a593Smuzhiyun * * Response Payload: N/A 1435*4882a593Smuzhiyun */ 1436*4882a593Smuzhiyun 1437*4882a593Smuzhiyun /** 1438*4882a593Smuzhiyun * @ingroup Powergating 1439*4882a593Smuzhiyun * @brief Request with mrq_pg_update_state_request 1440*4882a593Smuzhiyun * 1441*4882a593Smuzhiyun * Used by #MRQ_PG_UPDATE_STATE call to request BPMP to change the 1442*4882a593Smuzhiyun * state of a power partition #partition_id. 1443*4882a593Smuzhiyun */ 1444*4882a593Smuzhiyun struct mrq_pg_update_state_request { 1445*4882a593Smuzhiyun /** @brief ID of partition */ 1446*4882a593Smuzhiyun uint32_t partition_id; 1447*4882a593Smuzhiyun /** @brief Secondary control of power partition 1448*4882a593Smuzhiyun * @details Ignored by many versions of the BPMP 1449*4882a593Smuzhiyun * firmware. For maximum compatibility, set the value 1450*4882a593Smuzhiyun * according to @ref logic_state 1451*4882a593Smuzhiyun * * 0x1: power ON partition (@ref logic_state == 0x3) 1452*4882a593Smuzhiyun * * 0x3: power OFF partition (@ref logic_state == 0x1) 1453*4882a593Smuzhiyun */ 1454*4882a593Smuzhiyun uint32_t sram_state; 1455*4882a593Smuzhiyun /** @brief Controls state of power partition, legal values are 1456*4882a593Smuzhiyun * * 0x1 : power OFF partition 1457*4882a593Smuzhiyun * * 0x3 : power ON partition 1458*4882a593Smuzhiyun */ 1459*4882a593Smuzhiyun uint32_t logic_state; 1460*4882a593Smuzhiyun /** @brief Change state of clocks of the power partition, legal values 1461*4882a593Smuzhiyun * * 0x0 : do not change clock state 1462*4882a593Smuzhiyun * * 0x1 : disable partition clocks (only applicable when 1463*4882a593Smuzhiyun * @ref logic_state == 0x1) 1464*4882a593Smuzhiyun * * 0x3 : enable partition clocks (only applicable when 1465*4882a593Smuzhiyun * @ref logic_state == 0x3) 1466*4882a593Smuzhiyun */ 1467*4882a593Smuzhiyun uint32_t clock_state; 1468*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1469*4882a593Smuzhiyun /** @endcond*/ 1470*4882a593Smuzhiyun 1471*4882a593Smuzhiyun /** 1472*4882a593Smuzhiyun * @ingroup MRQ_Codes 1473*4882a593Smuzhiyun * @def MRQ_PG 1474*4882a593Smuzhiyun * @brief Control power-gating state of a partition. In contrast to 1475*4882a593Smuzhiyun * MRQ_PG_UPDATE_STATE, operations that change the power partition 1476*4882a593Smuzhiyun * state are NOT reference counted 1477*4882a593Smuzhiyun * 1478*4882a593Smuzhiyun * @note BPMP-FW forcefully turns off some partitions as part of SC7 entry 1479*4882a593Smuzhiyun * because their state cannot be adequately restored on exit. Therefore, 1480*4882a593Smuzhiyun * it is recommended to power off all domains via MRQ_PG prior to SC7 entry. 1481*4882a593Smuzhiyun * See @ref bpmp_pdomain_ids for further detail. 1482*4882a593Smuzhiyun * 1483*4882a593Smuzhiyun * * Platforms: T186, T194 1484*4882a593Smuzhiyun * * Initiators: Any 1485*4882a593Smuzhiyun * * Targets: BPMP 1486*4882a593Smuzhiyun * * Request Payload: @ref mrq_pg_request 1487*4882a593Smuzhiyun * * Response Payload: @ref mrq_pg_response 1488*4882a593Smuzhiyun * 1489*4882a593Smuzhiyun * @addtogroup Powergating 1490*4882a593Smuzhiyun * @{ 1491*4882a593Smuzhiyun */ 1492*4882a593Smuzhiyun enum mrq_pg_cmd { 1493*4882a593Smuzhiyun /** 1494*4882a593Smuzhiyun * @brief Check whether the BPMP driver supports the specified 1495*4882a593Smuzhiyun * request type 1496*4882a593Smuzhiyun * 1497*4882a593Smuzhiyun * mrq_response::err is 0 if the specified request is 1498*4882a593Smuzhiyun * supported and -#BPMP_ENODEV otherwise. 1499*4882a593Smuzhiyun */ 1500*4882a593Smuzhiyun CMD_PG_QUERY_ABI = 0, 1501*4882a593Smuzhiyun 1502*4882a593Smuzhiyun /** 1503*4882a593Smuzhiyun * @brief Set the current state of specified power domain. The 1504*4882a593Smuzhiyun * possible values for power domains are defined in enum 1505*4882a593Smuzhiyun * pg_states 1506*4882a593Smuzhiyun * 1507*4882a593Smuzhiyun * mrq_response:err is 1508*4882a593Smuzhiyun * 0: Success 1509*4882a593Smuzhiyun * -#BPMP_EINVAL: Invalid request parameters 1510*4882a593Smuzhiyun */ 1511*4882a593Smuzhiyun CMD_PG_SET_STATE = 1, 1512*4882a593Smuzhiyun 1513*4882a593Smuzhiyun /** 1514*4882a593Smuzhiyun * @brief Get the current state of specified power domain. The 1515*4882a593Smuzhiyun * possible values for power domains are defined in enum 1516*4882a593Smuzhiyun * pg_states 1517*4882a593Smuzhiyun * 1518*4882a593Smuzhiyun * mrq_response:err is 1519*4882a593Smuzhiyun * 0: Success 1520*4882a593Smuzhiyun * -#BPMP_EINVAL: Invalid request parameters 1521*4882a593Smuzhiyun */ 1522*4882a593Smuzhiyun CMD_PG_GET_STATE = 2, 1523*4882a593Smuzhiyun 1524*4882a593Smuzhiyun /** 1525*4882a593Smuzhiyun * @brief Get the name string of specified power domain id. 1526*4882a593Smuzhiyun * 1527*4882a593Smuzhiyun * mrq_response:err is 1528*4882a593Smuzhiyun * 0: Success 1529*4882a593Smuzhiyun * -#BPMP_EINVAL: Invalid request parameters 1530*4882a593Smuzhiyun */ 1531*4882a593Smuzhiyun CMD_PG_GET_NAME = 3, 1532*4882a593Smuzhiyun 1533*4882a593Smuzhiyun 1534*4882a593Smuzhiyun /** 1535*4882a593Smuzhiyun * @brief Get the highest power domain id in the system. Not 1536*4882a593Smuzhiyun * all IDs between 0 and max_id are valid IDs. 1537*4882a593Smuzhiyun * 1538*4882a593Smuzhiyun * mrq_response:err is 1539*4882a593Smuzhiyun * 0: Success 1540*4882a593Smuzhiyun * -#BPMP_EINVAL: Invalid request parameters 1541*4882a593Smuzhiyun */ 1542*4882a593Smuzhiyun CMD_PG_GET_MAX_ID = 4, 1543*4882a593Smuzhiyun }; 1544*4882a593Smuzhiyun 1545*4882a593Smuzhiyun #define MRQ_PG_NAME_MAXLEN 40 1546*4882a593Smuzhiyun 1547*4882a593Smuzhiyun enum pg_states { 1548*4882a593Smuzhiyun /** @brief Power domain is OFF */ 1549*4882a593Smuzhiyun PG_STATE_OFF = 0, 1550*4882a593Smuzhiyun /** @brief Power domain is ON */ 1551*4882a593Smuzhiyun PG_STATE_ON = 1, 1552*4882a593Smuzhiyun /** 1553*4882a593Smuzhiyun * @brief a legacy state where power domain and the clock 1554*4882a593Smuzhiyun * associated to the domain are ON. 1555*4882a593Smuzhiyun * This state is only supported in T186, and the use of it is 1556*4882a593Smuzhiyun * deprecated. 1557*4882a593Smuzhiyun */ 1558*4882a593Smuzhiyun PG_STATE_RUNNING = 2, 1559*4882a593Smuzhiyun }; 1560*4882a593Smuzhiyun 1561*4882a593Smuzhiyun struct cmd_pg_query_abi_request { 1562*4882a593Smuzhiyun /** @ref mrq_pg_cmd */ 1563*4882a593Smuzhiyun uint32_t type; 1564*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1565*4882a593Smuzhiyun 1566*4882a593Smuzhiyun struct cmd_pg_set_state_request { 1567*4882a593Smuzhiyun /** @ref pg_states */ 1568*4882a593Smuzhiyun uint32_t state; 1569*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1570*4882a593Smuzhiyun 1571*4882a593Smuzhiyun /** 1572*4882a593Smuzhiyun * @brief Response data to #MRQ_PG sub command #CMD_PG_GET_STATE 1573*4882a593Smuzhiyun */ 1574*4882a593Smuzhiyun struct cmd_pg_get_state_response { 1575*4882a593Smuzhiyun /** 1576*4882a593Smuzhiyun * @brief The state of the power partition that has been 1577*4882a593Smuzhiyun * succesfuly requested by the master earlier using #MRQ_PG 1578*4882a593Smuzhiyun * command #CMD_PG_SET_STATE. 1579*4882a593Smuzhiyun * 1580*4882a593Smuzhiyun * The state may not reflect the physical state of the power 1581*4882a593Smuzhiyun * partition if there are some other masters requesting it to 1582*4882a593Smuzhiyun * be enabled. 1583*4882a593Smuzhiyun * 1584*4882a593Smuzhiyun * See @ref pg_states for possible values 1585*4882a593Smuzhiyun */ 1586*4882a593Smuzhiyun uint32_t state; 1587*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1588*4882a593Smuzhiyun 1589*4882a593Smuzhiyun struct cmd_pg_get_name_response { 1590*4882a593Smuzhiyun uint8_t name[MRQ_PG_NAME_MAXLEN]; 1591*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1592*4882a593Smuzhiyun 1593*4882a593Smuzhiyun struct cmd_pg_get_max_id_response { 1594*4882a593Smuzhiyun uint32_t max_id; 1595*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1596*4882a593Smuzhiyun 1597*4882a593Smuzhiyun /** 1598*4882a593Smuzhiyun * @brief Request with #MRQ_PG 1599*4882a593Smuzhiyun * 1600*4882a593Smuzhiyun * Used by the sender of an #MRQ_PG message to control power 1601*4882a593Smuzhiyun * partitions. The pg_request is split into several sub-commands. Some 1602*4882a593Smuzhiyun * sub-commands require no additional data. Others have a sub-command 1603*4882a593Smuzhiyun * specific payload 1604*4882a593Smuzhiyun * 1605*4882a593Smuzhiyun * |sub-command |payload | 1606*4882a593Smuzhiyun * |----------------------------|-----------------------| 1607*4882a593Smuzhiyun * |CMD_PG_QUERY_ABI | query_abi | 1608*4882a593Smuzhiyun * |CMD_PG_SET_STATE | set_state | 1609*4882a593Smuzhiyun * |CMD_PG_GET_STATE | - | 1610*4882a593Smuzhiyun * |CMD_PG_GET_NAME | - | 1611*4882a593Smuzhiyun * |CMD_PG_GET_MAX_ID | - | 1612*4882a593Smuzhiyun * 1613*4882a593Smuzhiyun */ 1614*4882a593Smuzhiyun struct mrq_pg_request { 1615*4882a593Smuzhiyun uint32_t cmd; 1616*4882a593Smuzhiyun uint32_t id; 1617*4882a593Smuzhiyun union { 1618*4882a593Smuzhiyun struct cmd_pg_query_abi_request query_abi; 1619*4882a593Smuzhiyun struct cmd_pg_set_state_request set_state; 1620*4882a593Smuzhiyun } BPMP_UNION_ANON; 1621*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1622*4882a593Smuzhiyun 1623*4882a593Smuzhiyun /** 1624*4882a593Smuzhiyun * @brief Response to MRQ_PG 1625*4882a593Smuzhiyun * 1626*4882a593Smuzhiyun * Each sub-command supported by @ref mrq_pg_request may return 1627*4882a593Smuzhiyun * sub-command-specific data. Some do and some do not as indicated in 1628*4882a593Smuzhiyun * the following table 1629*4882a593Smuzhiyun * 1630*4882a593Smuzhiyun * |sub-command |payload | 1631*4882a593Smuzhiyun * |----------------------------|-----------------------| 1632*4882a593Smuzhiyun * |CMD_PG_QUERY_ABI | - | 1633*4882a593Smuzhiyun * |CMD_PG_SET_STATE | - | 1634*4882a593Smuzhiyun * |CMD_PG_GET_STATE | get_state | 1635*4882a593Smuzhiyun * |CMD_PG_GET_NAME | get_name | 1636*4882a593Smuzhiyun * |CMD_PG_GET_MAX_ID | get_max_id | 1637*4882a593Smuzhiyun */ 1638*4882a593Smuzhiyun struct mrq_pg_response { 1639*4882a593Smuzhiyun union { 1640*4882a593Smuzhiyun struct cmd_pg_get_state_response get_state; 1641*4882a593Smuzhiyun struct cmd_pg_get_name_response get_name; 1642*4882a593Smuzhiyun struct cmd_pg_get_max_id_response get_max_id; 1643*4882a593Smuzhiyun } BPMP_UNION_ANON; 1644*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1645*4882a593Smuzhiyun 1646*4882a593Smuzhiyun /** @} */ 1647*4882a593Smuzhiyun 1648*4882a593Smuzhiyun /** 1649*4882a593Smuzhiyun * @ingroup MRQ_Codes 1650*4882a593Smuzhiyun * @def MRQ_THERMAL 1651*4882a593Smuzhiyun * @brief Interact with BPMP thermal framework 1652*4882a593Smuzhiyun * 1653*4882a593Smuzhiyun * * Platforms: T186, T194 1654*4882a593Smuzhiyun * * Initiators: Any 1655*4882a593Smuzhiyun * * Targets: Any 1656*4882a593Smuzhiyun * * Request Payload: TODO 1657*4882a593Smuzhiyun * * Response Payload: TODO 1658*4882a593Smuzhiyun * 1659*4882a593Smuzhiyun * @addtogroup Thermal 1660*4882a593Smuzhiyun * 1661*4882a593Smuzhiyun * The BPMP firmware includes a thermal framework. Drivers within the 1662*4882a593Smuzhiyun * bpmp firmware register with the framework to provide thermal 1663*4882a593Smuzhiyun * zones. Each thermal zone corresponds to an entity whose temperature 1664*4882a593Smuzhiyun * can be measured. The framework also has a notion of trip points. A 1665*4882a593Smuzhiyun * trip point consists of a thermal zone id, a temperature, and a 1666*4882a593Smuzhiyun * callback routine. The framework invokes the callback when the zone 1667*4882a593Smuzhiyun * hits the indicated temperature. The BPMP firmware uses this thermal 1668*4882a593Smuzhiyun * framework interally to implement various temperature-dependent 1669*4882a593Smuzhiyun * functions. 1670*4882a593Smuzhiyun * 1671*4882a593Smuzhiyun * Software on the CPU can use #MRQ_THERMAL (with payload @ref 1672*4882a593Smuzhiyun * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal 1673*4882a593Smuzhiyun * framework. The CPU must It can query the number of supported zones, 1674*4882a593Smuzhiyun * query zone temperatures, and set trip points. 1675*4882a593Smuzhiyun * 1676*4882a593Smuzhiyun * When a trip point set by the CPU gets crossed, BPMP firmware issues 1677*4882a593Smuzhiyun * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a 1678*4882a593Smuzhiyun * payload of @ref mrq_thermal_bpmp_to_host_request. 1679*4882a593Smuzhiyun * @{ 1680*4882a593Smuzhiyun */ 1681*4882a593Smuzhiyun enum mrq_thermal_host_to_bpmp_cmd { 1682*4882a593Smuzhiyun /** 1683*4882a593Smuzhiyun * @brief Check whether the BPMP driver supports the specified 1684*4882a593Smuzhiyun * request type. 1685*4882a593Smuzhiyun * 1686*4882a593Smuzhiyun * Host needs to supply request parameters. 1687*4882a593Smuzhiyun * 1688*4882a593Smuzhiyun * mrq_response::err is 0 if the specified request is 1689*4882a593Smuzhiyun * supported and -#BPMP_ENODEV otherwise. 1690*4882a593Smuzhiyun */ 1691*4882a593Smuzhiyun CMD_THERMAL_QUERY_ABI = 0, 1692*4882a593Smuzhiyun 1693*4882a593Smuzhiyun /** 1694*4882a593Smuzhiyun * @brief Get the current temperature of the specified zone. 1695*4882a593Smuzhiyun * 1696*4882a593Smuzhiyun * Host needs to supply request parameters. 1697*4882a593Smuzhiyun * 1698*4882a593Smuzhiyun * mrq_response::err is 1699*4882a593Smuzhiyun * * 0: Temperature query succeeded. 1700*4882a593Smuzhiyun * * -#BPMP_EINVAL: Invalid request parameters. 1701*4882a593Smuzhiyun * * -#BPMP_ENOENT: No driver registered for thermal zone.. 1702*4882a593Smuzhiyun * * -#BPMP_EFAULT: Problem reading temperature measurement. 1703*4882a593Smuzhiyun */ 1704*4882a593Smuzhiyun CMD_THERMAL_GET_TEMP = 1, 1705*4882a593Smuzhiyun 1706*4882a593Smuzhiyun /** 1707*4882a593Smuzhiyun * @brief Enable or disable and set the lower and upper 1708*4882a593Smuzhiyun * thermal limits for a thermal trip point. Each zone has 1709*4882a593Smuzhiyun * one trip point. 1710*4882a593Smuzhiyun * 1711*4882a593Smuzhiyun * Host needs to supply request parameters. Once the 1712*4882a593Smuzhiyun * temperature hits a trip point, the BPMP will send a message 1713*4882a593Smuzhiyun * to the CPU having MRQ=MRQ_THERMAL and 1714*4882a593Smuzhiyun * type=CMD_THERMAL_HOST_TRIP_REACHED 1715*4882a593Smuzhiyun * 1716*4882a593Smuzhiyun * mrq_response::err is 1717*4882a593Smuzhiyun * * 0: Trip successfully set. 1718*4882a593Smuzhiyun * * -#BPMP_EINVAL: Invalid request parameters. 1719*4882a593Smuzhiyun * * -#BPMP_ENOENT: No driver registered for thermal zone. 1720*4882a593Smuzhiyun * * -#BPMP_EFAULT: Problem setting trip point. 1721*4882a593Smuzhiyun */ 1722*4882a593Smuzhiyun CMD_THERMAL_SET_TRIP = 2, 1723*4882a593Smuzhiyun 1724*4882a593Smuzhiyun /** 1725*4882a593Smuzhiyun * @brief Get the number of supported thermal zones. 1726*4882a593Smuzhiyun * 1727*4882a593Smuzhiyun * No request parameters required. 1728*4882a593Smuzhiyun * 1729*4882a593Smuzhiyun * mrq_response::err is always 0, indicating success. 1730*4882a593Smuzhiyun */ 1731*4882a593Smuzhiyun CMD_THERMAL_GET_NUM_ZONES = 3, 1732*4882a593Smuzhiyun 1733*4882a593Smuzhiyun /** 1734*4882a593Smuzhiyun * @brief Get the thermtrip of the specified zone. 1735*4882a593Smuzhiyun * 1736*4882a593Smuzhiyun * Host needs to supply request parameters. 1737*4882a593Smuzhiyun * 1738*4882a593Smuzhiyun * mrq_response::err is 1739*4882a593Smuzhiyun * * 0: Valid zone information returned. 1740*4882a593Smuzhiyun * * -#BPMP_EINVAL: Invalid request parameters. 1741*4882a593Smuzhiyun * * -#BPMP_ENOENT: No driver registered for thermal zone. 1742*4882a593Smuzhiyun * * -#BPMP_ERANGE if thermtrip is invalid or disabled. 1743*4882a593Smuzhiyun * * -#BPMP_EFAULT: Problem reading zone information. 1744*4882a593Smuzhiyun */ 1745*4882a593Smuzhiyun CMD_THERMAL_GET_THERMTRIP = 4, 1746*4882a593Smuzhiyun 1747*4882a593Smuzhiyun /** @brief: number of supported host-to-bpmp commands. May 1748*4882a593Smuzhiyun * increase in future 1749*4882a593Smuzhiyun */ 1750*4882a593Smuzhiyun CMD_THERMAL_HOST_TO_BPMP_NUM 1751*4882a593Smuzhiyun }; 1752*4882a593Smuzhiyun 1753*4882a593Smuzhiyun enum mrq_thermal_bpmp_to_host_cmd { 1754*4882a593Smuzhiyun /** 1755*4882a593Smuzhiyun * @brief Indication that the temperature for a zone has 1756*4882a593Smuzhiyun * exceeded the range indicated in the thermal trip point 1757*4882a593Smuzhiyun * for the zone. 1758*4882a593Smuzhiyun * 1759*4882a593Smuzhiyun * BPMP needs to supply request parameters. Host only needs to 1760*4882a593Smuzhiyun * acknowledge. 1761*4882a593Smuzhiyun */ 1762*4882a593Smuzhiyun CMD_THERMAL_HOST_TRIP_REACHED = 100, 1763*4882a593Smuzhiyun 1764*4882a593Smuzhiyun /** @brief: number of supported bpmp-to-host commands. May 1765*4882a593Smuzhiyun * increase in future 1766*4882a593Smuzhiyun */ 1767*4882a593Smuzhiyun CMD_THERMAL_BPMP_TO_HOST_NUM 1768*4882a593Smuzhiyun }; 1769*4882a593Smuzhiyun 1770*4882a593Smuzhiyun /* 1771*4882a593Smuzhiyun * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI 1772*4882a593Smuzhiyun * 1773*4882a593Smuzhiyun * zone: Request type for which to check existence. 1774*4882a593Smuzhiyun */ 1775*4882a593Smuzhiyun struct cmd_thermal_query_abi_request { 1776*4882a593Smuzhiyun uint32_t type; 1777*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1778*4882a593Smuzhiyun 1779*4882a593Smuzhiyun /* 1780*4882a593Smuzhiyun * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP 1781*4882a593Smuzhiyun * 1782*4882a593Smuzhiyun * zone: Number of thermal zone. 1783*4882a593Smuzhiyun */ 1784*4882a593Smuzhiyun struct cmd_thermal_get_temp_request { 1785*4882a593Smuzhiyun uint32_t zone; 1786*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1787*4882a593Smuzhiyun 1788*4882a593Smuzhiyun /* 1789*4882a593Smuzhiyun * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP 1790*4882a593Smuzhiyun * 1791*4882a593Smuzhiyun * error: 0 if request succeeded. 1792*4882a593Smuzhiyun * -BPMP_EINVAL if request parameters were invalid. 1793*4882a593Smuzhiyun * -BPMP_ENOENT if no driver was registered for the specified thermal zone. 1794*4882a593Smuzhiyun * -BPMP_EFAULT for other thermal zone driver errors. 1795*4882a593Smuzhiyun * temp: Current temperature in millicelsius. 1796*4882a593Smuzhiyun */ 1797*4882a593Smuzhiyun struct cmd_thermal_get_temp_response { 1798*4882a593Smuzhiyun int32_t temp; 1799*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1800*4882a593Smuzhiyun 1801*4882a593Smuzhiyun /* 1802*4882a593Smuzhiyun * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP 1803*4882a593Smuzhiyun * 1804*4882a593Smuzhiyun * zone: Number of thermal zone. 1805*4882a593Smuzhiyun * low: Temperature of lower trip point in millicelsius 1806*4882a593Smuzhiyun * high: Temperature of upper trip point in millicelsius 1807*4882a593Smuzhiyun * enabled: 1 to enable trip point, 0 to disable trip point 1808*4882a593Smuzhiyun */ 1809*4882a593Smuzhiyun struct cmd_thermal_set_trip_request { 1810*4882a593Smuzhiyun uint32_t zone; 1811*4882a593Smuzhiyun int32_t low; 1812*4882a593Smuzhiyun int32_t high; 1813*4882a593Smuzhiyun uint32_t enabled; 1814*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1815*4882a593Smuzhiyun 1816*4882a593Smuzhiyun /* 1817*4882a593Smuzhiyun * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED 1818*4882a593Smuzhiyun * 1819*4882a593Smuzhiyun * zone: Number of thermal zone where trip point was reached. 1820*4882a593Smuzhiyun */ 1821*4882a593Smuzhiyun struct cmd_thermal_host_trip_reached_request { 1822*4882a593Smuzhiyun uint32_t zone; 1823*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1824*4882a593Smuzhiyun 1825*4882a593Smuzhiyun /* 1826*4882a593Smuzhiyun * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES 1827*4882a593Smuzhiyun * 1828*4882a593Smuzhiyun * num: Number of supported thermal zones. The thermal zones are indexed 1829*4882a593Smuzhiyun * starting from zero. 1830*4882a593Smuzhiyun */ 1831*4882a593Smuzhiyun struct cmd_thermal_get_num_zones_response { 1832*4882a593Smuzhiyun uint32_t num; 1833*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1834*4882a593Smuzhiyun 1835*4882a593Smuzhiyun /* 1836*4882a593Smuzhiyun * Host->BPMP request data for request type CMD_THERMAL_GET_THERMTRIP 1837*4882a593Smuzhiyun * 1838*4882a593Smuzhiyun * zone: Number of thermal zone. 1839*4882a593Smuzhiyun */ 1840*4882a593Smuzhiyun struct cmd_thermal_get_thermtrip_request { 1841*4882a593Smuzhiyun uint32_t zone; 1842*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1843*4882a593Smuzhiyun 1844*4882a593Smuzhiyun /* 1845*4882a593Smuzhiyun * BPMP->Host reply data for request CMD_THERMAL_GET_THERMTRIP 1846*4882a593Smuzhiyun * 1847*4882a593Smuzhiyun * thermtrip: HW shutdown temperature in millicelsius. 1848*4882a593Smuzhiyun */ 1849*4882a593Smuzhiyun struct cmd_thermal_get_thermtrip_response { 1850*4882a593Smuzhiyun int32_t thermtrip; 1851*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1852*4882a593Smuzhiyun 1853*4882a593Smuzhiyun /* 1854*4882a593Smuzhiyun * Host->BPMP request data. 1855*4882a593Smuzhiyun * 1856*4882a593Smuzhiyun * Reply type is union mrq_thermal_bpmp_to_host_response. 1857*4882a593Smuzhiyun * 1858*4882a593Smuzhiyun * type: Type of request. Values listed in enum mrq_thermal_type. 1859*4882a593Smuzhiyun * data: Request type specific parameters. 1860*4882a593Smuzhiyun */ 1861*4882a593Smuzhiyun struct mrq_thermal_host_to_bpmp_request { 1862*4882a593Smuzhiyun uint32_t type; 1863*4882a593Smuzhiyun union { 1864*4882a593Smuzhiyun struct cmd_thermal_query_abi_request query_abi; 1865*4882a593Smuzhiyun struct cmd_thermal_get_temp_request get_temp; 1866*4882a593Smuzhiyun struct cmd_thermal_set_trip_request set_trip; 1867*4882a593Smuzhiyun struct cmd_thermal_get_thermtrip_request get_thermtrip; 1868*4882a593Smuzhiyun } BPMP_UNION_ANON; 1869*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1870*4882a593Smuzhiyun 1871*4882a593Smuzhiyun /* 1872*4882a593Smuzhiyun * BPMP->Host request data. 1873*4882a593Smuzhiyun * 1874*4882a593Smuzhiyun * type: Type of request. Values listed in enum mrq_thermal_type. 1875*4882a593Smuzhiyun * data: Request type specific parameters. 1876*4882a593Smuzhiyun */ 1877*4882a593Smuzhiyun struct mrq_thermal_bpmp_to_host_request { 1878*4882a593Smuzhiyun uint32_t type; 1879*4882a593Smuzhiyun union { 1880*4882a593Smuzhiyun struct cmd_thermal_host_trip_reached_request host_trip_reached; 1881*4882a593Smuzhiyun } BPMP_UNION_ANON; 1882*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1883*4882a593Smuzhiyun 1884*4882a593Smuzhiyun /* 1885*4882a593Smuzhiyun * Data in reply to a Host->BPMP request. 1886*4882a593Smuzhiyun */ 1887*4882a593Smuzhiyun union mrq_thermal_bpmp_to_host_response { 1888*4882a593Smuzhiyun struct cmd_thermal_get_temp_response get_temp; 1889*4882a593Smuzhiyun struct cmd_thermal_get_thermtrip_response get_thermtrip; 1890*4882a593Smuzhiyun struct cmd_thermal_get_num_zones_response get_num_zones; 1891*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1892*4882a593Smuzhiyun /** @} */ 1893*4882a593Smuzhiyun 1894*4882a593Smuzhiyun /** 1895*4882a593Smuzhiyun * @ingroup MRQ_Codes 1896*4882a593Smuzhiyun * @def MRQ_CPU_VHINT 1897*4882a593Smuzhiyun * @brief Query CPU voltage hint data 1898*4882a593Smuzhiyun * 1899*4882a593Smuzhiyun * * Platforms: T186 1900*4882a593Smuzhiyun * @cond bpmp_t186 1901*4882a593Smuzhiyun * * Initiators: CCPLEX 1902*4882a593Smuzhiyun * * Targets: BPMP 1903*4882a593Smuzhiyun * * Request Payload: @ref mrq_cpu_vhint_request 1904*4882a593Smuzhiyun * * Response Payload: N/A 1905*4882a593Smuzhiyun * 1906*4882a593Smuzhiyun * @addtogroup Vhint 1907*4882a593Smuzhiyun * @{ 1908*4882a593Smuzhiyun */ 1909*4882a593Smuzhiyun 1910*4882a593Smuzhiyun /** 1911*4882a593Smuzhiyun * @brief Request with #MRQ_CPU_VHINT 1912*4882a593Smuzhiyun * 1913*4882a593Smuzhiyun * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data 1914*4882a593Smuzhiyun * from BPMP to memory space pointed by #addr. CCPLEX is responsible 1915*4882a593Smuzhiyun * to allocate sizeof(cpu_vhint_data) sized block of memory and 1916*4882a593Smuzhiyun * appropriately map it for BPMP before sending the request. 1917*4882a593Smuzhiyun */ 1918*4882a593Smuzhiyun struct mrq_cpu_vhint_request { 1919*4882a593Smuzhiyun /** @brief IOVA address for the #cpu_vhint_data */ 1920*4882a593Smuzhiyun uint32_t addr; 1921*4882a593Smuzhiyun /** @brief ID of the cluster whose data is requested */ 1922*4882a593Smuzhiyun uint32_t cluster_id; 1923*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1924*4882a593Smuzhiyun 1925*4882a593Smuzhiyun /** 1926*4882a593Smuzhiyun * @brief Description of the CPU v/f relation 1927*4882a593Smuzhiyun * 1928*4882a593Smuzhiyun * Used by #MRQ_CPU_VHINT call to carry data pointed by 1929*4882a593Smuzhiyun * #mrq_cpu_vhint_request::addr 1930*4882a593Smuzhiyun */ 1931*4882a593Smuzhiyun struct cpu_vhint_data { 1932*4882a593Smuzhiyun uint32_t ref_clk_hz; /**< reference frequency in Hz */ 1933*4882a593Smuzhiyun uint16_t pdiv; /**< post divider value */ 1934*4882a593Smuzhiyun uint16_t mdiv; /**< input divider value */ 1935*4882a593Smuzhiyun uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */ 1936*4882a593Smuzhiyun /** table of ndiv values as a function of vINDEX (voltage index) */ 1937*4882a593Smuzhiyun uint16_t ndiv[80]; 1938*4882a593Smuzhiyun /** minimum allowed NDIV value */ 1939*4882a593Smuzhiyun uint16_t ndiv_min; 1940*4882a593Smuzhiyun /** minimum allowed voltage hint value (as in vINDEX) */ 1941*4882a593Smuzhiyun uint16_t vfloor; 1942*4882a593Smuzhiyun /** maximum allowed voltage hint value (as in vINDEX) */ 1943*4882a593Smuzhiyun uint16_t vceil; 1944*4882a593Smuzhiyun /** post-multiplier for vindex value */ 1945*4882a593Smuzhiyun uint16_t vindex_mult; 1946*4882a593Smuzhiyun /** post-divider for vindex value */ 1947*4882a593Smuzhiyun uint16_t vindex_div; 1948*4882a593Smuzhiyun /** reserved for future use */ 1949*4882a593Smuzhiyun uint16_t reserved[328]; 1950*4882a593Smuzhiyun } BPMP_ABI_PACKED; 1951*4882a593Smuzhiyun /** @endcond */ 1952*4882a593Smuzhiyun /** @} */ 1953*4882a593Smuzhiyun 1954*4882a593Smuzhiyun /** 1955*4882a593Smuzhiyun * @ingroup MRQ_Codes 1956*4882a593Smuzhiyun * @def MRQ_ABI_RATCHET 1957*4882a593Smuzhiyun * @brief ABI ratchet value query 1958*4882a593Smuzhiyun * 1959*4882a593Smuzhiyun * * Platforms: T186, T194 1960*4882a593Smuzhiyun * * Initiators: Any 1961*4882a593Smuzhiyun * * Targets: BPMP 1962*4882a593Smuzhiyun * * Request Payload: @ref mrq_abi_ratchet_request 1963*4882a593Smuzhiyun * * Response Payload: @ref mrq_abi_ratchet_response 1964*4882a593Smuzhiyun * @addtogroup ABI_info 1965*4882a593Smuzhiyun * @{ 1966*4882a593Smuzhiyun */ 1967*4882a593Smuzhiyun 1968*4882a593Smuzhiyun /** 1969*4882a593Smuzhiyun * @brief An ABI compatibility mechanism 1970*4882a593Smuzhiyun * 1971*4882a593Smuzhiyun * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future 1972*4882a593Smuzhiyun * revision of this header file. 1973*4882a593Smuzhiyun * 1. That future revision deprecates some MRQ 1974*4882a593Smuzhiyun * 2. That future revision introduces a breaking change to an existing 1975*4882a593Smuzhiyun * MRQ or 1976*4882a593Smuzhiyun * 3. A bug is discovered in an existing implementation of the BPMP-FW 1977*4882a593Smuzhiyun * (or possibly one of its clients) which warrants deprecating that 1978*4882a593Smuzhiyun * implementation. 1979*4882a593Smuzhiyun */ 1980*4882a593Smuzhiyun #define BPMP_ABI_RATCHET_VALUE 3 1981*4882a593Smuzhiyun 1982*4882a593Smuzhiyun /** 1983*4882a593Smuzhiyun * @brief Request with #MRQ_ABI_RATCHET. 1984*4882a593Smuzhiyun * 1985*4882a593Smuzhiyun * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header 1986*4882a593Smuzhiyun * against which the requester was compiled. 1987*4882a593Smuzhiyun * 1988*4882a593Smuzhiyun * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may 1989*4882a593Smuzhiyun * reply with mrq_response::err = -#BPMP_ERANGE to indicate that 1990*4882a593Smuzhiyun * BPMP-FW cannot interoperate correctly with the requester. Requester 1991*4882a593Smuzhiyun * should cease further communication with BPMP. 1992*4882a593Smuzhiyun * 1993*4882a593Smuzhiyun * Otherwise, err shall be 0. 1994*4882a593Smuzhiyun */ 1995*4882a593Smuzhiyun struct mrq_abi_ratchet_request { 1996*4882a593Smuzhiyun /** @brief Requester's ratchet value */ 1997*4882a593Smuzhiyun uint16_t ratchet; 1998*4882a593Smuzhiyun }; 1999*4882a593Smuzhiyun 2000*4882a593Smuzhiyun /** 2001*4882a593Smuzhiyun * @brief Response to #MRQ_ABI_RATCHET 2002*4882a593Smuzhiyun * 2003*4882a593Smuzhiyun * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header 2004*4882a593Smuzhiyun * against which BPMP firwmare was compiled. 2005*4882a593Smuzhiyun * 2006*4882a593Smuzhiyun * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE, 2007*4882a593Smuzhiyun * the requster must either interoperate with BPMP according to an ABI 2008*4882a593Smuzhiyun * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease 2009*4882a593Smuzhiyun * communication with BPMP. 2010*4882a593Smuzhiyun * 2011*4882a593Smuzhiyun * If mrq_response::err is 0 and ratchet is greater than or equal to the 2012*4882a593Smuzhiyun * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue 2013*4882a593Smuzhiyun * normal operation. 2014*4882a593Smuzhiyun */ 2015*4882a593Smuzhiyun struct mrq_abi_ratchet_response { 2016*4882a593Smuzhiyun /** @brief BPMP's ratchet value */ 2017*4882a593Smuzhiyun uint16_t ratchet; 2018*4882a593Smuzhiyun }; 2019*4882a593Smuzhiyun /** @} */ 2020*4882a593Smuzhiyun 2021*4882a593Smuzhiyun /** 2022*4882a593Smuzhiyun * @ingroup MRQ_Codes 2023*4882a593Smuzhiyun * @def MRQ_EMC_DVFS_LATENCY 2024*4882a593Smuzhiyun * @brief Query frequency dependent EMC DVFS latency 2025*4882a593Smuzhiyun * 2026*4882a593Smuzhiyun * * Platforms: T186, T194 2027*4882a593Smuzhiyun * * Initiators: CCPLEX 2028*4882a593Smuzhiyun * * Targets: BPMP 2029*4882a593Smuzhiyun * * Request Payload: N/A 2030*4882a593Smuzhiyun * * Response Payload: @ref mrq_emc_dvfs_latency_response 2031*4882a593Smuzhiyun * @addtogroup EMC 2032*4882a593Smuzhiyun * @{ 2033*4882a593Smuzhiyun */ 2034*4882a593Smuzhiyun 2035*4882a593Smuzhiyun /** 2036*4882a593Smuzhiyun * @brief Used by @ref mrq_emc_dvfs_latency_response 2037*4882a593Smuzhiyun */ 2038*4882a593Smuzhiyun struct emc_dvfs_latency { 2039*4882a593Smuzhiyun /** @brief EMC DVFS node frequency in kHz */ 2040*4882a593Smuzhiyun uint32_t freq; 2041*4882a593Smuzhiyun /** @brief EMC DVFS latency in nanoseconds */ 2042*4882a593Smuzhiyun uint32_t latency; 2043*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2044*4882a593Smuzhiyun 2045*4882a593Smuzhiyun #define EMC_DVFS_LATENCY_MAX_SIZE 14 2046*4882a593Smuzhiyun /** 2047*4882a593Smuzhiyun * @brief Response to #MRQ_EMC_DVFS_LATENCY 2048*4882a593Smuzhiyun */ 2049*4882a593Smuzhiyun struct mrq_emc_dvfs_latency_response { 2050*4882a593Smuzhiyun /** @brief The number valid entries in #pairs */ 2051*4882a593Smuzhiyun uint32_t num_pairs; 2052*4882a593Smuzhiyun /** @brief EMC DVFS node <frequency, latency> information */ 2053*4882a593Smuzhiyun struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE]; 2054*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2055*4882a593Smuzhiyun 2056*4882a593Smuzhiyun /** @} */ 2057*4882a593Smuzhiyun 2058*4882a593Smuzhiyun /** 2059*4882a593Smuzhiyun * @ingroup MRQ_Codes 2060*4882a593Smuzhiyun * @def MRQ_CPU_NDIV_LIMITS 2061*4882a593Smuzhiyun * @brief CPU freq. limits in ndiv 2062*4882a593Smuzhiyun * 2063*4882a593Smuzhiyun * * Platforms: T194 onwards 2064*4882a593Smuzhiyun * @cond bpmp_t194 2065*4882a593Smuzhiyun * * Initiators: CCPLEX 2066*4882a593Smuzhiyun * * Targets: BPMP 2067*4882a593Smuzhiyun * * Request Payload: @ref mrq_cpu_ndiv_limits_request 2068*4882a593Smuzhiyun * * Response Payload: @ref mrq_cpu_ndiv_limits_response 2069*4882a593Smuzhiyun * @addtogroup CPU 2070*4882a593Smuzhiyun * @{ 2071*4882a593Smuzhiyun */ 2072*4882a593Smuzhiyun 2073*4882a593Smuzhiyun /** 2074*4882a593Smuzhiyun * @brief Request for ndiv limits of a cluster 2075*4882a593Smuzhiyun */ 2076*4882a593Smuzhiyun struct mrq_cpu_ndiv_limits_request { 2077*4882a593Smuzhiyun /** @brief Enum cluster_id */ 2078*4882a593Smuzhiyun uint32_t cluster_id; 2079*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2080*4882a593Smuzhiyun 2081*4882a593Smuzhiyun /** 2082*4882a593Smuzhiyun * @brief Response to #MRQ_CPU_NDIV_LIMITS 2083*4882a593Smuzhiyun */ 2084*4882a593Smuzhiyun struct mrq_cpu_ndiv_limits_response { 2085*4882a593Smuzhiyun /** @brief Reference frequency in Hz */ 2086*4882a593Smuzhiyun uint32_t ref_clk_hz; 2087*4882a593Smuzhiyun /** @brief Post divider value */ 2088*4882a593Smuzhiyun uint16_t pdiv; 2089*4882a593Smuzhiyun /** @brief Input divider value */ 2090*4882a593Smuzhiyun uint16_t mdiv; 2091*4882a593Smuzhiyun /** @brief FMAX expressed with max NDIV value */ 2092*4882a593Smuzhiyun uint16_t ndiv_max; 2093*4882a593Smuzhiyun /** @brief Minimum allowed NDIV value */ 2094*4882a593Smuzhiyun uint16_t ndiv_min; 2095*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2096*4882a593Smuzhiyun 2097*4882a593Smuzhiyun /** @} */ 2098*4882a593Smuzhiyun /** @endcond */ 2099*4882a593Smuzhiyun 2100*4882a593Smuzhiyun /** 2101*4882a593Smuzhiyun * @ingroup MRQ_Codes 2102*4882a593Smuzhiyun * @def MRQ_CPU_AUTO_CC3 2103*4882a593Smuzhiyun * @brief Query CPU cluster auto-CC3 configuration 2104*4882a593Smuzhiyun * 2105*4882a593Smuzhiyun * * Platforms: T194 onwards 2106*4882a593Smuzhiyun * @cond bpmp_t194 2107*4882a593Smuzhiyun * * Initiators: CCPLEX 2108*4882a593Smuzhiyun * * Targets: BPMP 2109*4882a593Smuzhiyun * * Request Payload: @ref mrq_cpu_auto_cc3_request 2110*4882a593Smuzhiyun * * Response Payload: @ref mrq_cpu_auto_cc3_response 2111*4882a593Smuzhiyun * @addtogroup CC3 2112*4882a593Smuzhiyun * 2113*4882a593Smuzhiyun * Queries from BPMP auto-CC3 configuration (allowed/not allowed) for a 2114*4882a593Smuzhiyun * specified cluster. CCPLEX s/w uses this information to override its own 2115*4882a593Smuzhiyun * device tree auto-CC3 settings, so that BPMP device tree is a single source of 2116*4882a593Smuzhiyun * auto-CC3 platform configuration. 2117*4882a593Smuzhiyun * 2118*4882a593Smuzhiyun * @{ 2119*4882a593Smuzhiyun */ 2120*4882a593Smuzhiyun 2121*4882a593Smuzhiyun /** 2122*4882a593Smuzhiyun * @brief Request for auto-CC3 configuration of a cluster 2123*4882a593Smuzhiyun */ 2124*4882a593Smuzhiyun struct mrq_cpu_auto_cc3_request { 2125*4882a593Smuzhiyun /** @brief Enum cluster_id (logical cluster id, known to CCPLEX s/w) */ 2126*4882a593Smuzhiyun uint32_t cluster_id; 2127*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2128*4882a593Smuzhiyun 2129*4882a593Smuzhiyun /** 2130*4882a593Smuzhiyun * @brief Response to #MRQ_CPU_AUTO_CC3 2131*4882a593Smuzhiyun */ 2132*4882a593Smuzhiyun struct mrq_cpu_auto_cc3_response { 2133*4882a593Smuzhiyun /** 2134*4882a593Smuzhiyun * @brief auto-CC3 configuration 2135*4882a593Smuzhiyun * 2136*4882a593Smuzhiyun * - bits[31..10] reserved. 2137*4882a593Smuzhiyun * - bits[9..1] cc3 ndiv 2138*4882a593Smuzhiyun * - bit [0] if "1" auto-CC3 is allowed, if "0" auto-CC3 is not allowed 2139*4882a593Smuzhiyun */ 2140*4882a593Smuzhiyun uint32_t auto_cc3_config; 2141*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2142*4882a593Smuzhiyun 2143*4882a593Smuzhiyun /** @} */ 2144*4882a593Smuzhiyun /** @endcond */ 2145*4882a593Smuzhiyun 2146*4882a593Smuzhiyun /** 2147*4882a593Smuzhiyun * @ingroup MRQ_Codes 2148*4882a593Smuzhiyun * @def MRQ_TRACE_ITER 2149*4882a593Smuzhiyun * @brief Manage the trace iterator 2150*4882a593Smuzhiyun * 2151*4882a593Smuzhiyun * @deprecated 2152*4882a593Smuzhiyun * 2153*4882a593Smuzhiyun * * Platforms: All 2154*4882a593Smuzhiyun * * Initiators: CCPLEX 2155*4882a593Smuzhiyun * * Targets: BPMP 2156*4882a593Smuzhiyun * * Request Payload: N/A 2157*4882a593Smuzhiyun * * Response Payload: @ref mrq_trace_iter_request 2158*4882a593Smuzhiyun * @addtogroup Trace 2159*4882a593Smuzhiyun * @{ 2160*4882a593Smuzhiyun */ 2161*4882a593Smuzhiyun enum { 2162*4882a593Smuzhiyun /** @brief (re)start the tracing now. Ignore older events */ 2163*4882a593Smuzhiyun TRACE_ITER_INIT = 0, 2164*4882a593Smuzhiyun /** @brief Clobber all events in the trace buffer */ 2165*4882a593Smuzhiyun TRACE_ITER_CLEAN = 1 2166*4882a593Smuzhiyun }; 2167*4882a593Smuzhiyun 2168*4882a593Smuzhiyun /** 2169*4882a593Smuzhiyun * @brief Request with #MRQ_TRACE_ITER 2170*4882a593Smuzhiyun */ 2171*4882a593Smuzhiyun struct mrq_trace_iter_request { 2172*4882a593Smuzhiyun /** @brief TRACE_ITER_INIT or TRACE_ITER_CLEAN */ 2173*4882a593Smuzhiyun uint32_t cmd; 2174*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2175*4882a593Smuzhiyun 2176*4882a593Smuzhiyun /** @} */ 2177*4882a593Smuzhiyun 2178*4882a593Smuzhiyun /** 2179*4882a593Smuzhiyun * @ingroup MRQ_Codes 2180*4882a593Smuzhiyun * @def MRQ_RINGBUF_CONSOLE 2181*4882a593Smuzhiyun * @brief A ring buffer debug console for BPMP 2182*4882a593Smuzhiyun * @addtogroup RingbufConsole 2183*4882a593Smuzhiyun * 2184*4882a593Smuzhiyun * The ring buffer debug console aims to be a substitute for the UART debug 2185*4882a593Smuzhiyun * console. The debug console is implemented with two ring buffers in the 2186*4882a593Smuzhiyun * BPMP-FW, the RX (receive) and TX (transmit) buffers. Characters can be read 2187*4882a593Smuzhiyun * and written to the buffers by the host via the MRQ interface. 2188*4882a593Smuzhiyun * 2189*4882a593Smuzhiyun * @{ 2190*4882a593Smuzhiyun */ 2191*4882a593Smuzhiyun 2192*4882a593Smuzhiyun /** 2193*4882a593Smuzhiyun * @brief Maximum number of bytes transferred in a single write command to the 2194*4882a593Smuzhiyun * BPMP 2195*4882a593Smuzhiyun * 2196*4882a593Smuzhiyun * This is determined by the number of free bytes in the message struct, 2197*4882a593Smuzhiyun * rounded down to a multiple of four. 2198*4882a593Smuzhiyun */ 2199*4882a593Smuzhiyun #define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112 2200*4882a593Smuzhiyun 2201*4882a593Smuzhiyun /** 2202*4882a593Smuzhiyun * @brief Maximum number of bytes transferred in a single read command to the 2203*4882a593Smuzhiyun * BPMP 2204*4882a593Smuzhiyun * 2205*4882a593Smuzhiyun * This is determined by the number of free bytes in the message struct, 2206*4882a593Smuzhiyun * rounded down to a multiple of four. 2207*4882a593Smuzhiyun */ 2208*4882a593Smuzhiyun #define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116 2209*4882a593Smuzhiyun 2210*4882a593Smuzhiyun enum mrq_ringbuf_console_host_to_bpmp_cmd { 2211*4882a593Smuzhiyun /** 2212*4882a593Smuzhiyun * @brief Check whether the BPMP driver supports the specified request 2213*4882a593Smuzhiyun * type 2214*4882a593Smuzhiyun * 2215*4882a593Smuzhiyun * mrq_response::err is 0 if the specified request is supported and 2216*4882a593Smuzhiyun * -#BPMP_ENODEV otherwise 2217*4882a593Smuzhiyun */ 2218*4882a593Smuzhiyun CMD_RINGBUF_CONSOLE_QUERY_ABI = 0, 2219*4882a593Smuzhiyun /** 2220*4882a593Smuzhiyun * @brief Perform a read operation on the BPMP TX buffer 2221*4882a593Smuzhiyun * 2222*4882a593Smuzhiyun * mrq_response::err is 0 2223*4882a593Smuzhiyun */ 2224*4882a593Smuzhiyun CMD_RINGBUF_CONSOLE_READ = 1, 2225*4882a593Smuzhiyun /** 2226*4882a593Smuzhiyun * @brief Perform a write operation on the BPMP RX buffer 2227*4882a593Smuzhiyun * 2228*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful and 2229*4882a593Smuzhiyun * -#BPMP_ENODEV otherwise 2230*4882a593Smuzhiyun */ 2231*4882a593Smuzhiyun CMD_RINGBUF_CONSOLE_WRITE = 2, 2232*4882a593Smuzhiyun /** 2233*4882a593Smuzhiyun * @brief Get the length of the buffer and the physical addresses of 2234*4882a593Smuzhiyun * the buffer data and the head and tail counters 2235*4882a593Smuzhiyun * 2236*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful and 2237*4882a593Smuzhiyun * -#BPMP_ENODEV otherwise 2238*4882a593Smuzhiyun */ 2239*4882a593Smuzhiyun CMD_RINGBUF_CONSOLE_GET_FIFO = 3, 2240*4882a593Smuzhiyun }; 2241*4882a593Smuzhiyun 2242*4882a593Smuzhiyun /** 2243*4882a593Smuzhiyun * @ingroup RingbufConsole 2244*4882a593Smuzhiyun * @brief Host->BPMP request data for request type 2245*4882a593Smuzhiyun * #CMD_RINGBUF_CONSOLE_QUERY_ABI 2246*4882a593Smuzhiyun */ 2247*4882a593Smuzhiyun struct cmd_ringbuf_console_query_abi_req { 2248*4882a593Smuzhiyun /** @brief Command identifier to be queried */ 2249*4882a593Smuzhiyun uint32_t cmd; 2250*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2251*4882a593Smuzhiyun 2252*4882a593Smuzhiyun /** @private */ 2253*4882a593Smuzhiyun struct cmd_ringbuf_console_query_abi_resp { 2254*4882a593Smuzhiyun BPMP_ABI_EMPTY 2255*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2256*4882a593Smuzhiyun 2257*4882a593Smuzhiyun /** 2258*4882a593Smuzhiyun * @ingroup RingbufConsole 2259*4882a593Smuzhiyun * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ 2260*4882a593Smuzhiyun */ 2261*4882a593Smuzhiyun struct cmd_ringbuf_console_read_req { 2262*4882a593Smuzhiyun /** 2263*4882a593Smuzhiyun * @brief Number of bytes requested to be read from the BPMP TX buffer 2264*4882a593Smuzhiyun */ 2265*4882a593Smuzhiyun uint8_t len; 2266*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2267*4882a593Smuzhiyun 2268*4882a593Smuzhiyun /** 2269*4882a593Smuzhiyun * @ingroup RingbufConsole 2270*4882a593Smuzhiyun * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ 2271*4882a593Smuzhiyun */ 2272*4882a593Smuzhiyun struct cmd_ringbuf_console_read_resp { 2273*4882a593Smuzhiyun /** @brief The actual data read from the BPMP TX buffer */ 2274*4882a593Smuzhiyun uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_READ_LEN]; 2275*4882a593Smuzhiyun /** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */ 2276*4882a593Smuzhiyun uint8_t len; 2277*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2278*4882a593Smuzhiyun 2279*4882a593Smuzhiyun /** 2280*4882a593Smuzhiyun * @ingroup RingbufConsole 2281*4882a593Smuzhiyun * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE 2282*4882a593Smuzhiyun */ 2283*4882a593Smuzhiyun struct cmd_ringbuf_console_write_req { 2284*4882a593Smuzhiyun /** @brief The actual data to be written to the BPMP RX buffer */ 2285*4882a593Smuzhiyun uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN]; 2286*4882a593Smuzhiyun /** @brief Number of bytes in cmd_ringbuf_console_write_req::data */ 2287*4882a593Smuzhiyun uint8_t len; 2288*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2289*4882a593Smuzhiyun 2290*4882a593Smuzhiyun /** 2291*4882a593Smuzhiyun * @ingroup RingbufConsole 2292*4882a593Smuzhiyun * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE 2293*4882a593Smuzhiyun */ 2294*4882a593Smuzhiyun struct cmd_ringbuf_console_write_resp { 2295*4882a593Smuzhiyun /** @brief Number of bytes of available space in the BPMP RX buffer */ 2296*4882a593Smuzhiyun uint32_t space_avail; 2297*4882a593Smuzhiyun /** @brief Number of bytes that were written to the BPMP RX buffer */ 2298*4882a593Smuzhiyun uint8_t len; 2299*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2300*4882a593Smuzhiyun 2301*4882a593Smuzhiyun /** @private */ 2302*4882a593Smuzhiyun struct cmd_ringbuf_console_get_fifo_req { 2303*4882a593Smuzhiyun BPMP_ABI_EMPTY 2304*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2305*4882a593Smuzhiyun 2306*4882a593Smuzhiyun /** 2307*4882a593Smuzhiyun * @ingroup RingbufConsole 2308*4882a593Smuzhiyun * @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO 2309*4882a593Smuzhiyun */ 2310*4882a593Smuzhiyun struct cmd_ringbuf_console_get_fifo_resp { 2311*4882a593Smuzhiyun /** @brief Physical address of the BPMP TX buffer */ 2312*4882a593Smuzhiyun uint64_t bpmp_tx_buf_addr; 2313*4882a593Smuzhiyun /** @brief Physical address of the BPMP TX buffer head counter */ 2314*4882a593Smuzhiyun uint64_t bpmp_tx_head_addr; 2315*4882a593Smuzhiyun /** @brief Physical address of the BPMP TX buffer tail counter */ 2316*4882a593Smuzhiyun uint64_t bpmp_tx_tail_addr; 2317*4882a593Smuzhiyun /** @brief Length of the BPMP TX buffer */ 2318*4882a593Smuzhiyun uint32_t bpmp_tx_buf_len; 2319*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2320*4882a593Smuzhiyun 2321*4882a593Smuzhiyun /** 2322*4882a593Smuzhiyun * @ingroup RingbufConsole 2323*4882a593Smuzhiyun * @brief Host->BPMP request data. 2324*4882a593Smuzhiyun * 2325*4882a593Smuzhiyun * Reply type is union #mrq_ringbuf_console_bpmp_to_host_response . 2326*4882a593Smuzhiyun */ 2327*4882a593Smuzhiyun struct mrq_ringbuf_console_host_to_bpmp_request { 2328*4882a593Smuzhiyun /** 2329*4882a593Smuzhiyun * @brief Type of request. Values listed in enum 2330*4882a593Smuzhiyun * #mrq_ringbuf_console_host_to_bpmp_cmd. 2331*4882a593Smuzhiyun */ 2332*4882a593Smuzhiyun uint32_t type; 2333*4882a593Smuzhiyun /** @brief request type specific parameters. */ 2334*4882a593Smuzhiyun union { 2335*4882a593Smuzhiyun struct cmd_ringbuf_console_query_abi_req query_abi; 2336*4882a593Smuzhiyun struct cmd_ringbuf_console_read_req read; 2337*4882a593Smuzhiyun struct cmd_ringbuf_console_write_req write; 2338*4882a593Smuzhiyun struct cmd_ringbuf_console_get_fifo_req get_fifo; 2339*4882a593Smuzhiyun } BPMP_UNION_ANON; 2340*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2341*4882a593Smuzhiyun 2342*4882a593Smuzhiyun /** 2343*4882a593Smuzhiyun * @ingroup RingbufConsole 2344*4882a593Smuzhiyun * @brief Host->BPMP reply data 2345*4882a593Smuzhiyun * 2346*4882a593Smuzhiyun * In response to struct #mrq_ringbuf_console_host_to_bpmp_request. 2347*4882a593Smuzhiyun */ 2348*4882a593Smuzhiyun union mrq_ringbuf_console_bpmp_to_host_response { 2349*4882a593Smuzhiyun struct cmd_ringbuf_console_query_abi_resp query_abi; 2350*4882a593Smuzhiyun struct cmd_ringbuf_console_read_resp read; 2351*4882a593Smuzhiyun struct cmd_ringbuf_console_write_resp write; 2352*4882a593Smuzhiyun struct cmd_ringbuf_console_get_fifo_resp get_fifo; 2353*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2354*4882a593Smuzhiyun /** @} */ 2355*4882a593Smuzhiyun 2356*4882a593Smuzhiyun /** 2357*4882a593Smuzhiyun * @ingroup MRQ_Codes 2358*4882a593Smuzhiyun * @def MRQ_STRAP 2359*4882a593Smuzhiyun * @brief Set a strap value controlled by BPMP 2360*4882a593Smuzhiyun * 2361*4882a593Smuzhiyun * * Platforms: T194 onwards 2362*4882a593Smuzhiyun * @cond bpmp_t194 2363*4882a593Smuzhiyun * * Initiators: CCPLEX 2364*4882a593Smuzhiyun * * Targets: BPMP 2365*4882a593Smuzhiyun * * Request Payload: @ref mrq_strap_request 2366*4882a593Smuzhiyun * * Response Payload: N/A 2367*4882a593Smuzhiyun * @addtogroup Strap 2368*4882a593Smuzhiyun * 2369*4882a593Smuzhiyun * A strap is an input that is sampled by a hardware unit during the 2370*4882a593Smuzhiyun * unit's startup process. The sampled value of a strap affects the 2371*4882a593Smuzhiyun * behavior of the unit until the unit is restarted. Many hardware 2372*4882a593Smuzhiyun * units sample their straps at the instant that their resets are 2373*4882a593Smuzhiyun * deasserted. 2374*4882a593Smuzhiyun * 2375*4882a593Smuzhiyun * BPMP owns registers which act as straps to various units. It 2376*4882a593Smuzhiyun * exposes limited control of those straps via #MRQ_STRAP. 2377*4882a593Smuzhiyun * 2378*4882a593Smuzhiyun * @{ 2379*4882a593Smuzhiyun */ 2380*4882a593Smuzhiyun enum mrq_strap_cmd { 2381*4882a593Smuzhiyun /** @private */ 2382*4882a593Smuzhiyun STRAP_RESERVED = 0, 2383*4882a593Smuzhiyun /** @brief Set a strap value */ 2384*4882a593Smuzhiyun STRAP_SET = 1 2385*4882a593Smuzhiyun }; 2386*4882a593Smuzhiyun 2387*4882a593Smuzhiyun /** 2388*4882a593Smuzhiyun * @brief Request with #MRQ_STRAP 2389*4882a593Smuzhiyun */ 2390*4882a593Smuzhiyun struct mrq_strap_request { 2391*4882a593Smuzhiyun /** @brief @ref mrq_strap_cmd */ 2392*4882a593Smuzhiyun uint32_t cmd; 2393*4882a593Smuzhiyun /** @brief Strap ID from @ref Strap_Ids */ 2394*4882a593Smuzhiyun uint32_t id; 2395*4882a593Smuzhiyun /** @brief Desired value for strap (if cmd is #STRAP_SET) */ 2396*4882a593Smuzhiyun uint32_t value; 2397*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2398*4882a593Smuzhiyun 2399*4882a593Smuzhiyun /** 2400*4882a593Smuzhiyun * @defgroup Strap_Ids Strap Identifiers 2401*4882a593Smuzhiyun * @} 2402*4882a593Smuzhiyun */ 2403*4882a593Smuzhiyun /** @endcond */ 2404*4882a593Smuzhiyun 2405*4882a593Smuzhiyun /** 2406*4882a593Smuzhiyun * @ingroup MRQ_Codes 2407*4882a593Smuzhiyun * @def MRQ_UPHY 2408*4882a593Smuzhiyun * @brief Perform a UPHY operation 2409*4882a593Smuzhiyun * 2410*4882a593Smuzhiyun * * Platforms: T194 onwards 2411*4882a593Smuzhiyun * @cond bpmp_t194 2412*4882a593Smuzhiyun * * Initiators: CCPLEX 2413*4882a593Smuzhiyun * * Targets: BPMP 2414*4882a593Smuzhiyun * * Request Payload: @ref mrq_uphy_request 2415*4882a593Smuzhiyun * * Response Payload: @ref mrq_uphy_response 2416*4882a593Smuzhiyun * 2417*4882a593Smuzhiyun * @addtogroup UPHY 2418*4882a593Smuzhiyun * @{ 2419*4882a593Smuzhiyun */ 2420*4882a593Smuzhiyun enum { 2421*4882a593Smuzhiyun CMD_UPHY_PCIE_LANE_MARGIN_CONTROL = 1, 2422*4882a593Smuzhiyun CMD_UPHY_PCIE_LANE_MARGIN_STATUS = 2, 2423*4882a593Smuzhiyun CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT = 3, 2424*4882a593Smuzhiyun CMD_UPHY_PCIE_CONTROLLER_STATE = 4, 2425*4882a593Smuzhiyun CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF = 5, 2426*4882a593Smuzhiyun CMD_UPHY_MAX, 2427*4882a593Smuzhiyun }; 2428*4882a593Smuzhiyun 2429*4882a593Smuzhiyun struct cmd_uphy_margin_control_request { 2430*4882a593Smuzhiyun /** @brief Enable margin */ 2431*4882a593Smuzhiyun int32_t en; 2432*4882a593Smuzhiyun /** @brief Clear the number of error and sections */ 2433*4882a593Smuzhiyun int32_t clr; 2434*4882a593Smuzhiyun /** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */ 2435*4882a593Smuzhiyun uint32_t x; 2436*4882a593Smuzhiyun /** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */ 2437*4882a593Smuzhiyun uint32_t y; 2438*4882a593Smuzhiyun /** @brief Set number of bit blocks for each margin section */ 2439*4882a593Smuzhiyun uint32_t nblks; 2440*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2441*4882a593Smuzhiyun 2442*4882a593Smuzhiyun struct cmd_uphy_margin_status_response { 2443*4882a593Smuzhiyun /** @brief Number of errors observed */ 2444*4882a593Smuzhiyun uint32_t status; 2445*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2446*4882a593Smuzhiyun 2447*4882a593Smuzhiyun struct cmd_uphy_ep_controller_pll_init_request { 2448*4882a593Smuzhiyun /** @brief EP controller number, valid: 0, 4, 5 */ 2449*4882a593Smuzhiyun uint8_t ep_controller; 2450*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2451*4882a593Smuzhiyun 2452*4882a593Smuzhiyun struct cmd_uphy_pcie_controller_state_request { 2453*4882a593Smuzhiyun /** @brief PCIE controller number, valid: 0, 1, 2, 3, 4 */ 2454*4882a593Smuzhiyun uint8_t pcie_controller; 2455*4882a593Smuzhiyun uint8_t enable; 2456*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2457*4882a593Smuzhiyun 2458*4882a593Smuzhiyun struct cmd_uphy_ep_controller_pll_off_request { 2459*4882a593Smuzhiyun /** @brief EP controller number, valid: 0, 4, 5 */ 2460*4882a593Smuzhiyun uint8_t ep_controller; 2461*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2462*4882a593Smuzhiyun 2463*4882a593Smuzhiyun /** 2464*4882a593Smuzhiyun * @ingroup UPHY 2465*4882a593Smuzhiyun * @brief Request with #MRQ_UPHY 2466*4882a593Smuzhiyun * 2467*4882a593Smuzhiyun * Used by the sender of an #MRQ_UPHY message to control UPHY Lane RX margining. 2468*4882a593Smuzhiyun * The uphy_request is split into several sub-commands. Some sub-commands 2469*4882a593Smuzhiyun * require no additional data. Others have a sub-command specific payload 2470*4882a593Smuzhiyun * 2471*4882a593Smuzhiyun * |sub-command |payload | 2472*4882a593Smuzhiyun * |------------------------------------ |----------------------------------------| 2473*4882a593Smuzhiyun * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL |uphy_set_margin_control | 2474*4882a593Smuzhiyun * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS | | 2475*4882a593Smuzhiyun * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT |cmd_uphy_ep_controller_pll_init_request | 2476*4882a593Smuzhiyun * |CMD_UPHY_PCIE_CONTROLLER_STATE |cmd_uphy_pcie_controller_state_request | 2477*4882a593Smuzhiyun * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF |cmd_uphy_ep_controller_pll_off_request | 2478*4882a593Smuzhiyun * 2479*4882a593Smuzhiyun */ 2480*4882a593Smuzhiyun 2481*4882a593Smuzhiyun struct mrq_uphy_request { 2482*4882a593Smuzhiyun /** @brief Lane number. */ 2483*4882a593Smuzhiyun uint16_t lane; 2484*4882a593Smuzhiyun /** @brief Sub-command id. */ 2485*4882a593Smuzhiyun uint16_t cmd; 2486*4882a593Smuzhiyun 2487*4882a593Smuzhiyun union { 2488*4882a593Smuzhiyun struct cmd_uphy_margin_control_request uphy_set_margin_control; 2489*4882a593Smuzhiyun struct cmd_uphy_ep_controller_pll_init_request ep_ctrlr_pll_init; 2490*4882a593Smuzhiyun struct cmd_uphy_pcie_controller_state_request controller_state; 2491*4882a593Smuzhiyun struct cmd_uphy_ep_controller_pll_off_request ep_ctrlr_pll_off; 2492*4882a593Smuzhiyun } BPMP_UNION_ANON; 2493*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2494*4882a593Smuzhiyun 2495*4882a593Smuzhiyun /** 2496*4882a593Smuzhiyun * @ingroup UPHY 2497*4882a593Smuzhiyun * @brief Response to MRQ_UPHY 2498*4882a593Smuzhiyun * 2499*4882a593Smuzhiyun * Each sub-command supported by @ref mrq_uphy_request may return 2500*4882a593Smuzhiyun * sub-command-specific data. Some do and some do not as indicated in 2501*4882a593Smuzhiyun * the following table 2502*4882a593Smuzhiyun * 2503*4882a593Smuzhiyun * |sub-command |payload | 2504*4882a593Smuzhiyun * |---------------------------- |------------------------| 2505*4882a593Smuzhiyun * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | | 2506*4882a593Smuzhiyun * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS |uphy_get_margin_status | 2507*4882a593Smuzhiyun * 2508*4882a593Smuzhiyun */ 2509*4882a593Smuzhiyun 2510*4882a593Smuzhiyun struct mrq_uphy_response { 2511*4882a593Smuzhiyun union { 2512*4882a593Smuzhiyun struct cmd_uphy_margin_status_response uphy_get_margin_status; 2513*4882a593Smuzhiyun } BPMP_UNION_ANON; 2514*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2515*4882a593Smuzhiyun 2516*4882a593Smuzhiyun /** @} */ 2517*4882a593Smuzhiyun /** @endcond */ 2518*4882a593Smuzhiyun 2519*4882a593Smuzhiyun /** 2520*4882a593Smuzhiyun * @ingroup MRQ_Codes 2521*4882a593Smuzhiyun * @def MRQ_FMON 2522*4882a593Smuzhiyun * @brief Perform a frequency monitor configuration operations 2523*4882a593Smuzhiyun * 2524*4882a593Smuzhiyun * * Platforms: T194 onwards 2525*4882a593Smuzhiyun * @cond bpmp_t194 2526*4882a593Smuzhiyun * * Initiators: CCPLEX 2527*4882a593Smuzhiyun * * Targets: BPMP 2528*4882a593Smuzhiyun * * Request Payload: @ref mrq_fmon_request 2529*4882a593Smuzhiyun * * Response Payload: @ref mrq_fmon_response 2530*4882a593Smuzhiyun * 2531*4882a593Smuzhiyun * @addtogroup FMON 2532*4882a593Smuzhiyun * @{ 2533*4882a593Smuzhiyun */ 2534*4882a593Smuzhiyun enum { 2535*4882a593Smuzhiyun /** 2536*4882a593Smuzhiyun * @brief Clamp FMON configuration to specified rate. 2537*4882a593Smuzhiyun * 2538*4882a593Smuzhiyun * The monitored clock must be running for clamp to succeed. If 2539*4882a593Smuzhiyun * clamped, FMON configuration is preserved when clock rate 2540*4882a593Smuzhiyun * and/or state is changed. 2541*4882a593Smuzhiyun */ 2542*4882a593Smuzhiyun CMD_FMON_GEAR_CLAMP = 1, 2543*4882a593Smuzhiyun /** 2544*4882a593Smuzhiyun * @brief Release clamped FMON configuration. 2545*4882a593Smuzhiyun * 2546*4882a593Smuzhiyun * Allow FMON configuration to follow monitored clock rate 2547*4882a593Smuzhiyun * and/or state changes. 2548*4882a593Smuzhiyun */ 2549*4882a593Smuzhiyun CMD_FMON_GEAR_FREE = 2, 2550*4882a593Smuzhiyun /** 2551*4882a593Smuzhiyun * @brief Return rate FMON is clamped at, or 0 if FMON is not 2552*4882a593Smuzhiyun * clamped. 2553*4882a593Smuzhiyun * 2554*4882a593Smuzhiyun * Inherently racy, since clamp state can be changed 2555*4882a593Smuzhiyun * concurrently. Useful for testing. 2556*4882a593Smuzhiyun */ 2557*4882a593Smuzhiyun CMD_FMON_GEAR_GET = 3, 2558*4882a593Smuzhiyun CMD_FMON_NUM, 2559*4882a593Smuzhiyun }; 2560*4882a593Smuzhiyun 2561*4882a593Smuzhiyun struct cmd_fmon_gear_clamp_request { 2562*4882a593Smuzhiyun int32_t unused; 2563*4882a593Smuzhiyun int64_t rate; 2564*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2565*4882a593Smuzhiyun 2566*4882a593Smuzhiyun /** @private */ 2567*4882a593Smuzhiyun struct cmd_fmon_gear_clamp_response { 2568*4882a593Smuzhiyun BPMP_ABI_EMPTY 2569*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2570*4882a593Smuzhiyun 2571*4882a593Smuzhiyun /** @private */ 2572*4882a593Smuzhiyun struct cmd_fmon_gear_free_request { 2573*4882a593Smuzhiyun BPMP_ABI_EMPTY 2574*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2575*4882a593Smuzhiyun 2576*4882a593Smuzhiyun /** @private */ 2577*4882a593Smuzhiyun struct cmd_fmon_gear_free_response { 2578*4882a593Smuzhiyun BPMP_ABI_EMPTY 2579*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2580*4882a593Smuzhiyun 2581*4882a593Smuzhiyun /** @private */ 2582*4882a593Smuzhiyun struct cmd_fmon_gear_get_request { 2583*4882a593Smuzhiyun BPMP_ABI_EMPTY 2584*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2585*4882a593Smuzhiyun 2586*4882a593Smuzhiyun struct cmd_fmon_gear_get_response { 2587*4882a593Smuzhiyun int64_t rate; 2588*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2589*4882a593Smuzhiyun 2590*4882a593Smuzhiyun /** 2591*4882a593Smuzhiyun * @ingroup FMON 2592*4882a593Smuzhiyun * @brief Request with #MRQ_FMON 2593*4882a593Smuzhiyun * 2594*4882a593Smuzhiyun * Used by the sender of an #MRQ_FMON message to configure clock 2595*4882a593Smuzhiyun * frequency monitors. The FMON request is split into several 2596*4882a593Smuzhiyun * sub-commands. Some sub-commands require no additional data. 2597*4882a593Smuzhiyun * Others have a sub-command specific payload 2598*4882a593Smuzhiyun * 2599*4882a593Smuzhiyun * |sub-command |payload | 2600*4882a593Smuzhiyun * |----------------------------|-----------------------| 2601*4882a593Smuzhiyun * |CMD_FMON_GEAR_CLAMP |fmon_gear_clamp | 2602*4882a593Smuzhiyun * |CMD_FMON_GEAR_FREE |- | 2603*4882a593Smuzhiyun * |CMD_FMON_GEAR_GET |- | 2604*4882a593Smuzhiyun * 2605*4882a593Smuzhiyun */ 2606*4882a593Smuzhiyun 2607*4882a593Smuzhiyun struct mrq_fmon_request { 2608*4882a593Smuzhiyun /** @brief Sub-command and clock id concatenated to 32-bit word. 2609*4882a593Smuzhiyun * - bits[31..24] is the sub-cmd. 2610*4882a593Smuzhiyun * - bits[23..0] is monitored clock id used to select target 2611*4882a593Smuzhiyun * FMON 2612*4882a593Smuzhiyun */ 2613*4882a593Smuzhiyun uint32_t cmd_and_id; 2614*4882a593Smuzhiyun 2615*4882a593Smuzhiyun union { 2616*4882a593Smuzhiyun struct cmd_fmon_gear_clamp_request fmon_gear_clamp; 2617*4882a593Smuzhiyun /** @private */ 2618*4882a593Smuzhiyun struct cmd_fmon_gear_free_request fmon_gear_free; 2619*4882a593Smuzhiyun /** @private */ 2620*4882a593Smuzhiyun struct cmd_fmon_gear_get_request fmon_gear_get; 2621*4882a593Smuzhiyun } BPMP_UNION_ANON; 2622*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2623*4882a593Smuzhiyun 2624*4882a593Smuzhiyun /** 2625*4882a593Smuzhiyun * @ingroup FMON 2626*4882a593Smuzhiyun * @brief Response to MRQ_FMON 2627*4882a593Smuzhiyun * 2628*4882a593Smuzhiyun * Each sub-command supported by @ref mrq_fmon_request may 2629*4882a593Smuzhiyun * return sub-command-specific data as indicated below. 2630*4882a593Smuzhiyun * 2631*4882a593Smuzhiyun * |sub-command |payload | 2632*4882a593Smuzhiyun * |----------------------------|------------------------| 2633*4882a593Smuzhiyun * |CMD_FMON_GEAR_CLAMP |- | 2634*4882a593Smuzhiyun * |CMD_FMON_GEAR_FREE |- | 2635*4882a593Smuzhiyun * |CMD_FMON_GEAR_GET |fmon_gear_get | 2636*4882a593Smuzhiyun * 2637*4882a593Smuzhiyun */ 2638*4882a593Smuzhiyun 2639*4882a593Smuzhiyun struct mrq_fmon_response { 2640*4882a593Smuzhiyun union { 2641*4882a593Smuzhiyun /** @private */ 2642*4882a593Smuzhiyun struct cmd_fmon_gear_clamp_response fmon_gear_clamp; 2643*4882a593Smuzhiyun /** @private */ 2644*4882a593Smuzhiyun struct cmd_fmon_gear_free_response fmon_gear_free; 2645*4882a593Smuzhiyun struct cmd_fmon_gear_get_response fmon_gear_get; 2646*4882a593Smuzhiyun } BPMP_UNION_ANON; 2647*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2648*4882a593Smuzhiyun 2649*4882a593Smuzhiyun /** @} */ 2650*4882a593Smuzhiyun /** @endcond */ 2651*4882a593Smuzhiyun 2652*4882a593Smuzhiyun /** 2653*4882a593Smuzhiyun * @ingroup MRQ_Codes 2654*4882a593Smuzhiyun * @def MRQ_EC 2655*4882a593Smuzhiyun * @brief Provide status information on faults reported by Error 2656*4882a593Smuzhiyun * Collator (EC) to HSM. 2657*4882a593Smuzhiyun * 2658*4882a593Smuzhiyun * * Platforms: T194 onwards 2659*4882a593Smuzhiyun * @cond bpmp_t194 2660*4882a593Smuzhiyun * * Initiators: CCPLEX 2661*4882a593Smuzhiyun * * Targets: BPMP 2662*4882a593Smuzhiyun * * Request Payload: @ref mrq_ec_request 2663*4882a593Smuzhiyun * * Response Payload: @ref mrq_ec_response 2664*4882a593Smuzhiyun * 2665*4882a593Smuzhiyun * @note This MRQ ABI is under construction, and subject to change 2666*4882a593Smuzhiyun * 2667*4882a593Smuzhiyun * @addtogroup EC 2668*4882a593Smuzhiyun * @{ 2669*4882a593Smuzhiyun */ 2670*4882a593Smuzhiyun enum { 2671*4882a593Smuzhiyun /** 2672*4882a593Smuzhiyun * @cond DEPRECATED 2673*4882a593Smuzhiyun * @brief Retrieve specified EC status. 2674*4882a593Smuzhiyun * 2675*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful, or @n 2676*4882a593Smuzhiyun * -#BPMP_ENODEV if target EC is not owned by BPMP @n 2677*4882a593Smuzhiyun * -#BPMP_EACCES if target EC power domain is turned off @n 2678*4882a593Smuzhiyun * -#BPMP_EBADCMD if subcommand is not supported 2679*4882a593Smuzhiyun * @endcond 2680*4882a593Smuzhiyun */ 2681*4882a593Smuzhiyun CMD_EC_STATUS_GET = 1, /* deprecated */ 2682*4882a593Smuzhiyun 2683*4882a593Smuzhiyun /** 2684*4882a593Smuzhiyun * @brief Retrieve specified EC extended status (includes error 2685*4882a593Smuzhiyun * counter and user values). 2686*4882a593Smuzhiyun * 2687*4882a593Smuzhiyun * mrq_response::err is 0 if the operation was successful, or @n 2688*4882a593Smuzhiyun * -#BPMP_ENODEV if target EC is not owned by BPMP @n 2689*4882a593Smuzhiyun * -#BPMP_EACCES if target EC power domain is turned off @n 2690*4882a593Smuzhiyun * -#BPMP_EBADCMD if subcommand is not supported 2691*4882a593Smuzhiyun */ 2692*4882a593Smuzhiyun CMD_EC_STATUS_EX_GET = 2, 2693*4882a593Smuzhiyun CMD_EC_NUM, 2694*4882a593Smuzhiyun }; 2695*4882a593Smuzhiyun 2696*4882a593Smuzhiyun /** @brief BPMP ECs error types */ 2697*4882a593Smuzhiyun enum bpmp_ec_err_type { 2698*4882a593Smuzhiyun /** @brief Parity error on internal data path 2699*4882a593Smuzhiyun * 2700*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2701*4882a593Smuzhiyun */ 2702*4882a593Smuzhiyun EC_ERR_TYPE_PARITY_INTERNAL = 1, 2703*4882a593Smuzhiyun 2704*4882a593Smuzhiyun /** @brief ECC SEC error on internal data path 2705*4882a593Smuzhiyun * 2706*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2707*4882a593Smuzhiyun */ 2708*4882a593Smuzhiyun EC_ERR_TYPE_ECC_SEC_INTERNAL = 2, 2709*4882a593Smuzhiyun 2710*4882a593Smuzhiyun /** @brief ECC DED error on internal data path 2711*4882a593Smuzhiyun * 2712*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2713*4882a593Smuzhiyun */ 2714*4882a593Smuzhiyun EC_ERR_TYPE_ECC_DED_INTERNAL = 3, 2715*4882a593Smuzhiyun 2716*4882a593Smuzhiyun /** @brief Comparator error 2717*4882a593Smuzhiyun * 2718*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2719*4882a593Smuzhiyun */ 2720*4882a593Smuzhiyun EC_ERR_TYPE_COMPARATOR = 4, 2721*4882a593Smuzhiyun 2722*4882a593Smuzhiyun /** @brief Register parity error 2723*4882a593Smuzhiyun * 2724*4882a593Smuzhiyun * Error descriptor @ref ec_err_reg_parity_desc. 2725*4882a593Smuzhiyun */ 2726*4882a593Smuzhiyun EC_ERR_TYPE_REGISTER_PARITY = 5, 2727*4882a593Smuzhiyun 2728*4882a593Smuzhiyun /** @brief Parity error from on-chip SRAM/FIFO 2729*4882a593Smuzhiyun * 2730*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2731*4882a593Smuzhiyun */ 2732*4882a593Smuzhiyun EC_ERR_TYPE_PARITY_SRAM = 6, 2733*4882a593Smuzhiyun 2734*4882a593Smuzhiyun /** @brief Clock Monitor error 2735*4882a593Smuzhiyun * 2736*4882a593Smuzhiyun * Error descriptor @ref ec_err_fmon_desc. 2737*4882a593Smuzhiyun */ 2738*4882a593Smuzhiyun EC_ERR_TYPE_CLOCK_MONITOR = 9, 2739*4882a593Smuzhiyun 2740*4882a593Smuzhiyun /** @brief Voltage Monitor error 2741*4882a593Smuzhiyun * 2742*4882a593Smuzhiyun * Error descriptor @ref ec_err_vmon_desc. 2743*4882a593Smuzhiyun */ 2744*4882a593Smuzhiyun EC_ERR_TYPE_VOLTAGE_MONITOR = 10, 2745*4882a593Smuzhiyun 2746*4882a593Smuzhiyun /** @brief SW Correctable error 2747*4882a593Smuzhiyun * 2748*4882a593Smuzhiyun * Error descriptor @ref ec_err_sw_error_desc. 2749*4882a593Smuzhiyun */ 2750*4882a593Smuzhiyun EC_ERR_TYPE_SW_CORRECTABLE = 16, 2751*4882a593Smuzhiyun 2752*4882a593Smuzhiyun /** @brief SW Uncorrectable error 2753*4882a593Smuzhiyun * 2754*4882a593Smuzhiyun * Error descriptor @ref ec_err_sw_error_desc. 2755*4882a593Smuzhiyun */ 2756*4882a593Smuzhiyun EC_ERR_TYPE_SW_UNCORRECTABLE = 17, 2757*4882a593Smuzhiyun 2758*4882a593Smuzhiyun /** @brief Other HW Correctable error 2759*4882a593Smuzhiyun * 2760*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2761*4882a593Smuzhiyun */ 2762*4882a593Smuzhiyun EC_ERR_TYPE_OTHER_HW_CORRECTABLE = 32, 2763*4882a593Smuzhiyun 2764*4882a593Smuzhiyun /** @brief Other HW Uncorrectable error 2765*4882a593Smuzhiyun * 2766*4882a593Smuzhiyun * Error descriptor @ref ec_err_simple_desc. 2767*4882a593Smuzhiyun */ 2768*4882a593Smuzhiyun EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE = 33, 2769*4882a593Smuzhiyun }; 2770*4882a593Smuzhiyun 2771*4882a593Smuzhiyun /** @brief Group of registers with parity error. */ 2772*4882a593Smuzhiyun enum ec_registers_group { 2773*4882a593Smuzhiyun /** @brief Functional registers group */ 2774*4882a593Smuzhiyun EC_ERR_GROUP_FUNC_REG = 0U, 2775*4882a593Smuzhiyun /** @brief SCR registers group */ 2776*4882a593Smuzhiyun EC_ERR_GROUP_SCR_REG = 1U, 2777*4882a593Smuzhiyun }; 2778*4882a593Smuzhiyun 2779*4882a593Smuzhiyun /** 2780*4882a593Smuzhiyun * @defgroup bpmp_ec_status_flags EC Status Flags 2781*4882a593Smuzhiyun * @addtogroup bpmp_ec_status_flags 2782*4882a593Smuzhiyun * @{ 2783*4882a593Smuzhiyun */ 2784*4882a593Smuzhiyun /** @brief No EC error found flag */ 2785*4882a593Smuzhiyun #define EC_STATUS_FLAG_NO_ERROR 0x0001U 2786*4882a593Smuzhiyun /** @brief Last EC error found flag */ 2787*4882a593Smuzhiyun #define EC_STATUS_FLAG_LAST_ERROR 0x0002U 2788*4882a593Smuzhiyun /** @brief EC latent error flag */ 2789*4882a593Smuzhiyun #define EC_STATUS_FLAG_LATENT_ERROR 0x0004U 2790*4882a593Smuzhiyun /** @} */ 2791*4882a593Smuzhiyun 2792*4882a593Smuzhiyun /** 2793*4882a593Smuzhiyun * @defgroup bpmp_ec_desc_flags EC Descriptor Flags 2794*4882a593Smuzhiyun * @addtogroup bpmp_ec_desc_flags 2795*4882a593Smuzhiyun * @{ 2796*4882a593Smuzhiyun */ 2797*4882a593Smuzhiyun /** @brief EC descriptor error resolved flag */ 2798*4882a593Smuzhiyun #define EC_DESC_FLAG_RESOLVED 0x0001U 2799*4882a593Smuzhiyun /** @brief EC descriptor failed to retrieve id flag */ 2800*4882a593Smuzhiyun #define EC_DESC_FLAG_NO_ID 0x0002U 2801*4882a593Smuzhiyun /** @} */ 2802*4882a593Smuzhiyun 2803*4882a593Smuzhiyun /** 2804*4882a593Smuzhiyun * |error type | fmon_clk_id values | 2805*4882a593Smuzhiyun * |---------------------------------|---------------------------| 2806*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_CLOCK_MONITOR |@ref bpmp_clock_ids | 2807*4882a593Smuzhiyun */ 2808*4882a593Smuzhiyun struct ec_err_fmon_desc { 2809*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 2810*4882a593Smuzhiyun uint16_t desc_flags; 2811*4882a593Smuzhiyun /** @brief FMON monitored clock id */ 2812*4882a593Smuzhiyun uint16_t fmon_clk_id; 2813*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_fmon_faults_flags */ 2814*4882a593Smuzhiyun uint32_t fmon_faults; 2815*4882a593Smuzhiyun /** @brief FMON faults access error */ 2816*4882a593Smuzhiyun int32_t fmon_access_error; 2817*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2818*4882a593Smuzhiyun 2819*4882a593Smuzhiyun /** 2820*4882a593Smuzhiyun * |error type | vmon_adc_id values | 2821*4882a593Smuzhiyun * |---------------------------------|---------------------------| 2822*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids | 2823*4882a593Smuzhiyun */ 2824*4882a593Smuzhiyun struct ec_err_vmon_desc { 2825*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 2826*4882a593Smuzhiyun uint16_t desc_flags; 2827*4882a593Smuzhiyun /** @brief VMON rail adc id */ 2828*4882a593Smuzhiyun uint16_t vmon_adc_id; 2829*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_vmon_faults_flags */ 2830*4882a593Smuzhiyun uint32_t vmon_faults; 2831*4882a593Smuzhiyun /** @brief VMON faults access error */ 2832*4882a593Smuzhiyun int32_t vmon_access_error; 2833*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2834*4882a593Smuzhiyun 2835*4882a593Smuzhiyun /** 2836*4882a593Smuzhiyun * |error type | reg_id values | 2837*4882a593Smuzhiyun * |---------------------------------|---------------------------| 2838*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_REGISTER_PARITY |@ref bpmp_ec_registers_ids | 2839*4882a593Smuzhiyun */ 2840*4882a593Smuzhiyun struct ec_err_reg_parity_desc { 2841*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 2842*4882a593Smuzhiyun uint16_t desc_flags; 2843*4882a593Smuzhiyun /** @brief Register id */ 2844*4882a593Smuzhiyun uint16_t reg_id; 2845*4882a593Smuzhiyun /** @brief Register group @ref ec_registers_group */ 2846*4882a593Smuzhiyun uint16_t reg_group; 2847*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2848*4882a593Smuzhiyun 2849*4882a593Smuzhiyun /** 2850*4882a593Smuzhiyun * |error type | err_source_id values | 2851*4882a593Smuzhiyun * |--------------------------------- |--------------------------| 2852*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_SW_CORRECTABLE | @ref bpmp_ec_ce_swd_ids | 2853*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_SW_UNCORRECTABLE | @ref bpmp_ec_ue_swd_ids | 2854*4882a593Smuzhiyun */ 2855*4882a593Smuzhiyun struct ec_err_sw_error_desc { 2856*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 2857*4882a593Smuzhiyun uint16_t desc_flags; 2858*4882a593Smuzhiyun /** @brief Error source id */ 2859*4882a593Smuzhiyun uint16_t err_source_id; 2860*4882a593Smuzhiyun /** @brief Sw error data */ 2861*4882a593Smuzhiyun uint32_t sw_error_data; 2862*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2863*4882a593Smuzhiyun 2864*4882a593Smuzhiyun /** 2865*4882a593Smuzhiyun * |error type | err_source_id values | 2866*4882a593Smuzhiyun * |----------------------------------------|---------------------------| 2867*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_PARITY_INTERNAL |@ref bpmp_ec_ipath_ids | 2868*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_ECC_SEC_INTERNAL |@ref bpmp_ec_ipath_ids | 2869*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_ECC_DED_INTERNAL |@ref bpmp_ec_ipath_ids | 2870*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_COMPARATOR |@ref bpmp_ec_comparator_ids| 2871*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_PARITY_SRAM |@ref bpmp_clock_ids | 2872*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_OTHER_HW_CORRECTABLE |@ref bpmp_ec_misc_hwd_ids | 2873*4882a593Smuzhiyun * |@ref EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE |@ref bpmp_ec_misc_hwd_ids | 2874*4882a593Smuzhiyun */ 2875*4882a593Smuzhiyun struct ec_err_simple_desc { 2876*4882a593Smuzhiyun /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 2877*4882a593Smuzhiyun uint16_t desc_flags; 2878*4882a593Smuzhiyun /** @brief Error source id. Id space depends on error type. */ 2879*4882a593Smuzhiyun uint16_t err_source_id; 2880*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2881*4882a593Smuzhiyun 2882*4882a593Smuzhiyun /** @brief Union of EC error descriptors */ 2883*4882a593Smuzhiyun union ec_err_desc { 2884*4882a593Smuzhiyun struct ec_err_fmon_desc fmon_desc; 2885*4882a593Smuzhiyun struct ec_err_vmon_desc vmon_desc; 2886*4882a593Smuzhiyun struct ec_err_reg_parity_desc reg_parity_desc; 2887*4882a593Smuzhiyun struct ec_err_sw_error_desc sw_error_desc; 2888*4882a593Smuzhiyun struct ec_err_simple_desc simple_desc; 2889*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2890*4882a593Smuzhiyun 2891*4882a593Smuzhiyun struct cmd_ec_status_get_request { 2892*4882a593Smuzhiyun /** @brief HSM error line number that identifies target EC. */ 2893*4882a593Smuzhiyun uint32_t ec_hsm_id; 2894*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2895*4882a593Smuzhiyun 2896*4882a593Smuzhiyun /** EC status maximum number of descriptors */ 2897*4882a593Smuzhiyun #define EC_ERR_STATUS_DESC_MAX_NUM 4U 2898*4882a593Smuzhiyun 2899*4882a593Smuzhiyun /** 2900*4882a593Smuzhiyun * @cond DEPRECATED 2901*4882a593Smuzhiyun */ 2902*4882a593Smuzhiyun struct cmd_ec_status_get_response { 2903*4882a593Smuzhiyun /** @brief Target EC id (the same id received with request). */ 2904*4882a593Smuzhiyun uint32_t ec_hsm_id; 2905*4882a593Smuzhiyun /** 2906*4882a593Smuzhiyun * @brief Bitmask of @ref bpmp_ec_status_flags 2907*4882a593Smuzhiyun * 2908*4882a593Smuzhiyun * If NO_ERROR flag is set, error_ fields should be ignored 2909*4882a593Smuzhiyun */ 2910*4882a593Smuzhiyun uint32_t ec_status_flags; 2911*4882a593Smuzhiyun /** @brief Found EC error index. */ 2912*4882a593Smuzhiyun uint32_t error_idx; 2913*4882a593Smuzhiyun /** @brief Found EC error type @ref bpmp_ec_err_type. */ 2914*4882a593Smuzhiyun uint32_t error_type; 2915*4882a593Smuzhiyun /** @brief Number of returned EC error descriptors */ 2916*4882a593Smuzhiyun uint32_t error_desc_num; 2917*4882a593Smuzhiyun /** @brief EC error descriptors */ 2918*4882a593Smuzhiyun union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM]; 2919*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2920*4882a593Smuzhiyun /** @endcond */ 2921*4882a593Smuzhiyun 2922*4882a593Smuzhiyun struct cmd_ec_status_ex_get_response { 2923*4882a593Smuzhiyun /** @brief Target EC id (the same id received with request). */ 2924*4882a593Smuzhiyun uint32_t ec_hsm_id; 2925*4882a593Smuzhiyun /** 2926*4882a593Smuzhiyun * @brief Bitmask of @ref bpmp_ec_status_flags 2927*4882a593Smuzhiyun * 2928*4882a593Smuzhiyun * If NO_ERROR flag is set, error_ fields should be ignored 2929*4882a593Smuzhiyun */ 2930*4882a593Smuzhiyun uint32_t ec_status_flags; 2931*4882a593Smuzhiyun /** @brief Found EC error index. */ 2932*4882a593Smuzhiyun uint32_t error_idx; 2933*4882a593Smuzhiyun /** @brief Found EC error type @ref bpmp_ec_err_type. */ 2934*4882a593Smuzhiyun uint32_t error_type; 2935*4882a593Smuzhiyun /** @brief Found EC mission error counter value */ 2936*4882a593Smuzhiyun uint32_t error_counter; 2937*4882a593Smuzhiyun /** @brief Found EC mission error user value */ 2938*4882a593Smuzhiyun uint32_t error_uval; 2939*4882a593Smuzhiyun /** @brief Reserved entry */ 2940*4882a593Smuzhiyun uint32_t reserved; 2941*4882a593Smuzhiyun /** @brief Number of returned EC error descriptors */ 2942*4882a593Smuzhiyun uint32_t error_desc_num; 2943*4882a593Smuzhiyun /** @brief EC error descriptors */ 2944*4882a593Smuzhiyun union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM]; 2945*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2946*4882a593Smuzhiyun 2947*4882a593Smuzhiyun /** 2948*4882a593Smuzhiyun * @ingroup EC 2949*4882a593Smuzhiyun * @brief Request with #MRQ_EC 2950*4882a593Smuzhiyun * 2951*4882a593Smuzhiyun * Used by the sender of an #MRQ_EC message to access ECs owned 2952*4882a593Smuzhiyun * by BPMP. 2953*4882a593Smuzhiyun * 2954*4882a593Smuzhiyun * @cond DEPRECATED 2955*4882a593Smuzhiyun * |sub-command |payload | 2956*4882a593Smuzhiyun * |----------------------------|-----------------------| 2957*4882a593Smuzhiyun * |@ref CMD_EC_STATUS_GET |ec_status_get | 2958*4882a593Smuzhiyun * @endcond 2959*4882a593Smuzhiyun * 2960*4882a593Smuzhiyun * |sub-command |payload | 2961*4882a593Smuzhiyun * |----------------------------|-----------------------| 2962*4882a593Smuzhiyun * |@ref CMD_EC_STATUS_EX_GET |ec_status_get | 2963*4882a593Smuzhiyun * 2964*4882a593Smuzhiyun */ 2965*4882a593Smuzhiyun 2966*4882a593Smuzhiyun struct mrq_ec_request { 2967*4882a593Smuzhiyun /** @brief Sub-command id. */ 2968*4882a593Smuzhiyun uint32_t cmd_id; 2969*4882a593Smuzhiyun 2970*4882a593Smuzhiyun union { 2971*4882a593Smuzhiyun struct cmd_ec_status_get_request ec_status_get; 2972*4882a593Smuzhiyun } BPMP_UNION_ANON; 2973*4882a593Smuzhiyun } BPMP_ABI_PACKED; 2974*4882a593Smuzhiyun 2975*4882a593Smuzhiyun /** 2976*4882a593Smuzhiyun * @ingroup EC 2977*4882a593Smuzhiyun * @brief Response to MRQ_EC 2978*4882a593Smuzhiyun * 2979*4882a593Smuzhiyun * Each sub-command supported by @ref mrq_ec_request may return 2980*4882a593Smuzhiyun * sub-command-specific data as indicated below. 2981*4882a593Smuzhiyun * 2982*4882a593Smuzhiyun * @cond DEPRECATED 2983*4882a593Smuzhiyun * |sub-command |payload | 2984*4882a593Smuzhiyun * |----------------------------|------------------------| 2985*4882a593Smuzhiyun * |@ref CMD_EC_STATUS_GET |ec_status_get | 2986*4882a593Smuzhiyun * @endcond 2987*4882a593Smuzhiyun * 2988*4882a593Smuzhiyun * |sub-command |payload | 2989*4882a593Smuzhiyun * |----------------------------|------------------------| 2990*4882a593Smuzhiyun * |@ref CMD_EC_STATUS_EX_GET |ec_status_ex_get | 2991*4882a593Smuzhiyun * 2992*4882a593Smuzhiyun */ 2993*4882a593Smuzhiyun 2994*4882a593Smuzhiyun struct mrq_ec_response { 2995*4882a593Smuzhiyun union { 2996*4882a593Smuzhiyun /** 2997*4882a593Smuzhiyun * @cond DEPRECATED 2998*4882a593Smuzhiyun */ 2999*4882a593Smuzhiyun struct cmd_ec_status_get_response ec_status_get; 3000*4882a593Smuzhiyun /** @endcond */ 3001*4882a593Smuzhiyun struct cmd_ec_status_ex_get_response ec_status_ex_get; 3002*4882a593Smuzhiyun } BPMP_UNION_ANON; 3003*4882a593Smuzhiyun } BPMP_ABI_PACKED; 3004*4882a593Smuzhiyun 3005*4882a593Smuzhiyun /** @} */ 3006*4882a593Smuzhiyun /** @endcond */ 3007*4882a593Smuzhiyun 3008*4882a593Smuzhiyun /** 3009*4882a593Smuzhiyun * @addtogroup Error_Codes 3010*4882a593Smuzhiyun * Negative values for mrq_response::err generally indicate some 3011*4882a593Smuzhiyun * error. The ABI defines the following error codes. Negating these 3012*4882a593Smuzhiyun * defines is an exercise left to the user. 3013*4882a593Smuzhiyun * @{ 3014*4882a593Smuzhiyun */ 3015*4882a593Smuzhiyun 3016*4882a593Smuzhiyun /** @brief Operation not permitted */ 3017*4882a593Smuzhiyun #define BPMP_EPERM 1 3018*4882a593Smuzhiyun /** @brief No such file or directory */ 3019*4882a593Smuzhiyun #define BPMP_ENOENT 2 3020*4882a593Smuzhiyun /** @brief No MRQ handler */ 3021*4882a593Smuzhiyun #define BPMP_ENOHANDLER 3 3022*4882a593Smuzhiyun /** @brief I/O error */ 3023*4882a593Smuzhiyun #define BPMP_EIO 5 3024*4882a593Smuzhiyun /** @brief Bad sub-MRQ command */ 3025*4882a593Smuzhiyun #define BPMP_EBADCMD 6 3026*4882a593Smuzhiyun /** @brief Resource temporarily unavailable */ 3027*4882a593Smuzhiyun #define BPMP_EAGAIN 11 3028*4882a593Smuzhiyun /** @brief Not enough memory */ 3029*4882a593Smuzhiyun #define BPMP_ENOMEM 12 3030*4882a593Smuzhiyun /** @brief Permission denied */ 3031*4882a593Smuzhiyun #define BPMP_EACCES 13 3032*4882a593Smuzhiyun /** @brief Bad address */ 3033*4882a593Smuzhiyun #define BPMP_EFAULT 14 3034*4882a593Smuzhiyun /** @brief Resource busy */ 3035*4882a593Smuzhiyun #define BPMP_EBUSY 16 3036*4882a593Smuzhiyun /** @brief No such device */ 3037*4882a593Smuzhiyun #define BPMP_ENODEV 19 3038*4882a593Smuzhiyun /** @brief Argument is a directory */ 3039*4882a593Smuzhiyun #define BPMP_EISDIR 21 3040*4882a593Smuzhiyun /** @brief Invalid argument */ 3041*4882a593Smuzhiyun #define BPMP_EINVAL 22 3042*4882a593Smuzhiyun /** @brief Timeout during operation */ 3043*4882a593Smuzhiyun #define BPMP_ETIMEDOUT 23 3044*4882a593Smuzhiyun /** @brief Out of range */ 3045*4882a593Smuzhiyun #define BPMP_ERANGE 34 3046*4882a593Smuzhiyun /** @brief Function not implemented */ 3047*4882a593Smuzhiyun #define BPMP_ENOSYS 38 3048*4882a593Smuzhiyun /** @brief Invalid slot */ 3049*4882a593Smuzhiyun #define BPMP_EBADSLT 57 3050*4882a593Smuzhiyun /** @brief Not supported */ 3051*4882a593Smuzhiyun #define BPMP_ENOTSUP 134 3052*4882a593Smuzhiyun /** @brief No such device or address */ 3053*4882a593Smuzhiyun #define BPMP_ENXIO 140 3054*4882a593Smuzhiyun 3055*4882a593Smuzhiyun /** @} */ 3056*4882a593Smuzhiyun 3057*4882a593Smuzhiyun #if defined(BPMP_ABI_CHECKS) 3058*4882a593Smuzhiyun #include "bpmp_abi_checks.h" 3059*4882a593Smuzhiyun #endif 3060*4882a593Smuzhiyun 3061*4882a593Smuzhiyun #endif 3062