misc: fastrpc: Add fdlist implementation
Add fdlist implementation to support dma handles. fdlist is populated by DSP if any map is no longer used and it is freed during put_args. 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-11-srinivas.kandagatla@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
54f7c85be3
commit
8f6c1d8c4f
1 changed files with 32 additions and 4 deletions
|
@ -320,7 +320,8 @@ static void fastrpc_map_get(struct fastrpc_map *map)
|
||||||
kref_get(&map->refcount);
|
kref_get(&map->refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fastrpc_map_find(struct fastrpc_user *fl, int fd,
|
|
||||||
|
static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
|
||||||
struct fastrpc_map **ppmap)
|
struct fastrpc_map **ppmap)
|
||||||
{
|
{
|
||||||
struct fastrpc_map *map = NULL;
|
struct fastrpc_map *map = NULL;
|
||||||
|
@ -328,7 +329,6 @@ static int fastrpc_map_find(struct fastrpc_user *fl, int fd,
|
||||||
mutex_lock(&fl->mutex);
|
mutex_lock(&fl->mutex);
|
||||||
list_for_each_entry(map, &fl->maps, node) {
|
list_for_each_entry(map, &fl->maps, node) {
|
||||||
if (map->fd == fd) {
|
if (map->fd == fd) {
|
||||||
fastrpc_map_get(map);
|
|
||||||
*ppmap = map;
|
*ppmap = map;
|
||||||
mutex_unlock(&fl->mutex);
|
mutex_unlock(&fl->mutex);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -339,6 +339,17 @@ static int fastrpc_map_find(struct fastrpc_user *fl, int fd,
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fastrpc_map_find(struct fastrpc_user *fl, int fd,
|
||||||
|
struct fastrpc_map **ppmap)
|
||||||
|
{
|
||||||
|
int ret = fastrpc_map_lookup(fl, fd, ppmap);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
fastrpc_map_get(*ppmap);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void fastrpc_buf_free(struct fastrpc_buf *buf)
|
static void fastrpc_buf_free(struct fastrpc_buf *buf)
|
||||||
{
|
{
|
||||||
dma_free_coherent(buf->dev, buf->size, buf->virt,
|
dma_free_coherent(buf->dev, buf->size, buf->virt,
|
||||||
|
@ -411,7 +422,7 @@ static void fastrpc_context_free(struct kref *ref)
|
||||||
ctx = container_of(ref, struct fastrpc_invoke_ctx, refcount);
|
ctx = container_of(ref, struct fastrpc_invoke_ctx, refcount);
|
||||||
cctx = ctx->cctx;
|
cctx = ctx->cctx;
|
||||||
|
|
||||||
for (i = 0; i < ctx->nscalars; i++)
|
for (i = 0; i < ctx->nbufs; i++)
|
||||||
fastrpc_map_put(ctx->maps[i]);
|
fastrpc_map_put(ctx->maps[i]);
|
||||||
|
|
||||||
if (ctx->buf)
|
if (ctx->buf)
|
||||||
|
@ -969,9 +980,19 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
|
||||||
u32 kernel)
|
u32 kernel)
|
||||||
{
|
{
|
||||||
struct fastrpc_remote_arg *rpra = ctx->rpra;
|
struct fastrpc_remote_arg *rpra = ctx->rpra;
|
||||||
int i, inbufs;
|
struct fastrpc_user *fl = ctx->fl;
|
||||||
|
struct fastrpc_map *mmap = NULL;
|
||||||
|
struct fastrpc_invoke_buf *list;
|
||||||
|
struct fastrpc_phy_page *pages;
|
||||||
|
u64 *fdlist;
|
||||||
|
int i, inbufs, outbufs, handles;
|
||||||
|
|
||||||
inbufs = REMOTE_SCALARS_INBUFS(ctx->sc);
|
inbufs = REMOTE_SCALARS_INBUFS(ctx->sc);
|
||||||
|
outbufs = REMOTE_SCALARS_OUTBUFS(ctx->sc);
|
||||||
|
handles = REMOTE_SCALARS_INHANDLES(ctx->sc) + REMOTE_SCALARS_OUTHANDLES(ctx->sc);
|
||||||
|
list = fastrpc_invoke_buf_start(rpra, ctx->nscalars);
|
||||||
|
pages = fastrpc_phy_page_start(list, ctx->nscalars);
|
||||||
|
fdlist = (uint64_t *)(pages + inbufs + outbufs + handles);
|
||||||
|
|
||||||
for (i = inbufs; i < ctx->nbufs; ++i) {
|
for (i = inbufs; i < ctx->nbufs; ++i) {
|
||||||
if (!ctx->maps[i]) {
|
if (!ctx->maps[i]) {
|
||||||
|
@ -988,6 +1009,13 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < FASTRPC_MAX_FDLIST; i++) {
|
||||||
|
if (!fdlist[i])
|
||||||
|
break;
|
||||||
|
if (!fastrpc_map_lookup(fl, (int)fdlist[i], &mmap))
|
||||||
|
fastrpc_map_put(mmap);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue