]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/dspdce.git/blobdiff - src/ti/framework/dce/dce.c
get_rproc_info: Introduce new API to query remoteproc
[glsdk/dspdce.git] / src / ti / framework / dce / dce.c
index 0b7093d102663f9b9c85b13e8dbd68329686a91d..957bf6966e32bc4faecd2999e010304499a1b02f 100644 (file)
@@ -29,7 +29,7 @@
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
  */\r
-  \r
+\r
 #include <stdlib.h>\r
 #include <stdint.h>\r
 #include <string.h>\r
@@ -60,6 +60,7 @@
 #include <xdc/runtime/IHeap.h>\r
 #include <xdc/runtime/knl/Thread.h>\r
 #include <xdc/std.h>\r
+#include <ti/sysbios/utils/Load.h>\r
 \r
 #include "dce_priv.h"\r
 #include "dce_rpc.h"\r
@@ -98,16 +99,17 @@ typedef void (*DeleteFxn)(void *);
 /* DCE Server static function declarations */\r
 static Int32 engine_open(UInt32 size, UInt32 *data);\r
 static Int32 engine_close(UInt32 size, UInt32 *data);\r
+static Int32 get_rproc_info(UInt32 size, UInt32 *data);\r
 \r
 /* VIDDEC2 Decoder Server static function declarations */\r
 static VIDDEC2_Handle viddec2_create(Engine_Handle engine, String name, VIDDEC2_Params *params);\r
-static int viddec2_reloc(VIDDEC2_Handle handle, uint8_t *ptr, uint32_t len);                                    \r
-static int viddec2_control(VIDDEC2_Handle handle, VIDDEC2_Cmd id, VIDDEC2_DynamicParams *dynParams, \r
+static int viddec2_reloc(VIDDEC2_Handle handle, uint8_t *ptr, uint32_t len);\r
+static int viddec2_control(VIDDEC2_Handle handle, VIDDEC2_Cmd id, VIDDEC2_DynamicParams *dynParams,\r
                               VIDDEC2_Status *status );\r
 static int viddec2_process(VIDDEC2_Handle handle, XDM1_BufDesc *inBufs,\r
                          XDM_BufDesc *outBufs, VIDDEC2_InArgs *inArgs, VIDDEC2_OutArgs *outArgs );\r
-static int viddec2_delete(VIDDEC2_Handle handle);                                                       \r
-                                                \r
+static int viddec2_delete(VIDDEC2_Handle handle);\r
+\r
 static struct {\r
     CreateFxn  create;\r
     ControlFxn control;\r
@@ -124,7 +126,7 @@ static struct {
     },\r
 };\r
 \r
-\r
+#define UNIVERSAL_COPY_EXAMPLE\r
 /* Static version string buffer.\r
  * Note: codec version can be large. For example, h264vdec needs more than\r
  * 58 characters, or the query will fail. */\r
@@ -139,7 +141,7 @@ static char    version_buffer[VERSION_SIZE];
  * it gets populated in the future versions of framework components.\r
  *\r
  * Forced off mode during video decode/encode is not supported. */\r
-#if 0 \r
+#if 0\r
 static void dce_suspend()\r
 {\r
     INFO("Preparing for suspend...");\r
@@ -153,6 +155,7 @@ static void dce_resume()
 }\r
 #endif\r
 \r
+#ifdef UNIVERSAL_COPY_EXAMPLE\r
 static void get_universal_version(UNIVERSAL_Handle h, char *buffer, unsigned size)\r
 {\r
     UNIVERSAL_DynamicParams    params =\r
@@ -180,20 +183,59 @@ static void get_universal_version(UNIVERSAL_Handle h, char *buffer, unsigned siz
         ERROR("Unknown version Error = %d:: buffer = %p size = %d", s, buffer, size);\r
     }\r
 }\r
+#else\r
+static void get_viddec2_version(VIDDEC2_Handle h, char *buffer, unsigned size)\r
+{\r
+    VIDDEC2_DynamicParams    params =\r
+    {\r
+        .size = sizeof(VIDDEC2_DynamicParams),\r
+    };\r
+\r
+    VIDDEC2_Status    status =\r
+    {\r
+        .size = sizeof(VIDDEC2_Status),\r
+        .data =\r
+        {\r
+            .buf = (XDAS_Int8 *)buffer,\r
+            .bufSize = (XDAS_Int32)size,\r
+        },\r
+    };\r
+\r
+    XDAS_Int32    s;\r
+\r
+    memset(buffer, 0, size);\r
+    s = VIDDEC2_control(h, XDM_GETVERSION, &params, &status);\r
+\r
+    if( s != VIDDEC2_EOK ) {\r
+        ERROR("Unknown version Error = %d:: buffer = %p size = %d", s, buffer, size);\r
+    }\r
+}\r
+\r
+#endif\r
 \r
 // VIDDEC2_create wrapper, to display version string in the trace.\r
 static VIDDEC2_Handle viddec2_create(Engine_Handle engine, String name, VIDDEC2_Params *params)\r
 {\r
+#ifdef UNIVERSAL_COPY_EXAMPLE\r
     UNIVERSAL_Handle   h;\r
 \r
     DEBUG(">> engine=%08x, name=%s, params=%p", engine, name, params);\r
 \r
     h = UNIVERSAL_create(engine, name, (IUNIVERSAL_Params*)params);\r
-       \r
-       get_universal_version(h, version_buffer, VERSION_SIZE);\r
-       \r
-    INFO("Created codec %s: version %s", name, version_buffer);\r
-\r
+    if(h){\r
+       get_universal_version(h, version_buffer, VERSION_SIZE);\r
+        INFO("Created codec %s: version %s", name, version_buffer);\r
+      }\r
+#else\r
+    VIDDEC2_Handle    h;\r
+\r
+    h = VIDDEC2_create(engine, name, params);\r
+\r
+    if( h ) {\r
+        get_viddec2_version(h, version_buffer, VERSION_SIZE);\r
+        INFO("Created viddec2 %s: version %s", name, version_buffer);\r
+    }\r
+#endif\r
     return ((VIDDEC2_Handle)h);\r
 }\r
 \r
@@ -204,69 +246,74 @@ static int viddec2_reloc(VIDDEC2_Handle handle, uint8_t *ptr, uint32_t len)
 \r
 }\r
 \r
