1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. 4 */ 5 6 #ifndef ABI_BPMP_ABI_H 7 #define ABI_BPMP_ABI_H 8 9 #if defined(LK) || defined(BPMP_ABI_HAVE_STDC) 10 #include <stddef.h> 11 #include <stdint.h> 12 #endif 13 14 #ifndef BPMP_ABI_PACKED 15 #ifdef __ABI_PACKED 16 #define BPMP_ABI_PACKED __ABI_PACKED 17 #else 18 #define BPMP_ABI_PACKED __attribute__((packed)) 19 #endif 20 #endif 21 22 #ifdef NO_GCC_EXTENSIONS 23 #define BPMP_ABI_EMPTY char empty; 24 #define BPMP_ABI_EMPTY_ARRAY 1 25 #else 26 #define BPMP_ABI_EMPTY 27 #define BPMP_ABI_EMPTY_ARRAY 0 28 #endif 29 30 #ifndef BPMP_UNION_ANON 31 #ifdef __UNION_ANON 32 #define BPMP_UNION_ANON __UNION_ANON 33 #else 34 #define BPMP_UNION_ANON 35 #endif 36 #endif 37 38 /** 39 * @file 40 */ 41 42 /** 43 * @defgroup MRQ MRQ Messages 44 * @brief Messages sent to/from BPMP via IPC 45 * @{ 46 * @defgroup MRQ_Format Message Format 47 * @defgroup MRQ_Codes Message Request (MRQ) Codes 48 * @defgroup MRQ_Payloads Message Payloads 49 * @defgroup Error_Codes Error Codes 50 * @} 51 */ 52 53 /** 54 * @addtogroup MRQ_Format 55 * @{ 56 * The CPU requests the BPMP to perform a particular service by 57 * sending it an IVC frame containing a single MRQ message. An MRQ 58 * message consists of a @ref mrq_request followed by a payload whose 59 * format depends on mrq_request::mrq. 60 * 61 * The BPMP processes the data and replies with an IVC frame (on the 62 * same IVC channel) containing and MRQ response. An MRQ response 63 * consists of a @ref mrq_response followed by a payload whose format 64 * depends on the associated mrq_request::mrq. 65 * 66 * A well-defined subset of the MRQ messages that the CPU sends to the 67 * BPMP can lead to BPMP eventually sending an MRQ message to the 68 * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set 69 * a thermal trip point, the BPMP may eventually send a single 70 * #MRQ_THERMAL message of its own to the CPU indicating that the trip 71 * point has been crossed. 72 * @} 73 */ 74 75 /** 76 * @ingroup MRQ_Format 77 * Request an answer from the peer. 78 * This should be set in mrq_request::flags for all requests targetted 79 * at BPMP. For requests originating in BPMP, this flag is optional except 80 * for messages targeting MCE, for which the field must be set. 81 * When this flag is not set, the remote peer must not send a response 82 * back. 83 */ 84 #define BPMP_MAIL_DO_ACK (1U << 0U) 85 86 /** 87 * @ingroup MRQ_Format 88 * Ring the sender's doorbell when responding. This should be set unless 89 * the sender wants to poll the underlying communications layer directly. 90 * 91 * An optional direction that can be specified in mrq_request::flags. 92 */ 93 #define BPMP_MAIL_RING_DB (1U << 1U) 94 95 /** 96 * @ingroup MRQ_Format 97 * CRC present 98 */ 99 #define BPMP_MAIL_CRC_PRESENT (1U << 2U) 100 101 /** 102 * @ingroup MRQ_Format 103 * @brief Header for an MRQ message 104 * 105 * Provides the MRQ number for the MRQ message: #mrq. The remainder of 106 * the MRQ message is a payload (immediately following the 107 * mrq_request) whose format depends on mrq. 108 */ 109 struct mrq_request { 110 /** @brief MRQ number of the request */ 111 uint32_t mrq; 112 113 /** 114 * @brief 32bit word containing a number of fields as follows: 115 * 116 * struct { 117 * uint8_t options:4; 118 * uint8_t xid:4; 119 * uint8_t payload_length; 120 * uint16_t crc16; 121 * }; 122 * 123 * **options** directions to the receiver and indicates CRC presence. 124 * 125 * #BPMP_MAIL_DO_ACK and #BPMP_MAIL_RING_DB see documentation of respective options. 126 * #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms. It indicates the 127 * crc16, xid and length fields are present when set. 128 * Some platform configurations, especially when targeted to applications requiring 129 * functional safety, mandate this option being set or otherwise will respond with 130 * -BPMP_EBADMSG and ignore the request. 131 * 132 * **xid** is a transaction ID. 133 * 134 * Only used when #BPMP_MAIL_CRC_PRESENT is set. 135 * 136 * **payload_length** of the message expressed in bytes without the size of this header. 137 * See table below for minimum accepted payload lengths for each MRQ. 138 * Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes 139 * rather than bytes. 140 * 141 * Only used when #BPMP_MAIL_CRC_PRESENT is set. 142 * 143 * | MRQ | CMD | minimum payload length 144 * | -------------------- | ------------------------------------ | ------------------------------------------ | 145 * | MRQ_PING | | 4 | 146 * | MRQ_THREADED_PING | | 4 | 147 * | MRQ_RESET | any | 8 | 148 * | MRQ_I2C | | 12 + cmd_i2c_xfer_request.data_size | 149 * | MRQ_CLK | CMD_CLK_GET_RATE | 4 | 150 * | MRQ_CLK | CMD_CLK_SET_RATE | 16 | 151 * | MRQ_CLK | CMD_CLK_ROUND_RATE | 16 | 152 * | MRQ_CLK | CMD_CLK_GET_PARENT | 4 | 153 * | MRQ_CLK | CMD_CLK_SET_PARENT | 8 | 154 * | MRQ_CLK | CMD_CLK_ENABLE | 4 | 155 * | MRQ_CLK | CMD_CLK_DISABLE | 4 | 156 * | MRQ_CLK | CMD_CLK_IS_ENABLED | 4 | 157 * | MRQ_CLK | CMD_CLK_GET_ALL_INFO | 4 | 158 * | MRQ_CLK | CMD_CLK_GET_MAX_CLK_ID | 4 | 159 * | MRQ_CLK | CMD_CLK_GET_FMAX_AT_VMIN | 4 | 160 * | MRQ_QUERY_ABI | | 4 | 161 * | MRQ_PG | CMD_PG_QUERY_ABI | 12 | 162 * | MRQ_PG | CMD_PG_SET_STATE | 12 | 163 * | MRQ_PG | CMD_PG_GET_STATE | 8 | 164 * | MRQ_PG | CMD_PG_GET_NAME | 8 | 165 * | MRQ_PG | CMD_PG_GET_MAX_ID | 8 | 166 * | MRQ_THERMAL | CMD_THERMAL_QUERY_ABI | 8 | 167 * | MRQ_THERMAL | CMD_THERMAL_GET_TEMP | 8 | 168 * | MRQ_THERMAL | CMD_THERMAL_SET_TRIP | 20 | 169 * | MRQ_THERMAL | CMD_THERMAL_GET_NUM_ZONES | 4 | 170 * | MRQ_THERMAL | CMD_THERMAL_GET_THERMTRIP | 8 | 171 * | MRQ_CPU_VHINT | | 8 | 172 * | MRQ_ABI_RATCHET | | 2 | 173 * | MRQ_EMC_DVFS_LATENCY | | 8 | 174 * | MRQ_EMC_DVFS_EMCHUB | | 8 | 175 * | MRQ_EMC_DISP_RFL | | 4 | 176 * | MRQ_BWMGR | CMD_BWMGR_QUERY_ABI | 8 | 177 * | MRQ_BWMGR | CMD_BWMGR_CALC_RATE | 8 + 8 * bwmgr_rate_req.num_iso_clients | 178 * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_QUERY_ABI | 8 | 179 * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_CALCULATE_LA | 16 | 180 * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_SET_LA | 16 | 181 * | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_GET_MAX_BW | 8 | 182 * | MRQ_CPU_NDIV_LIMITS | | 4 | 183 * | MRQ_CPU_AUTO_CC3 | | 4 | 184 * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_QUERY_ABI | 8 | 185 * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_READ | 5 | 186 * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_WRITE | 5 + cmd_ringbuf_console_write_req.len | 187 * | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_GET_FIFO | 4 | 188 * | MRQ_STRAP | STRAP_SET | 12 | 189 * | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | 24 | 190 * | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_STATUS | 4 | 191 * | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT | 5 | 192 * | MRQ_UPHY | CMD_UPHY_PCIE_CONTROLLER_STATE | 6 | 193 * | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF | 5 | 194 * | MRQ_FMON | CMD_FMON_GEAR_CLAMP | 16 | 195 * | MRQ_FMON | CMD_FMON_GEAR_FREE | 4 | 196 * | MRQ_FMON | CMD_FMON_GEAR_GET | 4 | 197 * | MRQ_FMON | CMD_FMON_FAULT_STS_GET | 8 | 198 * | MRQ_EC | CMD_EC_STATUS_EX_GET | 12 | 199 * | MRQ_QUERY_FW_TAG | | 0 | 200 * | MRQ_DEBUG | CMD_DEBUG_OPEN_RO | 4 + length of cmd_debug_fopen_request.name | 201 * | MRQ_DEBUG | CMD_DEBUG_OPEN_WO | 4 + length of cmd_debug_fopen_request.name | 202 * | MRQ_DEBUG | CMD_DEBUG_READ | 8 | 203 * | MRQ_DEBUG | CMD_DEBUG_WRITE | 12 + cmd_debug_fwrite_request.datalen | 204 * | MRQ_DEBUG | CMD_DEBUG_CLOSE | 8 | 205 * | MRQ_TELEMETRY | | 8 | 206 * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_QUERY_ABI | 8 | 207 * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_SET | 20 | 208 * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_GET | 16 | 209 * | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_CURR_CAP | 8 | 210 * | MRQ_GEARS | | 0 | 211 * | MRQ_BWMGR_INT | CMD_BWMGR_INT_QUERY_ABI | 8 | 212 * | MRQ_BWMGR_INT | CMD_BWMGR_INT_CALC_AND_SET | 16 | 213 * | MRQ_BWMGR_INT | CMD_BWMGR_INT_CAP_SET | 8 | 214 * | MRQ_OC_STATUS | | 0 | 215 * 216 * **crc16** 217 * 218 * CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1 219 * and initialization value 0x4657. The CRC is calculated over all bytes of the message 220 * including this header. However the crc16 field is considered to be set to 0 when 221 * calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. If 222 * #BPMP_MAIL_CRC_PRESENT is set and this field does not match the CRC as 223 * calculated by BPMP, -BPMP_EBADMSG will be returned and the request will 224 * be ignored. See code snippet below on how to calculate the CRC. 225 * 226 * @code 227 * uint16_t calc_crc_digest(uint16_t crc, uint8_t *data, size_t size) 228 * { 229 * for (size_t i = 0; i < size; i++) { 230 * crc ^= data[i] << 8; 231 * for (size_t j = 0; j < 8; j++) { 232 * if ((crc & 0x8000) == 0x8000) { 233 * crc = (crc << 1) ^ 0xAC9A; 234 * } else { 235 * crc = (crc << 1); 236 * } 237 * } 238 * } 239 * return crc; 240 * } 241 * 242 * uint16_t calc_crc(uint8_t *data, size_t size) 243 * { 244 * return calc_crc_digest(0x4657, data, size); 245 * } 246 * @endcode 247 */ 248 uint32_t flags; 249 } BPMP_ABI_PACKED; 250 251 /** 252 * @ingroup MRQ_Format 253 * @brief Header for an MRQ response 254 * 255 * Provides an error code for the associated MRQ message. The 256 * remainder of the MRQ response is a payload (immediately following 257 * the mrq_response) whose format depends on the associated 258 * mrq_request::mrq 259 */ 260 struct mrq_response { 261 /** @brief Error code for the MRQ request itself */ 262 int32_t err; 263 264 /** 265 * @brief 32bit word containing a number of fields as follows: 266 * 267 * struct { 268 * uint8_t options:4; 269 * uint8_t xid:4; 270 * uint8_t payload_length; 271 * uint16_t crc16; 272 * }; 273 * 274 * **options** indicates CRC presence. 275 * 276 * #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms and 277 * indicates the crc16 related fields are present when set. 278 * 279 * **xid** is the transaction ID as sent by the requestor. 280 * 281 * **length** of the message expressed in bytes without the size of this header. 282 * Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes 283 * rather than bytes. 284 * 285 * **crc16** 286 * 287 * CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1 288 * and initialization value 0x4657. The CRC is calculated over all bytes of the message 289 * including this header. However the crc16 field is considered to be set to 0 when 290 * calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. 291 */ 292 uint32_t flags; 293 } BPMP_ABI_PACKED; 294 295 /** 296 * @ingroup MRQ_Format 297 * Minimum needed size for an IPC message buffer 298 */ 299 #define MSG_MIN_SZ 128U 300 /** 301 * @ingroup MRQ_Format 302 * Minimum size guaranteed for data in an IPC message buffer 303 */ 304 #define MSG_DATA_MIN_SZ 120U 305 306 /** 307 * @ingroup MRQ_Codes 308 * @name Legal MRQ codes 309 * These are the legal values for mrq_request::mrq 310 * @{ 311 */ 312 313 #define MRQ_PING 0U 314 #define MRQ_QUERY_TAG 1U 315 #define MRQ_THREADED_PING 9U 316 #define MRQ_DEBUGFS 19U 317 #define MRQ_RESET 20U 318 #define MRQ_I2C 21U 319 #define MRQ_CLK 22U 320 #define MRQ_QUERY_ABI 23U 321 #define MRQ_THERMAL 27U 322 #define MRQ_CPU_VHINT 28U 323 #define MRQ_ABI_RATCHET 29U 324 #define MRQ_EMC_DVFS_LATENCY 31U 325 #define MRQ_RINGBUF_CONSOLE 65U 326 #define MRQ_PG 66U 327 #define MRQ_CPU_NDIV_LIMITS 67U 328 #define MRQ_STRAP 68U 329 #define MRQ_UPHY 69U 330 #define MRQ_CPU_AUTO_CC3 70U 331 #define MRQ_QUERY_FW_TAG 71U 332 #define MRQ_FMON 72U 333 #define MRQ_EC 73U 334 #define MRQ_DEBUG 75U 335 #define MRQ_EMC_DVFS_EMCHUB 76U 336 #define MRQ_BWMGR 77U 337 #define MRQ_ISO_CLIENT 78U 338 #define MRQ_EMC_DISP_RFL 79U 339 #define MRQ_TELEMETRY 80U 340 #define MRQ_PWR_LIMIT 81U 341 #define MRQ_GEARS 82U 342 #define MRQ_BWMGR_INT 83U 343 #define MRQ_OC_STATUS 84U 344 345 /** @cond DEPRECATED */ 346 #define MRQ_RESERVED_2 2U 347 #define MRQ_RESERVED_3 3U 348 #define MRQ_RESERVED_4 4U 349 #define MRQ_RESERVED_5 5U 350 #define MRQ_RESERVED_6 6U 351 #define MRQ_RESERVED_7 7U 352 #define MRQ_RESERVED_8 8U 353 #define MRQ_RESERVED_10 10U 354 #define MRQ_RESERVED_11 11U 355 #define MRQ_RESERVED_12 12U 356 #define MRQ_RESERVED_13 13U 357 #define MRQ_RESERVED_14 14U 358 #define MRQ_RESERVED_15 15U 359 #define MRQ_RESERVED_16 16U 360 #define MRQ_RESERVED_17 17U 361 #define MRQ_RESERVED_18 18U 362 #define MRQ_RESERVED_24 24U 363 #define MRQ_RESERVED_25 25U 364 #define MRQ_RESERVED_26 26U 365 #define MRQ_RESERVED_30 30U 366 #define MRQ_RESERVED_64 64U 367 #define MRQ_RESERVED_74 74U 368 /** @endcond DEPRECATED */ 369 370 /** @} */ 371 372 /** 373 * @ingroup MRQ_Codes 374 * @brief Maximum MRQ code to be sent by CPU software to 375 * BPMP. Subject to change in future 376 */ 377 #define MAX_CPU_MRQ_ID 84U 378 379 /** 380 * @addtogroup MRQ_Payloads 381 * @{ 382 * @defgroup Ping Ping 383 * @defgroup Query_Tag Query Tag 384 * @defgroup Module Loadable Modules 385 * @defgroup Trace Trace 386 * @defgroup Debugfs Debug File System 387 * @defgroup Reset Reset 388 * @defgroup I2C I2C 389 * @defgroup Clocks Clocks 390 * @defgroup ABI_info ABI Info 391 * @defgroup Powergating Power Gating 392 * @defgroup Thermal Thermal 393 * @defgroup OC_status OC status 394 * @defgroup Vhint CPU Voltage hint 395 * @defgroup EMC EMC 396 * @defgroup BWMGR BWMGR 397 * @defgroup ISO_CLIENT ISO_CLIENT 398 * @defgroup CPU NDIV Limits 399 * @defgroup RingbufConsole Ring Buffer Console 400 * @defgroup Strap Straps 401 * @defgroup UPHY UPHY 402 * @defgroup CC3 Auto-CC3 403 * @defgroup FMON FMON 404 * @defgroup EC EC 405 * @defgroup Telemetry Telemetry 406 * @defgroup Pwrlimit PWR_LIMIT 407 * @defgroup Gears Gears 408 * @defgroup BWMGR_INT Bandwidth Manager Integrated 409 * @} MRQ_Payloads 410 */ 411 412 /** 413 * @ingroup MRQ_Codes 414 * @def MRQ_PING 415 * @brief A simple ping 416 * 417 * * Platforms: All 418 * * Initiators: Any 419 * * Targets: Any 420 * * Request Payload: @ref mrq_ping_request 421 * * Response Payload: @ref mrq_ping_response 422 * 423 * @ingroup MRQ_Codes 424 * @def MRQ_THREADED_PING 425 * @brief A deeper ping 426 * 427 * * Platforms: All 428 * * Initiators: Any 429 * * Targets: BPMP 430 * * Request Payload: @ref mrq_ping_request 431 * * Response Payload: @ref mrq_ping_response 432 * 433 * Behavior is equivalent to a simple #MRQ_PING except that BPMP 434 * responds from a thread context (providing a slightly more robust 435 * sign of life). 436 * 437 */ 438 439 /** 440 * @ingroup Ping 441 * @brief Request with #MRQ_PING 442 * 443 * Used by the sender of an #MRQ_PING message to request a pong from 444 * recipient. The response from the recipient is computed based on 445 * #challenge. 446 */ 447 struct mrq_ping_request { 448 /** @brief Arbitrarily chosen value */ 449 uint32_t challenge; 450 } BPMP_ABI_PACKED; 451 452 /** 453 * @ingroup Ping 454 * @brief Response to #MRQ_PING 455 * 456 * Sent in response to an #MRQ_PING message. #reply should be the 457 * mrq_ping_request challenge left shifted by 1 with the carry-bit 458 * dropped. 459 * 460 */ 461 struct mrq_ping_response { 462 /** @brief Response to the MRQ_PING challege */ 463 uint32_t reply; 464 } BPMP_ABI_PACKED; 465 466 /** 467 * @ingroup MRQ_Codes 468 * @def MRQ_QUERY_TAG 469 * @brief Query BPMP firmware's tag (i.e. unique identifer) 470 * 471 * @deprecated Use #MRQ_QUERY_FW_TAG instead. 472 * 473 * * Platforms: All 474 * * Initiators: CCPLEX 475 * * Targets: BPMP 476 * * Request Payload: @ref mrq_query_tag_request 477 * * Response Payload: N/A 478 * 479 */ 480 481 /** 482 * @ingroup Query_Tag 483 * @brief Request with #MRQ_QUERY_TAG 484 * 485 * @deprecated This structure will be removed in future version. 486 * Use MRQ_QUERY_FW_TAG instead. 487 */ 488 struct mrq_query_tag_request { 489 /** @brief Base address to store the firmware tag */ 490 uint32_t addr; 491 } BPMP_ABI_PACKED; 492 493 494 /** 495 * @ingroup MRQ_Codes 496 * @def MRQ_QUERY_FW_TAG 497 * @brief Query BPMP firmware's tag (i.e. unique identifier) 498 * 499 * * Platforms: All 500 * * Initiators: Any 501 * * Targets: BPMP 502 * * Request Payload: N/A 503 * * Response Payload: @ref mrq_query_fw_tag_response 504 * 505 */ 506 507 /** 508 * @ingroup Query_Tag 509 * @brief Response to #MRQ_QUERY_FW_TAG 510 * 511 * Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique 512 * identifier for the version of firmware issuing the reply. 513 * 514 */ 515 struct mrq_query_fw_tag_response { 516 /** @brief Array to store tag information */ 517 uint8_t tag[32]; 518 } BPMP_ABI_PACKED; 519 520 /** @private */ 521 struct mrq_threaded_ping_request { 522 uint32_t challenge; 523 } BPMP_ABI_PACKED; 524 525 /** @private */ 526 struct mrq_threaded_ping_response { 527 uint32_t reply; 528 } BPMP_ABI_PACKED; 529 530 /** 531 * @ingroup MRQ_Codes 532 * @def MRQ_DEBUGFS 533 * @brief Interact with BPMP's debugfs file nodes 534 * 535 * @deprecated use MRQ_DEBUG instead. 536 * 537 * * Platforms: T186, T194 538 * * Initiators: Any 539 * * Targets: BPMP 540 * * Request Payload: @ref mrq_debugfs_request 541 * * Response Payload: @ref mrq_debugfs_response 542 */ 543 544 /** 545 * @addtogroup Debugfs 546 * @{ 547 * 548 * The BPMP firmware implements a pseudo-filesystem called 549 * debugfs. Any driver within the firmware may register with debugfs 550 * to expose an arbitrary set of "files" in the filesystem. When 551 * software on the CPU writes to a debugfs file, debugfs passes the 552 * written data to a callback provided by the driver. When software on 553 * the CPU reads a debugfs file, debugfs queries the driver for the 554 * data to return to the CPU. The intention of the debugfs filesystem 555 * is to provide information useful for debugging the system at 556 * runtime. 557 * 558 * @note The files exposed via debugfs are not part of the 559 * BPMP firmware's ABI. debugfs files may be added or removed in any 560 * given version of the firmware. Typically the semantics of a debugfs 561 * file are consistent from version to version but even that is not 562 * guaranteed. 563 * 564 * @} 565 */ 566 567 /** @ingroup Debugfs */ 568 enum mrq_debugfs_commands { 569 /** @brief Perform read */ 570 CMD_DEBUGFS_READ = 1, 571 /** @brief Perform write */ 572 CMD_DEBUGFS_WRITE = 2, 573 /** @brief Perform dumping directory */ 574 CMD_DEBUGFS_DUMPDIR = 3, 575 /** @brief Not a command */ 576 CMD_DEBUGFS_MAX 577 }; 578 579 /** 580 * @ingroup Debugfs 581 * @brief Parameters for CMD_DEBUGFS_READ/WRITE command 582 */ 583 struct cmd_debugfs_fileop_request { 584 /** @brief Physical address pointing at filename */ 585 uint32_t fnameaddr; 586 /** @brief Length in bytes of filename buffer */ 587 uint32_t fnamelen; 588 /** @brief Physical address pointing to data buffer */ 589 uint32_t dataaddr; 590 /** @brief Length in bytes of data buffer */ 591 uint32_t datalen; 592 } BPMP_ABI_PACKED; 593 594 /** 595 * @ingroup Debugfs 596 * @brief Parameters for CMD_DEBUGFS_READ/WRITE command 597 */ 598 struct cmd_debugfs_dumpdir_request { 599 /** @brief Physical address pointing to data buffer */ 600 uint32_t dataaddr; 601 /** @brief Length in bytes of data buffer */ 602 uint32_t datalen; 603 } BPMP_ABI_PACKED; 604 605 /** 606 * @ingroup Debugfs 607 * @brief Response data for CMD_DEBUGFS_READ/WRITE command 608 */ 609 struct cmd_debugfs_fileop_response { 610 /** @brief Always 0 */ 611 uint32_t reserved; 612 /** @brief Number of bytes read from or written to data buffer */ 613 uint32_t nbytes; 614 } BPMP_ABI_PACKED; 615 616 /** 617 * @ingroup Debugfs 618 * @brief Response data for CMD_DEBUGFS_DUMPDIR command 619 */ 620 struct cmd_debugfs_dumpdir_response { 621 /** @brief Always 0 */ 622 uint32_t reserved; 623 /** @brief Number of bytes read from or written to data buffer */ 624 uint32_t nbytes; 625 } BPMP_ABI_PACKED; 626 627 /** 628 * @ingroup Debugfs 629 * @brief Request with #MRQ_DEBUGFS. 630 * 631 * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs 632 * command to execute. Legal commands are the values of @ref 633 * mrq_debugfs_commands. Each command requires a specific additional 634 * payload of data. 635 * 636 * |command |payload| 637 * |-------------------|-------| 638 * |CMD_DEBUGFS_READ |fop | 639 * |CMD_DEBUGFS_WRITE |fop | 640 * |CMD_DEBUGFS_DUMPDIR|dumpdir| 641 */ 642 struct mrq_debugfs_request { 643 /** @brief Sub-command (@ref mrq_debugfs_commands) */ 644 uint32_t cmd; 645 union { 646 struct cmd_debugfs_fileop_request fop; 647 struct cmd_debugfs_dumpdir_request dumpdir; 648 } BPMP_UNION_ANON; 649 } BPMP_ABI_PACKED; 650 651 /** 652 * @ingroup Debugfs 653 */ 654 struct mrq_debugfs_response { 655 /** @brief Always 0 */ 656 int32_t reserved; 657 union { 658 /** @brief Response data for CMD_DEBUGFS_READ OR 659 * CMD_DEBUGFS_WRITE command 660 */ 661 struct cmd_debugfs_fileop_response fop; 662 /** @brief Response data for CMD_DEBUGFS_DUMPDIR command */ 663 struct cmd_debugfs_dumpdir_response dumpdir; 664 } BPMP_UNION_ANON; 665 } BPMP_ABI_PACKED; 666 667 /** 668 * @addtogroup Debugfs 669 * @{ 670 */ 671 #define DEBUGFS_S_ISDIR (1 << 9) 672 #define DEBUGFS_S_IRUSR (1 << 8) 673 #define DEBUGFS_S_IWUSR (1 << 7) 674 /** @} Debugfs */ 675 676 /** 677 * @ingroup MRQ_Codes 678 * @def MRQ_DEBUG 679 * @brief Interact with BPMP's debugfs file nodes. Use message payload 680 * for exchanging data. This is functionally equivalent to 681 * @ref MRQ_DEBUGFS. But the way in which data is exchanged is different. 682 * When software running on CPU tries to read a debugfs file, 683 * the file path and read data will be stored in message payload. 684 * Since the message payload size is limited, a debugfs file 685 * transaction might require multiple frames of data exchanged 686 * between BPMP and CPU until the transaction completes. 687 * 688 * * Platforms: T194 689 * * Initiators: Any 690 * * Targets: BPMP 691 * * Request Payload: @ref mrq_debug_request 692 * * Response Payload: @ref mrq_debug_response 693 */ 694 695 /** @ingroup Debugfs */ 696 enum mrq_debug_commands { 697 /** @brief Open required file for read operation */ 698 CMD_DEBUG_OPEN_RO = 0, 699 /** @brief Open required file for write operation */ 700 CMD_DEBUG_OPEN_WO = 1, 701 /** @brief Perform read */ 702 CMD_DEBUG_READ = 2, 703 /** @brief Perform write */ 704 CMD_DEBUG_WRITE = 3, 705 /** @brief Close file */ 706 CMD_DEBUG_CLOSE = 4, 707 /** @brief Not a command */ 708 CMD_DEBUG_MAX 709 }; 710 711 /** 712 * @ingroup Debugfs 713 * @brief Maximum number of files that can be open at a given time 714 */ 715 #define DEBUG_MAX_OPEN_FILES 1 716 717 /** 718 * @ingroup Debugfs 719 * @brief Maximum size of null-terminated file name string in bytes. 720 * Value is derived from memory available in message payload while 721 * using @ref cmd_debug_fopen_request 722 * Value 4 corresponds to size of @ref mrq_debug_commands 723 * in @ref mrq_debug_request. 724 * 120 - 4 dbg_cmd(32bit) = 116 725 */ 726 #define DEBUG_FNAME_MAX_SZ (MSG_DATA_MIN_SZ - 4) 727 728 /** 729 * @ingroup Debugfs 730 * @brief Parameters for CMD_DEBUG_OPEN command 731 */ 732 struct cmd_debug_fopen_request { 733 /** @brief File name - Null-terminated string with maximum 734 * length @ref DEBUG_FNAME_MAX_SZ 735 */ 736 char name[DEBUG_FNAME_MAX_SZ]; 737 } BPMP_ABI_PACKED; 738 739 /** 740 * @ingroup Debugfs 741 * @brief Response data for CMD_DEBUG_OPEN_RO/WO command 742 */ 743 struct cmd_debug_fopen_response { 744 /** @brief Identifier for file access */ 745 uint32_t fd; 746 /** @brief Data length. File data size for READ command. 747 * Maximum allowed length for WRITE command 748 */ 749 uint32_t datalen; 750 } BPMP_ABI_PACKED; 751 752 /** 753 * @ingroup Debugfs 754 * @brief Parameters for CMD_DEBUG_READ command 755 */ 756 struct cmd_debug_fread_request { 757 /** @brief File access identifier received in response 758 * to CMD_DEBUG_OPEN_RO request 759 */ 760 uint32_t fd; 761 } BPMP_ABI_PACKED; 762 763 /** 764 * @ingroup Debugfs 765 * @brief Maximum size of read data in bytes. 766 * Value is derived from memory available in message payload while 767 * using @ref cmd_debug_fread_response. 768 */ 769 #define DEBUG_READ_MAX_SZ (MSG_DATA_MIN_SZ - 4) 770 771 /** 772 * @ingroup Debugfs 773 * @brief Response data for CMD_DEBUG_READ command 774 */ 775 struct cmd_debug_fread_response { 776 /** @brief Size of data provided in this response in bytes */ 777 uint32_t readlen; 778 /** @brief File data from seek position */ 779 char data[DEBUG_READ_MAX_SZ]; 780 } BPMP_ABI_PACKED; 781 782 /** 783 * @ingroup Debugfs 784 * @brief Maximum size of write data in bytes. 785 * Value is derived from memory available in message payload while 786 * using @ref cmd_debug_fwrite_request. 787 */ 788 #define DEBUG_WRITE_MAX_SZ (MSG_DATA_MIN_SZ - 12) 789 790 /** 791 * @ingroup Debugfs 792 * @brief Parameters for CMD_DEBUG_WRITE command 793 */ 794 struct cmd_debug_fwrite_request { 795 /** @brief File access identifier received in response 796 * to CMD_DEBUG_OPEN_RO request 797 */ 798 uint32_t fd; 799 /** @brief Size of write data in bytes */ 800 uint32_t datalen; 801 /** @brief Data to be written */ 802 char data[DEBUG_WRITE_MAX_SZ]; 803 } BPMP_ABI_PACKED; 804 805 /** 806 * @ingroup Debugfs 807 * @brief Parameters for CMD_DEBUG_CLOSE command 808 */ 809 struct cmd_debug_fclose_request { 810 /** @brief File access identifier received in response 811 * to CMD_DEBUG_OPEN_RO request 812 */ 813 uint32_t fd; 814 } BPMP_ABI_PACKED; 815 816 /** 817 * @ingroup Debugfs 818 * @brief Request with #MRQ_DEBUG. 819 * 820 * The sender of an MRQ_DEBUG message uses #cmd to specify a debugfs 821 * command to execute. Legal commands are the values of @ref 822 * mrq_debug_commands. Each command requires a specific additional 823 * payload of data. 824 * 825 * |command |payload| 826 * |-------------------|-------| 827 * |CMD_DEBUG_OPEN_RO |fop | 828 * |CMD_DEBUG_OPEN_WO |fop | 829 * |CMD_DEBUG_READ |frd | 830 * |CMD_DEBUG_WRITE |fwr | 831 * |CMD_DEBUG_CLOSE |fcl | 832 */ 833 struct mrq_debug_request { 834 /** @brief Sub-command (@ref mrq_debug_commands) */ 835 uint32_t cmd; 836 union { 837 /** @brief Request payload for CMD_DEBUG_OPEN_RO/WO command */ 838 struct cmd_debug_fopen_request fop; 839 /** @brief Request payload for CMD_DEBUG_READ command */ 840 struct cmd_debug_fread_request frd; 841 /** @brief Request payload for CMD_DEBUG_WRITE command */ 842 struct cmd_debug_fwrite_request fwr; 843 /** @brief Request payload for CMD_DEBUG_CLOSE command */ 844 struct cmd_debug_fclose_request fcl; 845 } BPMP_UNION_ANON; 846 } BPMP_ABI_PACKED; 847 848 /** 849 * @ingroup Debugfs 850 */ 851 struct mrq_debug_response { 852 union { 853 /** @brief Response data for CMD_DEBUG_OPEN_RO/WO command */ 854 struct cmd_debug_fopen_response fop; 855 /** @brief Response data for CMD_DEBUG_READ command */ 856 struct cmd_debug_fread_response frd; 857 } BPMP_UNION_ANON; 858 } BPMP_ABI_PACKED; 859 860 /** 861 * @ingroup MRQ_Codes 862 * @def MRQ_RESET 863 * @brief Reset an IP block 864 * 865 * * Platforms: T186, T194 866 * * Initiators: Any 867 * * Targets: BPMP 868 * * Request Payload: @ref mrq_reset_request 869 * * Response Payload: @ref mrq_reset_response 870 * 871 * @addtogroup Reset 872 * @{ 873 */ 874 875 enum mrq_reset_commands { 876 /** 877 * @brief Assert module reset 878 * 879 * mrq_response::err is 0 if the operation was successful, or @n 880 * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n 881 * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n 882 * -#BPMP_ENOTSUP if target domain h/w state does not allow reset 883 */ 884 CMD_RESET_ASSERT = 1, 885 /** 886 * @brief Deassert module reset 887 * 888 * mrq_response::err is 0 if the operation was successful, or @n 889 * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n 890 * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n 891 * -#BPMP_ENOTSUP if target domain h/w state does not allow reset 892 */ 893 CMD_RESET_DEASSERT = 2, 894 /** 895 * @brief Assert and deassert the module reset 896 * 897 * mrq_response::err is 0 if the operation was successful, or @n 898 * -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n 899 * -#BPMP_EACCES if mrq master is not an owner of target domain reset @n 900 * -#BPMP_ENOTSUP if target domain h/w state does not allow reset 901 */ 902 CMD_RESET_MODULE = 3, 903 /** 904 * @brief Get the highest reset ID 905 * 906 * mrq_response::err is 0 if the operation was successful, or @n 907 * -#BPMP_ENODEV if no reset domains are supported (number of IDs is 0) 908 */ 909 CMD_RESET_GET_MAX_ID = 4, 910 911 /** @brief Not part of ABI and subject to change */ 912 CMD_RESET_MAX, 913 }; 914 915 /** 916 * @brief Request with MRQ_RESET 917 * 918 * Used by the sender of an #MRQ_RESET message to request BPMP to 919 * assert or or deassert a given reset line. 920 */ 921 struct mrq_reset_request { 922 /** @brief Reset action to perform (@ref mrq_reset_commands) */ 923 uint32_t cmd; 924 /** @brief Id of the reset to affected */ 925 uint32_t reset_id; 926 } BPMP_ABI_PACKED; 927 928 /** 929 * @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When 930 * this sub-command is not supported, firmware will return -BPMP_EBADCMD 931 * in mrq_response::err. 932 */ 933 struct cmd_reset_get_max_id_response { 934 /** @brief Max reset id */ 935 uint32_t max_id; 936 } BPMP_ABI_PACKED; 937 938 /** 939 * @brief Response with MRQ_RESET 940 * 941 * Each sub-command supported by @ref mrq_reset_request may return 942 * sub-command-specific data. Some do and some do not as indicated 943 * in the following table 944 * 945 * | sub-command | payload | 946 * |----------------------|------------------| 947 * | CMD_RESET_ASSERT | - | 948 * | CMD_RESET_DEASSERT | - | 949 * | CMD_RESET_MODULE | - | 950 * | CMD_RESET_GET_MAX_ID | reset_get_max_id | 951 */ 952 struct mrq_reset_response { 953 union { 954 struct cmd_reset_get_max_id_response reset_get_max_id; 955 } BPMP_UNION_ANON; 956 } BPMP_ABI_PACKED; 957 958 /** @} Reset */ 959 960 /** 961 * @ingroup MRQ_Codes 962 * @def MRQ_I2C 963 * @brief Issue an i2c transaction 964 * 965 * * Platforms: T186, T194 966 * * Initiators: Any 967 * * Targets: BPMP 968 * * Request Payload: @ref mrq_i2c_request 969 * * Response Payload: @ref mrq_i2c_response 970 * 971 * @addtogroup I2C 972 * @{ 973 */ 974 #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE (MSG_DATA_MIN_SZ - 12U) 975 #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE (MSG_DATA_MIN_SZ - 4U) 976 977 #define SERIALI2C_TEN 0x0010U 978 #define SERIALI2C_RD 0x0001U 979 #define SERIALI2C_STOP 0x8000U 980 #define SERIALI2C_NOSTART 0x4000U 981 #define SERIALI2C_REV_DIR_ADDR 0x2000U 982 #define SERIALI2C_IGNORE_NAK 0x1000U 983 #define SERIALI2C_NO_RD_ACK 0x0800U 984 #define SERIALI2C_RECV_LEN 0x0400U 985 986 enum { 987 CMD_I2C_XFER = 1 988 }; 989 990 /** 991 * @brief Serializable i2c request 992 * 993 * Instances of this structure are packed (little-endian) into 994 * cmd_i2c_xfer_request::data_buf. Each instance represents a single 995 * transaction (or a portion of a transaction with repeated starts) on 996 * an i2c bus. 997 * 998 * Because these structures are packed, some instances are likely to 999 * be misaligned. Additionally because #data is variable length, it is 1000 * not possible to iterate through a serialized list of these 1001 * structures without inspecting #len in each instance. It may be 1002 * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf 1003 * manually rather than using this structure definition. 1004 */ 1005 struct serial_i2c_request { 1006 /** @brief I2C slave address */ 1007 uint16_t addr; 1008 /** @brief Bitmask of SERIALI2C_ flags */ 1009 uint16_t flags; 1010 /** @brief Length of I2C transaction in bytes */ 1011 uint16_t len; 1012 /** @brief For write transactions only, #len bytes of data */ 1013 uint8_t data[]; 1014 } BPMP_ABI_PACKED; 1015 1016 /** 1017 * @brief Trigger one or more i2c transactions 1018 */ 1019 struct cmd_i2c_xfer_request { 1020 /** 1021 * @brief Tegra PWR_I2C bus identifier 1022 * 1023 * @cond (bpmp_t234 || bpmp_t239 || bpmp_t194) 1024 * Must be set to 5. 1025 * @endcond (bpmp_t234 || bpmp_t239 || bpmp_t194) 1026 * @cond bpmp_th500 1027 * Must be set to 1. 1028 * @endcond bpmp_th500 1029 * 1030 */ 1031 uint32_t bus_id; 1032 1033 /** @brief Count of valid bytes in #data_buf*/ 1034 uint32_t data_size; 1035 1036 /** @brief Serialized packed instances of @ref serial_i2c_request*/ 1037 uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE]; 1038 } BPMP_ABI_PACKED; 1039 1040 /** 1041 * @brief Container for data read from the i2c bus 1042 * 1043 * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute 1044 * zero or more I2C reads. The data read from the bus is serialized 1045 * into #data_buf. 1046 */ 1047 struct cmd_i2c_xfer_response { 1048 /** @brief Count of valid bytes in #data_buf*/ 1049 uint32_t data_size; 1050 /** @brief I2c read data */ 1051 uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE]; 1052 } BPMP_ABI_PACKED; 1053 1054 /** 1055 * @brief Request with #MRQ_I2C 1056 */ 1057 struct mrq_i2c_request { 1058 /** @brief Always CMD_I2C_XFER (i.e. 1) */ 1059 uint32_t cmd; 1060 /** @brief Parameters of the transfer request */ 1061 struct cmd_i2c_xfer_request xfer; 1062 } BPMP_ABI_PACKED; 1063 1064 /** 1065 * @brief Response to #MRQ_I2C 1066 * 1067 * mrq_response:err is 1068 * 0: Success 1069 * -#BPMP_EBADCMD: if mrq_i2c_request::cmd is other than 1 1070 * -#BPMP_EINVAL: if cmd_i2c_xfer_request does not contain correctly formatted request 1071 * -#BPMP_ENODEV: if cmd_i2c_xfer_request::bus_id is not supported by BPMP 1072 * -#BPMP_EACCES: if i2c transaction is not allowed due to firewall rules 1073 * -#BPMP_ETIMEDOUT: if i2c transaction times out 1074 * -#BPMP_ENXIO: if i2c slave device does not reply with ACK to the transaction 1075 * -#BPMP_EAGAIN: if ARB_LOST condition is detected by the i2c controller 1076 * -#BPMP_EIO: any other i2c controller error code than NO_ACK or ARB_LOST 1077 */ 1078 struct mrq_i2c_response { 1079 struct cmd_i2c_xfer_response xfer; 1080 } BPMP_ABI_PACKED; 1081 1082 /** @} I2C */ 1083 1084 /** 1085 * @ingroup MRQ_Codes 1086 * @def MRQ_CLK 1087 * @brief Perform a clock operation 1088 * 1089 * * Platforms: T186, T194 1090 * * Initiators: Any 1091 * * Targets: BPMP 1092 * * Request Payload: @ref mrq_clk_request 1093 * * Response Payload: @ref mrq_clk_response 1094 * 1095 * @addtogroup Clocks 1096 * @{ 1097 */ 1098 enum { 1099 CMD_CLK_GET_RATE = 1, 1100 CMD_CLK_SET_RATE = 2, 1101 CMD_CLK_ROUND_RATE = 3, 1102 CMD_CLK_GET_PARENT = 4, 1103 CMD_CLK_SET_PARENT = 5, 1104 CMD_CLK_IS_ENABLED = 6, 1105 CMD_CLK_ENABLE = 7, 1106 CMD_CLK_DISABLE = 8, 1107 /** @cond DEPRECATED */ 1108 CMD_CLK_PROPERTIES = 9, 1109 CMD_CLK_POSSIBLE_PARENTS = 10, 1110 CMD_CLK_NUM_POSSIBLE_PARENTS = 11, 1111 CMD_CLK_GET_POSSIBLE_PARENT = 12, 1112 CMD_CLK_RESET_REFCOUNTS = 13, 1113 /** @endcond DEPRECATED */ 1114 CMD_CLK_GET_ALL_INFO = 14, 1115 CMD_CLK_GET_MAX_CLK_ID = 15, 1116 CMD_CLK_GET_FMAX_AT_VMIN = 16, 1117 CMD_CLK_MAX, 1118 }; 1119 1120 #define BPMP_CLK_HAS_MUX (1U << 0U) 1121 #define BPMP_CLK_HAS_SET_RATE (1U << 1U) 1122 #define BPMP_CLK_IS_ROOT (1U << 2U) 1123 #define BPMP_CLK_IS_VAR_ROOT (1U << 3U) 1124 /** 1125 * @brief Protection against rate and parent changes 1126 * 1127 * #MRQ_CLK command #CMD_CLK_SET_RATE or #MRQ_CLK command #CMD_CLK_SET_PARENT will return 1128 * -#BPMP_EACCES. 1129 */ 1130 #define BPMP_CLK_RATE_PARENT_CHANGE_DENIED (1U << 30) 1131 1132 /** 1133 * @brief Protection against state changes 1134 * 1135 * #MRQ_CLK command #CMD_CLK_ENABLE or #MRQ_CLK command #CMD_CLK_DISABLE will return 1136 * -#BPMP_EACCES. 1137 */ 1138 #define BPMP_CLK_STATE_CHANGE_DENIED (1U << 31) 1139 1140 #define MRQ_CLK_NAME_MAXLEN 40U 1141 #define MRQ_CLK_MAX_PARENTS 16U 1142 1143 /** @private */ 1144 struct cmd_clk_get_rate_request { 1145 BPMP_ABI_EMPTY 1146 } BPMP_ABI_PACKED; 1147 1148 struct cmd_clk_get_rate_response { 1149 int64_t rate; 1150 } BPMP_ABI_PACKED; 1151 1152 struct cmd_clk_set_rate_request { 1153 int32_t unused; 1154 int64_t rate; 1155 } BPMP_ABI_PACKED; 1156 1157 struct cmd_clk_set_rate_response { 1158 int64_t rate; 1159 } BPMP_ABI_PACKED; 1160 1161 struct cmd_clk_round_rate_request { 1162 int32_t unused; 1163 int64_t rate; 1164 } BPMP_ABI_PACKED; 1165 1166 struct cmd_clk_round_rate_response { 1167 int64_t rate; 1168 } BPMP_ABI_PACKED; 1169 1170 /** @private */ 1171 struct cmd_clk_get_parent_request { 1172 BPMP_ABI_EMPTY 1173 } BPMP_ABI_PACKED; 1174 1175 struct cmd_clk_get_parent_response { 1176 uint32_t parent_id; 1177 } BPMP_ABI_PACKED; 1178 1179 struct cmd_clk_set_parent_request { 1180 uint32_t parent_id; 1181 } BPMP_ABI_PACKED; 1182 1183 struct cmd_clk_set_parent_response { 1184 uint32_t parent_id; 1185 } BPMP_ABI_PACKED; 1186 1187 /** @private */ 1188 struct cmd_clk_is_enabled_request { 1189 BPMP_ABI_EMPTY 1190 } BPMP_ABI_PACKED; 1191 1192 /** 1193 * @brief Response data to #MRQ_CLK sub-command CMD_CLK_IS_ENABLED 1194 */ 1195 struct cmd_clk_is_enabled_response { 1196 /** 1197 * @brief The state of the clock that has been succesfully 1198 * requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the 1199 * master invoking the command earlier. 1200 * 1201 * The state may not reflect the physical state of the clock 1202 * if there are some other masters requesting it to be 1203 * enabled. 1204 * 1205 * Value 0 is disabled, all other values indicate enabled. 1206 */ 1207 int32_t state; 1208 } BPMP_ABI_PACKED; 1209 1210 /** @private */ 1211 struct cmd_clk_enable_request { 1212 BPMP_ABI_EMPTY 1213 } BPMP_ABI_PACKED; 1214 1215 /** @private */ 1216 struct cmd_clk_enable_response { 1217 BPMP_ABI_EMPTY 1218 } BPMP_ABI_PACKED; 1219 1220 /** @private */ 1221 struct cmd_clk_disable_request { 1222 BPMP_ABI_EMPTY 1223 } BPMP_ABI_PACKED; 1224 1225 /** @private */ 1226 struct cmd_clk_disable_response { 1227 BPMP_ABI_EMPTY 1228 } BPMP_ABI_PACKED; 1229 1230 /** @cond DEPRECATED */ 1231 /** @private */ 1232 struct cmd_clk_properties_request { 1233 BPMP_ABI_EMPTY 1234 } BPMP_ABI_PACKED; 1235 1236 /** @todo flags need to be spelled out here */ 1237 struct cmd_clk_properties_response { 1238 uint32_t flags; 1239 } BPMP_ABI_PACKED; 1240 1241 /** @private */ 1242 struct cmd_clk_possible_parents_request { 1243 BPMP_ABI_EMPTY 1244 } BPMP_ABI_PACKED; 1245 1246 struct cmd_clk_possible_parents_response { 1247 uint8_t num_parents; 1248 uint8_t reserved[3]; 1249 uint32_t parent_id[MRQ_CLK_MAX_PARENTS]; 1250 } BPMP_ABI_PACKED; 1251 1252 /** @private */ 1253 struct cmd_clk_num_possible_parents_request { 1254 BPMP_ABI_EMPTY 1255 } BPMP_ABI_PACKED; 1256 1257 struct cmd_clk_num_possible_parents_response { 1258 uint8_t num_parents; 1259 } BPMP_ABI_PACKED; 1260 1261 struct cmd_clk_get_possible_parent_request { 1262 uint8_t parent_idx; 1263 } BPMP_ABI_PACKED; 1264 1265 struct cmd_clk_get_possible_parent_response { 1266 uint32_t parent_id; 1267 } BPMP_ABI_PACKED; 1268 /** @endcond DEPRECATED */ 1269 1270 /** @private */ 1271 struct cmd_clk_get_all_info_request { 1272 BPMP_ABI_EMPTY 1273 } BPMP_ABI_PACKED; 1274 1275 struct cmd_clk_get_all_info_response { 1276 uint32_t flags; 1277 uint32_t parent; 1278 uint32_t parents[MRQ_CLK_MAX_PARENTS]; 1279 uint8_t num_parents; 1280 uint8_t name[MRQ_CLK_NAME_MAXLEN]; 1281 } BPMP_ABI_PACKED; 1282 1283 /** @private */ 1284 struct cmd_clk_get_max_clk_id_request { 1285 BPMP_ABI_EMPTY 1286 } BPMP_ABI_PACKED; 1287 1288 struct cmd_clk_get_max_clk_id_response { 1289 uint32_t max_id; 1290 } BPMP_ABI_PACKED; 1291 1292 /** @private */ 1293 struct cmd_clk_get_fmax_at_vmin_request { 1294 BPMP_ABI_EMPTY 1295 } BPMP_ABI_PACKED; 1296 1297 struct cmd_clk_get_fmax_at_vmin_response { 1298 int64_t rate; 1299 } BPMP_ABI_PACKED; 1300 1301 1302 /** 1303 * @ingroup Clocks 1304 * @brief Request with #MRQ_CLK 1305 * 1306 * Used by the sender of an #MRQ_CLK message to control clocks. The 1307 * clk_request is split into several sub-commands. Some sub-commands 1308 * require no additional data. Others have a sub-command specific 1309 * payload 1310 * 1311 * |sub-command |payload | 1312 * |----------------------------|-----------------------| 1313 * |CMD_CLK_GET_RATE |- | 1314 * |CMD_CLK_SET_RATE |clk_set_rate | 1315 * |CMD_CLK_ROUND_RATE |clk_round_rate | 1316 * |CMD_CLK_GET_PARENT |- | 1317 * |CMD_CLK_SET_PARENT |clk_set_parent | 1318 * |CMD_CLK_IS_ENABLED |- | 1319 * |CMD_CLK_ENABLE |- | 1320 * |CMD_CLK_DISABLE |- | 1321 * |CMD_CLK_GET_ALL_INFO |- | 1322 * |CMD_CLK_GET_MAX_CLK_ID |- | 1323 * |CMD_CLK_GET_FMAX_AT_VMIN |- 1324 * | 1325 * 1326 */ 1327 1328 /** @cond DEPRECATED 1329 * 1330 * Older versions of firmware also supported following sub-commands: 1331 * |CMD_CLK_PROPERTIES |- | 1332 * |CMD_CLK_POSSIBLE_PARENTS |- | 1333 * |CMD_CLK_NUM_POSSIBLE_PARENTS|- | 1334 * |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parent| 1335 * |CMD_CLK_RESET_REFCOUNTS |- | 1336 * 1337 * @endcond DEPRECATED */ 1338 1339 struct mrq_clk_request { 1340 /** @brief Sub-command and clock id concatenated to 32-bit word. 1341 * - bits[31..24] is the sub-cmd. 1342 * - bits[23..0] is the clock id 1343 */ 1344 uint32_t cmd_and_id; 1345 1346 union { 1347 /** @private */ 1348 struct cmd_clk_get_rate_request clk_get_rate; 1349 struct cmd_clk_set_rate_request clk_set_rate; 1350 struct cmd_clk_round_rate_request clk_round_rate; 1351 /** @private */ 1352 struct cmd_clk_get_parent_request clk_get_parent; 1353 struct cmd_clk_set_parent_request clk_set_parent; 1354 /** @private */ 1355 struct cmd_clk_enable_request clk_enable; 1356 /** @private */ 1357 struct cmd_clk_disable_request clk_disable; 1358 /** @private */ 1359 struct cmd_clk_is_enabled_request clk_is_enabled; 1360 /** @cond DEPRECATED */ 1361 /** @private */ 1362 struct cmd_clk_properties_request clk_properties; 1363 /** @private */ 1364 struct cmd_clk_possible_parents_request clk_possible_parents; 1365 /** @private */ 1366 struct cmd_clk_num_possible_parents_request clk_num_possible_parents; 1367 struct cmd_clk_get_possible_parent_request clk_get_possible_parent; 1368 /** @endcond DEPRECATED */ 1369 /** @private */ 1370 struct cmd_clk_get_all_info_request clk_get_all_info; 1371 /** @private */ 1372 struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id; 1373 /** @private */ 1374 struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin; 1375 } BPMP_UNION_ANON; 1376 } BPMP_ABI_PACKED; 1377 1378 /** 1379 * @ingroup Clocks 1380 * @brief Response to MRQ_CLK 1381 * 1382 * Each sub-command supported by @ref mrq_clk_request may return 1383 * sub-command-specific data. Some do and some do not as indicated in 1384 * the following table 1385 * 1386 * |sub-command |payload | 1387 * |----------------------------|------------------------| 1388 * |CMD_CLK_GET_RATE |clk_get_rate | 1389 * |CMD_CLK_SET_RATE |clk_set_rate | 1390 * |CMD_CLK_ROUND_RATE |clk_round_rate | 1391 * |CMD_CLK_GET_PARENT |clk_get_parent | 1392 * |CMD_CLK_SET_PARENT |clk_set_parent | 1393 * |CMD_CLK_IS_ENABLED |clk_is_enabled | 1394 * |CMD_CLK_ENABLE |- | 1395 * |CMD_CLK_DISABLE |- | 1396 * |CMD_CLK_GET_ALL_INFO |clk_get_all_info | 1397 * |CMD_CLK_GET_MAX_CLK_ID |clk_get_max_id | 1398 * |CMD_CLK_GET_FMAX_AT_VMIN |clk_get_fmax_at_vmin | 1399 * 1400 */ 1401 1402 /** @cond DEPRECATED 1403 * 1404 * Older versions of firmware also supported following sub-commands: 1405 * |CMD_CLK_PROPERTIES |clk_properties | 1406 * |CMD_CLK_POSSIBLE_PARENTS |clk_possible_parents | 1407 * |CMD_CLK_NUM_POSSIBLE_PARENTS|clk_num_possible_parents| 1408 * |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parents| 1409 * |CMD_CLK_RESET_REFCOUNTS |- | 1410 * 1411 * @endcond DEPRECATED */ 1412 1413 struct mrq_clk_response { 1414 union { 1415 struct cmd_clk_get_rate_response clk_get_rate; 1416 struct cmd_clk_set_rate_response clk_set_rate; 1417 struct cmd_clk_round_rate_response clk_round_rate; 1418 struct cmd_clk_get_parent_response clk_get_parent; 1419 struct cmd_clk_set_parent_response clk_set_parent; 1420 /** @private */ 1421 struct cmd_clk_enable_response clk_enable; 1422 /** @private */ 1423 struct cmd_clk_disable_response clk_disable; 1424 struct cmd_clk_is_enabled_response clk_is_enabled; 1425 /** @cond DEPRECATED */ 1426 struct cmd_clk_properties_response clk_properties; 1427 struct cmd_clk_possible_parents_response clk_possible_parents; 1428 struct cmd_clk_num_possible_parents_response clk_num_possible_parents; 1429 struct cmd_clk_get_possible_parent_response clk_get_possible_parent; 1430 /** @endcond DEPRECATED */ 1431 struct cmd_clk_get_all_info_response clk_get_all_info; 1432 struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id; 1433 struct cmd_clk_get_fmax_at_vmin_response clk_get_fmax_at_vmin; 1434 } BPMP_UNION_ANON; 1435 } BPMP_ABI_PACKED; 1436 1437 /** @} Clocks */ 1438 1439 /** 1440 * @ingroup MRQ_Codes 1441 * @def MRQ_QUERY_ABI 1442 * @brief Check if an MRQ is implemented 1443 * 1444 * * Platforms: All 1445 * * Initiators: Any 1446 * * Targets: Any except DMCE 1447 * * Request Payload: @ref mrq_query_abi_request 1448 * * Response Payload: @ref mrq_query_abi_response 1449 */ 1450 1451 /** 1452 * @ingroup ABI_info 1453 * @brief Request with MRQ_QUERY_ABI 1454 * 1455 * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported 1456 * by the recipient. 1457 */ 1458 struct mrq_query_abi_request { 1459 /** @brief MRQ code to query */ 1460 uint32_t mrq; 1461 } BPMP_ABI_PACKED; 1462 1463 /** 1464 * @ingroup ABI_info 1465 * @brief Response to MRQ_QUERY_ABI 1466 * 1467 * @note mrq_response::err of 0 indicates that the query was 1468 * successful, not that the MRQ itself is supported! 1469 */ 1470 struct mrq_query_abi_response { 1471 /** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */ 1472 int32_t status; 1473 } BPMP_ABI_PACKED; 1474 1475 /** 1476 * 1477 * @ingroup MRQ_Codes 1478 * @def MRQ_PG 1479 * @brief Control power-gating state of a partition. In contrast to 1480 * MRQ_PG_UPDATE_STATE, operations that change the power partition 1481 * state are NOT reference counted 1482 * 1483 * @cond (bpmp_t194 || bpmp_t186) 1484 * @note On T194 and earlier BPMP-FW forcefully turns off some partitions as 1485 * part of SC7 entry because their state cannot be adequately restored on exit. 1486 * Therefore, it is recommended to power off all domains via MRQ_PG prior to SC7 1487 * entry. 1488 * See @ref bpmp_pdomain_ids for further detail. 1489 * @endcond (bpmp_t194 || bpmp_t186) 1490 * 1491 * * Platforms: T186, T194 1492 * * Initiators: Any 1493 * * Targets: BPMP 1494 * * Request Payload: @ref mrq_pg_request 1495 * * Response Payload: @ref mrq_pg_response 1496 * 1497 * @addtogroup Powergating 1498 * @{ 1499 */ 1500 enum mrq_pg_cmd { 1501 /** 1502 * @brief Check whether the BPMP driver supports the specified 1503 * request type 1504 * 1505 * mrq_response::err is 0 if the specified request is 1506 * supported and -#BPMP_ENODEV otherwise. 1507 */ 1508 CMD_PG_QUERY_ABI = 0, 1509 1510 /** 1511 * @brief Set the current state of specified power domain. The 1512 * possible values for power domains are defined in enum 1513 * pg_states 1514 * 1515 * mrq_response:err is 1516 * 0: Success 1517 * -#BPMP_EINVAL: Invalid request parameters 1518 */ 1519 CMD_PG_SET_STATE = 1, 1520 1521 /** 1522 * @brief Get the current state of specified power domain. The 1523 * possible values for power domains are defined in enum 1524 * pg_states 1525 * 1526 * mrq_response:err is 1527 * 0: Success 1528 * -#BPMP_EINVAL: Invalid request parameters 1529 */ 1530 CMD_PG_GET_STATE = 2, 1531 1532 /** 1533 * @brief Get the name string of specified power domain id. 1534 * 1535 * mrq_response:err is 1536 * 0: Success 1537 * -#BPMP_EINVAL: Invalid request parameters 1538 */ 1539 CMD_PG_GET_NAME = 3, 1540 1541 1542 /** 1543 * @brief Get the highest power domain id in the system. Not 1544 * all IDs between 0 and max_id are valid IDs. 1545 * 1546 * mrq_response:err is 1547 * 0: Success 1548 * -#BPMP_EINVAL: Invalid request parameters 1549 */ 1550 CMD_PG_GET_MAX_ID = 4, 1551 }; 1552 1553 #define MRQ_PG_NAME_MAXLEN 40 1554 1555 enum pg_states { 1556 /** @brief Power domain is OFF */ 1557 PG_STATE_OFF = 0, 1558 /** @brief Power domain is ON */ 1559 PG_STATE_ON = 1, 1560 /** 1561 * @brief a legacy state where power domain and the clock 1562 * associated to the domain are ON. 1563 * This state is only supported in T186, and the use of it is 1564 * deprecated. 1565 */ 1566 PG_STATE_RUNNING = 2, 1567 }; 1568 1569 struct cmd_pg_query_abi_request { 1570 /** @ref mrq_pg_cmd */ 1571 uint32_t type; 1572 } BPMP_ABI_PACKED; 1573 1574 struct cmd_pg_set_state_request { 1575 /** @ref pg_states */ 1576 uint32_t state; 1577 } BPMP_ABI_PACKED; 1578 1579 /** 1580 * @brief Response data to #MRQ_PG sub command #CMD_PG_GET_STATE 1581 */ 1582 struct cmd_pg_get_state_response { 1583 /** 1584 * @brief The state of the power partition that has been 1585 * succesfuly requested by the master earlier using #MRQ_PG 1586 * command #CMD_PG_SET_STATE. 1587 * 1588 * The state may not reflect the physical state of the power 1589 * partition if there are some other masters requesting it to 1590 * be enabled. 1591 * 1592 * See @ref pg_states for possible values 1593 */ 1594 uint32_t state; 1595 } BPMP_ABI_PACKED; 1596 1597 struct cmd_pg_get_name_response { 1598 uint8_t name[MRQ_PG_NAME_MAXLEN]; 1599 } BPMP_ABI_PACKED; 1600 1601 struct cmd_pg_get_max_id_response { 1602 uint32_t max_id; 1603 } BPMP_ABI_PACKED; 1604 1605 /** 1606 * @brief Request with #MRQ_PG 1607 * 1608 * Used by the sender of an #MRQ_PG message to control power 1609 * partitions. The pg_request is split into several sub-commands. Some 1610 * sub-commands require no additional data. Others have a sub-command 1611 * specific payload 1612 * 1613 * |sub-command |payload | 1614 * |----------------------------|-----------------------| 1615 * |CMD_PG_QUERY_ABI | query_abi | 1616 * |CMD_PG_SET_STATE | set_state | 1617 * |CMD_PG_GET_STATE | - | 1618 * |CMD_PG_GET_NAME | - | 1619 * |CMD_PG_GET_MAX_ID | - | 1620 * 1621 */ 1622 struct mrq_pg_request { 1623 uint32_t cmd; 1624 uint32_t id; 1625 union { 1626 struct cmd_pg_query_abi_request query_abi; 1627 struct cmd_pg_set_state_request set_state; 1628 } BPMP_UNION_ANON; 1629 } BPMP_ABI_PACKED; 1630 1631 /** 1632 * @brief Response to MRQ_PG 1633 * 1634 * Each sub-command supported by @ref mrq_pg_request may return 1635 * sub-command-specific data. Some do and some do not as indicated in 1636 * the following table 1637 * 1638 * |sub-command |payload | 1639 * |----------------------------|-----------------------| 1640 * |CMD_PG_QUERY_ABI | - | 1641 * |CMD_PG_SET_STATE | - | 1642 * |CMD_PG_GET_STATE | get_state | 1643 * |CMD_PG_GET_NAME | get_name | 1644 * |CMD_PG_GET_MAX_ID | get_max_id | 1645 */ 1646 struct mrq_pg_response { 1647 union { 1648 struct cmd_pg_get_state_response get_state; 1649 struct cmd_pg_get_name_response get_name; 1650 struct cmd_pg_get_max_id_response get_max_id; 1651 } BPMP_UNION_ANON; 1652 } BPMP_ABI_PACKED; 1653 1654 /** @} Powergating */ 1655 1656 /** 1657 * @ingroup MRQ_Codes 1658 * @def MRQ_THERMAL 1659 * @brief Interact with BPMP thermal framework 1660 * 1661 * * Platforms: T186, T194 1662 * * Initiators: Any 1663 * * Targets: Any 1664 * * Request Payload: TODO 1665 * * Response Payload: TODO 1666 * 1667 * @addtogroup Thermal 1668 * 1669 * The BPMP firmware includes a thermal framework. Drivers within the 1670 * bpmp firmware register with the framework to provide thermal 1671 * zones. Each thermal zone corresponds to an entity whose temperature 1672 * can be measured. The framework also has a notion of trip points. A 1673 * trip point consists of a thermal zone id, a temperature, and a 1674 * callback routine. The framework invokes the callback when the zone 1675 * hits the indicated temperature. The BPMP firmware uses this thermal 1676 * framework interally to implement various temperature-dependent 1677 * functions. 1678 * 1679 * Software on the CPU can use #MRQ_THERMAL (with payload @ref 1680 * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal 1681 * framework. The CPU must It can query the number of supported zones, 1682 * query zone temperatures, and set trip points. 1683 * 1684 * When a trip point set by the CPU gets crossed, BPMP firmware issues 1685 * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a 1686 * payload of @ref mrq_thermal_bpmp_to_host_request. 1687 * @{ 1688 */ 1689 enum mrq_thermal_host_to_bpmp_cmd { 1690 /** 1691 * @brief Check whether the BPMP driver supports the specified 1692 * request type. 1693 * 1694 * Host needs to supply request parameters. 1695 * 1696 * mrq_response::err is 0 if the specified request is 1697 * supported and -#BPMP_ENODEV otherwise. 1698 */ 1699 CMD_THERMAL_QUERY_ABI = 0, 1700 1701 /** 1702 * @brief Get the current temperature of the specified zone. 1703 * 1704 * Host needs to supply request parameters. 1705 * 1706 * mrq_response::err is 1707 * * 0: Temperature query succeeded. 1708 * * -#BPMP_EINVAL: Invalid request parameters. 1709 * * -#BPMP_ENOENT: No driver registered for thermal zone.. 1710 * * -#BPMP_EFAULT: Problem reading temperature measurement. 1711 */ 1712 CMD_THERMAL_GET_TEMP = 1, 1713 1714 /** 1715 * @brief Enable or disable and set the lower and upper 1716 * thermal limits for a thermal trip point. Each zone has 1717 * one trip point. 1718 * 1719 * Host needs to supply request parameters. Once the 1720 * temperature hits a trip point, the BPMP will send a message 1721 * to the CPU having MRQ=MRQ_THERMAL and 1722 * type=CMD_THERMAL_HOST_TRIP_REACHED 1723 * 1724 * mrq_response::err is 1725 * * 0: Trip successfully set. 1726 * * -#BPMP_EINVAL: Invalid request parameters. 1727 * * -#BPMP_ENOENT: No driver registered for thermal zone. 1728 * * -#BPMP_EFAULT: Problem setting trip point. 1729 */ 1730 CMD_THERMAL_SET_TRIP = 2, 1731 1732 /** 1733 * @brief Get the number of supported thermal zones. 1734 * 1735 * No request parameters required. 1736 * 1737 * mrq_response::err is always 0, indicating success. 1738 */ 1739 CMD_THERMAL_GET_NUM_ZONES = 3, 1740 1741 /** 1742 * @brief Get the thermtrip of the specified zone. 1743 * 1744 * Host needs to supply request parameters. 1745 * 1746 * mrq_response::err is 1747 * * 0: Valid zone information returned. 1748 * * -#BPMP_EINVAL: Invalid request parameters. 1749 * * -#BPMP_ENOENT: No driver registered for thermal zone. 1750 * * -#BPMP_ERANGE if thermtrip is invalid or disabled. 1751 * * -#BPMP_EFAULT: Problem reading zone information. 1752 */ 1753 CMD_THERMAL_GET_THERMTRIP = 4, 1754 1755 /** @brief: number of supported host-to-bpmp commands. May 1756 * increase in future 1757 */ 1758 CMD_THERMAL_HOST_TO_BPMP_NUM 1759 }; 1760 1761 enum mrq_thermal_bpmp_to_host_cmd { 1762 /** 1763 * @brief Indication that the temperature for a zone has 1764 * exceeded the range indicated in the thermal trip point 1765 * for the zone. 1766 * 1767 * BPMP needs to supply request parameters. Host only needs to 1768 * acknowledge. 1769 */ 1770 CMD_THERMAL_HOST_TRIP_REACHED = 100, 1771 1772 /** @brief: number of supported bpmp-to-host commands. May 1773 * increase in future 1774 */ 1775 CMD_THERMAL_BPMP_TO_HOST_NUM 1776 }; 1777 1778 /* 1779 * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI 1780 * 1781 * zone: Request type for which to check existence. 1782 */ 1783 struct cmd_thermal_query_abi_request { 1784 uint32_t type; 1785 } BPMP_ABI_PACKED; 1786 1787 /* 1788 * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP 1789 * 1790 * zone: Number of thermal zone. 1791 */ 1792 struct cmd_thermal_get_temp_request { 1793 uint32_t zone; 1794 } BPMP_ABI_PACKED; 1795 1796 /* 1797 * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP 1798 * 1799 * error: 0 if request succeeded. 1800 * -BPMP_EINVAL if request parameters were invalid. 1801 * -BPMP_ENOENT if no driver was registered for the specified thermal zone. 1802 * -BPMP_EFAULT for other thermal zone driver errors. 1803 * temp: Current temperature in millicelsius. 1804 */ 1805 struct cmd_thermal_get_temp_response { 1806 int32_t temp; 1807 } BPMP_ABI_PACKED; 1808 1809 /* 1810 * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP 1811 * 1812 * zone: Number of thermal zone. 1813 * low: Temperature of lower trip point in millicelsius 1814 * high: Temperature of upper trip point in millicelsius 1815 * enabled: 1 to enable trip point, 0 to disable trip point 1816 */ 1817 struct cmd_thermal_set_trip_request { 1818 uint32_t zone; 1819 int32_t low; 1820 int32_t high; 1821 uint32_t enabled; 1822 } BPMP_ABI_PACKED; 1823 1824 /* 1825 * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED 1826 * 1827 * zone: Number of thermal zone where trip point was reached. 1828 */ 1829 struct cmd_thermal_host_trip_reached_request { 1830 uint32_t zone; 1831 } BPMP_ABI_PACKED; 1832 1833 /* 1834 * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES 1835 * 1836 * num: Number of supported thermal zones. The thermal zones are indexed 1837 * starting from zero. 1838 */ 1839 struct cmd_thermal_get_num_zones_response { 1840 uint32_t num; 1841 } BPMP_ABI_PACKED; 1842 1843 /* 1844 * Host->BPMP request data for request type CMD_THERMAL_GET_THERMTRIP 1845 * 1846 * zone: Number of thermal zone. 1847 */ 1848 struct cmd_thermal_get_thermtrip_request { 1849 uint32_t zone; 1850 } BPMP_ABI_PACKED; 1851 1852 /* 1853 * BPMP->Host reply data for request CMD_THERMAL_GET_THERMTRIP 1854 * 1855 * thermtrip: HW shutdown temperature in millicelsius. 1856 */ 1857 struct cmd_thermal_get_thermtrip_response { 1858 int32_t thermtrip; 1859 } BPMP_ABI_PACKED; 1860 1861 /* 1862 * Host->BPMP request data. 1863 * 1864 * Reply type is union mrq_thermal_bpmp_to_host_response. 1865 * 1866 * type: Type of request. Values listed in enum mrq_thermal_type. 1867 * data: Request type specific parameters. 1868 */ 1869 struct mrq_thermal_host_to_bpmp_request { 1870 uint32_t type; 1871 union { 1872 struct cmd_thermal_query_abi_request query_abi; 1873 struct cmd_thermal_get_temp_request get_temp; 1874 struct cmd_thermal_set_trip_request set_trip; 1875 struct cmd_thermal_get_thermtrip_request get_thermtrip; 1876 } BPMP_UNION_ANON; 1877 } BPMP_ABI_PACKED; 1878 1879 /* 1880 * BPMP->Host request data. 1881 * 1882 * type: Type of request. Values listed in enum mrq_thermal_type. 1883 * data: Request type specific parameters. 1884 */ 1885 struct mrq_thermal_bpmp_to_host_request { 1886 uint32_t type; 1887 union { 1888 struct cmd_thermal_host_trip_reached_request host_trip_reached; 1889 } BPMP_UNION_ANON; 1890 } BPMP_ABI_PACKED; 1891 1892 /* 1893 * Data in reply to a Host->BPMP request. 1894 */ 1895 union mrq_thermal_bpmp_to_host_response { 1896 struct cmd_thermal_get_temp_response get_temp; 1897 struct cmd_thermal_get_thermtrip_response get_thermtrip; 1898 struct cmd_thermal_get_num_zones_response get_num_zones; 1899 } BPMP_ABI_PACKED; 1900 1901 /** @} Thermal */ 1902 1903 /** 1904 * @ingroup MRQ_Codes 1905 * @def MRQ_OC_STATUS 1906 * @brief Query over current status 1907 * 1908 * * Platforms: T234 1909 * @cond bpmp_t234 1910 * * Initiators: CCPLEX 1911 * * Targets: BPMP 1912 * * Request Payload: N/A 1913 * * Response Payload: @ref mrq_oc_status_response 1914 * 1915 * @addtogroup OC_status 1916 * @{ 1917 */ 1918 1919 #define OC_STATUS_MAX_SIZE 24U 1920 1921 /* 1922 * @brief Response to #MRQ_OC_STATUS 1923 * 1924 * throt_en: Value for each OC alarm where zero signifies throttle is 1925 * disabled, and non-zero throttle is enabled. 1926 * event_cnt: Total number of OC events for each OC alarm. 1927 * 1928 * mrq_response::err is 0 if the operation was successful and 1929 * -#BPMP_ENODEV otherwise. 1930 */ 1931 struct mrq_oc_status_response { 1932 uint8_t throt_en[OC_STATUS_MAX_SIZE]; 1933 uint32_t event_cnt[OC_STATUS_MAX_SIZE]; 1934 } BPMP_ABI_PACKED; 1935 1936 /** @} OC_status */ 1937 /** @endcond bpmp_t234 */ 1938 1939 /** 1940 * @ingroup MRQ_Codes 1941 * @def MRQ_CPU_VHINT 1942 * @brief Query CPU voltage hint data 1943 * 1944 * * Platforms: T186 1945 * @cond bpmp_t186 1946 * * Initiators: CCPLEX 1947 * * Targets: BPMP 1948 * * Request Payload: @ref mrq_cpu_vhint_request 1949 * * Response Payload: N/A 1950 * 1951 * @addtogroup Vhint 1952 * @{ 1953 */ 1954 1955 /** 1956 * @brief Request with #MRQ_CPU_VHINT 1957 * 1958 * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data 1959 * from BPMP to memory space pointed by #addr. CCPLEX is responsible 1960 * to allocate sizeof(cpu_vhint_data) sized block of memory and 1961 * appropriately map it for BPMP before sending the request. 1962 */ 1963 struct mrq_cpu_vhint_request { 1964 /** @brief IOVA address for the #cpu_vhint_data */ 1965 uint32_t addr; 1966 /** @brief ID of the cluster whose data is requested */ 1967 uint32_t cluster_id; 1968 } BPMP_ABI_PACKED; 1969 1970 /** 1971 * @brief Description of the CPU v/f relation 1972 * 1973 * Used by #MRQ_CPU_VHINT call to carry data pointed by 1974 * #mrq_cpu_vhint_request::addr 1975 */ 1976 struct cpu_vhint_data { 1977 uint32_t ref_clk_hz; /**< reference frequency in Hz */ 1978 uint16_t pdiv; /**< post divider value */ 1979 uint16_t mdiv; /**< input divider value */ 1980 uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */ 1981 /** table of ndiv values as a function of vINDEX (voltage index) */ 1982 uint16_t ndiv[80]; 1983 /** minimum allowed NDIV value */ 1984 uint16_t ndiv_min; 1985 /** minimum allowed voltage hint value (as in vINDEX) */ 1986 uint16_t vfloor; 1987 /** maximum allowed voltage hint value (as in vINDEX) */ 1988 uint16_t vceil; 1989 /** post-multiplier for vindex value */ 1990 uint16_t vindex_mult; 1991 /** post-divider for vindex value */ 1992 uint16_t vindex_div; 1993 /** reserved for future use */ 1994 uint16_t reserved[328]; 1995 } BPMP_ABI_PACKED; 1996 1997 /** @} Vhint */ 1998 /** @endcond bpmp_t186 */ 1999 2000 /** 2001 * @ingroup MRQ_Codes 2002 * @def MRQ_ABI_RATCHET 2003 * @brief ABI ratchet value query 2004 * 2005 * * Platforms: T186, T194 2006 * * Initiators: Any 2007 * * Targets: BPMP 2008 * * Request Payload: @ref mrq_abi_ratchet_request 2009 * * Response Payload: @ref mrq_abi_ratchet_response 2010 * @addtogroup ABI_info 2011 * @{ 2012 */ 2013 2014 /** 2015 * @brief An ABI compatibility mechanism 2016 * 2017 * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future 2018 * revision of this header file. 2019 * 1. That future revision deprecates some MRQ 2020 * 2. That future revision introduces a breaking change to an existing 2021 * MRQ or 2022 * 3. A bug is discovered in an existing implementation of the BPMP-FW 2023 * (or possibly one of its clients) which warrants deprecating that 2024 * implementation. 2025 */ 2026 #define BPMP_ABI_RATCHET_VALUE 3 2027 2028 /** 2029 * @brief Request with #MRQ_ABI_RATCHET. 2030 * 2031 * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header 2032 * against which the requester was compiled. 2033 * 2034 * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may 2035 * reply with mrq_response::err = -#BPMP_ERANGE to indicate that 2036 * BPMP-FW cannot interoperate correctly with the requester. Requester 2037 * should cease further communication with BPMP. 2038 * 2039 * Otherwise, err shall be 0. 2040 */ 2041 struct mrq_abi_ratchet_request { 2042 /** @brief Requester's ratchet value */ 2043 uint16_t ratchet; 2044 }; 2045 2046 /** 2047 * @brief Response to #MRQ_ABI_RATCHET 2048 * 2049 * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header 2050 * against which BPMP firwmare was compiled. 2051 * 2052 * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE, 2053 * the requster must either interoperate with BPMP according to an ABI 2054 * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease 2055 * communication with BPMP. 2056 * 2057 * If mrq_response::err is 0 and ratchet is greater than or equal to the 2058 * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue 2059 * normal operation. 2060 */ 2061 struct mrq_abi_ratchet_response { 2062 /** @brief BPMP's ratchet value */ 2063 uint16_t ratchet; 2064 }; 2065 2066 /** @} ABI_info */ 2067 2068 /** 2069 * @ingroup MRQ_Codes 2070 * @def MRQ_EMC_DVFS_LATENCY 2071 * @brief Query frequency dependent EMC DVFS latency 2072 * 2073 * * Platforms: T186, T194, T234 2074 * * Initiators: CCPLEX 2075 * * Targets: BPMP 2076 * * Request Payload: N/A 2077 * * Response Payload: @ref mrq_emc_dvfs_latency_response 2078 * @addtogroup EMC 2079 * @{ 2080 */ 2081 2082 /** 2083 * @brief Used by @ref mrq_emc_dvfs_latency_response 2084 */ 2085 struct emc_dvfs_latency { 2086 /** @brief EMC DVFS node frequency in kHz */ 2087 uint32_t freq; 2088 /** @brief EMC DVFS latency in nanoseconds */ 2089 uint32_t latency; 2090 } BPMP_ABI_PACKED; 2091 2092 #define EMC_DVFS_LATENCY_MAX_SIZE 14 2093 /** 2094 * @brief Response to #MRQ_EMC_DVFS_LATENCY 2095 */ 2096 struct mrq_emc_dvfs_latency_response { 2097 /** @brief The number valid entries in #pairs */ 2098 uint32_t num_pairs; 2099 /** @brief EMC DVFS node <frequency, latency> information */ 2100 struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE]; 2101 } BPMP_ABI_PACKED; 2102 2103 /** @} EMC */ 2104 2105 /** 2106 * @ingroup MRQ_Codes 2107 * @def MRQ_EMC_DVFS_EMCHUB 2108 * @brief Query EMC HUB frequencies 2109 * 2110 * * Platforms: T234 onwards 2111 * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) 2112 * * Initiators: CCPLEX 2113 * * Targets: BPMP 2114 * * Request Payload: N/A 2115 * * Response Payload: @ref mrq_emc_dvfs_emchub_response 2116 * @addtogroup EMC 2117 * @{ 2118 */ 2119 2120 /** 2121 * @brief Used by @ref mrq_emc_dvfs_emchub_response 2122 */ 2123 struct emc_dvfs_emchub { 2124 /** @brief EMC DVFS node frequency in kHz */ 2125 uint32_t freq; 2126 /** @brief EMC HUB frequency in kHz */ 2127 uint32_t hub_freq; 2128 } BPMP_ABI_PACKED; 2129 2130 #define EMC_DVFS_EMCHUB_MAX_SIZE EMC_DVFS_LATENCY_MAX_SIZE 2131 /** 2132 * @brief Response to #MRQ_EMC_DVFS_EMCHUB 2133 */ 2134 struct mrq_emc_dvfs_emchub_response { 2135 /** @brief The number valid entries in #pairs */ 2136 uint32_t num_pairs; 2137 /** @brief EMC DVFS node <frequency, hub frequency> information */ 2138 struct emc_dvfs_emchub pairs[EMC_DVFS_EMCHUB_MAX_SIZE]; 2139 } BPMP_ABI_PACKED; 2140 2141 /** @} EMC */ 2142 /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2143 2144 /** 2145 * @ingroup MRQ_Codes 2146 * @def MRQ_EMC_DISP_RFL 2147 * @brief Set EMC display RFL handshake mode of operations 2148 * 2149 * * Platforms: T234 onwards 2150 * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) 2151 * * Initiators: CCPLEX 2152 * * Targets: BPMP 2153 * * Request Payload: @ref mrq_emc_disp_rfl_request 2154 * * Response Payload: N/A 2155 * 2156 * @addtogroup EMC 2157 * @{ 2158 */ 2159 2160 enum mrq_emc_disp_rfl_mode { 2161 /** @brief EMC display RFL handshake disabled */ 2162 EMC_DISP_RFL_MODE_DISABLED = 0, 2163 /** @brief EMC display RFL handshake enabled */ 2164 EMC_DISP_RFL_MODE_ENABLED = 1, 2165 }; 2166 2167 /** 2168 * @ingroup EMC 2169 * @brief Request with #MRQ_EMC_DISP_RFL 2170 * 2171 * Used by the sender of an #MRQ_EMC_DISP_RFL message to 2172 * request the mode of EMC display RFL handshake. 2173 * 2174 * mrq_response::err is 2175 * * 0: RFL mode is set successfully 2176 * * -#BPMP_EINVAL: invalid mode requested 2177 * * -#BPMP_ENOSYS: RFL handshake is not supported 2178 * * -#BPMP_EACCES: Permission denied 2179 * * -#BPMP_ENODEV: if disp rfl mrq is not supported by BPMP-FW 2180 */ 2181 struct mrq_emc_disp_rfl_request { 2182 /** @brief EMC display RFL mode (@ref mrq_emc_disp_rfl_mode) */ 2183 uint32_t mode; 2184 } BPMP_ABI_PACKED; 2185 2186 /** @} EMC */ 2187 /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2188 2189 /** 2190 * @ingroup MRQ_Codes 2191 * @def MRQ_BWMGR 2192 * @brief bwmgr requests 2193 * 2194 * * Platforms: T234 onwards 2195 * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) 2196 * * Initiators: CCPLEX 2197 * * Targets: BPMP 2198 * * Request Payload: @ref mrq_bwmgr_request 2199 * * Response Payload: @ref mrq_bwmgr_response 2200 * 2201 * @addtogroup BWMGR 2202 * 2203 * @{ 2204 */ 2205 2206 enum mrq_bwmgr_cmd { 2207 /** 2208 * @brief Check whether the BPMP driver supports the specified 2209 * request type 2210 * 2211 * mrq_response::err is 0 if the specified request is 2212 * supported and -#BPMP_ENODEV otherwise. 2213 */ 2214 CMD_BWMGR_QUERY_ABI = 0, 2215 2216 /** 2217 * @brief Determine dram rate to satisfy iso/niso bw requests 2218 * 2219 * mrq_response::err is 2220 * * 0: calc_rate succeeded. 2221 * * -#BPMP_EINVAL: Invalid request parameters. 2222 * * -#BPMP_ENOTSUP: Requested bw is not available. 2223 */ 2224 CMD_BWMGR_CALC_RATE = 1 2225 }; 2226 2227 /* 2228 * request data for request type CMD_BWMGR_QUERY_ABI 2229 * 2230 * type: Request type for which to check existence. 2231 */ 2232 struct cmd_bwmgr_query_abi_request { 2233 uint32_t type; 2234 } BPMP_ABI_PACKED; 2235 2236 /** 2237 * @brief Used by @ref cmd_bwmgr_calc_rate_request 2238 */ 2239 struct iso_req { 2240 /* @brief bwmgr client ID @ref bpmp_bwmgr_ids */ 2241 uint32_t id; 2242 /* @brief bw in kBps requested by client */ 2243 uint32_t iso_bw; 2244 } BPMP_ABI_PACKED; 2245 2246 #define MAX_ISO_CLIENTS 13U 2247 /* 2248 * request data for request type CMD_BWMGR_CALC_RATE 2249 */ 2250 struct cmd_bwmgr_calc_rate_request { 2251 /* @brief total bw in kBps requested by all niso clients */ 2252 uint32_t sum_niso_bw; 2253 /* @brief The number of iso clients */ 2254 uint32_t num_iso_clients; 2255 /* @brief iso_req <id, iso_bw> information */ 2256 struct iso_req isobw_reqs[MAX_ISO_CLIENTS]; 2257 } BPMP_ABI_PACKED; 2258 2259 /* 2260 * response data for request type CMD_BWMGR_CALC_RATE 2261 * 2262 * iso_rate_min: min dram data clk rate in kHz to satisfy all iso bw reqs 2263 * total_rate_min: min dram data clk rate in kHz to satisfy all bw reqs 2264 */ 2265 struct cmd_bwmgr_calc_rate_response { 2266 uint32_t iso_rate_min; 2267 uint32_t total_rate_min; 2268 } BPMP_ABI_PACKED; 2269 2270 /* 2271 * @brief Request with #MRQ_BWMGR 2272 * 2273 * 2274 * |sub-command |payload | 2275 * |----------------------------|------------------------------| 2276 * |CMD_BWMGR_QUERY_ABI | cmd_bwmgr_query_abi_request | 2277 * |CMD_BWMGR_CALC_RATE | cmd_bwmgr_calc_rate_request | 2278 * 2279 */ 2280 struct mrq_bwmgr_request { 2281 uint32_t cmd; 2282 union { 2283 struct cmd_bwmgr_query_abi_request query_abi; 2284 struct cmd_bwmgr_calc_rate_request bwmgr_rate_req; 2285 } BPMP_UNION_ANON; 2286 } BPMP_ABI_PACKED; 2287 2288 /* 2289 * @brief Response to MRQ_BWMGR 2290 * 2291 * |sub-command |payload | 2292 * |----------------------------|------------------------------| 2293 * |CMD_BWMGR_CALC_RATE | cmd_bwmgr_calc_rate_response | 2294 */ 2295 struct mrq_bwmgr_response { 2296 union { 2297 struct cmd_bwmgr_calc_rate_response bwmgr_rate_resp; 2298 } BPMP_UNION_ANON; 2299 } BPMP_ABI_PACKED; 2300 2301 /** @} BWMGR */ 2302 /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2303 2304 /** 2305 * @ingroup MRQ_Codes 2306 * @def MRQ_BWMGR_INT 2307 * @brief bpmp-integrated bwmgr requests 2308 * 2309 * * Platforms: T234 onwards 2310 * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) 2311 * * Initiators: CCPLEX 2312 * * Targets: BPMP 2313 * * Request Payload: @ref mrq_bwmgr_int_request 2314 * * Response Payload: @ref mrq_bwmgr_int_response 2315 * 2316 * @addtogroup BWMGR_INT 2317 * @{ 2318 */ 2319 2320 enum mrq_bwmgr_int_cmd { 2321 /** 2322 * @brief Check whether the BPMP-FW supports the specified 2323 * request type 2324 * 2325 * mrq_response::err is 0 if the specified request is 2326 * supported and -#BPMP_ENODEV otherwise. 2327 */ 2328 CMD_BWMGR_INT_QUERY_ABI = 1, 2329 2330 /** 2331 * @brief Determine and set dram rate to satisfy iso/niso bw request 2332 * 2333 * mrq_response::err is 2334 * * 0: request succeeded. 2335 * * -#BPMP_EINVAL: Invalid request parameters. 2336 * set_frequency in @ref cmd_bwmgr_int_calc_and_set_response 2337 * will not be set. 2338 * * -#BPMP_ENOTSUP: Requested bw is not available. 2339 * set_frequency in @ref cmd_bwmgr_int_calc_and_set_response 2340 * will be current dram-clk rate. 2341 */ 2342 CMD_BWMGR_INT_CALC_AND_SET = 2, 2343 2344 /** 2345 * @brief Set a max DRAM frequency for the bandwidth-manager 2346 * 2347 * mrq_response::err is 2348 * * 0: request succeeded. 2349 * * -#BPMP_ENOTSUP: Requested cap frequency is not possible. 2350 */ 2351 CMD_BWMGR_INT_CAP_SET = 3 2352 }; 2353 2354 /* 2355 * request structure for request type CMD_BWMGR_QUERY_ABI 2356 * 2357 * type: Request type for which to check existence. 2358 */ 2359 struct cmd_bwmgr_int_query_abi_request { 2360 /* @brief request type determined by @ref mrq_bwmgr_int_cmd */ 2361 uint32_t type; 2362 } BPMP_ABI_PACKED; 2363 2364 /** 2365 * @defgroup bwmgr_int_unit_type BWMGR_INT floor unit-types 2366 * @addtogroup bwmgr_int_unit_type 2367 * @{ 2368 */ 2369 /** @brief kilobytes per second unit-type */ 2370 #define BWMGR_INT_UNIT_KBPS 0U 2371 /** @brief kilohertz unit-type */ 2372 #define BWMGR_INT_UNIT_KHZ 1U 2373 2374 /** @} bwmgr_int_unit_type */ 2375 2376 /* 2377 * request data for request type CMD_BWMGR_INT_CALC_AND_SET 2378 */ 2379 struct cmd_bwmgr_int_calc_and_set_request { 2380 /* @brief bwmgr client ID @ref bpmp_bwmgr_ids */ 2381 uint32_t client_id; 2382 /* @brief average niso bw usage in kBps requested by client. */ 2383 uint32_t niso_bw; 2384 /* 2385 * @brief average iso bw usage in kBps requested by client. 2386 * Value is ignored if client is niso. Determined by client_id. 2387 */ 2388 uint32_t iso_bw; 2389 /* 2390 * @brief memory clock floor requested by client. 2391 * Unit determined by floor_unit. 2392 */ 2393 uint32_t mc_floor; 2394 /* 2395 * @brief toggle to determine the unit-type of floor value. 2396 * See @ref bwmgr_int_unit_type definitions for unit-type mappings. 2397 */ 2398 uint8_t floor_unit; 2399 } BPMP_ABI_PACKED; 2400 2401 struct cmd_bwmgr_int_cap_set_request { 2402 /* @brief requested cap frequency in Hz. */ 2403 uint64_t rate; 2404 } BPMP_ABI_PACKED; 2405 2406 /* 2407 * response data for request type CMD_BWMGR_CALC_AND_SET 2408 */ 2409 struct cmd_bwmgr_int_calc_and_set_response { 2410 /* @brief current set memory clock frequency in Hz */ 2411 uint64_t rate; 2412 } BPMP_ABI_PACKED; 2413 2414 /* 2415 * @brief Request with #MRQ_BWMGR_INT 2416 * 2417 * 2418 * |sub-command |payload | 2419 * |----------------------------|-----------------------------------| 2420 * |CMD_BWMGR_INT_QUERY_ABI | cmd_bwmgr_int_query_abi_request | 2421 * |CMD_BWMGR_INT_CALC_AND_SET | cmd_bwmgr_int_calc_and_set_request| 2422 * |CMD_BWMGR_INT_CAP_SET | cmd_bwmgr_int_cap_set_request | 2423 * 2424 */ 2425 struct mrq_bwmgr_int_request { 2426 uint32_t cmd; 2427 union { 2428 struct cmd_bwmgr_int_query_abi_request query_abi; 2429 struct cmd_bwmgr_int_calc_and_set_request bwmgr_calc_set_req; 2430 struct cmd_bwmgr_int_cap_set_request bwmgr_cap_set_req; 2431 } BPMP_UNION_ANON; 2432 } BPMP_ABI_PACKED; 2433 2434 /* 2435 * @brief Response to MRQ_BWMGR_INT 2436 * 2437 * |sub-command |payload | 2438 * |----------------------------|---------------------------------------| 2439 * |CMD_BWMGR_INT_CALC_AND_SET | cmd_bwmgr_int_calc_and_set_response | 2440 */ 2441 struct mrq_bwmgr_int_response { 2442 union { 2443 struct cmd_bwmgr_int_calc_and_set_response bwmgr_calc_set_resp; 2444 } BPMP_UNION_ANON; 2445 } BPMP_ABI_PACKED; 2446 2447 /** @} BWMGR_INT */ 2448 /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2449 2450 /** 2451 * @ingroup MRQ_Codes 2452 * @def MRQ_ISO_CLIENT 2453 * @brief ISO client requests 2454 * 2455 * * Platforms: T234 onwards 2456 * @cond (bpmp_t234 || bpmp_t239 || bpmp_th500) 2457 * * Initiators: CCPLEX 2458 * * Targets: BPMP 2459 * * Request Payload: @ref mrq_iso_client_request 2460 * * Response Payload: @ref mrq_iso_client_response 2461 * 2462 * @addtogroup ISO_CLIENT 2463 * @{ 2464 */ 2465 2466 enum mrq_iso_client_cmd { 2467 /** 2468 * @brief Check whether the BPMP driver supports the specified 2469 * request type 2470 * 2471 * mrq_response::err is 0 if the specified request is 2472 * supported and -#BPMP_ENODEV otherwise. 2473 */ 2474 CMD_ISO_CLIENT_QUERY_ABI = 0, 2475 2476 /* 2477 * @brief check for legal LA for the iso client. Without programming 2478 * LA MC registers, calculate and ensure that legal LA is possible for 2479 * iso bw requested by the ISO client. 2480 * 2481 * mrq_response::err is 2482 * * 0: check la succeeded. 2483 * * -#BPMP_EINVAL: Invalid request parameters. 2484 * * -#BPMP_EFAULT: Legal LA is not possible for client requested iso_bw 2485 */ 2486 CMD_ISO_CLIENT_CALCULATE_LA = 1, 2487 2488 /* 2489 * @brief set LA for the iso client. Calculate and program the LA/PTSA 2490 * MC registers corresponding to the client making bw request 2491 * 2492 * mrq_response::err is 2493 * * 0: set la succeeded. 2494 * * -#BPMP_EINVAL: Invalid request parameters. 2495 * * -#BPMP_EFAULT: Failed to calculate or program MC registers. 2496 */ 2497 CMD_ISO_CLIENT_SET_LA = 2, 2498 2499 /* 2500 * @brief Get max possible bw for iso client 2501 * 2502 * mrq_response::err is 2503 * * 0: get_max_bw succeeded. 2504 * * -#BPMP_EINVAL: Invalid request parameters. 2505 */ 2506 CMD_ISO_CLIENT_GET_MAX_BW = 3 2507 }; 2508 2509 /* 2510 * request data for request type CMD_ISO_CLIENT_QUERY_ABI 2511 * 2512 * type: Request type for which to check existence. 2513 */ 2514 struct cmd_iso_client_query_abi_request { 2515 uint32_t type; 2516 } BPMP_ABI_PACKED; 2517 2518 /* 2519 * request data for request type CMD_ISO_CLIENT_CALCULATE_LA 2520 * 2521 * id: client ID in @ref bpmp_bwmgr_ids 2522 * bw: bw requested in kBps by client ID. 2523 * init_bw_floor: initial dram_bw_floor in kBps passed by client ID. 2524 * ISO client will perform mempool allocation and DVFS buffering based 2525 * on this dram_bw_floor. 2526 */ 2527 struct cmd_iso_client_calculate_la_request { 2528 uint32_t id; 2529 uint32_t bw; 2530 uint32_t init_bw_floor; 2531 } BPMP_ABI_PACKED; 2532 2533 /* 2534 * request data for request type CMD_ISO_CLIENT_SET_LA 2535 * 2536 * id: client ID in @ref bpmp_bwmgr_ids 2537 * bw: bw requested in kBps by client ID. 2538 * final_bw_floor: final dram_bw_floor in kBps. 2539 * Sometimes the initial dram_bw_floor passed by ISO client may need to be 2540 * updated by considering higher dram freq's. This is the final dram_bw_floor 2541 * used to calculate and program MC registers. 2542 */ 2543 struct cmd_iso_client_set_la_request { 2544 uint32_t id; 2545 uint32_t bw; 2546 uint32_t final_bw_floor; 2547 } BPMP_ABI_PACKED; 2548 2549 /* 2550 * request data for request type CMD_ISO_CLIENT_GET_MAX_BW 2551 * 2552 * id: client ID in @ref bpmp_bwmgr_ids 2553 */ 2554 struct cmd_iso_client_get_max_bw_request { 2555 uint32_t id; 2556 } BPMP_ABI_PACKED; 2557 2558 /* 2559 * response data for request type CMD_ISO_CLIENT_CALCULATE_LA 2560 * 2561 * la_rate_floor: minimum dram_rate_floor in kHz at which a legal la is possible 2562 * iso_client_only_rate: Minimum dram freq in kHz required to satisfy this clients 2563 * iso bw request, assuming all other iso clients are inactive 2564 */ 2565 struct cmd_iso_client_calculate_la_response { 2566 uint32_t la_rate_floor; 2567 uint32_t iso_client_only_rate; 2568 } BPMP_ABI_PACKED; 2569 2570 /** 2571 * @brief Used by @ref cmd_iso_client_get_max_bw_response 2572 */ 2573 struct iso_max_bw { 2574 /* @brief dram frequency in kHz */ 2575 uint32_t freq; 2576 /* @brief max possible iso-bw in kBps */ 2577 uint32_t iso_bw; 2578 } BPMP_ABI_PACKED; 2579 2580 #define ISO_MAX_BW_MAX_SIZE 14U 2581 /* 2582 * response data for request type CMD_ISO_CLIENT_GET_MAX_BW 2583 */ 2584 struct cmd_iso_client_get_max_bw_response { 2585 /* @brief The number valid entries in iso_max_bw pairs */ 2586 uint32_t num_pairs; 2587 /* @brief max ISOBW <dram freq, max bw> information */ 2588 struct iso_max_bw pairs[ISO_MAX_BW_MAX_SIZE]; 2589 } BPMP_ABI_PACKED; 2590 2591 /** 2592 * @brief Request with #MRQ_ISO_CLIENT 2593 * 2594 * Used by the sender of an #MRQ_ISO_CLIENT message. 2595 * 2596 * |sub-command |payload | 2597 * |------------------------------------ |----------------------------------------| 2598 * |CMD_ISO_CLIENT_QUERY_ABI |cmd_iso_client_query_abi_request | 2599 * |CMD_ISO_CLIENT_CALCULATE_LA |cmd_iso_client_calculate_la_request | 2600 * |CMD_ISO_CLIENT_SET_LA |cmd_iso_client_set_la_request | 2601 * |CMD_ISO_CLIENT_GET_MAX_BW |cmd_iso_client_get_max_bw_request | 2602 * 2603 */ 2604 2605 struct mrq_iso_client_request { 2606 /* Type of request. Values listed in enum mrq_iso_client_cmd */ 2607 uint32_t cmd; 2608 union { 2609 struct cmd_iso_client_query_abi_request query_abi; 2610 struct cmd_iso_client_calculate_la_request calculate_la_req; 2611 struct cmd_iso_client_set_la_request set_la_req; 2612 struct cmd_iso_client_get_max_bw_request max_isobw_req; 2613 } BPMP_UNION_ANON; 2614 } BPMP_ABI_PACKED; 2615 2616 /** 2617 * @brief Response to MRQ_ISO_CLIENT 2618 * 2619 * Each sub-command supported by @ref mrq_iso_client_request may return 2620 * sub-command-specific data. Some do and some do not as indicated in 2621 * the following table 2622 * 2623 * |sub-command |payload | 2624 * |---------------------------- |------------------------------------| 2625 * |CMD_ISO_CLIENT_CALCULATE_LA |cmd_iso_client_calculate_la_response| 2626 * |CMD_ISO_CLIENT_SET_LA |N/A | 2627 * |CMD_ISO_CLIENT_GET_MAX_BW |cmd_iso_client_get_max_bw_response | 2628 * 2629 */ 2630 2631 struct mrq_iso_client_response { 2632 union { 2633 struct cmd_iso_client_calculate_la_response calculate_la_resp; 2634 struct cmd_iso_client_get_max_bw_response max_isobw_resp; 2635 } BPMP_UNION_ANON; 2636 } BPMP_ABI_PACKED; 2637 2638 /** @} ISO_CLIENT */ 2639 /** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2640 2641 /** 2642 * @ingroup MRQ_Codes 2643 * @def MRQ_CPU_NDIV_LIMITS 2644 * @brief CPU freq. limits in ndiv 2645 * 2646 * * Platforms: T194 onwards 2647 * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) 2648 * * Initiators: CCPLEX 2649 * * Targets: BPMP 2650 * * Request Payload: @ref mrq_cpu_ndiv_limits_request 2651 * * Response Payload: @ref mrq_cpu_ndiv_limits_response 2652 * @addtogroup CPU 2653 * @{ 2654 */ 2655 2656 /** 2657 * @brief Request for ndiv limits of a cluster 2658 */ 2659 struct mrq_cpu_ndiv_limits_request { 2660 /** @brief Enum cluster_id */ 2661 uint32_t cluster_id; 2662 } BPMP_ABI_PACKED; 2663 2664 /** 2665 * @brief Response to #MRQ_CPU_NDIV_LIMITS 2666 */ 2667 struct mrq_cpu_ndiv_limits_response { 2668 /** @brief Reference frequency in Hz */ 2669 uint32_t ref_clk_hz; 2670 /** @brief Post divider value */ 2671 uint16_t pdiv; 2672 /** @brief Input divider value */ 2673 uint16_t mdiv; 2674 /** @brief FMAX expressed with max NDIV value */ 2675 uint16_t ndiv_max; 2676 /** @brief Minimum allowed NDIV value */ 2677 uint16_t ndiv_min; 2678 } BPMP_ABI_PACKED; 2679 2680 /** @} CPU */ 2681 /** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2682 2683 /** 2684 * @ingroup MRQ_Codes 2685 * @def MRQ_CPU_AUTO_CC3 2686 * @brief Query CPU cluster auto-CC3 configuration 2687 * 2688 * * Platforms: T194 2689 * @cond bpmp_t194 2690 * * Initiators: CCPLEX 2691 * * Targets: BPMP 2692 * * Request Payload: @ref mrq_cpu_auto_cc3_request 2693 * * Response Payload: @ref mrq_cpu_auto_cc3_response 2694 * @addtogroup CC3 2695 * 2696 * Queries from BPMP auto-CC3 configuration (allowed/not allowed) for a 2697 * specified cluster. CCPLEX s/w uses this information to override its own 2698 * device tree auto-CC3 settings, so that BPMP device tree is a single source of 2699 * auto-CC3 platform configuration. 2700 * 2701 * @{ 2702 */ 2703 2704 /** 2705 * @brief Request for auto-CC3 configuration of a cluster 2706 */ 2707 struct mrq_cpu_auto_cc3_request { 2708 /** @brief Enum cluster_id (logical cluster id, known to CCPLEX s/w) */ 2709 uint32_t cluster_id; 2710 } BPMP_ABI_PACKED; 2711 2712 /** 2713 * @brief Response to #MRQ_CPU_AUTO_CC3 2714 */ 2715 struct mrq_cpu_auto_cc3_response { 2716 /** 2717 * @brief auto-CC3 configuration 2718 * 2719 * - bits[31..10] reserved. 2720 * - bits[9..1] cc3 ndiv 2721 * - bit [0] if "1" auto-CC3 is allowed, if "0" auto-CC3 is not allowed 2722 */ 2723 uint32_t auto_cc3_config; 2724 } BPMP_ABI_PACKED; 2725 2726 /** @} CC3 */ 2727 /** @endcond bpmp_t194 */ 2728 2729 /** 2730 * @ingroup MRQ_Codes 2731 * @def MRQ_RINGBUF_CONSOLE 2732 * @brief A ring buffer debug console for BPMP 2733 * @addtogroup RingbufConsole 2734 * 2735 * The ring buffer debug console aims to be a substitute for the UART debug 2736 * console. The debug console is implemented with two ring buffers in the 2737 * BPMP-FW, the RX (receive) and TX (transmit) buffers. Characters can be read 2738 * and written to the buffers by the host via the MRQ interface. 2739 * 2740 * @{ 2741 */ 2742 2743 /** 2744 * @brief Maximum number of bytes transferred in a single write command to the 2745 * BPMP 2746 * 2747 * This is determined by the number of free bytes in the message struct, 2748 * rounded down to a multiple of four. 2749 */ 2750 #define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112 2751 2752 /** 2753 * @brief Maximum number of bytes transferred in a single read command to the 2754 * BPMP 2755 * 2756 * This is determined by the number of free bytes in the message struct, 2757 * rounded down to a multiple of four. 2758 */ 2759 #define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116 2760 2761 enum mrq_ringbuf_console_host_to_bpmp_cmd { 2762 /** 2763 * @brief Check whether the BPMP driver supports the specified request 2764 * type 2765 * 2766 * mrq_response::err is 0 if the specified request is supported and 2767 * -#BPMP_ENODEV otherwise 2768 */ 2769 CMD_RINGBUF_CONSOLE_QUERY_ABI = 0, 2770 /** 2771 * @brief Perform a read operation on the BPMP TX buffer 2772 * 2773 * mrq_response::err is 0 2774 */ 2775 CMD_RINGBUF_CONSOLE_READ = 1, 2776 /** 2777 * @brief Perform a write operation on the BPMP RX buffer 2778 * 2779 * mrq_response::err is 0 if the operation was successful and 2780 * -#BPMP_ENODEV otherwise 2781 */ 2782 CMD_RINGBUF_CONSOLE_WRITE = 2, 2783 /** 2784 * @brief Get the length of the buffer and the physical addresses of 2785 * the buffer data and the head and tail counters 2786 * 2787 * mrq_response::err is 0 if the operation was successful and 2788 * -#BPMP_ENODEV otherwise 2789 */ 2790 CMD_RINGBUF_CONSOLE_GET_FIFO = 3, 2791 }; 2792 2793 /** 2794 * @ingroup RingbufConsole 2795 * @brief Host->BPMP request data for request type 2796 * #CMD_RINGBUF_CONSOLE_QUERY_ABI 2797 */ 2798 struct cmd_ringbuf_console_query_abi_req { 2799 /** @brief Command identifier to be queried */ 2800 uint32_t cmd; 2801 } BPMP_ABI_PACKED; 2802 2803 /** @private */ 2804 struct cmd_ringbuf_console_query_abi_resp { 2805 BPMP_ABI_EMPTY 2806 } BPMP_ABI_PACKED; 2807 2808 /** 2809 * @ingroup RingbufConsole 2810 * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ 2811 */ 2812 struct cmd_ringbuf_console_read_req { 2813 /** 2814 * @brief Number of bytes requested to be read from the BPMP TX buffer 2815 */ 2816 uint8_t len; 2817 } BPMP_ABI_PACKED; 2818 2819 /** 2820 * @ingroup RingbufConsole 2821 * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ 2822 */ 2823 struct cmd_ringbuf_console_read_resp { 2824 /** @brief The actual data read from the BPMP TX buffer */ 2825 uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_READ_LEN]; 2826 /** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */ 2827 uint8_t len; 2828 } BPMP_ABI_PACKED; 2829 2830 /** 2831 * @ingroup RingbufConsole 2832 * @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE 2833 */ 2834 struct cmd_ringbuf_console_write_req { 2835 /** @brief The actual data to be written to the BPMP RX buffer */ 2836 uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN]; 2837 /** @brief Number of bytes in cmd_ringbuf_console_write_req::data */ 2838 uint8_t len; 2839 } BPMP_ABI_PACKED; 2840 2841 /** 2842 * @ingroup RingbufConsole 2843 * @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE 2844 */ 2845 struct cmd_ringbuf_console_write_resp { 2846 /** @brief Number of bytes of available space in the BPMP RX buffer */ 2847 uint32_t space_avail; 2848 /** @brief Number of bytes that were written to the BPMP RX buffer */ 2849 uint8_t len; 2850 } BPMP_ABI_PACKED; 2851 2852 /** @private */ 2853 struct cmd_ringbuf_console_get_fifo_req { 2854 BPMP_ABI_EMPTY 2855 } BPMP_ABI_PACKED; 2856 2857 /** 2858 * @ingroup RingbufConsole 2859 * @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO 2860 */ 2861 struct cmd_ringbuf_console_get_fifo_resp { 2862 /** @brief Physical address of the BPMP TX buffer */ 2863 uint64_t bpmp_tx_buf_addr; 2864 /** @brief Physical address of the BPMP TX buffer head counter */ 2865 uint64_t bpmp_tx_head_addr; 2866 /** @brief Physical address of the BPMP TX buffer tail counter */ 2867 uint64_t bpmp_tx_tail_addr; 2868 /** @brief Length of the BPMP TX buffer */ 2869 uint32_t bpmp_tx_buf_len; 2870 } BPMP_ABI_PACKED; 2871 2872 /** 2873 * @ingroup RingbufConsole 2874 * @brief Host->BPMP request data. 2875 * 2876 * Reply type is union #mrq_ringbuf_console_bpmp_to_host_response . 2877 */ 2878 struct mrq_ringbuf_console_host_to_bpmp_request { 2879 /** 2880 * @brief Type of request. Values listed in enum 2881 * #mrq_ringbuf_console_host_to_bpmp_cmd. 2882 */ 2883 uint32_t type; 2884 /** @brief request type specific parameters. */ 2885 union { 2886 struct cmd_ringbuf_console_query_abi_req query_abi; 2887 struct cmd_ringbuf_console_read_req read; 2888 struct cmd_ringbuf_console_write_req write; 2889 struct cmd_ringbuf_console_get_fifo_req get_fifo; 2890 } BPMP_UNION_ANON; 2891 } BPMP_ABI_PACKED; 2892 2893 /** 2894 * @ingroup RingbufConsole 2895 * @brief Host->BPMP reply data 2896 * 2897 * In response to struct #mrq_ringbuf_console_host_to_bpmp_request. 2898 */ 2899 union mrq_ringbuf_console_bpmp_to_host_response { 2900 struct cmd_ringbuf_console_query_abi_resp query_abi; 2901 struct cmd_ringbuf_console_read_resp read; 2902 struct cmd_ringbuf_console_write_resp write; 2903 struct cmd_ringbuf_console_get_fifo_resp get_fifo; 2904 } BPMP_ABI_PACKED; 2905 2906 /** @} RingbufConsole */ 2907 2908 /** 2909 * @ingroup MRQ_Codes 2910 * @def MRQ_STRAP 2911 * @brief Set a strap value controlled by BPMP 2912 * 2913 * * Platforms: T194 onwards 2914 * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) 2915 * * Initiators: CCPLEX 2916 * * Targets: BPMP 2917 * * Request Payload: @ref mrq_strap_request 2918 * * Response Payload: N/A 2919 * @addtogroup Strap 2920 * 2921 * A strap is an input that is sampled by a hardware unit during the 2922 * unit's startup process. The sampled value of a strap affects the 2923 * behavior of the unit until the unit is restarted. Many hardware 2924 * units sample their straps at the instant that their resets are 2925 * deasserted. 2926 * 2927 * BPMP owns registers which act as straps to various units. It 2928 * exposes limited control of those straps via #MRQ_STRAP. 2929 * 2930 * @{ 2931 */ 2932 enum mrq_strap_cmd { 2933 /** @private */ 2934 STRAP_RESERVED = 0, 2935 /** @brief Set a strap value */ 2936 STRAP_SET = 1 2937 }; 2938 2939 /** 2940 * @brief Request with #MRQ_STRAP 2941 */ 2942 struct mrq_strap_request { 2943 /** @brief @ref mrq_strap_cmd */ 2944 uint32_t cmd; 2945 /** @brief Strap ID from @ref Strap_Identifiers */ 2946 uint32_t id; 2947 /** @brief Desired value for strap (if cmd is #STRAP_SET) */ 2948 uint32_t value; 2949 } BPMP_ABI_PACKED; 2950 2951 /** @} Strap */ 2952 /** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */ 2953 2954 /** 2955 * @ingroup MRQ_Codes 2956 * @def MRQ_UPHY 2957 * @brief Perform a UPHY operation 2958 * 2959 * * Platforms: T194 onwards 2960 * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) 2961 * * Initiators: CCPLEX 2962 * * Targets: BPMP 2963 * * Request Payload: @ref mrq_uphy_request 2964 * * Response Payload: @ref mrq_uphy_response 2965 * 2966 * @addtogroup UPHY 2967 * @{ 2968 */ 2969 enum { 2970 CMD_UPHY_PCIE_LANE_MARGIN_CONTROL = 1, 2971 CMD_UPHY_PCIE_LANE_MARGIN_STATUS = 2, 2972 CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT = 3, 2973 CMD_UPHY_PCIE_CONTROLLER_STATE = 4, 2974 CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF = 5, 2975 CMD_UPHY_DISPLAY_PORT_INIT = 6, 2976 CMD_UPHY_DISPLAY_PORT_OFF = 7, 2977 CMD_UPHY_XUSB_DYN_LANES_RESTORE = 8, 2978 CMD_UPHY_MAX, 2979 }; 2980 2981 struct cmd_uphy_margin_control_request { 2982 /** @brief Enable margin */ 2983 int32_t en; 2984 /** @brief Clear the number of error and sections */ 2985 int32_t clr; 2986 /** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */ 2987 uint32_t x; 2988 /** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */ 2989 uint32_t y; 2990 /** @brief Set number of bit blocks for each margin section */ 2991 uint32_t nblks; 2992 } BPMP_ABI_PACKED; 2993 2994 struct cmd_uphy_margin_status_response { 2995 /** @brief Number of errors observed */ 2996 uint32_t status; 2997 } BPMP_ABI_PACKED; 2998 2999 struct cmd_uphy_ep_controller_pll_init_request { 3000 /** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */ 3001 uint8_t ep_controller; 3002 } BPMP_ABI_PACKED; 3003 3004 struct cmd_uphy_pcie_controller_state_request { 3005 /** @brief PCIE controller number, T194 valid: 0-4; T234 valid: 0-10; T239 valid: 0-3 */ 3006 uint8_t pcie_controller; 3007 uint8_t enable; 3008 } BPMP_ABI_PACKED; 3009 3010 struct cmd_uphy_ep_controller_pll_off_request { 3011 /** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */ 3012 uint8_t ep_controller; 3013 } BPMP_ABI_PACKED; 3014 3015 struct cmd_uphy_display_port_init_request { 3016 /** @brief DisplayPort link rate, T239 valid: 1620, 2700, 5400, 8100, 2160, 2430, 3240, 4320, 6750 */ 3017 uint16_t link_rate; 3018 /** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */ 3019 uint16_t lanes_bitmap; 3020 } BPMP_ABI_PACKED; 3021 3022 struct cmd_uphy_xusb_dyn_lanes_restore_request { 3023 /** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */ 3024 uint16_t lanes_bitmap; 3025 } BPMP_ABI_PACKED; 3026 3027 /** 3028 * @ingroup UPHY 3029 * @brief Request with #MRQ_UPHY 3030 * 3031 * Used by the sender of an #MRQ_UPHY message to control UPHY. 3032 * The uphy_request is split into several sub-commands. CMD_UPHY_PCIE_LANE_MARGIN_STATUS 3033 * requires no additional data. Others have a sub-command specific payload. Below table 3034 * shows sub-commands with their corresponding payload data. 3035 * 3036 * |sub-command |payload | 3037 * |------------------------------------ |----------------------------------------| 3038 * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL |uphy_set_margin_control | 3039 * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS | | 3040 * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT |cmd_uphy_ep_controller_pll_init_request | 3041 * |CMD_UPHY_PCIE_CONTROLLER_STATE |cmd_uphy_pcie_controller_state_request | 3042 * |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF |cmd_uphy_ep_controller_pll_off_request | 3043 * |CMD_UPHY_PCIE_DISPLAY_PORT_INIT |cmd_uphy_display_port_init_request | 3044 * |CMD_UPHY_PCIE_DISPLAY_PORT_OFF | | 3045 * |CMD_UPHY_XUSB_DYN_LANES_RESTORE |cmd_uphy_xusb_dyn_lanes_restore_request | 3046 * 3047 */ 3048 3049 struct mrq_uphy_request { 3050 /** @brief Lane number. */ 3051 uint16_t lane; 3052 /** @brief Sub-command id. */ 3053 uint16_t cmd; 3054 3055 union { 3056 struct cmd_uphy_margin_control_request uphy_set_margin_control; 3057 struct cmd_uphy_ep_controller_pll_init_request ep_ctrlr_pll_init; 3058 struct cmd_uphy_pcie_controller_state_request controller_state; 3059 struct cmd_uphy_ep_controller_pll_off_request ep_ctrlr_pll_off; 3060 struct cmd_uphy_display_port_init_request display_port_init; 3061 struct cmd_uphy_xusb_dyn_lanes_restore_request xusb_dyn_lanes_restore; 3062 } BPMP_UNION_ANON; 3063 } BPMP_ABI_PACKED; 3064 3065 /** 3066 * @ingroup UPHY 3067 * @brief Response to MRQ_UPHY 3068 * 3069 * Each sub-command supported by @ref mrq_uphy_request may return 3070 * sub-command-specific data. Some do and some do not as indicated in 3071 * the following table 3072 * 3073 * |sub-command |payload | 3074 * |---------------------------- |------------------------| 3075 * |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | | 3076 * |CMD_UPHY_PCIE_LANE_MARGIN_STATUS |uphy_get_margin_status | 3077 * 3078 */ 3079 3080 struct mrq_uphy_response { 3081 union { 3082 struct cmd_uphy_margin_status_response uphy_get_margin_status; 3083 } BPMP_UNION_ANON; 3084 } BPMP_ABI_PACKED; 3085 3086 /** @} UPHY */ 3087 /** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */ 3088 3089 /** 3090 * @ingroup MRQ_Codes 3091 * @def MRQ_FMON 3092 * @brief Perform a frequency monitor configuration operations 3093 * 3094 * * Platforms: T194 onwards 3095 * @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) 3096 * * Initiators: CCPLEX 3097 * * Targets: BPMP 3098 * * Request Payload: @ref mrq_fmon_request 3099 * * Response Payload: @ref mrq_fmon_response 3100 * @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) 3101 * 3102 * @addtogroup FMON 3103 * @{ 3104 * @cond (bpmp_t194 || bpmp_t234) 3105 */ 3106 enum { 3107 /** 3108 * @brief Clamp FMON configuration to specified rate. 3109 * 3110 * The monitored clock must be running for clamp to succeed. If 3111 * clamped, FMON configuration is preserved when clock rate 3112 * and/or state is changed. 3113 * 3114 * mrq_response::err is 0 if the operation was successful, or @n 3115 * -#BPMP_EACCES: FMON access error @n 3116 * -#BPMP_EBADCMD if subcommand is not supported @n 3117 * -#BPMP_EBADSLT: clamp FMON on cluster with auto-CC3 enabled @n 3118 * -#BPMP_EBUSY: fmon is already clamped at different rate @n 3119 * -#BPMP_EFAULT: self-diagnostic error @n 3120 * -#BPMP_EINVAL: invalid FMON configuration @n 3121 * -#BPMP_EOPNOTSUPP: not in production mode @n 3122 * -#BPMP_ENODEV: invalid clk_id @n 3123 * -#BPMP_ENOENT: no calibration data, uninitialized @n 3124 * -#BPMP_ENOTSUP: avfs config not set @n 3125 * -#BPMP_ENOSYS: clamp FMON on cluster clock w/ no NAFLL @n 3126 * -#BPMP_ETIMEDOUT: operation timed out @n 3127 */ 3128 CMD_FMON_GEAR_CLAMP = 1, 3129 /** 3130 * @brief Release clamped FMON configuration. 3131 * 3132 * Allow FMON configuration to follow monitored clock rate 3133 * and/or state changes. 3134 * 3135 * mrq_response::err is 0 if the operation was successful, or @n 3136 * -#BPMP_EBADCMD if subcommand is not supported @n 3137 * -#BPMP_ENODEV: invalid clk_id @n 3138 * -#BPMP_ENOENT: no calibration data, uninitialized @n 3139 * -#BPMP_ENOTSUP: avfs config not set @n 3140 * -#BPMP_EOPNOTSUPP: not in production mode @n 3141 */ 3142 CMD_FMON_GEAR_FREE = 2, 3143 /** 3144 * @brief Return rate FMON is clamped at, or 0 if FMON is not 3145 * clamped. 3146 * 3147 * Inherently racy, since clamp state can be changed 3148 * concurrently. Useful for testing. 3149 * 3150 * mrq_response::err is 0 if the operation was successful, or @n 3151 * -#BPMP_EBADCMD if subcommand is not supported @n 3152 * -#BPMP_ENODEV: invalid clk_id @n 3153 * -#BPMP_ENOENT: no calibration data, uninitialized @n 3154 * -#BPMP_ENOTSUP: avfs config not set @n 3155 * -#BPMP_EOPNOTSUPP: not in production mode @n 3156 */ 3157 CMD_FMON_GEAR_GET = 3, 3158 /** 3159 * @brief Return current status of FMON faults detected by FMON 3160 * h/w or s/w since last invocation of this command. 3161 * Clears fault status. 3162 * 3163 * mrq_response::err is 0 if the operation was successful, or @n 3164 * -#BPMP_EBADCMD if subcommand is not supported @n 3165 * -#BPMP_EINVAL: invalid fault type @n 3166 * -#BPMP_ENODEV: invalid clk_id @n 3167 * -#BPMP_ENOENT: no calibration data, uninitialized @n 3168 * -#BPMP_ENOTSUP: avfs config not set @n 3169 * -#BPMP_EOPNOTSUPP: not in production mode @n 3170 */ 3171 CMD_FMON_FAULT_STS_GET = 4, 3172 }; 3173 3174 /** 3175 * @cond DEPRECATED 3176 * Kept for backward compatibility 3177 */ 3178 #define CMD_FMON_NUM 4 3179 3180 /** @endcond DEPRECATED */ 3181 3182 /** 3183 * @defgroup fmon_fault_type FMON fault type 3184 * @addtogroup fmon_fault_type 3185 * @{ 3186 */ 3187 /** @brief All detected FMON faults (h/w or s/w) */ 3188 #define FMON_FAULT_TYPE_ALL 0U 3189 /** @brief FMON faults detected by h/w */ 3190 #define FMON_FAULT_TYPE_HW 1U 3191 /** @brief FMON faults detected by s/w */ 3192 #define FMON_FAULT_TYPE_SW 2U 3193 3194 /** @} fmon_fault_type */ 3195 3196 3197 struct cmd_fmon_gear_clamp_request { 3198 int32_t unused; 3199 int64_t rate; 3200 } BPMP_ABI_PACKED; 3201 3202 /** @private */ 3203 struct cmd_fmon_gear_clamp_response { 3204 BPMP_ABI_EMPTY 3205 } BPMP_ABI_PACKED; 3206 3207 /** @private */ 3208 struct cmd_fmon_gear_free_request { 3209 BPMP_ABI_EMPTY 3210 } BPMP_ABI_PACKED; 3211 3212 /** @private */ 3213 struct cmd_fmon_gear_free_response { 3214 BPMP_ABI_EMPTY 3215 } BPMP_ABI_PACKED; 3216 3217 /** @private */ 3218 struct cmd_fmon_gear_get_request { 3219 BPMP_ABI_EMPTY 3220 } BPMP_ABI_PACKED; 3221 3222 struct cmd_fmon_gear_get_response { 3223 int64_t rate; 3224 } BPMP_ABI_PACKED; 3225 3226 struct cmd_fmon_fault_sts_get_request { 3227 uint32_t fault_type; /**< @ref fmon_fault_type */ 3228 } BPMP_ABI_PACKED; 3229 3230 struct cmd_fmon_fault_sts_get_response { 3231 uint32_t fault_sts; 3232 } BPMP_ABI_PACKED; 3233 3234 /** 3235 * @ingroup FMON 3236 * @brief Request with #MRQ_FMON 3237 * 3238 * Used by the sender of an #MRQ_FMON message to configure clock 3239 * frequency monitors. The FMON request is split into several 3240 * sub-commands. Some sub-commands require no additional data. 3241 * Others have a sub-command specific payload 3242 * 3243 * |sub-command |payload | 3244 * |----------------------------|-----------------------| 3245 * |CMD_FMON_GEAR_CLAMP |fmon_gear_clamp | 3246 * |CMD_FMON_GEAR_FREE |- | 3247 * |CMD_FMON_GEAR_GET |- | 3248 * |CMD_FMON_FAULT_STS_GET |fmon_fault_sts_get | 3249 * 3250 */ 3251 struct mrq_fmon_request { 3252 /** @brief Sub-command and clock id concatenated to 32-bit word. 3253 * - bits[31..24] is the sub-cmd. 3254 * - bits[23..0] is monitored clock id used to select target 3255 * FMON 3256 */ 3257 uint32_t cmd_and_id; 3258 3259 union { 3260 struct cmd_fmon_gear_clamp_request fmon_gear_clamp; 3261 /** @private */ 3262 struct cmd_fmon_gear_free_request fmon_gear_free; 3263 /** @private */ 3264 struct cmd_fmon_gear_get_request fmon_gear_get; 3265 struct cmd_fmon_fault_sts_get_request fmon_fault_sts_get; 3266 } BPMP_UNION_ANON; 3267 } BPMP_ABI_PACKED; 3268 3269 /** 3270 * @ingroup FMON 3271 * @brief Response to MRQ_FMON 3272 * 3273 * Each sub-command supported by @ref mrq_fmon_request may 3274 * return sub-command-specific data as indicated below. 3275 * 3276 * |sub-command |payload | 3277 * |----------------------------|------------------------| 3278 * |CMD_FMON_GEAR_CLAMP |- | 3279 * |CMD_FMON_GEAR_FREE |- | 3280 * |CMD_FMON_GEAR_GET |fmon_gear_get | 3281 * |CMD_FMON_FAULT_STS_GET |fmon_fault_sts_get | 3282 * 3283 */ 3284 3285 struct mrq_fmon_response { 3286 union { 3287 /** @private */ 3288 struct cmd_fmon_gear_clamp_response fmon_gear_clamp; 3289 /** @private */ 3290 struct cmd_fmon_gear_free_response fmon_gear_free; 3291 struct cmd_fmon_gear_get_response fmon_gear_get; 3292 struct cmd_fmon_fault_sts_get_response fmon_fault_sts_get; 3293 } BPMP_UNION_ANON; 3294 } BPMP_ABI_PACKED; 3295 3296 /** @endcond (bpmp_t194 || bpmp_t234) */ 3297 /** @} FMON */ 3298 3299 /** 3300 * @ingroup MRQ_Codes 3301 * @def MRQ_EC 3302 * @brief Provide status information on faults reported by Error 3303 * Collator (EC) to HSM. 3304 * 3305 * * Platforms: T194 3306 * @cond bpmp_t194 3307 * * Initiators: CCPLEX 3308 * * Targets: BPMP 3309 * * Request Payload: @ref mrq_ec_request 3310 * * Response Payload: @ref mrq_ec_response 3311 * 3312 * @note This MRQ ABI is under construction, and subject to change 3313 * 3314 * @endcond bpmp_t194 3315 * @addtogroup EC 3316 * @{ 3317 * @cond bpmp_t194 3318 */ 3319 enum { 3320 /** 3321 * @cond DEPRECATED 3322 * @brief Retrieve specified EC status. 3323 * 3324 * mrq_response::err is 0 if the operation was successful, or @n 3325 * -#BPMP_ENODEV if target EC is not owned by BPMP @n 3326 * -#BPMP_EACCES if target EC power domain is turned off @n 3327 * -#BPMP_EBADCMD if subcommand is not supported 3328 * @endcond DEPRECATED 3329 */ 3330 CMD_EC_STATUS_GET = 1, /* deprecated */ 3331 3332 /** 3333 * @brief Retrieve specified EC extended status (includes error 3334 * counter and user values). 3335 * 3336 * mrq_response::err is 0 if the operation was successful, or @n 3337 * -#BPMP_ENODEV if target EC is not owned by BPMP @n 3338 * -#BPMP_EACCES if target EC power domain is turned off @n 3339 * -#BPMP_EBADCMD if subcommand is not supported 3340 */ 3341 CMD_EC_STATUS_EX_GET = 2, 3342 CMD_EC_NUM, 3343 }; 3344 3345 /** @brief BPMP ECs error types */ 3346 enum bpmp_ec_err_type { 3347 /** @brief Parity error on internal data path 3348 * 3349 * Error descriptor @ref ec_err_simple_desc. 3350 */ 3351 EC_ERR_TYPE_PARITY_INTERNAL = 1, 3352 3353 /** @brief ECC SEC error on internal data path 3354 * 3355 * Error descriptor @ref ec_err_simple_desc. 3356 */ 3357 EC_ERR_TYPE_ECC_SEC_INTERNAL = 2, 3358 3359 /** @brief ECC DED error on internal data path 3360 * 3361 * Error descriptor @ref ec_err_simple_desc. 3362 */ 3363 EC_ERR_TYPE_ECC_DED_INTERNAL = 3, 3364 3365 /** @brief Comparator error 3366 * 3367 * Error descriptor @ref ec_err_simple_desc. 3368 */ 3369 EC_ERR_TYPE_COMPARATOR = 4, 3370 3371 /** @brief Register parity error 3372 * 3373 * Error descriptor @ref ec_err_reg_parity_desc. 3374 */ 3375 EC_ERR_TYPE_REGISTER_PARITY = 5, 3376 3377 /** @brief Parity error from on-chip SRAM/FIFO 3378 * 3379 * Error descriptor @ref ec_err_simple_desc. 3380 */ 3381 EC_ERR_TYPE_PARITY_SRAM = 6, 3382 3383 /** @brief Clock Monitor error 3384 * 3385 * Error descriptor @ref ec_err_fmon_desc. 3386 */ 3387 EC_ERR_TYPE_CLOCK_MONITOR = 9, 3388 3389 /** @brief Voltage Monitor error 3390 * 3391 * Error descriptor @ref ec_err_vmon_desc. 3392 */ 3393 EC_ERR_TYPE_VOLTAGE_MONITOR = 10, 3394 3395 /** @brief SW Correctable error 3396 * 3397 * Error descriptor @ref ec_err_sw_error_desc. 3398 */ 3399 EC_ERR_TYPE_SW_CORRECTABLE = 16, 3400 3401 /** @brief SW Uncorrectable error 3402 * 3403 * Error descriptor @ref ec_err_sw_error_desc. 3404 */ 3405 EC_ERR_TYPE_SW_UNCORRECTABLE = 17, 3406 3407 /** @brief Other HW Correctable error 3408 * 3409 * Error descriptor @ref ec_err_simple_desc. 3410 */ 3411 EC_ERR_TYPE_OTHER_HW_CORRECTABLE = 32, 3412 3413 /** @brief Other HW Uncorrectable error 3414 * 3415 * Error descriptor @ref ec_err_simple_desc. 3416 */ 3417 EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE = 33, 3418 }; 3419 3420 /** @brief Group of registers with parity error. */ 3421 enum ec_registers_group { 3422 /** @brief Functional registers group */ 3423 EC_ERR_GROUP_FUNC_REG = 0U, 3424 /** @brief SCR registers group */ 3425 EC_ERR_GROUP_SCR_REG = 1U, 3426 }; 3427 3428 /** 3429 * @defgroup bpmp_ec_status_flags EC Status Flags 3430 * @addtogroup bpmp_ec_status_flags 3431 * @{ 3432 */ 3433 /** @brief No EC error found flag */ 3434 #define EC_STATUS_FLAG_NO_ERROR 0x0001U 3435 /** @brief Last EC error found flag */ 3436 #define EC_STATUS_FLAG_LAST_ERROR 0x0002U 3437 /** @brief EC latent error flag */ 3438 #define EC_STATUS_FLAG_LATENT_ERROR 0x0004U 3439 3440 /** @} bpmp_ec_status_flags */ 3441 3442 /** 3443 * @defgroup bpmp_ec_desc_flags EC Descriptor Flags 3444 * @addtogroup bpmp_ec_desc_flags 3445 * @{ 3446 */ 3447 /** @brief EC descriptor error resolved flag */ 3448 #define EC_DESC_FLAG_RESOLVED 0x0001U 3449 /** @brief EC descriptor failed to retrieve id flag */ 3450 #define EC_DESC_FLAG_NO_ID 0x0002U 3451 3452 /** @} bpmp_ec_desc_flags */ 3453 3454 /** 3455 * |error type | fmon_clk_id values | 3456 * |---------------------------------|---------------------------| 3457 * |@ref EC_ERR_TYPE_CLOCK_MONITOR |@ref bpmp_clock_ids | 3458 */ 3459 struct ec_err_fmon_desc { 3460 /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 3461 uint16_t desc_flags; 3462 /** @brief FMON monitored clock id */ 3463 uint16_t fmon_clk_id; 3464 /** 3465 * @brief Bitmask of fault flags 3466 * 3467 * @ref bpmp_fmon_faults_flags 3468 */ 3469 uint32_t fmon_faults; 3470 /** @brief FMON faults access error */ 3471 int32_t fmon_access_error; 3472 } BPMP_ABI_PACKED; 3473 3474 /** 3475 * | error type | vmon_adc_id values | 3476 * |---------------------------------|---------------------------| 3477 * |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids | 3478 */ 3479 struct ec_err_vmon_desc { 3480 /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 3481 uint16_t desc_flags; 3482 /** @brief VMON rail adc id */ 3483 uint16_t vmon_adc_id; 3484 /** @brief Bitmask of bpmp_vmon_faults_flags */ 3485 uint32_t vmon_faults; 3486 /** @brief VMON faults access error */ 3487 int32_t vmon_access_error; 3488 } BPMP_ABI_PACKED; 3489 3490 /** 3491 * |error type | reg_id values | 3492 * |---------------------------------|-----------------------| 3493 * |@ref EC_ERR_TYPE_REGISTER_PARITY | bpmp_ec_registers_ids | 3494 */ 3495 struct ec_err_reg_parity_desc { 3496 /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 3497 uint16_t desc_flags; 3498 /** @brief Register id */ 3499 uint16_t reg_id; 3500 /** @brief Register group @ref ec_registers_group */ 3501 uint16_t reg_group; 3502 } BPMP_ABI_PACKED; 3503 3504 /** 3505 * |error type | err_source_id values | 3506 * |--------------------------------- |----------------------| 3507 * |@ref EC_ERR_TYPE_SW_CORRECTABLE | bpmp_ec_ce_swd_ids | 3508 * |@ref EC_ERR_TYPE_SW_UNCORRECTABLE | bpmp_ec_ue_swd_ids | 3509 */ 3510 struct ec_err_sw_error_desc { 3511 /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 3512 uint16_t desc_flags; 3513 /** @brief Error source id */ 3514 uint16_t err_source_id; 3515 /** @brief Sw error data */ 3516 uint32_t sw_error_data; 3517 } BPMP_ABI_PACKED; 3518 3519 /** 3520 * |error type | err_source_id values | 3521 * |----------------------------------------|------------------------| 3522 * |@ref EC_ERR_TYPE_PARITY_INTERNAL | bpmp_ec_ipath_ids | 3523 * |@ref EC_ERR_TYPE_ECC_SEC_INTERNAL | bpmp_ec_ipath_ids | 3524 * |@ref EC_ERR_TYPE_ECC_DED_INTERNAL | bpmp_ec_ipath_ids | 3525 * |@ref EC_ERR_TYPE_COMPARATOR | bpmp_ec_comparator_ids| 3526 * |@ref EC_ERR_TYPE_OTHER_HW_CORRECTABLE | bpmp_ec_misc_hwd_ids | 3527 * |@ref EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE | bpmp_ec_misc_hwd_ids | 3528 * |@ref EC_ERR_TYPE_PARITY_SRAM | bpmp_clock_ids | 3529 */ 3530 struct ec_err_simple_desc { 3531 /** @brief Bitmask of @ref bpmp_ec_desc_flags */ 3532 uint16_t desc_flags; 3533 /** @brief Error source id. Id space depends on error type. */ 3534 uint16_t err_source_id; 3535 } BPMP_ABI_PACKED; 3536 3537 /** @brief Union of EC error descriptors */ 3538 union ec_err_desc { 3539 struct ec_err_fmon_desc fmon_desc; 3540 struct ec_err_vmon_desc vmon_desc; 3541 struct ec_err_reg_parity_desc reg_parity_desc; 3542 struct ec_err_sw_error_desc sw_error_desc; 3543 struct ec_err_simple_desc simple_desc; 3544 } BPMP_ABI_PACKED; 3545 3546 struct cmd_ec_status_get_request { 3547 /** @brief HSM error line number that identifies target EC. */ 3548 uint32_t ec_hsm_id; 3549 } BPMP_ABI_PACKED; 3550 3551 /** EC status maximum number of descriptors */ 3552 #define EC_ERR_STATUS_DESC_MAX_NUM 4U 3553 3554 /** 3555 * @cond DEPRECATED 3556 */ 3557 struct cmd_ec_status_get_response { 3558 /** @brief Target EC id (the same id received with request). */ 3559 uint32_t ec_hsm_id; 3560 /** 3561 * @brief Bitmask of @ref bpmp_ec_status_flags 3562 * 3563 * If NO_ERROR flag is set, error_ fields should be ignored 3564 */ 3565 uint32_t ec_status_flags; 3566 /** @brief Found EC error index. */ 3567 uint32_t error_idx; 3568 /** @brief Found EC error type @ref bpmp_ec_err_type. */ 3569 uint32_t error_type; 3570 /** @brief Number of returned EC error descriptors */ 3571 uint32_t error_desc_num; 3572 /** @brief EC error descriptors */ 3573 union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM]; 3574 } BPMP_ABI_PACKED; 3575 /** @endcond DEPRECATED */ 3576 3577 struct cmd_ec_status_ex_get_response { 3578 /** @brief Target EC id (the same id received with request). */ 3579 uint32_t ec_hsm_id; 3580 /** 3581 * @brief Bitmask of @ref bpmp_ec_status_flags 3582 * 3583 * If NO_ERROR flag is set, error_ fields should be ignored 3584 */ 3585 uint32_t ec_status_flags; 3586 /** @brief Found EC error index. */ 3587 uint32_t error_idx; 3588 /** @brief Found EC error type @ref bpmp_ec_err_type. */ 3589 uint32_t error_type; 3590 /** @brief Found EC mission error counter value */ 3591 uint32_t error_counter; 3592 /** @brief Found EC mission error user value */ 3593 uint32_t error_uval; 3594 /** @brief Reserved entry */ 3595 uint32_t reserved; 3596 /** @brief Number of returned EC error descriptors */ 3597 uint32_t error_desc_num; 3598 /** @brief EC error descriptors */ 3599 union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM]; 3600 } BPMP_ABI_PACKED; 3601 3602 /** 3603 * @ingroup EC 3604 * @brief Request with #MRQ_EC 3605 * 3606 * Used by the sender of an #MRQ_EC message to access ECs owned 3607 * by BPMP. 3608 * 3609 * @cond DEPRECATED 3610 * |sub-command |payload | 3611 * |----------------------------|-----------------------| 3612 * |@ref CMD_EC_STATUS_GET |ec_status_get | 3613 * @endcond DEPRECATED 3614 * 3615 * |sub-command |payload | 3616 * |----------------------------|-----------------------| 3617 * |@ref CMD_EC_STATUS_EX_GET |ec_status_get | 3618 * 3619 */ 3620 3621 struct mrq_ec_request { 3622 /** @brief Sub-command id. */ 3623 uint32_t cmd_id; 3624 3625 union { 3626 struct cmd_ec_status_get_request ec_status_get; 3627 } BPMP_UNION_ANON; 3628 } BPMP_ABI_PACKED; 3629 3630 /** 3631 * @ingroup EC 3632 * @brief Response to MRQ_EC 3633 * 3634 * Each sub-command supported by @ref mrq_ec_request may return 3635 * sub-command-specific data as indicated below. 3636 * 3637 * @cond DEPRECATED 3638 * |sub-command |payload | 3639 * |----------------------------|------------------------| 3640 * |@ref CMD_EC_STATUS_GET |ec_status_get | 3641 * @endcond DEPRECATED 3642 * 3643 * |sub-command |payload | 3644 * |----------------------------|------------------------| 3645 * |@ref CMD_EC_STATUS_EX_GET |ec_status_ex_get | 3646 * 3647 */ 3648 3649 struct mrq_ec_response { 3650 union { 3651 /** 3652 * @cond DEPRECATED 3653 */ 3654 struct cmd_ec_status_get_response ec_status_get; 3655 /** @endcond DEPRECATED */ 3656 struct cmd_ec_status_ex_get_response ec_status_ex_get; 3657 } BPMP_UNION_ANON; 3658 } BPMP_ABI_PACKED; 3659 3660 /** @endcond bpmp_t194 */ 3661 /** @} EC */ 3662 3663 /** 3664 * @ingroup MRQ_Codes 3665 * @def MRQ_TELEMETRY 3666 * @brief Get address of memory buffer refreshed with recently sampled 3667 * telemetry data 3668 * 3669 * * Platforms: TH500 onwards 3670 * @cond bpmp_th500 3671 * * Initiators: CCPLEX 3672 * * Targets: BPMP 3673 * * Request Payload: N/A 3674 * * Response Payload: @ref mrq_telemetry_response 3675 * @addtogroup Telemetry 3676 * @{ 3677 */ 3678 3679 /** 3680 * @brief Response to #MRQ_TELEMETRY 3681 * 3682 * mrq_response::err is 3683 * * 0: Telemetry data is available at returned address 3684 * * -#BPMP_EACCES: MRQ master is not allowed to request buffer refresh 3685 * * -#BPMP_ENAVAIL: Telemetry buffer cannot be refreshed via this MRQ channel 3686 * * -#BPMP_ENOTSUP: Telemetry buffer is not supported by BPMP-FW 3687 * * -#BPMP_ENODEV: Telemetry mrq is not supported by BPMP-FW 3688 */ 3689 struct mrq_telemetry_response { 3690 /** @brief Physical address of telemetry data buffer */ 3691 uint64_t data_buf_addr; /**< see @ref bpmp_telemetry_layout */ 3692 } BPMP_ABI_PACKED; 3693 3694 /** @} Telemetry */ 3695 /** @endcond bpmp_th500 */ 3696 3697 /** 3698 * @ingroup MRQ_Codes 3699 * @def MRQ_PWR_LIMIT 3700 * @brief Control power limits. 3701 * 3702 * * Platforms: TH500 onwards 3703 * @cond bpmp_th500 3704 * * Initiators: Any 3705 * * Targets: BPMP 3706 * * Request Payload: @ref mrq_pwr_limit_request 3707 * * Response Payload: @ref mrq_pwr_limit_response 3708 * 3709 * @addtogroup Pwrlimit 3710 * @{ 3711 */ 3712 enum mrq_pwr_limit_cmd { 3713 /** 3714 * @brief Check whether the BPMP-FW supports the specified 3715 * command 3716 * 3717 * mrq_response::err is 0 if the specified request is 3718 * supported and -#BPMP_ENODEV otherwise. 3719 */ 3720 CMD_PWR_LIMIT_QUERY_ABI = 0, 3721 3722 /** 3723 * @brief Set power limit 3724 * 3725 * mrq_response:err is 3726 * * 0: Success 3727 * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW 3728 * * -#BPMP_ENAVAIL: Invalid request parameters 3729 * * -#BPMP_EACCES: Request is not accepted 3730 */ 3731 CMD_PWR_LIMIT_SET = 1, 3732 3733 /** 3734 * @brief Get power limit setting 3735 * 3736 * mrq_response:err is 3737 * * 0: Success 3738 * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW 3739 * * -#BPMP_ENAVAIL: Invalid request parameters 3740 */ 3741 CMD_PWR_LIMIT_GET = 2, 3742 3743 /** 3744 * @brief Get current power cap 3745 * 3746 * mrq_response:err is 3747 * * 0: Success 3748 * * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW 3749 * * -#BPMP_ENAVAIL: Invalid request parameters 3750 */ 3751 CMD_PWR_LIMIT_CURR_CAP = 3, 3752 }; 3753 3754 /** 3755 * @defgroup bpmp_pwr_limit_type PWR_LIMIT TYPEs 3756 * @{ 3757 */ 3758 /** @brief Limit value specifies traget cap */ 3759 #define PWR_LIMIT_TYPE_TARGET_CAP 0U 3760 /** @brief Limit value specifies maximum possible target cap */ 3761 #define PWR_LIMIT_TYPE_BOUND_MAX 1U 3762 /** @brief Limit value specifies minimum possible target cap */ 3763 #define PWR_LIMIT_TYPE_BOUND_MIN 2U 3764 /** @brief Number of limit types supported by mrq interface */ 3765 #define PWR_LIMIT_TYPE_NUM 3U 3766 3767 /** @} bpmp_pwr_limit_type */ 3768 3769 /** 3770 * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_QUERY_ABI 3771 */ 3772 struct cmd_pwr_limit_query_abi_request { 3773 uint32_t cmd_code; /**< @ref mrq_pwr_limit_cmd */ 3774 } BPMP_ABI_PACKED; 3775 3776 /** 3777 * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_SET 3778 * 3779 * Set specified limit of specified type from specified source. The success of 3780 * the request means that specified value is accepted as input to arbitration 3781 * with other sources settings for the same limit of the same type. Zero limit 3782 * is ignored by the arbitration (i.e., indicates "no limit set"). 3783 */ 3784 struct cmd_pwr_limit_set_request { 3785 uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */ 3786 uint32_t limit_src; /**< @ref bpmp_pwr_limit_src */ 3787 uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */ 3788 uint32_t limit_setting; 3789 } BPMP_ABI_PACKED; 3790 3791 /** 3792 * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET 3793 * 3794 * Get previously set from specified source specified limit value of specified 3795 * type. 3796 */ 3797 struct cmd_pwr_limit_get_request { 3798 uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */ 3799 uint32_t limit_src; /**< @ref bpmp_pwr_limit_src */ 3800 uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */ 3801 } BPMP_ABI_PACKED; 3802 3803 /** 3804 * @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET 3805 */ 3806 struct cmd_pwr_limit_get_response { 3807 uint32_t limit_setting; 3808 } BPMP_ABI_PACKED; 3809 3810 /** 3811 * @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP 3812 * 3813 * For specified limit get current power cap aggregated from all sources. 3814 */ 3815 struct cmd_pwr_limit_curr_cap_request { 3816 uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */ 3817 } BPMP_ABI_PACKED; 3818 3819 /** 3820 * @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP 3821 */ 3822 struct cmd_pwr_limit_curr_cap_response { 3823 uint32_t curr_cap; 3824 } BPMP_ABI_PACKED; 3825 3826 /** 3827 * @brief Request with #MRQ_PWR_LIMIT 3828 * 3829 * |sub-command |payload | 3830 * |----------------------------|---------------------------------| 3831 * |CMD_PWR_LIMIT_QUERY_ABI | cmd_pwr_limit_query_abi_request | 3832 * |CMD_PWR_LIMIT_SET | cmd_pwr_limit_set_request | 3833 * |CMD_PWR_LIMIT_GET | cmd_pwr_limit_get_request | 3834 * |CMD_PWR_LIMIT_CURR_CAP | cmd_pwr_limit_curr_cap_request | 3835 */ 3836 struct mrq_pwr_limit_request { 3837 uint32_t cmd; 3838 union { 3839 struct cmd_pwr_limit_query_abi_request pwr_limit_query_abi_req; 3840 struct cmd_pwr_limit_set_request pwr_limit_set_req; 3841 struct cmd_pwr_limit_get_request pwr_limit_get_req; 3842 struct cmd_pwr_limit_curr_cap_request pwr_limit_curr_cap_req; 3843 } BPMP_UNION_ANON; 3844 } BPMP_ABI_PACKED; 3845 3846 /** 3847 * @brief Response to MRQ_PWR_LIMIT 3848 * 3849 * |sub-command |payload | 3850 * |----------------------------|---------------------------------| 3851 * |CMD_PWR_LIMIT_QUERY_ABI | - | 3852 * |CMD_PWR_LIMIT_SET | - | 3853 * |CMD_PWR_LIMIT_GET | cmd_pwr_limit_get_response | 3854 * |CMD_PWR_LIMIT_CURR_CAP | cmd_pwr_limit_curr_cap_response | 3855 */ 3856 struct mrq_pwr_limit_response { 3857 union { 3858 struct cmd_pwr_limit_get_response pwr_limit_get_rsp; 3859 struct cmd_pwr_limit_curr_cap_response pwr_limit_curr_cap_rsp; 3860 } BPMP_UNION_ANON; 3861 } BPMP_ABI_PACKED; 3862 3863 /** @} PwrLimit */ 3864 /** @endcond bpmp_th500 */ 3865 3866 3867 /** 3868 * @ingroup MRQ_Codes 3869 * @def MRQ_GEARS 3870 * @brief Get thresholds for NDIV offset switching 3871 * 3872 * * Platforms: TH500 onwards 3873 * @cond bpmp_th500 3874 * * Initiators: CCPLEX 3875 * * Targets: BPMP 3876 * * Request Payload: N/A 3877 * * Response Payload: @ref mrq_gears_response 3878 * @addtogroup Gears 3879 * @{ 3880 */ 3881 3882 /** 3883 * @brief Response to #MRQ_GEARS 3884 * 3885 * Used by the sender of an #MRQ_GEARS message to request thresholds 3886 * for NDIV offset switching. 3887 * 3888 * The mrq_gears_response::ncpu array defines four thresholds in units 3889 * of number of online CPUS to be used for choosing between five different 3890 * NDIV offset settings for CCPLEX cluster NAFLLs 3891 * 3892 * 1. If number of online CPUs < ncpu[0] use offset0 3893 * 2. If number of online CPUs < ncpu[1] use offset1 3894 * 3. If number of online CPUs < ncpu[2] use offset2 3895 * 4. If number of online CPUs < ncpu[3] use offset3 3896 * 5. If number of online CPUs >= ncpu[3] disable offsetting 3897 * 3898 * For TH500 mrq_gears_response::ncpu array has four valid entries. 3899 * 3900 * mrq_response::err is 3901 * * 0: gears defined and response data valid 3902 * * -#BPMP_ENODEV: MRQ is not supported by BPMP-FW 3903 * * -#BPMP_EACCES: Operation not permitted for the MRQ master 3904 * * -#BPMP_ENAVAIL: NDIV offsetting is disabled 3905 */ 3906 struct mrq_gears_response { 3907 /** @brief number of online CPUs for each gear */ 3908 uint32_t ncpu[16]; 3909 } BPMP_ABI_PACKED; 3910 3911 /** @} Gears */ 3912 /** @endcond bpmp_th500 */ 3913 3914 /** 3915 * @addtogroup Error_Codes 3916 * Negative values for mrq_response::err generally indicate some 3917 * error. The ABI defines the following error codes. Negating these 3918 * defines is an exercise left to the user. 3919 * @{ 3920 */ 3921 3922 /** @brief Operation not permitted */ 3923 #define BPMP_EPERM 1 3924 /** @brief No such file or directory */ 3925 #define BPMP_ENOENT 2 3926 /** @brief No MRQ handler */ 3927 #define BPMP_ENOHANDLER 3 3928 /** @brief I/O error */ 3929 #define BPMP_EIO 5 3930 /** @brief Bad sub-MRQ command */ 3931 #define BPMP_EBADCMD 6 3932 /** @brief Resource temporarily unavailable */ 3933 #define BPMP_EAGAIN 11 3934 /** @brief Not enough memory */ 3935 #define BPMP_ENOMEM 12 3936 /** @brief Permission denied */ 3937 #define BPMP_EACCES 13 3938 /** @brief Bad address */ 3939 #define BPMP_EFAULT 14 3940 /** @brief Resource busy */ 3941 #define BPMP_EBUSY 16 3942 /** @brief No such device */ 3943 #define BPMP_ENODEV 19 3944 /** @brief Argument is a directory */ 3945 #define BPMP_EISDIR 21 3946 /** @brief Invalid argument */ 3947 #define BPMP_EINVAL 22 3948 /** @brief Timeout during operation */ 3949 #define BPMP_ETIMEDOUT 23 3950 /** @brief Out of range */ 3951 #define BPMP_ERANGE 34 3952 /** @brief Function not implemented */ 3953 #define BPMP_ENOSYS 38 3954 /** @brief Invalid slot */ 3955 #define BPMP_EBADSLT 57 3956 /** @brief Invalid message */ 3957 #define BPMP_EBADMSG 77 3958 /** @brief Operation not supported */ 3959 #define BPMP_EOPNOTSUPP 95 3960 /** @brief Targeted resource not available */ 3961 #define BPMP_ENAVAIL 119 3962 /** @brief Not supported */ 3963 #define BPMP_ENOTSUP 134 3964 /** @brief No such device or address */ 3965 #define BPMP_ENXIO 140 3966 3967 /** @} Error_Codes */ 3968 3969 #if defined(BPMP_ABI_CHECKS) 3970 #include "bpmp_abi_checks.h" 3971 #endif 3972 3973 #endif 3974