Checking in RMv2 progress
[keystone-rtos/rm-lld.git] / include / rm_pvt.h
index 029b67171a1b71be35207fa3215404b996bcfe86..bbb1016f513ccad7b24665b3cf9df6dffdcf5f83 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  file  rm_pvt.h
  *
- *  Private data structures of Resource Manager Low Level Driver.
+ *  Private data structures of Resource Manager.
  *
  *  ============================================================================
  *      (C) Copyright 2012, Texas Instruments, Inc.
@@ -48,158 +48,9 @@ extern "C" {
 #include <c6x.h>
 
 /* RM includes */
-#include <ti/drv/rm/rm_public_lld.h>
-
-/* CSL includes */
-#include <ti/csl/csl_qm_queue.h>
-
-/* QMSS Resource Information */
-#define RM_QMSS_FIRMWARE_PDSPS 2
-#define RM_QMSS_QUEUES 8192
-#define RM_QMSS_MEM_REGIONS 20
-#define RM_QMSS_LINKING_RAM_RANGES 40 /* Twice as many memory regions */
-#define RM_QMSS_ACCUM_CH 48
-#define RM_QMSS_QOS_CLUSTER 8
-#define RM_QMSS_QOS_QUEUES 64
-
-#define RM_QMSS_LINKING_RAM_RANGE_INIT  (0xFFFFFFFF)
-
-/* CPPI Resource Information */
-
-/* Set CPPI DMA increments based on which DMAs are present for the device */
-
-/* Set AIF increment if present */
-#ifdef QMSS_MAX_AIF_QUEUE
-#define RM_CPPI_AIF_INC 1
-#else
-#define RM_CPPI_AIF_INC 0
-#endif
-/* Set FFTC A increment if present */
-#ifdef QMSS_MAX_FFTC_A_QUEUE
-#define RM_CPPI_FFTC_A_INC 1
-#else
-#define RM_CPPI_FFTC_A_INC 0
-#endif
-/* Set FFTC B increment if present */
-#ifdef QMSS_MAX_FFTC_B_QUEUE
-#define RM_CPPI_FFTC_B_INC 1
-#else
-#define RM_CPPI_FFTC_B_INC 0
-#endif
-/* Set PASS increment if present */
-#ifdef QMSS_MAX_PASS_QUEUE
-#define RM_CPPI_PASS_INC 1
-#else
-#define RM_CPPI_PASS_INC 0
-#endif
-/* Set FFTC C increment if present */
-#ifdef QMSS_MAX_FFTC_C_QUEUE
-#define RM_CPPI_FFTC_C_INC 1
-#else
-#define RM_CPPI_FFTC_C_INC 0
-#endif
-/* Set BCP increment if present */
-#ifdef QMSS_MAX_BCP_QUEUE
-#define RM_CPPI_BCP_INC 1
-#else
-#define RM_CPPI_BCP_INC 0
-#endif
-
-/* Base number of DMAs for all devices. */
-#define RM_CPPI_BASE_DMAS 2
-/* Set max DMAs, adding additional DMAs if present */
-#define RM_CPPI_MAX_DMAS (RM_CPPI_BASE_DMAS + RM_CPPI_AIF_INC + RM_CPPI_FFTC_A_INC + \
-                                                RM_CPPI_FFTC_B_INC + RM_CPPI_PASS_INC + RM_CPPI_FFTC_C_INC + \
-                                                RM_CPPI_BCP_INC)
-
-/* Set DMA indices based on which DMAs are present in device */
-#define RM_CPPI_SRIO_DMA_ID 0
-#define RM_CPPI_AIF_DMA_ID (RM_CPPI_SRIO_DMA_ID + RM_CPPI_AIF_INC)
-#define RM_CPPI_FFTC_A_DMA_ID (RM_CPPI_AIF_DMA_ID + RM_CPPI_FFTC_A_INC)
-#define RM_CPPI_FFTC_B_DMA_ID (RM_CPPI_FFTC_A_DMA_ID + RM_CPPI_FFTC_B_INC)
-#define RM_CPPI_PASS_DMA_ID (RM_CPPI_FFTC_B_DMA_ID + RM_CPPI_PASS_INC)
-#define RM_CPPI_QMSS_DMA_ID (RM_CPPI_PASS_DMA_ID + 1)
-#define RM_CPPI_FFTC_C_DMA_ID (RM_CPPI_QMSS_DMA_ID + RM_CPPI_FFTC_C_INC)
-#define RM_CPPI_BCP_DMA_ID (RM_CPPI_FFTC_C_DMA_ID + RM_CPPI_BCP_INC)
-
-#define RM_CPPI_SRIO_TX_CH 16
-#define RM_CPPI_AIF_TX_CH 129
-#define RM_CPPI_FFTC_A_TX_CH 4
-#define RM_CPPI_FFTC_B_TX_CH 4
-#define RM_CPPI_PASS_TX_CH 9
-#define RM_CPPI_QMSS_TX_CH 32
-#define RM_CPPI_FFTC_C_TX_CH 4
-#define RM_CPPI_BCP_TX_CH 8
-
-#define RM_CPPI_SRIO_RX_CH 16
-#define RM_CPPI_AIF_RX_CH 129
-#define RM_CPPI_FFTC_A_RX_CH 4
-#define RM_CPPI_FFTC_B_RX_CH 4
-#define RM_CPPI_PASS_RX_CH 24
-#define RM_CPPI_QMSS_RX_CH 32
-#define RM_CPPI_FFTC_C_RX_CH 4
-#define RM_CPPI_BCP_RX_CH 8
-
-#define RM_CPPI_SRIO_FLOW 20
-#define RM_CPPI_AIF_FLOW 129
-#define RM_CPPI_FFTC_A_FLOW 8
-#define RM_CPPI_FFTC_B_FLOW 8
-#define RM_CPPI_PASS_FLOW 32
-#define RM_CPPI_QMSS_FLOW 64
-#define RM_CPPI_FFTC_C_FLOW 8
-#define RM_CPPI_BCP_FLOW 64
-
-/* PA Resource Information */
-#define RM_PA_LUT 5
-
-/* Permissions Access Defines and Macros */
-#define RM_RESOURCE_PERM_INIT_SHIFT 0
-#define RM_RESOURCE_PERM_USE_SHIFT  1
-
-#define RM_GET_RESOURCE_FLAG(flag) ((flag) >> ((DNUM) << 1))
-
-#define RM_GET_RESOURCE_INIT_FLAG(flag) ((RM_GET_RESOURCE_FLAG (flag) >> RM_RESOURCE_PERM_INIT_SHIFT) & 1)
-#define RM_GET_RESOURCE_USE_FLAG(flag)  ((RM_GET_RESOURCE_FLAG (flag) >> RM_RESOURCE_PERM_USE_SHIFT)  & 1)
-
-#define RM_GET_PERMISSIONS(perms) (perms >> DNUM)
-
-#define RM_RANGE_CHECK(start, end, max, ret_val) \
-do { \
-    if ((start > end) || (end > max)) \
-    { \
-        return ret_val; \
-    } \
-} while(0)
-
-/* RM standard permission structure definition */
-typedef struct
-{
-    /** Initialization permissions
-      * Bit 0 - Core 0 init permission
-      * Bit 1 - Core 1 init permission
-      * Bit 2 - Core 2 init permission
-      * Bit 3 - Core 3 init permission
-      */    
-    uint32_t initPerms;  
-    /** Usage permissions
-      * Bit 0 - Core 0 use permission
-      * Bit 1 - Core 1 use permission
-      * Bit 2 - Core 2 use permission
-      * Bit 3 - Core 3 use permission
-      */    
-    uint32_t usePerms;
-} Rm_Perms;
-
-/* RM permissions structure for Linking RAM regions */
-typedef struct
-{
-    /** Linking RAM start index for these permissions */
-    uint32_t startIndex;
-    /** Linking RAM end index for these permissions */
-    uint32_t endIndex;
-    /** Permissions for the range */
-    Rm_Perms rangePerms;
-} Rm_qmssLinkingRamPerms;
+#include <ti/drv/rm/rm_services.h>
+#include <ti/drv/rm/rm_policy.h>
+#include <ti/drv/rm/rm_transport.h>
 
 /* RM permissions structure for CPPI DMA channels and flows */
 typedef struct
