forked from Minki/linux
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:
parent
8f6c1d8c4f
commit
35a82b8713
@ -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,13 +972,16 @@ 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;
|
||||
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:
|
||||
if (err)
|
||||
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user