/
bpmp-abi.h
3973 lines (3631 loc) · 115 KB
/
bpmp-abi.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved.
*/
#ifndef ABI_BPMP_ABI_H
#define ABI_BPMP_ABI_H
#if defined(LK) || defined(BPMP_ABI_HAVE_STDC)
#include <stddef.h>
#include <stdint.h>
#endif
#ifndef BPMP_ABI_PACKED
#ifdef __ABI_PACKED
#define BPMP_ABI_PACKED __ABI_PACKED
#else
#define BPMP_ABI_PACKED __attribute__((packed))
#endif
#endif
#ifdef NO_GCC_EXTENSIONS
#define BPMP_ABI_EMPTY char empty;
#define BPMP_ABI_EMPTY_ARRAY 1
#else
#define BPMP_ABI_EMPTY
#define BPMP_ABI_EMPTY_ARRAY 0
#endif
#ifndef BPMP_UNION_ANON
#ifdef __UNION_ANON
#define BPMP_UNION_ANON __UNION_ANON
#else
#define BPMP_UNION_ANON
#endif
#endif
/**
* @file
*/
/**
* @defgroup MRQ MRQ Messages
* @brief Messages sent to/from BPMP via IPC
* @{
* @defgroup MRQ_Format Message Format
* @defgroup MRQ_Codes Message Request (MRQ) Codes
* @defgroup MRQ_Payloads Message Payloads
* @defgroup Error_Codes Error Codes
* @}
*/
/**
* @addtogroup MRQ_Format
* @{
* The CPU requests the BPMP to perform a particular service by
* sending it an IVC frame containing a single MRQ message. An MRQ
* message consists of a @ref mrq_request followed by a payload whose
* format depends on mrq_request::mrq.
*
* The BPMP processes the data and replies with an IVC frame (on the
* same IVC channel) containing and MRQ response. An MRQ response
* consists of a @ref mrq_response followed by a payload whose format
* depends on the associated mrq_request::mrq.
*
* A well-defined subset of the MRQ messages that the CPU sends to the
* BPMP can lead to BPMP eventually sending an MRQ message to the
* CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
* a thermal trip point, the BPMP may eventually send a single
* #MRQ_THERMAL message of its own to the CPU indicating that the trip
* point has been crossed.
* @}
*/
/**
* @ingroup MRQ_Format
* Request an answer from the peer.
* This should be set in mrq_request::flags for all requests targetted
* at BPMP. For requests originating in BPMP, this flag is optional except
* for messages targeting MCE, for which the field must be set.
* When this flag is not set, the remote peer must not send a response
* back.
*/
#define BPMP_MAIL_DO_ACK (1U << 0U)
/**
* @ingroup MRQ_Format
* Ring the sender's doorbell when responding. This should be set unless
* the sender wants to poll the underlying communications layer directly.
*
* An optional direction that can be specified in mrq_request::flags.
*/
#define BPMP_MAIL_RING_DB (1U << 1U)
/**
* @ingroup MRQ_Format
* CRC present
*/
#define BPMP_MAIL_CRC_PRESENT (1U << 2U)
/**
* @ingroup MRQ_Format
* @brief Header for an MRQ message
*
* Provides the MRQ number for the MRQ message: #mrq. The remainder of
* the MRQ message is a payload (immediately following the
* mrq_request) whose format depends on mrq.
*/
struct mrq_request {
/** @brief MRQ number of the request */
uint32_t mrq;
/**
* @brief 32bit word containing a number of fields as follows:
*
* struct {
* uint8_t options:4;
* uint8_t xid:4;
* uint8_t payload_length;
* uint16_t crc16;
* };
*
* **options** directions to the receiver and indicates CRC presence.
*
* #BPMP_MAIL_DO_ACK and #BPMP_MAIL_RING_DB see documentation of respective options.
* #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms. It indicates the
* crc16, xid and length fields are present when set.
* Some platform configurations, especially when targeted to applications requiring
* functional safety, mandate this option being set or otherwise will respond with
* -BPMP_EBADMSG and ignore the request.
*
* **xid** is a transaction ID.
*
* Only used when #BPMP_MAIL_CRC_PRESENT is set.
*
* **payload_length** of the message expressed in bytes without the size of this header.
* See table below for minimum accepted payload lengths for each MRQ.
* Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes
* rather than bytes.
*
* Only used when #BPMP_MAIL_CRC_PRESENT is set.
*
* | MRQ | CMD | minimum payload length
* | -------------------- | ------------------------------------ | ------------------------------------------ |
* | MRQ_PING | | 4 |
* | MRQ_THREADED_PING | | 4 |
* | MRQ_RESET | any | 8 |
* | MRQ_I2C | | 12 + cmd_i2c_xfer_request.data_size |
* | MRQ_CLK | CMD_CLK_GET_RATE | 4 |
* | MRQ_CLK | CMD_CLK_SET_RATE | 16 |
* | MRQ_CLK | CMD_CLK_ROUND_RATE | 16 |
* | MRQ_CLK | CMD_CLK_GET_PARENT | 4 |
* | MRQ_CLK | CMD_CLK_SET_PARENT | 8 |
* | MRQ_CLK | CMD_CLK_ENABLE | 4 |
* | MRQ_CLK | CMD_CLK_DISABLE | 4 |
* | MRQ_CLK | CMD_CLK_IS_ENABLED | 4 |
* | MRQ_CLK | CMD_CLK_GET_ALL_INFO | 4 |
* | MRQ_CLK | CMD_CLK_GET_MAX_CLK_ID | 4 |
* | MRQ_CLK | CMD_CLK_GET_FMAX_AT_VMIN | 4 |
* | MRQ_QUERY_ABI | | 4 |
* | MRQ_PG | CMD_PG_QUERY_ABI | 12 |
* | MRQ_PG | CMD_PG_SET_STATE | 12 |
* | MRQ_PG | CMD_PG_GET_STATE | 8 |
* | MRQ_PG | CMD_PG_GET_NAME | 8 |
* | MRQ_PG | CMD_PG_GET_MAX_ID | 8 |
* | MRQ_THERMAL | CMD_THERMAL_QUERY_ABI | 8 |
* | MRQ_THERMAL | CMD_THERMAL_GET_TEMP | 8 |
* | MRQ_THERMAL | CMD_THERMAL_SET_TRIP | 20 |
* | MRQ_THERMAL | CMD_THERMAL_GET_NUM_ZONES | 4 |
* | MRQ_THERMAL | CMD_THERMAL_GET_THERMTRIP | 8 |
* | MRQ_CPU_VHINT | | 8 |
* | MRQ_ABI_RATCHET | | 2 |
* | MRQ_EMC_DVFS_LATENCY | | 8 |
* | MRQ_EMC_DVFS_EMCHUB | | 8 |
* | MRQ_EMC_DISP_RFL | | 4 |
* | MRQ_BWMGR | CMD_BWMGR_QUERY_ABI | 8 |
* | MRQ_BWMGR | CMD_BWMGR_CALC_RATE | 8 + 8 * bwmgr_rate_req.num_iso_clients |
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_QUERY_ABI | 8 |
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_CALCULATE_LA | 16 |
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_SET_LA | 16 |
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_GET_MAX_BW | 8 |
* | MRQ_CPU_NDIV_LIMITS | | 4 |
* | MRQ_CPU_AUTO_CC3 | | 4 |
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_QUERY_ABI | 8 |
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_READ | 5 |
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_WRITE | 5 + cmd_ringbuf_console_write_req.len |
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_GET_FIFO | 4 |
* | MRQ_STRAP | STRAP_SET | 12 |
* | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | 24 |
* | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_STATUS | 4 |
* | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT | 5 |
* | MRQ_UPHY | CMD_UPHY_PCIE_CONTROLLER_STATE | 6 |
* | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF | 5 |
* | MRQ_FMON | CMD_FMON_GEAR_CLAMP | 16 |
* | MRQ_FMON | CMD_FMON_GEAR_FREE | 4 |
* | MRQ_FMON | CMD_FMON_GEAR_GET | 4 |
* | MRQ_FMON | CMD_FMON_FAULT_STS_GET | 8 |
* | MRQ_EC | CMD_EC_STATUS_EX_GET | 12 |
* | MRQ_QUERY_FW_TAG | | 0 |
* | MRQ_DEBUG | CMD_DEBUG_OPEN_RO | 4 + length of cmd_debug_fopen_request.name |
* | MRQ_DEBUG | CMD_DEBUG_OPEN_WO | 4 + length of cmd_debug_fopen_request.name |
* | MRQ_DEBUG | CMD_DEBUG_READ | 8 |
* | MRQ_DEBUG | CMD_DEBUG_WRITE | 12 + cmd_debug_fwrite_request.datalen |
* | MRQ_DEBUG | CMD_DEBUG_CLOSE | 8 |
* | MRQ_TELEMETRY | | 8 |
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_QUERY_ABI | 8 |
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_SET | 20 |
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_GET | 16 |
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_CURR_CAP | 8 |
* | MRQ_GEARS | | 0 |
* | MRQ_BWMGR_INT | CMD_BWMGR_INT_QUERY_ABI | 8 |
* | MRQ_BWMGR_INT | CMD_BWMGR_INT_CALC_AND_SET | 16 |
* | MRQ_BWMGR_INT | CMD_BWMGR_INT_CAP_SET | 8 |
* | MRQ_OC_STATUS | | 0 |
*
* **crc16**
*
* CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1
* and initialization value 0x4657. The CRC is calculated over all bytes of the message
* including this header. However the crc16 field is considered to be set to 0 when
* calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. If
* #BPMP_MAIL_CRC_PRESENT is set and this field does not match the CRC as
* calculated by BPMP, -BPMP_EBADMSG will be returned and the request will
* be ignored. See code snippet below on how to calculate the CRC.
*
* @code
* uint16_t calc_crc_digest(uint16_t crc, uint8_t *data, size_t size)
* {
* for (size_t i = 0; i < size; i++) {
* crc ^= data[i] << 8;
* for (size_t j = 0; j < 8; j++) {
* if ((crc & 0x8000) == 0x8000) {
* crc = (crc << 1) ^ 0xAC9A;
* } else {
* crc = (crc << 1);
* }
* }
* }
* return crc;
* }
*
* uint16_t calc_crc(uint8_t *data, size_t size)
* {
* return calc_crc_digest(0x4657, data, size);
* }
* @endcode
*/
uint32_t flags;
} BPMP_ABI_PACKED;
/**
* @ingroup MRQ_Format
* @brief Header for an MRQ response
*
* Provides an error code for the associated MRQ message. The
* remainder of the MRQ response is a payload (immediately following
* the mrq_response) whose format depends on the associated
* mrq_request::mrq
*/
struct mrq_response {
/** @brief Error code for the MRQ request itself */
int32_t err;
/**
* @brief 32bit word containing a number of fields as follows:
*
* struct {
* uint8_t options:4;
* uint8_t xid:4;
* uint8_t payload_length;
* uint16_t crc16;
* };
*
* **options** indicates CRC presence.
*
* #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms and
* indicates the crc16 related fields are present when set.
*
* **xid** is the transaction ID as sent by the requestor.
*
* **length** of the message expressed in bytes without the size of this header.
* Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes
* rather than bytes.
*
* **crc16**
*
* CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1
* and initialization value 0x4657. The CRC is calculated over all bytes of the message
* including this header. However the crc16 field is considered to be set to 0 when
* calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set.
*/
uint32_t flags;
} BPMP_ABI_PACKED;
/**
* @ingroup MRQ_Format
* Minimum needed size for an IPC message buffer
*/
#define MSG_MIN_SZ 128U
/**
* @ingroup MRQ_Format
* Minimum size guaranteed for data in an IPC message buffer
*/
#define MSG_DATA_MIN_SZ 120U
/**
* @ingroup MRQ_Codes
* @name Legal MRQ codes
* These are the legal values for mrq_request::mrq
* @{
*/
#define MRQ_PING 0U
#define MRQ_QUERY_TAG 1U
#define MRQ_THREADED_PING 9U
#define MRQ_DEBUGFS 19U
#define MRQ_RESET 20U
#define MRQ_I2C 21U
#define MRQ_CLK 22U
#define MRQ_QUERY_ABI 23U
#define MRQ_THERMAL 27U
#define MRQ_CPU_VHINT 28U
#define MRQ_ABI_RATCHET 29U
#define MRQ_EMC_DVFS_LATENCY 31U
#define MRQ_RINGBUF_CONSOLE 65U
#define MRQ_PG 66U
#define MRQ_CPU_NDIV_LIMITS 67U
#define MRQ_STRAP 68U
#define MRQ_UPHY 69U
#define MRQ_CPU_AUTO_CC3 70U
#define MRQ_QUERY_FW_TAG 71U
#define MRQ_FMON 72U
#define MRQ_EC 73U
#define MRQ_DEBUG 75U
#define MRQ_EMC_DVFS_EMCHUB 76U
#define MRQ_BWMGR 77U
#define MRQ_ISO_CLIENT 78U
#define MRQ_EMC_DISP_RFL 79U
#define MRQ_TELEMETRY 80U
#define MRQ_PWR_LIMIT 81U
#define MRQ_GEARS 82U
#define MRQ_BWMGR_INT 83U
#define MRQ_OC_STATUS 84U
/** @cond DEPRECATED */
#define MRQ_RESERVED_2 2U
#define MRQ_RESERVED_3 3U
#define MRQ_RESERVED_4 4U
#define MRQ_RESERVED_5 5U
#define MRQ_RESERVED_6 6U
#define MRQ_RESERVED_7 7U
#define MRQ_RESERVED_8 8U
#define MRQ_RESERVED_10 10U
#define MRQ_RESERVED_11 11U
#define MRQ_RESERVED_12 12U
#define MRQ_RESERVED_13 13U
#define MRQ_RESERVED_14 14U
#define MRQ_RESERVED_15 15U
#define MRQ_RESERVED_16 16U
#define MRQ_RESERVED_17 17U
#define MRQ_RESERVED_18 18U
#define MRQ_RESERVED_24 24U
#define MRQ_RESERVED_25 25U
#define MRQ_RESERVED_26 26U
#define MRQ_RESERVED_30 30U
#define MRQ_RESERVED_64 64U
#define MRQ_RESERVED_74 74U
/** @endcond DEPRECATED */
/** @} */
/**
* @ingroup MRQ_Codes
* @brief Maximum MRQ code to be sent by CPU software to
* BPMP. Subject to change in future
*/
#define MAX_CPU_MRQ_ID 84U
/**
* @addtogroup MRQ_Payloads
* @{
* @defgroup Ping Ping
* @defgroup Query_Tag Query Tag
* @defgroup Module Loadable Modules
* @defgroup Trace Trace
* @defgroup Debugfs Debug File System
* @defgroup Reset Reset
* @defgroup I2C I2C
* @defgroup Clocks Clocks
* @defgroup ABI_info ABI Info
* @defgroup Powergating Power Gating
* @defgroup Thermal Thermal
* @defgroup OC_status OC status
* @defgroup Vhint CPU Voltage hint
* @defgroup EMC EMC
* @defgroup BWMGR BWMGR
* @defgroup ISO_CLIENT ISO_CLIENT
* @defgroup CPU NDIV Limits
* @defgroup RingbufConsole Ring Buffer Console
* @defgroup Strap Straps
* @defgroup UPHY UPHY
* @defgroup CC3 Auto-CC3
* @defgroup FMON FMON
* @defgroup EC EC
* @defgroup Telemetry Telemetry
* @defgroup Pwrlimit PWR_LIMIT
* @defgroup Gears Gears
* @defgroup BWMGR_INT Bandwidth Manager Integrated
* @} MRQ_Payloads
*/
/**
* @ingroup MRQ_Codes
* @def MRQ_PING
* @brief A simple ping
*
* * Platforms: All
* * Initiators: Any
* * Targets: Any
* * Request Payload: @ref mrq_ping_request
* * Response Payload: @ref mrq_ping_response
*
* @ingroup MRQ_Codes
* @def MRQ_THREADED_PING
* @brief A deeper ping
*
* * Platforms: All
* * Initiators: Any
* * Targets: BPMP
* * Request Payload: @ref mrq_ping_request
* * Response Payload: @ref mrq_ping_response
*
* Behavior is equivalent to a simple #MRQ_PING except that BPMP
* responds from a thread context (providing a slightly more robust
* sign of life).
*
*/
/**
* @ingroup Ping
* @brief Request with #MRQ_PING
*
* Used by the sender of an #MRQ_PING message to request a pong from
* recipient. The response from the recipient is computed based on
* #challenge.
*/
struct mrq_ping_request {
/** @brief Arbitrarily chosen value */
uint32_t challenge;
} BPMP_ABI_PACKED;
/**
* @ingroup Ping
* @brief Response to #MRQ_PING
*
* Sent in response to an #MRQ_PING message. #reply should be the
* mrq_ping_request challenge left shifted by 1 with the carry-bit
* dropped.
*
*/
struct mrq_ping_response {
/** @brief Response to the MRQ_PING challege */
uint32_t reply;
} BPMP_ABI_PACKED;
/**
* @ingroup MRQ_Codes
* @def MRQ_QUERY_TAG
* @brief Query BPMP firmware's tag (i.e. unique identifer)
*
* @deprecated Use #MRQ_QUERY_FW_TAG instead.
*
* * Platforms: All
* * Initiators: CCPLEX
* * Targets: BPMP
* * Request Payload: @ref mrq_query_tag_request
* * Response Payload: N/A
*
*/
/**
* @ingroup Query_Tag
* @brief Request with #MRQ_QUERY_TAG
*
* @deprecated This structure will be removed in future version.
* Use MRQ_QUERY_FW_TAG instead.
*/
struct mrq_query_tag_request {
/** @brief Base address to store the firmware tag */
uint32_t addr;
} BPMP_ABI_PACKED;
/**
* @ingroup MRQ_Codes
* @def MRQ_QUERY_FW_TAG
* @brief Query BPMP firmware's tag (i.e. unique identifier)
*
* * Platforms: All
* * Initiators: Any
* * Targets: BPMP
* * Request Payload: N/A
* * Response Payload: @ref mrq_query_fw_tag_response
*
*/
/**
* @ingroup Query_Tag
* @brief Response to #MRQ_QUERY_FW_TAG
*
* Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique
* identifier for the version of firmware issuing the reply.
*
*/
struct mrq_query_fw_tag_response {
/** @brief Array to store tag information */
uint8_t tag[32];
} BPMP_ABI_PACKED;
/** @private */
struct mrq_threaded_ping_request {
uint32_t challenge;
} BPMP_ABI_PACKED;
/** @private */
struct mrq_threaded_ping_response {
uint32_t reply;
} BPMP_ABI_PACKED;
/**
* @ingroup MRQ_Codes
* @def MRQ_DEBUGFS
* @brief Interact with BPMP's debugfs file nodes
*
* @deprecated use MRQ_DEBUG instead.
*
* * Platforms: T186, T194
* * Initiators: Any
* * Targets: BPMP
* * Request Payload: @ref mrq_debugfs_request
* * Response Payload: @ref mrq_debugfs_response
*/
/**
* @addtogroup Debugfs
* @{
*
* The BPMP firmware implements a pseudo-filesystem called
* debugfs. Any driver within the firmware may register with debugfs
* to expose an arbitrary set of "files" in the filesystem. When
* software on the CPU writes to a debugfs file, debugfs passes the
* written data to a callback provided by the driver. When software on
* the CPU reads a debugfs file, debugfs queries the driver for the
* data to return to the CPU. The intention of the debugfs filesystem
* is to provide information useful for debugging the system at
* runtime.
*
* @note The files exposed via debugfs are not part of the
* BPMP firmware's ABI. debugfs files may be added or removed in any
* given version of the firmware. Typically the semantics of a debugfs
* file are consistent from version to version but even that is not
* guaranteed.
*
* @}
*/
/** @ingroup Debugfs */
enum mrq_debugfs_commands {
/** @brief Perform read */
CMD_DEBUGFS_READ = 1,
/** @brief Perform write */
CMD_DEBUGFS_WRITE = 2,
/** @brief Perform dumping directory */
CMD_DEBUGFS_DUMPDIR = 3,
/** @brief Not a command */
CMD_DEBUGFS_MAX
};
/**
* @ingroup Debugfs
* @brief Parameters for CMD_DEBUGFS_READ/WRITE command
*/
struct cmd_debugfs_fileop_request {
/** @brief Physical address pointing at filename */
uint32_t fnameaddr;
/** @brief Length in bytes of filename buffer */
uint32_t fnamelen;
/** @brief Physical address pointing to data buffer */
uint32_t dataaddr;
/** @brief Length in bytes of data buffer */
uint32_t datalen;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Parameters for CMD_DEBUGFS_READ/WRITE command
*/
struct cmd_debugfs_dumpdir_request {
/** @brief Physical address pointing to data buffer */
uint32_t dataaddr;
/** @brief Length in bytes of data buffer */
uint32_t datalen;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Response data for CMD_DEBUGFS_READ/WRITE command
*/
struct cmd_debugfs_fileop_response {
/** @brief Always 0 */
uint32_t reserved;
/** @brief Number of bytes read from or written to data buffer */
uint32_t nbytes;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Response data for CMD_DEBUGFS_DUMPDIR command
*/
struct cmd_debugfs_dumpdir_response {
/** @brief Always 0 */
uint32_t reserved;
/** @brief Number of bytes read from or written to data buffer */
uint32_t nbytes;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Request with #MRQ_DEBUGFS.
*
* The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
* command to execute. Legal commands are the values of @ref
* mrq_debugfs_commands. Each command requires a specific additional
* payload of data.
*
* |command |payload|
* |-------------------|-------|
* |CMD_DEBUGFS_READ |fop |
* |CMD_DEBUGFS_WRITE |fop |
* |CMD_DEBUGFS_DUMPDIR|dumpdir|
*/
struct mrq_debugfs_request {
/** @brief Sub-command (@ref mrq_debugfs_commands) */
uint32_t cmd;
union {
struct cmd_debugfs_fileop_request fop;
struct cmd_debugfs_dumpdir_request dumpdir;
} BPMP_UNION_ANON;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
*/
struct mrq_debugfs_response {
/** @brief Always 0 */
int32_t reserved;
union {
/** @brief Response data for CMD_DEBUGFS_READ OR
* CMD_DEBUGFS_WRITE command
*/
struct cmd_debugfs_fileop_response fop;
/** @brief Response data for CMD_DEBUGFS_DUMPDIR command */
struct cmd_debugfs_dumpdir_response dumpdir;
} BPMP_UNION_ANON;
} BPMP_ABI_PACKED;
/**
* @addtogroup Debugfs
* @{
*/
#define DEBUGFS_S_ISDIR (1 << 9)
#define DEBUGFS_S_IRUSR (1 << 8)
#define DEBUGFS_S_IWUSR (1 << 7)
/** @} Debugfs */
/**
* @ingroup MRQ_Codes
* @def MRQ_DEBUG
* @brief Interact with BPMP's debugfs file nodes. Use message payload
* for exchanging data. This is functionally equivalent to
* @ref MRQ_DEBUGFS. But the way in which data is exchanged is different.
* When software running on CPU tries to read a debugfs file,
* the file path and read data will be stored in message payload.
* Since the message payload size is limited, a debugfs file
* transaction might require multiple frames of data exchanged
* between BPMP and CPU until the transaction completes.
*
* * Platforms: T194
* * Initiators: Any
* * Targets: BPMP
* * Request Payload: @ref mrq_debug_request
* * Response Payload: @ref mrq_debug_response
*/
/** @ingroup Debugfs */
enum mrq_debug_commands {
/** @brief Open required file for read operation */
CMD_DEBUG_OPEN_RO = 0,
/** @brief Open required file for write operation */
CMD_DEBUG_OPEN_WO = 1,
/** @brief Perform read */
CMD_DEBUG_READ = 2,
/** @brief Perform write */
CMD_DEBUG_WRITE = 3,
/** @brief Close file */
CMD_DEBUG_CLOSE = 4,
/** @brief Not a command */
CMD_DEBUG_MAX
};
/**
* @ingroup Debugfs
* @brief Maximum number of files that can be open at a given time
*/
#define DEBUG_MAX_OPEN_FILES 1
/**
* @ingroup Debugfs
* @brief Maximum size of null-terminated file name string in bytes.
* Value is derived from memory available in message payload while
* using @ref cmd_debug_fopen_request
* Value 4 corresponds to size of @ref mrq_debug_commands
* in @ref mrq_debug_request.
* 120 - 4 dbg_cmd(32bit) = 116
*/
#define DEBUG_FNAME_MAX_SZ (MSG_DATA_MIN_SZ - 4)
/**
* @ingroup Debugfs
* @brief Parameters for CMD_DEBUG_OPEN command
*/
struct cmd_debug_fopen_request {
/** @brief File name - Null-terminated string with maximum
* length @ref DEBUG_FNAME_MAX_SZ
*/
char name[DEBUG_FNAME_MAX_SZ];
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Response data for CMD_DEBUG_OPEN_RO/WO command
*/
struct cmd_debug_fopen_response {
/** @brief Identifier for file access */
uint32_t fd;
/** @brief Data length. File data size for READ command.
* Maximum allowed length for WRITE command
*/
uint32_t datalen;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Parameters for CMD_DEBUG_READ command
*/
struct cmd_debug_fread_request {
/** @brief File access identifier received in response
* to CMD_DEBUG_OPEN_RO request
*/
uint32_t fd;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Maximum size of read data in bytes.
* Value is derived from memory available in message payload while
* using @ref cmd_debug_fread_response.
*/
#define DEBUG_READ_MAX_SZ (MSG_DATA_MIN_SZ - 4)
/**
* @ingroup Debugfs
* @brief Response data for CMD_DEBUG_READ command
*/
struct cmd_debug_fread_response {
/** @brief Size of data provided in this response in bytes */
uint32_t readlen;
/** @brief File data from seek position */
char data[DEBUG_READ_MAX_SZ];
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Maximum size of write data in bytes.
* Value is derived from memory available in message payload while
* using @ref cmd_debug_fwrite_request.
*/
#define DEBUG_WRITE_MAX_SZ (MSG_DATA_MIN_SZ - 12)
/**
* @ingroup Debugfs
* @brief Parameters for CMD_DEBUG_WRITE command
*/
struct cmd_debug_fwrite_request {
/** @brief File access identifier received in response
* to CMD_DEBUG_OPEN_RO request
*/
uint32_t fd;
/** @brief Size of write data in bytes */
uint32_t datalen;
/** @brief Data to be written */
char data[DEBUG_WRITE_MAX_SZ];
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Parameters for CMD_DEBUG_CLOSE command
*/
struct cmd_debug_fclose_request {
/** @brief File access identifier received in response
* to CMD_DEBUG_OPEN_RO request
*/
uint32_t fd;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
* @brief Request with #MRQ_DEBUG.
*
* The sender of an MRQ_DEBUG message uses #cmd to specify a debugfs
* command to execute. Legal commands are the values of @ref
* mrq_debug_commands. Each command requires a specific additional
* payload of data.
*
* |command |payload|
* |-------------------|-------|
* |CMD_DEBUG_OPEN_RO |fop |
* |CMD_DEBUG_OPEN_WO |fop |
* |CMD_DEBUG_READ |frd |
* |CMD_DEBUG_WRITE |fwr |
* |CMD_DEBUG_CLOSE |fcl |
*/
struct mrq_debug_request {
/** @brief Sub-command (@ref mrq_debug_commands) */
uint32_t cmd;
union {
/** @brief Request payload for CMD_DEBUG_OPEN_RO/WO command */
struct cmd_debug_fopen_request fop;
/** @brief Request payload for CMD_DEBUG_READ command */
struct cmd_debug_fread_request frd;
/** @brief Request payload for CMD_DEBUG_WRITE command */
struct cmd_debug_fwrite_request fwr;
/** @brief Request payload for CMD_DEBUG_CLOSE command */
struct cmd_debug_fclose_request fcl;
} BPMP_UNION_ANON;
} BPMP_ABI_PACKED;
/**
* @ingroup Debugfs
*/
struct mrq_debug_response {
union {
/** @brief Response data for CMD_DEBUG_OPEN_RO/WO command */
struct cmd_debug_fopen_response fop;
/** @brief Response data for CMD_DEBUG_READ command */
struct cmd_debug_fread_response frd;
} BPMP_UNION_ANON;
} BPMP_ABI_PACKED;
/**
* @ingroup MRQ_Codes
* @def MRQ_RESET
* @brief Reset an IP block
*
* * Platforms: T186, T194
* * Initiators: Any
* * Targets: BPMP
* * Request Payload: @ref mrq_reset_request
* * Response Payload: @ref mrq_reset_response
*
* @addtogroup Reset
* @{
*/
enum mrq_reset_commands {
/**
* @brief Assert module reset
*
* mrq_response::err is 0 if the operation was successful, or @n
* -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
* -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
* -#BPMP_ENOTSUP if target domain h/w state does not allow reset
*/
CMD_RESET_ASSERT = 1,
/**
* @brief Deassert module reset
*
* mrq_response::err is 0 if the operation was successful, or @n
* -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
* -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
* -#BPMP_ENOTSUP if target domain h/w state does not allow reset
*/
CMD_RESET_DEASSERT = 2,
/**
* @brief Assert and deassert the module reset
*
* mrq_response::err is 0 if the operation was successful, or @n
* -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
* -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
* -#BPMP_ENOTSUP if target domain h/w state does not allow reset
*/
CMD_RESET_MODULE = 3,
/**
* @brief Get the highest reset ID
*
* mrq_response::err is 0 if the operation was successful, or @n
* -#BPMP_ENODEV if no reset domains are supported (number of IDs is 0)
*/
CMD_RESET_GET_MAX_ID = 4,
/** @brief Not part of ABI and subject to change */
CMD_RESET_MAX,
};
/**
* @brief Request with MRQ_RESET
*
* Used by the sender of an #MRQ_RESET message to request BPMP to
* assert or or deassert a given reset line.
*/
struct mrq_reset_request {
/** @brief Reset action to perform (@ref mrq_reset_commands) */
uint32_t cmd;
/** @brief Id of the reset to affected */
uint32_t reset_id;
} BPMP_ABI_PACKED;
/**
* @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When
* this sub-command is not supported, firmware will return -BPMP_EBADCMD
* in mrq_response::err.
*/
struct cmd_reset_get_max_id_response {
/** @brief Max reset id */
uint32_t max_id;
} BPMP_ABI_PACKED;
/**
* @brief Response with MRQ_RESET
*
* Each sub-command supported by @ref mrq_reset_request may return
* sub-command-specific data. Some do and some do not as indicated
* in the following table
*
* | sub-command | payload |
* |----------------------|------------------|
* | CMD_RESET_ASSERT | - |
* | CMD_RESET_DEASSERT | - |
* | CMD_RESET_MODULE | - |
* | CMD_RESET_GET_MAX_ID | reset_get_max_id |
*/
struct mrq_reset_response {
union {
struct cmd_reset_get_max_id_response reset_get_max_id;
} BPMP_UNION_ANON;
} BPMP_ABI_PACKED;
/** @} Reset */
/**
* @ingroup MRQ_Codes
* @def MRQ_I2C
* @brief Issue an i2c transaction
*
* * Platforms: T186, T194
* * Initiators: Any
* * Targets: BPMP
* * Request Payload: @ref mrq_i2c_request
* * Response Payload: @ref mrq_i2c_response
*
* @addtogroup I2C
* @{
*/
#define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE (MSG_DATA_MIN_SZ - 12U)
#define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE (MSG_DATA_MIN_SZ - 4U)
#define SERIALI2C_TEN 0x0010U
#define SERIALI2C_RD 0x0001U
#define SERIALI2C_STOP 0x8000U
#define SERIALI2C_NOSTART 0x4000U
#define SERIALI2C_REV_DIR_ADDR 0x2000U
#define SERIALI2C_IGNORE_NAK 0x1000U
#define SERIALI2C_NO_RD_ACK 0x0800U
#define SERIALI2C_RECV_LEN 0x0400U
enum {
CMD_I2C_XFER = 1
};
/**
* @brief Serializable i2c request
*
* Instances of this structure are packed (little-endian) into
* cmd_i2c_xfer_request::data_buf. Each instance represents a single
* transaction (or a portion of a transaction with repeated starts) on
* an i2c bus.
*
* Because these structures are packed, some instances are likely to
* be misaligned. Additionally because #data is variable length, it is
* not possible to iterate through a serialized list of these