misc: fastrpc: Add dma handle implementation

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>
This commit is contained in:
Vamsi Krishna Gattupalli 2022-02-14 16:10:01 +00:00 committed by Greg Kroah-Hartman
parent 8f6c1d8c4f
commit 35a82b8713

View File

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