xref: /arm-trusted-firmware/plat/imx/common/include/sci/svc/rm/sci_rm_api.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu /*!
8*91f16700Schasinglulu  * Header file containing the public API for the System Controller (SC)
9*91f16700Schasinglulu  * Resource Management (RM) function. This includes functions for
10*91f16700Schasinglulu  * partitioning resources, pads, and memory regions.
11*91f16700Schasinglulu  *
12*91f16700Schasinglulu  * @addtogroup RM_SVC (SVC) Resource Management Service
13*91f16700Schasinglulu  *
14*91f16700Schasinglulu  * Module for the Resource Management (RM) service.
15*91f16700Schasinglulu  *
16*91f16700Schasinglulu  * @includedoc rm/details.dox
17*91f16700Schasinglulu  *
18*91f16700Schasinglulu  * @{
19*91f16700Schasinglulu  */
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #ifndef SCI_RM_API_H
22*91f16700Schasinglulu #define SCI_RM_API_H
23*91f16700Schasinglulu 
24*91f16700Schasinglulu /* Includes */
25*91f16700Schasinglulu 
26*91f16700Schasinglulu #include <sci/sci_types.h>
27*91f16700Schasinglulu 
28*91f16700Schasinglulu /* Defines */
29*91f16700Schasinglulu 
30*91f16700Schasinglulu /*!
31*91f16700Schasinglulu  * @name Defines for type widths
32*91f16700Schasinglulu  */
33*91f16700Schasinglulu /*@{*/
34*91f16700Schasinglulu #define SC_RM_PARTITION_W   5	/* Width of sc_rm_pt_t */
35*91f16700Schasinglulu #define SC_RM_MEMREG_W      6	/* Width of sc_rm_mr_t */
36*91f16700Schasinglulu #define SC_RM_DID_W         4	/* Width of sc_rm_did_t */
37*91f16700Schasinglulu #define SC_RM_SID_W         6	/* Width of sc_rm_sid_t */
38*91f16700Schasinglulu #define SC_RM_SPA_W         2	/* Width of sc_rm_spa_t */
39*91f16700Schasinglulu #define SC_RM_PERM_W        3	/* Width of sc_rm_perm_t */
40*91f16700Schasinglulu /*@}*/
41*91f16700Schasinglulu 
42*91f16700Schasinglulu /*!
43*91f16700Schasinglulu  * @name Defines for ALL parameters
44*91f16700Schasinglulu  */
45*91f16700Schasinglulu /*@{*/
46*91f16700Schasinglulu #define SC_RM_PT_ALL        ((sc_rm_pt_t) UINT8_MAX)	/* All partitions */
47*91f16700Schasinglulu #define SC_RM_MR_ALL        ((sc_rm_mr_t) UINT8_MAX)	/* All memory regions */
48*91f16700Schasinglulu /*@}*/
49*91f16700Schasinglulu 
50*91f16700Schasinglulu /*!
51*91f16700Schasinglulu  * @name Defines for sc_rm_spa_t
52*91f16700Schasinglulu  */
53*91f16700Schasinglulu /*@{*/
54*91f16700Schasinglulu #define SC_RM_SPA_PASSTHRU  0U	/* Pass through (attribute driven by master) */
55*91f16700Schasinglulu #define SC_RM_SPA_PASSSID   1U	/* Pass through and output on SID */
56*91f16700Schasinglulu #define SC_RM_SPA_ASSERT    2U	/* Assert (force to be secure/privileged) */
57*91f16700Schasinglulu #define SC_RM_SPA_NEGATE    3U	/* Negate (force to be non-secure/user) */
58*91f16700Schasinglulu /*@}*/
59*91f16700Schasinglulu 
60*91f16700Schasinglulu /*!
61*91f16700Schasinglulu  * @name Defines for sc_rm_perm_t
62*91f16700Schasinglulu  */
63*91f16700Schasinglulu /*@{*/
64*91f16700Schasinglulu #define SC_RM_PERM_NONE         0U	/* No access */
65*91f16700Schasinglulu #define SC_RM_PERM_SEC_R        1U	/* Secure RO */
66*91f16700Schasinglulu #define SC_RM_PERM_SECPRIV_RW   2U	/* Secure privilege R/W */
67*91f16700Schasinglulu #define SC_RM_PERM_SEC_RW       3U	/* Secure R/W */
68*91f16700Schasinglulu #define SC_RM_PERM_NSPRIV_R     4U	/* Secure R/W, non-secure privilege RO */
69*91f16700Schasinglulu #define SC_RM_PERM_NS_R         5U	/* Secure R/W, non-secure RO */
70*91f16700Schasinglulu #define SC_RM_PERM_NSPRIV_RW    6U	/* Secure R/W, non-secure privilege R/W */
71*91f16700Schasinglulu #define SC_RM_PERM_FULL         7U	/* Full access */
72*91f16700Schasinglulu /*@}*/
73*91f16700Schasinglulu 
74*91f16700Schasinglulu /* Types */
75*91f16700Schasinglulu 
76*91f16700Schasinglulu /*!
77*91f16700Schasinglulu  * This type is used to declare a resource partition.
78*91f16700Schasinglulu  */
79*91f16700Schasinglulu typedef uint8_t sc_rm_pt_t;
80*91f16700Schasinglulu 
81*91f16700Schasinglulu /*!
82*91f16700Schasinglulu  * This type is used to declare a memory region.
83*91f16700Schasinglulu  */
84*91f16700Schasinglulu typedef uint8_t sc_rm_mr_t;
85*91f16700Schasinglulu 
86*91f16700Schasinglulu /*!
87*91f16700Schasinglulu  * This type is used to declare a resource domain ID used by the
88*91f16700Schasinglulu  * isolation HW.
89*91f16700Schasinglulu  */
90*91f16700Schasinglulu typedef uint8_t sc_rm_did_t;
91*91f16700Schasinglulu 
92*91f16700Schasinglulu /*!
93*91f16700Schasinglulu  * This type is used to declare an SMMU StreamID.
94*91f16700Schasinglulu  */
95*91f16700Schasinglulu typedef uint16_t sc_rm_sid_t;
96*91f16700Schasinglulu 
97*91f16700Schasinglulu /*!
98*91f16700Schasinglulu  * This type is a used to declare master transaction attributes.
99*91f16700Schasinglulu  */
100*91f16700Schasinglulu typedef uint8_t sc_rm_spa_t;
101*91f16700Schasinglulu 
102*91f16700Schasinglulu /*!
103*91f16700Schasinglulu  * This type is used to declare a resource/memory region access permission.
104*91f16700Schasinglulu  * Refer to the XRDC2 Block Guide for more information.
105*91f16700Schasinglulu  */
106*91f16700Schasinglulu typedef uint8_t sc_rm_perm_t;
107*91f16700Schasinglulu 
108*91f16700Schasinglulu /* Functions */
109*91f16700Schasinglulu 
110*91f16700Schasinglulu /*!
111*91f16700Schasinglulu  * @name Partition Functions
112*91f16700Schasinglulu  * @{
113*91f16700Schasinglulu  */
114*91f16700Schasinglulu 
115*91f16700Schasinglulu /*!
116*91f16700Schasinglulu  * This function requests that the SC create a new resource partition.
117*91f16700Schasinglulu  *
118*91f16700Schasinglulu  * @param[in]     ipc          IPC handle
119*91f16700Schasinglulu  * @param[out]    pt           return handle for partition; used for subsequent function
120*91f16700Schasinglulu  *                             calls associated with this partition
121*91f16700Schasinglulu  * @param[in]     secure       boolean indicating if this partition should be secure; only
122*91f16700Schasinglulu  *                             valid if caller is secure
123*91f16700Schasinglulu  * @param[in]     isolated     boolean indicating if this partition should be HW isolated
124*91f16700Schasinglulu  *                             via XRDC; set SC_TRUE if new DID is desired
125*91f16700Schasinglulu  * @param[in]     restricted   boolean indicating if this partition should be restricted; set
126*91f16700Schasinglulu  *                             SC_TRUE if masters in this partition cannot create new partitions
127*91f16700Schasinglulu  * @param[in]     grant        boolean indicating if this partition should always grant
128*91f16700Schasinglulu  *                             access and control to the parent
129*91f16700Schasinglulu  * @param[in]     coherent     boolean indicating if this partition is coherent;
130*91f16700Schasinglulu  *                             set SC_TRUE if only this partition will contain both AP clusters
131*91f16700Schasinglulu  *                             and they will be coherent via the CCI
132*91f16700Schasinglulu  *
133*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
134*91f16700Schasinglulu  *
135*91f16700Schasinglulu  * Return errors:
136*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
137*91f16700Schasinglulu  * - SC_ERR_PARM if caller's partition is not secure but a new secure partition is requested,
138*91f16700Schasinglulu  * - SC_ERR_LOCKED if caller's partition is locked,
139*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if partition table is full (no more allocation space)
140*91f16700Schasinglulu  *
141*91f16700Schasinglulu  * Marking as non-secure prevents subsequent functions from configuring masters in this
142*91f16700Schasinglulu  * partition to assert the secure signal. If restricted then the new partition is limited
143*91f16700Schasinglulu  * in what functions it can call, especially those associated with managing partitions.
144*91f16700Schasinglulu  *
145*91f16700Schasinglulu  * The grant option is usually used to isolate a bus master's traffic to specific
146*91f16700Schasinglulu  * memory without isolating the peripheral interface of the master or the API
147*91f16700Schasinglulu  * controls of that master.
148*91f16700Schasinglulu  */
149*91f16700Schasinglulu sc_err_t sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure,
150*91f16700Schasinglulu 			       sc_bool_t isolated, sc_bool_t restricted,
151*91f16700Schasinglulu 			       sc_bool_t grant, sc_bool_t coherent);
152*91f16700Schasinglulu 
153*91f16700Schasinglulu /*!
154*91f16700Schasinglulu  * This function makes a partition confidential.
155*91f16700Schasinglulu  *
156*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
157*91f16700Schasinglulu  * @param[in]     pt          handle of partition that is granting
158*91f16700Schasinglulu  * @param[in]     retro       retroactive
159*91f16700Schasinglulu  *
160*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
161*91f16700Schasinglulu  *
162*91f16700Schasinglulu  * Return errors:
163*91f16700Schasinglulu  * - SC_PARM if \a pt out of range,
164*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's not allowed to change \a pt
165*91f16700Schasinglulu  * - SC_ERR_LOCKED if partition \a pt is locked
166*91f16700Schasinglulu  *
167*91f16700Schasinglulu  * Call to make a partition confidential. Confidential means only this
168*91f16700Schasinglulu  * partition should be able to grant access permissions to this partition.
169*91f16700Schasinglulu  *
170*91f16700Schasinglulu  * If retroactive, then all resources owned by other partitions will have
171*91f16700Schasinglulu  * access rights for this partition removed, even if locked.
172*91f16700Schasinglulu  */
173*91f16700Schasinglulu sc_err_t sc_rm_set_confidential(sc_ipc_t ipc, sc_rm_pt_t pt, sc_bool_t retro);
174*91f16700Schasinglulu 
175*91f16700Schasinglulu /*!
176*91f16700Schasinglulu  * This function frees a partition and assigns all resources to the caller.
177*91f16700Schasinglulu  *
178*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
179*91f16700Schasinglulu  * @param[in]     pt          handle of partition to free
180*91f16700Schasinglulu  *
181*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
182*91f16700Schasinglulu  *
183*91f16700Schasinglulu  * Return errors:
184*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
185*91f16700Schasinglulu  * - SC_PARM if \a pt out of range or invalid,
186*91f16700Schasinglulu  * - SC_ERR_NOACCESS if \a pt is the SC partition,
187*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt,
188*91f16700Schasinglulu  * - SC_ERR_LOCKED if \a pt or caller's partition is locked
189*91f16700Schasinglulu  *
190*91f16700Schasinglulu  * All resources, memory regions, and pads are assigned to the caller/parent.
191*91f16700Schasinglulu  * The partition watchdog is disabled (even if locked). DID is freed.
192*91f16700Schasinglulu  */
193*91f16700Schasinglulu sc_err_t sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt);
194*91f16700Schasinglulu 
195*91f16700Schasinglulu /*!
196*91f16700Schasinglulu  * This function returns the DID of a partition.
197*91f16700Schasinglulu  *
198*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
199*91f16700Schasinglulu  *
200*91f16700Schasinglulu  * @return Returns the domain ID (DID) of the caller's partition.
201*91f16700Schasinglulu  *
202*91f16700Schasinglulu  * The DID is a SoC-specific internal ID used by the HW resource
203*91f16700Schasinglulu  * protection mechanism. It is only required by clients when using the
204*91f16700Schasinglulu  * SEMA42 module as the DID is sometimes connected to the master ID.
205*91f16700Schasinglulu  */
206*91f16700Schasinglulu sc_rm_did_t sc_rm_get_did(sc_ipc_t ipc);
207*91f16700Schasinglulu 
208*91f16700Schasinglulu /*!
209*91f16700Schasinglulu  * This function forces a partition to use a specific static DID.
210*91f16700Schasinglulu  *
211*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
212*91f16700Schasinglulu  * @param[in]     pt          handle of partition to assign \a did
213*91f16700Schasinglulu  * @param[in]     did         static DID to assign
214*91f16700Schasinglulu  *
215*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
216*91f16700Schasinglulu  *
217*91f16700Schasinglulu  * Return errors:
218*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
219*91f16700Schasinglulu  * - SC_PARM if \a pt or \a did out of range,
220*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt,
221*91f16700Schasinglulu  * - SC_ERR_LOCKED if \a pt is locked
222*91f16700Schasinglulu  *
223*91f16700Schasinglulu  * Assumes no assigned resources or memory regions yet! The number of static
224*91f16700Schasinglulu  * DID is fixed by the SC at boot.
225*91f16700Schasinglulu  */
226*91f16700Schasinglulu sc_err_t sc_rm_partition_static(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_did_t did);
227*91f16700Schasinglulu 
228*91f16700Schasinglulu /*!
229*91f16700Schasinglulu  * This function locks a partition.
230*91f16700Schasinglulu  *
231*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
232*91f16700Schasinglulu  * @param[in]     pt          handle of partition to lock
233*91f16700Schasinglulu  *
234*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
235*91f16700Schasinglulu  *
236*91f16700Schasinglulu  * Return errors:
237*91f16700Schasinglulu  * - SC_PARM if \a pt out of range,
238*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt
239*91f16700Schasinglulu  *
240*91f16700Schasinglulu  * If a partition is locked it cannot be freed, have resources/pads assigned
241*91f16700Schasinglulu  * to/from it, memory regions created/assigned, DID changed, or parent changed.
242*91f16700Schasinglulu  */
243*91f16700Schasinglulu sc_err_t sc_rm_partition_lock(sc_ipc_t ipc, sc_rm_pt_t pt);
244*91f16700Schasinglulu 
245*91f16700Schasinglulu /*!
246*91f16700Schasinglulu  * This function gets the partition handle of the caller.
247*91f16700Schasinglulu  *
248*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
249*91f16700Schasinglulu  * @param[out]    pt          return handle for caller's partition
250*91f16700Schasinglulu  *
251*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
252*91f16700Schasinglulu  */
253*91f16700Schasinglulu sc_err_t sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt);
254*91f16700Schasinglulu 
255*91f16700Schasinglulu /*!
256*91f16700Schasinglulu  * This function sets a new parent for a partition.
257*91f16700Schasinglulu  *
258*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
259*91f16700Schasinglulu  * @param[in]     pt          handle of partition for which parent is to be
260*91f16700Schasinglulu  *                            changed
261*91f16700Schasinglulu  * @param[in]     pt_parent   handle of partition to set as parent
262*91f16700Schasinglulu  *
263*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
264*91f16700Schasinglulu  *
265*91f16700Schasinglulu  * Return errors:
266*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
267*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
268*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the parent of \a pt,
269*91f16700Schasinglulu  * - SC_ERR_LOCKED if either partition is locked
270*91f16700Schasinglulu  */
271*91f16700Schasinglulu sc_err_t sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_pt_t pt_parent);
272*91f16700Schasinglulu 
273*91f16700Schasinglulu /*!
274*91f16700Schasinglulu  * This function moves all movable resources/pads owned by a source partition
275*91f16700Schasinglulu  * to a destination partition. It can be used to more quickly set up a new
276*91f16700Schasinglulu  * partition if a majority of the caller's resources are to be moved to a
277*91f16700Schasinglulu  * new partition.
278*91f16700Schasinglulu  *
279*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
280*91f16700Schasinglulu  * @param[in]     pt_src      handle of partition from which resources should
281*91f16700Schasinglulu  *                            be moved from
282*91f16700Schasinglulu  * @param[in]     pt_dst      handle of partition to which resources should be
283*91f16700Schasinglulu  *                            moved to
284*91f16700Schasinglulu  * @param[in]     move_rsrc   boolean to indicate if resources should be moved
285*91f16700Schasinglulu  * @param[in]     move_pads   boolean to indicate if pads should be moved
286*91f16700Schasinglulu  *
287*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
288*91f16700Schasinglulu  *
289*91f16700Schasinglulu  * By default, all resources are movable. This can be changed using the
290*91f16700Schasinglulu  * sc_rm_set_resource_movable() function. Note all masters defaulted to SMMU
291*91f16700Schasinglulu  * bypass.
292*91f16700Schasinglulu  *
293*91f16700Schasinglulu  * Return errors:
294*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
295*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
296*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not \a pt_src or the
297*91f16700Schasinglulu  *   parent of \a pt_src,
298*91f16700Schasinglulu  * - SC_ERR_LOCKED if either partition is locked
299*91f16700Schasinglulu  */
300*91f16700Schasinglulu sc_err_t sc_rm_move_all(sc_ipc_t ipc, sc_rm_pt_t pt_src, sc_rm_pt_t pt_dst,
301*91f16700Schasinglulu 			sc_bool_t move_rsrc, sc_bool_t move_pads);
302*91f16700Schasinglulu 
303*91f16700Schasinglulu /* @} */
304*91f16700Schasinglulu 
305*91f16700Schasinglulu /*!
306*91f16700Schasinglulu  * @name Resource Functions
307*91f16700Schasinglulu  * @{
308*91f16700Schasinglulu  */
309*91f16700Schasinglulu 
310*91f16700Schasinglulu /*!
311*91f16700Schasinglulu  * This function assigns ownership of a resource to a partition.
312*91f16700Schasinglulu  *
313*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
314*91f16700Schasinglulu  * @param[in]     pt          handle of partition to which resource should be
315*91f16700Schasinglulu  *                            assigned
316*91f16700Schasinglulu  * @param[in]     resource    resource to assign
317*91f16700Schasinglulu  *
318*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
319*91f16700Schasinglulu  *
320*91f16700Schasinglulu  * This action resets the resource's master and peripheral attributes.
321*91f16700Schasinglulu  * Privilege attribute will be PASSTHRU, security attribute will be
322*91f16700Schasinglulu  * ASSERT if the partition si secure and NEGATE if it is not, and
323*91f16700Schasinglulu  * masters will defaulted to SMMU bypass. Access permissions will reset
324*91f16700Schasinglulu  * to SEC_RW for the owning partition only for secure partitions, FULL for
325*91f16700Schasinglulu  * non-secure. DEfault is no access by other partitions.
326*91f16700Schasinglulu  *
327*91f16700Schasinglulu  * Return errors:
328*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
329*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
330*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
331*91f16700Schasinglulu  *   of the owner,
332*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition or \a pt is locked
333*91f16700Schasinglulu  */
334*91f16700Schasinglulu sc_err_t sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource);
335*91f16700Schasinglulu 
336*91f16700Schasinglulu /*!
337*91f16700Schasinglulu  * This function flags resources as movable or not.
338*91f16700Schasinglulu  *
339*91f16700Schasinglulu  * @param[in]     ipc          IPC handle
340*91f16700Schasinglulu  * @param[in]     resource_fst first resource for which flag should be set
341*91f16700Schasinglulu  * @param[in]     resource_lst last resource for which flag should be set
342*91f16700Schasinglulu  * @param[in]     movable      movable flag (SC_TRUE is movable)
343*91f16700Schasinglulu  *
344*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
345*91f16700Schasinglulu  *
346*91f16700Schasinglulu  * Return errors:
347*91f16700Schasinglulu  * - SC_PARM if resources are out of range,
348*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not a parent of a resource owner,
349*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition is locked
350*91f16700Schasinglulu  *
351*91f16700Schasinglulu  * This function is used to determine the set of resources that will be
352*91f16700Schasinglulu  * moved using the sc_rm_move_all() function. All resources are movable
353*91f16700Schasinglulu  * by default so this function is normally used to prevent a set of
354*91f16700Schasinglulu  * resources from moving.
355*91f16700Schasinglulu  */
356*91f16700Schasinglulu sc_err_t sc_rm_set_resource_movable(sc_ipc_t ipc, sc_rsrc_t resource_fst,
357*91f16700Schasinglulu 				    sc_rsrc_t resource_lst, sc_bool_t movable);
358*91f16700Schasinglulu 
359*91f16700Schasinglulu /*!
360*91f16700Schasinglulu  * This function flags all of a subsystem's resources as movable
361*91f16700Schasinglulu  * or not.
362*91f16700Schasinglulu  *
363*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
364*91f16700Schasinglulu  * @param[in]     resource    resource to use to identify subsystem
365*91f16700Schasinglulu  * @param[in]     movable     movable flag (SC_TRUE is movable)
366*91f16700Schasinglulu  *
367*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
368*91f16700Schasinglulu  *
369*91f16700Schasinglulu  * Return errors:
370*91f16700Schasinglulu  * - SC_ERR_PARM if a function argument is out of range
371*91f16700Schasinglulu  *
372*91f16700Schasinglulu  * Note \a resource is used to find the associated subsystem. Only
373*91f16700Schasinglulu  * resources owned by the caller are set.
374*91f16700Schasinglulu  */
375*91f16700Schasinglulu sc_err_t sc_rm_set_subsys_rsrc_movable(sc_ipc_t ipc, sc_rsrc_t resource,
376*91f16700Schasinglulu 				       sc_bool_t movable);
377*91f16700Schasinglulu 
378*91f16700Schasinglulu /*!
379*91f16700Schasinglulu  * This function sets attributes for a resource which is a bus master (i.e.
380*91f16700Schasinglulu  * capable of DMA).
381*91f16700Schasinglulu  *
382*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
383*91f16700Schasinglulu  * @param[in]     resource    master resource for which attributes should apply
384*91f16700Schasinglulu  * @param[in]     sa          security attribute
385*91f16700Schasinglulu  * @param[in]     pa          privilege attribute
386*91f16700Schasinglulu  * @param[in]     smmu_bypass SMMU bypass mode
387*91f16700Schasinglulu  *
388*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
389*91f16700Schasinglulu  *
390*91f16700Schasinglulu  * Return errors:
391*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
392*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
393*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not a parent of the resource owner,
394*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition is locked
395*91f16700Schasinglulu  *
396*91f16700Schasinglulu  * This function configures how the HW isolation will see bus transactions
397*91f16700Schasinglulu  * from the specified master. Note the security attribute will only be
398*91f16700Schasinglulu  * changed if the caller's partition is secure.
399*91f16700Schasinglulu  */
400*91f16700Schasinglulu sc_err_t sc_rm_set_master_attributes(sc_ipc_t ipc, sc_rsrc_t resource,
401*91f16700Schasinglulu 				     sc_rm_spa_t sa, sc_rm_spa_t pa,
402*91f16700Schasinglulu 				     sc_bool_t smmu_bypass);
403*91f16700Schasinglulu 
404*91f16700Schasinglulu /*!
405*91f16700Schasinglulu  * This function sets the StreamID for a resource which is a bus master (i.e.
406*91f16700Schasinglulu  * capable of DMA).
407*91f16700Schasinglulu  *
408*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
409*91f16700Schasinglulu  * @param[in]     resource    master resource for which attributes should apply
410*91f16700Schasinglulu  * @param[in]     sid         StreamID
411*91f16700Schasinglulu  *
412*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
413*91f16700Schasinglulu  *
414*91f16700Schasinglulu  * Return errors:
415*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
416*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
417*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
418*91f16700Schasinglulu  *   of the owner,
419*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition is locked
420*91f16700Schasinglulu  *
421*91f16700Schasinglulu  * This function configures the SID attribute associated with all bus transactions
422*91f16700Schasinglulu  * from this master. Note 0 is not a valid SID as it is reserved to indicate
423*91f16700Schasinglulu  * bypass.
424*91f16700Schasinglulu  */
425*91f16700Schasinglulu sc_err_t sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource,
426*91f16700Schasinglulu 			      sc_rm_sid_t sid);
427*91f16700Schasinglulu 
428*91f16700Schasinglulu /*!
429*91f16700Schasinglulu  * This function sets access permissions for a peripheral resource.
430*91f16700Schasinglulu  *
431*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
432*91f16700Schasinglulu  * @param[in]     resource    peripheral resource for which permissions should apply
433*91f16700Schasinglulu  * @param[in]     pt          handle of partition \a perm should by applied for
434*91f16700Schasinglulu  * @param[in]     perm        permissions to apply to \a resource for \a pt
435*91f16700Schasinglulu  *
436*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
437*91f16700Schasinglulu  *
438*91f16700Schasinglulu  * Return errors:
439*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
440*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
441*91f16700Schasinglulu  *   of the owner,
442*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition is locked
443*91f16700Schasinglulu  * - SC_ERR_LOCKED if the \a pt is confidential and the caller isn't \a pt
444*91f16700Schasinglulu  *
445*91f16700Schasinglulu  * This function configures how the HW isolation will restrict access to a
446*91f16700Schasinglulu  * peripheral based on the attributes of a transaction from bus master.
447*91f16700Schasinglulu  */
448*91f16700Schasinglulu sc_err_t sc_rm_set_peripheral_permissions(sc_ipc_t ipc, sc_rsrc_t resource,
449*91f16700Schasinglulu 					  sc_rm_pt_t pt, sc_rm_perm_t perm);
450*91f16700Schasinglulu 
451*91f16700Schasinglulu /*!
452*91f16700Schasinglulu  * This function gets ownership status of a resource.
453*91f16700Schasinglulu  *
454*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
455*91f16700Schasinglulu  * @param[in]     resource    resource to check
456*91f16700Schasinglulu  *
457*91f16700Schasinglulu  * @return Returns a boolean (SC_TRUE if caller's partition owns the resource).
458*91f16700Schasinglulu  *
459*91f16700Schasinglulu  * If \a resource is out of range then SC_FALSE is returned.
460*91f16700Schasinglulu  */
461*91f16700Schasinglulu sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource);
462*91f16700Schasinglulu 
463*91f16700Schasinglulu /*!
464*91f16700Schasinglulu  * This function is used to test if a resource is a bus master.
465*91f16700Schasinglulu  *
466*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
467*91f16700Schasinglulu  * @param[in]     resource    resource to check
468*91f16700Schasinglulu  *
469*91f16700Schasinglulu  * @return Returns a boolean (SC_TRUE if the resource is a bus master).
470*91f16700Schasinglulu  *
471*91f16700Schasinglulu  * If \a resource is out of range then SC_FALSE is returned.
472*91f16700Schasinglulu  */
473*91f16700Schasinglulu sc_bool_t sc_rm_is_resource_master(sc_ipc_t ipc, sc_rsrc_t resource);
474*91f16700Schasinglulu 
475*91f16700Schasinglulu /*!
476*91f16700Schasinglulu  * This function is used to test if a resource is a peripheral.
477*91f16700Schasinglulu  *
478*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
479*91f16700Schasinglulu  * @param[in]     resource    resource to check
480*91f16700Schasinglulu  *
481*91f16700Schasinglulu  * @return Returns a boolean (SC_TRUE if the resource is a peripheral).
482*91f16700Schasinglulu  *
483*91f16700Schasinglulu  * If \a resource is out of range then SC_FALSE is returned.
484*91f16700Schasinglulu  */
485*91f16700Schasinglulu sc_bool_t sc_rm_is_resource_peripheral(sc_ipc_t ipc, sc_rsrc_t resource);
486*91f16700Schasinglulu 
487*91f16700Schasinglulu /*!
488*91f16700Schasinglulu  * This function is used to obtain info about a resource.
489*91f16700Schasinglulu  *
490*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
491*91f16700Schasinglulu  * @param[in]     resource    resource to inquire about
492*91f16700Schasinglulu  * @param[out]    sid         pointer to return StreamID
493*91f16700Schasinglulu  *
494*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
495*91f16700Schasinglulu  *
496*91f16700Schasinglulu  * Return errors:
497*91f16700Schasinglulu  * - SC_PARM if \a resource is out of range
498*91f16700Schasinglulu  */
499*91f16700Schasinglulu sc_err_t sc_rm_get_resource_info(sc_ipc_t ipc, sc_rsrc_t resource,
500*91f16700Schasinglulu 				 sc_rm_sid_t *sid);
501*91f16700Schasinglulu 
502*91f16700Schasinglulu /* @} */
503*91f16700Schasinglulu 
504*91f16700Schasinglulu /*!
505*91f16700Schasinglulu  * @name Memory Region Functions
506*91f16700Schasinglulu  * @{
507*91f16700Schasinglulu  */
508*91f16700Schasinglulu 
509*91f16700Schasinglulu /*!
510*91f16700Schasinglulu  * This function requests that the SC create a new memory region.
511*91f16700Schasinglulu  *
512*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
513*91f16700Schasinglulu  * @param[out]    mr          return handle for region; used for
514*91f16700Schasinglulu  *                            subsequent function calls
515*91f16700Schasinglulu  *                            associated with this region
516*91f16700Schasinglulu  * @param[in]     addr_start  start address of region (physical)
517*91f16700Schasinglulu  * @param[in]     addr_end    end address of region (physical)
518*91f16700Schasinglulu  *
519*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
520*91f16700Schasinglulu  *
521*91f16700Schasinglulu  * Return errors:
522*91f16700Schasinglulu  * - SC_ERR_PARM if the new memory region is misaligned,
523*91f16700Schasinglulu  * - SC_ERR_LOCKED if caller's partition is locked,
524*91f16700Schasinglulu  * - SC_ERR_PARM if the new memory region spans multiple existing regions,
525*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition does not own the memory containing
526*91f16700Schasinglulu  *   the new region,
527*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if memory region table is full (no more allocation
528*91f16700Schasinglulu  *   space)
529*91f16700Schasinglulu  *
530*91f16700Schasinglulu  * The area covered by the memory region must currently be owned by the caller.
531*91f16700Schasinglulu  * By default, the new region will have access permission set to allow the
532*91f16700Schasinglulu  * caller to access.
533*91f16700Schasinglulu  */
534*91f16700Schasinglulu sc_err_t sc_rm_memreg_alloc(sc_ipc_t ipc, sc_rm_mr_t *mr,
535*91f16700Schasinglulu 			    sc_faddr_t addr_start, sc_faddr_t addr_end);
536*91f16700Schasinglulu 
537*91f16700Schasinglulu /*!
538*91f16700Schasinglulu  * This function requests that the SC split a memory region.
539*91f16700Schasinglulu  *
540*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
541*91f16700Schasinglulu  * @param[in]     mr          handle of memory region to split
542*91f16700Schasinglulu  * @param[out]    mr_ret      return handle for new region; used for
543*91f16700Schasinglulu  *                            subsequent function calls
544*91f16700Schasinglulu  *                            associated with this region
545*91f16700Schasinglulu  * @param[in]     addr_start  start address of region (physical)
546*91f16700Schasinglulu  * @param[in]     addr_end    end address of region (physical)
547*91f16700Schasinglulu  *
548*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
549*91f16700Schasinglulu  *
550*91f16700Schasinglulu  * Return errors:
551*91f16700Schasinglulu  * - SC_ERR_PARM if the new memory region is not start/end part of mr,
552*91f16700Schasinglulu  * - SC_ERR_LOCKED if caller's partition is locked,
553*91f16700Schasinglulu  * - SC_ERR_PARM if the new memory region spans multiple existing regions,
554*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition does not own the memory containing
555*91f16700Schasinglulu  *   the new region,
556*91f16700Schasinglulu  * - SC_ERR_UNAVAILABLE if memory region table is full (no more allocation
557*91f16700Schasinglulu  *   space)
558*91f16700Schasinglulu  *
559*91f16700Schasinglulu  * Note the new region must start or end on the split region.
560*91f16700Schasinglulu  */
561*91f16700Schasinglulu sc_err_t sc_rm_memreg_split(sc_ipc_t ipc, sc_rm_mr_t mr,
562*91f16700Schasinglulu 			    sc_rm_mr_t *mr_ret, sc_faddr_t addr_start,
563*91f16700Schasinglulu 			    sc_faddr_t addr_end);
564*91f16700Schasinglulu 
565*91f16700Schasinglulu /*!
566*91f16700Schasinglulu  * This function frees a memory region.
567*91f16700Schasinglulu  *
568*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
569*91f16700Schasinglulu  * @param[in]     mr          handle of memory region to free
570*91f16700Schasinglulu  *
571*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
572*91f16700Schasinglulu  *
573*91f16700Schasinglulu  * Return errors:
574*91f16700Schasinglulu  * - SC_PARM if \a mr out of range or invalid,
575*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not a parent of \a mr,
576*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition of \a mr is locked
577*91f16700Schasinglulu  */
578*91f16700Schasinglulu sc_err_t sc_rm_memreg_free(sc_ipc_t ipc, sc_rm_mr_t mr);
579*91f16700Schasinglulu 
580*91f16700Schasinglulu /*!
581*91f16700Schasinglulu  * Internal SC function to find a memory region.
582*91f16700Schasinglulu  *
583*91f16700Schasinglulu  * @see sc_rm_find_memreg().
584*91f16700Schasinglulu  */
585*91f16700Schasinglulu /*!
586*91f16700Schasinglulu  * This function finds a memory region.
587*91f16700Schasinglulu  *
588*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
589*91f16700Schasinglulu  * @param[out]    mr          return handle for region; used for
590*91f16700Schasinglulu  *                            subsequent function calls
591*91f16700Schasinglulu  *                            associated with this region
592*91f16700Schasinglulu  * @param[in]     addr_start  start address of region to search for
593*91f16700Schasinglulu  * @param[in]     addr_end    end address of region to search for
594*91f16700Schasinglulu  *
595*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
596*91f16700Schasinglulu  *
597*91f16700Schasinglulu  * Return errors:
598*91f16700Schasinglulu  * - SC_ERR_NOTFOUND if region not found,
599*91f16700Schasinglulu  *
600*91f16700Schasinglulu  * Searches only for regions owned by the caller. Finds first
601*91f16700Schasinglulu  * region containing the range specified.
602*91f16700Schasinglulu  */
603*91f16700Schasinglulu sc_err_t sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr,
604*91f16700Schasinglulu 			   sc_faddr_t addr_start, sc_faddr_t addr_end);
605*91f16700Schasinglulu 
606*91f16700Schasinglulu /*!
607*91f16700Schasinglulu  * This function assigns ownership of a memory region.
608*91f16700Schasinglulu  *
609*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
610*91f16700Schasinglulu  * @param[in]     pt          handle of partition to which memory region
611*91f16700Schasinglulu  *                            should be assigned
612*91f16700Schasinglulu  * @param[in]     mr          handle of memory region to assign
613*91f16700Schasinglulu  *
614*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
615*91f16700Schasinglulu  *
616*91f16700Schasinglulu  * Return errors:
617*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
618*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the \a mr owner or parent
619*91f16700Schasinglulu  *   of the owner,
620*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition or \a pt is locked
621*91f16700Schasinglulu  */
622*91f16700Schasinglulu sc_err_t sc_rm_assign_memreg(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_mr_t mr);
623*91f16700Schasinglulu 
624*91f16700Schasinglulu /*!
625*91f16700Schasinglulu  * This function sets access permissions for a memory region.
626*91f16700Schasinglulu  *
627*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
628*91f16700Schasinglulu  * @param[in]     mr          handle of memory region for which permissions
629*91f16700Schasinglulu  *                            should apply
630*91f16700Schasinglulu  * @param[in]     pt          handle of partition \a perm should by
631*91f16700Schasinglulu  *                            applied for
632*91f16700Schasinglulu  * @param[in]     perm        permissions to apply to \a mr for \a pt
633*91f16700Schasinglulu  *
634*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
635*91f16700Schasinglulu  *
636*91f16700Schasinglulu  * Return errors:
637*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
638*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the region owner or parent
639*91f16700Schasinglulu  *   of the owner,
640*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition is locked
641*91f16700Schasinglulu  * - SC_ERR_LOCKED if the \a pt is confidential and the caller isn't \a pt
642*91f16700Schasinglulu  *
643*91f16700Schasinglulu  * This function configures how the HW isolation will restrict access to a
644*91f16700Schasinglulu  * memory region based on the attributes of a transaction from bus master.
645*91f16700Schasinglulu  */
646*91f16700Schasinglulu sc_err_t sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr,
647*91f16700Schasinglulu 				      sc_rm_pt_t pt, sc_rm_perm_t perm);
648*91f16700Schasinglulu 
649*91f16700Schasinglulu /*!
650*91f16700Schasinglulu  * This function gets ownership status of a memory region.
651*91f16700Schasinglulu  *
652*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
653*91f16700Schasinglulu  * @param[in]     mr          handle of memory region to check
654*91f16700Schasinglulu  *
655*91f16700Schasinglulu  * @return Returns a boolean (SC_TRUE if caller's partition owns the
656*91f16700Schasinglulu  * memory region).
657*91f16700Schasinglulu  *
658*91f16700Schasinglulu  * If \a mr is out of range then SC_FALSE is returned.
659*91f16700Schasinglulu  */
660*91f16700Schasinglulu sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr);
661*91f16700Schasinglulu 
662*91f16700Schasinglulu /*!
663*91f16700Schasinglulu  * This function is used to obtain info about a memory region.
664*91f16700Schasinglulu  *
665*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
666*91f16700Schasinglulu  * @param[in]     mr          handle of memory region to inquire about
667*91f16700Schasinglulu  * @param[out]    addr_start  pointer to return start address
668*91f16700Schasinglulu  * @param[out]    addr_end    pointer to return end address
669*91f16700Schasinglulu  *
670*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
671*91f16700Schasinglulu  *
672*91f16700Schasinglulu  * Return errors:
673*91f16700Schasinglulu  * - SC_PARM if \a mr is out of range
674*91f16700Schasinglulu  */
675*91f16700Schasinglulu sc_err_t sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr,
676*91f16700Schasinglulu 			       sc_faddr_t *addr_start, sc_faddr_t *addr_end);
677*91f16700Schasinglulu 
678*91f16700Schasinglulu /* @} */
679*91f16700Schasinglulu 
680*91f16700Schasinglulu /*!
681*91f16700Schasinglulu  * @name Pad Functions
682*91f16700Schasinglulu  * @{
683*91f16700Schasinglulu  */
684*91f16700Schasinglulu 
685*91f16700Schasinglulu /*!
686*91f16700Schasinglulu  * This function assigns ownership of a pad to a partition.
687*91f16700Schasinglulu  *
688*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
689*91f16700Schasinglulu  * @param[in]     pt          handle of partition to which pad should
690*91f16700Schasinglulu  *                            be assigned
691*91f16700Schasinglulu  * @param[in]     pad         pad to assign
692*91f16700Schasinglulu  *
693*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
694*91f16700Schasinglulu  *
695*91f16700Schasinglulu  * Return errors:
696*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is restricted,
697*91f16700Schasinglulu  * - SC_PARM if arguments out of range or invalid,
698*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not the pad owner or parent
699*91f16700Schasinglulu  *   of the owner,
700*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition or \a pt is locked
701*91f16700Schasinglulu  */
702*91f16700Schasinglulu sc_err_t sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad);
703*91f16700Schasinglulu 
704*91f16700Schasinglulu /*!
705*91f16700Schasinglulu  * This function flags pads as movable or not.
706*91f16700Schasinglulu  *
707*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
708*91f16700Schasinglulu  * @param[in]     pad_fst     first pad for which flag should be set
709*91f16700Schasinglulu  * @param[in]     pad_lst     last pad for which flag should be set
710*91f16700Schasinglulu  * @param[in]     movable     movable flag (SC_TRUE is movable)
711*91f16700Schasinglulu  *
712*91f16700Schasinglulu  * @return Returns an error code (SC_ERR_NONE = success).
713*91f16700Schasinglulu  *
714*91f16700Schasinglulu  * Return errors:
715*91f16700Schasinglulu  * - SC_PARM if pads are out of range,
716*91f16700Schasinglulu  * - SC_ERR_NOACCESS if caller's partition is not a parent of a pad owner,
717*91f16700Schasinglulu  * - SC_ERR_LOCKED if the owning partition is locked
718*91f16700Schasinglulu  *
719*91f16700Schasinglulu  * This function is used to determine the set of pads that will be
720*91f16700Schasinglulu  * moved using the sc_rm_move_all() function. All pads are movable
721*91f16700Schasinglulu  * by default so this function is normally used to prevent a set of
722*91f16700Schasinglulu  * pads from moving.
723*91f16700Schasinglulu  */
724*91f16700Schasinglulu sc_err_t sc_rm_set_pad_movable(sc_ipc_t ipc, sc_pad_t pad_fst,
725*91f16700Schasinglulu 			       sc_pad_t pad_lst, sc_bool_t movable);
726*91f16700Schasinglulu 
727*91f16700Schasinglulu /*!
728*91f16700Schasinglulu  * This function gets ownership status of a pad.
729*91f16700Schasinglulu  *
730*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
731*91f16700Schasinglulu  * @param[in]     pad         pad to check
732*91f16700Schasinglulu  *
733*91f16700Schasinglulu  * @return Returns a boolean (SC_TRUE if caller's partition owns the pad).
734*91f16700Schasinglulu  *
735*91f16700Schasinglulu  * If \a pad is out of range then SC_FALSE is returned.
736*91f16700Schasinglulu  */
737*91f16700Schasinglulu sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad);
738*91f16700Schasinglulu 
739*91f16700Schasinglulu /* @} */
740*91f16700Schasinglulu 
741*91f16700Schasinglulu /*!
742*91f16700Schasinglulu  * @name Debug Functions
743*91f16700Schasinglulu  * @{
744*91f16700Schasinglulu  */
745*91f16700Schasinglulu 
746*91f16700Schasinglulu /*!
747*91f16700Schasinglulu  * This function dumps the RM state for debug.
748*91f16700Schasinglulu  *
749*91f16700Schasinglulu  * @param[in]     ipc         IPC handle
750*91f16700Schasinglulu  */
751*91f16700Schasinglulu void sc_rm_dump(sc_ipc_t ipc);
752*91f16700Schasinglulu 
753*91f16700Schasinglulu /* @} */
754*91f16700Schasinglulu 
755*91f16700Schasinglulu #endif /* SCI_RM_API_H */
756*91f16700Schasinglulu 
757*91f16700Schasinglulu /**@}*/
758