diff --git a/src/rm_policy.c b/src/rm_policy.c
index 3eba1b495e47a5cabca79aaa2e3e58ec5eb47e44..68d63931b1e4e7553f54c6d87695a48deaaffa89 100644 (file)
--- a/src/rm_policy.c
+++ b/src/rm_policy.c
* Policy DTB.
*/
uint32_t rmPolicyGetResourceBase(void *policyDtb, Rm_PolicyValidInstNode *validInstNode,
- int32_t resourceOffset, uint32_t allocType,
+ int32_t resourceOffset, Rm_PolicyCheckType policyCheckType,
int32_t *result)
{
@@ -699,12 +699,12 @@ uint32_t rmPolicyGetResourceBase(void *policyDtb, Rm_PolicyValidInstNode *validI
if ((strncmp(permission->instName, validInstNode->name, RM_NAME_MAX_CHARS) == 0) ||
(strncmp(permission->instName, Rm_policyAllInstances, RM_NAME_MAX_CHARS) == 0)) {
/* Check instance's permissions */
- if (RM_policy_GET_PERM(allocType, RM_POLICY_PERM_INIT_SHIFT) &&
+ if ((policyCheckType == Rm_policyCheck_INIT) &&
RM_policy_GET_PERM(permission->permissionBits, RM_POLICY_PERM_INIT_SHIFT)) {
resourceBase = assignment->resourceBase;
break;
}
- else if (RM_policy_GET_PERM(allocType, RM_POLICY_PERM_USE_SHIFT) &&
+ else if ((policyCheckType == Rm_policyCheck_USE) &&
RM_policy_GET_PERM(permission->permissionBits, RM_POLICY_PERM_USE_SHIFT)) {
resourceBase = assignment->resourceBase;
break;
@@ -714,7 +714,7 @@ uint32_t rmPolicyGetResourceBase(void *policyDtb, Rm_PolicyValidInstNode *validI
}
policyFreeAssignmentPermissions(permissionStart);
- if (resourceBase) {
+ if (resourceBase != RM_RESOURCE_BASE_UNSPECIFIED) {
break;
}
else {
@@ -731,9 +731,8 @@ uint32_t rmPolicyGetResourceBase(void *policyDtb, Rm_PolicyValidInstNode *validI
/* FUNCTION PURPOSE: Returns resource alignment value according to the Policy
***********************************************************************
- * DESCRIPTION: Returns a resource alignment value based on the resource
- * alignment assigned to the specified valid instance by the
- * Policy DTB.
+ * DESCRIPTION: Parses the policy DTB to find and return a resource's
+ * alignment.
*/
uint32_t rmPolicyGetResourceAlignment(void *policyDtb, int32_t resourceOffset)
{
return(resourceAlignment);
}
+/* FUNCTION PURPOSE: Returns resource CD allocation size according to the Policy
+ ***********************************************************************
+ * DESCRIPTION: Parses the policy DTB to find and return a resource's
+ * allocation size.
+ */
+uint32_t rmPolicyGetResourceCdAllocSize(void *policyDtb, int32_t resourceOffset)
+{
+ int32_t propertyOffset;
+ const char *propertyName;
+ int32_t propertyLen;
+ const void *propertyData;
+ Rm_ResourceValue *allocSizeList;
+ uint32_t resourceAllocSize = 0;
+
+ propertyOffset = fdt_first_property_offset(policyDtb, resourceOffset);
+ if (propertyOffset > RM_DTB_UTIL_STARTING_NODE_OFFSET) {
+ while (propertyOffset > RM_DTB_UTIL_STARTING_NODE_OFFSET) {
+ propertyData = fdt_getprop_by_offset(policyDtb, propertyOffset, &propertyName, &propertyLen);
+ if (rmDtbUtilPolicyGetPropertyType(propertyName) == Rm_policyPropType_CD_ALLOCATION_SIZE) {
+ allocSizeList = rmDtbUtilPolicyExtractCdAllocationSizes(propertyData, propertyLen);
+ resourceAllocSize = allocSizeList->value;
+ rmDtbUtilPolicyFreeCdAllocationSizes(allocSizeList);
+ }
+ propertyOffset = fdt_next_property_offset(policyDtb, propertyOffset);
+ }
+ }
+ return(resourceAllocSize);
+}
+
+
/* FUNCTION PURPOSE: Get a resource's offset into a Policy
***********************************************************************
* DESCRIPTION: Returns the location of the specified resource node
int32_t depth;
const char *nodeName;
- depth = RM_DTB_UTIL_STARTING_DEPTH;
- nodeOffset = RM_DTB_UTIL_STARTING_NODE_OFFSET;
-
- /* Find node offset for provided resource name */
- while ((nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) &&
- (depth >= RM_DTB_UTIL_STARTING_DEPTH)) {
- nodeOffset = fdt_next_node(policyDtb, nodeOffset, &depth);
- nodeName = fdt_get_name(policyDtb, nodeOffset, NULL);
-
- if (strncmp(nodeName, resourceName, RM_NAME_MAX_CHARS) == 0)
- {
- break;
+ if (policyDtb) {
+ depth = RM_DTB_UTIL_STARTING_DEPTH;
+ nodeOffset = RM_DTB_UTIL_STARTING_NODE_OFFSET;
+
+ /* Find node offset for provided resource name */
+ while ((nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) &&
+ (depth >= RM_DTB_UTIL_STARTING_DEPTH)) {
+ nodeOffset = fdt_next_node(policyDtb, nodeOffset, &depth);
+ if (depth < RM_DTB_UTIL_STARTING_DEPTH) {
+ /* Resource name not found */
+ nodeOffset = RM_SERVICE_DENIED_RES_DOES_NOT_EXIST;
+ }
+ else {
+ nodeName = fdt_get_name(policyDtb, nodeOffset, NULL);
+ if (strncmp(nodeName, resourceName, RM_NAME_MAX_CHARS) == 0) {
+ break;
+ }
+ }
}
}
-
- if (depth < RM_DTB_UTIL_STARTING_DEPTH) {
- /* Resource name not found */
- nodeOffset = RM_SERVICE_DENIED_RES_DOES_NOT_EXIST;
+ else {
+ nodeOffset = RM_ERROR_INSTANCE_HAS_NO_POLICY;
}
return(nodeOffset);
}