-static int viddec2_control(VIDDEC2_Handle handle, VIDDEC2_Cmd id, VIDDEC2_DynamicParams *dynParams, \r
+static int viddec2_control(VIDDEC2_Handle handle, VIDDEC2_Cmd id, VIDDEC2_DynamicParams *dynParams,\r
                               VIDDEC2_Status *status )\r
 {\r
    int ret = 0;\r
+#ifdef UNIVERSAL_COPY_EXAMPLE\r
    UNIVERSAL_DynamicParams udynParam;\r
    UNIVERSAL_Status ustatus;\r
-   \r
+\r
    udynParam.size = sizeof(UNIVERSAL_DynamicParams);\r
    ustatus.size = sizeof(UNIVERSAL_Status);\r
-   //System_printf("command id is %d\n", id);\r
 \r
    if(id == XDM_GETVERSION){\r
        ustatus.data.numBufs = 1;\r
           ustatus.data.descs[0].buf = status->data.buf;\r
           ustatus.data.descs[0].bufSize = status->data.bufSize;\r
      }\r
-  \r
-   ret = UNIVERSAL_control((UNIVERSAL_Handle)handle, (UNIVERSAL_Cmd)id, \r
+\r
+   ret = UNIVERSAL_control((UNIVERSAL_Handle)handle, (UNIVERSAL_Cmd)id,\r
                               &udynParam, &ustatus);\r
 \r
    /*universal copy supports only XDM_GETVERSION cmd id    */\r
-   /*This is to return success to VIDDEC2 application in case of other cmd ids */   \r
+   /*This is to return success to VIDDEC2 application in case of other cmd ids */\r
    if(ret == IUNIVERSAL_EFAIL)ret = IUNIVERSAL_EOK;\r
-   \r
+#else\r
+   ret = VIDDEC2_control(handle, id, dynParams, status);\r
+#endif\r
    return ret;\r
 }\r
 \r
 static int viddec2_process(VIDDEC2_Handle handle, XDM1_BufDesc *inBufs,\r
                          XDM_BufDesc *outBufs, VIDDEC2_InArgs *inArgs, VIDDEC2_OutArgs *outArgs )\r
-{    \r
+{\r
      int ret = 0;\r
+#ifdef UNIVERSAL_COPY_EXAMPLE\r
         XDM1_BufDesc inBuf, outBuf;\r
         UNIVERSAL_InArgs inArg;\r
         UNIVERSAL_OutArgs outArg;\r
-     \r
+\r
      inArg.size = sizeof(UNIVERSAL_InArgs);\r
-     outArg.size = sizeof(UNIVERSAL_OutArgs);  \r
+     outArg.size = sizeof(UNIVERSAL_OutArgs);\r
      outArg.extendedError = 0;\r
-        //System_printf("Before VIDDEC2 process\n");\r
-        \r
-        //System_printf("outptr = 0x%x, size = %d\n",outBufs->bufs[0],outBufs->bufSizes[0]);\r
+\r
         inBuf.numBufs = 1;\r
         outBuf.numBufs = 1;\r
         inBuf.descs[0].buf = inBufs->descs[0].buf;\r
         inBuf.descs[0].bufSize = inBufs->descs[0].bufSize;\r
-                \r
+\r
         outBuf.descs[0].buf = outBufs->bufs[0];\r
         outBuf.descs[0].bufSize = outBufs->bufSizes[0];\r
-                  \r
-     ret = UNIVERSAL_process((UNIVERSAL_Handle)handle, &inBuf, &outBuf, NULL, \r
-                               &inArg, &outArg);\r
 \r
-        //System_printf("After VIDDEC2 process\n");\r
-        return ret;                                     \r
+     ret = UNIVERSAL_process((UNIVERSAL_Handle)handle, &inBuf, &outBuf, NULL,\r
+                               &inArg, &outArg);\r
+#else\r
+    ret = VIDDEC2_process(handle, inBufs, outBufs, inArgs, outArgs);\r
+#endif\r
+         return ret;\r
 }\r
 \r
 static int viddec2_delete(VIDDEC2_Handle handle)\r
 {\r
-   //System_printf("Deleting VIDDEC2\n"); \r
+#ifdef UNIVERSAL_COPY_EXAMPLE\r
    UNIVERSAL_delete((UNIVERSAL_Handle)handle);\r
+#else\r
+   VIDDEC2_delete(handle);\r
+#endif\r
    return 0;\r
 }\r
-                                                 \r
+\r
 \r
 /*\r
  * RPC message handlers\r
@@ -281,10 +328,10 @@ static int connect(void *msg)
 \r
         FCSettings_init();\r
         Diags_setMask(FCSETTINGS_MODNAME "+12345678LEXAIZFS");\r
-                               \r
+\r
                CESettings_init();\r
         Diags_setMask(CESETTINGS_MODNAME "+12345678LEXAIZFS");\r
-                                       \r
+\r
         /*\r
             * Enable use of runtime Diags_setMask per module:\r
             *\r
@@ -293,7 +340,7 @@ static int connect(void *msg)
         Diags_setMask("ti.ipc.rpmsg.RPMessage=EXLFS");\r
         Diags_setMask("ti.ipc.rpmsg.VirtQueue=EXLFS");\r
     }\r
-       \r
+\r
          CERuntime_init();\r
 \r
       if( !suspend_initialised ) {\r
@@ -318,7 +365,7 @@ static Int32 engine_open(UInt32 size, UInt32 *data)
     dce_engine_open   *engine_open_msg = (dce_engine_open *)payload[0].data;\r
     Engine_Handle      eng_handle = NULL;\r
     Uint32             num_params = MmRpc_NUM_PARAMETERS(size);\r
-    \r
+\r
     DEBUG(">> engine_open");\r
     if( num_params != 1 ) {\r
         ERROR("Invalid number of params sent");\r
@@ -326,10 +373,10 @@ static Int32 engine_open(UInt32 size, UInt32 *data)
     }\r
 \r
     dce_inv(engine_open_msg);\r
-    \r
+\r
        eng_handle = Engine_open(engine_open_msg->name, engine_open_msg->engine_attrs, &engine_open_msg->error_code);\r
        DEBUG("<< engine=%08x, ec=%d", eng_handle, engine_open_msg->error_code);\r
-    \r
+\r
     dce_clean(engine_open_msg);\r
 \r
     return ((Int32)eng_handle);\r
@@ -355,6 +402,42 @@ static Int32 engine_close(UInt32 size, UInt32 *data)
     return (0);\r
 }\r
 \r
+#define INFO_TYPE_CPU_LOAD 0\r
+#define INFO_TYPE_TOTAL_HEAP_SIZE 1\r
+#define INFO_TYPE_AVAILABLE_HEAP_SIZE 2\r
+\r
+static Int32 get_rproc_info(UInt32 size, UInt32 *data)\r
+{\r
+    MmType_Param    *payload = (MmType_Param *)data;\r
+    Uint32           info_type = (Uint32)payload[0].data;\r
+    Uint32 output = 0;\r
+    Memory_Stats    stats;\r
+\r
+    switch(info_type)\r
+    {\r
+            case INFO_TYPE_CPU_LOAD:\r
+               output = Load_getCPULoad();\r
+                break;\r
+\r
+            case INFO_TYPE_TOTAL_HEAP_SIZE:\r
+                Memory_getStats(NULL, &stats);\r
+                output = stats.totalSize;\r
+                break;\r
+\r
+            case INFO_TYPE_AVAILABLE_HEAP_SIZE:\r
+                Memory_getStats(NULL, &stats);\r
+                output = stats.totalFreeSize;\r
+                break;\r
+\r
+            default:\r
+                System_printf("\n ERROR: Invalid INFO TYPE chosen \n");\r
+                break;\r
+    }\r
+\r
+    return output;\r
+}\r
+\r
+\r
 /*\r
   * codec_create\r
   */\r
@@ -377,7 +460,7 @@ static Int32 codec_create(UInt32 size, UInt32 *data)
         ERROR("invalid number of params sent");\r
         return (-1);\r
     }\r
-       \r
+\r
        if(codec_id != OMAP_DCE_VIDDEC2){\r
         ERROR("invalid codec id sent");\r
         return (-1);\r
@@ -386,7 +469,7 @@ static Int32 codec_create(UInt32 size, UInt32 *data)
     dce_inv(static_params);\r
 \r
     codec_handle = (void *)codec_fxns[codec_id].create(engine, codec_name, static_params);\r
-  \r
+\r
     DEBUG("<< codec_handle=%08x", codec_handle);\r
 \r
     dce_clean(static_params);\r
@@ -420,7 +503,7 @@ static int codec_control(UInt32 size, UInt32 *data)
         ERROR("invalid number of params sent");\r
         return (-1);\r
     }\r
-       \r
+\r
        if(codec_id != OMAP_DCE_VIDDEC2){\r
         ERROR("invalid codec id sent");\r
         return (-1);\r
@@ -430,7 +513,7 @@ static int codec_control(UInt32 size, UInt32 *data)
     dce_inv(status);\r
 \r
     ret = (uint32_t) codec_fxns[codec_id].control(codec_handle, cmd_id, dyn_params, status);\r
\r
+\r
     DEBUG("<< result=%d", ret);\r
 \r
     dce_clean(dyn_params);\r
@@ -459,18 +542,18 @@ static int codec_get_version(UInt32 size, UInt32 *data)
         ERROR("invalid number of params sent");\r
         return (-1);\r
     }\r
-       \r
+\r
        if(codec_id != OMAP_DCE_VIDDEC2){\r
         ERROR("invalid codec id sent");\r
         return (-1);\r
     }\r
-               \r
+\r
     version_buf = (void *)(H2P((MemHeader *)((IVIDDEC2_Status *)status)->data.buf));\r
-    \r
+\r
     dce_inv(dyn_params);\r
     dce_inv(status);\r
     dce_inv(version_buf);\r
-  \r
+\r
     ret = (uint32_t) codec_fxns[codec_id].control(codec_handle, XDM_GETVERSION, dyn_params, status);\r
 \r
     DEBUG("<< result=%d", ret);\r
@@ -562,7 +645,7 @@ static int codec_process(UInt32 size, UInt32 *data)
        void           *outBufptr  = (void *)payload[6].data;\r
     Int32           ret = 0;\r
     void           *outBufSize = NULL;\r
-       \r
+\r
     DEBUG(">> codec_process");\r
 \r
     if( num_params != 7 ) {\r
@@ -574,7 +657,7 @@ static int codec_process(UInt32 size, UInt32 *data)
         ERROR("invalid codec id sent");\r
         return (-1);\r
     }\r
-               \r
+\r
        outBufSize = (void *)(H2P((MemHeader *)((XDM_BufDesc *)outBufs)->bufSizes));\r
 \r
     dce_inv(inBufs);\r
@@ -583,12 +666,12 @@ static int codec_process(UInt32 size, UInt32 *data)
     dce_inv(outArgs);\r
        dce_inv(outBufptr);\r
     dce_inv(outBufSize);\r
-        \r
+\r
     DEBUG(">> codec=%p, inBufs=%p, outBufs=%p, inArgs=%p, outArgs=%p codec_id=%d",\r
           codec, inBufs, outBufs, inArgs, outArgs, codec_id);\r
 \r
     ret = codec_fxns[codec_id].process((void *)codec, inBufs, outBufs, inArgs, outArgs);\r
-         \r
+\r
 \r
     DEBUG("<< ret=%d extendedError=%08x", ret, ((VIDDEC3_OutArgs *)outArgs)->extendedError);\r
 \r
@@ -623,7 +706,7 @@ static int codec_delete(UInt32 size, UInt32 *data)
         ERROR("invalid number of params sent");\r
         return (-1);\r
     }\r
-       \r
+\r
        if(codec_id != OMAP_DCE_VIDDEC2){\r
         ERROR("invalid codec id sent");\r
         return (-1);\r
@@ -654,7 +737,8 @@ static RcmServer_FxnDesc    DCEServerFxnAry[] =
     { "codec_control",     (RcmServer_MsgFxn) codec_control },\r
     { "codec_get_version", (RcmServer_MsgFxn) codec_get_version },\r
     { "codec_process",     (RcmServer_MsgFxn) codec_process },\r
-    { "codec_delete",      (RcmServer_MsgFxn) codec_delete }\r
+    { "codec_delete",      (RcmServer_MsgFxn) codec_delete },\r
+    { "get_rproc_info",    (RcmServer_MsgFxn) get_rproc_info }\r
 };\r
 \r
 /* DCE Server skel function table */\r
@@ -722,7 +806,12 @@ static MmType_FxnSig    DCEServer_sigAry[] =
           { MmType_Dir_Out, MmType_Param_S32, 1 }, // return\r
           { MmType_Dir_In, MmType_Param_U32, 1 },\r
           { MmType_Dir_In, MmType_Param_U32, 1 }\r
-      } }\r
+     } },\r
+    { "get_rproc_info", 2,\r
+      {\r
+         { MmType_Dir_Out, MmType_Param_S32, 1 }, // return\r
+          { MmType_Dir_In, MmType_Param_U32, 1 }\r
+     } }\r
 };\r
 \r
 static MmType_FxnSigTab    dce_fxnSigTab =\r
@@ -739,7 +828,7 @@ static void dce_main(uint32_t arg0, uint32_t arg1)
 {\r
     int            err = 0;\r
     dce_connect    dce_connect_msg;\r
-    \r
+\r
     err = MmServiceMgr_init();  // MmServiceMgr_init() will always return MmServiceMgr_S_SUCCESS.\r
 \r
     // setup the RCM Server create params\r
@@ -751,7 +840,7 @@ static void dce_main(uint32_t arg0, uint32_t arg1)
 \r
     // Get the Service Manager handle\r
     err = MmServiceMgr_register(SERVER_NAME, &rpc_Params, &dce_fxnSigTab, dce_SrvDelNotification);\r
-       \r
+\r
     if( err < 0 ) {\r
         DEBUG("failed to start " SERVER_NAME " \n");\r
                //err = -1;\r
@@ -796,7 +885,7 @@ Bool dce_init(void)
     params.instance->name = "dce-server";\r
     params.priority = Thread_Priority_ABOVE_NORMAL;\r
        Task_create(dce_main, &params, NULL);\r
-    \r
+\r
     return (TRUE);\r
 }\r
 \r