xref: /arm-trusted-firmware/plat/imx/common/include/sci/svc/misc/sci_misc_api.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (C) 2016 Freescale Semiconductor, Inc.
3*91f16700Schasinglulu  * Copyright 2017-2019 NXP
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu /*!
9*91f16700Schasinglulu  * Header file containing the public API for the System Controller (SC)
10*91f16700Schasinglulu  * Miscellaneous (MISC) function.
11*91f16700Schasinglulu  *
12*91f16700Schasinglulu  * @addtogroup MISC_SVC (SVC) Miscellaneous Service
13*91f16700Schasinglulu  *
14*91f16700Schasinglulu  * Module for the Miscellaneous (MISC) service.
15*91f16700Schasinglulu  *
16*91f16700Schasinglulu  * @{
17*91f16700Schasinglulu  */
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #ifndef SC_MISC_API_H
20*91f16700Schasinglulu #define SC_MISC_API_H
21*91f16700Schasinglulu 
22*91f16700Schasinglulu /* Includes */
23*91f16700Schasinglulu 
24*91f16700Schasinglulu #include <sci/svc/rm/sci_rm_api.h>
25*91f16700Schasinglulu #include <sci/sci_types.h>
26*91f16700Schasinglulu 
27*91f16700Schasinglulu /* Defines */
28*91f16700Schasinglulu 
29*91f16700Schasinglulu /*!
30*91f16700Schasinglulu  * @name Defines for type widths
31*91f16700Schasinglulu  */
32*91f16700Schasinglulu /*@{*/
33*91f16700Schasinglulu #define SC_MISC_DMA_GRP_W       5U	/* Width of sc_misc_dma_group_t */
34*91f16700Schasinglulu /*@}*/
35*91f16700Schasinglulu 
36*91f16700Schasinglulu /*! Max DMA channel priority group */
37*91f16700Schasinglulu #define SC_MISC_DMA_GRP_MAX     31U
38*91f16700Schasinglulu 
39*91f16700Schasinglulu /*!
40*91f16700Schasinglulu  * @name Defines for sc_misc_boot_status_t
41*91f16700Schasinglulu  */
42*91f16700Schasinglulu /*@{*/
43*91f16700Schasinglulu #define SC_MISC_BOOT_STATUS_SUCCESS     0U	/* Success */
44*91f16700Schasinglulu #define SC_MISC_BOOT_STATUS_SECURITY    1U	/* Security violation */
45*91f16700Schasinglulu /*@}*/
46*91f16700Schasinglulu 
47*91f16700Schasinglulu /*!
48*91f16700Schasinglulu  * @name Defines for sc_misc_seco_auth_cmd_t
49*91f16700Schasinglulu  */
50*91f16700Schasinglulu /*@{*/
51*91f16700Schasinglulu #define SC_MISC_SECO_AUTH_SECO_FW       0U	/* SECO Firmware */
52*91f16700Schasinglulu #define SC_MISC_SECO_AUTH_HDMI_TX_FW    1U	/* HDMI TX Firmware */
53*91f16700Schasinglulu #define SC_MISC_SECO_AUTH_HDMI_RX_FW    2U	/* HDMI RX Firmware */
54*91f16700Schasinglulu /*@}*/
55*91f16700Schasinglulu 
56*91f16700Schasinglulu /*!
57*91f16700Schasinglulu  * @name Defines for sc_misc_temp_t
58*91f16700Schasinglulu  */
59*91f16700Schasinglulu /*@{*/
60*91f16700Schasinglulu #define SC_MISC_TEMP                    0U	/* Temp sensor */
61*91f16700Schasinglulu #define SC_MISC_TEMP_HIGH               1U	/* Temp high alarm */
62*91f16700Schasinglulu #define SC_MISC_TEMP_LOW                2U	/* Temp low alarm */
63*91f16700Schasinglulu /*@}*/
64*91f16700Schasinglulu 
65*91f16700Schasinglulu /*!
66*91f16700Schasinglulu  * @name Defines for sc_misc_seco_auth_cmd_t
67*91f16700Schasinglulu  */
68*91f16700Schasinglulu /*@{*/
69*91f16700Schasinglulu #define SC_MISC_AUTH_CONTAINER          0U	/* Authenticate container */
70*91f16700Schasinglulu #define SC_MISC_VERIFY_IMAGE            1U	/* Verify image */
71*91f16700Schasinglulu #define SC_MISC_REL_CONTAINER           2U	/* Release container */
72*91f16700Schasinglulu /*@}*/
73*91f16700Schasinglulu 
74*91f16700Schasinglulu /* Types */
75*91f16700Schasinglulu 
76*91f16700Schasinglulu /*!
77*91f16700Schasinglulu  * This type is used to store a DMA channel priority group.
78*91f16700Schasinglulu  */
79*91f16700Schasinglulu typedef uint8_t sc_misc_dma_group_t;
80*91f16700Schasinglulu 
81*91f16700Schasinglulu /*!
82*91f16700Schasinglulu  * This type is used report boot status.
83*91f16700Schasinglulu  */
84*91f16700Schasinglulu typedef uint8_t sc_misc_boot_status_t;
85*91f16700Schasinglulu 
86*91f16700Schasinglulu /*!
87*91f16700Schasinglulu  * This type is used to issue SECO authenticate commands.
88*91f16700Schasinglulu  */
89*91f16700Schasinglulu typedef uint8_t sc_misc_seco_auth_cmd_t;
90*91f16700Schasinglulu 
91*91f16700Schasinglulu /*!
92*91f16700Schasinglulu  * This type is used report boot status.
93*91f16700Schasinglulu  */
94*91f16700Schasinglulu typedef uint8_t sc_misc_temp_t;
95*91f16700Schasinglulu 
96*91f16700Schasinglulu /* Functions */
97*91f16700Schasinglulu 
98*91f16700Schasinglulu /*!
99*91f16700Schasinglulu  * @name Control Functions
100*91f16700Schasinglulu  * @{
101*91f16700Schasinglulu  */
102*91f16700Schasinglulu 
103*91f16700Schasinglulu /*!
104*91f16700Schasinglulu  * This function sets a miscellaneous control value.
105*91f16700Schasinglulu  *
106*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
107*91f16700Schasinglulu  * @param[in]     resource    resource the control is associated with
108*91f16700Schasinglulu  * @param[in]     ctrl        control to change
109*91f16700Schasinglulu  * @param[in]     val         value to apply to the control
110*91f16700Schasinglulu  *
111*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
112*91f16700Schasinglulu  *
113*91f16700Schasinglulu  * Return errors:
114*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
115*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
116*91f16700Schasinglulu  *   of the owner
117*91f16700Schasinglulu  *
118*91f16700Schasinglulu  * Refer to the [Control List](@ref CONTROLS) for valid control values.
119*91f16700Schasinglulu  */
120*91f16700Schasinglulu sc_err_t sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource,
121*91f16700Schasinglulu 			     sc_ctrl_t ctrl, uint32_t val);
122*91f16700Schasinglulu 
123*91f16700Schasinglulu /*!
124*91f16700Schasinglulu  * This function gets a miscellaneous control value.
125*91f16700Schasinglulu  *
126*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
127*91f16700Schasinglulu  * @param[in]     resource    resource the control is associated with
128*91f16700Schasinglulu  * @param[in]     ctrl        control to get
129*91f16700Schasinglulu  * @param[out]    val         pointer to return the control value
130*91f16700Schasinglulu  *
131*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
132*91f16700Schasinglulu  *
133*91f16700Schasinglulu  * Return errors:
134*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
135*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
136*91f16700Schasinglulu  *   of the owner
137*91f16700Schasinglulu  *
138*91f16700Schasinglulu  * Refer to the [Control List](@ref CONTROLS) for valid control values.
139*91f16700Schasinglulu  */
140*91f16700Schasinglulu sc_err_t sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource,
141*91f16700Schasinglulu 			     sc_ctrl_t ctrl, uint32_t *val);
142*91f16700Schasinglulu 
143*91f16700Schasinglulu /* @} */
144*91f16700Schasinglulu 
145*91f16700Schasinglulu /*!
146*91f16700Schasinglulu  * @name DMA Functions
147*91f16700Schasinglulu  * @{
148*91f16700Schasinglulu  */
149*91f16700Schasinglulu 
150*91f16700Schasinglulu /*!
151*91f16700Schasinglulu  * This function configures the max DMA channel priority group for a
152*91f16700Schasinglulu  * partition.
153*91f16700Schasinglulu  *
154*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
155*91f16700Schasinglulu  * @param[in]     pt          handle of partition to assign \a max
156*91f16700Schasinglulu  * @param[in]     max         max priority group (0-31)
157*91f16700Schasinglulu  *
158*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
159*91f16700Schasinglulu  *
160*91f16700Schasinglulu  * Return errors:
161*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
162*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the parent
163*91f16700Schasinglulu  *   of the affected partition
164*91f16700Schasinglulu  *
165*91f16700Schasinglulu  * Valid \a max range is 0-31 with 0 being the lowest and 31 the highest.
166*91f16700Schasinglulu  * Default is the max priority group for the parent partition of \a pt.
167*91f16700Schasinglulu  */
168*91f16700Schasinglulu sc_err_t sc_misc_set_max_dma_group(sc_ipc_t ipc, sc_rm_pt_t pt,
169*91f16700Schasinglulu 				   sc_misc_dma_group_t max);
170*91f16700Schasinglulu 
171*91f16700Schasinglulu /*!
172*91f16700Schasinglulu  * This function configures the priority group for a DMA channel.
173*91f16700Schasinglulu  *
174*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
175*91f16700Schasinglulu  * @param[in]     resource    DMA channel resource
176*91f16700Schasinglulu  * @param[in]     group       priority group (0-31)
177*91f16700Schasinglulu  *
178*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
179*91f16700Schasinglulu  *
180*91f16700Schasinglulu  * Return errors:
181*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
182*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the owner or parent
183*91f16700Schasinglulu  *   of the owner of the DMA channel
184*91f16700Schasinglulu  *
185*91f16700Schasinglulu  * Valid \a group range is 0-31 with 0 being the lowest and 31 the highest.
186*91f16700Schasinglulu  * The max value of \a group is limited by the partition max set using
187*91f16700Schasinglulu  * sc_misc_set_max_dma_group().
188*91f16700Schasinglulu  */
189*91f16700Schasinglulu sc_err_t sc_misc_set_dma_group(sc_ipc_t ipc, sc_rsrc_t resource,
190*91f16700Schasinglulu 			       sc_misc_dma_group_t group);
191*91f16700Schasinglulu 
192*91f16700Schasinglulu /* @} */
193*91f16700Schasinglulu 
194*91f16700Schasinglulu /*!
195*91f16700Schasinglulu  * @name Security Functions
196*91f16700Schasinglulu  * @{
197*91f16700Schasinglulu  */
198*91f16700Schasinglulu 
199*91f16700Schasinglulu /*!
200*91f16700Schasinglulu  * This function loads a SECO image.
201*91f16700Schasinglulu  *
202*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
203*91f16700Schasinglulu  * @param[in]     addr_src    address of image source
204*91f16700Schasinglulu  * @param[in]     addr_dst    address of image destination
205*91f16700Schasinglulu  * @param[in]     len         length of image to load
206*91f16700Schasinglulu  * @param[in]     fw          SC_TRUE = firmware load
207*91f16700Schasinglulu  *
208*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
209*91f16700Schasinglulu  *
210*91f16700Schasinglulu  * Return errors codes:
211*91f16700Schasinglulu  * - SC_ERR_PARM if word fuse index param out of range or invalid
212*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if SECO not available
213*91f16700Schasinglulu  *
214*91f16700Schasinglulu  * This is used to load images via the SECO. Examples include SECO
215*91f16700Schasinglulu  * Firmware and IVT/CSF data used for authentication. These are usually
216*91f16700Schasinglulu  * loaded into SECO TCM. \a addr_src is in secure memory.
217*91f16700Schasinglulu  *
218*91f16700Schasinglulu  * See the Security Reference Manual (SRM) for more info.
219*91f16700Schasinglulu  */
220*91f16700Schasinglulu sc_err_t sc_misc_seco_image_load(sc_ipc_t ipc, sc_faddr_t addr_src,
221*91f16700Schasinglulu 				 sc_faddr_t addr_dst, uint32_t len,
222*91f16700Schasinglulu 				 sc_bool_t fw);
223*91f16700Schasinglulu 
224*91f16700Schasinglulu /*!
225*91f16700Schasinglulu  * This function is used to authenticate a SECO image or command.
226*91f16700Schasinglulu  *
227*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
228*91f16700Schasinglulu  * @param[in]     cmd         authenticate command
229*91f16700Schasinglulu  * @param[in]     addr        address of/or metadata
230*91f16700Schasinglulu  *
231*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
232*91f16700Schasinglulu  *
233*91f16700Schasinglulu  * Return errors codes:
234*91f16700Schasinglulu  * - SC_ERR_PARM if word fuse index param out of range or invalid
235*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if SECO not available
236*91f16700Schasinglulu  *
237*91f16700Schasinglulu  * This is used to authenticate a SECO image or issue a security
238*91f16700Schasinglulu  * command. \a addr often points to an container. It is also
239*91f16700Schasinglulu  * just data (or even unused) for some commands.
240*91f16700Schasinglulu  *
241*91f16700Schasinglulu  * See the Security Reference Manual (SRM) for more info.
242*91f16700Schasinglulu  */
243*91f16700Schasinglulu sc_err_t sc_misc_seco_authenticate(sc_ipc_t ipc,
244*91f16700Schasinglulu 				   sc_misc_seco_auth_cmd_t cmd,
245*91f16700Schasinglulu 				   sc_faddr_t addr);
246*91f16700Schasinglulu 
247*91f16700Schasinglulu /*!
248*91f16700Schasinglulu  * This function securely writes a group of fuse words.
249*91f16700Schasinglulu  *
250*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
251*91f16700Schasinglulu  * @param[in]     addr        address of message block
252*91f16700Schasinglulu  *
253*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
254*91f16700Schasinglulu  *
255*91f16700Schasinglulu  * Return errors codes:
256*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if SECO not available
257*91f16700Schasinglulu  *
258*91f16700Schasinglulu  * Note \a addr must be a pointer to a signed message block.
259*91f16700Schasinglulu  *
260*91f16700Schasinglulu  * See the Security Reference Manual (SRM) for more info.
261*91f16700Schasinglulu  */
262*91f16700Schasinglulu sc_err_t sc_misc_seco_fuse_write(sc_ipc_t ipc, sc_faddr_t addr);
263*91f16700Schasinglulu 
264*91f16700Schasinglulu /*!
265*91f16700Schasinglulu  * This function securely enables debug.
266*91f16700Schasinglulu  *
267*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
268*91f16700Schasinglulu  * @param[in]     addr        address of message block
269*91f16700Schasinglulu  *
270*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
271*91f16700Schasinglulu  *
272*91f16700Schasinglulu  * Return errors codes:
273*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if SECO not available
274*91f16700Schasinglulu  *
275*91f16700Schasinglulu  * Note \a addr must be a pointer to a signed message block.
276*91f16700Schasinglulu  *
277*91f16700Schasinglulu  * See the Security Reference Manual (SRM) for more info.
278*91f16700Schasinglulu  */
279*91f16700Schasinglulu sc_err_t sc_misc_seco_enable_debug(sc_ipc_t ipc, sc_faddr_t addr);
280*91f16700Schasinglulu 
281*91f16700Schasinglulu /*!
282*91f16700Schasinglulu  * This function updates the lifecycle of the device.
283*91f16700Schasinglulu  *
284*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
285*91f16700Schasinglulu  * @param[in]     lifecycle   new lifecycle
286*91f16700Schasinglulu  *
287*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
288*91f16700Schasinglulu  *
289*91f16700Schasinglulu  * Return errors codes:
290*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if SECO not available
291*91f16700Schasinglulu  *
292*91f16700Schasinglulu  * This message is used for going from Open to NXP Closed to OEM Closed.
293*91f16700Schasinglulu  *
294*91f16700Schasinglulu  * See the Security Reference Manual (SRM) for more info.
295*91f16700Schasinglulu  */
296*91f16700Schasinglulu sc_err_t sc_misc_seco_forward_lifecycle(sc_ipc_t ipc, uint32_t lifecycle);
297*91f16700Schasinglulu 
298*91f16700Schasinglulu /*!
299*91f16700Schasinglulu  * This function updates the lifecycle to one of the return lifecycles.
300*91f16700Schasinglulu  *
301*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
302*91f16700Schasinglulu  * @param[in]     addr        address of message block
303*91f16700Schasinglulu  *
304*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
305*91f16700Schasinglulu  *
306*91f16700Schasinglulu  * Return errors codes:
307*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if SECO not available
308*91f16700Schasinglulu  *
309*91f16700Schasinglulu  * Note \a addr must be a pointer to a signed message block.
310*91f16700Schasinglulu  *
311*91f16700Schasinglulu  * To switch back to NXP states (Full Field Return), message must be signed
312*91f16700Schasinglulu  * by NXP SRK. For OEM States (Partial Field Return), must be signed by OEM
313*91f16700Schasinglulu  * SRK.
314*91f16700Schasinglulu  *
315*91f16700Schasinglulu  * See the Security Reference Manual (SRM) for more info.
316*91f16700Schasinglulu  */
317*91f16700Schasinglulu sc_err_t sc_misc_seco_return_lifecycle(sc_ipc_t ipc, sc_faddr_t addr);
318*91f16700Schasinglulu 
319*91f16700Schasinglulu /*!
320*91f16700Schasinglulu  * This function is used to return the SECO FW build info.
321*91f16700Schasinglulu  *
322*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
323*91f16700Schasinglulu  * @param[out]    version     pointer to return build number
324*91f16700Schasinglulu  * @param[out]    commit      pointer to return commit ID (git SHA-1)
325*91f16700Schasinglulu  */
326*91f16700Schasinglulu void sc_misc_seco_build_info(sc_ipc_t ipc, uint32_t *version, uint32_t *commit);
327*91f16700Schasinglulu 
328*91f16700Schasinglulu /*!
329*91f16700Schasinglulu  * This function is used to return SECO chip info.
330*91f16700Schasinglulu  *
331*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
332*91f16700Schasinglulu  * @param[out]    lc          pointer to return lifecycle
333*91f16700Schasinglulu  * @param[out]    monotonic   pointer to return monotonic counter
334*91f16700Schasinglulu  * @param[out]    uid_l       pointer to return UID (lower 32 bits)
335*91f16700Schasinglulu  * @param[out]    uid_h       pointer to return UID (upper 32 bits)
336*91f16700Schasinglulu  */
337*91f16700Schasinglulu sc_err_t sc_misc_seco_chip_info(sc_ipc_t ipc, uint16_t *lc,
338*91f16700Schasinglulu 				uint16_t *monotonic, uint32_t *uid_l,
339*91f16700Schasinglulu 				uint32_t *uid_h);
340*91f16700Schasinglulu 
341*91f16700Schasinglulu /* @} */
342*91f16700Schasinglulu 
343*91f16700Schasinglulu /*!
344*91f16700Schasinglulu  * @name Debug Functions
345*91f16700Schasinglulu  * @{
346*91f16700Schasinglulu  */
347*91f16700Schasinglulu 
348*91f16700Schasinglulu /*!
349*91f16700Schasinglulu  * This function is used output a debug character from the SCU UART.
350*91f16700Schasinglulu  *
351*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
352*91f16700Schasinglulu  * @param[in]     ch          character to output
353*91f16700Schasinglulu  */
354*91f16700Schasinglulu void sc_misc_debug_out(sc_ipc_t ipc, uint8_t ch);
355*91f16700Schasinglulu 
356*91f16700Schasinglulu /*!
357*91f16700Schasinglulu  * This function starts/stops emulation waveform capture.
358*91f16700Schasinglulu  *
359*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
360*91f16700Schasinglulu  * @param[in]     enable      flag to enable/disable capture
361*91f16700Schasinglulu  *
362*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
363*91f16700Schasinglulu  *
364*91f16700Schasinglulu  * Return errors:
365*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if not running on emulation
366*91f16700Schasinglulu  */
367*91f16700Schasinglulu sc_err_t sc_misc_waveform_capture(sc_ipc_t ipc, sc_bool_t enable);
368*91f16700Schasinglulu 
369*91f16700Schasinglulu /*!
370*91f16700Schasinglulu  * This function is used to return the SCFW build info.
371*91f16700Schasinglulu  *
372*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
373*91f16700Schasinglulu  * @param[out]    build       pointer to return build number
374*91f16700Schasinglulu  * @param[out]    commit      pointer to return commit ID (git SHA-1)
375*91f16700Schasinglulu  */
376*91f16700Schasinglulu void sc_misc_build_info(sc_ipc_t ipc, uint32_t *build, uint32_t *commit);
377*91f16700Schasinglulu 
378*91f16700Schasinglulu /*!
379*91f16700Schasinglulu  * This function is used to return the device's unique ID.
380*91f16700Schasinglulu  *
381*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
382*91f16700Schasinglulu  * @param[out]    id_l        pointer to return lower 32-bit of ID [31:0]
383*91f16700Schasinglulu  * @param[out]    id_h        pointer to return upper 32-bits of ID [63:32]
384*91f16700Schasinglulu  */
385*91f16700Schasinglulu void sc_misc_unique_id(sc_ipc_t ipc, uint32_t *id_l, uint32_t *id_h);
386*91f16700Schasinglulu 
387*91f16700Schasinglulu /* @} */
388*91f16700Schasinglulu 
389*91f16700Schasinglulu /*!
390*91f16700Schasinglulu  * @name Other Functions
391*91f16700Schasinglulu  * @{
392*91f16700Schasinglulu  */
393*91f16700Schasinglulu 
394*91f16700Schasinglulu /*!
395*91f16700Schasinglulu  * This function configures the ARI match value for PCIe/SATA resources.
396*91f16700Schasinglulu  *
397*91f16700Schasinglulu  * @param[in]     ipc          IPC handle
398*91f16700Schasinglulu  * @param[in]     resource     match resource
399*91f16700Schasinglulu  * @param[in]     resource_mst PCIe/SATA master to match
400*91f16700Schasinglulu  * @param[in]     ari          ARI to match
401*91f16700Schasinglulu  * @param[in]     enable       enable match or not
402*91f16700Schasinglulu  *
403*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
404*91f16700Schasinglulu  *
405*91f16700Schasinglulu  * Return errors:
406*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
407*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the owner or parent
408*91f16700Schasinglulu  *   of the owner of the resource and translation
409*91f16700Schasinglulu  *
410*91f16700Schasinglulu  * For PCIe, the ARI is the 16-bit value that includes the bus number,
411*91f16700Schasinglulu  * device number, and function number. For SATA, this value includes the
412*91f16700Schasinglulu  * FISType and PM_Port.
413*91f16700Schasinglulu  */
414*91f16700Schasinglulu sc_err_t sc_misc_set_ari(sc_ipc_t ipc, sc_rsrc_t resource,
415*91f16700Schasinglulu 			 sc_rsrc_t resource_mst, uint16_t ari,
416*91f16700Schasinglulu 			 sc_bool_t enable);
417*91f16700Schasinglulu 
418*91f16700Schasinglulu /*!
419*91f16700Schasinglulu  * This function reports boot status.
420*91f16700Schasinglulu  *
421*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
422*91f16700Schasinglulu  * @param[in]     status      boot status
423*91f16700Schasinglulu  *
424*91f16700Schasinglulu  * This is used by SW partitions to report status of boot. This is
425*91f16700Schasinglulu  * normally used to report a boot failure.
426*91f16700Schasinglulu  */
427*91f16700Schasinglulu void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status);
428*91f16700Schasinglulu 
429*91f16700Schasinglulu /*!
430*91f16700Schasinglulu  * This function tells the SCFW that a CPU is done booting.
431*91f16700Schasinglulu  *
432*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
433*91f16700Schasinglulu  * @param[in]     cpu         CPU that is done booting
434*91f16700Schasinglulu  *
435*91f16700Schasinglulu  * This is called by early booting CPUs to report they are done with
436*91f16700Schasinglulu  * initialization. After starting early CPUs, the SCFW halts the
437*91f16700Schasinglulu  * booting process until they are done. During this time, early
438*91f16700Schasinglulu  * CPUs can call the SCFW with lower latency as the SCFW is idle.
439*91f16700Schasinglulu  *
440*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
441*91f16700Schasinglulu  *
442*91f16700Schasinglulu  * Return errors:
443*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
444*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the CPU owner
445*91f16700Schasinglulu  */
446*91f16700Schasinglulu sc_err_t sc_misc_boot_done(sc_ipc_t ipc, sc_rsrc_t cpu);
447*91f16700Schasinglulu 
448*91f16700Schasinglulu /*!
449*91f16700Schasinglulu  * This function reads a given fuse word index.
450*91f16700Schasinglulu  *
451*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
452*91f16700Schasinglulu  * @param[in]     word        fuse word index
453*91f16700Schasinglulu  * @param[out]    val         fuse read value
454*91f16700Schasinglulu  *
455*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
456*91f16700Schasinglulu  *
457*91f16700Schasinglulu  * Return errors codes:
458*91f16700Schasinglulu  * - SC_ERR_PARM if word fuse index param out of range or invalid
459*91f16700Schasinglulu  * - SC_ERR_NOACCESS if read operation failed
460*91f16700Schasinglulu  * - SC_ERR_LOCKED if read operation is locked
461*91f16700Schasinglulu  */
462*91f16700Schasinglulu sc_err_t sc_misc_otp_fuse_read(sc_ipc_t ipc, uint32_t word, uint32_t *val);
463*91f16700Schasinglulu 
464*91f16700Schasinglulu /*!
465*91f16700Schasinglulu  * This function writes a given fuse word index.
466*91f16700Schasinglulu  *
467*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
468*91f16700Schasinglulu  * @param[in]     word        fuse word index
469*91f16700Schasinglulu  * @param[in]     val         fuse write value
470*91f16700Schasinglulu  *
471*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
472*91f16700Schasinglulu  *
473*91f16700Schasinglulu  * Return errors codes:
474*91f16700Schasinglulu  * - SC_ERR_PARM if word fuse index param out of range or invalid
475*91f16700Schasinglulu  * - SC_ERR_NOACCESS if write operation failed
476*91f16700Schasinglulu  * - SC_ERR_LOCKED if write operation is locked
477*91f16700Schasinglulu  */
478*91f16700Schasinglulu sc_err_t sc_misc_otp_fuse_write(sc_ipc_t ipc, uint32_t word, uint32_t val);
479*91f16700Schasinglulu 
480*91f16700Schasinglulu /*!
481*91f16700Schasinglulu  * This function sets a temp sensor alarm.
482*91f16700Schasinglulu  *
483*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
484*91f16700Schasinglulu  * @param[in]     resource    resource with sensor
485*91f16700Schasinglulu  * @param[in]     temp        alarm to set
486*91f16700Schasinglulu  * @param[in]     celsius     whole part of temp to set
487*91f16700Schasinglulu  * @param[in]     tenths      fractional part of temp to set
488*91f16700Schasinglulu  *
489*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
490*91f16700Schasinglulu  *
491*91f16700Schasinglulu  * This function will enable the alarm interrupt if the temp requested is
492*91f16700Schasinglulu  * not the min/max temp. This enable automatically clears when the alarm
493*91f16700Schasinglulu  * occurs and this function has to be called again to re-enable.
494*91f16700Schasinglulu  *
495*91f16700Schasinglulu  * Return errors codes:
496*91f16700Schasinglulu  * - SC_ERR_PARM if parameters invalid
497*91f16700Schasinglulu  */
498*91f16700Schasinglulu sc_err_t sc_misc_set_temp(sc_ipc_t ipc, sc_rsrc_t resource,
499*91f16700Schasinglulu 			  sc_misc_temp_t temp, int16_t celsius, int8_t tenths);
500*91f16700Schasinglulu 
501*91f16700Schasinglulu /*!
502*91f16700Schasinglulu  * This function gets a temp sensor value.
503*91f16700Schasinglulu  *
504*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
505*91f16700Schasinglulu  * @param[in]     resource    resource with sensor
506*91f16700Schasinglulu  * @param[in]     temp        value to get (sensor or alarm)
507*91f16700Schasinglulu  * @param[out]    celsius     whole part of temp to get
508*91f16700Schasinglulu  * @param[out]    tenths      fractional part of temp to get
509*91f16700Schasinglulu  *
510*91f16700Schasinglulu  * @return Returns and error code (SC_ERR_NONE = success).
511*91f16700Schasinglulu  *
512*91f16700Schasinglulu  * Return errors codes:
513*91f16700Schasinglulu  * - SC_ERR_PARM if parameters invalid
514*91f16700Schasinglulu  */
515*91f16700Schasinglulu sc_err_t sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource,
516*91f16700Schasinglulu 			  sc_misc_temp_t temp, int16_t *celsius,
517*91f16700Schasinglulu 			  int8_t *tenths);
518*91f16700Schasinglulu 
519*91f16700Schasinglulu /*!
520*91f16700Schasinglulu  * This function returns the boot device.
521*91f16700Schasinglulu  *
522*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
523*91f16700Schasinglulu  * @param[out]    dev         pointer to return boot device
524*91f16700Schasinglulu  */
525*91f16700Schasinglulu void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *dev);
526*91f16700Schasinglulu 
527*91f16700Schasinglulu /*!
528*91f16700Schasinglulu  * This function returns the current status of the ON/OFF button.
529*91f16700Schasinglulu  *
530*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
531*91f16700Schasinglulu  * @param[out]    status      pointer to return button status
532*91f16700Schasinglulu  */
533*91f16700Schasinglulu void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status);
534*91f16700Schasinglulu 
535*91f16700Schasinglulu /* @} */
536*91f16700Schasinglulu 
537*91f16700Schasinglulu #endif				/* SC_MISC_API_H */
538*91f16700Schasinglulu 
539*91f16700Schasinglulu /**@}*/
540