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