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