lkml.org 
[lkml]   [2017]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC LINUX PATCH 11/19] remoteproc: Add rproc_idr_alloc/remove wrapper
    Date
    From: Wendy Liang <wendy.liang@xilinx.com>

    Add rproc_idr_alloc()/rproc_idr_remove() wrapper for
    id allocation/removal.

    Signed-off-by: Wendy Liang <jliang@xilinx.com>
    Signed-off-by: Michal Simek <michal.simek@xilinx.com>
    ---
    drivers/remoteproc/remoteproc_core.c | 46 ++++++++++++++++++++++++++++++++
    drivers/remoteproc/remoteproc_internal.h | 6 +++++
    2 files changed, 52 insertions(+)

    diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
    index e4fb289..d711345 100644
    --- a/drivers/remoteproc/remoteproc_core.c
    +++ b/drivers/remoteproc/remoteproc_core.c
    @@ -140,6 +140,52 @@ static void rproc_disable_iommu(struct rproc *rproc)
    }

    /**
    + * rproc_idr_alloc() - allocate id with idr_alloc()
    + * @rproc: handle of a remote processor
    + * @ptr: pointer to the resource to allocate id for
    + * @rsc_type: type of the resource for which to allocate id
    + * @start: start id
    + * @end: end id
    + *
    + * This function returns an ID from idr_alloc() or negative number
    + * if it fails.
    + */
    +int rproc_idr_alloc(struct rproc *rproc, void *ptr, unsigned int rsc_type,
    + int start, int end)
    +{
    + struct rproc_id_rsc *rsc;
    + int ret;
    +
    + rsc = kzalloc(sizeof(*rsc), GFP_KERNEL);
    + if (!rsc)
    + return -ENOMEM;
    +
    + rsc->rsc_ptr = ptr;
    + rsc->rsc_type = rsc_type;
    +
    + ret = idr_alloc(&rproc->notifyids, rsc, start, end, GFP_KERNEL);
    + if (ret < 0)
    + kfree(rsc);
    + return ret;
    +}
    +
    +/**
    + * rproc_idr_remove() - remove id with idr_remove()
    + * @rproc: handle of a remote processor
    + * @id: id to remove
    + */
    +void rproc_idr_remove(struct rproc *rproc, int id)
    +{
    + struct rproc_id_rsc *rsc;
    +
    + rsc = idr_find(&rproc->notifyids, id);
    + if (!rsc)
    + return;
    + idr_remove(&rproc->notifyids, id);
    + kfree(rsc);
    +}
    +
    +/**
    * rproc_da_to_va() - lookup the kernel virtual address for a remoteproc address
    * @rproc: handle of a remote processor
    * @da: remoteproc device address to translate
    diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h
    index 7e25621..865bd1c 100644
    --- a/drivers/remoteproc/remoteproc_internal.h
    +++ b/drivers/remoteproc/remoteproc_internal.h
    @@ -94,6 +94,12 @@ struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,
    int rproc_init_sysfs(void);
    void rproc_exit_sysfs(void);

    +/* rproc idr_alloc wrapper */
    +int rproc_idr_alloc(struct rproc *rproc, void *ptr, unsigned int rsc_type,
    + int start, int end);
    +/* rproc idr_remove wrapper */
    +void rproc_idr_remove(struct rproc *rproc, int id);
    +
    void rproc_free_vring(struct rproc_vring *rvring);
    int rproc_alloc_vring(struct rproc_vdev *rvdev, int i);

    --
    1.9.1
    \
     
     \ /
      Last update: 2017-03-24 20:32    [W:2.476 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site