@@ -222,7 +73,7 @@ typedef struct
 
 #define RM_MAX_CACHE_ALIGN 128  /* Maximum alignment for cache line size */
 
-/* This macro generates compilier error if postulate is false, so 
+/* This macro generates compiler error if postulate is false, so 
  * allows 0 overhead compile time size check.  This "works" when
  * the expression contains sizeof() which otherwise doesn't work
  * with preprocessor */
@@ -264,63 +115,170 @@ typedef struct
                        (sizeof(Rm_Sync_Obj_Unpadded) % RM_MAX_CACHE_ALIGN)];
 } Rm_Sync_Obj;
 
+/** Maximum number of characters allowed for instance names */
+#define RM_INSTANCE_NAME_MAX_CHARS 24
+
+
+/** Assigned to the Start/EndIndex entries in the protocol packet to request
+ *  the next available resource instead of a specific index */
+#define RM_NEXT_AVAILABLE_RESOURCE (-1)
+
+/** Maximum size of a transmittable RM policy in bytes */
+#define RM_MAX_POLICY_SIZE_BYTES (64)  // Placeholder: This will change 
+                                       // during development
+
+/* Pointer to RM instance's transport routing map */
+typedef void *Rm_TransRouteMap;
+
+typedef Rm_ServiceResult Rm_TransactionResult;
+
+/**
+ * @brief RM transport routing map linked list node
+ */
+typedef struct {
+    /** Transport handle associated with this node */
+    Rm_TransportHandle transHandle;
+    /** The remote RM instance type associated with this node */
+    Rm_InstType remoteInstType;
+    /** Link to the next route node in the route map list */
+    Rm_TransRouteMapNode *nextNode;
+} Rm_TransRouteMapNode;
+
+/**
+ * @brief RM protocol commands.  The first N commands should be synchronized with
+ *        the Rm_ServiceType enum in rm_service.h
+ */
+typedef enum {
+    /** Resource allocation request */
+    Rm_command_ALLOCATE = Rm_service_RESOURCE_ALLOCATE,
+    /** Block resource allocation request */
+    Rm_command_BLOCK_ALLOCATE = Rm_service_RESOURCE_BLOCK_ALLOCATE,
+    /** Resource allocate by name */
+    Rm_command_ALLOCATE_NAMED = Rm_service_RESOURCE_ALLOCATE_BY_NAME,
+    /** Free resource */
+    Rm_command_FREE = Rm_service_RESOURCE_FREE,
+    /** Free resource block */
+    Rm_command_BLOCK_FREE = Rm_service_RESOURCE_BLOCK_FREE,
+    /** Free named resource */
+    Rm_command_FREE_NAMED = Rm_service_RESOURCE_FREE_BY_NAME,
+    /** Map provided name to specified resource index */
+    Rm_command_MAP_NAME = Rm_service_RESOURCE_MAP_TO_NAME,
+    /** Unmap provided name from tied resource */
+    Rm_command_UNMAP_NAME = Rm_service_RESOURCE_UNMAP_NAME,
+    /** Get the status of the specified resource */
+    Rm_command_RESOURCE_STATUS = Rm_service_RESOURCE_STATUS,
+    /** Policy request */
+    Rm_command_POLICY_REQUEST,
+    /** Policy response */
+    Rm_command_POLICY_RESPONSE
+} Rm_Command;
+
+/**
+ * @brief RM protocol packet resource information
+ */
+typedef struct {
+    /** Resource name of resource affected by command */
+    char resName[RM_MAX_RESOURCE_NAME_SIZE_BYTES];
+    /** If applicable, start of resource range affected by command */
+    int32_t resBase;
+    /** If applicable, number of specified resource affected by command */
+    int32_t resNum;
+    /** If applicable, the alignment of the resource affected by the command */
+    uint32_t resAlign;
+    /** If applicable, the NameServer name assigned to the specified
+     *  resource.  Used for commands centering on RM NameServer actions */
+    char resNsName[RM_MAX_RESOURCE_NAME_SIZE_BYTES];
+} Rm_ResourceInfo;
+
+/**
+ * @brief RM transaction is the internalized version of service requests received 
+ *        from components and RM commands received from other RM instances.
+ */
+typedef struct {
+    /* Transaction type */
+    Rm_Command transType;
+    /* Transaction details */
+    union {
+        /** If the command has to do with resources these fields
+         *  will contain the resource information */
+        Rm_ResourceInfo transInfo;
+        /** Pointer to policy data if the command has to do with policies */
+        char *policyData;
+    } u;
+} Rm_Transaction;
+
+/**
+ * @brief RM transaction contains transaction result information that is to be passed
+ *        back to the entity that was the source of the transaction.  The source can be
+ *        a component that requested a service or a RM instance that sent a command.
+ */
+typedef struct {
+    uint32_t transactionId;
+    uint32_t resBase;
+    uint32_t resNum;
+} Rm_TransactionReceipt;
+
+/**
+ * @brief RM protocol packet used to transmit RM commands and resources
+ *        between RM instances.
+ */
+typedef struct {
+    /** Packet ID - Used to synchronize sent command packets with any valid
+     *              response commands. */
+    uint32_t rmPktId;
+    /** Response Packet ID - If protocol packet is sent as response to a 
+     *                       received packet the response packet ID field will
+     *                       contain the pktID value of the request packet
+     *                       received */
+    uint32_t rmRespPktId;
+    /** RM Instance Name - Name of RM instance that is issuing the command.       
+     *                     The instance name will be used to validate the 
+     *                     command against the instance name data stored in
+     *                     the RM policy data */
+    char rmInstName[RM_INST_NAME_MAX_CHARS];
+    /** Command issued from source RM instance */
+    uint32_t rmCmd;
+    /** Response code provides requesting RM instance with information about
+     *  the result of any requests made */
+    uint32_t rmRespCode;
+    /** Union separating resource information from policy information */
+    union {
+        /** If the command has to do with one or more resources these fields
+         *  will contain the resource information */
+        Rm_ResourceInfo resInfo;
+        /** If the command has to do with a policy this array will hold the
+         *  policy data */
+        char rmPolicyData[RM_MAX_POLICY_SIZE_BYTES];
+    } u;
+} Rm_ProtocolPkt;
+
+typedef enum {
+    /** running */
+    RM_state_IDLE = 0,
+    /** handling request */
+    RM_state_HANDLING_REQUEST = 1,
+    /** etc...flesh all these out later will need states for the different alloc, free, request/response handlers */
+} Rm_State;
+
+typedef struct {
+    char name[RM_INSTANCE_NAME_MAX_CHARS];
+    Rm_InstType instType;
+    Rm_State instState;
+    bool registeredWithDelegateOrServer;
+    Rm_PolicyHandle instPolicy;  /* Client Delegate only? */
+
+    /* RM instance transport parameters */
+    Rm_TransRouteMap routeMap;
+    /* Transport API function pointers - not global in case application wants to
+      * hook up different transports to RM */
+    Rm_TransportCallouts transport;
+    /* Most of the time will be NULL.  Will be NULL if a service request has been made and a callback function
+     * has been specified.  In that case this variable will be populated until the callback is made */
+    void *serviceCallback;
+} Rm_Inst;
+
+Rm_Result Rm_getUsePermissions (Rm_Perms *resourcePermissions);
 
-/* RM Global permissions object definition. (unpadded) */
-typedef struct 
-{
-    /** Store the QMSS PDSP firmware permissions */
-    Rm_Perms *qmssPdspFirmwarePerms;  
-    /** Store a pointer to the QMSS queue permissions array */
-    Rm_Perms *qmssQueuePerms;
-    /** Store a pointer to the QMSS memory region permissions array */
-    Rm_Perms *qmssMemRegionPerms;
-    /** Store the QMSS Linking RAM Control permissions */
-    Rm_Perms qmssLinkRamControlPerms;
-    /** Store a pointer to the QMSS linking RAM permissions list */
-    Rm_qmssLinkingRamPerms *qmssLinkRamPerms;
-    /** Store a pointer to the QMSS accumulator channel permissions array */
-    Rm_Perms *qmssAccumChPerms;
-    /** Store the QMSS QOS PDSP timer permissions */
-    Rm_Perms qmssQosPdspTimerPerms;      
-    /** Store a pointer to the QMSS QOS cluster permissions array */
-    Rm_Perms *qmssQosClusterPerms;    
-    /** Store a pointer to the QMSS QOS queue permissions array */
-    Rm_Perms *qmssQosQueuePerms;       
-    /** Store the structure of pointers to the CPPI transmit channel permissions array */
-    Rm_CppiChAndFlowPerms cppiTxChPerms;
-    /** Store the structure of pointers to the CPPI receive channel permissions array */
-    Rm_CppiChAndFlowPerms cppiRxChPerms;
-    /** Store the structure of pointers to the CPPI flow permissions array */
-    Rm_CppiChAndFlowPerms cppiFlowPerms;
-    /** Store the PA firmware permissions */
-    Rm_Perms paFirmwarePerms;  
-    /** Store a pointer to the PA lookup table permissions array */
-    Rm_Perms *paLutPerms;    
-}Rm_GlobalPermissionsObj_Unpadded;
-
-/* RM Global Permissions Object (padded) */
-typedef struct
-{
-    /** Data structure without padding, so sizeof() can compute padding */
-    Rm_GlobalPermissionsObj_Unpadded obj;
-    /** Pad out to end of RM_MAX_CACHE_ALIGN bytes to prevent something else
-     * from being placed on same cache line as Rm_Synci_Obj.  Note that 
-     * pad[0] is illegal, so must add full RM_MAX_CACHE_ALIGN if structure
-     * is already padded by chance. */
-    uint8_t  pad[RM_MAX_CACHE_ALIGN - 
-                       (sizeof(Rm_GlobalPermissionsObj_Unpadded) % RM_MAX_CACHE_ALIGN)];
-} Rm_GlobalPermissionsObj;
-
-extern void Rm_permissionTableInit(void);
-extern void Rm_setTablePermissions (const Rm_Resource *resourceEntry, Rm_Perms *rmPermsArray, uint32_t len);
-extern Rm_Result Rm_populatePermissionTable(const Rm_Resource *rmResourceTable);
-extern void Rm_updatePermissionTable(void);
-extern Rm_Result Rm_getInitPermissions (Rm_Perms *resourcePermissions);
-extern Rm_Result Rm_getUsePermissions (Rm_Perms *resourcePermissions);
-
-/* Permission checker handlers */
-extern Rm_Result Rm_initPermissionChecker (Rm_ResourceInfo *resourceData);
-extern Rm_Result Rm_usePermissionChecker (Rm_ResourceInfo *resourceData);
 
 #ifdef __cplusplus
 }