misc: fastrpc: Add dma handle implementation
authorVamsi Krishna Gattupalli <quic_vgattupa@quicinc.com>
Mon, 14 Feb 2022 16:10:01 +0000 (16:10 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 18 Mar 2022 13:11:00 +0000 (14:11 +0100)
The remote arguments carry both remote buffers and dma handles. Add proper
dma handle instructions to make it compatible with DSP implementation.

Signed-off-by: Vamsi Krishna Gattupalli <quic_vgattupa@quicinc.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20220214161002.6831-12-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/fastrpc.c

index e11b790ce52674d6428954176e48a80fb8f3a7c5..ae32781101e2e6db8c550958fbfb93749bf18f07 100644 (file)
@@ -101,9 +101,20 @@ struct fastrpc_invoke_buf {
        u32 pgidx;              /* index to start of contiguous region */
 };
 
-struct fastrpc_remote_arg {
-       u64 pv;
-       u64 len;
+struct fastrpc_remote_dmahandle {
+       s32 fd;         /* dma handle fd */
+       u32 offset;     /* dma handle offset */
+       u32 len;        /* dma handle length */
+};
+
+struct fastrpc_remote_buf {
+       u64 pv;         /* buffer pointer */
+       u64 len;        /* length of buffer */
+};
+
+union fastrpc_remote_arg {
+       struct fastrpc_remote_buf buf;
+       struct fastrpc_remote_dmahandle dma;
 };
 
 struct fastrpc_mmap_rsp_msg {
@@ -217,7 +228,7 @@ struct fastrpc_invoke_ctx {
        struct work_struct put_work;
        struct fastrpc_msg msg;
        struct fastrpc_user *fl;
-       struct fastrpc_remote_arg *rpra;
+       union fastrpc_remote_arg *rpra;
        struct fastrpc_map **maps;
        struct fastrpc_buf *buf;
        struct fastrpc_invoke_args *args;
@@ -767,7 +778,7 @@ get_err:
  * >>>>>>  START of METADATA <<<<<<<<<
  * +---------------------------------+
  * |           Arguments             |
- * | type:(struct fastrpc_remote_arg)|
+ * | type:(union fastrpc_remote_arg)|
  * |             (0 - N)             |
  * +---------------------------------+
  * |         Invoke Buffer list      |
@@ -792,7 +803,7 @@ static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx)
 {
        int size = 0;
 
-       size = (sizeof(struct fastrpc_remote_arg) +
+       size = (sizeof(struct fastrpc_remote_buf) +
                sizeof(struct fastrpc_invoke_buf) +
                sizeof(struct fastrpc_phy_page)) * ctx->nscalars +
                sizeof(u64) * FASTRPC_MAX_FDLIST +
@@ -857,7 +868,7 @@ static struct fastrpc_phy_page *fastrpc_phy_page_start(struct fastrpc_invoke_buf
 static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
 {
        struct device *dev = ctx->fl->sctx->dev;
-       struct fastrpc_remote_arg *rpra;
+       union fastrpc_remote_arg *rpra;
        struct fastrpc_invoke_buf *list;
        struct fastrpc_phy_page *pages;
        int inbufs, i, oix, err = 0;
@@ -893,8 +904,8 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
                i = ctx->olaps[oix].raix;
                len = ctx->args[i].length;
 
-               rpra[i].pv = 0;
-               rpra[i].len = len;
+               rpra[i].buf.pv = 0;
+               rpra[i].buf.len = len;
                list[i].num = len ? 1 : 0;
                list[i].pgidx = i;
 
@@ -904,7 +915,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
                if (ctx->maps[i]) {
                        struct vm_area_struct *vma = NULL;
 
-                       rpra[i].pv = (u64) ctx->args[i].ptr;
+                       rpra[i].buf.pv = (u64) ctx->args[i].ptr;
                        pages[i].addr = ctx->maps[i]->phys;
 
                        mmap_read_lock(current->mm);
@@ -931,7 +942,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
                        if (rlen < mlen)
                                goto bail;
 
-                       rpra[i].pv = args - ctx->olaps[oix].offset;
+                       rpra[i].buf.pv = args - ctx->olaps[oix].offset;
                        pages[i].addr = ctx->buf->phys -
                                        ctx->olaps[oix].offset +
                                        (pkt_size - rlen);
@@ -945,7 +956,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
                }
 
                if (i < inbufs && !ctx->maps[i]) {
-                       void *dst = (void *)(uintptr_t)rpra[i].pv;
+                       void *dst = (void *)(uintptr_t)rpra[i].buf.pv;
                        void *src = (void *)(uintptr_t)ctx->args[i].ptr;
 
                        if (!kernel) {
@@ -961,12 +972,15 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
        }
 
        for (i = ctx->nbufs; i < ctx->nscalars; ++i) {
-               rpra[i].pv = (u64) ctx->args[i].ptr;
-               rpra[i].len = ctx->args[i].length;
                list[i].num = ctx->args[i].length ? 1 : 0;
                list[i].pgidx = i;
-               pages[i].addr = ctx->maps[i]->phys;
-               pages[i].size = ctx->maps[i]->size;
+               if (ctx->maps[i]) {
+                       pages[i].addr = ctx->maps[i]->phys;
+                       pages[i].size = ctx->maps[i]->size;
+               }
+               rpra[i].dma.fd = ctx->args[i].fd;
+               rpra[i].dma.len = ctx->args[i].length;
+               rpra[i].dma.offset = (u64) ctx->args[i].ptr;
        }
 
 bail:
@@ -979,7 +993,7 @@ bail:
 static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
                            u32 kernel)
 {
-       struct fastrpc_remote_arg *rpra = ctx->rpra;
+       union fastrpc_remote_arg *rpra = ctx->rpra;
        struct fastrpc_user *fl = ctx->fl;
        struct fastrpc_map *mmap = NULL;
        struct fastrpc_invoke_buf *list;
@@ -996,9 +1010,9 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
 
        for (i = inbufs; i < ctx->nbufs; ++i) {
                if (!ctx->maps[i]) {
-                       void *src = (void *)(uintptr_t)rpra[i].pv;
+                       void *src = (void *)(uintptr_t)rpra[i].buf.pv;
                        void *dst = (void *)(uintptr_t)ctx->args[i].ptr;
-                       u64 len = rpra[i].len;
+                       u64 len = rpra[i].buf.len;
 
                        if (!kernel) {
                                if (copy_to_user((void __user *)dst, src, len))