]> git.sur5r.net Git - u-boot/blob - arch/arm/include/asm/arch-tegra/bpmp_abi.h
Merge git://git.denx.de/u-boot-mmc
[u-boot] / arch / arm / include / asm / arch-tegra / bpmp_abi.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2014-2016, NVIDIA CORPORATION.
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 /**
34  * @defgroup MRQ MRQ Messages
35  * @brief Messages sent to/from BPMP via IPC
36  * @{
37  *   @defgroup MRQ_Format Message Format
38  *   @defgroup MRQ_Codes Message Request (MRQ) Codes
39  *   @defgroup MRQ_Payloads Message Payloads
40  *   @defgroup Error_Codes Error Codes
41  * @}
42  */
43
44 /**
45  * @addtogroup MRQ_Format Message Format
46  * @{
47  * The CPU requests the BPMP to perform a particular service by
48  * sending it an IVC frame containing a single MRQ message. An MRQ
49  * message consists of a @ref mrq_request followed by a payload whose
50  * format depends on mrq_request::mrq.
51  *
52  * The BPMP processes the data and replies with an IVC frame (on the
53  * same IVC channel) containing and MRQ response. An MRQ response
54  * consists of a @ref mrq_response followed by a payload whose format
55  * depends on the associated mrq_request::mrq.
56  *
57  * A well-defined subset of the MRQ messages that the CPU sends to the
58  * BPMP can lead to BPMP eventually sending an MRQ message to the
59  * CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
60  * a thermal trip point, the BPMP may eventually send a single
61  * #MRQ_THERMAL message of its own to the CPU indicating that the trip
62  * point has been crossed.
63  * @}
64  */
65
66 /**
67  * @ingroup MRQ_Format
68  * @brief header for an MRQ message
69  *
70  * Provides the MRQ number for the MRQ message: #mrq. The remainder of
71  * the MRQ message is a payload (immediately following the
72  * mrq_request) whose format depends on mrq.
73  *
74  * @todo document the flags
75  */
76 struct mrq_request {
77         /** @brief MRQ number of the request */
78         uint32_t mrq;
79         /** @brief flags for the request */
80         uint32_t flags;
81 } __ABI_PACKED;
82
83 /**
84  * @ingroup MRQ_Format
85  * @brief header for an MRQ response
86  *
87  *  Provides an error code for the associated MRQ message. The
88  *  remainder of the MRQ response is a payload (immediately following
89  *  the mrq_response) whose format depends on the associated
90  *  mrq_request::mrq
91  *
92  * @todo document the flags
93  */
94 struct mrq_response {
95         /** @brief error code for the MRQ request itself */
96         int32_t err;
97         /** @brief flags for the response */
98         uint32_t flags;
99 } __ABI_PACKED;
100
101 /**
102  * @ingroup MRQ_Format
103  * Minimum needed size for an IPC message buffer
104  */
105 #define MSG_MIN_SZ      128
106 /**
107  * @ingroup MRQ_Format
108  *  Minimum size guaranteed for data in an IPC message buffer
109  */
110 #define MSG_DATA_MIN_SZ 120
111
112 /**
113  * @ingroup MRQ_Codes
114  * @name Legal MRQ codes
115  * These are the legal values for mrq_request::mrq
116  * @{
117  */
118
119 #define MRQ_PING                0
120 #define MRQ_QUERY_TAG           1
121 #define MRQ_MODULE_LOAD         4
122 #define MRQ_MODULE_UNLOAD       5
123 #define MRQ_TRACE_MODIFY        7
124 #define MRQ_WRITE_TRACE         8
125 #define MRQ_THREADED_PING       9
126 #define MRQ_MODULE_MAIL         11
127 #define MRQ_DEBUGFS             19
128 #define MRQ_RESET               20
129 #define MRQ_I2C                 21
130 #define MRQ_CLK                 22
131 #define MRQ_QUERY_ABI           23
132 #define MRQ_PG_READ_STATE       25
133 #define MRQ_PG_UPDATE_STATE     26
134 #define MRQ_THERMAL             27
135 #define MRQ_CPU_VHINT           28
136 #define MRQ_ABI_RATCHET         29
137 #define MRQ_EMC_DVFS_LATENCY    31
138 #define MRQ_TRACE_ITER          64
139
140 /** @} */
141
142 /**
143  * @ingroup MRQ_Codes
144  * @brief Maximum MRQ code to be sent by CPU software to
145  * BPMP. Subject to change in future
146  */
147 #define MAX_CPU_MRQ_ID          64
148
149 /**
150  * @addtogroup MRQ_Payloads Message Payloads
151  * @{
152  *   @defgroup Ping
153  *   @defgroup Query_Tag Query Tag
154  *   @defgroup Module Loadable Modules
155  *   @defgroup Trace
156  *   @defgroup Debugfs
157  *   @defgroup Reset
158  *   @defgroup I2C
159  *   @defgroup Clocks
160  *   @defgroup ABI_info ABI Info
161  *   @defgroup MC_Flush MC Flush
162  *   @defgroup Powergating
163  *   @defgroup Thermal
164  *   @defgroup Vhint CPU Voltage hint
165  *   @defgroup MRQ_Deprecated Deprecated MRQ messages
166  *   @defgroup EMC
167  * @}
168  */
169
170
171 /**
172  * @ingroup MRQ_Codes
173  * @def MRQ_PING
174  * @brief A simple ping
175  *
176  * * Platforms: All
177  * * Initiators: Any
178  * * Targets: Any
179  * * Request Payload: @ref mrq_ping_request
180  * * Response Payload: @ref mrq_ping_response
181  *
182  * @ingroup MRQ_Codes
183  * @def MRQ_THREADED_PING
184  * @brief A deeper ping
185  *
186  * * Platforms: All
187  * * Initiators: Any
188  * * Targets: BPMP
189  * * Request Payload: @ref mrq_ping_request
190  * * Response Payload: @ref mrq_ping_response
191  *
192  * Behavior is equivalent to a simple #MRQ_PING except that BPMP
193  * responds from a thread context (providing a slightly more robust
194  * sign of life).
195  *
196  */
197
198 /**
199  * @ingroup Ping
200  * @brief request with #MRQ_PING
201  *
202  * Used by the sender of an #MRQ_PING message to request a pong from
203  * recipient. The response from the recipient is computed based on
204  * #challenge.
205  */
206 struct mrq_ping_request {
207 /** @brief arbitrarily chosen value */
208         uint32_t challenge;
209 } __ABI_PACKED;
210
211 /**
212  * @ingroup Ping
213  * @brief response to #MRQ_PING
214  *
215  * Sent in response to an #MRQ_PING message. #reply should be the
216  * mrq_ping_request challenge left shifted by 1 with the carry-bit
217  * dropped.
218  *
219  */
220 struct mrq_ping_response {
221         /** @brief response to the MRQ_PING challege */
222         uint32_t reply;
223 } __ABI_PACKED;
224
225 /**
226  * @ingroup MRQ_Codes
227  * @def MRQ_QUERY_TAG
228  * @brief Query BPMP firmware's tag (i.e. version information)
229  *
230  * * Platforms: All
231  * * Initiators: CCPLEX
232  * * Targets: BPMP
233  * * Request Payload: @ref mrq_query_tag_request
234  * * Response Payload: N/A
235  *
236  */
237
238 /**
239  * @ingroup Query_Tag
240  * @brief request with #MRQ_QUERY_TAG
241  *
242  * Used by #MRQ_QUERY_TAG call to ask BPMP to fill in the memory
243  * pointed by #addr with BPMP firmware header.
244  *
245  * The sender is reponsible for ensuring that #addr is mapped in to
246  * the recipient's address map.
247  */
248 struct mrq_query_tag_request {
249   /** @brief base address to store the firmware header */
250         uint32_t addr;
251 } __ABI_PACKED;
252
253 /**
254  * @ingroup MRQ_Codes
255  * @def MRQ_MODULE_LOAD
256  * @brief dynamically load a BPMP code module
257  *
258  * * Platforms: All
259  * * Initiators: CCPLEX
260  * * Targets: BPMP
261  * * Request Payload: @ref mrq_module_load_request
262  * * Response Payload: @ref mrq_module_load_response
263  *
264  * @note This MRQ is disabled on production systems
265  *
266  */
267
268 /**
269  * @ingroup Module
270  * @brief request with #MRQ_MODULE_LOAD
271  *
272  * Used by #MRQ_MODULE_LOAD calls to ask the recipient to dynamically
273  * load the code located at #phys_addr and having size #size
274  * bytes. #phys_addr is treated as a void pointer.
275  *
276  * The recipient copies the code from #phys_addr to locally allocated
277  * memory prior to responding to this message.
278  *
279  * @todo document the module header format
280  *
281  * The sender is responsible for ensuring that the code is mapped in
282  * the recipient's address map.
283  *
284  */
285 struct mrq_module_load_request {
286         /** @brief base address of the code to load. Treated as (void *) */
287         uint32_t phys_addr; /* (void *) */
288         /** @brief size in bytes of code to load */
289         uint32_t size;
290 } __ABI_PACKED;
291
292 /**
293  * @ingroup Module
294  * @brief response to #MRQ_MODULE_LOAD
295  *
296  * @todo document mrq_response::err
297  */
298 struct mrq_module_load_response {
299         /** @brief handle to the loaded module */
300         uint32_t base;
301 } __ABI_PACKED;
302
303 /**
304  * @ingroup MRQ_Codes
305  * @def MRQ_MODULE_UNLOAD
306  * @brief unload a previously loaded code module
307  *
308  * * Platforms: All
309  * * Initiators: CCPLEX
310  * * Targets: BPMP
311  * * Request Payload: @ref mrq_module_unload_request
312  * * Response Payload: N/A
313  *
314  * @note This MRQ is disabled on production systems
315  */
316
317 /**
318  * @ingroup Module
319  * @brief request with #MRQ_MODULE_UNLOAD
320  *
321  * Used by #MRQ_MODULE_UNLOAD calls to request that a previously loaded
322  * module be unloaded.
323  */
324 struct mrq_module_unload_request {
325         /** @brief handle of the module to unload */
326         uint32_t base;
327 } __ABI_PACKED;
328
329 /**
330  * @ingroup MRQ_Codes
331  * @def MRQ_TRACE_MODIFY
332  * @brief modify the set of enabled trace events
333  *
334  * * Platforms: All
335  * * Initiators: CCPLEX
336  * * Targets: BPMP
337  * * Request Payload: @ref mrq_trace_modify_request
338  * * Response Payload: @ref mrq_trace_modify_response
339  *
340  * @note This MRQ is disabled on production systems
341  */
342
343 /**
344  * @ingroup Trace
345  * @brief request with #MRQ_TRACE_MODIFY
346  *
347  * Used by %MRQ_TRACE_MODIFY calls to enable or disable specify trace
348  * events.  #set takes precedence for any bit set in both #set and
349  * #clr.
350  */
351 struct mrq_trace_modify_request {
352         /** @brief bit mask of trace events to disable */
353         uint32_t clr;
354         /** @brief bit mask of trace events to enable */
355         uint32_t set;
356 } __ABI_PACKED;
357
358 /**
359  * @ingroup Trace
360  * @brief response to #MRQ_TRACE_MODIFY
361  *
362  * Sent in repsonse to an #MRQ_TRACE_MODIFY message. #mask reflects the
363  * state of which events are enabled after the recipient acted on the
364  * message.
365  *
366  */
367 struct mrq_trace_modify_response {
368         /** @brief bit mask of trace event enable states */
369         uint32_t mask;
370 } __ABI_PACKED;
371
372 /**
373  * @ingroup MRQ_Codes
374  * @def MRQ_WRITE_TRACE
375  * @brief Write trace data to a buffer
376  *
377  * * Platforms: All
378  * * Initiators: CCPLEX
379  * * Targets: BPMP
380  * * Request Payload: @ref mrq_write_trace_request
381  * * Response Payload: @ref mrq_write_trace_response
382  *
383  * mrq_response::err depends on the @ref mrq_write_trace_request field
384  * values. err is -#BPMP_EINVAL if size is zero or area is NULL or
385  * area is in an illegal range. A positive value for err indicates the
386  * number of bytes written to area.
387  *
388  * @note This MRQ is disabled on production systems
389  */
390
391 /**
392  * @ingroup Trace
393  * @brief request with #MRQ_WRITE_TRACE
394  *
395  * Used by MRQ_WRITE_TRACE calls to ask the recipient to copy trace
396  * data from the recipient's local buffer to the output buffer. #area
397  * is treated as a byte-aligned pointer in the recipient's address
398  * space.
399  *
400  * The sender is responsible for ensuring that the output
401  * buffer is mapped in the recipient's address map. The recipient is
402  * responsible for protecting its own code and data from accidental
403  * overwrites.
404  */
405 struct mrq_write_trace_request {
406         /** @brief base address of output buffer */
407         uint32_t area;
408         /** @brief size in bytes of the output buffer */
409         uint32_t size;
410 } __ABI_PACKED;
411
412 /**
413  * @ingroup Trace
414  * @brief response to #MRQ_WRITE_TRACE
415  *
416  * Once this response is sent, the respondent will not access the
417  * output buffer further.
418  */
419 struct mrq_write_trace_response {
420         /**
421          * @brief flag whether more data remains in local buffer
422          *
423          * Value is 1 if the entire local trace buffer has been
424          * drained to the outputbuffer. Value is 0 otherwise.
425          */
426         uint32_t eof;
427 } __ABI_PACKED;
428
429 /** @private */
430 struct mrq_threaded_ping_request {
431         uint32_t challenge;
432 } __ABI_PACKED;
433
434 /** @private */
435 struct mrq_threaded_ping_response {
436         uint32_t reply;
437 } __ABI_PACKED;
438
439 /**
440  * @ingroup MRQ_Codes
441  * @def MRQ_MODULE_MAIL
442  * @brief send a message to a loadable module
443  *
444  * * Platforms: All
445  * * Initiators: Any
446  * * Targets: BPMP
447  * * Request Payload: @ref mrq_module_mail_request
448  * * Response Payload: @ref mrq_module_mail_response
449  *
450  * @note This MRQ is disabled on production systems
451  */
452
453 /**
454  * @ingroup Module
455  * @brief request with #MRQ_MODULE_MAIL
456  */
457 struct mrq_module_mail_request {
458         /** @brief handle to the previously loaded module */
459         uint32_t base;
460         /** @brief module-specific mail payload
461          *
462          * The length of data[ ] is unknown to the BPMP core firmware
463          * but it is limited to the size of an IPC message.
464          */
465         uint8_t data[EMPTY_ARRAY];
466 } __ABI_PACKED;
467
468 /**
469  * @ingroup Module
470  * @brief response to #MRQ_MODULE_MAIL
471  */
472 struct mrq_module_mail_response {
473         /** @brief module-specific mail payload
474          *
475          * The length of data[ ] is unknown to the BPMP core firmware
476          * but it is limited to the size of an IPC message.
477          */
478         uint8_t data[EMPTY_ARRAY];
479 } __ABI_PACKED;
480
481 /**
482  * @ingroup MRQ_Codes
483  * @def MRQ_DEBUGFS
484  * @brief Interact with BPMP's debugfs file nodes
485  *
486  * * Platforms: T186
487  * * Initiators: Any
488  * * Targets: BPMP
489  * * Request Payload: @ref mrq_debugfs_request
490  * * Response Payload: @ref mrq_debugfs_response
491  */
492
493 /**
494  * @addtogroup Debugfs
495  * @{
496  *
497  * The BPMP firmware implements a pseudo-filesystem called
498  * debugfs. Any driver within the firmware may register with debugfs
499  * to expose an arbitrary set of "files" in the filesystem. When
500  * software on the CPU writes to a debugfs file, debugfs passes the
501  * written data to a callback provided by the driver. When software on
502  * the CPU reads a debugfs file, debugfs queries the driver for the
503  * data to return to the CPU. The intention of the debugfs filesystem
504  * is to provide information useful for debugging the system at
505  * runtime.
506  *
507  * @note The files exposed via debugfs are not part of the
508  * BPMP firmware's ABI. debugfs files may be added or removed in any
509  * given version of the firmware. Typically the semantics of a debugfs
510  * file are consistent from version to version but even that is not
511  * guaranteed.
512  *
513  * @}
514  */
515 /** @ingroup Debugfs */
516 enum mrq_debugfs_commands {
517         CMD_DEBUGFS_READ = 1,
518         CMD_DEBUGFS_WRITE = 2,
519         CMD_DEBUGFS_DUMPDIR = 3,
520         CMD_DEBUGFS_MAX
521 };
522
523 /**
524  * @ingroup Debugfs
525  * @brief parameters for CMD_DEBUGFS_READ/WRITE command
526  */
527 struct cmd_debugfs_fileop_request {
528         /** @brief physical address pointing at filename */
529         uint32_t fnameaddr;
530         /** @brief length in bytes of filename buffer */
531         uint32_t fnamelen;
532         /** @brief physical address pointing to data buffer */
533         uint32_t dataaddr;
534         /** @brief length in bytes of data buffer */
535         uint32_t datalen;
536 } __ABI_PACKED;
537
538 /**
539  * @ingroup Debugfs
540  * @brief parameters for CMD_DEBUGFS_READ/WRITE command
541  */
542 struct cmd_debugfs_dumpdir_request {
543         /** @brief physical address pointing to data buffer */
544         uint32_t dataaddr;
545         /** @brief length in bytes of data buffer */
546         uint32_t datalen;
547 } __ABI_PACKED;
548
549 /**
550  * @ingroup Debugfs
551  * @brief response data for CMD_DEBUGFS_READ/WRITE command
552  */
553 struct cmd_debugfs_fileop_response {
554         /** @brief always 0 */
555         uint32_t reserved;
556         /** @brief number of bytes read from or written to data buffer */
557         uint32_t nbytes;
558 } __ABI_PACKED;
559
560 /**
561  * @ingroup Debugfs
562  * @brief response data for CMD_DEBUGFS_DUMPDIR command
563  */
564 struct cmd_debugfs_dumpdir_response {
565         /** @brief always 0 */
566         uint32_t reserved;
567         /** @brief number of bytes read from or written to data buffer */
568         uint32_t nbytes;
569 } __ABI_PACKED;
570
571 /**
572  * @ingroup Debugfs
573  * @brief request with #MRQ_DEBUGFS.
574  *
575  * The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
576  * command to execute. Legal commands are the values of @ref
577  * mrq_debugfs_commands. Each command requires a specific additional
578  * payload of data.
579  *
580  * |command            |payload|
581  * |-------------------|-------|
582  * |CMD_DEBUGFS_READ   |fop    |
583  * |CMD_DEBUGFS_WRITE  |fop    |
584  * |CMD_DEBUGFS_DUMPDIR|dumpdir|
585  */
586 struct mrq_debugfs_request {
587         uint32_t cmd;
588         union {
589                 struct cmd_debugfs_fileop_request fop;
590                 struct cmd_debugfs_dumpdir_request dumpdir;
591         } __UNION_ANON;
592 } __ABI_PACKED;
593
594 /**
595  * @ingroup Debugfs
596  */
597 struct mrq_debugfs_response {
598         /** @brief always 0 */
599         int32_t reserved;
600         union {
601                 /** @brief response data for CMD_DEBUGFS_READ OR
602                  * CMD_DEBUGFS_WRITE command
603                  */
604                 struct cmd_debugfs_fileop_response fop;
605                 /** @brief response data for CMD_DEBUGFS_DUMPDIR command */
606                 struct cmd_debugfs_dumpdir_response dumpdir;
607         } __UNION_ANON;
608 } __ABI_PACKED;
609
610 /**
611  * @addtogroup Debugfs
612  * @{
613  */
614 #define DEBUGFS_S_ISDIR (1 << 9)
615 #define DEBUGFS_S_IRUSR (1 << 8)
616 #define DEBUGFS_S_IWUSR (1 << 7)
617 /** @} */
618
619
620 /**
621  * @ingroup MRQ_Codes
622  * @def MRQ_RESET
623  * @brief reset an IP block
624  *
625  * * Platforms: T186
626  * * Initiators: Any
627  * * Targets: BPMP
628  * * Request Payload: @ref mrq_reset_request
629  * * Response Payload: N/A
630  */
631
632 /**
633  * @ingroup Reset
634  */
635 enum mrq_reset_commands {
636         CMD_RESET_ASSERT = 1,
637         CMD_RESET_DEASSERT = 2,
638         CMD_RESET_MODULE = 3,
639         CMD_RESET_MAX, /* not part of ABI and subject to change */
640 };
641
642 /**
643  * @ingroup Reset
644  * @brief request with MRQ_RESET
645  *
646  * Used by the sender of an #MRQ_RESET message to request BPMP to
647  * assert or or deassert a given reset line.
648  */
649 struct mrq_reset_request {
650         /** @brief reset action to perform (@enum mrq_reset_commands) */
651         uint32_t cmd;
652         /** @brief id of the reset to affected */
653         uint32_t reset_id;
654 } __ABI_PACKED;
655
656 /**
657  * @ingroup MRQ_Codes
658  * @def MRQ_I2C
659  * @brief issue an i2c transaction
660  *
661  * * Platforms: T186
662  * * Initiators: Any
663  * * Targets: BPMP
664  * * Request Payload: @ref mrq_i2c_request
665  * * Response Payload: @ref mrq_i2c_response
666  */
667
668 /**
669  * @addtogroup I2C
670  * @{
671  */
672 #define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE   (MSG_DATA_MIN_SZ - 12)
673 #define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE  (MSG_DATA_MIN_SZ - 4)
674 /** @} */
675
676 /**
677  * @ingroup I2C
678  * @name Serial I2C flags
679  * Use these flags with serial_i2c_request::flags
680  * @{
681  */
682 #define SERIALI2C_TEN           0x0010
683 #define SERIALI2C_RD            0x0001
684 #define SERIALI2C_STOP          0x8000
685 #define SERIALI2C_NOSTART       0x4000
686 #define SERIALI2C_REV_DIR_ADDR  0x2000
687 #define SERIALI2C_IGNORE_NAK    0x1000
688 #define SERIALI2C_NO_RD_ACK     0x0800
689 #define SERIALI2C_RECV_LEN      0x0400
690 /** @} */
691 /** @ingroup I2C */
692 enum {
693         CMD_I2C_XFER = 1
694 };
695
696 /**
697  * @ingroup I2C
698  * @brief serializable i2c request
699  *
700  * Instances of this structure are packed (little-endian) into
701  * cmd_i2c_xfer_request::data_buf. Each instance represents a single
702  * transaction (or a portion of a transaction with repeated starts) on
703  * an i2c bus.
704  *
705  * Because these structures are packed, some instances are likely to
706  * be misaligned. Additionally because #data is variable length, it is
707  * not possible to iterate through a serialized list of these
708  * structures without inspecting #len in each instance.  It may be
709  * easier to serialize or deserialize cmd_i2c_xfer_request::data_buf
710  * manually rather than using this structure definition.
711 */
712 struct serial_i2c_request {
713         /** @brief I2C slave address */
714         uint16_t addr;
715         /** @brief bitmask of SERIALI2C_ flags */
716         uint16_t flags;
717         /** @brief length of I2C transaction in bytes */
718         uint16_t len;
719         /** @brief for write transactions only, #len bytes of data */
720         uint8_t data[];
721 } __ABI_PACKED;
722
723 /**
724  * @ingroup I2C
725  * @brief trigger one or more i2c transactions
726  */
727 struct cmd_i2c_xfer_request {
728         /** @brief valid bus number from mach-t186/i2c-t186.h*/
729         uint32_t bus_id;
730
731         /** @brief count of valid bytes in #data_buf*/
732         uint32_t data_size;
733
734         /** @brief serialized packed instances of @ref serial_i2c_request*/
735         uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE];
736 } __ABI_PACKED;
737
738 /**
739  * @ingroup I2C
740  * @brief container for data read from the i2c bus
741  *
742  * Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute
743  * zero or more I2C reads. The data read from the bus is serialized
744  * into #data_buf.
745  */
746 struct cmd_i2c_xfer_response {
747         /** @brief count of valid bytes in #data_buf*/
748         uint32_t data_size;
749         /** @brief i2c read data */
750         uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE];
751 } __ABI_PACKED;
752
753 /**
754  * @ingroup I2C
755  * @brief request with #MRQ_I2C
756  */
757 struct mrq_i2c_request {
758         /** @brief always CMD_I2C_XFER (i.e. 1) */
759         uint32_t cmd;
760         /** @brief parameters of the transfer request */
761         struct cmd_i2c_xfer_request xfer;
762 } __ABI_PACKED;
763
764 /**
765  * @ingroup I2C
766  * @brief response to #MRQ_I2C
767  */
768 struct mrq_i2c_response {
769         struct cmd_i2c_xfer_response xfer;
770 } __ABI_PACKED;
771
772 /**
773  * @ingroup MRQ_Codes
774  * @def MRQ_CLK
775  *
776  * * Platforms: T186
777  * * Initiators: Any
778  * * Targets: BPMP
779  * * Request Payload: @ref mrq_clk_request
780  * * Response Payload: @ref mrq_clk_response
781  * @addtogroup Clocks
782  * @{
783  */
784
785 /**
786  * @name MRQ_CLK sub-commands
787  * @{
788  */
789 enum {
790         CMD_CLK_GET_RATE = 1,
791         CMD_CLK_SET_RATE = 2,
792         CMD_CLK_ROUND_RATE = 3,
793         CMD_CLK_GET_PARENT = 4,
794         CMD_CLK_SET_PARENT = 5,
795         CMD_CLK_IS_ENABLED = 6,
796         CMD_CLK_ENABLE = 7,
797         CMD_CLK_DISABLE = 8,
798         CMD_CLK_GET_ALL_INFO = 14,
799         CMD_CLK_GET_MAX_CLK_ID = 15,
800         CMD_CLK_MAX,
801 };
802 /** @} */
803
804 #define MRQ_CLK_NAME_MAXLEN     40
805 #define MRQ_CLK_MAX_PARENTS     16
806
807 /** @private */
808 struct cmd_clk_get_rate_request {
809         EMPTY
810 } __ABI_PACKED;
811
812 struct cmd_clk_get_rate_response {
813         int64_t rate;
814 } __ABI_PACKED;
815
816 struct cmd_clk_set_rate_request {
817         int32_t unused;
818         int64_t rate;
819 } __ABI_PACKED;
820
821 struct cmd_clk_set_rate_response {
822         int64_t rate;
823 } __ABI_PACKED;
824
825 struct cmd_clk_round_rate_request {
826         int32_t unused;
827         int64_t rate;
828 } __ABI_PACKED;
829
830 struct cmd_clk_round_rate_response {
831         int64_t rate;
832 } __ABI_PACKED;
833
834 /** @private */
835 struct cmd_clk_get_parent_request {
836         EMPTY
837 } __ABI_PACKED;
838
839 struct cmd_clk_get_parent_response {
840         uint32_t parent_id;
841 } __ABI_PACKED;
842
843 struct cmd_clk_set_parent_request {
844         uint32_t parent_id;
845 } __ABI_PACKED;
846
847 struct cmd_clk_set_parent_response {
848         uint32_t parent_id;
849 } __ABI_PACKED;
850
851 /** @private */
852 struct cmd_clk_is_enabled_request {
853         EMPTY
854 } __ABI_PACKED;
855
856 struct cmd_clk_is_enabled_response {
857         int32_t state;
858 } __ABI_PACKED;
859
860 /** @private */
861 struct cmd_clk_enable_request {
862         EMPTY
863 } __ABI_PACKED;
864
865 /** @private */
866 struct cmd_clk_enable_response {
867         EMPTY
868 } __ABI_PACKED;
869
870 /** @private */
871 struct cmd_clk_disable_request {
872         EMPTY
873 } __ABI_PACKED;
874
875 /** @private */
876 struct cmd_clk_disable_response {
877         EMPTY
878 } __ABI_PACKED;
879
880 /** @private */
881 struct cmd_clk_get_all_info_request {
882         EMPTY
883 } __ABI_PACKED;
884
885 struct cmd_clk_get_all_info_response {
886         uint32_t flags;
887         uint32_t parent;
888         uint32_t parents[MRQ_CLK_MAX_PARENTS];
889         uint8_t num_parents;
890         uint8_t name[MRQ_CLK_NAME_MAXLEN];
891 } __ABI_PACKED;
892
893 /** @private */
894 struct cmd_clk_get_max_clk_id_request {
895         EMPTY
896 } __ABI_PACKED;
897
898 struct cmd_clk_get_max_clk_id_response {
899         uint32_t max_id;
900 } __ABI_PACKED;
901 /** @} */
902
903 /**
904  * @ingroup Clocks
905  * @brief request with #MRQ_CLK
906  *
907  * Used by the sender of an #MRQ_CLK message to control clocks. The
908  * clk_request is split into several sub-commands. Some sub-commands
909  * require no additional data. Others have a sub-command specific
910  * payload
911  *
912  * |sub-command                 |payload                |
913  * |----------------------------|-----------------------|
914  * |CMD_CLK_GET_RATE            |-                      |
915  * |CMD_CLK_SET_RATE            |clk_set_rate           |
916  * |CMD_CLK_ROUND_RATE          |clk_round_rate         |
917  * |CMD_CLK_GET_PARENT          |-                      |
918  * |CMD_CLK_SET_PARENT          |clk_set_parent         |
919  * |CMD_CLK_IS_ENABLED          |-                      |
920  * |CMD_CLK_ENABLE              |-                      |
921  * |CMD_CLK_DISABLE             |-                      |
922  * |CMD_CLK_GET_ALL_INFO        |-                      |
923  * |CMD_CLK_GET_MAX_CLK_ID      |-                      |
924  *
925  */
926
927 struct mrq_clk_request {
928         /** @brief sub-command and clock id concatenated to 32-bit word.
929          * - bits[31..24] is the sub-cmd.
930          * - bits[23..0] is the clock id
931          */
932         uint32_t cmd_and_id;
933
934         union {
935                 /** @private */
936                 struct cmd_clk_get_rate_request clk_get_rate;
937                 struct cmd_clk_set_rate_request clk_set_rate;
938                 struct cmd_clk_round_rate_request clk_round_rate;
939                 /** @private */
940                 struct cmd_clk_get_parent_request clk_get_parent;
941                 struct cmd_clk_set_parent_request clk_set_parent;
942                 /** @private */
943                 struct cmd_clk_enable_request clk_enable;
944                 /** @private */
945                 struct cmd_clk_disable_request clk_disable;
946                 /** @private */
947                 struct cmd_clk_is_enabled_request clk_is_enabled;
948                 /** @private */
949                 struct cmd_clk_get_all_info_request clk_get_all_info;
950                 /** @private */
951                 struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id;
952         } __UNION_ANON;
953 } __ABI_PACKED;
954
955 /**
956  * @ingroup Clocks
957  * @brief response to MRQ_CLK
958  *
959  * Each sub-command supported by @ref mrq_clk_request may return
960  * sub-command-specific data. Some do and some do not as indicated in
961  * the following table
962  *
963  * |sub-command                 |payload                 |
964  * |----------------------------|------------------------|
965  * |CMD_CLK_GET_RATE            |clk_get_rate            |
966  * |CMD_CLK_SET_RATE            |clk_set_rate            |
967  * |CMD_CLK_ROUND_RATE          |clk_round_rate          |
968  * |CMD_CLK_GET_PARENT          |clk_get_parent          |
969  * |CMD_CLK_SET_PARENT          |clk_set_parent          |
970  * |CMD_CLK_IS_ENABLED          |clk_is_enabled          |
971  * |CMD_CLK_ENABLE              |-                       |
972  * |CMD_CLK_DISABLE             |-                       |
973  * |CMD_CLK_GET_ALL_INFO        |clk_get_all_info        |
974  * |CMD_CLK_GET_MAX_CLK_ID      |clk_get_max_id          |
975  *
976  */
977
978 struct mrq_clk_response {
979         union {
980                 struct cmd_clk_get_rate_response clk_get_rate;
981                 struct cmd_clk_set_rate_response clk_set_rate;
982                 struct cmd_clk_round_rate_response clk_round_rate;
983                 struct cmd_clk_get_parent_response clk_get_parent;
984                 struct cmd_clk_set_parent_response clk_set_parent;
985                 /** @private */
986                 struct cmd_clk_enable_response clk_enable;
987                 /** @private */
988                 struct cmd_clk_disable_response clk_disable;
989                 struct cmd_clk_is_enabled_response clk_is_enabled;
990                 struct cmd_clk_get_all_info_response clk_get_all_info;
991                 struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id;
992         } __UNION_ANON;
993 } __ABI_PACKED;
994
995 /**
996  * @ingroup MRQ_Codes
997  * @def MRQ_QUERY_ABI
998  * @brief check if an MRQ is implemented
999  *
1000  * * Platforms: All
1001  * * Initiators: Any
1002  * * Targets: Any
1003  * * Request Payload: @ref mrq_query_abi_request
1004  * * Response Payload: @ref mrq_query_abi_response
1005  */
1006
1007 /**
1008  * @ingroup ABI_info
1009  * @brief request with MRQ_QUERY_ABI
1010  *
1011  * Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
1012  * by the recipient.
1013  */
1014 struct mrq_query_abi_request {
1015         /** @brief MRQ code to query */
1016         uint32_t mrq;
1017 } __ABI_PACKED;
1018
1019 /**
1020  * @ingroup ABI_info
1021  * @brief response to MRQ_QUERY_ABI
1022  */
1023 struct mrq_query_abi_response {
1024         /** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
1025         int32_t status;
1026 } __ABI_PACKED;
1027
1028 /**
1029  * @ingroup MRQ_Codes
1030  * @def MRQ_PG_READ_STATE
1031  * @brief read the power-gating state of a partition
1032  *
1033  * * Platforms: T186
1034  * * Initiators: Any
1035  * * Targets: BPMP
1036  * * Request Payload: @ref mrq_pg_read_state_request
1037  * * Response Payload: @ref mrq_pg_read_state_response
1038  * @addtogroup Powergating
1039  * @{
1040  */
1041
1042 /**
1043  * @brief request with #MRQ_PG_READ_STATE
1044  *
1045  * Used by MRQ_PG_READ_STATE call to read the current state of a
1046  * partition.
1047  */
1048 struct mrq_pg_read_state_request {
1049         /** @brief ID of partition */
1050         uint32_t partition_id;
1051 } __ABI_PACKED;
1052
1053 /**
1054  * @brief response to MRQ_PG_READ_STATE
1055  * @todo define possible errors.
1056  */
1057 struct mrq_pg_read_state_response {
1058         /** @brief read as don't care */
1059         uint32_t sram_state;
1060         /** @brief state of power partition
1061          * * 0 : off
1062          * * 1 : on
1063          */
1064         uint32_t logic_state;
1065 } __ABI_PACKED;
1066
1067 /** @} */
1068
1069 /**
1070  * @ingroup MRQ_Codes
1071  * @def MRQ_PG_UPDATE_STATE
1072  * @brief modify the power-gating state of a partition
1073  *
1074  * * Platforms: T186
1075  * * Initiators: Any
1076  * * Targets: BPMP
1077  * * Request Payload: @ref mrq_pg_update_state_request
1078  * * Response Payload: N/A
1079  * @addtogroup Powergating
1080  * @{
1081  */
1082
1083 /**
1084  * @brief request with mrq_pg_update_state_request
1085  *
1086  * Used by #MRQ_PG_UPDATE_STATE call to request BPMP to change the
1087  * state of a power partition #partition_id.
1088  */
1089 struct mrq_pg_update_state_request {
1090         /** @brief ID of partition */
1091         uint32_t partition_id;
1092         /** @brief secondary control of power partition
1093          *  @details Ignored by many versions of the BPMP
1094          *  firmware. For maximum compatibility, set the value
1095          *  according to @logic_state
1096          * *  0x1: power ON partition (@ref logic_state == 0x3)
1097          * *  0x3: power OFF partition (@ref logic_state == 0x1)
1098          */
1099         uint32_t sram_state;
1100         /** @brief controls state of power partition, legal values are
1101          * *  0x1 : power OFF partition
1102          * *  0x3 : power ON partition
1103          */
1104         uint32_t logic_state;
1105         /** @brief change state of clocks of the power partition, legal values
1106          * *  0x0 : do not change clock state
1107          * *  0x1 : disable partition clocks (only applicable when
1108          *          @ref logic_state == 0x1)
1109          * *  0x3 : enable partition clocks (only applicable when
1110          *          @ref logic_state == 0x3)
1111          */
1112         uint32_t clock_state;
1113 } __ABI_PACKED;
1114 /** @} */
1115
1116 /**
1117  * @ingroup MRQ_Codes
1118  * @def MRQ_THERMAL
1119  * @brief interact with BPMP thermal framework
1120  *
1121  * * Platforms: T186
1122  * * Initiators: Any
1123  * * Targets: Any
1124  * * Request Payload: TODO
1125  * * Response Payload: TODO
1126  *
1127  * @addtogroup Thermal
1128  *
1129  * The BPMP firmware includes a thermal framework. Drivers within the
1130  * bpmp firmware register with the framework to provide thermal
1131  * zones. Each thermal zone corresponds to an entity whose temperature
1132  * can be measured. The framework also has a notion of trip points. A
1133  * trip point consists of a thermal zone id, a temperature, and a
1134  * callback routine. The framework invokes the callback when the zone
1135  * hits the indicated temperature. The BPMP firmware uses this thermal
1136  * framework interally to implement various temperature-dependent
1137  * functions.
1138  *
1139  * Software on the CPU can use #MRQ_THERMAL (with payload @ref
1140  * mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal
1141  * framework. The CPU must It can query the number of supported zones,
1142  * query zone temperatures, and set trip points.
1143  *
1144  * When a trip point set by the CPU gets crossed, BPMP firmware issues
1145  * an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a
1146  * payload of @ref mrq_thermal_bpmp_to_host_request.
1147  * @{
1148  */
1149 enum mrq_thermal_host_to_bpmp_cmd {
1150         /**
1151          * @brief Check whether the BPMP driver supports the specified
1152          * request type.
1153          *
1154          * Host needs to supply request parameters.
1155          *
1156          * mrq_response::err is 0 if the specified request is
1157          * supported and -#BPMP_ENODEV otherwise.
1158          */
1159         CMD_THERMAL_QUERY_ABI = 0,
1160
1161         /**
1162          * @brief Get the current temperature of the specified zone.
1163          *
1164          * Host needs to supply request parameters.
1165          *
1166          * mrq_response::err is
1167          * *  0: Temperature query succeeded.
1168          * *  -#BPMP_EINVAL: Invalid request parameters.
1169          * *  -#BPMP_ENOENT: No driver registered for thermal zone..
1170          * *  -#BPMP_EFAULT: Problem reading temperature measurement.
1171          */
1172         CMD_THERMAL_GET_TEMP = 1,
1173
1174         /**
1175          * @brief Enable or disable and set the lower and upper
1176          *   thermal limits for a thermal trip point. Each zone has
1177          *   one trip point.
1178          *
1179          * Host needs to supply request parameters. Once the
1180          * temperature hits a trip point, the BPMP will send a message
1181          * to the CPU having MRQ=MRQ_THERMAL and
1182          * type=CMD_THERMAL_HOST_TRIP_REACHED
1183          *
1184          * mrq_response::err is
1185          * *  0: Trip successfully set.
1186          * *  -#BPMP_EINVAL: Invalid request parameters.
1187          * *  -#BPMP_ENOENT: No driver registered for thermal zone.
1188          * *  -#BPMP_EFAULT: Problem setting trip point.
1189          */
1190         CMD_THERMAL_SET_TRIP = 2,
1191
1192         /**
1193          * @brief Get the number of supported thermal zones.
1194          *
1195          * No request parameters required.
1196          *
1197          * mrq_response::err is always 0, indicating success.
1198          */
1199         CMD_THERMAL_GET_NUM_ZONES = 3,
1200
1201         /** @brief: number of supported host-to-bpmp commands. May
1202          * increase in future
1203          */
1204         CMD_THERMAL_HOST_TO_BPMP_NUM
1205 };
1206
1207 enum mrq_thermal_bpmp_to_host_cmd {
1208         /**
1209          * @brief Indication that the temperature for a zone has
1210          *   exceeded the range indicated in the thermal trip point
1211          *   for the zone.
1212          *
1213          * BPMP needs to supply request parameters. Host only needs to
1214          * acknowledge.
1215          */
1216         CMD_THERMAL_HOST_TRIP_REACHED = 100,
1217
1218         /** @brief: number of supported bpmp-to-host commands. May
1219          * increase in future
1220          */
1221         CMD_THERMAL_BPMP_TO_HOST_NUM
1222 };
1223
1224 /*
1225  * Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
1226  *
1227  * zone: Request type for which to check existence.
1228  */
1229 struct cmd_thermal_query_abi_request {
1230         uint32_t type;
1231 } __ABI_PACKED;
1232
1233 /*
1234  * Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
1235  *
1236  * zone: Number of thermal zone.
1237  */
1238 struct cmd_thermal_get_temp_request {
1239         uint32_t zone;
1240 } __ABI_PACKED;
1241
1242 /*
1243  * BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
1244  *
1245  * error: 0 if request succeeded.
1246  *      -BPMP_EINVAL if request parameters were invalid.
1247  *      -BPMP_ENOENT if no driver was registered for the specified thermal zone.
1248  *      -BPMP_EFAULT for other thermal zone driver errors.
1249  * temp: Current temperature in millicelsius.
1250  */
1251 struct cmd_thermal_get_temp_response {
1252         int32_t temp;
1253 } __ABI_PACKED;
1254
1255 /*
1256  * Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
1257  *
1258  * zone: Number of thermal zone.
1259  * low: Temperature of lower trip point in millicelsius
1260  * high: Temperature of upper trip point in millicelsius
1261  * enabled: 1 to enable trip point, 0 to disable trip point
1262  */
1263 struct cmd_thermal_set_trip_request {
1264         uint32_t zone;
1265         int32_t low;
1266         int32_t high;
1267         uint32_t enabled;
1268 } __ABI_PACKED;
1269
1270 /*
1271  * BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
1272  *
1273  * zone: Number of thermal zone where trip point was reached.
1274  */
1275 struct cmd_thermal_host_trip_reached_request {
1276         uint32_t zone;
1277 } __ABI_PACKED;
1278
1279 /*
1280  * BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
1281  *
1282  * num: Number of supported thermal zones. The thermal zones are indexed
1283  *      starting from zero.
1284  */
1285 struct cmd_thermal_get_num_zones_response {
1286         uint32_t num;
1287 } __ABI_PACKED;
1288
1289 /*
1290  * Host->BPMP request data.
1291  *
1292  * Reply type is union mrq_thermal_bpmp_to_host_response.
1293  *
1294  * type: Type of request. Values listed in enum mrq_thermal_type.
1295  * data: Request type specific parameters.
1296  */
1297 struct mrq_thermal_host_to_bpmp_request {
1298         uint32_t type;
1299         union {
1300                 struct cmd_thermal_query_abi_request query_abi;
1301                 struct cmd_thermal_get_temp_request get_temp;
1302                 struct cmd_thermal_set_trip_request set_trip;
1303         } __UNION_ANON;
1304 } __ABI_PACKED;
1305
1306 /*
1307  * BPMP->Host request data.
1308  *
1309  * type: Type of request. Values listed in enum mrq_thermal_type.
1310  * data: Request type specific parameters.
1311  */
1312 struct mrq_thermal_bpmp_to_host_request {
1313         uint32_t type;
1314         union {
1315                 struct cmd_thermal_host_trip_reached_request host_trip_reached;
1316         } __UNION_ANON;
1317 } __ABI_PACKED;
1318
1319 /*
1320  * Data in reply to a Host->BPMP request.
1321  */
1322 union mrq_thermal_bpmp_to_host_response {
1323         struct cmd_thermal_get_temp_response get_temp;
1324         struct cmd_thermal_get_num_zones_response get_num_zones;
1325 } __ABI_PACKED;
1326 /** @} */
1327
1328 /**
1329  * @ingroup MRQ_Codes
1330  * @def MRQ_CPU_VHINT
1331  * @brief Query CPU voltage hint data
1332  *
1333  * * Platforms: T186
1334  * * Initiators: CCPLEX
1335  * * Targets: BPMP
1336  * * Request Payload: @ref mrq_cpu_vhint_request
1337  * * Response Payload: N/A
1338  *
1339  * @addtogroup Vhint CPU Voltage hint
1340  * @{
1341  */
1342
1343 /**
1344  * @brief request with #MRQ_CPU_VHINT
1345  *
1346  * Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data
1347  * from BPMP to memory space pointed by #addr. CCPLEX is responsible
1348  * to allocate sizeof(cpu_vhint_data) sized block of memory and
1349  * appropriately map it for BPMP before sending the request.
1350  */
1351 struct mrq_cpu_vhint_request {
1352         /** @brief IOVA address for the #cpu_vhint_data */
1353         uint32_t addr; /* struct cpu_vhint_data * */
1354         /** @brief ID of the cluster whose data is requested */
1355         uint32_t cluster_id; /* enum cluster_id */
1356 } __ABI_PACKED;
1357
1358 /**
1359  * @brief description of the CPU v/f relation
1360  *
1361  * Used by #MRQ_CPU_VHINT call to carry data pointed by #addr of
1362  * struct mrq_cpu_vhint_request
1363  */
1364 struct cpu_vhint_data {
1365         uint32_t ref_clk_hz; /**< reference frequency in Hz */
1366         uint16_t pdiv; /**< post divider value */
1367         uint16_t mdiv; /**< input divider value */
1368         uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */
1369         /** table of ndiv values as a function of vINDEX (voltage index) */
1370         uint16_t ndiv[80];
1371         /** minimum allowed NDIV value */
1372         uint16_t ndiv_min;
1373         /** minimum allowed voltage hint value (as in vINDEX) */
1374         uint16_t vfloor;
1375         /** maximum allowed voltage hint value (as in vINDEX) */
1376         uint16_t vceil;
1377         /** post-multiplier for vindex value */
1378         uint16_t vindex_mult;
1379         /** post-divider for vindex value */
1380         uint16_t vindex_div;
1381         /** reserved for future use */
1382         uint16_t reserved[328];
1383 } __ABI_PACKED;
1384
1385 /** @} */
1386
1387 /**
1388  * @ingroup MRQ_Codes
1389  * @def MRQ_ABI_RATCHET
1390  * @brief ABI ratchet value query
1391  *
1392  * * Platforms: T186
1393  * * Initiators: Any
1394  * * Targets: BPMP
1395  * * Request Payload: @ref mrq_abi_ratchet_request
1396  * * Response Payload: @ref mrq_abi_ratchet_response
1397  * @addtogroup ABI_info
1398  * @{
1399  */
1400
1401 /**
1402  * @brief an ABI compatibility mechanism
1403  *
1404  * BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future
1405  * revision of this header file.
1406  * 1. That future revision deprecates some MRQ
1407  * 2. That future revision introduces a breaking change to an existing
1408  *    MRQ or
1409  * 3. A bug is discovered in an existing implementation of the BPMP-FW
1410  *    (or possibly one of its clients) which warrants deprecating that
1411  *    implementation.
1412  */
1413 #define BPMP_ABI_RATCHET_VALUE 3
1414
1415 /**
1416  * @brief request with #MRQ_ABI_RATCHET.
1417  *
1418  * #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
1419  * against which the requester was compiled.
1420  *
1421  * If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may
1422  * reply with mrq_response::err = -#BPMP_ERANGE to indicate that
1423  * BPMP-FW cannot interoperate correctly with the requester. Requester
1424  * should cease further communication with BPMP.
1425  *
1426  * Otherwise, err shall be 0.
1427  */
1428 struct mrq_abi_ratchet_request {
1429         /** @brief requester's ratchet value */
1430         uint16_t ratchet;
1431 };
1432
1433 /**
1434  * @brief response to #MRQ_ABI_RATCHET
1435  *
1436  * #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
1437  * against which BPMP firwmare was compiled.
1438  *
1439  * If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE,
1440  * the requster must either interoperate with BPMP according to an ABI
1441  * header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease
1442  * communication with BPMP.
1443  *
1444  * If mrq_response::err is 0 and ratchet is greater than or equal to the
1445  * requester's BPMP_ABI_RATCHET_VALUE, the requester should continue
1446  * normal operation.
1447  */
1448 struct mrq_abi_ratchet_response {
1449         /** @brief BPMP's ratchet value */
1450         uint16_t ratchet;
1451 };
1452 /** @} */
1453
1454 /**
1455  * @ingroup MRQ_Codes
1456  * @def MRQ_EMC_DVFS_LATENCY
1457  * @brief query frequency dependent EMC DVFS latency
1458  *
1459  * * Platforms: T186
1460  * * Initiators: CCPLEX
1461  * * Targets: BPMP
1462  * * Request Payload: N/A
1463  * * Response Payload: @ref mrq_emc_dvfs_latency_response
1464  * @addtogroup EMC
1465  * @{
1466  */
1467
1468 /**
1469  * @brief used by @ref mrq_emc_dvfs_latency_response
1470  */
1471 struct emc_dvfs_latency {
1472         /** @brief EMC frequency in kHz */
1473         uint32_t freq;
1474         /** @brief EMC DVFS latency in nanoseconds */
1475         uint32_t latency;
1476 } __ABI_PACKED;
1477
1478 #define EMC_DVFS_LATENCY_MAX_SIZE       14
1479 /**
1480  * @brief response to #MRQ_EMC_DVFS_LATENCY
1481  */
1482 struct mrq_emc_dvfs_latency_response {
1483         /** @brief the number valid entries in #pairs */
1484         uint32_t num_pairs;
1485         /** @brief EMC <frequency, latency> information */
1486         struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE];
1487 } __ABI_PACKED;
1488
1489 /** @} */
1490
1491 /**
1492  * @ingroup MRQ_Codes
1493  * @def MRQ_TRACE_ITER
1494  * @brief manage the trace iterator
1495  *
1496  * * Platforms: All
1497  * * Initiators: CCPLEX
1498  * * Targets: BPMP
1499  * * Request Payload: N/A
1500  * * Response Payload: @ref mrq_trace_iter_request
1501  * @addtogroup Trace
1502  * @{
1503  */
1504 enum {
1505         /** @brief (re)start the tracing now. Ignore older events */
1506         TRACE_ITER_INIT = 0,
1507         /** @brief clobber all events in the trace buffer */
1508         TRACE_ITER_CLEAN = 1
1509 };
1510
1511 /**
1512  * @brief request with #MRQ_TRACE_ITER
1513  */
1514 struct mrq_trace_iter_request {
1515         /** @brief TRACE_ITER_INIT or TRACE_ITER_CLEAN */
1516         uint32_t cmd;
1517 } __ABI_PACKED;
1518
1519 /** @} */
1520
1521 /*
1522  *  4. Enumerations
1523  */
1524
1525 /*
1526  *   4.1 CPU enumerations
1527  *
1528  * See <mach-t186/system-t186.h>
1529  *
1530  *   4.2 CPU Cluster enumerations
1531  *
1532  * See <mach-t186/system-t186.h>
1533  *
1534  *   4.3 System low power state enumerations
1535  *
1536  * See <mach-t186/system-t186.h>
1537  */
1538
1539 /*
1540  *   4.4 Clock enumerations
1541  *
1542  * For clock enumerations, see <mach-t186/clk-t186.h>
1543  */
1544
1545 /*
1546  *   4.5 Reset enumerations
1547  *
1548  * For reset enumerations, see <mach-t186/reset-t186.h>
1549  */
1550
1551 /*
1552  *   4.6 Thermal sensor enumerations
1553  *
1554  * For thermal sensor enumerations, see <mach-t186/thermal-t186.h>
1555  */
1556
1557 /**
1558  * @defgroup Error_Codes
1559  * Negative values for mrq_response::err generally indicate some
1560  * error. The ABI defines the following error codes. Negating these
1561  * defines is an exercise left to the user.
1562  * @{
1563  */
1564 /** @brief No such file or directory */
1565 #define BPMP_ENOENT     2
1566 /** @brief No MRQ handler */
1567 #define BPMP_ENOHANDLER 3
1568 /** @brief I/O error */
1569 #define BPMP_EIO        5
1570 /** @brief Bad sub-MRQ command */
1571 #define BPMP_EBADCMD    6
1572 /** @brief Not enough memory */
1573 #define BPMP_ENOMEM     12
1574 /** @brief Permission denied */
1575 #define BPMP_EACCES     13
1576 /** @brief Bad address */
1577 #define BPMP_EFAULT     14
1578 /** @brief No such device */
1579 #define BPMP_ENODEV     19
1580 /** @brief Argument is a directory */
1581 #define BPMP_EISDIR     21
1582 /** @brief Invalid argument */
1583 #define BPMP_EINVAL     22
1584 /** @brief Timeout during operation */
1585 #define BPMP_ETIMEDOUT  23
1586 /** @brief Out of range */
1587 #define BPMP_ERANGE     34
1588 /** @} */
1589 /** @} */
1590 #endif