Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/soc/tegra/bpmp-abi.h
26285 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved.
4
*/
5
6
#ifndef ABI_BPMP_ABI_H
7
#define ABI_BPMP_ABI_H
8
9
#if defined(LK) || defined(BPMP_ABI_HAVE_STDC)
10
#include <stddef.h>
11
#include <stdint.h>
12
#endif
13
14
#ifndef BPMP_ABI_PACKED
15
#ifdef __ABI_PACKED
16
#define BPMP_ABI_PACKED __ABI_PACKED
17
#else
18
#define BPMP_ABI_PACKED __attribute__((packed))
19
#endif
20
#endif
21
22
#ifdef NO_GCC_EXTENSIONS
23
#define BPMP_ABI_EMPTY char empty;
24
#define BPMP_ABI_EMPTY_ARRAY 1
25
#else
26
#define BPMP_ABI_EMPTY
27
#define BPMP_ABI_EMPTY_ARRAY 0
28
#endif
29
30
#ifndef BPMP_UNION_ANON
31
#ifdef __UNION_ANON
32
#define BPMP_UNION_ANON __UNION_ANON
33
#else
34
#define BPMP_UNION_ANON
35
#endif
36
#endif
37
38
/**
39
* @file
40
*/
41
42
/**
43
* @defgroup MRQ MRQ Messages
44
* @brief Messages sent to/from BPMP via IPC
45
* @{
46
* @defgroup MRQ_Format Message Format
47
* @defgroup MRQ_Codes Message Request (MRQ) Codes
48
* @defgroup MRQ_Payloads Message Payloads
49
* @defgroup Error_Codes Error Codes
50
* @}
51
*/
52
53
/**
54
* @addtogroup MRQ_Format
55
* @{
56
* The CPU requests the BPMP to perform a particular service by
57
* sending it an IVC frame containing a single MRQ message. An MRQ
58
* message consists of a @ref mrq_request followed by a payload whose
59
* format depends on mrq_request::mrq.
60
*
61
* The BPMP processes the data and replies with an IVC frame (on the
62
* same IVC channel) containing and MRQ response. An MRQ response
63
* consists of a @ref mrq_response followed by a payload whose format
64
* depends on the associated mrq_request::mrq.
65
*
66
* A well-defined subset of the MRQ messages that the CPU sends to the
67
* BPMP can lead to BPMP eventually sending an MRQ message to the
68
* CPU. For example, when the CPU uses an #MRQ_THERMAL message to set
69
* a thermal trip point, the BPMP may eventually send a single
70
* #MRQ_THERMAL message of its own to the CPU indicating that the trip
71
* point has been crossed.
72
* @}
73
*/
74
75
/**
76
* @ingroup MRQ_Format
77
* Request an answer from the peer.
78
* This should be set in mrq_request::flags for all requests targetted
79
* at BPMP. For requests originating in BPMP, this flag is optional except
80
* for messages targeting MCE, for which the field must be set.
81
* When this flag is not set, the remote peer must not send a response
82
* back.
83
*/
84
#define BPMP_MAIL_DO_ACK (1U << 0U)
85
86
/**
87
* @ingroup MRQ_Format
88
* Ring the sender's doorbell when responding. This should be set unless
89
* the sender wants to poll the underlying communications layer directly.
90
*
91
* An optional direction that can be specified in mrq_request::flags.
92
*/
93
#define BPMP_MAIL_RING_DB (1U << 1U)
94
95
/**
96
* @ingroup MRQ_Format
97
* CRC present
98
*/
99
#define BPMP_MAIL_CRC_PRESENT (1U << 2U)
100
101
/**
102
* @ingroup MRQ_Format
103
* @brief Header for an MRQ message
104
*
105
* Provides the MRQ number for the MRQ message: #mrq. The remainder of
106
* the MRQ message is a payload (immediately following the
107
* mrq_request) whose format depends on mrq.
108
*/
109
struct mrq_request {
110
/** @brief MRQ number of the request */
111
uint32_t mrq;
112
113
/**
114
* @brief 32bit word containing a number of fields as follows:
115
*
116
* struct {
117
* uint8_t options:4;
118
* uint8_t xid:4;
119
* uint8_t payload_length;
120
* uint16_t crc16;
121
* };
122
*
123
* **options** directions to the receiver and indicates CRC presence.
124
*
125
* #BPMP_MAIL_DO_ACK and #BPMP_MAIL_RING_DB see documentation of respective options.
126
* #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms. It indicates the
127
* crc16, xid and length fields are present when set.
128
* Some platform configurations, especially when targeted to applications requiring
129
* functional safety, mandate this option being set or otherwise will respond with
130
* -BPMP_EBADMSG and ignore the request.
131
*
132
* **xid** is a transaction ID.
133
*
134
* Only used when #BPMP_MAIL_CRC_PRESENT is set.
135
*
136
* **payload_length** of the message expressed in bytes without the size of this header.
137
* See table below for minimum accepted payload lengths for each MRQ.
138
* Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes
139
* rather than bytes.
140
*
141
* Only used when #BPMP_MAIL_CRC_PRESENT is set.
142
*
143
* | MRQ | CMD | minimum payload length
144
* | -------------------- | ------------------------------------ | ------------------------------------------ |
145
* | MRQ_PING | | 4 |
146
* | MRQ_THREADED_PING | | 4 |
147
* | MRQ_RESET | any | 8 |
148
* | MRQ_I2C | | 12 + cmd_i2c_xfer_request.data_size |
149
* | MRQ_CLK | CMD_CLK_GET_RATE | 4 |
150
* | MRQ_CLK | CMD_CLK_SET_RATE | 16 |
151
* | MRQ_CLK | CMD_CLK_ROUND_RATE | 16 |
152
* | MRQ_CLK | CMD_CLK_GET_PARENT | 4 |
153
* | MRQ_CLK | CMD_CLK_SET_PARENT | 8 |
154
* | MRQ_CLK | CMD_CLK_ENABLE | 4 |
155
* | MRQ_CLK | CMD_CLK_DISABLE | 4 |
156
* | MRQ_CLK | CMD_CLK_IS_ENABLED | 4 |
157
* | MRQ_CLK | CMD_CLK_GET_ALL_INFO | 4 |
158
* | MRQ_CLK | CMD_CLK_GET_MAX_CLK_ID | 4 |
159
* | MRQ_CLK | CMD_CLK_GET_FMAX_AT_VMIN | 4 |
160
* | MRQ_QUERY_ABI | | 4 |
161
* | MRQ_PG | CMD_PG_QUERY_ABI | 12 |
162
* | MRQ_PG | CMD_PG_SET_STATE | 12 |
163
* | MRQ_PG | CMD_PG_GET_STATE | 8 |
164
* | MRQ_PG | CMD_PG_GET_NAME | 8 |
165
* | MRQ_PG | CMD_PG_GET_MAX_ID | 8 |
166
* | MRQ_THERMAL | CMD_THERMAL_QUERY_ABI | 8 |
167
* | MRQ_THERMAL | CMD_THERMAL_GET_TEMP | 8 |
168
* | MRQ_THERMAL | CMD_THERMAL_SET_TRIP | 20 |
169
* | MRQ_THERMAL | CMD_THERMAL_GET_NUM_ZONES | 4 |
170
* | MRQ_THERMAL | CMD_THERMAL_GET_THERMTRIP | 8 |
171
* | MRQ_CPU_VHINT | | 8 |
172
* | MRQ_ABI_RATCHET | | 2 |
173
* | MRQ_EMC_DVFS_LATENCY | | 8 |
174
* | MRQ_EMC_DVFS_EMCHUB | | 8 |
175
* | MRQ_EMC_DISP_RFL | | 4 |
176
* | MRQ_BWMGR | CMD_BWMGR_QUERY_ABI | 8 |
177
* | MRQ_BWMGR | CMD_BWMGR_CALC_RATE | 8 + 8 * bwmgr_rate_req.num_iso_clients |
178
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_QUERY_ABI | 8 |
179
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_CALCULATE_LA | 16 |
180
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_SET_LA | 16 |
181
* | MRQ_ISO_CLIENT | CMD_ISO_CLIENT_GET_MAX_BW | 8 |
182
* | MRQ_CPU_NDIV_LIMITS | | 4 |
183
* | MRQ_CPU_AUTO_CC3 | | 4 |
184
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_QUERY_ABI | 8 |
185
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_READ | 5 |
186
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_WRITE | 5 + cmd_ringbuf_console_write_req.len |
187
* | MRQ_RINGBUF_CONSOLE | CMD_RINGBUF_CONSOLE_GET_FIFO | 4 |
188
* | MRQ_STRAP | STRAP_SET | 12 |
189
* | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | 24 |
190
* | MRQ_UPHY | CMD_UPHY_PCIE_LANE_MARGIN_STATUS | 4 |
191
* | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT | 5 |
192
* | MRQ_UPHY | CMD_UPHY_PCIE_CONTROLLER_STATE | 6 |
193
* | MRQ_UPHY | CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF | 5 |
194
* | MRQ_FMON | CMD_FMON_GEAR_CLAMP | 16 |
195
* | MRQ_FMON | CMD_FMON_GEAR_FREE | 4 |
196
* | MRQ_FMON | CMD_FMON_GEAR_GET | 4 |
197
* | MRQ_FMON | CMD_FMON_FAULT_STS_GET | 8 |
198
* | MRQ_EC | CMD_EC_STATUS_EX_GET | 12 |
199
* | MRQ_QUERY_FW_TAG | | 0 |
200
* | MRQ_DEBUG | CMD_DEBUG_OPEN_RO | 4 + length of cmd_debug_fopen_request.name |
201
* | MRQ_DEBUG | CMD_DEBUG_OPEN_WO | 4 + length of cmd_debug_fopen_request.name |
202
* | MRQ_DEBUG | CMD_DEBUG_READ | 8 |
203
* | MRQ_DEBUG | CMD_DEBUG_WRITE | 12 + cmd_debug_fwrite_request.datalen |
204
* | MRQ_DEBUG | CMD_DEBUG_CLOSE | 8 |
205
* | MRQ_TELEMETRY | | 8 |
206
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_QUERY_ABI | 8 |
207
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_SET | 20 |
208
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_GET | 16 |
209
* | MRQ_PWR_LIMIT | CMD_PWR_LIMIT_CURR_CAP | 8 |
210
* | MRQ_GEARS | | 0 |
211
* | MRQ_BWMGR_INT | CMD_BWMGR_INT_QUERY_ABI | 8 |
212
* | MRQ_BWMGR_INT | CMD_BWMGR_INT_CALC_AND_SET | 16 |
213
* | MRQ_BWMGR_INT | CMD_BWMGR_INT_CAP_SET | 8 |
214
* | MRQ_OC_STATUS | | 0 |
215
*
216
* **crc16**
217
*
218
* CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1
219
* and initialization value 0x4657. The CRC is calculated over all bytes of the message
220
* including this header. However the crc16 field is considered to be set to 0 when
221
* calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set. If
222
* #BPMP_MAIL_CRC_PRESENT is set and this field does not match the CRC as
223
* calculated by BPMP, -BPMP_EBADMSG will be returned and the request will
224
* be ignored. See code snippet below on how to calculate the CRC.
225
*
226
* @code
227
* uint16_t calc_crc_digest(uint16_t crc, uint8_t *data, size_t size)
228
* {
229
* for (size_t i = 0; i < size; i++) {
230
* crc ^= data[i] << 8;
231
* for (size_t j = 0; j < 8; j++) {
232
* if ((crc & 0x8000) == 0x8000) {
233
* crc = (crc << 1) ^ 0xAC9A;
234
* } else {
235
* crc = (crc << 1);
236
* }
237
* }
238
* }
239
* return crc;
240
* }
241
*
242
* uint16_t calc_crc(uint8_t *data, size_t size)
243
* {
244
* return calc_crc_digest(0x4657, data, size);
245
* }
246
* @endcode
247
*/
248
uint32_t flags;
249
} BPMP_ABI_PACKED;
250
251
/**
252
* @ingroup MRQ_Format
253
* @brief Header for an MRQ response
254
*
255
* Provides an error code for the associated MRQ message. The
256
* remainder of the MRQ response is a payload (immediately following
257
* the mrq_response) whose format depends on the associated
258
* mrq_request::mrq
259
*/
260
struct mrq_response {
261
/** @brief Error code for the MRQ request itself */
262
int32_t err;
263
264
/**
265
* @brief 32bit word containing a number of fields as follows:
266
*
267
* struct {
268
* uint8_t options:4;
269
* uint8_t xid:4;
270
* uint8_t payload_length;
271
* uint16_t crc16;
272
* };
273
*
274
* **options** indicates CRC presence.
275
*
276
* #BPMP_MAIL_CRC_PRESENT is supported on T234 and later platforms and
277
* indicates the crc16 related fields are present when set.
278
*
279
* **xid** is the transaction ID as sent by the requestor.
280
*
281
* **length** of the message expressed in bytes without the size of this header.
282
* Note: For DMCE communication, this field expresses the length as a multiple of 4 bytes
283
* rather than bytes.
284
*
285
* **crc16**
286
*
287
* CRC16 using polynomial x^16 + x^14 + x^12 + x^11 + x^8 + x^5 + x^4 + x^2 + 1
288
* and initialization value 0x4657. The CRC is calculated over all bytes of the message
289
* including this header. However the crc16 field is considered to be set to 0 when
290
* calculating the CRC. Only used when #BPMP_MAIL_CRC_PRESENT is set.
291
*/
292
uint32_t flags;
293
} BPMP_ABI_PACKED;
294
295
/**
296
* @ingroup MRQ_Format
297
* Minimum needed size for an IPC message buffer
298
*/
299
#define MSG_MIN_SZ 128U
300
/**
301
* @ingroup MRQ_Format
302
* Minimum size guaranteed for data in an IPC message buffer
303
*/
304
#define MSG_DATA_MIN_SZ 120U
305
306
/**
307
* @ingroup MRQ_Codes
308
* @name Legal MRQ codes
309
* These are the legal values for mrq_request::mrq
310
* @{
311
*/
312
313
#define MRQ_PING 0U
314
#define MRQ_QUERY_TAG 1U
315
#define MRQ_THREADED_PING 9U
316
#define MRQ_DEBUGFS 19U
317
#define MRQ_RESET 20U
318
#define MRQ_I2C 21U
319
#define MRQ_CLK 22U
320
#define MRQ_QUERY_ABI 23U
321
#define MRQ_THERMAL 27U
322
#define MRQ_CPU_VHINT 28U
323
#define MRQ_ABI_RATCHET 29U
324
#define MRQ_EMC_DVFS_LATENCY 31U
325
#define MRQ_RINGBUF_CONSOLE 65U
326
#define MRQ_PG 66U
327
#define MRQ_CPU_NDIV_LIMITS 67U
328
#define MRQ_STRAP 68U
329
#define MRQ_UPHY 69U
330
#define MRQ_CPU_AUTO_CC3 70U
331
#define MRQ_QUERY_FW_TAG 71U
332
#define MRQ_FMON 72U
333
#define MRQ_EC 73U
334
#define MRQ_DEBUG 75U
335
#define MRQ_EMC_DVFS_EMCHUB 76U
336
#define MRQ_BWMGR 77U
337
#define MRQ_ISO_CLIENT 78U
338
#define MRQ_EMC_DISP_RFL 79U
339
#define MRQ_TELEMETRY 80U
340
#define MRQ_PWR_LIMIT 81U
341
#define MRQ_GEARS 82U
342
#define MRQ_BWMGR_INT 83U
343
#define MRQ_OC_STATUS 84U
344
345
/** @cond DEPRECATED */
346
#define MRQ_RESERVED_2 2U
347
#define MRQ_RESERVED_3 3U
348
#define MRQ_RESERVED_4 4U
349
#define MRQ_RESERVED_5 5U
350
#define MRQ_RESERVED_6 6U
351
#define MRQ_RESERVED_7 7U
352
#define MRQ_RESERVED_8 8U
353
#define MRQ_RESERVED_10 10U
354
#define MRQ_RESERVED_11 11U
355
#define MRQ_RESERVED_12 12U
356
#define MRQ_RESERVED_13 13U
357
#define MRQ_RESERVED_14 14U
358
#define MRQ_RESERVED_15 15U
359
#define MRQ_RESERVED_16 16U
360
#define MRQ_RESERVED_17 17U
361
#define MRQ_RESERVED_18 18U
362
#define MRQ_RESERVED_24 24U
363
#define MRQ_RESERVED_25 25U
364
#define MRQ_RESERVED_26 26U
365
#define MRQ_RESERVED_30 30U
366
#define MRQ_RESERVED_64 64U
367
#define MRQ_RESERVED_74 74U
368
/** @endcond DEPRECATED */
369
370
/** @} */
371
372
/**
373
* @ingroup MRQ_Codes
374
* @brief Maximum MRQ code to be sent by CPU software to
375
* BPMP. Subject to change in future
376
*/
377
#define MAX_CPU_MRQ_ID 84U
378
379
/**
380
* @addtogroup MRQ_Payloads
381
* @{
382
* @defgroup Ping Ping
383
* @defgroup Query_Tag Query Tag
384
* @defgroup Module Loadable Modules
385
* @defgroup Trace Trace
386
* @defgroup Debugfs Debug File System
387
* @defgroup Reset Reset
388
* @defgroup I2C I2C
389
* @defgroup Clocks Clocks
390
* @defgroup ABI_info ABI Info
391
* @defgroup Powergating Power Gating
392
* @defgroup Thermal Thermal
393
* @defgroup OC_status OC status
394
* @defgroup Vhint CPU Voltage hint
395
* @defgroup EMC EMC
396
* @defgroup BWMGR BWMGR
397
* @defgroup ISO_CLIENT ISO_CLIENT
398
* @defgroup CPU NDIV Limits
399
* @defgroup RingbufConsole Ring Buffer Console
400
* @defgroup Strap Straps
401
* @defgroup UPHY UPHY
402
* @defgroup CC3 Auto-CC3
403
* @defgroup FMON FMON
404
* @defgroup EC EC
405
* @defgroup Telemetry Telemetry
406
* @defgroup Pwrlimit PWR_LIMIT
407
* @defgroup Gears Gears
408
* @defgroup BWMGR_INT Bandwidth Manager Integrated
409
* @} MRQ_Payloads
410
*/
411
412
/**
413
* @ingroup MRQ_Codes
414
* @def MRQ_PING
415
* @brief A simple ping
416
*
417
* * Platforms: All
418
* * Initiators: Any
419
* * Targets: Any
420
* * Request Payload: @ref mrq_ping_request
421
* * Response Payload: @ref mrq_ping_response
422
*
423
* @ingroup MRQ_Codes
424
* @def MRQ_THREADED_PING
425
* @brief A deeper ping
426
*
427
* * Platforms: All
428
* * Initiators: Any
429
* * Targets: BPMP
430
* * Request Payload: @ref mrq_ping_request
431
* * Response Payload: @ref mrq_ping_response
432
*
433
* Behavior is equivalent to a simple #MRQ_PING except that BPMP
434
* responds from a thread context (providing a slightly more robust
435
* sign of life).
436
*
437
*/
438
439
/**
440
* @ingroup Ping
441
* @brief Request with #MRQ_PING
442
*
443
* Used by the sender of an #MRQ_PING message to request a pong from
444
* recipient. The response from the recipient is computed based on
445
* #challenge.
446
*/
447
struct mrq_ping_request {
448
/** @brief Arbitrarily chosen value */
449
uint32_t challenge;
450
} BPMP_ABI_PACKED;
451
452
/**
453
* @ingroup Ping
454
* @brief Response to #MRQ_PING
455
*
456
* Sent in response to an #MRQ_PING message. #reply should be the
457
* mrq_ping_request challenge left shifted by 1 with the carry-bit
458
* dropped.
459
*
460
*/
461
struct mrq_ping_response {
462
/** @brief Response to the MRQ_PING challege */
463
uint32_t reply;
464
} BPMP_ABI_PACKED;
465
466
/**
467
* @ingroup MRQ_Codes
468
* @def MRQ_QUERY_TAG
469
* @brief Query BPMP firmware's tag (i.e. unique identifer)
470
*
471
* @deprecated Use #MRQ_QUERY_FW_TAG instead.
472
*
473
* * Platforms: All
474
* * Initiators: CCPLEX
475
* * Targets: BPMP
476
* * Request Payload: @ref mrq_query_tag_request
477
* * Response Payload: N/A
478
*
479
*/
480
481
/**
482
* @ingroup Query_Tag
483
* @brief Request with #MRQ_QUERY_TAG
484
*
485
* @deprecated This structure will be removed in future version.
486
* Use MRQ_QUERY_FW_TAG instead.
487
*/
488
struct mrq_query_tag_request {
489
/** @brief Base address to store the firmware tag */
490
uint32_t addr;
491
} BPMP_ABI_PACKED;
492
493
494
/**
495
* @ingroup MRQ_Codes
496
* @def MRQ_QUERY_FW_TAG
497
* @brief Query BPMP firmware's tag (i.e. unique identifier)
498
*
499
* * Platforms: All
500
* * Initiators: Any
501
* * Targets: BPMP
502
* * Request Payload: N/A
503
* * Response Payload: @ref mrq_query_fw_tag_response
504
*
505
*/
506
507
/**
508
* @ingroup Query_Tag
509
* @brief Response to #MRQ_QUERY_FW_TAG
510
*
511
* Sent in response to #MRQ_QUERY_FW_TAG message. #tag contains the unique
512
* identifier for the version of firmware issuing the reply.
513
*
514
*/
515
struct mrq_query_fw_tag_response {
516
/** @brief Array to store tag information */
517
uint8_t tag[32];
518
} BPMP_ABI_PACKED;
519
520
/** @private */
521
struct mrq_threaded_ping_request {
522
uint32_t challenge;
523
} BPMP_ABI_PACKED;
524
525
/** @private */
526
struct mrq_threaded_ping_response {
527
uint32_t reply;
528
} BPMP_ABI_PACKED;
529
530
/**
531
* @ingroup MRQ_Codes
532
* @def MRQ_DEBUGFS
533
* @brief Interact with BPMP's debugfs file nodes
534
*
535
* @deprecated use MRQ_DEBUG instead.
536
*
537
* * Platforms: T186, T194
538
* * Initiators: Any
539
* * Targets: BPMP
540
* * Request Payload: @ref mrq_debugfs_request
541
* * Response Payload: @ref mrq_debugfs_response
542
*/
543
544
/**
545
* @addtogroup Debugfs
546
* @{
547
*
548
* The BPMP firmware implements a pseudo-filesystem called
549
* debugfs. Any driver within the firmware may register with debugfs
550
* to expose an arbitrary set of "files" in the filesystem. When
551
* software on the CPU writes to a debugfs file, debugfs passes the
552
* written data to a callback provided by the driver. When software on
553
* the CPU reads a debugfs file, debugfs queries the driver for the
554
* data to return to the CPU. The intention of the debugfs filesystem
555
* is to provide information useful for debugging the system at
556
* runtime.
557
*
558
* @note The files exposed via debugfs are not part of the
559
* BPMP firmware's ABI. debugfs files may be added or removed in any
560
* given version of the firmware. Typically the semantics of a debugfs
561
* file are consistent from version to version but even that is not
562
* guaranteed.
563
*
564
* @}
565
*/
566
567
/** @ingroup Debugfs */
568
enum mrq_debugfs_commands {
569
/** @brief Perform read */
570
CMD_DEBUGFS_READ = 1,
571
/** @brief Perform write */
572
CMD_DEBUGFS_WRITE = 2,
573
/** @brief Perform dumping directory */
574
CMD_DEBUGFS_DUMPDIR = 3,
575
/** @brief Not a command */
576
CMD_DEBUGFS_MAX
577
};
578
579
/**
580
* @ingroup Debugfs
581
* @brief Parameters for CMD_DEBUGFS_READ/WRITE command
582
*/
583
struct cmd_debugfs_fileop_request {
584
/** @brief Physical address pointing at filename */
585
uint32_t fnameaddr;
586
/** @brief Length in bytes of filename buffer */
587
uint32_t fnamelen;
588
/** @brief Physical address pointing to data buffer */
589
uint32_t dataaddr;
590
/** @brief Length in bytes of data buffer */
591
uint32_t datalen;
592
} BPMP_ABI_PACKED;
593
594
/**
595
* @ingroup Debugfs
596
* @brief Parameters for CMD_DEBUGFS_READ/WRITE command
597
*/
598
struct cmd_debugfs_dumpdir_request {
599
/** @brief Physical address pointing to data buffer */
600
uint32_t dataaddr;
601
/** @brief Length in bytes of data buffer */
602
uint32_t datalen;
603
} BPMP_ABI_PACKED;
604
605
/**
606
* @ingroup Debugfs
607
* @brief Response data for CMD_DEBUGFS_READ/WRITE command
608
*/
609
struct cmd_debugfs_fileop_response {
610
/** @brief Always 0 */
611
uint32_t reserved;
612
/** @brief Number of bytes read from or written to data buffer */
613
uint32_t nbytes;
614
} BPMP_ABI_PACKED;
615
616
/**
617
* @ingroup Debugfs
618
* @brief Response data for CMD_DEBUGFS_DUMPDIR command
619
*/
620
struct cmd_debugfs_dumpdir_response {
621
/** @brief Always 0 */
622
uint32_t reserved;
623
/** @brief Number of bytes read from or written to data buffer */
624
uint32_t nbytes;
625
} BPMP_ABI_PACKED;
626
627
/**
628
* @ingroup Debugfs
629
* @brief Request with #MRQ_DEBUGFS.
630
*
631
* The sender of an MRQ_DEBUGFS message uses #cmd to specify a debugfs
632
* command to execute. Legal commands are the values of @ref
633
* mrq_debugfs_commands. Each command requires a specific additional
634
* payload of data.
635
*
636
* |command |payload|
637
* |-------------------|-------|
638
* |CMD_DEBUGFS_READ |fop |
639
* |CMD_DEBUGFS_WRITE |fop |
640
* |CMD_DEBUGFS_DUMPDIR|dumpdir|
641
*/
642
struct mrq_debugfs_request {
643
/** @brief Sub-command (@ref mrq_debugfs_commands) */
644
uint32_t cmd;
645
union {
646
struct cmd_debugfs_fileop_request fop;
647
struct cmd_debugfs_dumpdir_request dumpdir;
648
} BPMP_UNION_ANON;
649
} BPMP_ABI_PACKED;
650
651
/**
652
* @ingroup Debugfs
653
*/
654
struct mrq_debugfs_response {
655
/** @brief Always 0 */
656
int32_t reserved;
657
union {
658
/** @brief Response data for CMD_DEBUGFS_READ OR
659
* CMD_DEBUGFS_WRITE command
660
*/
661
struct cmd_debugfs_fileop_response fop;
662
/** @brief Response data for CMD_DEBUGFS_DUMPDIR command */
663
struct cmd_debugfs_dumpdir_response dumpdir;
664
} BPMP_UNION_ANON;
665
} BPMP_ABI_PACKED;
666
667
/**
668
* @addtogroup Debugfs
669
* @{
670
*/
671
#define DEBUGFS_S_ISDIR (1 << 9)
672
#define DEBUGFS_S_IRUSR (1 << 8)
673
#define DEBUGFS_S_IWUSR (1 << 7)
674
/** @} Debugfs */
675
676
/**
677
* @ingroup MRQ_Codes
678
* @def MRQ_DEBUG
679
* @brief Interact with BPMP's debugfs file nodes. Use message payload
680
* for exchanging data. This is functionally equivalent to
681
* @ref MRQ_DEBUGFS. But the way in which data is exchanged is different.
682
* When software running on CPU tries to read a debugfs file,
683
* the file path and read data will be stored in message payload.
684
* Since the message payload size is limited, a debugfs file
685
* transaction might require multiple frames of data exchanged
686
* between BPMP and CPU until the transaction completes.
687
*
688
* * Platforms: T194
689
* * Initiators: Any
690
* * Targets: BPMP
691
* * Request Payload: @ref mrq_debug_request
692
* * Response Payload: @ref mrq_debug_response
693
*/
694
695
/** @ingroup Debugfs */
696
enum mrq_debug_commands {
697
/** @brief Open required file for read operation */
698
CMD_DEBUG_OPEN_RO = 0,
699
/** @brief Open required file for write operation */
700
CMD_DEBUG_OPEN_WO = 1,
701
/** @brief Perform read */
702
CMD_DEBUG_READ = 2,
703
/** @brief Perform write */
704
CMD_DEBUG_WRITE = 3,
705
/** @brief Close file */
706
CMD_DEBUG_CLOSE = 4,
707
/** @brief Not a command */
708
CMD_DEBUG_MAX
709
};
710
711
/**
712
* @ingroup Debugfs
713
* @brief Maximum number of files that can be open at a given time
714
*/
715
#define DEBUG_MAX_OPEN_FILES 1
716
717
/**
718
* @ingroup Debugfs
719
* @brief Maximum size of null-terminated file name string in bytes.
720
* Value is derived from memory available in message payload while
721
* using @ref cmd_debug_fopen_request
722
* Value 4 corresponds to size of @ref mrq_debug_commands
723
* in @ref mrq_debug_request.
724
* 120 - 4 dbg_cmd(32bit) = 116
725
*/
726
#define DEBUG_FNAME_MAX_SZ (MSG_DATA_MIN_SZ - 4)
727
728
/**
729
* @ingroup Debugfs
730
* @brief Parameters for CMD_DEBUG_OPEN command
731
*/
732
struct cmd_debug_fopen_request {
733
/** @brief File name - Null-terminated string with maximum
734
* length @ref DEBUG_FNAME_MAX_SZ
735
*/
736
char name[DEBUG_FNAME_MAX_SZ];
737
} BPMP_ABI_PACKED;
738
739
/**
740
* @ingroup Debugfs
741
* @brief Response data for CMD_DEBUG_OPEN_RO/WO command
742
*/
743
struct cmd_debug_fopen_response {
744
/** @brief Identifier for file access */
745
uint32_t fd;
746
/** @brief Data length. File data size for READ command.
747
* Maximum allowed length for WRITE command
748
*/
749
uint32_t datalen;
750
} BPMP_ABI_PACKED;
751
752
/**
753
* @ingroup Debugfs
754
* @brief Parameters for CMD_DEBUG_READ command
755
*/
756
struct cmd_debug_fread_request {
757
/** @brief File access identifier received in response
758
* to CMD_DEBUG_OPEN_RO request
759
*/
760
uint32_t fd;
761
} BPMP_ABI_PACKED;
762
763
/**
764
* @ingroup Debugfs
765
* @brief Maximum size of read data in bytes.
766
* Value is derived from memory available in message payload while
767
* using @ref cmd_debug_fread_response.
768
*/
769
#define DEBUG_READ_MAX_SZ (MSG_DATA_MIN_SZ - 4)
770
771
/**
772
* @ingroup Debugfs
773
* @brief Response data for CMD_DEBUG_READ command
774
*/
775
struct cmd_debug_fread_response {
776
/** @brief Size of data provided in this response in bytes */
777
uint32_t readlen;
778
/** @brief File data from seek position */
779
char data[DEBUG_READ_MAX_SZ];
780
} BPMP_ABI_PACKED;
781
782
/**
783
* @ingroup Debugfs
784
* @brief Maximum size of write data in bytes.
785
* Value is derived from memory available in message payload while
786
* using @ref cmd_debug_fwrite_request.
787
*/
788
#define DEBUG_WRITE_MAX_SZ (MSG_DATA_MIN_SZ - 12)
789
790
/**
791
* @ingroup Debugfs
792
* @brief Parameters for CMD_DEBUG_WRITE command
793
*/
794
struct cmd_debug_fwrite_request {
795
/** @brief File access identifier received in response
796
* to CMD_DEBUG_OPEN_RO request
797
*/
798
uint32_t fd;
799
/** @brief Size of write data in bytes */
800
uint32_t datalen;
801
/** @brief Data to be written */
802
char data[DEBUG_WRITE_MAX_SZ];
803
} BPMP_ABI_PACKED;
804
805
/**
806
* @ingroup Debugfs
807
* @brief Parameters for CMD_DEBUG_CLOSE command
808
*/
809
struct cmd_debug_fclose_request {
810
/** @brief File access identifier received in response
811
* to CMD_DEBUG_OPEN_RO request
812
*/
813
uint32_t fd;
814
} BPMP_ABI_PACKED;
815
816
/**
817
* @ingroup Debugfs
818
* @brief Request with #MRQ_DEBUG.
819
*
820
* The sender of an MRQ_DEBUG message uses #cmd to specify a debugfs
821
* command to execute. Legal commands are the values of @ref
822
* mrq_debug_commands. Each command requires a specific additional
823
* payload of data.
824
*
825
* |command |payload|
826
* |-------------------|-------|
827
* |CMD_DEBUG_OPEN_RO |fop |
828
* |CMD_DEBUG_OPEN_WO |fop |
829
* |CMD_DEBUG_READ |frd |
830
* |CMD_DEBUG_WRITE |fwr |
831
* |CMD_DEBUG_CLOSE |fcl |
832
*/
833
struct mrq_debug_request {
834
/** @brief Sub-command (@ref mrq_debug_commands) */
835
uint32_t cmd;
836
union {
837
/** @brief Request payload for CMD_DEBUG_OPEN_RO/WO command */
838
struct cmd_debug_fopen_request fop;
839
/** @brief Request payload for CMD_DEBUG_READ command */
840
struct cmd_debug_fread_request frd;
841
/** @brief Request payload for CMD_DEBUG_WRITE command */
842
struct cmd_debug_fwrite_request fwr;
843
/** @brief Request payload for CMD_DEBUG_CLOSE command */
844
struct cmd_debug_fclose_request fcl;
845
} BPMP_UNION_ANON;
846
} BPMP_ABI_PACKED;
847
848
/**
849
* @ingroup Debugfs
850
*/
851
struct mrq_debug_response {
852
union {
853
/** @brief Response data for CMD_DEBUG_OPEN_RO/WO command */
854
struct cmd_debug_fopen_response fop;
855
/** @brief Response data for CMD_DEBUG_READ command */
856
struct cmd_debug_fread_response frd;
857
} BPMP_UNION_ANON;
858
} BPMP_ABI_PACKED;
859
860
/**
861
* @ingroup MRQ_Codes
862
* @def MRQ_RESET
863
* @brief Reset an IP block
864
*
865
* * Platforms: T186, T194
866
* * Initiators: Any
867
* * Targets: BPMP
868
* * Request Payload: @ref mrq_reset_request
869
* * Response Payload: @ref mrq_reset_response
870
*
871
* @addtogroup Reset
872
* @{
873
*/
874
875
enum mrq_reset_commands {
876
/**
877
* @brief Assert module reset
878
*
879
* mrq_response::err is 0 if the operation was successful, or @n
880
* -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
881
* -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
882
* -#BPMP_ENOTSUP if target domain h/w state does not allow reset
883
*/
884
CMD_RESET_ASSERT = 1,
885
/**
886
* @brief Deassert module reset
887
*
888
* mrq_response::err is 0 if the operation was successful, or @n
889
* -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
890
* -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
891
* -#BPMP_ENOTSUP if target domain h/w state does not allow reset
892
*/
893
CMD_RESET_DEASSERT = 2,
894
/**
895
* @brief Assert and deassert the module reset
896
*
897
* mrq_response::err is 0 if the operation was successful, or @n
898
* -#BPMP_EINVAL if mrq_reset_request::reset_id is invalid @n
899
* -#BPMP_EACCES if mrq master is not an owner of target domain reset @n
900
* -#BPMP_ENOTSUP if target domain h/w state does not allow reset
901
*/
902
CMD_RESET_MODULE = 3,
903
/**
904
* @brief Get the highest reset ID
905
*
906
* mrq_response::err is 0 if the operation was successful, or @n
907
* -#BPMP_ENODEV if no reset domains are supported (number of IDs is 0)
908
*/
909
CMD_RESET_GET_MAX_ID = 4,
910
911
/** @brief Not part of ABI and subject to change */
912
CMD_RESET_MAX,
913
};
914
915
/**
916
* @brief Request with MRQ_RESET
917
*
918
* Used by the sender of an #MRQ_RESET message to request BPMP to
919
* assert or or deassert a given reset line.
920
*/
921
struct mrq_reset_request {
922
/** @brief Reset action to perform (@ref mrq_reset_commands) */
923
uint32_t cmd;
924
/** @brief Id of the reset to affected */
925
uint32_t reset_id;
926
} BPMP_ABI_PACKED;
927
928
/**
929
* @brief Response for MRQ_RESET sub-command CMD_RESET_GET_MAX_ID. When
930
* this sub-command is not supported, firmware will return -BPMP_EBADCMD
931
* in mrq_response::err.
932
*/
933
struct cmd_reset_get_max_id_response {
934
/** @brief Max reset id */
935
uint32_t max_id;
936
} BPMP_ABI_PACKED;
937
938
/**
939
* @brief Response with MRQ_RESET
940
*
941
* Each sub-command supported by @ref mrq_reset_request may return
942
* sub-command-specific data. Some do and some do not as indicated
943
* in the following table
944
*
945
* | sub-command | payload |
946
* |----------------------|------------------|
947
* | CMD_RESET_ASSERT | - |
948
* | CMD_RESET_DEASSERT | - |
949
* | CMD_RESET_MODULE | - |
950
* | CMD_RESET_GET_MAX_ID | reset_get_max_id |
951
*/
952
struct mrq_reset_response {
953
union {
954
struct cmd_reset_get_max_id_response reset_get_max_id;
955
} BPMP_UNION_ANON;
956
} BPMP_ABI_PACKED;
957
958
/** @} Reset */
959
960
/**
961
* @ingroup MRQ_Codes
962
* @def MRQ_I2C
963
* @brief Issue an i2c transaction
964
*
965
* * Platforms: T186, T194
966
* * Initiators: Any
967
* * Targets: BPMP
968
* * Request Payload: @ref mrq_i2c_request
969
* * Response Payload: @ref mrq_i2c_response
970
*
971
* @addtogroup I2C
972
* @{
973
*/
974
#define TEGRA_I2C_IPC_MAX_IN_BUF_SIZE (MSG_DATA_MIN_SZ - 12U)
975
#define TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE (MSG_DATA_MIN_SZ - 4U)
976
977
#define SERIALI2C_TEN 0x0010U
978
#define SERIALI2C_RD 0x0001U
979
#define SERIALI2C_STOP 0x8000U
980
#define SERIALI2C_NOSTART 0x4000U
981
#define SERIALI2C_REV_DIR_ADDR 0x2000U
982
#define SERIALI2C_IGNORE_NAK 0x1000U
983
#define SERIALI2C_NO_RD_ACK 0x0800U
984
#define SERIALI2C_RECV_LEN 0x0400U
985
986
enum {
987
CMD_I2C_XFER = 1
988
};
989
990
/**
991
* @brief Serializable i2c request
992
*
993
* Instances of this structure are packed (little-endian) into
994
* cmd_i2c_xfer_request::data_buf. Each instance represents a single
995
* transaction (or a portion of a transaction with repeated starts) on
996
* an i2c bus.
997
*
998
* Because these structures are packed, some instances are likely to
999
* be misaligned. Additionally because #data is variable length, it is
1000
* not possible to iterate through a serialized list of these
1001
* structures without inspecting #len in each instance. It may be
1002
* easier to serialize or deserialize cmd_i2c_xfer_request::data_buf
1003
* manually rather than using this structure definition.
1004
*/
1005
struct serial_i2c_request {
1006
/** @brief I2C slave address */
1007
uint16_t addr;
1008
/** @brief Bitmask of SERIALI2C_ flags */
1009
uint16_t flags;
1010
/** @brief Length of I2C transaction in bytes */
1011
uint16_t len;
1012
/** @brief For write transactions only, #len bytes of data */
1013
uint8_t data[];
1014
} BPMP_ABI_PACKED;
1015
1016
/**
1017
* @brief Trigger one or more i2c transactions
1018
*/
1019
struct cmd_i2c_xfer_request {
1020
/**
1021
* @brief Tegra PWR_I2C bus identifier
1022
*
1023
* @cond (bpmp_t234 || bpmp_t239 || bpmp_t194)
1024
* Must be set to 5.
1025
* @endcond (bpmp_t234 || bpmp_t239 || bpmp_t194)
1026
* @cond bpmp_th500
1027
* Must be set to 1.
1028
* @endcond bpmp_th500
1029
*
1030
*/
1031
uint32_t bus_id;
1032
1033
/** @brief Count of valid bytes in #data_buf*/
1034
uint32_t data_size;
1035
1036
/** @brief Serialized packed instances of @ref serial_i2c_request*/
1037
uint8_t data_buf[TEGRA_I2C_IPC_MAX_IN_BUF_SIZE];
1038
} BPMP_ABI_PACKED;
1039
1040
/**
1041
* @brief Container for data read from the i2c bus
1042
*
1043
* Processing an cmd_i2c_xfer_request::data_buf causes BPMP to execute
1044
* zero or more I2C reads. The data read from the bus is serialized
1045
* into #data_buf.
1046
*/
1047
struct cmd_i2c_xfer_response {
1048
/** @brief Count of valid bytes in #data_buf*/
1049
uint32_t data_size;
1050
/** @brief I2c read data */
1051
uint8_t data_buf[TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE];
1052
} BPMP_ABI_PACKED;
1053
1054
/**
1055
* @brief Request with #MRQ_I2C
1056
*/
1057
struct mrq_i2c_request {
1058
/** @brief Always CMD_I2C_XFER (i.e. 1) */
1059
uint32_t cmd;
1060
/** @brief Parameters of the transfer request */
1061
struct cmd_i2c_xfer_request xfer;
1062
} BPMP_ABI_PACKED;
1063
1064
/**
1065
* @brief Response to #MRQ_I2C
1066
*
1067
* mrq_response:err is
1068
* 0: Success
1069
* -#BPMP_EBADCMD: if mrq_i2c_request::cmd is other than 1
1070
* -#BPMP_EINVAL: if cmd_i2c_xfer_request does not contain correctly formatted request
1071
* -#BPMP_ENODEV: if cmd_i2c_xfer_request::bus_id is not supported by BPMP
1072
* -#BPMP_EACCES: if i2c transaction is not allowed due to firewall rules
1073
* -#BPMP_ETIMEDOUT: if i2c transaction times out
1074
* -#BPMP_ENXIO: if i2c slave device does not reply with ACK to the transaction
1075
* -#BPMP_EAGAIN: if ARB_LOST condition is detected by the i2c controller
1076
* -#BPMP_EIO: any other i2c controller error code than NO_ACK or ARB_LOST
1077
*/
1078
struct mrq_i2c_response {
1079
struct cmd_i2c_xfer_response xfer;
1080
} BPMP_ABI_PACKED;
1081
1082
/** @} I2C */
1083
1084
/**
1085
* @ingroup MRQ_Codes
1086
* @def MRQ_CLK
1087
* @brief Perform a clock operation
1088
*
1089
* * Platforms: T186, T194
1090
* * Initiators: Any
1091
* * Targets: BPMP
1092
* * Request Payload: @ref mrq_clk_request
1093
* * Response Payload: @ref mrq_clk_response
1094
*
1095
* @addtogroup Clocks
1096
* @{
1097
*/
1098
enum {
1099
CMD_CLK_GET_RATE = 1,
1100
CMD_CLK_SET_RATE = 2,
1101
CMD_CLK_ROUND_RATE = 3,
1102
CMD_CLK_GET_PARENT = 4,
1103
CMD_CLK_SET_PARENT = 5,
1104
CMD_CLK_IS_ENABLED = 6,
1105
CMD_CLK_ENABLE = 7,
1106
CMD_CLK_DISABLE = 8,
1107
/** @cond DEPRECATED */
1108
CMD_CLK_PROPERTIES = 9,
1109
CMD_CLK_POSSIBLE_PARENTS = 10,
1110
CMD_CLK_NUM_POSSIBLE_PARENTS = 11,
1111
CMD_CLK_GET_POSSIBLE_PARENT = 12,
1112
CMD_CLK_RESET_REFCOUNTS = 13,
1113
/** @endcond DEPRECATED */
1114
CMD_CLK_GET_ALL_INFO = 14,
1115
CMD_CLK_GET_MAX_CLK_ID = 15,
1116
CMD_CLK_GET_FMAX_AT_VMIN = 16,
1117
CMD_CLK_MAX,
1118
};
1119
1120
#define BPMP_CLK_HAS_MUX (1U << 0U)
1121
#define BPMP_CLK_HAS_SET_RATE (1U << 1U)
1122
#define BPMP_CLK_IS_ROOT (1U << 2U)
1123
#define BPMP_CLK_IS_VAR_ROOT (1U << 3U)
1124
/**
1125
* @brief Protection against rate and parent changes
1126
*
1127
* #MRQ_CLK command #CMD_CLK_SET_RATE or #MRQ_CLK command #CMD_CLK_SET_PARENT will return
1128
* -#BPMP_EACCES.
1129
*/
1130
#define BPMP_CLK_RATE_PARENT_CHANGE_DENIED (1U << 30)
1131
1132
/**
1133
* @brief Protection against state changes
1134
*
1135
* #MRQ_CLK command #CMD_CLK_ENABLE or #MRQ_CLK command #CMD_CLK_DISABLE will return
1136
* -#BPMP_EACCES.
1137
*/
1138
#define BPMP_CLK_STATE_CHANGE_DENIED (1U << 31)
1139
1140
#define MRQ_CLK_NAME_MAXLEN 40U
1141
#define MRQ_CLK_MAX_PARENTS 16U
1142
1143
/** @private */
1144
struct cmd_clk_get_rate_request {
1145
BPMP_ABI_EMPTY
1146
} BPMP_ABI_PACKED;
1147
1148
struct cmd_clk_get_rate_response {
1149
int64_t rate;
1150
} BPMP_ABI_PACKED;
1151
1152
struct cmd_clk_set_rate_request {
1153
int32_t unused;
1154
int64_t rate;
1155
} BPMP_ABI_PACKED;
1156
1157
struct cmd_clk_set_rate_response {
1158
int64_t rate;
1159
} BPMP_ABI_PACKED;
1160
1161
struct cmd_clk_round_rate_request {
1162
int32_t unused;
1163
int64_t rate;
1164
} BPMP_ABI_PACKED;
1165
1166
struct cmd_clk_round_rate_response {
1167
int64_t rate;
1168
} BPMP_ABI_PACKED;
1169
1170
/** @private */
1171
struct cmd_clk_get_parent_request {
1172
BPMP_ABI_EMPTY
1173
} BPMP_ABI_PACKED;
1174
1175
struct cmd_clk_get_parent_response {
1176
uint32_t parent_id;
1177
} BPMP_ABI_PACKED;
1178
1179
struct cmd_clk_set_parent_request {
1180
uint32_t parent_id;
1181
} BPMP_ABI_PACKED;
1182
1183
struct cmd_clk_set_parent_response {
1184
uint32_t parent_id;
1185
} BPMP_ABI_PACKED;
1186
1187
/** @private */
1188
struct cmd_clk_is_enabled_request {
1189
BPMP_ABI_EMPTY
1190
} BPMP_ABI_PACKED;
1191
1192
/**
1193
* @brief Response data to #MRQ_CLK sub-command CMD_CLK_IS_ENABLED
1194
*/
1195
struct cmd_clk_is_enabled_response {
1196
/**
1197
* @brief The state of the clock that has been successfully
1198
* requested with CMD_CLK_ENABLE or CMD_CLK_DISABLE by the
1199
* master invoking the command earlier.
1200
*
1201
* The state may not reflect the physical state of the clock
1202
* if there are some other masters requesting it to be
1203
* enabled.
1204
*
1205
* Value 0 is disabled, all other values indicate enabled.
1206
*/
1207
int32_t state;
1208
} BPMP_ABI_PACKED;
1209
1210
/** @private */
1211
struct cmd_clk_enable_request {
1212
BPMP_ABI_EMPTY
1213
} BPMP_ABI_PACKED;
1214
1215
/** @private */
1216
struct cmd_clk_enable_response {
1217
BPMP_ABI_EMPTY
1218
} BPMP_ABI_PACKED;
1219
1220
/** @private */
1221
struct cmd_clk_disable_request {
1222
BPMP_ABI_EMPTY
1223
} BPMP_ABI_PACKED;
1224
1225
/** @private */
1226
struct cmd_clk_disable_response {
1227
BPMP_ABI_EMPTY
1228
} BPMP_ABI_PACKED;
1229
1230
/** @cond DEPRECATED */
1231
/** @private */
1232
struct cmd_clk_properties_request {
1233
BPMP_ABI_EMPTY
1234
} BPMP_ABI_PACKED;
1235
1236
/** @todo flags need to be spelled out here */
1237
struct cmd_clk_properties_response {
1238
uint32_t flags;
1239
} BPMP_ABI_PACKED;
1240
1241
/** @private */
1242
struct cmd_clk_possible_parents_request {
1243
BPMP_ABI_EMPTY
1244
} BPMP_ABI_PACKED;
1245
1246
struct cmd_clk_possible_parents_response {
1247
uint8_t num_parents;
1248
uint8_t reserved[3];
1249
uint32_t parent_id[MRQ_CLK_MAX_PARENTS];
1250
} BPMP_ABI_PACKED;
1251
1252
/** @private */
1253
struct cmd_clk_num_possible_parents_request {
1254
BPMP_ABI_EMPTY
1255
} BPMP_ABI_PACKED;
1256
1257
struct cmd_clk_num_possible_parents_response {
1258
uint8_t num_parents;
1259
} BPMP_ABI_PACKED;
1260
1261
struct cmd_clk_get_possible_parent_request {
1262
uint8_t parent_idx;
1263
} BPMP_ABI_PACKED;
1264
1265
struct cmd_clk_get_possible_parent_response {
1266
uint32_t parent_id;
1267
} BPMP_ABI_PACKED;
1268
/** @endcond DEPRECATED */
1269
1270
/** @private */
1271
struct cmd_clk_get_all_info_request {
1272
BPMP_ABI_EMPTY
1273
} BPMP_ABI_PACKED;
1274
1275
struct cmd_clk_get_all_info_response {
1276
uint32_t flags;
1277
uint32_t parent;
1278
uint32_t parents[MRQ_CLK_MAX_PARENTS];
1279
uint8_t num_parents;
1280
uint8_t name[MRQ_CLK_NAME_MAXLEN];
1281
} BPMP_ABI_PACKED;
1282
1283
/** @private */
1284
struct cmd_clk_get_max_clk_id_request {
1285
BPMP_ABI_EMPTY
1286
} BPMP_ABI_PACKED;
1287
1288
struct cmd_clk_get_max_clk_id_response {
1289
uint32_t max_id;
1290
} BPMP_ABI_PACKED;
1291
1292
/** @private */
1293
struct cmd_clk_get_fmax_at_vmin_request {
1294
BPMP_ABI_EMPTY
1295
} BPMP_ABI_PACKED;
1296
1297
struct cmd_clk_get_fmax_at_vmin_response {
1298
int64_t rate;
1299
} BPMP_ABI_PACKED;
1300
1301
1302
/**
1303
* @ingroup Clocks
1304
* @brief Request with #MRQ_CLK
1305
*
1306
* Used by the sender of an #MRQ_CLK message to control clocks. The
1307
* clk_request is split into several sub-commands. Some sub-commands
1308
* require no additional data. Others have a sub-command specific
1309
* payload
1310
*
1311
* |sub-command |payload |
1312
* |----------------------------|-----------------------|
1313
* |CMD_CLK_GET_RATE |- |
1314
* |CMD_CLK_SET_RATE |clk_set_rate |
1315
* |CMD_CLK_ROUND_RATE |clk_round_rate |
1316
* |CMD_CLK_GET_PARENT |- |
1317
* |CMD_CLK_SET_PARENT |clk_set_parent |
1318
* |CMD_CLK_IS_ENABLED |- |
1319
* |CMD_CLK_ENABLE |- |
1320
* |CMD_CLK_DISABLE |- |
1321
* |CMD_CLK_GET_ALL_INFO |- |
1322
* |CMD_CLK_GET_MAX_CLK_ID |- |
1323
* |CMD_CLK_GET_FMAX_AT_VMIN |-
1324
* |
1325
*
1326
*/
1327
1328
/** @cond DEPRECATED
1329
*
1330
* Older versions of firmware also supported following sub-commands:
1331
* |CMD_CLK_PROPERTIES |- |
1332
* |CMD_CLK_POSSIBLE_PARENTS |- |
1333
* |CMD_CLK_NUM_POSSIBLE_PARENTS|- |
1334
* |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parent|
1335
* |CMD_CLK_RESET_REFCOUNTS |- |
1336
*
1337
* @endcond DEPRECATED */
1338
1339
struct mrq_clk_request {
1340
/** @brief Sub-command and clock id concatenated to 32-bit word.
1341
* - bits[31..24] is the sub-cmd.
1342
* - bits[23..0] is the clock id
1343
*/
1344
uint32_t cmd_and_id;
1345
1346
union {
1347
/** @private */
1348
struct cmd_clk_get_rate_request clk_get_rate;
1349
struct cmd_clk_set_rate_request clk_set_rate;
1350
struct cmd_clk_round_rate_request clk_round_rate;
1351
/** @private */
1352
struct cmd_clk_get_parent_request clk_get_parent;
1353
struct cmd_clk_set_parent_request clk_set_parent;
1354
/** @private */
1355
struct cmd_clk_enable_request clk_enable;
1356
/** @private */
1357
struct cmd_clk_disable_request clk_disable;
1358
/** @private */
1359
struct cmd_clk_is_enabled_request clk_is_enabled;
1360
/** @cond DEPRECATED */
1361
/** @private */
1362
struct cmd_clk_properties_request clk_properties;
1363
/** @private */
1364
struct cmd_clk_possible_parents_request clk_possible_parents;
1365
/** @private */
1366
struct cmd_clk_num_possible_parents_request clk_num_possible_parents;
1367
struct cmd_clk_get_possible_parent_request clk_get_possible_parent;
1368
/** @endcond DEPRECATED */
1369
/** @private */
1370
struct cmd_clk_get_all_info_request clk_get_all_info;
1371
/** @private */
1372
struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id;
1373
/** @private */
1374
struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin;
1375
} BPMP_UNION_ANON;
1376
} BPMP_ABI_PACKED;
1377
1378
/**
1379
* @ingroup Clocks
1380
* @brief Response to MRQ_CLK
1381
*
1382
* Each sub-command supported by @ref mrq_clk_request may return
1383
* sub-command-specific data. Some do and some do not as indicated in
1384
* the following table
1385
*
1386
* |sub-command |payload |
1387
* |----------------------------|------------------------|
1388
* |CMD_CLK_GET_RATE |clk_get_rate |
1389
* |CMD_CLK_SET_RATE |clk_set_rate |
1390
* |CMD_CLK_ROUND_RATE |clk_round_rate |
1391
* |CMD_CLK_GET_PARENT |clk_get_parent |
1392
* |CMD_CLK_SET_PARENT |clk_set_parent |
1393
* |CMD_CLK_IS_ENABLED |clk_is_enabled |
1394
* |CMD_CLK_ENABLE |- |
1395
* |CMD_CLK_DISABLE |- |
1396
* |CMD_CLK_GET_ALL_INFO |clk_get_all_info |
1397
* |CMD_CLK_GET_MAX_CLK_ID |clk_get_max_id |
1398
* |CMD_CLK_GET_FMAX_AT_VMIN |clk_get_fmax_at_vmin |
1399
*
1400
*/
1401
1402
/** @cond DEPRECATED
1403
*
1404
* Older versions of firmware also supported following sub-commands:
1405
* |CMD_CLK_PROPERTIES |clk_properties |
1406
* |CMD_CLK_POSSIBLE_PARENTS |clk_possible_parents |
1407
* |CMD_CLK_NUM_POSSIBLE_PARENTS|clk_num_possible_parents|
1408
* |CMD_CLK_GET_POSSIBLE_PARENT |clk_get_possible_parents|
1409
* |CMD_CLK_RESET_REFCOUNTS |- |
1410
*
1411
* @endcond DEPRECATED */
1412
1413
struct mrq_clk_response {
1414
union {
1415
struct cmd_clk_get_rate_response clk_get_rate;
1416
struct cmd_clk_set_rate_response clk_set_rate;
1417
struct cmd_clk_round_rate_response clk_round_rate;
1418
struct cmd_clk_get_parent_response clk_get_parent;
1419
struct cmd_clk_set_parent_response clk_set_parent;
1420
/** @private */
1421
struct cmd_clk_enable_response clk_enable;
1422
/** @private */
1423
struct cmd_clk_disable_response clk_disable;
1424
struct cmd_clk_is_enabled_response clk_is_enabled;
1425
/** @cond DEPRECATED */
1426
struct cmd_clk_properties_response clk_properties;
1427
struct cmd_clk_possible_parents_response clk_possible_parents;
1428
struct cmd_clk_num_possible_parents_response clk_num_possible_parents;
1429
struct cmd_clk_get_possible_parent_response clk_get_possible_parent;
1430
/** @endcond DEPRECATED */
1431
struct cmd_clk_get_all_info_response clk_get_all_info;
1432
struct cmd_clk_get_max_clk_id_response clk_get_max_clk_id;
1433
struct cmd_clk_get_fmax_at_vmin_response clk_get_fmax_at_vmin;
1434
} BPMP_UNION_ANON;
1435
} BPMP_ABI_PACKED;
1436
1437
/** @} Clocks */
1438
1439
/**
1440
* @ingroup MRQ_Codes
1441
* @def MRQ_QUERY_ABI
1442
* @brief Check if an MRQ is implemented
1443
*
1444
* * Platforms: All
1445
* * Initiators: Any
1446
* * Targets: Any except DMCE
1447
* * Request Payload: @ref mrq_query_abi_request
1448
* * Response Payload: @ref mrq_query_abi_response
1449
*/
1450
1451
/**
1452
* @ingroup ABI_info
1453
* @brief Request with MRQ_QUERY_ABI
1454
*
1455
* Used by #MRQ_QUERY_ABI call to check if MRQ code #mrq is supported
1456
* by the recipient.
1457
*/
1458
struct mrq_query_abi_request {
1459
/** @brief MRQ code to query */
1460
uint32_t mrq;
1461
} BPMP_ABI_PACKED;
1462
1463
/**
1464
* @ingroup ABI_info
1465
* @brief Response to MRQ_QUERY_ABI
1466
*
1467
* @note mrq_response::err of 0 indicates that the query was
1468
* successful, not that the MRQ itself is supported!
1469
*/
1470
struct mrq_query_abi_response {
1471
/** @brief 0 if queried MRQ is supported. Else, -#BPMP_ENODEV */
1472
int32_t status;
1473
} BPMP_ABI_PACKED;
1474
1475
/**
1476
*
1477
* @ingroup MRQ_Codes
1478
* @def MRQ_PG
1479
* @brief Control power-gating state of a partition. In contrast to
1480
* MRQ_PG_UPDATE_STATE, operations that change the power partition
1481
* state are NOT reference counted
1482
*
1483
* @cond (bpmp_t194 || bpmp_t186)
1484
* @note On T194 and earlier BPMP-FW forcefully turns off some partitions as
1485
* part of SC7 entry because their state cannot be adequately restored on exit.
1486
* Therefore, it is recommended to power off all domains via MRQ_PG prior to SC7
1487
* entry.
1488
* See @ref bpmp_pdomain_ids for further detail.
1489
* @endcond (bpmp_t194 || bpmp_t186)
1490
*
1491
* * Platforms: T186, T194
1492
* * Initiators: Any
1493
* * Targets: BPMP
1494
* * Request Payload: @ref mrq_pg_request
1495
* * Response Payload: @ref mrq_pg_response
1496
*
1497
* @addtogroup Powergating
1498
* @{
1499
*/
1500
enum mrq_pg_cmd {
1501
/**
1502
* @brief Check whether the BPMP driver supports the specified
1503
* request type
1504
*
1505
* mrq_response::err is 0 if the specified request is
1506
* supported and -#BPMP_ENODEV otherwise.
1507
*/
1508
CMD_PG_QUERY_ABI = 0,
1509
1510
/**
1511
* @brief Set the current state of specified power domain. The
1512
* possible values for power domains are defined in enum
1513
* pg_states
1514
*
1515
* mrq_response:err is
1516
* 0: Success
1517
* -#BPMP_EINVAL: Invalid request parameters
1518
*/
1519
CMD_PG_SET_STATE = 1,
1520
1521
/**
1522
* @brief Get the current state of specified power domain. The
1523
* possible values for power domains are defined in enum
1524
* pg_states
1525
*
1526
* mrq_response:err is
1527
* 0: Success
1528
* -#BPMP_EINVAL: Invalid request parameters
1529
*/
1530
CMD_PG_GET_STATE = 2,
1531
1532
/**
1533
* @brief Get the name string of specified power domain id.
1534
*
1535
* mrq_response:err is
1536
* 0: Success
1537
* -#BPMP_EINVAL: Invalid request parameters
1538
*/
1539
CMD_PG_GET_NAME = 3,
1540
1541
1542
/**
1543
* @brief Get the highest power domain id in the system. Not
1544
* all IDs between 0 and max_id are valid IDs.
1545
*
1546
* mrq_response:err is
1547
* 0: Success
1548
* -#BPMP_EINVAL: Invalid request parameters
1549
*/
1550
CMD_PG_GET_MAX_ID = 4,
1551
};
1552
1553
#define MRQ_PG_NAME_MAXLEN 40
1554
1555
enum pg_states {
1556
/** @brief Power domain is OFF */
1557
PG_STATE_OFF = 0,
1558
/** @brief Power domain is ON */
1559
PG_STATE_ON = 1,
1560
/**
1561
* @brief a legacy state where power domain and the clock
1562
* associated to the domain are ON.
1563
* This state is only supported in T186, and the use of it is
1564
* deprecated.
1565
*/
1566
PG_STATE_RUNNING = 2,
1567
};
1568
1569
struct cmd_pg_query_abi_request {
1570
/** @ref mrq_pg_cmd */
1571
uint32_t type;
1572
} BPMP_ABI_PACKED;
1573
1574
struct cmd_pg_set_state_request {
1575
/** @ref pg_states */
1576
uint32_t state;
1577
} BPMP_ABI_PACKED;
1578
1579
/**
1580
* @brief Response data to #MRQ_PG sub command #CMD_PG_GET_STATE
1581
*/
1582
struct cmd_pg_get_state_response {
1583
/**
1584
* @brief The state of the power partition that has been
1585
* succesfuly requested by the master earlier using #MRQ_PG
1586
* command #CMD_PG_SET_STATE.
1587
*
1588
* The state may not reflect the physical state of the power
1589
* partition if there are some other masters requesting it to
1590
* be enabled.
1591
*
1592
* See @ref pg_states for possible values
1593
*/
1594
uint32_t state;
1595
} BPMP_ABI_PACKED;
1596
1597
struct cmd_pg_get_name_response {
1598
uint8_t name[MRQ_PG_NAME_MAXLEN];
1599
} BPMP_ABI_PACKED;
1600
1601
struct cmd_pg_get_max_id_response {
1602
uint32_t max_id;
1603
} BPMP_ABI_PACKED;
1604
1605
/**
1606
* @brief Request with #MRQ_PG
1607
*
1608
* Used by the sender of an #MRQ_PG message to control power
1609
* partitions. The pg_request is split into several sub-commands. Some
1610
* sub-commands require no additional data. Others have a sub-command
1611
* specific payload
1612
*
1613
* |sub-command |payload |
1614
* |----------------------------|-----------------------|
1615
* |CMD_PG_QUERY_ABI | query_abi |
1616
* |CMD_PG_SET_STATE | set_state |
1617
* |CMD_PG_GET_STATE | - |
1618
* |CMD_PG_GET_NAME | - |
1619
* |CMD_PG_GET_MAX_ID | - |
1620
*
1621
*/
1622
struct mrq_pg_request {
1623
uint32_t cmd;
1624
uint32_t id;
1625
union {
1626
struct cmd_pg_query_abi_request query_abi;
1627
struct cmd_pg_set_state_request set_state;
1628
} BPMP_UNION_ANON;
1629
} BPMP_ABI_PACKED;
1630
1631
/**
1632
* @brief Response to MRQ_PG
1633
*
1634
* Each sub-command supported by @ref mrq_pg_request may return
1635
* sub-command-specific data. Some do and some do not as indicated in
1636
* the following table
1637
*
1638
* |sub-command |payload |
1639
* |----------------------------|-----------------------|
1640
* |CMD_PG_QUERY_ABI | - |
1641
* |CMD_PG_SET_STATE | - |
1642
* |CMD_PG_GET_STATE | get_state |
1643
* |CMD_PG_GET_NAME | get_name |
1644
* |CMD_PG_GET_MAX_ID | get_max_id |
1645
*/
1646
struct mrq_pg_response {
1647
union {
1648
struct cmd_pg_get_state_response get_state;
1649
struct cmd_pg_get_name_response get_name;
1650
struct cmd_pg_get_max_id_response get_max_id;
1651
} BPMP_UNION_ANON;
1652
} BPMP_ABI_PACKED;
1653
1654
/** @} Powergating */
1655
1656
/**
1657
* @ingroup MRQ_Codes
1658
* @def MRQ_THERMAL
1659
* @brief Interact with BPMP thermal framework
1660
*
1661
* * Platforms: T186, T194
1662
* * Initiators: Any
1663
* * Targets: Any
1664
* * Request Payload: TODO
1665
* * Response Payload: TODO
1666
*
1667
* @addtogroup Thermal
1668
*
1669
* The BPMP firmware includes a thermal framework. Drivers within the
1670
* bpmp firmware register with the framework to provide thermal
1671
* zones. Each thermal zone corresponds to an entity whose temperature
1672
* can be measured. The framework also has a notion of trip points. A
1673
* trip point consists of a thermal zone id, a temperature, and a
1674
* callback routine. The framework invokes the callback when the zone
1675
* hits the indicated temperature. The BPMP firmware uses this thermal
1676
* framework interally to implement various temperature-dependent
1677
* functions.
1678
*
1679
* Software on the CPU can use #MRQ_THERMAL (with payload @ref
1680
* mrq_thermal_host_to_bpmp_request) to interact with the BPMP thermal
1681
* framework. The CPU must It can query the number of supported zones,
1682
* query zone temperatures, and set trip points.
1683
*
1684
* When a trip point set by the CPU gets crossed, BPMP firmware issues
1685
* an IPC to the CPU having mrq_request::mrq = #MRQ_THERMAL and a
1686
* payload of @ref mrq_thermal_bpmp_to_host_request.
1687
* @{
1688
*/
1689
enum mrq_thermal_host_to_bpmp_cmd {
1690
/**
1691
* @brief Check whether the BPMP driver supports the specified
1692
* request type.
1693
*
1694
* Host needs to supply request parameters.
1695
*
1696
* mrq_response::err is 0 if the specified request is
1697
* supported and -#BPMP_ENODEV otherwise.
1698
*/
1699
CMD_THERMAL_QUERY_ABI = 0,
1700
1701
/**
1702
* @brief Get the current temperature of the specified zone.
1703
*
1704
* Host needs to supply request parameters.
1705
*
1706
* mrq_response::err is
1707
* * 0: Temperature query succeeded.
1708
* * -#BPMP_EINVAL: Invalid request parameters.
1709
* * -#BPMP_ENOENT: No driver registered for thermal zone..
1710
* * -#BPMP_EFAULT: Problem reading temperature measurement.
1711
*/
1712
CMD_THERMAL_GET_TEMP = 1,
1713
1714
/**
1715
* @brief Enable or disable and set the lower and upper
1716
* thermal limits for a thermal trip point. Each zone has
1717
* one trip point.
1718
*
1719
* Host needs to supply request parameters. Once the
1720
* temperature hits a trip point, the BPMP will send a message
1721
* to the CPU having MRQ=MRQ_THERMAL and
1722
* type=CMD_THERMAL_HOST_TRIP_REACHED
1723
*
1724
* mrq_response::err is
1725
* * 0: Trip successfully set.
1726
* * -#BPMP_EINVAL: Invalid request parameters.
1727
* * -#BPMP_ENOENT: No driver registered for thermal zone.
1728
* * -#BPMP_EFAULT: Problem setting trip point.
1729
*/
1730
CMD_THERMAL_SET_TRIP = 2,
1731
1732
/**
1733
* @brief Get the number of supported thermal zones.
1734
*
1735
* No request parameters required.
1736
*
1737
* mrq_response::err is always 0, indicating success.
1738
*/
1739
CMD_THERMAL_GET_NUM_ZONES = 3,
1740
1741
/**
1742
* @brief Get the thermtrip of the specified zone.
1743
*
1744
* Host needs to supply request parameters.
1745
*
1746
* mrq_response::err is
1747
* * 0: Valid zone information returned.
1748
* * -#BPMP_EINVAL: Invalid request parameters.
1749
* * -#BPMP_ENOENT: No driver registered for thermal zone.
1750
* * -#BPMP_ERANGE if thermtrip is invalid or disabled.
1751
* * -#BPMP_EFAULT: Problem reading zone information.
1752
*/
1753
CMD_THERMAL_GET_THERMTRIP = 4,
1754
1755
/** @brief: number of supported host-to-bpmp commands. May
1756
* increase in future
1757
*/
1758
CMD_THERMAL_HOST_TO_BPMP_NUM
1759
};
1760
1761
enum mrq_thermal_bpmp_to_host_cmd {
1762
/**
1763
* @brief Indication that the temperature for a zone has
1764
* exceeded the range indicated in the thermal trip point
1765
* for the zone.
1766
*
1767
* BPMP needs to supply request parameters. Host only needs to
1768
* acknowledge.
1769
*/
1770
CMD_THERMAL_HOST_TRIP_REACHED = 100,
1771
1772
/** @brief: number of supported bpmp-to-host commands. May
1773
* increase in future
1774
*/
1775
CMD_THERMAL_BPMP_TO_HOST_NUM
1776
};
1777
1778
/*
1779
* Host->BPMP request data for request type CMD_THERMAL_QUERY_ABI
1780
*
1781
* zone: Request type for which to check existence.
1782
*/
1783
struct cmd_thermal_query_abi_request {
1784
uint32_t type;
1785
} BPMP_ABI_PACKED;
1786
1787
/*
1788
* Host->BPMP request data for request type CMD_THERMAL_GET_TEMP
1789
*
1790
* zone: Number of thermal zone.
1791
*/
1792
struct cmd_thermal_get_temp_request {
1793
uint32_t zone;
1794
} BPMP_ABI_PACKED;
1795
1796
/*
1797
* BPMP->Host reply data for request CMD_THERMAL_GET_TEMP
1798
*
1799
* error: 0 if request succeeded.
1800
* -BPMP_EINVAL if request parameters were invalid.
1801
* -BPMP_ENOENT if no driver was registered for the specified thermal zone.
1802
* -BPMP_EFAULT for other thermal zone driver errors.
1803
* temp: Current temperature in millicelsius.
1804
*/
1805
struct cmd_thermal_get_temp_response {
1806
int32_t temp;
1807
} BPMP_ABI_PACKED;
1808
1809
/*
1810
* Host->BPMP request data for request type CMD_THERMAL_SET_TRIP
1811
*
1812
* zone: Number of thermal zone.
1813
* low: Temperature of lower trip point in millicelsius
1814
* high: Temperature of upper trip point in millicelsius
1815
* enabled: 1 to enable trip point, 0 to disable trip point
1816
*/
1817
struct cmd_thermal_set_trip_request {
1818
uint32_t zone;
1819
int32_t low;
1820
int32_t high;
1821
uint32_t enabled;
1822
} BPMP_ABI_PACKED;
1823
1824
/*
1825
* BPMP->Host request data for request type CMD_THERMAL_HOST_TRIP_REACHED
1826
*
1827
* zone: Number of thermal zone where trip point was reached.
1828
*/
1829
struct cmd_thermal_host_trip_reached_request {
1830
uint32_t zone;
1831
} BPMP_ABI_PACKED;
1832
1833
/*
1834
* BPMP->Host reply data for request type CMD_THERMAL_GET_NUM_ZONES
1835
*
1836
* num: Number of supported thermal zones. The thermal zones are indexed
1837
* starting from zero.
1838
*/
1839
struct cmd_thermal_get_num_zones_response {
1840
uint32_t num;
1841
} BPMP_ABI_PACKED;
1842
1843
/*
1844
* Host->BPMP request data for request type CMD_THERMAL_GET_THERMTRIP
1845
*
1846
* zone: Number of thermal zone.
1847
*/
1848
struct cmd_thermal_get_thermtrip_request {
1849
uint32_t zone;
1850
} BPMP_ABI_PACKED;
1851
1852
/*
1853
* BPMP->Host reply data for request CMD_THERMAL_GET_THERMTRIP
1854
*
1855
* thermtrip: HW shutdown temperature in millicelsius.
1856
*/
1857
struct cmd_thermal_get_thermtrip_response {
1858
int32_t thermtrip;
1859
} BPMP_ABI_PACKED;
1860
1861
/*
1862
* Host->BPMP request data.
1863
*
1864
* Reply type is union mrq_thermal_bpmp_to_host_response.
1865
*
1866
* type: Type of request. Values listed in enum mrq_thermal_type.
1867
* data: Request type specific parameters.
1868
*/
1869
struct mrq_thermal_host_to_bpmp_request {
1870
uint32_t type;
1871
union {
1872
struct cmd_thermal_query_abi_request query_abi;
1873
struct cmd_thermal_get_temp_request get_temp;
1874
struct cmd_thermal_set_trip_request set_trip;
1875
struct cmd_thermal_get_thermtrip_request get_thermtrip;
1876
} BPMP_UNION_ANON;
1877
} BPMP_ABI_PACKED;
1878
1879
/*
1880
* BPMP->Host request data.
1881
*
1882
* type: Type of request. Values listed in enum mrq_thermal_type.
1883
* data: Request type specific parameters.
1884
*/
1885
struct mrq_thermal_bpmp_to_host_request {
1886
uint32_t type;
1887
union {
1888
struct cmd_thermal_host_trip_reached_request host_trip_reached;
1889
} BPMP_UNION_ANON;
1890
} BPMP_ABI_PACKED;
1891
1892
/*
1893
* Data in reply to a Host->BPMP request.
1894
*/
1895
union mrq_thermal_bpmp_to_host_response {
1896
struct cmd_thermal_get_temp_response get_temp;
1897
struct cmd_thermal_get_thermtrip_response get_thermtrip;
1898
struct cmd_thermal_get_num_zones_response get_num_zones;
1899
} BPMP_ABI_PACKED;
1900
1901
/** @} Thermal */
1902
1903
/**
1904
* @ingroup MRQ_Codes
1905
* @def MRQ_OC_STATUS
1906
* @brief Query over current status
1907
*
1908
* * Platforms: T234
1909
* @cond bpmp_t234
1910
* * Initiators: CCPLEX
1911
* * Targets: BPMP
1912
* * Request Payload: N/A
1913
* * Response Payload: @ref mrq_oc_status_response
1914
*
1915
* @addtogroup OC_status
1916
* @{
1917
*/
1918
1919
#define OC_STATUS_MAX_SIZE 24U
1920
1921
/*
1922
* @brief Response to #MRQ_OC_STATUS
1923
*
1924
* throt_en: Value for each OC alarm where zero signifies throttle is
1925
* disabled, and non-zero throttle is enabled.
1926
* event_cnt: Total number of OC events for each OC alarm.
1927
*
1928
* mrq_response::err is 0 if the operation was successful and
1929
* -#BPMP_ENODEV otherwise.
1930
*/
1931
struct mrq_oc_status_response {
1932
uint8_t throt_en[OC_STATUS_MAX_SIZE];
1933
uint32_t event_cnt[OC_STATUS_MAX_SIZE];
1934
} BPMP_ABI_PACKED;
1935
1936
/** @} OC_status */
1937
/** @endcond bpmp_t234 */
1938
1939
/**
1940
* @ingroup MRQ_Codes
1941
* @def MRQ_CPU_VHINT
1942
* @brief Query CPU voltage hint data
1943
*
1944
* * Platforms: T186
1945
* @cond bpmp_t186
1946
* * Initiators: CCPLEX
1947
* * Targets: BPMP
1948
* * Request Payload: @ref mrq_cpu_vhint_request
1949
* * Response Payload: N/A
1950
*
1951
* @addtogroup Vhint
1952
* @{
1953
*/
1954
1955
/**
1956
* @brief Request with #MRQ_CPU_VHINT
1957
*
1958
* Used by #MRQ_CPU_VHINT call by CCPLEX to retrieve voltage hint data
1959
* from BPMP to memory space pointed by #addr. CCPLEX is responsible
1960
* to allocate sizeof(cpu_vhint_data) sized block of memory and
1961
* appropriately map it for BPMP before sending the request.
1962
*/
1963
struct mrq_cpu_vhint_request {
1964
/** @brief IOVA address for the #cpu_vhint_data */
1965
uint32_t addr;
1966
/** @brief ID of the cluster whose data is requested */
1967
uint32_t cluster_id;
1968
} BPMP_ABI_PACKED;
1969
1970
/**
1971
* @brief Description of the CPU v/f relation
1972
*
1973
* Used by #MRQ_CPU_VHINT call to carry data pointed by
1974
* #mrq_cpu_vhint_request::addr
1975
*/
1976
struct cpu_vhint_data {
1977
uint32_t ref_clk_hz; /**< reference frequency in Hz */
1978
uint16_t pdiv; /**< post divider value */
1979
uint16_t mdiv; /**< input divider value */
1980
uint16_t ndiv_max; /**< fMAX expressed with max NDIV value */
1981
/** table of ndiv values as a function of vINDEX (voltage index) */
1982
uint16_t ndiv[80];
1983
/** minimum allowed NDIV value */
1984
uint16_t ndiv_min;
1985
/** minimum allowed voltage hint value (as in vINDEX) */
1986
uint16_t vfloor;
1987
/** maximum allowed voltage hint value (as in vINDEX) */
1988
uint16_t vceil;
1989
/** post-multiplier for vindex value */
1990
uint16_t vindex_mult;
1991
/** post-divider for vindex value */
1992
uint16_t vindex_div;
1993
/** reserved for future use */
1994
uint16_t reserved[328];
1995
} BPMP_ABI_PACKED;
1996
1997
/** @} Vhint */
1998
/** @endcond bpmp_t186 */
1999
2000
/**
2001
* @ingroup MRQ_Codes
2002
* @def MRQ_ABI_RATCHET
2003
* @brief ABI ratchet value query
2004
*
2005
* * Platforms: T186, T194
2006
* * Initiators: Any
2007
* * Targets: BPMP
2008
* * Request Payload: @ref mrq_abi_ratchet_request
2009
* * Response Payload: @ref mrq_abi_ratchet_response
2010
* @addtogroup ABI_info
2011
* @{
2012
*/
2013
2014
/**
2015
* @brief An ABI compatibility mechanism
2016
*
2017
* BPMP_ABI_RATCHET_VALUE may increase for various reasons in a future
2018
* revision of this header file.
2019
* 1. That future revision deprecates some MRQ
2020
* 2. That future revision introduces a breaking change to an existing
2021
* MRQ or
2022
* 3. A bug is discovered in an existing implementation of the BPMP-FW
2023
* (or possibly one of its clients) which warrants deprecating that
2024
* implementation.
2025
*/
2026
#define BPMP_ABI_RATCHET_VALUE 3
2027
2028
/**
2029
* @brief Request with #MRQ_ABI_RATCHET.
2030
*
2031
* #ratchet should be #BPMP_ABI_RATCHET_VALUE from the ABI header
2032
* against which the requester was compiled.
2033
*
2034
* If ratchet is less than BPMP's #BPMP_ABI_RATCHET_VALUE, BPMP may
2035
* reply with mrq_response::err = -#BPMP_ERANGE to indicate that
2036
* BPMP-FW cannot interoperate correctly with the requester. Requester
2037
* should cease further communication with BPMP.
2038
*
2039
* Otherwise, err shall be 0.
2040
*/
2041
struct mrq_abi_ratchet_request {
2042
/** @brief Requester's ratchet value */
2043
uint16_t ratchet;
2044
};
2045
2046
/**
2047
* @brief Response to #MRQ_ABI_RATCHET
2048
*
2049
* #ratchet shall be #BPMP_ABI_RATCHET_VALUE from the ABI header
2050
* against which BPMP firwmare was compiled.
2051
*
2052
* If #ratchet is less than the requester's #BPMP_ABI_RATCHET_VALUE,
2053
* the requster must either interoperate with BPMP according to an ABI
2054
* header version with BPMP_ABI_RATCHET_VALUE = ratchet or cease
2055
* communication with BPMP.
2056
*
2057
* If mrq_response::err is 0 and ratchet is greater than or equal to the
2058
* requester's BPMP_ABI_RATCHET_VALUE, the requester should continue
2059
* normal operation.
2060
*/
2061
struct mrq_abi_ratchet_response {
2062
/** @brief BPMP's ratchet value */
2063
uint16_t ratchet;
2064
};
2065
2066
/** @} ABI_info */
2067
2068
/**
2069
* @ingroup MRQ_Codes
2070
* @def MRQ_EMC_DVFS_LATENCY
2071
* @brief Query frequency dependent EMC DVFS latency
2072
*
2073
* * Platforms: T186, T194, T234
2074
* * Initiators: CCPLEX
2075
* * Targets: BPMP
2076
* * Request Payload: N/A
2077
* * Response Payload: @ref mrq_emc_dvfs_latency_response
2078
* @addtogroup EMC
2079
* @{
2080
*/
2081
2082
/**
2083
* @brief Used by @ref mrq_emc_dvfs_latency_response
2084
*/
2085
struct emc_dvfs_latency {
2086
/** @brief EMC DVFS node frequency in kHz */
2087
uint32_t freq;
2088
/** @brief EMC DVFS latency in nanoseconds */
2089
uint32_t latency;
2090
} BPMP_ABI_PACKED;
2091
2092
#define EMC_DVFS_LATENCY_MAX_SIZE 14
2093
/**
2094
* @brief Response to #MRQ_EMC_DVFS_LATENCY
2095
*/
2096
struct mrq_emc_dvfs_latency_response {
2097
/** @brief The number valid entries in #pairs */
2098
uint32_t num_pairs;
2099
/** @brief EMC DVFS node <frequency, latency> information */
2100
struct emc_dvfs_latency pairs[EMC_DVFS_LATENCY_MAX_SIZE];
2101
} BPMP_ABI_PACKED;
2102
2103
/** @} EMC */
2104
2105
/**
2106
* @ingroup MRQ_Codes
2107
* @def MRQ_EMC_DVFS_EMCHUB
2108
* @brief Query EMC HUB frequencies
2109
*
2110
* * Platforms: T234 onwards
2111
* @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
2112
* * Initiators: CCPLEX
2113
* * Targets: BPMP
2114
* * Request Payload: N/A
2115
* * Response Payload: @ref mrq_emc_dvfs_emchub_response
2116
* @addtogroup EMC
2117
* @{
2118
*/
2119
2120
/**
2121
* @brief Used by @ref mrq_emc_dvfs_emchub_response
2122
*/
2123
struct emc_dvfs_emchub {
2124
/** @brief EMC DVFS node frequency in kHz */
2125
uint32_t freq;
2126
/** @brief EMC HUB frequency in kHz */
2127
uint32_t hub_freq;
2128
} BPMP_ABI_PACKED;
2129
2130
#define EMC_DVFS_EMCHUB_MAX_SIZE EMC_DVFS_LATENCY_MAX_SIZE
2131
/**
2132
* @brief Response to #MRQ_EMC_DVFS_EMCHUB
2133
*/
2134
struct mrq_emc_dvfs_emchub_response {
2135
/** @brief The number valid entries in #pairs */
2136
uint32_t num_pairs;
2137
/** @brief EMC DVFS node <frequency, hub frequency> information */
2138
struct emc_dvfs_emchub pairs[EMC_DVFS_EMCHUB_MAX_SIZE];
2139
} BPMP_ABI_PACKED;
2140
2141
/** @} EMC */
2142
/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
2143
2144
/**
2145
* @ingroup MRQ_Codes
2146
* @def MRQ_EMC_DISP_RFL
2147
* @brief Set EMC display RFL handshake mode of operations
2148
*
2149
* * Platforms: T234 onwards
2150
* @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
2151
* * Initiators: CCPLEX
2152
* * Targets: BPMP
2153
* * Request Payload: @ref mrq_emc_disp_rfl_request
2154
* * Response Payload: N/A
2155
*
2156
* @addtogroup EMC
2157
* @{
2158
*/
2159
2160
enum mrq_emc_disp_rfl_mode {
2161
/** @brief EMC display RFL handshake disabled */
2162
EMC_DISP_RFL_MODE_DISABLED = 0,
2163
/** @brief EMC display RFL handshake enabled */
2164
EMC_DISP_RFL_MODE_ENABLED = 1,
2165
};
2166
2167
/**
2168
* @ingroup EMC
2169
* @brief Request with #MRQ_EMC_DISP_RFL
2170
*
2171
* Used by the sender of an #MRQ_EMC_DISP_RFL message to
2172
* request the mode of EMC display RFL handshake.
2173
*
2174
* mrq_response::err is
2175
* * 0: RFL mode is set successfully
2176
* * -#BPMP_EINVAL: invalid mode requested
2177
* * -#BPMP_ENOSYS: RFL handshake is not supported
2178
* * -#BPMP_EACCES: Permission denied
2179
* * -#BPMP_ENODEV: if disp rfl mrq is not supported by BPMP-FW
2180
*/
2181
struct mrq_emc_disp_rfl_request {
2182
/** @brief EMC display RFL mode (@ref mrq_emc_disp_rfl_mode) */
2183
uint32_t mode;
2184
} BPMP_ABI_PACKED;
2185
2186
/** @} EMC */
2187
/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
2188
2189
/**
2190
* @ingroup MRQ_Codes
2191
* @def MRQ_BWMGR
2192
* @brief bwmgr requests
2193
*
2194
* * Platforms: T234 onwards
2195
* @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
2196
* * Initiators: CCPLEX
2197
* * Targets: BPMP
2198
* * Request Payload: @ref mrq_bwmgr_request
2199
* * Response Payload: @ref mrq_bwmgr_response
2200
*
2201
* @addtogroup BWMGR
2202
*
2203
* @{
2204
*/
2205
2206
enum mrq_bwmgr_cmd {
2207
/**
2208
* @brief Check whether the BPMP driver supports the specified
2209
* request type
2210
*
2211
* mrq_response::err is 0 if the specified request is
2212
* supported and -#BPMP_ENODEV otherwise.
2213
*/
2214
CMD_BWMGR_QUERY_ABI = 0,
2215
2216
/**
2217
* @brief Determine dram rate to satisfy iso/niso bw requests
2218
*
2219
* mrq_response::err is
2220
* * 0: calc_rate succeeded.
2221
* * -#BPMP_EINVAL: Invalid request parameters.
2222
* * -#BPMP_ENOTSUP: Requested bw is not available.
2223
*/
2224
CMD_BWMGR_CALC_RATE = 1
2225
};
2226
2227
/*
2228
* request data for request type CMD_BWMGR_QUERY_ABI
2229
*
2230
* type: Request type for which to check existence.
2231
*/
2232
struct cmd_bwmgr_query_abi_request {
2233
uint32_t type;
2234
} BPMP_ABI_PACKED;
2235
2236
/**
2237
* @brief Used by @ref cmd_bwmgr_calc_rate_request
2238
*/
2239
struct iso_req {
2240
/* @brief bwmgr client ID @ref bpmp_bwmgr_ids */
2241
uint32_t id;
2242
/* @brief bw in kBps requested by client */
2243
uint32_t iso_bw;
2244
} BPMP_ABI_PACKED;
2245
2246
#define MAX_ISO_CLIENTS 13U
2247
/*
2248
* request data for request type CMD_BWMGR_CALC_RATE
2249
*/
2250
struct cmd_bwmgr_calc_rate_request {
2251
/* @brief total bw in kBps requested by all niso clients */
2252
uint32_t sum_niso_bw;
2253
/* @brief The number of iso clients */
2254
uint32_t num_iso_clients;
2255
/* @brief iso_req <id, iso_bw> information */
2256
struct iso_req isobw_reqs[MAX_ISO_CLIENTS];
2257
} BPMP_ABI_PACKED;
2258
2259
/*
2260
* response data for request type CMD_BWMGR_CALC_RATE
2261
*
2262
* iso_rate_min: min dram data clk rate in kHz to satisfy all iso bw reqs
2263
* total_rate_min: min dram data clk rate in kHz to satisfy all bw reqs
2264
*/
2265
struct cmd_bwmgr_calc_rate_response {
2266
uint32_t iso_rate_min;
2267
uint32_t total_rate_min;
2268
} BPMP_ABI_PACKED;
2269
2270
/*
2271
* @brief Request with #MRQ_BWMGR
2272
*
2273
*
2274
* |sub-command |payload |
2275
* |----------------------------|------------------------------|
2276
* |CMD_BWMGR_QUERY_ABI | cmd_bwmgr_query_abi_request |
2277
* |CMD_BWMGR_CALC_RATE | cmd_bwmgr_calc_rate_request |
2278
*
2279
*/
2280
struct mrq_bwmgr_request {
2281
uint32_t cmd;
2282
union {
2283
struct cmd_bwmgr_query_abi_request query_abi;
2284
struct cmd_bwmgr_calc_rate_request bwmgr_rate_req;
2285
} BPMP_UNION_ANON;
2286
} BPMP_ABI_PACKED;
2287
2288
/*
2289
* @brief Response to MRQ_BWMGR
2290
*
2291
* |sub-command |payload |
2292
* |----------------------------|------------------------------|
2293
* |CMD_BWMGR_CALC_RATE | cmd_bwmgr_calc_rate_response |
2294
*/
2295
struct mrq_bwmgr_response {
2296
union {
2297
struct cmd_bwmgr_calc_rate_response bwmgr_rate_resp;
2298
} BPMP_UNION_ANON;
2299
} BPMP_ABI_PACKED;
2300
2301
/** @} BWMGR */
2302
/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
2303
2304
/**
2305
* @ingroup MRQ_Codes
2306
* @def MRQ_BWMGR_INT
2307
* @brief bpmp-integrated bwmgr requests
2308
*
2309
* * Platforms: T234 onwards
2310
* @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
2311
* * Initiators: CCPLEX
2312
* * Targets: BPMP
2313
* * Request Payload: @ref mrq_bwmgr_int_request
2314
* * Response Payload: @ref mrq_bwmgr_int_response
2315
*
2316
* @addtogroup BWMGR_INT
2317
* @{
2318
*/
2319
2320
enum mrq_bwmgr_int_cmd {
2321
/**
2322
* @brief Check whether the BPMP-FW supports the specified
2323
* request type
2324
*
2325
* mrq_response::err is 0 if the specified request is
2326
* supported and -#BPMP_ENODEV otherwise.
2327
*/
2328
CMD_BWMGR_INT_QUERY_ABI = 1,
2329
2330
/**
2331
* @brief Determine and set dram rate to satisfy iso/niso bw request
2332
*
2333
* mrq_response::err is
2334
* * 0: request succeeded.
2335
* * -#BPMP_EINVAL: Invalid request parameters.
2336
* set_frequency in @ref cmd_bwmgr_int_calc_and_set_response
2337
* will not be set.
2338
* * -#BPMP_ENOTSUP: Requested bw is not available.
2339
* set_frequency in @ref cmd_bwmgr_int_calc_and_set_response
2340
* will be current dram-clk rate.
2341
*/
2342
CMD_BWMGR_INT_CALC_AND_SET = 2,
2343
2344
/**
2345
* @brief Set a max DRAM frequency for the bandwidth-manager
2346
*
2347
* mrq_response::err is
2348
* * 0: request succeeded.
2349
* * -#BPMP_ENOTSUP: Requested cap frequency is not possible.
2350
*/
2351
CMD_BWMGR_INT_CAP_SET = 3
2352
};
2353
2354
/*
2355
* request structure for request type CMD_BWMGR_QUERY_ABI
2356
*
2357
* type: Request type for which to check existence.
2358
*/
2359
struct cmd_bwmgr_int_query_abi_request {
2360
/* @brief request type determined by @ref mrq_bwmgr_int_cmd */
2361
uint32_t type;
2362
} BPMP_ABI_PACKED;
2363
2364
/**
2365
* @defgroup bwmgr_int_unit_type BWMGR_INT floor unit-types
2366
* @addtogroup bwmgr_int_unit_type
2367
* @{
2368
*/
2369
/** @brief kilobytes per second unit-type */
2370
#define BWMGR_INT_UNIT_KBPS 0U
2371
/** @brief kilohertz unit-type */
2372
#define BWMGR_INT_UNIT_KHZ 1U
2373
2374
/** @} bwmgr_int_unit_type */
2375
2376
/*
2377
* request data for request type CMD_BWMGR_INT_CALC_AND_SET
2378
*/
2379
struct cmd_bwmgr_int_calc_and_set_request {
2380
/* @brief bwmgr client ID @ref bpmp_bwmgr_ids */
2381
uint32_t client_id;
2382
/* @brief average niso bw usage in kBps requested by client. */
2383
uint32_t niso_bw;
2384
/*
2385
* @brief average iso bw usage in kBps requested by client.
2386
* Value is ignored if client is niso. Determined by client_id.
2387
*/
2388
uint32_t iso_bw;
2389
/*
2390
* @brief memory clock floor requested by client.
2391
* Unit determined by floor_unit.
2392
*/
2393
uint32_t mc_floor;
2394
/*
2395
* @brief toggle to determine the unit-type of floor value.
2396
* See @ref bwmgr_int_unit_type definitions for unit-type mappings.
2397
*/
2398
uint8_t floor_unit;
2399
} BPMP_ABI_PACKED;
2400
2401
struct cmd_bwmgr_int_cap_set_request {
2402
/* @brief requested cap frequency in Hz. */
2403
uint64_t rate;
2404
} BPMP_ABI_PACKED;
2405
2406
/*
2407
* response data for request type CMD_BWMGR_CALC_AND_SET
2408
*/
2409
struct cmd_bwmgr_int_calc_and_set_response {
2410
/* @brief current set memory clock frequency in Hz */
2411
uint64_t rate;
2412
} BPMP_ABI_PACKED;
2413
2414
/*
2415
* @brief Request with #MRQ_BWMGR_INT
2416
*
2417
*
2418
* |sub-command |payload |
2419
* |----------------------------|-----------------------------------|
2420
* |CMD_BWMGR_INT_QUERY_ABI | cmd_bwmgr_int_query_abi_request |
2421
* |CMD_BWMGR_INT_CALC_AND_SET | cmd_bwmgr_int_calc_and_set_request|
2422
* |CMD_BWMGR_INT_CAP_SET | cmd_bwmgr_int_cap_set_request |
2423
*
2424
*/
2425
struct mrq_bwmgr_int_request {
2426
uint32_t cmd;
2427
union {
2428
struct cmd_bwmgr_int_query_abi_request query_abi;
2429
struct cmd_bwmgr_int_calc_and_set_request bwmgr_calc_set_req;
2430
struct cmd_bwmgr_int_cap_set_request bwmgr_cap_set_req;
2431
} BPMP_UNION_ANON;
2432
} BPMP_ABI_PACKED;
2433
2434
/*
2435
* @brief Response to MRQ_BWMGR_INT
2436
*
2437
* |sub-command |payload |
2438
* |----------------------------|---------------------------------------|
2439
* |CMD_BWMGR_INT_CALC_AND_SET | cmd_bwmgr_int_calc_and_set_response |
2440
*/
2441
struct mrq_bwmgr_int_response {
2442
union {
2443
struct cmd_bwmgr_int_calc_and_set_response bwmgr_calc_set_resp;
2444
} BPMP_UNION_ANON;
2445
} BPMP_ABI_PACKED;
2446
2447
/** @} BWMGR_INT */
2448
/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
2449
2450
/**
2451
* @ingroup MRQ_Codes
2452
* @def MRQ_ISO_CLIENT
2453
* @brief ISO client requests
2454
*
2455
* * Platforms: T234 onwards
2456
* @cond (bpmp_t234 || bpmp_t239 || bpmp_th500)
2457
* * Initiators: CCPLEX
2458
* * Targets: BPMP
2459
* * Request Payload: @ref mrq_iso_client_request
2460
* * Response Payload: @ref mrq_iso_client_response
2461
*
2462
* @addtogroup ISO_CLIENT
2463
* @{
2464
*/
2465
2466
enum mrq_iso_client_cmd {
2467
/**
2468
* @brief Check whether the BPMP driver supports the specified
2469
* request type
2470
*
2471
* mrq_response::err is 0 if the specified request is
2472
* supported and -#BPMP_ENODEV otherwise.
2473
*/
2474
CMD_ISO_CLIENT_QUERY_ABI = 0,
2475
2476
/*
2477
* @brief check for legal LA for the iso client. Without programming
2478
* LA MC registers, calculate and ensure that legal LA is possible for
2479
* iso bw requested by the ISO client.
2480
*
2481
* mrq_response::err is
2482
* * 0: check la succeeded.
2483
* * -#BPMP_EINVAL: Invalid request parameters.
2484
* * -#BPMP_EFAULT: Legal LA is not possible for client requested iso_bw
2485
*/
2486
CMD_ISO_CLIENT_CALCULATE_LA = 1,
2487
2488
/*
2489
* @brief set LA for the iso client. Calculate and program the LA/PTSA
2490
* MC registers corresponding to the client making bw request
2491
*
2492
* mrq_response::err is
2493
* * 0: set la succeeded.
2494
* * -#BPMP_EINVAL: Invalid request parameters.
2495
* * -#BPMP_EFAULT: Failed to calculate or program MC registers.
2496
*/
2497
CMD_ISO_CLIENT_SET_LA = 2,
2498
2499
/*
2500
* @brief Get max possible bw for iso client
2501
*
2502
* mrq_response::err is
2503
* * 0: get_max_bw succeeded.
2504
* * -#BPMP_EINVAL: Invalid request parameters.
2505
*/
2506
CMD_ISO_CLIENT_GET_MAX_BW = 3
2507
};
2508
2509
/*
2510
* request data for request type CMD_ISO_CLIENT_QUERY_ABI
2511
*
2512
* type: Request type for which to check existence.
2513
*/
2514
struct cmd_iso_client_query_abi_request {
2515
uint32_t type;
2516
} BPMP_ABI_PACKED;
2517
2518
/*
2519
* request data for request type CMD_ISO_CLIENT_CALCULATE_LA
2520
*
2521
* id: client ID in @ref bpmp_bwmgr_ids
2522
* bw: bw requested in kBps by client ID.
2523
* init_bw_floor: initial dram_bw_floor in kBps passed by client ID.
2524
* ISO client will perform mempool allocation and DVFS buffering based
2525
* on this dram_bw_floor.
2526
*/
2527
struct cmd_iso_client_calculate_la_request {
2528
uint32_t id;
2529
uint32_t bw;
2530
uint32_t init_bw_floor;
2531
} BPMP_ABI_PACKED;
2532
2533
/*
2534
* request data for request type CMD_ISO_CLIENT_SET_LA
2535
*
2536
* id: client ID in @ref bpmp_bwmgr_ids
2537
* bw: bw requested in kBps by client ID.
2538
* final_bw_floor: final dram_bw_floor in kBps.
2539
* Sometimes the initial dram_bw_floor passed by ISO client may need to be
2540
* updated by considering higher dram freq's. This is the final dram_bw_floor
2541
* used to calculate and program MC registers.
2542
*/
2543
struct cmd_iso_client_set_la_request {
2544
uint32_t id;
2545
uint32_t bw;
2546
uint32_t final_bw_floor;
2547
} BPMP_ABI_PACKED;
2548
2549
/*
2550
* request data for request type CMD_ISO_CLIENT_GET_MAX_BW
2551
*
2552
* id: client ID in @ref bpmp_bwmgr_ids
2553
*/
2554
struct cmd_iso_client_get_max_bw_request {
2555
uint32_t id;
2556
} BPMP_ABI_PACKED;
2557
2558
/*
2559
* response data for request type CMD_ISO_CLIENT_CALCULATE_LA
2560
*
2561
* la_rate_floor: minimum dram_rate_floor in kHz at which a legal la is possible
2562
* iso_client_only_rate: Minimum dram freq in kHz required to satisfy this clients
2563
* iso bw request, assuming all other iso clients are inactive
2564
*/
2565
struct cmd_iso_client_calculate_la_response {
2566
uint32_t la_rate_floor;
2567
uint32_t iso_client_only_rate;
2568
} BPMP_ABI_PACKED;
2569
2570
/**
2571
* @brief Used by @ref cmd_iso_client_get_max_bw_response
2572
*/
2573
struct iso_max_bw {
2574
/* @brief dram frequency in kHz */
2575
uint32_t freq;
2576
/* @brief max possible iso-bw in kBps */
2577
uint32_t iso_bw;
2578
} BPMP_ABI_PACKED;
2579
2580
#define ISO_MAX_BW_MAX_SIZE 14U
2581
/*
2582
* response data for request type CMD_ISO_CLIENT_GET_MAX_BW
2583
*/
2584
struct cmd_iso_client_get_max_bw_response {
2585
/* @brief The number valid entries in iso_max_bw pairs */
2586
uint32_t num_pairs;
2587
/* @brief max ISOBW <dram freq, max bw> information */
2588
struct iso_max_bw pairs[ISO_MAX_BW_MAX_SIZE];
2589
} BPMP_ABI_PACKED;
2590
2591
/**
2592
* @brief Request with #MRQ_ISO_CLIENT
2593
*
2594
* Used by the sender of an #MRQ_ISO_CLIENT message.
2595
*
2596
* |sub-command |payload |
2597
* |------------------------------------ |----------------------------------------|
2598
* |CMD_ISO_CLIENT_QUERY_ABI |cmd_iso_client_query_abi_request |
2599
* |CMD_ISO_CLIENT_CALCULATE_LA |cmd_iso_client_calculate_la_request |
2600
* |CMD_ISO_CLIENT_SET_LA |cmd_iso_client_set_la_request |
2601
* |CMD_ISO_CLIENT_GET_MAX_BW |cmd_iso_client_get_max_bw_request |
2602
*
2603
*/
2604
2605
struct mrq_iso_client_request {
2606
/* Type of request. Values listed in enum mrq_iso_client_cmd */
2607
uint32_t cmd;
2608
union {
2609
struct cmd_iso_client_query_abi_request query_abi;
2610
struct cmd_iso_client_calculate_la_request calculate_la_req;
2611
struct cmd_iso_client_set_la_request set_la_req;
2612
struct cmd_iso_client_get_max_bw_request max_isobw_req;
2613
} BPMP_UNION_ANON;
2614
} BPMP_ABI_PACKED;
2615
2616
/**
2617
* @brief Response to MRQ_ISO_CLIENT
2618
*
2619
* Each sub-command supported by @ref mrq_iso_client_request may return
2620
* sub-command-specific data. Some do and some do not as indicated in
2621
* the following table
2622
*
2623
* |sub-command |payload |
2624
* |---------------------------- |------------------------------------|
2625
* |CMD_ISO_CLIENT_CALCULATE_LA |cmd_iso_client_calculate_la_response|
2626
* |CMD_ISO_CLIENT_SET_LA |N/A |
2627
* |CMD_ISO_CLIENT_GET_MAX_BW |cmd_iso_client_get_max_bw_response |
2628
*
2629
*/
2630
2631
struct mrq_iso_client_response {
2632
union {
2633
struct cmd_iso_client_calculate_la_response calculate_la_resp;
2634
struct cmd_iso_client_get_max_bw_response max_isobw_resp;
2635
} BPMP_UNION_ANON;
2636
} BPMP_ABI_PACKED;
2637
2638
/** @} ISO_CLIENT */
2639
/** @endcond (bpmp_t234 || bpmp_t239 || bpmp_th500) */
2640
2641
/**
2642
* @ingroup MRQ_Codes
2643
* @def MRQ_CPU_NDIV_LIMITS
2644
* @brief CPU freq. limits in ndiv
2645
*
2646
* * Platforms: T194 onwards
2647
* @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
2648
* * Initiators: CCPLEX
2649
* * Targets: BPMP
2650
* * Request Payload: @ref mrq_cpu_ndiv_limits_request
2651
* * Response Payload: @ref mrq_cpu_ndiv_limits_response
2652
* @addtogroup CPU
2653
* @{
2654
*/
2655
2656
/**
2657
* @brief Request for ndiv limits of a cluster
2658
*/
2659
struct mrq_cpu_ndiv_limits_request {
2660
/** @brief Enum cluster_id */
2661
uint32_t cluster_id;
2662
} BPMP_ABI_PACKED;
2663
2664
/**
2665
* @brief Response to #MRQ_CPU_NDIV_LIMITS
2666
*/
2667
struct mrq_cpu_ndiv_limits_response {
2668
/** @brief Reference frequency in Hz */
2669
uint32_t ref_clk_hz;
2670
/** @brief Post divider value */
2671
uint16_t pdiv;
2672
/** @brief Input divider value */
2673
uint16_t mdiv;
2674
/** @brief FMAX expressed with max NDIV value */
2675
uint16_t ndiv_max;
2676
/** @brief Minimum allowed NDIV value */
2677
uint16_t ndiv_min;
2678
} BPMP_ABI_PACKED;
2679
2680
/** @} CPU */
2681
/** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */
2682
2683
/**
2684
* @ingroup MRQ_Codes
2685
* @def MRQ_CPU_AUTO_CC3
2686
* @brief Query CPU cluster auto-CC3 configuration
2687
*
2688
* * Platforms: T194
2689
* @cond bpmp_t194
2690
* * Initiators: CCPLEX
2691
* * Targets: BPMP
2692
* * Request Payload: @ref mrq_cpu_auto_cc3_request
2693
* * Response Payload: @ref mrq_cpu_auto_cc3_response
2694
* @addtogroup CC3
2695
*
2696
* Queries from BPMP auto-CC3 configuration (allowed/not allowed) for a
2697
* specified cluster. CCPLEX s/w uses this information to override its own
2698
* device tree auto-CC3 settings, so that BPMP device tree is a single source of
2699
* auto-CC3 platform configuration.
2700
*
2701
* @{
2702
*/
2703
2704
/**
2705
* @brief Request for auto-CC3 configuration of a cluster
2706
*/
2707
struct mrq_cpu_auto_cc3_request {
2708
/** @brief Enum cluster_id (logical cluster id, known to CCPLEX s/w) */
2709
uint32_t cluster_id;
2710
} BPMP_ABI_PACKED;
2711
2712
/**
2713
* @brief Response to #MRQ_CPU_AUTO_CC3
2714
*/
2715
struct mrq_cpu_auto_cc3_response {
2716
/**
2717
* @brief auto-CC3 configuration
2718
*
2719
* - bits[31..10] reserved.
2720
* - bits[9..1] cc3 ndiv
2721
* - bit [0] if "1" auto-CC3 is allowed, if "0" auto-CC3 is not allowed
2722
*/
2723
uint32_t auto_cc3_config;
2724
} BPMP_ABI_PACKED;
2725
2726
/** @} CC3 */
2727
/** @endcond bpmp_t194 */
2728
2729
/**
2730
* @ingroup MRQ_Codes
2731
* @def MRQ_RINGBUF_CONSOLE
2732
* @brief A ring buffer debug console for BPMP
2733
* @addtogroup RingbufConsole
2734
*
2735
* The ring buffer debug console aims to be a substitute for the UART debug
2736
* console. The debug console is implemented with two ring buffers in the
2737
* BPMP-FW, the RX (receive) and TX (transmit) buffers. Characters can be read
2738
* and written to the buffers by the host via the MRQ interface.
2739
*
2740
* @{
2741
*/
2742
2743
/**
2744
* @brief Maximum number of bytes transferred in a single write command to the
2745
* BPMP
2746
*
2747
* This is determined by the number of free bytes in the message struct,
2748
* rounded down to a multiple of four.
2749
*/
2750
#define MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN 112
2751
2752
/**
2753
* @brief Maximum number of bytes transferred in a single read command to the
2754
* BPMP
2755
*
2756
* This is determined by the number of free bytes in the message struct,
2757
* rounded down to a multiple of four.
2758
*/
2759
#define MRQ_RINGBUF_CONSOLE_MAX_READ_LEN 116
2760
2761
enum mrq_ringbuf_console_host_to_bpmp_cmd {
2762
/**
2763
* @brief Check whether the BPMP driver supports the specified request
2764
* type
2765
*
2766
* mrq_response::err is 0 if the specified request is supported and
2767
* -#BPMP_ENODEV otherwise
2768
*/
2769
CMD_RINGBUF_CONSOLE_QUERY_ABI = 0,
2770
/**
2771
* @brief Perform a read operation on the BPMP TX buffer
2772
*
2773
* mrq_response::err is 0
2774
*/
2775
CMD_RINGBUF_CONSOLE_READ = 1,
2776
/**
2777
* @brief Perform a write operation on the BPMP RX buffer
2778
*
2779
* mrq_response::err is 0 if the operation was successful and
2780
* -#BPMP_ENODEV otherwise
2781
*/
2782
CMD_RINGBUF_CONSOLE_WRITE = 2,
2783
/**
2784
* @brief Get the length of the buffer and the physical addresses of
2785
* the buffer data and the head and tail counters
2786
*
2787
* mrq_response::err is 0 if the operation was successful and
2788
* -#BPMP_ENODEV otherwise
2789
*/
2790
CMD_RINGBUF_CONSOLE_GET_FIFO = 3,
2791
};
2792
2793
/**
2794
* @ingroup RingbufConsole
2795
* @brief Host->BPMP request data for request type
2796
* #CMD_RINGBUF_CONSOLE_QUERY_ABI
2797
*/
2798
struct cmd_ringbuf_console_query_abi_req {
2799
/** @brief Command identifier to be queried */
2800
uint32_t cmd;
2801
} BPMP_ABI_PACKED;
2802
2803
/** @private */
2804
struct cmd_ringbuf_console_query_abi_resp {
2805
BPMP_ABI_EMPTY
2806
} BPMP_ABI_PACKED;
2807
2808
/**
2809
* @ingroup RingbufConsole
2810
* @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_READ
2811
*/
2812
struct cmd_ringbuf_console_read_req {
2813
/**
2814
* @brief Number of bytes requested to be read from the BPMP TX buffer
2815
*/
2816
uint8_t len;
2817
} BPMP_ABI_PACKED;
2818
2819
/**
2820
* @ingroup RingbufConsole
2821
* @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_READ
2822
*/
2823
struct cmd_ringbuf_console_read_resp {
2824
/** @brief The actual data read from the BPMP TX buffer */
2825
uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_READ_LEN];
2826
/** @brief Number of bytes in cmd_ringbuf_console_read_resp::data */
2827
uint8_t len;
2828
} BPMP_ABI_PACKED;
2829
2830
/**
2831
* @ingroup RingbufConsole
2832
* @brief Host->BPMP request data for request type #CMD_RINGBUF_CONSOLE_WRITE
2833
*/
2834
struct cmd_ringbuf_console_write_req {
2835
/** @brief The actual data to be written to the BPMP RX buffer */
2836
uint8_t data[MRQ_RINGBUF_CONSOLE_MAX_WRITE_LEN];
2837
/** @brief Number of bytes in cmd_ringbuf_console_write_req::data */
2838
uint8_t len;
2839
} BPMP_ABI_PACKED;
2840
2841
/**
2842
* @ingroup RingbufConsole
2843
* @brief BPMP->Host response data for request type #CMD_RINGBUF_CONSOLE_WRITE
2844
*/
2845
struct cmd_ringbuf_console_write_resp {
2846
/** @brief Number of bytes of available space in the BPMP RX buffer */
2847
uint32_t space_avail;
2848
/** @brief Number of bytes that were written to the BPMP RX buffer */
2849
uint8_t len;
2850
} BPMP_ABI_PACKED;
2851
2852
/** @private */
2853
struct cmd_ringbuf_console_get_fifo_req {
2854
BPMP_ABI_EMPTY
2855
} BPMP_ABI_PACKED;
2856
2857
/**
2858
* @ingroup RingbufConsole
2859
* @brief BPMP->Host reply data for request type #CMD_RINGBUF_CONSOLE_GET_FIFO
2860
*/
2861
struct cmd_ringbuf_console_get_fifo_resp {
2862
/** @brief Physical address of the BPMP TX buffer */
2863
uint64_t bpmp_tx_buf_addr;
2864
/** @brief Physical address of the BPMP TX buffer head counter */
2865
uint64_t bpmp_tx_head_addr;
2866
/** @brief Physical address of the BPMP TX buffer tail counter */
2867
uint64_t bpmp_tx_tail_addr;
2868
/** @brief Length of the BPMP TX buffer */
2869
uint32_t bpmp_tx_buf_len;
2870
} BPMP_ABI_PACKED;
2871
2872
/**
2873
* @ingroup RingbufConsole
2874
* @brief Host->BPMP request data.
2875
*
2876
* Reply type is union #mrq_ringbuf_console_bpmp_to_host_response .
2877
*/
2878
struct mrq_ringbuf_console_host_to_bpmp_request {
2879
/**
2880
* @brief Type of request. Values listed in enum
2881
* #mrq_ringbuf_console_host_to_bpmp_cmd.
2882
*/
2883
uint32_t type;
2884
/** @brief request type specific parameters. */
2885
union {
2886
struct cmd_ringbuf_console_query_abi_req query_abi;
2887
struct cmd_ringbuf_console_read_req read;
2888
struct cmd_ringbuf_console_write_req write;
2889
struct cmd_ringbuf_console_get_fifo_req get_fifo;
2890
} BPMP_UNION_ANON;
2891
} BPMP_ABI_PACKED;
2892
2893
/**
2894
* @ingroup RingbufConsole
2895
* @brief Host->BPMP reply data
2896
*
2897
* In response to struct #mrq_ringbuf_console_host_to_bpmp_request.
2898
*/
2899
union mrq_ringbuf_console_bpmp_to_host_response {
2900
struct cmd_ringbuf_console_query_abi_resp query_abi;
2901
struct cmd_ringbuf_console_read_resp read;
2902
struct cmd_ringbuf_console_write_resp write;
2903
struct cmd_ringbuf_console_get_fifo_resp get_fifo;
2904
} BPMP_ABI_PACKED;
2905
2906
/** @} RingbufConsole */
2907
2908
/**
2909
* @ingroup MRQ_Codes
2910
* @def MRQ_STRAP
2911
* @brief Set a strap value controlled by BPMP
2912
*
2913
* * Platforms: T194 onwards
2914
* @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
2915
* * Initiators: CCPLEX
2916
* * Targets: BPMP
2917
* * Request Payload: @ref mrq_strap_request
2918
* * Response Payload: N/A
2919
* @addtogroup Strap
2920
*
2921
* A strap is an input that is sampled by a hardware unit during the
2922
* unit's startup process. The sampled value of a strap affects the
2923
* behavior of the unit until the unit is restarted. Many hardware
2924
* units sample their straps at the instant that their resets are
2925
* deasserted.
2926
*
2927
* BPMP owns registers which act as straps to various units. It
2928
* exposes limited control of those straps via #MRQ_STRAP.
2929
*
2930
* @{
2931
*/
2932
enum mrq_strap_cmd {
2933
/** @private */
2934
STRAP_RESERVED = 0,
2935
/** @brief Set a strap value */
2936
STRAP_SET = 1
2937
};
2938
2939
/**
2940
* @brief Request with #MRQ_STRAP
2941
*/
2942
struct mrq_strap_request {
2943
/** @brief @ref mrq_strap_cmd */
2944
uint32_t cmd;
2945
/** @brief Strap ID from @ref Strap_Identifiers */
2946
uint32_t id;
2947
/** @brief Desired value for strap (if cmd is #STRAP_SET) */
2948
uint32_t value;
2949
} BPMP_ABI_PACKED;
2950
2951
/** @} Strap */
2952
/** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */
2953
2954
/**
2955
* @ingroup MRQ_Codes
2956
* @def MRQ_UPHY
2957
* @brief Perform a UPHY operation
2958
*
2959
* * Platforms: T194 onwards
2960
* @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
2961
* * Initiators: CCPLEX
2962
* * Targets: BPMP
2963
* * Request Payload: @ref mrq_uphy_request
2964
* * Response Payload: @ref mrq_uphy_response
2965
*
2966
* @addtogroup UPHY
2967
* @{
2968
*/
2969
enum {
2970
CMD_UPHY_PCIE_LANE_MARGIN_CONTROL = 1,
2971
CMD_UPHY_PCIE_LANE_MARGIN_STATUS = 2,
2972
CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT = 3,
2973
CMD_UPHY_PCIE_CONTROLLER_STATE = 4,
2974
CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF = 5,
2975
CMD_UPHY_DISPLAY_PORT_INIT = 6,
2976
CMD_UPHY_DISPLAY_PORT_OFF = 7,
2977
CMD_UPHY_XUSB_DYN_LANES_RESTORE = 8,
2978
CMD_UPHY_MAX,
2979
};
2980
2981
struct cmd_uphy_margin_control_request {
2982
/** @brief Enable margin */
2983
int32_t en;
2984
/** @brief Clear the number of error and sections */
2985
int32_t clr;
2986
/** @brief Set x offset (1's complement) for left/right margin type (y should be 0) */
2987
uint32_t x;
2988
/** @brief Set y offset (1's complement) for left/right margin type (x should be 0) */
2989
uint32_t y;
2990
/** @brief Set number of bit blocks for each margin section */
2991
uint32_t nblks;
2992
} BPMP_ABI_PACKED;
2993
2994
struct cmd_uphy_margin_status_response {
2995
/** @brief Number of errors observed */
2996
uint32_t status;
2997
} BPMP_ABI_PACKED;
2998
2999
struct cmd_uphy_ep_controller_pll_init_request {
3000
/** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */
3001
uint8_t ep_controller;
3002
} BPMP_ABI_PACKED;
3003
3004
struct cmd_uphy_pcie_controller_state_request {
3005
/** @brief PCIE controller number, T194 valid: 0-4; T234 valid: 0-10; T239 valid: 0-3 */
3006
uint8_t pcie_controller;
3007
uint8_t enable;
3008
} BPMP_ABI_PACKED;
3009
3010
struct cmd_uphy_ep_controller_pll_off_request {
3011
/** @brief EP controller number, T194 valid: 0, 4, 5; T234 valid: 5, 6, 7, 10; T239 valid: 0 */
3012
uint8_t ep_controller;
3013
} BPMP_ABI_PACKED;
3014
3015
struct cmd_uphy_display_port_init_request {
3016
/** @brief DisplayPort link rate, T239 valid: 1620, 2700, 5400, 8100, 2160, 2430, 3240, 4320, 6750 */
3017
uint16_t link_rate;
3018
/** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */
3019
uint16_t lanes_bitmap;
3020
} BPMP_ABI_PACKED;
3021
3022
struct cmd_uphy_xusb_dyn_lanes_restore_request {
3023
/** @brief 1: lane 0; 2: lane 1; 3: lane 0 and 1 */
3024
uint16_t lanes_bitmap;
3025
} BPMP_ABI_PACKED;
3026
3027
/**
3028
* @ingroup UPHY
3029
* @brief Request with #MRQ_UPHY
3030
*
3031
* Used by the sender of an #MRQ_UPHY message to control UPHY.
3032
* The uphy_request is split into several sub-commands. CMD_UPHY_PCIE_LANE_MARGIN_STATUS
3033
* requires no additional data. Others have a sub-command specific payload. Below table
3034
* shows sub-commands with their corresponding payload data.
3035
*
3036
* |sub-command |payload |
3037
* |------------------------------------ |----------------------------------------|
3038
* |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL |uphy_set_margin_control |
3039
* |CMD_UPHY_PCIE_LANE_MARGIN_STATUS | |
3040
* |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_INIT |cmd_uphy_ep_controller_pll_init_request |
3041
* |CMD_UPHY_PCIE_CONTROLLER_STATE |cmd_uphy_pcie_controller_state_request |
3042
* |CMD_UPHY_PCIE_EP_CONTROLLER_PLL_OFF |cmd_uphy_ep_controller_pll_off_request |
3043
* |CMD_UPHY_PCIE_DISPLAY_PORT_INIT |cmd_uphy_display_port_init_request |
3044
* |CMD_UPHY_PCIE_DISPLAY_PORT_OFF | |
3045
* |CMD_UPHY_XUSB_DYN_LANES_RESTORE |cmd_uphy_xusb_dyn_lanes_restore_request |
3046
*
3047
*/
3048
3049
struct mrq_uphy_request {
3050
/** @brief Lane number. */
3051
uint16_t lane;
3052
/** @brief Sub-command id. */
3053
uint16_t cmd;
3054
3055
union {
3056
struct cmd_uphy_margin_control_request uphy_set_margin_control;
3057
struct cmd_uphy_ep_controller_pll_init_request ep_ctrlr_pll_init;
3058
struct cmd_uphy_pcie_controller_state_request controller_state;
3059
struct cmd_uphy_ep_controller_pll_off_request ep_ctrlr_pll_off;
3060
struct cmd_uphy_display_port_init_request display_port_init;
3061
struct cmd_uphy_xusb_dyn_lanes_restore_request xusb_dyn_lanes_restore;
3062
} BPMP_UNION_ANON;
3063
} BPMP_ABI_PACKED;
3064
3065
/**
3066
* @ingroup UPHY
3067
* @brief Response to MRQ_UPHY
3068
*
3069
* Each sub-command supported by @ref mrq_uphy_request may return
3070
* sub-command-specific data. Some do and some do not as indicated in
3071
* the following table
3072
*
3073
* |sub-command |payload |
3074
* |---------------------------- |------------------------|
3075
* |CMD_UPHY_PCIE_LANE_MARGIN_CONTROL | |
3076
* |CMD_UPHY_PCIE_LANE_MARGIN_STATUS |uphy_get_margin_status |
3077
*
3078
*/
3079
3080
struct mrq_uphy_response {
3081
union {
3082
struct cmd_uphy_margin_status_response uphy_get_margin_status;
3083
} BPMP_UNION_ANON;
3084
} BPMP_ABI_PACKED;
3085
3086
/** @} UPHY */
3087
/** @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500) */
3088
3089
/**
3090
* @ingroup MRQ_Codes
3091
* @def MRQ_FMON
3092
* @brief Perform a frequency monitor configuration operations
3093
*
3094
* * Platforms: T194 onwards
3095
* @cond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
3096
* * Initiators: CCPLEX
3097
* * Targets: BPMP
3098
* * Request Payload: @ref mrq_fmon_request
3099
* * Response Payload: @ref mrq_fmon_response
3100
* @endcond (bpmp_t194 || bpmp_t234 || bpmp_t239 || bpmp_th500)
3101
*
3102
* @addtogroup FMON
3103
* @{
3104
* @cond (bpmp_t194 || bpmp_t234)
3105
*/
3106
enum {
3107
/**
3108
* @brief Clamp FMON configuration to specified rate.
3109
*
3110
* The monitored clock must be running for clamp to succeed. If
3111
* clamped, FMON configuration is preserved when clock rate
3112
* and/or state is changed.
3113
*
3114
* mrq_response::err is 0 if the operation was successful, or @n
3115
* -#BPMP_EACCES: FMON access error @n
3116
* -#BPMP_EBADCMD if subcommand is not supported @n
3117
* -#BPMP_EBADSLT: clamp FMON on cluster with auto-CC3 enabled @n
3118
* -#BPMP_EBUSY: fmon is already clamped at different rate @n
3119
* -#BPMP_EFAULT: self-diagnostic error @n
3120
* -#BPMP_EINVAL: invalid FMON configuration @n
3121
* -#BPMP_EOPNOTSUPP: not in production mode @n
3122
* -#BPMP_ENODEV: invalid clk_id @n
3123
* -#BPMP_ENOENT: no calibration data, uninitialized @n
3124
* -#BPMP_ENOTSUP: avfs config not set @n
3125
* -#BPMP_ENOSYS: clamp FMON on cluster clock w/ no NAFLL @n
3126
* -#BPMP_ETIMEDOUT: operation timed out @n
3127
*/
3128
CMD_FMON_GEAR_CLAMP = 1,
3129
/**
3130
* @brief Release clamped FMON configuration.
3131
*
3132
* Allow FMON configuration to follow monitored clock rate
3133
* and/or state changes.
3134
*
3135
* mrq_response::err is 0 if the operation was successful, or @n
3136
* -#BPMP_EBADCMD if subcommand is not supported @n
3137
* -#BPMP_ENODEV: invalid clk_id @n
3138
* -#BPMP_ENOENT: no calibration data, uninitialized @n
3139
* -#BPMP_ENOTSUP: avfs config not set @n
3140
* -#BPMP_EOPNOTSUPP: not in production mode @n
3141
*/
3142
CMD_FMON_GEAR_FREE = 2,
3143
/**
3144
* @brief Return rate FMON is clamped at, or 0 if FMON is not
3145
* clamped.
3146
*
3147
* Inherently racy, since clamp state can be changed
3148
* concurrently. Useful for testing.
3149
*
3150
* mrq_response::err is 0 if the operation was successful, or @n
3151
* -#BPMP_EBADCMD if subcommand is not supported @n
3152
* -#BPMP_ENODEV: invalid clk_id @n
3153
* -#BPMP_ENOENT: no calibration data, uninitialized @n
3154
* -#BPMP_ENOTSUP: avfs config not set @n
3155
* -#BPMP_EOPNOTSUPP: not in production mode @n
3156
*/
3157
CMD_FMON_GEAR_GET = 3,
3158
/**
3159
* @brief Return current status of FMON faults detected by FMON
3160
* h/w or s/w since last invocation of this command.
3161
* Clears fault status.
3162
*
3163
* mrq_response::err is 0 if the operation was successful, or @n
3164
* -#BPMP_EBADCMD if subcommand is not supported @n
3165
* -#BPMP_EINVAL: invalid fault type @n
3166
* -#BPMP_ENODEV: invalid clk_id @n
3167
* -#BPMP_ENOENT: no calibration data, uninitialized @n
3168
* -#BPMP_ENOTSUP: avfs config not set @n
3169
* -#BPMP_EOPNOTSUPP: not in production mode @n
3170
*/
3171
CMD_FMON_FAULT_STS_GET = 4,
3172
};
3173
3174
/**
3175
* @cond DEPRECATED
3176
* Kept for backward compatibility
3177
*/
3178
#define CMD_FMON_NUM 4
3179
3180
/** @endcond DEPRECATED */
3181
3182
/**
3183
* @defgroup fmon_fault_type FMON fault type
3184
* @addtogroup fmon_fault_type
3185
* @{
3186
*/
3187
/** @brief All detected FMON faults (h/w or s/w) */
3188
#define FMON_FAULT_TYPE_ALL 0U
3189
/** @brief FMON faults detected by h/w */
3190
#define FMON_FAULT_TYPE_HW 1U
3191
/** @brief FMON faults detected by s/w */
3192
#define FMON_FAULT_TYPE_SW 2U
3193
3194
/** @} fmon_fault_type */
3195
3196
3197
struct cmd_fmon_gear_clamp_request {
3198
int32_t unused;
3199
int64_t rate;
3200
} BPMP_ABI_PACKED;
3201
3202
/** @private */
3203
struct cmd_fmon_gear_clamp_response {
3204
BPMP_ABI_EMPTY
3205
} BPMP_ABI_PACKED;
3206
3207
/** @private */
3208
struct cmd_fmon_gear_free_request {
3209
BPMP_ABI_EMPTY
3210
} BPMP_ABI_PACKED;
3211
3212
/** @private */
3213
struct cmd_fmon_gear_free_response {
3214
BPMP_ABI_EMPTY
3215
} BPMP_ABI_PACKED;
3216
3217
/** @private */
3218
struct cmd_fmon_gear_get_request {
3219
BPMP_ABI_EMPTY
3220
} BPMP_ABI_PACKED;
3221
3222
struct cmd_fmon_gear_get_response {
3223
int64_t rate;
3224
} BPMP_ABI_PACKED;
3225
3226
struct cmd_fmon_fault_sts_get_request {
3227
uint32_t fault_type; /**< @ref fmon_fault_type */
3228
} BPMP_ABI_PACKED;
3229
3230
struct cmd_fmon_fault_sts_get_response {
3231
uint32_t fault_sts;
3232
} BPMP_ABI_PACKED;
3233
3234
/**
3235
* @ingroup FMON
3236
* @brief Request with #MRQ_FMON
3237
*
3238
* Used by the sender of an #MRQ_FMON message to configure clock
3239
* frequency monitors. The FMON request is split into several
3240
* sub-commands. Some sub-commands require no additional data.
3241
* Others have a sub-command specific payload
3242
*
3243
* |sub-command |payload |
3244
* |----------------------------|-----------------------|
3245
* |CMD_FMON_GEAR_CLAMP |fmon_gear_clamp |
3246
* |CMD_FMON_GEAR_FREE |- |
3247
* |CMD_FMON_GEAR_GET |- |
3248
* |CMD_FMON_FAULT_STS_GET |fmon_fault_sts_get |
3249
*
3250
*/
3251
struct mrq_fmon_request {
3252
/** @brief Sub-command and clock id concatenated to 32-bit word.
3253
* - bits[31..24] is the sub-cmd.
3254
* - bits[23..0] is monitored clock id used to select target
3255
* FMON
3256
*/
3257
uint32_t cmd_and_id;
3258
3259
union {
3260
struct cmd_fmon_gear_clamp_request fmon_gear_clamp;
3261
/** @private */
3262
struct cmd_fmon_gear_free_request fmon_gear_free;
3263
/** @private */
3264
struct cmd_fmon_gear_get_request fmon_gear_get;
3265
struct cmd_fmon_fault_sts_get_request fmon_fault_sts_get;
3266
} BPMP_UNION_ANON;
3267
} BPMP_ABI_PACKED;
3268
3269
/**
3270
* @ingroup FMON
3271
* @brief Response to MRQ_FMON
3272
*
3273
* Each sub-command supported by @ref mrq_fmon_request may
3274
* return sub-command-specific data as indicated below.
3275
*
3276
* |sub-command |payload |
3277
* |----------------------------|------------------------|
3278
* |CMD_FMON_GEAR_CLAMP |- |
3279
* |CMD_FMON_GEAR_FREE |- |
3280
* |CMD_FMON_GEAR_GET |fmon_gear_get |
3281
* |CMD_FMON_FAULT_STS_GET |fmon_fault_sts_get |
3282
*
3283
*/
3284
3285
struct mrq_fmon_response {
3286
union {
3287
/** @private */
3288
struct cmd_fmon_gear_clamp_response fmon_gear_clamp;
3289
/** @private */
3290
struct cmd_fmon_gear_free_response fmon_gear_free;
3291
struct cmd_fmon_gear_get_response fmon_gear_get;
3292
struct cmd_fmon_fault_sts_get_response fmon_fault_sts_get;
3293
} BPMP_UNION_ANON;
3294
} BPMP_ABI_PACKED;
3295
3296
/** @endcond (bpmp_t194 || bpmp_t234) */
3297
/** @} FMON */
3298
3299
/**
3300
* @ingroup MRQ_Codes
3301
* @def MRQ_EC
3302
* @brief Provide status information on faults reported by Error
3303
* Collator (EC) to HSM.
3304
*
3305
* * Platforms: T194
3306
* @cond bpmp_t194
3307
* * Initiators: CCPLEX
3308
* * Targets: BPMP
3309
* * Request Payload: @ref mrq_ec_request
3310
* * Response Payload: @ref mrq_ec_response
3311
*
3312
* @note This MRQ ABI is under construction, and subject to change
3313
*
3314
* @endcond bpmp_t194
3315
* @addtogroup EC
3316
* @{
3317
* @cond bpmp_t194
3318
*/
3319
enum {
3320
/**
3321
* @cond DEPRECATED
3322
* @brief Retrieve specified EC status.
3323
*
3324
* mrq_response::err is 0 if the operation was successful, or @n
3325
* -#BPMP_ENODEV if target EC is not owned by BPMP @n
3326
* -#BPMP_EACCES if target EC power domain is turned off @n
3327
* -#BPMP_EBADCMD if subcommand is not supported
3328
* @endcond DEPRECATED
3329
*/
3330
CMD_EC_STATUS_GET = 1, /* deprecated */
3331
3332
/**
3333
* @brief Retrieve specified EC extended status (includes error
3334
* counter and user values).
3335
*
3336
* mrq_response::err is 0 if the operation was successful, or @n
3337
* -#BPMP_ENODEV if target EC is not owned by BPMP @n
3338
* -#BPMP_EACCES if target EC power domain is turned off @n
3339
* -#BPMP_EBADCMD if subcommand is not supported
3340
*/
3341
CMD_EC_STATUS_EX_GET = 2,
3342
CMD_EC_NUM,
3343
};
3344
3345
/** @brief BPMP ECs error types */
3346
enum bpmp_ec_err_type {
3347
/** @brief Parity error on internal data path
3348
*
3349
* Error descriptor @ref ec_err_simple_desc.
3350
*/
3351
EC_ERR_TYPE_PARITY_INTERNAL = 1,
3352
3353
/** @brief ECC SEC error on internal data path
3354
*
3355
* Error descriptor @ref ec_err_simple_desc.
3356
*/
3357
EC_ERR_TYPE_ECC_SEC_INTERNAL = 2,
3358
3359
/** @brief ECC DED error on internal data path
3360
*
3361
* Error descriptor @ref ec_err_simple_desc.
3362
*/
3363
EC_ERR_TYPE_ECC_DED_INTERNAL = 3,
3364
3365
/** @brief Comparator error
3366
*
3367
* Error descriptor @ref ec_err_simple_desc.
3368
*/
3369
EC_ERR_TYPE_COMPARATOR = 4,
3370
3371
/** @brief Register parity error
3372
*
3373
* Error descriptor @ref ec_err_reg_parity_desc.
3374
*/
3375
EC_ERR_TYPE_REGISTER_PARITY = 5,
3376
3377
/** @brief Parity error from on-chip SRAM/FIFO
3378
*
3379
* Error descriptor @ref ec_err_simple_desc.
3380
*/
3381
EC_ERR_TYPE_PARITY_SRAM = 6,
3382
3383
/** @brief Clock Monitor error
3384
*
3385
* Error descriptor @ref ec_err_fmon_desc.
3386
*/
3387
EC_ERR_TYPE_CLOCK_MONITOR = 9,
3388
3389
/** @brief Voltage Monitor error
3390
*
3391
* Error descriptor @ref ec_err_vmon_desc.
3392
*/
3393
EC_ERR_TYPE_VOLTAGE_MONITOR = 10,
3394
3395
/** @brief SW Correctable error
3396
*
3397
* Error descriptor @ref ec_err_sw_error_desc.
3398
*/
3399
EC_ERR_TYPE_SW_CORRECTABLE = 16,
3400
3401
/** @brief SW Uncorrectable error
3402
*
3403
* Error descriptor @ref ec_err_sw_error_desc.
3404
*/
3405
EC_ERR_TYPE_SW_UNCORRECTABLE = 17,
3406
3407
/** @brief Other HW Correctable error
3408
*
3409
* Error descriptor @ref ec_err_simple_desc.
3410
*/
3411
EC_ERR_TYPE_OTHER_HW_CORRECTABLE = 32,
3412
3413
/** @brief Other HW Uncorrectable error
3414
*
3415
* Error descriptor @ref ec_err_simple_desc.
3416
*/
3417
EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE = 33,
3418
};
3419
3420
/** @brief Group of registers with parity error. */
3421
enum ec_registers_group {
3422
/** @brief Functional registers group */
3423
EC_ERR_GROUP_FUNC_REG = 0U,
3424
/** @brief SCR registers group */
3425
EC_ERR_GROUP_SCR_REG = 1U,
3426
};
3427
3428
/**
3429
* @defgroup bpmp_ec_status_flags EC Status Flags
3430
* @addtogroup bpmp_ec_status_flags
3431
* @{
3432
*/
3433
/** @brief No EC error found flag */
3434
#define EC_STATUS_FLAG_NO_ERROR 0x0001U
3435
/** @brief Last EC error found flag */
3436
#define EC_STATUS_FLAG_LAST_ERROR 0x0002U
3437
/** @brief EC latent error flag */
3438
#define EC_STATUS_FLAG_LATENT_ERROR 0x0004U
3439
3440
/** @} bpmp_ec_status_flags */
3441
3442
/**
3443
* @defgroup bpmp_ec_desc_flags EC Descriptor Flags
3444
* @addtogroup bpmp_ec_desc_flags
3445
* @{
3446
*/
3447
/** @brief EC descriptor error resolved flag */
3448
#define EC_DESC_FLAG_RESOLVED 0x0001U
3449
/** @brief EC descriptor failed to retrieve id flag */
3450
#define EC_DESC_FLAG_NO_ID 0x0002U
3451
3452
/** @} bpmp_ec_desc_flags */
3453
3454
/**
3455
* |error type | fmon_clk_id values |
3456
* |---------------------------------|---------------------------|
3457
* |@ref EC_ERR_TYPE_CLOCK_MONITOR |@ref bpmp_clock_ids |
3458
*/
3459
struct ec_err_fmon_desc {
3460
/** @brief Bitmask of @ref bpmp_ec_desc_flags */
3461
uint16_t desc_flags;
3462
/** @brief FMON monitored clock id */
3463
uint16_t fmon_clk_id;
3464
/**
3465
* @brief Bitmask of fault flags
3466
*
3467
* @ref bpmp_fmon_faults_flags
3468
*/
3469
uint32_t fmon_faults;
3470
/** @brief FMON faults access error */
3471
int32_t fmon_access_error;
3472
} BPMP_ABI_PACKED;
3473
3474
/**
3475
* | error type | vmon_adc_id values |
3476
* |---------------------------------|---------------------------|
3477
* |@ref EC_ERR_TYPE_VOLTAGE_MONITOR |@ref bpmp_adc_ids |
3478
*/
3479
struct ec_err_vmon_desc {
3480
/** @brief Bitmask of @ref bpmp_ec_desc_flags */
3481
uint16_t desc_flags;
3482
/** @brief VMON rail adc id */
3483
uint16_t vmon_adc_id;
3484
/** @brief Bitmask of bpmp_vmon_faults_flags */
3485
uint32_t vmon_faults;
3486
/** @brief VMON faults access error */
3487
int32_t vmon_access_error;
3488
} BPMP_ABI_PACKED;
3489
3490
/**
3491
* |error type | reg_id values |
3492
* |---------------------------------|-----------------------|
3493
* |@ref EC_ERR_TYPE_REGISTER_PARITY | bpmp_ec_registers_ids |
3494
*/
3495
struct ec_err_reg_parity_desc {
3496
/** @brief Bitmask of @ref bpmp_ec_desc_flags */
3497
uint16_t desc_flags;
3498
/** @brief Register id */
3499
uint16_t reg_id;
3500
/** @brief Register group @ref ec_registers_group */
3501
uint16_t reg_group;
3502
} BPMP_ABI_PACKED;
3503
3504
/**
3505
* |error type | err_source_id values |
3506
* |--------------------------------- |----------------------|
3507
* |@ref EC_ERR_TYPE_SW_CORRECTABLE | bpmp_ec_ce_swd_ids |
3508
* |@ref EC_ERR_TYPE_SW_UNCORRECTABLE | bpmp_ec_ue_swd_ids |
3509
*/
3510
struct ec_err_sw_error_desc {
3511
/** @brief Bitmask of @ref bpmp_ec_desc_flags */
3512
uint16_t desc_flags;
3513
/** @brief Error source id */
3514
uint16_t err_source_id;
3515
/** @brief Sw error data */
3516
uint32_t sw_error_data;
3517
} BPMP_ABI_PACKED;
3518
3519
/**
3520
* |error type | err_source_id values |
3521
* |----------------------------------------|------------------------|
3522
* |@ref EC_ERR_TYPE_PARITY_INTERNAL | bpmp_ec_ipath_ids |
3523
* |@ref EC_ERR_TYPE_ECC_SEC_INTERNAL | bpmp_ec_ipath_ids |
3524
* |@ref EC_ERR_TYPE_ECC_DED_INTERNAL | bpmp_ec_ipath_ids |
3525
* |@ref EC_ERR_TYPE_COMPARATOR | bpmp_ec_comparator_ids|
3526
* |@ref EC_ERR_TYPE_OTHER_HW_CORRECTABLE | bpmp_ec_misc_hwd_ids |
3527
* |@ref EC_ERR_TYPE_OTHER_HW_UNCORRECTABLE | bpmp_ec_misc_hwd_ids |
3528
* |@ref EC_ERR_TYPE_PARITY_SRAM | bpmp_clock_ids |
3529
*/
3530
struct ec_err_simple_desc {
3531
/** @brief Bitmask of @ref bpmp_ec_desc_flags */
3532
uint16_t desc_flags;
3533
/** @brief Error source id. Id space depends on error type. */
3534
uint16_t err_source_id;
3535
} BPMP_ABI_PACKED;
3536
3537
/** @brief Union of EC error descriptors */
3538
union ec_err_desc {
3539
struct ec_err_fmon_desc fmon_desc;
3540
struct ec_err_vmon_desc vmon_desc;
3541
struct ec_err_reg_parity_desc reg_parity_desc;
3542
struct ec_err_sw_error_desc sw_error_desc;
3543
struct ec_err_simple_desc simple_desc;
3544
} BPMP_ABI_PACKED;
3545
3546
struct cmd_ec_status_get_request {
3547
/** @brief HSM error line number that identifies target EC. */
3548
uint32_t ec_hsm_id;
3549
} BPMP_ABI_PACKED;
3550
3551
/** EC status maximum number of descriptors */
3552
#define EC_ERR_STATUS_DESC_MAX_NUM 4U
3553
3554
/**
3555
* @cond DEPRECATED
3556
*/
3557
struct cmd_ec_status_get_response {
3558
/** @brief Target EC id (the same id received with request). */
3559
uint32_t ec_hsm_id;
3560
/**
3561
* @brief Bitmask of @ref bpmp_ec_status_flags
3562
*
3563
* If NO_ERROR flag is set, error_ fields should be ignored
3564
*/
3565
uint32_t ec_status_flags;
3566
/** @brief Found EC error index. */
3567
uint32_t error_idx;
3568
/** @brief Found EC error type @ref bpmp_ec_err_type. */
3569
uint32_t error_type;
3570
/** @brief Number of returned EC error descriptors */
3571
uint32_t error_desc_num;
3572
/** @brief EC error descriptors */
3573
union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM];
3574
} BPMP_ABI_PACKED;
3575
/** @endcond DEPRECATED */
3576
3577
struct cmd_ec_status_ex_get_response {
3578
/** @brief Target EC id (the same id received with request). */
3579
uint32_t ec_hsm_id;
3580
/**
3581
* @brief Bitmask of @ref bpmp_ec_status_flags
3582
*
3583
* If NO_ERROR flag is set, error_ fields should be ignored
3584
*/
3585
uint32_t ec_status_flags;
3586
/** @brief Found EC error index. */
3587
uint32_t error_idx;
3588
/** @brief Found EC error type @ref bpmp_ec_err_type. */
3589
uint32_t error_type;
3590
/** @brief Found EC mission error counter value */
3591
uint32_t error_counter;
3592
/** @brief Found EC mission error user value */
3593
uint32_t error_uval;
3594
/** @brief Reserved entry */
3595
uint32_t reserved;
3596
/** @brief Number of returned EC error descriptors */
3597
uint32_t error_desc_num;
3598
/** @brief EC error descriptors */
3599
union ec_err_desc error_descs[EC_ERR_STATUS_DESC_MAX_NUM];
3600
} BPMP_ABI_PACKED;
3601
3602
/**
3603
* @ingroup EC
3604
* @brief Request with #MRQ_EC
3605
*
3606
* Used by the sender of an #MRQ_EC message to access ECs owned
3607
* by BPMP.
3608
*
3609
* @cond DEPRECATED
3610
* |sub-command |payload |
3611
* |----------------------------|-----------------------|
3612
* |@ref CMD_EC_STATUS_GET |ec_status_get |
3613
* @endcond DEPRECATED
3614
*
3615
* |sub-command |payload |
3616
* |----------------------------|-----------------------|
3617
* |@ref CMD_EC_STATUS_EX_GET |ec_status_get |
3618
*
3619
*/
3620
3621
struct mrq_ec_request {
3622
/** @brief Sub-command id. */
3623
uint32_t cmd_id;
3624
3625
union {
3626
struct cmd_ec_status_get_request ec_status_get;
3627
} BPMP_UNION_ANON;
3628
} BPMP_ABI_PACKED;
3629
3630
/**
3631
* @ingroup EC
3632
* @brief Response to MRQ_EC
3633
*
3634
* Each sub-command supported by @ref mrq_ec_request may return
3635
* sub-command-specific data as indicated below.
3636
*
3637
* @cond DEPRECATED
3638
* |sub-command |payload |
3639
* |----------------------------|------------------------|
3640
* |@ref CMD_EC_STATUS_GET |ec_status_get |
3641
* @endcond DEPRECATED
3642
*
3643
* |sub-command |payload |
3644
* |----------------------------|------------------------|
3645
* |@ref CMD_EC_STATUS_EX_GET |ec_status_ex_get |
3646
*
3647
*/
3648
3649
struct mrq_ec_response {
3650
union {
3651
/**
3652
* @cond DEPRECATED
3653
*/
3654
struct cmd_ec_status_get_response ec_status_get;
3655
/** @endcond DEPRECATED */
3656
struct cmd_ec_status_ex_get_response ec_status_ex_get;
3657
} BPMP_UNION_ANON;
3658
} BPMP_ABI_PACKED;
3659
3660
/** @endcond bpmp_t194 */
3661
/** @} EC */
3662
3663
/**
3664
* @ingroup MRQ_Codes
3665
* @def MRQ_TELEMETRY
3666
* @brief Get address of memory buffer refreshed with recently sampled
3667
* telemetry data
3668
*
3669
* * Platforms: TH500 onwards
3670
* @cond bpmp_th500
3671
* * Initiators: CCPLEX
3672
* * Targets: BPMP
3673
* * Request Payload: N/A
3674
* * Response Payload: @ref mrq_telemetry_response
3675
* @addtogroup Telemetry
3676
* @{
3677
*/
3678
3679
/**
3680
* @brief Response to #MRQ_TELEMETRY
3681
*
3682
* mrq_response::err is
3683
* * 0: Telemetry data is available at returned address
3684
* * -#BPMP_EACCES: MRQ master is not allowed to request buffer refresh
3685
* * -#BPMP_ENAVAIL: Telemetry buffer cannot be refreshed via this MRQ channel
3686
* * -#BPMP_ENOTSUP: Telemetry buffer is not supported by BPMP-FW
3687
* * -#BPMP_ENODEV: Telemetry mrq is not supported by BPMP-FW
3688
*/
3689
struct mrq_telemetry_response {
3690
/** @brief Physical address of telemetry data buffer */
3691
uint64_t data_buf_addr; /**< see @ref bpmp_telemetry_layout */
3692
} BPMP_ABI_PACKED;
3693
3694
/** @} Telemetry */
3695
/** @endcond bpmp_th500 */
3696
3697
/**
3698
* @ingroup MRQ_Codes
3699
* @def MRQ_PWR_LIMIT
3700
* @brief Control power limits.
3701
*
3702
* * Platforms: TH500 onwards
3703
* @cond bpmp_th500
3704
* * Initiators: Any
3705
* * Targets: BPMP
3706
* * Request Payload: @ref mrq_pwr_limit_request
3707
* * Response Payload: @ref mrq_pwr_limit_response
3708
*
3709
* @addtogroup Pwrlimit
3710
* @{
3711
*/
3712
enum mrq_pwr_limit_cmd {
3713
/**
3714
* @brief Check whether the BPMP-FW supports the specified
3715
* command
3716
*
3717
* mrq_response::err is 0 if the specified request is
3718
* supported and -#BPMP_ENODEV otherwise.
3719
*/
3720
CMD_PWR_LIMIT_QUERY_ABI = 0,
3721
3722
/**
3723
* @brief Set power limit
3724
*
3725
* mrq_response:err is
3726
* * 0: Success
3727
* * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW
3728
* * -#BPMP_ENAVAIL: Invalid request parameters
3729
* * -#BPMP_EACCES: Request is not accepted
3730
*/
3731
CMD_PWR_LIMIT_SET = 1,
3732
3733
/**
3734
* @brief Get power limit setting
3735
*
3736
* mrq_response:err is
3737
* * 0: Success
3738
* * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW
3739
* * -#BPMP_ENAVAIL: Invalid request parameters
3740
*/
3741
CMD_PWR_LIMIT_GET = 2,
3742
3743
/**
3744
* @brief Get current power cap
3745
*
3746
* mrq_response:err is
3747
* * 0: Success
3748
* * -#BPMP_ENODEV: Pwr limit mrq is not supported by BPMP-FW
3749
* * -#BPMP_ENAVAIL: Invalid request parameters
3750
*/
3751
CMD_PWR_LIMIT_CURR_CAP = 3,
3752
};
3753
3754
/**
3755
* @defgroup bpmp_pwr_limit_type PWR_LIMIT TYPEs
3756
* @{
3757
*/
3758
/** @brief Limit value specifies target cap */
3759
#define PWR_LIMIT_TYPE_TARGET_CAP 0U
3760
/** @brief Limit value specifies maximum possible target cap */
3761
#define PWR_LIMIT_TYPE_BOUND_MAX 1U
3762
/** @brief Limit value specifies minimum possible target cap */
3763
#define PWR_LIMIT_TYPE_BOUND_MIN 2U
3764
/** @brief Number of limit types supported by mrq interface */
3765
#define PWR_LIMIT_TYPE_NUM 3U
3766
3767
/** @} bpmp_pwr_limit_type */
3768
3769
/**
3770
* @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_QUERY_ABI
3771
*/
3772
struct cmd_pwr_limit_query_abi_request {
3773
uint32_t cmd_code; /**< @ref mrq_pwr_limit_cmd */
3774
} BPMP_ABI_PACKED;
3775
3776
/**
3777
* @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_SET
3778
*
3779
* Set specified limit of specified type from specified source. The success of
3780
* the request means that specified value is accepted as input to arbitration
3781
* with other sources settings for the same limit of the same type. Zero limit
3782
* is ignored by the arbitration (i.e., indicates "no limit set").
3783
*/
3784
struct cmd_pwr_limit_set_request {
3785
uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */
3786
uint32_t limit_src; /**< @ref bpmp_pwr_limit_src */
3787
uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */
3788
uint32_t limit_setting;
3789
} BPMP_ABI_PACKED;
3790
3791
/**
3792
* @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET
3793
*
3794
* Get previously set from specified source specified limit value of specified
3795
* type.
3796
*/
3797
struct cmd_pwr_limit_get_request {
3798
uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */
3799
uint32_t limit_src; /**< @ref bpmp_pwr_limit_src */
3800
uint32_t limit_type; /**< @ref bpmp_pwr_limit_type */
3801
} BPMP_ABI_PACKED;
3802
3803
/**
3804
* @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_GET
3805
*/
3806
struct cmd_pwr_limit_get_response {
3807
uint32_t limit_setting;
3808
} BPMP_ABI_PACKED;
3809
3810
/**
3811
* @brief Request data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP
3812
*
3813
* For specified limit get current power cap aggregated from all sources.
3814
*/
3815
struct cmd_pwr_limit_curr_cap_request {
3816
uint32_t limit_id; /**< @ref bpmp_pwr_limit_id */
3817
} BPMP_ABI_PACKED;
3818
3819
/**
3820
* @brief Response data for #MRQ_PWR_LIMIT command CMD_PWR_LIMIT_CURR_CAP
3821
*/
3822
struct cmd_pwr_limit_curr_cap_response {
3823
uint32_t curr_cap;
3824
} BPMP_ABI_PACKED;
3825
3826
/**
3827
* @brief Request with #MRQ_PWR_LIMIT
3828
*
3829
* |sub-command |payload |
3830
* |----------------------------|---------------------------------|
3831
* |CMD_PWR_LIMIT_QUERY_ABI | cmd_pwr_limit_query_abi_request |
3832
* |CMD_PWR_LIMIT_SET | cmd_pwr_limit_set_request |
3833
* |CMD_PWR_LIMIT_GET | cmd_pwr_limit_get_request |
3834
* |CMD_PWR_LIMIT_CURR_CAP | cmd_pwr_limit_curr_cap_request |
3835
*/
3836
struct mrq_pwr_limit_request {
3837
uint32_t cmd;
3838
union {
3839
struct cmd_pwr_limit_query_abi_request pwr_limit_query_abi_req;
3840
struct cmd_pwr_limit_set_request pwr_limit_set_req;
3841
struct cmd_pwr_limit_get_request pwr_limit_get_req;
3842
struct cmd_pwr_limit_curr_cap_request pwr_limit_curr_cap_req;
3843
} BPMP_UNION_ANON;
3844
} BPMP_ABI_PACKED;
3845
3846
/**
3847
* @brief Response to MRQ_PWR_LIMIT
3848
*
3849
* |sub-command |payload |
3850
* |----------------------------|---------------------------------|
3851
* |CMD_PWR_LIMIT_QUERY_ABI | - |
3852
* |CMD_PWR_LIMIT_SET | - |
3853
* |CMD_PWR_LIMIT_GET | cmd_pwr_limit_get_response |
3854
* |CMD_PWR_LIMIT_CURR_CAP | cmd_pwr_limit_curr_cap_response |
3855
*/
3856
struct mrq_pwr_limit_response {
3857
union {
3858
struct cmd_pwr_limit_get_response pwr_limit_get_rsp;
3859
struct cmd_pwr_limit_curr_cap_response pwr_limit_curr_cap_rsp;
3860
} BPMP_UNION_ANON;
3861
} BPMP_ABI_PACKED;
3862
3863
/** @} PwrLimit */
3864
/** @endcond bpmp_th500 */
3865
3866
3867
/**
3868
* @ingroup MRQ_Codes
3869
* @def MRQ_GEARS
3870
* @brief Get thresholds for NDIV offset switching
3871
*
3872
* * Platforms: TH500 onwards
3873
* @cond bpmp_th500
3874
* * Initiators: CCPLEX
3875
* * Targets: BPMP
3876
* * Request Payload: N/A
3877
* * Response Payload: @ref mrq_gears_response
3878
* @addtogroup Gears
3879
* @{
3880
*/
3881
3882
/**
3883
* @brief Response to #MRQ_GEARS
3884
*
3885
* Used by the sender of an #MRQ_GEARS message to request thresholds
3886
* for NDIV offset switching.
3887
*
3888
* The mrq_gears_response::ncpu array defines four thresholds in units
3889
* of number of online CPUS to be used for choosing between five different
3890
* NDIV offset settings for CCPLEX cluster NAFLLs
3891
*
3892
* 1. If number of online CPUs < ncpu[0] use offset0
3893
* 2. If number of online CPUs < ncpu[1] use offset1
3894
* 3. If number of online CPUs < ncpu[2] use offset2
3895
* 4. If number of online CPUs < ncpu[3] use offset3
3896
* 5. If number of online CPUs >= ncpu[3] disable offsetting
3897
*
3898
* For TH500 mrq_gears_response::ncpu array has four valid entries.
3899
*
3900
* mrq_response::err is
3901
* * 0: gears defined and response data valid
3902
* * -#BPMP_ENODEV: MRQ is not supported by BPMP-FW
3903
* * -#BPMP_EACCES: Operation not permitted for the MRQ master
3904
* * -#BPMP_ENAVAIL: NDIV offsetting is disabled
3905
*/
3906
struct mrq_gears_response {
3907
/** @brief number of online CPUs for each gear */
3908
uint32_t ncpu[16];
3909
} BPMP_ABI_PACKED;
3910
3911
/** @} Gears */
3912
/** @endcond bpmp_th500 */
3913
3914
/**
3915
* @addtogroup Error_Codes
3916
* Negative values for mrq_response::err generally indicate some
3917
* error. The ABI defines the following error codes. Negating these
3918
* defines is an exercise left to the user.
3919
* @{
3920
*/
3921
3922
/** @brief Operation not permitted */
3923
#define BPMP_EPERM 1
3924
/** @brief No such file or directory */
3925
#define BPMP_ENOENT 2
3926
/** @brief No MRQ handler */
3927
#define BPMP_ENOHANDLER 3
3928
/** @brief I/O error */
3929
#define BPMP_EIO 5
3930
/** @brief Bad sub-MRQ command */
3931
#define BPMP_EBADCMD 6
3932
/** @brief Resource temporarily unavailable */
3933
#define BPMP_EAGAIN 11
3934
/** @brief Not enough memory */
3935
#define BPMP_ENOMEM 12
3936
/** @brief Permission denied */
3937
#define BPMP_EACCES 13
3938
/** @brief Bad address */
3939
#define BPMP_EFAULT 14
3940
/** @brief Resource busy */
3941
#define BPMP_EBUSY 16
3942
/** @brief No such device */
3943
#define BPMP_ENODEV 19
3944
/** @brief Argument is a directory */
3945
#define BPMP_EISDIR 21
3946
/** @brief Invalid argument */
3947
#define BPMP_EINVAL 22
3948
/** @brief Timeout during operation */
3949
#define BPMP_ETIMEDOUT 23
3950
/** @brief Out of range */
3951
#define BPMP_ERANGE 34
3952
/** @brief Function not implemented */
3953
#define BPMP_ENOSYS 38
3954
/** @brief Invalid slot */
3955
#define BPMP_EBADSLT 57
3956
/** @brief Invalid message */
3957
#define BPMP_EBADMSG 77
3958
/** @brief Operation not supported */
3959
#define BPMP_EOPNOTSUPP 95
3960
/** @brief Targeted resource not available */
3961
#define BPMP_ENAVAIL 119
3962
/** @brief Not supported */
3963
#define BPMP_ENOTSUP 134
3964
/** @brief No such device or address */
3965
#define BPMP_ENXIO 140
3966
3967
/** @} Error_Codes */
3968
3969
#if defined(BPMP_ABI_CHECKS)
3970
#include "bpmp_abi_checks.h"
3971
#endif
3972
3973
#endif
3974
3975