Loading...
Note: File does not exist in v3.1.
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 */
73struct 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 */
96struct 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 */
223struct 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 */
237struct 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 */
264struct 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 */
291struct 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 */
329struct 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 */
342struct 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 */
370struct 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 */
398struct 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 */
414struct 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 */
452struct 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 */
466struct 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 */
477struct mrq_threaded_ping_request {
478 uint32_t challenge;
479} __ABI_PACKED;
480
481/** @private */
482struct 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 */
505struct 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 */
520struct 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 */
566enum 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 */
581struct 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 */
596struct 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 */
607struct 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 */
618struct 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 */
640struct 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 */
652struct 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
689enum 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 */
708struct 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 */
720struct 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 */
739struct 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
773enum {
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*/
792struct 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 */
806struct 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 */
824struct 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 */
834struct 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 */
844struct 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 */
864enum {
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 */
887struct cmd_clk_get_rate_request {
888 EMPTY
889} __ABI_PACKED;
890
891struct cmd_clk_get_rate_response {
892 int64_t rate;
893} __ABI_PACKED;
894
895struct cmd_clk_set_rate_request {
896 int32_t unused;
897 int64_t rate;
898} __ABI_PACKED;
899
900struct cmd_clk_set_rate_response {
901 int64_t rate;
902} __ABI_PACKED;
903
904struct cmd_clk_round_rate_request {
905 int32_t unused;
906 int64_t rate;
907} __ABI_PACKED;
908
909struct cmd_clk_round_rate_response {
910 int64_t rate;
911} __ABI_PACKED;
912
913/** @private */
914struct cmd_clk_get_parent_request {
915 EMPTY
916} __ABI_PACKED;
917
918struct cmd_clk_get_parent_response {
919 uint32_t parent_id;
920} __ABI_PACKED;
921
922struct cmd_clk_set_parent_request {
923 uint32_t parent_id;
924} __ABI_PACKED;
925
926struct cmd_clk_set_parent_response {
927 uint32_t parent_id;
928} __ABI_PACKED;
929
930/** @private */
931struct cmd_clk_is_enabled_request {
932 EMPTY
933} __ABI_PACKED;
934
935struct cmd_clk_is_enabled_response {
936 int32_t state;
937} __ABI_PACKED;
938
939/** @private */
940struct cmd_clk_enable_request {
941 EMPTY
942} __ABI_PACKED;
943
944/** @private */
945struct cmd_clk_enable_response {
946 EMPTY
947} __ABI_PACKED;
948
949/** @private */
950struct cmd_clk_disable_request {
951 EMPTY
952} __ABI_PACKED;
953
954/** @private */
955struct cmd_clk_disable_response {
956 EMPTY
957} __ABI_PACKED;
958
959/** @private */
960struct cmd_clk_get_all_info_request {
961 EMPTY
962} __ABI_PACKED;
963
964struct 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 */
973struct cmd_clk_get_max_clk_id_request {
974 EMPTY
975} __ABI_PACKED;
976
977struct cmd_clk_get_max_clk_id_response {
978 uint32_t max_id;
979} __ABI_PACKED;
980
981/** @private */
982struct cmd_clk_get_fmax_at_vmin_request {
983 EMPTY
984} __ABI_PACKED;
985
986struct 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
1016struct 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
1070struct 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 */
1109struct 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 */
1121struct 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 */
1146struct 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 */
1156struct 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 */
1190struct 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 */
1238enum 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
1293enum 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
1307struct cmd_pg_query_abi_request {
1308 /** @ref mrq_pg_cmd */
1309 uint32_t type;
1310} __ABI_PACKED;
1311
1312struct cmd_pg_set_state_request {
1313 /** @ref pg_states */
1314 uint32_t state;
1315} __ABI_PACKED;
1316
1317struct cmd_pg_get_state_response {
1318 /** @ref pg_states */
1319 uint32_t state;
1320} __ABI_PACKED;
1321
1322struct cmd_pg_get_name_response {
1323 uint8_t name[MRQ_PG_NAME_MAXLEN];
1324} __ABI_PACKED;
1325
1326struct 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 */
1347struct 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 */
1371struct 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 */
1414enum 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
1472enum 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 */
1494struct 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 */
1503struct 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 */
1516struct 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 */
1528struct 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 */
1540struct 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 */
1550struct 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 */
1562struct 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 */
1577struct 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 */
1587union 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 */
1617struct 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 */
1630struct 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 */
1694struct 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 */
1714struct 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 */
1737struct 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 */
1748struct 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 */
1775struct 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 */
1783struct 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 */
1823struct 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 */
1831struct 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 */
1858enum {
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 */
1868struct 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
1907enum 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 */
1944struct cmd_ringbuf_console_query_abi_req {
1945 /** @brief Command identifier to be queried */
1946 uint32_t cmd;
1947} __ABI_PACKED;
1948
1949/** @private */
1950struct 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 */
1958struct 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 */
1969struct 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 */
1980struct 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 */
1991struct 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 */
1999struct 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 */
2007struct 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 */
2024struct 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 */
2045union 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 */
2077enum 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 */
2087struct 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 */
2117enum {
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
2125struct 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
2138struct cmd_uphy_margin_status_response {
2139 /** @brief Number of errors observed */
2140 uint32_t status;
2141} __ABI_PACKED;
2142
2143struct 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
2148struct 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
2171struct 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
2199struct 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 */
2223enum {
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
2250struct cmd_fmon_gear_clamp_request {
2251 int32_t unused;
2252 int64_t rate;
2253} __ABI_PACKED;
2254
2255/** @private */
2256struct cmd_fmon_gear_clamp_response {
2257 EMPTY
2258} __ABI_PACKED;
2259
2260/** @private */
2261struct cmd_fmon_gear_free_request {
2262 EMPTY
2263} __ABI_PACKED;
2264
2265/** @private */
2266struct cmd_fmon_gear_free_response {
2267 EMPTY
2268} __ABI_PACKED;
2269
2270/** @private */
2271struct cmd_fmon_gear_get_request {
2272 EMPTY
2273} __ABI_PACKED;
2274
2275struct 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
2296struct 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
2328struct 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 */
2359enum {
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 */
2372enum 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. */
2447enum 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 */
2483struct 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 */
2499struct 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 */
2515struct 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 */
2537struct 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 */
2545union 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
2552struct 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
2560struct 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
2592struct 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
2614struct 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 */
2645struct 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