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