]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/rm-lld.git/blobdiff - rm_services.h
Made requesting instance's allocation count for resource available via the service...
[keystone-rtos/rm-lld.git] / rm_services.h
index f4b5e2493fdadeda15f3cb2e8d27d5ecd0cd0189..ec9c21e79c30b13f8858540658623bd4b1086035 100644 (file)
@@ -1,5 +1,5 @@
 /**
- *   @file  rmservices.h
+ *   @file  rm_services.h
  *
  *   @brief   
  *      This is the RM include file for services provided to components that 
@@ -7,7 +7,7 @@
  *
  *  \par
  *  ============================================================================
- *  @n   (C) Copyright 2012, Texas Instruments, Inc.
+ *  @n   (C) Copyright 2012-2013, Texas Instruments, Inc.
  * 
  *  Redistribution and use in source and binary forms, with or without 
  *  modification, are permitted provided that the following conditions 
@@ -40,8 +40,8 @@
  *  \par
 */
 
-#ifndef RMSERVICES_H_
-#define RMSERVICES_H_
+#ifndef RM_SERVICES_H_
+#define RM_SERVICES_H_
 
 #ifdef __cplusplus
 extern "C" {
@@ -51,263 +51,200 @@ extern "C" {
 #include <ti/drv/rm/rm.h>
 
 /**
-@addtogroup RMSERVICES_API
+@addtogroup RM_SERVICES_API
 @{
 */
 
-/** RM Service Request (serviceResult) Action Codes and Errors */
-/** RM Service Request Action Code Base */
-#define RM_SERVICE_ACTION_BASE (0)
-/** RM internal action okay - This value is for internal use by RM.  It should never be
- *  seen as a return value during normal operation */
-#define RM_SERVICE_ACTION_OKAY (RM_SERVICE_ACTION_BASE)
-/** RM service was approved.  The resource data in the response is valid if
- *  the service has been approved. */
-#define RM_SERVICE_APPROVED (RM_SERVICE_ACTION_BASE+1)
-/** Beginning of resource denied reasons */
-#define RM_SERVICE_DENIED_BEGIN (RM_SERVICE_ACTION_BASE+2)
-/** End of resource denied reasons */
-#define RM_SERVICE_DENIED_END (RM_SERVICE_ACTION_BASE+2)
-/** RM service is being processed.  Typically this means the service is
- *  being sent to a higher level RM agent for processing */
-#define RM_SERVICE_PROCESSING (RM_SERVICE_ACTION_BASE+3)
-
-/** RM Service Request Error Code Base */
-#define RM_SERVICE_ERROR_BASE (-64)
-/** RM service request type not recognized */
-#define RM_SERVICE_ERROR_INVALID_SERVICE_TYPE (RM_SERVICE_ERROR_BASE)
-/** RM Service request was not provided a component callback
- *  function.  Service requests may result in blocking operations.  A callback
- *  function must always be provided with a service request since
- *  blocked or non-blocked operations cannot be promised.  */
-#define RM_SERVICE_ERROR_CALLBACK_NOT_PROVIDED (RM_SERVICE_ERROR_BASE-1)
-/** RM service request needs to be forwarded to another RM agent but no transports
- *  have been registered */
-#define RM_SERVICE_ERROR_NO_TRANSPORT_REGISTERED (RM_SERVICE_ERROR_BASE-2)
-/** RM service request needs to be forwarded but no client delegate or server has 
- *  been registered with the RM instance */
-#define RM_SERVICE_ERROR_NOT_REGISTERED_WITH_DEL_OR_SERVER (RM_SERVICE_ERROR_BASE-3)
-/** RM service request needs to be forwarded but the transport packet alloc API
- *  has not been provided */
-#define RM_SERVICE_ERROR_TRANSPORT_PKT_ALLOC_API_NULL (RM_SERVICE_ERROR_BASE-4)
-/** A failure occurred within a registered transport's packet alloc API */
-#define RM_SERVICE_ERROR_TRANSPORT_ALLOC_PKT_ERROR (RM_SERVICE_ERROR_BASE-5)
-/** RM service request needs to be forwarded but the buffer allocated by transport
- *  is not large enough to fit the RM transport packet */
-#define RM_SERVICE_ERROR_TRANSPORT_PKT_BUF_TOO_SMALL (RM_SERVICE_ERROR_BASE-6)
-/** RM service request needs to be forwarded but the transport returned an error
- *  when trying to send the RM packet to the higher level agent */
-#define RM_SERVICE_ERROR_TRANPSPORT_SEND_ERROR (RM_SERVICE_ERROR_BASE-7)
-/** RM service response from higher level agent did not match any requests made
- *  by the provided RM instance */
-#define RM_SERVICE_ERROR_TRANSACTION_DOES_NOT_EXST_FOR_THIS_RM_INSTANCE (RM_SERVICE_ERROR_BASE-8)
-/** RM failed to allocate memory for new service transaction */
-#define RM_SERVICE_ERROR_TRANSACTION_FAILED_TO_ALLOCATE (RM_SERVICE_ERROR_BASE-9)
-/** RM found no service transactions queued when trying to delete a received service
- *  transaction */
-#define RM_SERVICE_ERROR_NO_TRANSACTIONS_IN_QUEUE (RM_SERVICE_ERROR_BASE-10)
-/** RM could not find the service transaction in the RM instance's transaction queue */
-#define RM_SERVICE_ERROR_SERVICE_TRANSACTION_DOES_NOT_EXIST (RM_SERVICE_ERROR_BASE-11)
-/** RM received a response transaction and found a request transaction awaiting a response.
- *  However, the request transaction was not in the "awaiting response" state */
-#define RM_SERVICE_ERROR_INVALID_REQUEST_TRANSACTION_STATE_UPON_RESPONSE (RM_SERVICE_ERROR_BASE-12)
-/** RM Client instance received a service transaction response that did not have a
- *  matching service request that originated on the Client instance */
-#define RM_SERVICE_ERROR_INVALID_TRANSACTION_RECEIVED_ON_CLIENT (RM_SERVICE_ERROR_BASE-13)
-/** A failure occurred within a registered transport's packet free API */
-#define RM_SERVICE_ERROR_TRANSPORT_FREE_PKT_ERROR (RM_SERVICE_ERROR_BASE-14)
-/** Invalid NameServer object create on non-Server instance */
-#define RM_SERVICE_ERROR_NAMESERVER_OBJECT_CREATE_ON_INVALID_INSTANCE (RM_SERVICE_ERROR_BASE-15)
-/** Invalid NameServer object delete on non-Server instance */
-#define RM_SERVICE_ERROR_NAMESERVER_OBJECT_DELETE_ON_INVALID_INSTANCE (RM_SERVICE_ERROR_BASE-16)
-
-/**
- * @brief Maximum number of characters in the resource names
- */
-#define RM_RESOURCE_NAME_MAX_CHARS (24)
-
 /** 
  * @brief RM service types
  */
 typedef enum {
-    /** First service type.  Used by RM for bounds checking.  Should
-     *  not be used by component. */
-    Rm_service_FIRST = 0,
-    /** RM resource allocate service */
-    Rm_service_RESOURCE_ALLOCATE = 0,
-    /** RM resource block allocate service */
-    Rm_service_RESOURCE_BLOCK_ALLOCATE = 1,
-    /** RM resource allocate by name service */
-    Rm_service_RESOURCE_ALLOCATE_BY_NAME = 2,    
+    /** RM resource allocate for initialization service */
+    Rm_service_RESOURCE_ALLOCATE_INIT = 0,
+    /** RM resource allocate for use service */
+    Rm_service_RESOURCE_ALLOCATE_USE,
     /** RM resource free service */
-    Rm_service_RESOURCE_FREE = 3,
-    /** RM resource block free service */
-    Rm_service_RESOURCE_BLOCK_FREE = 4,
-    /** RM resource free by name service */
-    Rm_service_RESOURCE_FREE_BY_NAME = 5,
-    /** RM resource mapping to name service */
-    Rm_service_RESOURCE_MAP_TO_NAME = 6,
-    /** RM resource name unmapping service */
-    Rm_service_RESOURCE_UNMAP_NAME = 7,
-    /** Last service type.  Used by RM for bounds checking.  Should
-     *  not be used by component. */
-    Rm_service_LAST = 7
+    Rm_service_RESOURCE_FREE,
+    /** RM resource status service - returns the reference count for specified
+     *  resource. */
+    Rm_service_RESOURCE_STATUS,
+    /** RM NameServer map resource to name service */
+    Rm_service_RESOURCE_MAP_TO_NAME,
+    /** RM NameServer get resource by name service */
+    Rm_service_RESOURCE_GET_BY_NAME,
+    /** RM NameServer unmap resource from name service */
+    Rm_service_RESOURCE_UNMAP_NAME,
+    /** DO NOT USE: Last type */
+    Rm_service_LAST
 } Rm_ServiceType;
 
 /** 
- * @brief RM pre-main allocation request information provided by the pre-main 
- *        startup function requesting the resource */
-typedef struct {
-    /** Pointer to the requested pre-main allocation resource name.  The 
-     *  name provided by the component must match the resource names
-     *  provided in the global resource table and allocation policies */
-    char *resourceName;
-    /** The pre-main allocation request resource base value.  For example, 
-     *  queue number or semaphore number */
-    uint32_t resourceBase;
-    /** Range of resource starting at resourceBase */
-    uint32_t resourceRange;
-} Rm_PreMainAllocInfo;
-
-/** 
- * @brief RM service response information provided by RM back to the 
- *        requesting component
+ * @brief RM service response information used by RM to provide service
+ *        request results back to the application components
  */
 typedef struct {
-    /** Result of the service request
-     *  Non-negative result: RM has taken an action based on the request
-     *  Negative result: RM has encountered an error handling the request */
-    int32_t serviceResult;
-    /** A request ID will be returned to the component if the requested service cannot
-     *  be completed immediately.  The request ID can be used by the component to identify
-     *  service responses received via the component callback function.  A request ID will not
-     *  be returned if the service request is satisfied immediately */
-    uint32_t requestId;
-    /** The base value of the returned resource.  In the case of a block resource allocation 
-     *  response this field will contain the base value of the block. */
-    int32_t resourceBase;
-    /** The range of resources starting from resourceBase allocated in block requests */
-    uint32_t resourceRange;
+    /** RM instance handle from which the service request that spawned this 
+     *  result originated.  Used by application to sort responses, received
+     *  via callback function, from RM instances located on the same core. */
+    Rm_Handle rmHandle;
+    /** Service request state.  State values can be found in rm.h starting
+     *  with #RM_SERVICE_PROCESSING, #RM_SERVICE_DENIED_BASE, and 
+     *  #RM_ERROR_LIBFDT_START */
+    int32_t   serviceState;
+    /** The service ID is returned to the application in order to match service
+     *  responses received at a later time via the provided callback function
+     *  because RM required a blocking operation in order to satisfy the
+     *  resource request. <br> <br> The service ID will never have a value of
+     *  zero. */
+    uint32_t  serviceId;
+    /** Affected resource name */
+    char      resourceName[RM_NAME_MAX_CHARS];
+    /** The resource base value allocated, freed, or mapped to NameServer name. */
+    int32_t   resourceBase;
+    /** The resource length starting at base allocated, freed, or mapped to
+     *  NameServer name. */
+    uint32_t  resourceLength;
+/** resourceNumOwners is not valid unless >= 0 */
+#define RM_RESOURCE_NUM_OWNERS_INVALID (-1)      
+    /** Current number of owners for the returned resource.  A value greater
+     *  than one means the resource is being shared.  This value is only valid
+     *  if the serviceState is RM_SERVICE_APPROVED or RM_SERVICE_APPROVED_STATIC. */
+    int32_t   resourceNumOwners;
+/** instAllocCount is not valid unless >= 0 */
+#define RM_INST_ALLOC_COUNT_INVALID (-1) 
+    /** Number of times the requesting instance has allocated the returned resource.
+     *  This value is only valid if the serviceState is RM_SERVICE_APPROVED or
+     *  RM_SERVICE_APPROVED_STATIC */
+    int32_t   instAllocCount;
 } Rm_ServiceRespInfo;
 
+/** 
+ * @brief RM service callback function
+ */
 typedef struct {
-    /** Component callback function.  RM will call this function when the 
-     *  resource service request is completed. The callback function supplied
-     *  for this parameter must match this function pointer prototype. */
+    /** Component callback function.  RM calls this function when a blocking 
+     *  resource service request is complete. The callback function supplied
+     *  for this parameter must match the function pointer prototype. */
     void (*serviceCallback) (Rm_ServiceRespInfo *serviceResponse);
 } Rm_ServiceCallback;
 
 /** 
- * @brief RM service request information provided by the requesting component
+ * @brief RM service request information
  */
 typedef struct {
-    /** The type of RM service requested */
-    Rm_ServiceType type;
-    /** Pointer to the name of the resource requested.  The 
-     *  name provided by the component must match the resource node names
-     *  provided in the global resource table and allocation policies */
-    char *resourceName;
-/** An allocate service can be requested with an unspecified resource base. 
- *  If this occurs the RM Client Delegate or Server will assign the next available
- *  resource or set of resources based on the allocation type. */
+    /** The type of service requested */
+    Rm_ServiceType      type;
+    /** Pointer to an array containing the resource name affected by
+     *  the request.  The resource name must match a resource node name
+     *  defined in the GRL and global/static policy.  The request will be
+     *  denied if the resource name does not match any resource node names
+     *  in the policy */
+    const char         *resourceName;
+/** Informs RM to find the next available resource block of length
+ *  resourceLength and alignment resourceAlignment for allocation.  This
+ *  parameter is only valid for resource allocate service types. */
 #define RM_RESOURCE_BASE_UNSPECIFIED (-1)  
-    /** The resource base value. */
-    int32_t resourceBase;
-    /** The range of the specified resource to be allocated starting from 
-     *  resourceBase.  Will be greater than one only for block allocate
-     *  and free service requests. */
-    uint32_t resourceRange;
-/** An allocate service can be requested with an unspecified resource alignment.
- *  WARNING: Only applicapable if resourceBase is unspecified
- *
- *  If the alignment is unspecified the RM Client Delegate or Server will allocate
- *  the resources from a default alignment as specified in the global policy. */
+    /** The base value of the resource affected by the service request.
+     *  #RM_RESOURCE_BASE_UNSPECIFIED can be substituted. */
+    int32_t             resourceBase;
+    /** The resource length, starting from #resourceBase affected by the
+     *  service request. */
+    uint32_t            resourceLength;
+/** Informs RM to find the next available resource block with length
+ *  resourceLength and the alignment specified in 
+ *  a) The resource node in the policy if it has the "allocation-alignment"
+ *     property defined.
+ *  b) The default alignment of 1 if no alignment is specified in the policy
+ *     for the resource.
+ *  This value is only valid if resourceBase is set to #RM_RESOURCE_BASE_UNSPECIFIED */
 #define RM_RESOURCE_ALIGNMENT_UNSPECIFIED (-1)      
-    /** Resource alignment in block allocation requests */
-    int32_t resourceAlignment;
-    /** The name server name associated with the resource.  Used only for 
-     *  allocate and free by name service requests */
-    char *resourceNsName;
-    /** Component specified callback function used by RM to inform components
-     *  of service requst results */
-    Rm_ServiceCallback callback;
+    /** Alignment of the resource affected by the service request.  Only valid
+     *  if resourceBase is set to #RM_RESOURCE_BASE_UNSPECIFIED.
+     *  #RM_RESOURCE_ALIGNMENT_UNSPECIFIED can be substituted. */
+    int32_t             resourceAlignment;
+    /** The NameServer name associated, or to be associated, with a resource. 
+     *  The NameServer name has precedence over #resourceBase and #resourceLength
+     *  for all resource modification service types as well as
+     *  #Rm_service_RESOURCE_GET_BY_NAME.  If the NameServer name and the base
+     *  and length are not NULL the resource information retrieved from the
+     *  NameServer entry for the name will replace the values present in
+     *  #resourceBase and #resourceLength */
+    const char         *resourceNsName;
+    /** Callback function used by RM to provide responses back to application
+     *  components after a service request resulted in a blocking operation.
+     *  If no callback function is provided the RM instance will block until
+     *  the service response is ready. */
+    Rm_ServiceCallback  callback;
 } Rm_ServiceReqInfo;
 
 /** 
- * @brief RM Service Port provided to software components and applications that 
- *        request RM services for the resources they wish to use
+ * @brief RM service handle provided to application components for requesting
+ *        services
  */
 typedef struct {
-    /** RM instance handle for which the service handle was registered */
+    /** RM instance handle from which the service handle was allocated from. */
     void *rmHandle;
     /**
      *  @b Description
      *  @n  
-     *      Callout function used by components to request a resource service 
-     *      from a RM instance
+     *      Processes service requests from application components.  Responses
+     *      are returned immediately if the service request could be satisfied 
+     *      without blocking.  If the service request requires a blocking operation,
+     *      such as forwarding the service request to another instance for
+     *      validation, the response will be received via the Rm_ServerCallback
      *
      *   @param[in] rmHandle
-     *      RM instance handle specifying the RM instance that should handle the
-     *      service request
+     *      RM instance handle specifies the instance that handles the service
+     *      request.  The request's result, if policy checks are involved, will be
+     *      based on the permissions assigned to the rmHandle's instance name within
+     *      global/static policy.
      *  
      *  @param[in]  serviceRequest
-     *      Service request structure that provides details of the service requested from
-     *      the RM instance tied to this component
+     *      Pointer to the service request structure
      *
-     *  @param[in]  serviceResponse
-     *      Service response structure that provides details of RM's response to the
-     *      service request
+     *  @param[out]  serviceResponse
+     *      Pointer to a service response structure.
      */
-    void (*rmService)(void *rmHandle, Rm_ServiceReqInfo *serviceRequest,
-                      Rm_ServiceRespInfo *serviceResponse);
-} Rm_ServicePort;
+    void (*Rm_serviceHandler)(void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
+                              Rm_ServiceRespInfo *serviceResponse);
+} Rm_ServiceHandle;
 
 /**
  *  @b Description
  *  @n  
- *      Non-blocking function used by RTSC pre-main startup functions to
- *      allocate RM resources for usage.  Pre-main allocated resources will be 
- *      validated by RM against a memory-mapped startup resource policy.
- *      Pre-main allocation of unauthorized resources will result in a system
- *      exception.
+ *      This function returns a RM service handle to the application to 
+ *      provide services to software components (LLDs, BIOS, etc) that want to use RM
+ *      for resource management. Only one service handle can be opened from
+ *      each RM instance.
  *
- *      Note: Resource pre-main allocations can only occur on a core that is 
- *            running a RM Server or Client Delegate that has a startup policy
- *            allowing the allocation of pre-main resources
- *
- *  @param[in]  preMainAllocInfo
- *      Resource pre-main allocation structure that provides details of the 
- *      resource requested from RM for preallocation
+ *  @param[in]  rmHandle
+ *      RM instance handle from which the service handle will be opened
  *
- *  @param[out] serviceResponse
- *      Contains the result information regarding the pre-main allocation request
+ *  @param[out] result
+ *      Pointer to a signed int used to return any errors encountered during
+ *      the instance initialization process.
  *
  *  @retval
- *      Success - 0 - Resource pre-main allocation request okay.
+ *      Success - Rm_ServiceHandle and result = #RM_OK
  *  @retval
- *      Failure - non-zero - Resource pre-main allocation request error.
+ *      Failure - NULL Rm_ServiceHandle and result = #RM_ERROR_SERVICE_HANDLE_MEM_ALLOC_FAILED
  */
-void Rm_preMainAllocService (Rm_PreMainAllocInfo *preMainAllocInfo,
-                             Rm_ServiceRespInfo *serviceResponse);
+Rm_ServiceHandle *Rm_serviceOpenHandle(Rm_Handle rmHandle, int32_t *result);
 
 /**
  *  @b Description
  *  @n  
- *      This function returns a RM service port to the application to 
- *      provide to software components (LLDs, BIOS, etc) that want to use RM
- *      for resource management.
+ *      This function closes a RM instance's service handle
  *
- *  @param[in]  rmHandle
- *      RM instance handle.  Used to return a Rm_ServicePort from an RM
- *      instance.
+ *  @param[in]  rmServiceHandle
+ *      RM instance service handle to be closed.
  *
  *  @retval
- *      Success - RM Service Port.  Used by an application or component to
- *                request a service from RM.
+ *      Success - #RM_OK
  *  @retval
- *      Failure - NULL
+ *      Failure - #RM_ERROR_SERVICE_HANDLE_ALREADY_CLOSED
  */
-Rm_ServicePort *Rm_getServicePort(Rm_Handle rmHandle);
+int32_t Rm_serviceCloseHandle(Rm_ServiceHandle *rmServiceHandle);
 
 /** 
 @} 
@@ -317,5 +254,5 @@ Rm_ServicePort *Rm_getServicePort(Rm_Handle rmHandle);
 }
 #endif
 
-#endif /* RMSERVICES_H_ */
+#endif /* RM_SERVICES_H_ */