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