All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Loic Pallardy <loic.pallardy@st.com>
Cc: ohad@wizery.com, linux-remoteproc@vger.kernel.org,
	linux-kernel@vger.kernel.org, arnaud.pouliquen@st.com,
	benjamin.gaignard@linaro.org, s-anna@ti.com
Subject: Re: [PATCH v4 13/17] remoteproc: create vdev subdevice with specific dma memory pool
Date: Tue, 9 Oct 2018 22:58:23 -0700	[thread overview]
Message-ID: <20181010055823.GB20016@builder> (raw)
In-Reply-To: <1532697292-14272-14-git-send-email-loic.pallardy@st.com>

On Fri 27 Jul 06:14 PDT 2018, Loic Pallardy wrote:

> This patch creates a dedicated vdev subdevice for each vdev declared
> in firmware resource table and associates carveout named "vdev%dbuffer"
> (with %d vdev index in resource table) if any as dma coherent memory pool.
> 
> Then vdev subdevice is used as parent for virtio device.
> 
> Signed-off-by: Loic Pallardy <loic.pallardy@st.com>
> ---
>  drivers/remoteproc/remoteproc_core.c     | 35 +++++++++++++++++++++++---
>  drivers/remoteproc/remoteproc_internal.h |  1 +
>  drivers/remoteproc/remoteproc_virtio.c   | 42 +++++++++++++++++++++++++++++++-
>  include/linux/remoteproc.h               |  1 +
>  4 files changed, 75 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
> index 4edc6f0..adcc66e 100644
> --- a/drivers/remoteproc/remoteproc_core.c
> +++ b/drivers/remoteproc/remoteproc_core.c
> @@ -39,6 +39,7 @@
>  #include <linux/idr.h>
>  #include <linux/elf.h>
>  #include <linux/crc32.h>
> +#include <linux/of_reserved_mem.h>
>  #include <linux/virtio_ids.h>
>  #include <linux/virtio_ring.h>
>  #include <asm/byteorder.h>
> @@ -145,7 +146,7 @@ static void rproc_disable_iommu(struct rproc *rproc)
>  	iommu_domain_free(domain);
>  }
>  
> -static phys_addr_t rproc_va_to_pa(void *cpu_addr)
> +phys_addr_t rproc_va_to_pa(void *cpu_addr)
>  {
>  	/*
>  	 * Return physical address according to virtual address location
> @@ -160,6 +161,7 @@ static phys_addr_t rproc_va_to_pa(void *cpu_addr)
>  	WARN_ON(!virt_addr_valid(cpu_addr));
>  	return virt_to_phys(cpu_addr);
>  }
> +EXPORT_SYMBOL(rproc_va_to_pa);
>  
>  /**
>   * rproc_da_to_va() - lookup the kernel virtual address for a remoteproc address
> @@ -423,6 +425,20 @@ static void rproc_vdev_do_stop(struct rproc_subdev *subdev, bool crashed)
>  }
>  
>  /**
> + * rproc_rvdev_release() - release the existence of a rvdev
> + *
> + * @dev: the subdevice's dev
> + */
> +static void rproc_rvdev_release(struct device *dev)
> +{
> +	struct rproc_vdev *rvdev = container_of(dev, struct rproc_vdev, dev);
> +
> +	of_reserved_mem_device_release(dev);
> +
> +	kfree(rvdev);
> +}
> +
> +/**
>   * rproc_handle_vdev() - handle a vdev fw resource
>   * @rproc: the remote processor
>   * @rsc: the vring resource descriptor
> @@ -455,6 +471,7 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
>  	struct device *dev = &rproc->dev;
>  	struct rproc_vdev *rvdev;
>  	int i, ret;
> +	char name[16];
>  
>  	/* make sure resource isn't truncated */
>  	if (sizeof(*rsc) + rsc->num_of_vrings * sizeof(struct fw_rsc_vdev_vring)
> @@ -488,6 +505,18 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
>  	rvdev->rproc = rproc;
>  	rvdev->index = rproc->nb_vdev++;
>  
> +	/* Initialise vdev subdevice */
> +	snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index);
> +	rvdev->dev.parent = rproc->dev.parent;
> +	rvdev->dev.release = rproc_rvdev_release;
> +	dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name);
> +	dev_set_drvdata(&rvdev->dev, rvdev);
> +	dma_set_coherent_mask(&rvdev->dev, DMA_BIT_MASK(32));
> +
> +	ret = device_register(&rvdev->dev);
> +	if (ret)
> +		goto free_rvdev;
> +
>  	/* parse the vrings */
>  	for (i = 0; i < rsc->num_of_vrings; i++) {
>  		ret = rproc_parse_vring(rvdev, rsc, i);
> @@ -518,7 +547,7 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
>  	for (i--; i >= 0; i--)
>  		rproc_free_vring(&rvdev->vring[i]);
>  free_rvdev:
> -	kfree(rvdev);
> +	device_unregister(&rvdev->dev);
>  	return ret;
>  }
>  
> @@ -536,7 +565,7 @@ void rproc_vdev_release(struct kref *ref)
>  
>  	rproc_remove_subdev(rproc, &rvdev->subdev);
>  	list_del(&rvdev->node);
> -	kfree(rvdev);
> +	device_unregister(&rvdev->dev);
>  }
>  
>  /**
> diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h
> index f6cad24..bfeacfd 100644
> --- a/drivers/remoteproc/remoteproc_internal.h
> +++ b/drivers/remoteproc/remoteproc_internal.h
> @@ -52,6 +52,7 @@ struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc,
>  int rproc_alloc_vring(struct rproc_vdev *rvdev, int i);
>  
>  void *rproc_da_to_va(struct rproc *rproc, u64 da, int len);
> +phys_addr_t rproc_va_to_pa(void *cpu_addr);
>  int rproc_trigger_recovery(struct rproc *rproc);
>  
>  int rproc_elf_sanity_check(struct rproc *rproc, const struct firmware *fw);
> diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
> index de21f62..9ee63c0 100644
> --- a/drivers/remoteproc/remoteproc_virtio.c
> +++ b/drivers/remoteproc/remoteproc_virtio.c
> @@ -17,7 +17,9 @@
>   * GNU General Public License for more details.
>   */
>  
> +#include <linux/dma-mapping.h>
>  #include <linux/export.h>
> +#include <linux/of_reserved_mem.h>
>  #include <linux/remoteproc.h>
>  #include <linux/virtio.h>
>  #include <linux/virtio_config.h>
> @@ -315,10 +317,48 @@ static void rproc_virtio_dev_release(struct device *dev)
>  int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id)
>  {
>  	struct rproc *rproc = rvdev->rproc;
> -	struct device *dev = &rproc->dev;
> +	struct device *dev = &rvdev->dev;
>  	struct virtio_device *vdev = &rvdev->vdev;
> +	struct rproc_mem_entry *mem;
>  	int ret;
>  
> +	/* Try to find dedicated vdev buffer carveout */
> +	mem = rproc_find_carveout_by_name(rproc, "vdev%dbuffer", rvdev->index);
> +	if (mem) {
> +		phys_addr_t pa;
> +
> +		if (mem->of_resm_idx != -1) {
> +			struct device_node *np = rproc->dev.parent->of_node;
> +
> +			/* Associate reserved memory to vdev device */
> +			ret = of_reserved_mem_device_init_by_idx(dev, np,
> +								 mem->of_resm_idx);
> +			if (ret) {
> +				dev_err(dev, "Can't associate reserved memory\n");
> +				goto out;
> +			}
> +		} else {
> +			if (mem->va) {
> +				dev_warn(dev, "vdev %d buffer already mapped\n",
> +					 rvdev->index);
> +				pa = rproc_va_to_pa(mem->va);
> +			} else {
> +				/* Use dma address as carveout no memmapped yet */
> +				pa = (phys_addr_t)mem->dma;
> +			}
> +
> +			/* Associate vdev buffer memory pool to vdev subdev */
> +			ret = dmam_declare_coherent_memory(dev, pa,
> +							   mem->da,
> +							   mem->len,
> +							   DMA_MEMORY_EXCLUSIVE);

Is it not possible to associate the dma_mem with vdev->dev directly,
instead of injecting yet another device in-between the remoteproc
platform device and the virtio device?

That way the resulting allocation in e.g. virtio_rpmsg would be on the
virtio device itself, not its parent.

Regards,
Bjorn

> +			if (ret < 0) {
> +				dev_err(dev, "Failed to associate buffer\n");
> +				goto out;
> +			}
> +		}
> +	}
> +
>  	vdev->id.device	= id,
>  	vdev->config = &rproc_virtio_config_ops,
>  	vdev->dev.parent = dev;
> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> index 6b3a234..2921dd2 100644
> --- a/include/linux/remoteproc.h
> +++ b/include/linux/remoteproc.h
> @@ -547,6 +547,7 @@ struct rproc_vdev {
>  	struct kref refcount;
>  
>  	struct rproc_subdev subdev;
> +	struct device dev;
>  
>  	unsigned int id;
>  	struct list_head node;
> -- 
> 1.9.1
> 

  parent reply	other threads:[~2018-10-10  5:58 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-27 13:14 [PATCH v4 00/17] remoteproc: add fixed memory region support Loic Pallardy
2018-07-27 13:14 ` Loic Pallardy
2018-07-27 13:14 ` [PATCH v4 01/17] remoteproc: configure IOMMU only if device address requested Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 17:25   ` Suman Anna
2018-10-23 17:25     ` Suman Anna
2018-10-23 19:40     ` Loic PALLARDY
2018-10-24  3:46       ` Suman Anna
2018-10-24 12:56         ` Loic PALLARDY
2018-10-26  0:46           ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 02/17] remoteproc: add rproc_va_to_pa function Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 16:50   ` Suman Anna
2018-10-23 16:50     ` Suman Anna
2018-10-23 19:51     ` Loic PALLARDY
2018-10-24  3:19       ` Suman Anna
2018-10-24 12:58         ` Loic PALLARDY
2018-10-25 22:50           ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 03/17] remoteproc: add release ops in rproc_mem_entry struct Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 16:53   ` Suman Anna
2018-10-23 16:53     ` Suman Anna
2018-10-23 20:48     ` Suman Anna
2018-10-23 20:48       ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 04/17] remoteproc: add name " Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 17:06   ` Suman Anna
2018-10-23 17:06     ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 05/17] remoteproc: add helper function to allocate and init " Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 19:24   ` Suman Anna
2018-10-23 19:24     ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 06/17] remoteproc: introduce rproc_add_carveout function Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 17:05   ` Suman Anna
2018-10-23 17:05     ` Suman Anna
2018-10-23 19:48     ` Loic PALLARDY
2018-07-27 13:14 ` [PATCH v4 07/17] remoteproc: introduce rproc_find_carveout_by_name function Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 19:28   ` Suman Anna
2018-10-23 19:28     ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 08/17] remoteproc: add alloc ops in rproc_mem_entry struct Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 21:20   ` Suman Anna
2018-10-23 21:20     ` Suman Anna
2018-10-24 16:00     ` Loic PALLARDY
2018-10-25 22:37       ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 09/17] remoteproc: add helper function to allocate rproc_mem_entry from reserved memory Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-07-27 13:14 ` [PATCH v4 10/17] remoteproc: add helper function to check carveout device address Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-23 22:14   ` Suman Anna
2018-10-23 22:14     ` Suman Anna
2018-10-24 15:24     ` Loic PALLARDY
2018-10-25 22:50       ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 11/17] remoteproc: modify rproc_handle_carveout to support pre-registered region Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-07-27 13:14 ` [PATCH v4 12/17] remoteproc: modify vring allocation to rely on centralized carveout allocator Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-10  5:32   ` Bjorn Andersson
2018-10-10 18:58     ` Loic PALLARDY
2018-10-15  6:40       ` Bjorn Andersson
2018-10-15  6:40         ` Bjorn Andersson
2018-10-23 23:24         ` Suman Anna
2018-10-24  0:14   ` Suman Anna
2018-10-24  0:14     ` Suman Anna
2018-10-24 15:14     ` Loic PALLARDY
2018-10-29 20:17       ` Suman Anna
2018-12-04 17:56         ` Wendy Liang
2018-12-04 18:04           ` Loic PALLARDY
2018-12-04 18:58             ` Wendy Liang
2018-12-04 19:57               ` Loic PALLARDY
2018-12-04 21:24                 ` Wendy Liang
2018-07-27 13:14 ` [PATCH v4 13/17] remoteproc: create vdev subdevice with specific dma memory pool Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-09-27 17:17   ` Wendy Liang
2018-09-27 19:22     ` Loic PALLARDY
2018-09-27 20:18       ` Wendy Liang
2018-10-24  1:22         ` Suman Anna
2018-10-24  1:22           ` Suman Anna
2018-10-24  1:48           ` Suman Anna
2018-10-24  1:48             ` Suman Anna
2018-10-24 12:42             ` Loic PALLARDY
2018-10-25 22:06               ` Suman Anna
2018-10-24 12:40           ` Loic PALLARDY
2018-10-25 20:16             ` Suman Anna
2018-10-10  5:58   ` Bjorn Andersson [this message]
2018-10-10 19:17     ` Loic PALLARDY
2018-10-24  1:27       ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 14/17] remoteproc: keystone: declare reserved memory region for vdev device Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-07-27 13:14 ` [PATCH v4 15/17] remoteproc: da8xx: " Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-24  2:57   ` Suman Anna
2018-10-24  2:57     ` Suman Anna
2018-10-24 13:19     ` Loic PALLARDY
2018-10-25 22:11       ` Suman Anna
2018-07-27 13:14 ` [PATCH v4 16/17] remoteproc: st: add reserved memory support Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-10-24  3:01   ` Suman Anna
2018-10-24  3:01     ` Suman Anna
2018-10-24 12:37     ` Loic PALLARDY
2018-07-27 13:14 ` [PATCH v4 17/17] rpmsg: virtio: allocate buffer from parent Loic Pallardy
2018-07-27 13:14   ` Loic Pallardy
2018-09-28  7:56   ` Anup Patel
2018-09-21  6:04 ` [PATCH v4 00/17] remoteproc: add fixed memory region support Anup Patel
2018-09-26 16:00   ` Loic PALLARDY
2018-09-28  7:54     ` Anup Patel
2018-10-23 16:42 ` Suman Anna
2018-10-23 16:42   ` Suman Anna

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181010055823.GB20016@builder \
    --to=bjorn.andersson@linaro.org \
    --cc=arnaud.pouliquen@st.com \
    --cc=benjamin.gaignard@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=loic.pallardy@st.com \
    --cc=ohad@wizery.com \
    --cc=s-anna@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.