[LINUX] Expose API to lock and Unlock IO Buffers
authorSaurabh Bipin Chandra <a0131926@ti.com>
Fri, 30 Aug 2013 11:58:19 +0000 (17:28 +0530)
committerSaurabh Bipin Chandra <a0131926@ti.com>
Wed, 4 Sep 2013 12:38:50 +0000 (18:08 +0530)
This patch exposes APIs:
   dce_buf_lock(int num, size_t *handle)
   dce_buf_unlock(int num, size_t *handle)
to lock and unlock the Input/Output Buffers respectively.

The change is specific to GLP.
The DRM driver pins and unpins tiler address for the
IO Buffers whenever the rpmsg_rpc driver calls
map_attachment and unmap_attachment() respectively.
As the rpmsg_rpc driver invokes these calls during every
process call, the reference buffer addresses (address of
past locked buffers) held by the codec gets invalidated.
That is, these addresses will not continue to map to the
same memory region (YUV reference buffer) as before.

Most often, these virtual addresses may point to the
next YUV Buffer translated from the MPU.

These APIs put a condition on the map and unmap() within
rpmsg_rpc.

The expectation from the application is to
call dce_buf_lock() for the inArgs.inputID buffer
and dce_buf_unlock() for the outArgs.freeBufID buffer.

Change-Id: Ic749c6b18385f9052a2eeb4e16959063c5efab5e
Signed-off-by: Saurabh Bipin Chandra <a0131926@ti.com>
libdce.c
libdce.h

index 655f8a1ab412e6ac6f7e86ea501936ace2c71db0..b734f94ca067af6d5826d5d3f37b407ec12013b4 100644 (file)
--- a/libdce.c
+++ b/libdce.c
@@ -158,6 +158,53 @@ void dce_free(void *ptr)
     memplugin_free(ptr, TILER_1D_BUFFER);
 }
 
+#if defined(BUILDOS_LINUX)
+int dce_buf_lock(int num, size_t *handle)
+{
+    int                 i;
+    MmRpc_BufDesc      *desc = NULL;
+    dce_error_status    eError = DCE_EOK;
+
+    _ASSERT(num > 0, DCE_EINVALID_INPUT);
+
+    desc = memplugin_alloc(num * sizeof(MmRpc_BufDesc), 0, TILER_1D_BUFFER);
+    _ASSERT(desc != NULL, DCE_EOUT_OF_MEMORY);
+
+    for( i = 0; i < num; i++ ) {
+        desc[i].handle = handle[i];
+    }
+
+    eError = MmRpc_use(MmRpcHandle, MmRpc_BufType_Handle, num, desc);
+
+    _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
+EXIT:
+    return (eError);
+}
+
+int dce_buf_unlock(int num, size_t *handle)
+{
+    int                 i;
+    MmRpc_BufDesc      *desc = NULL;
+    dce_error_status    eError = DCE_EOK;
+
+    _ASSERT(num > 0, DCE_EINVALID_INPUT);
+
+    desc = memplugin_alloc(num * sizeof(MmRpc_BufDesc), 0, TILER_1D_BUFFER);
+    _ASSERT(desc != NULL, DCE_EOUT_OF_MEMORY);
+
+    for( i = 0; i < num; i++ ) {
+        desc[i].handle = handle[i];
+    }
+
+    eError = MmRpc_release(MmRpcHandle, MmRpc_BufType_Handle, num, desc);
+
+    _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
+EXIT:
+    return (eError);
+}
+
+#endif /* BUILDOS_LINUX */
+
 /*************** Startup/Shutdown Functions ***********************/
 static int dce_init(void)
 {
@@ -561,16 +608,17 @@ static XDAS_Int32 process(void *codec, void *inBufs, void *outBufs,
         }
     }
 
+    /* Output Buffers */
     for( count = 0; count < numOutBufs; count++, total_count++ ) {
         if(((XDM2_BufDesc *)outBufs)->descs[LUMA_BUF].buf != ((XDM2_BufDesc *)outBufs)->descs[CHROMA_BUF].buf ) {
-            /* MultiPlanar Buffers */
+            /* Either Encode usecase or MultiPlanar Buffers for Decode usecase */
             data_buf = (void * *)(&(((XDM2_BufDesc *)outBufs)->descs[count].buf));
             Fill_MmRpc_fxnCtx_Xlt_Array(&(fxnCtx.xltAry[total_count]), OUTBUFS_INDEX, (int32_t)outBufs,
                                         (int32_t)data_buf, (size_t)*data_buf);
         }
 #if defined(BUILDOS_LINUX)
         else {
-            /* SinglePlanar Buffers */
+            /* SinglePlanar Buffers for Decode usecase*/
             data_buf = (void * *)(&(((XDM2_BufDesc *)outBufs)->descs[count].buf));
             Fill_MmRpc_fxnCtx_Xlt_Array(&(fxnCtx.xltAry[total_count]), OUTBUFS_INDEX, (int32_t)outBufs,
                                         (int32_t)data_buf, (size_t)*data_buf);
index 9f7dcd763edf598c6fb522499de9a7744acd90f8..7a30563dc7646afc00f3dceaeaa5a45c4a1404e5 100644 (file)
--- a/libdce.h
+++ b/libdce.h
@@ -61,15 +61,33 @@ void dce_free(void *ptr);
 
 
 #if defined(BUILDOS_LINUX)
-void dce_set_fd(int fd);
-int dce_get_fd();
-
 /* avoid some messy stuff in xdc/std.h which leads to gcc issues */
 #define xdc__ARGTOPTR
 #define xdc__ARGTOFXN
 
-#define XDM_MEMTYPE_BO 10
-#define XDM_MEMTYPE_BO_OFFSET 11
+/*=====================================================================================*/
+/** dce_buf_lock            : Pin or lock Tiler Buffers which would be used by the codec
+ *                            as reference buffers. API is specific to GLP.
+ *
+ * @ param num    [in]      : Number of buffers to be locked.
+ * @ param handle [in]      : Pointer to array of DMA Buf FDs of the buffers to be locked.
+ * @ return                 : DCE error status is returned.
+ */
+int dce_buf_lock(int num, size_t *handle);
+
+/*=====================================================================================*/
+/** dce_buf_unlock          : Unpin or unlock Tiler Buffers which were locked to be used
+ *                            by the codec as reference buffers. API is specific to GLP.
+ *
+ * @ param num    [in]      : Number of buffers to be locked.
+ * @ param handle [in]      : Pointer to array of DMA Buf FDs of the buffers to be locked.
+ * @ return                 : DCE error status is returned.
+ */
+int dce_buf_unlock(int num, size_t *handle);
+
+void dce_set_fd(int fd);
+int dce_get_fd();
+
 #endif /* BUILDOS_LINUX */
 
 #endif /* __LIBDCE_H__ */