[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20211022174258.GC3659113@p14s>
Date: Fri, 22 Oct 2021 11:42:58 -0600
From: Mathieu Poirier <mathieu.poirier@...aro.org>
To: Arnaud Pouliquen <arnaud.pouliquen@...s.st.com>
Cc: Bjorn Andersson <bjorn.andersson@...aro.org>,
Ohad Ben-Cohen <ohad@...ery.com>,
linux-remoteproc@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-stm32@...md-mailman.stormreply.com,
Rob Herring <robh@...nel.org>, Christoph Hellwig <hch@....de>,
Stefano Stabellini <stefanos@...inx.com>,
Bruce Ashfield <bruce.ashfield@...inx.com>
Subject: Re: [RFC PATCH 5/7] remoteproc: virtio: Create platform device for
the remoteproc_virtio
On Fri, Oct 01, 2021 at 12:12:32PM +0200, Arnaud Pouliquen wrote:
> Define a platform device for the remoteproc virtio to prepare the
> management of the remoteproc virtio as a platform device.
>
> The platform device allows to pass rproc_vdev_data platform data to
> specify properties that are stored in the rproc_vdev structure.
>
> Such approach will allow to preserve legacy remoteproc virtio device
> creation but also to probe the device using device tree mechanism.
>
> Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@...s.st.com>
> ---
> drivers/remoteproc/remoteproc_internal.h | 6 +++
> drivers/remoteproc/remoteproc_virtio.c | 65 ++++++++++++++++++++++++
> include/linux/remoteproc.h | 2 +
> 3 files changed, 73 insertions(+)
>
> diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h
> index 4ce012c353c0..1b963a8912ed 100644
> --- a/drivers/remoteproc/remoteproc_internal.h
> +++ b/drivers/remoteproc/remoteproc_internal.h
> @@ -24,6 +24,12 @@ struct rproc_debug_trace {
> struct rproc_mem_entry trace_mem;
> };
>
> +struct rproc_vdev_data {
s/rproc_vdev_data/rproc_vdev_pdata
> + u32 rsc_offset;
> + unsigned int id;
> + unsigned int index;
> +};
> +
> /* from remoteproc_core.c */
> void rproc_release(struct kref *kref);
> int rproc_of_parse_firmware(struct device *dev, int index,
> diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
> index c9eecd2f9fb2..9b2ab79e4c4c 100644
> --- a/drivers/remoteproc/remoteproc_virtio.c
> +++ b/drivers/remoteproc/remoteproc_virtio.c
> @@ -4,6 +4,7 @@
> *
> * Copyright (C) 2011 Texas Instruments, Inc.
> * Copyright (C) 2011 Google, Inc.
> + * Copyright (C) 2021 STMicroelectronics
> *
> * Ohad Ben-Cohen <ohad@...ery.com>
> * Brian Swetland <swetland@...gle.com>
> @@ -13,6 +14,7 @@
> #include <linux/dma-map-ops.h>
> #include <linux/dma-mapping.h>
> #include <linux/export.h>
> +#include <linux/of_platform.h>
> #include <linux/of_reserved_mem.h>
> #include <linux/remoteproc.h>
> #include <linux/virtio.h>
> @@ -571,3 +573,66 @@ void rproc_vdev_release(struct kref *ref)
>
> rproc_rvdev_remove_device(rvdev);
> }
> +
> +static int rproc_virtio_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct rproc_vdev_data *vdev_data = dev->platform_data;
> + struct rproc_vdev *rvdev;
> + struct rproc *rproc;
> +
> + if (!vdev_data)
> + return -EINVAL;
> +
> + rvdev = devm_kzalloc(dev, sizeof(*rvdev), GFP_KERNEL);
> + if (!rvdev)
> + return -ENOMEM;
> +
> + rproc = container_of(dev->parent, struct rproc, dev);
> +
> + rvdev->rsc_offset = vdev_data->rsc_offset;
> + rvdev->id = vdev_data->id;
> + rvdev->index = vdev_data->index;
> +
> + rvdev->pdev = pdev;
> + rvdev->rproc = rproc;
> +
> + platform_set_drvdata(pdev, rvdev);
> +
> + return rproc_rvdev_add_device(rvdev);
> +}
> +
> +static int rproc_virtio_remove(struct platform_device *pdev)
> +{
> + struct rproc_vdev *rvdev = dev_get_drvdata(&pdev->dev);
> + struct rproc *rproc = rvdev->rproc;
> + struct rproc_vring *rvring;
> + int id;
> +
> + for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) {
> + rvring = &rvdev->vring[id];
> + rproc_free_vring(rvring);
> + }
> +
> + rproc_remove_subdev(rproc, &rvdev->subdev);
> + rproc_unregister_rvdev(rvdev);
> + dev_dbg(&pdev->dev, "virtio dev %d removed\n", rvdev->index);
> +
> + return 0;
> +}
> +
> +/* Platform driver */
> +static const struct of_device_id rproc_virtio_match[] = {
> + { .compatible = "rproc-virtio", },
> + {},
> +};
> +
> +static struct platform_driver rproc_virtio_driver = {
> + .probe = rproc_virtio_probe,
> + .remove = rproc_virtio_remove,
> + .driver = {
> + .name = "rproc-virtio",
> + .of_match_table = rproc_virtio_match,
> + },
> +};
> +builtin_platform_driver(rproc_virtio_driver);
> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> index e0600e1e5c17..542a3d4664f2 100644
> --- a/include/linux/remoteproc.h
> +++ b/include/linux/remoteproc.h
> @@ -616,6 +616,7 @@ struct rproc_vring {
> * struct rproc_vdev - remoteproc state for a supported virtio device
> * @refcount: reference counter for the vdev and vring allocations
> * @subdev: handle for registering the vdev as a rproc subdevice
> + * @pdev: remoteproc virtio platform device
> * @dev: device struct used for reference count semantics
> * @id: virtio device id (as in virtio_ids.h)
> * @node: list node
> @@ -628,6 +629,7 @@ struct rproc_vdev {
> struct kref refcount;
>
> struct rproc_subdev subdev;
> + struct platform_device *pdev;
> struct device dev;
>
> unsigned int id;
> --
> 2.17.1
>
Powered by blists - more mailing lists