linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Loic Pallardy <loic.pallardy@st.com>
To: <bjorn.andersson@linaro.org>, <ohad@wizery.com>
Cc: <linux-remoteproc@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <arnaud.pouliquen@st.com>,
	<benjamin.gaignard@linaro.org>,
	Loic Pallardy <loic.pallardy@st.com>
Subject: [PATCH v2 09/16] remoteproc: add memory device management support
Date: Thu, 30 Nov 2017 17:46:44 +0100	[thread overview]
Message-ID: <1512060411-729-10-git-send-email-loic.pallardy@st.com> (raw)
In-Reply-To: <1512060411-729-1-git-send-email-loic.pallardy@st.com>

This patch add functions to create and delete some
remoteproc sub-devices with dedicated dma coherent region.

These "memory devices" are identified by their name and
will be used for carveout, vring, buffers allocation
in specific memory region.

Signed-off-by: Loic Pallardy <loic.pallardy@st.com>
---
 drivers/remoteproc/remoteproc_core.c | 134 ++++++++++++++++++++++++++++++++---
 1 file changed, 123 insertions(+), 11 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index cc53247..76d54bf 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -69,6 +69,127 @@ static const char *rproc_crash_to_string(enum rproc_crash_type type)
 	return "unknown";
 }
 
+static phys_addr_t rproc_va_to_pa(void *cpu_addr)
+{
+	if (is_vmalloc_addr(cpu_addr)) {
+		return page_to_phys(vmalloc_to_page(cpu_addr)) +
+				    offset_in_page(cpu_addr);
+	}
+
+	WARN_ON(!virt_addr_valid(cpu_addr));
+	return virt_to_phys(cpu_addr);
+}
+
+struct rproc_memdev {
+	struct device dev;
+	struct rproc *rproc;
+	struct rproc_mem_entry *mem;
+};
+
+#define to_memdevice(d) container_of(d, struct rproc_memdev, dev)
+
+/**
+ * rproc_memdev_release() - release the existence of a memdevice
+ *
+ * @dev: the subdevice's dev
+ */
+static void rproc_memdev_release(struct device *dev)
+{
+	struct rproc_memdev *memd = to_memdevice(dev);
+
+	kfree(memd);
+}
+
+/**
+ * rproc_memdev_add() - add a memory-device on remote processor
+ *
+ * @rproc: the parent remote processor
+ * @mem: memory resource entry allow to define the dma coherent memory of memory-device
+ *
+ * This function add a memory-device child on rproc parent. This memory-device allow
+ * to define a new dma coherent memory area. When the rproc would alloc a
+ * dma coherent memory it's find the memory-device that match with physical memory
+ * asked (if there is no children that match, the rproc is the default device)
+ *
+ * Returns the memory-device handle on success, and error on failure.
+ */
+static struct rproc_memdev *rproc_memdev_add(struct rproc *rproc,
+					     struct rproc_mem_entry *mem)
+{
+	struct rproc_memdev *memd;
+	int ret;
+
+	if (!mem || strlen(mem->name) == 0) {
+		ret = -EINVAL;
+		goto err;
+	}
+
+	memd = kzalloc(sizeof(*memd), GFP_KERNEL);
+	if (!memd) {
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	memd->rproc = rproc;
+	memd->mem = mem;
+	memd->dev.parent = rproc->dev.parent;
+	memd->dev.release = rproc_memdev_release;
+	dev_set_name(&memd->dev, "%s#%s", dev_name(memd->dev.parent), mem->name);
+	dev_set_drvdata(&memd->dev, memd);
+
+	ret = device_register(&memd->dev);
+	if (ret)
+		goto err_dev;
+
+	ret = dmam_declare_coherent_memory(&memd->dev,
+					   rproc_va_to_pa(mem->va), mem->da,
+					   mem->len,
+					   DMA_MEMORY_EXCLUSIVE);
+	if (ret < 0)
+		goto err_dev;
+
+	return memd;
+
+err_dev:
+	put_device(&memd->dev);
+err:
+	dev_err(&rproc->dev, "unable to register subdev %s, err = %d\n",
+		(mem && strlen(mem->name)) ? mem->name : "unnamed", ret);
+	return ERR_PTR(ret);
+}
+
+/**
+ * rproc_memdev_del() - delete a memory-device of remote processor
+ *
+ * @memdev: rproc memory-device
+ */
+static void rproc_memdev_del(struct rproc_memdev *memdev)
+{
+	if (get_device(&memdev->dev)) {
+		device_unregister(&memdev->dev);
+		put_device(&memdev->dev);
+	}
+}
+
+/**
+ * rproc_memdev_unregister() - unregister memory-device of remote processor
+ *
+ * @dev: rproc memory-device
+ * @data: Not use (just to be compliant with device_for_each_child)
+ *
+ * This function is called by device_for_each_child function when unregister
+ * remote processor.
+ */
+static int rproc_memdev_unregister(struct device *dev, void *data)
+{
+	struct rproc_memdev *memd = to_memdevice(dev);
+	struct rproc *rproc = data;
+
+	if (dev != &rproc->dev)
+		rproc_memdev_del(memd);
+	return 0;
+}
+
 /*
  * This is the IOMMU fault handler we register with the IOMMU API
  * (when relevant; not all remote processors access memory through
@@ -139,17 +260,6 @@ static void rproc_disable_iommu(struct rproc *rproc)
 	iommu_domain_free(domain);
 }
 
-static phys_addr_t rproc_va_to_pa(void *cpu_addr)
-{
-	if (is_vmalloc_addr(cpu_addr)) {
-		return page_to_phys(vmalloc_to_page(cpu_addr)) +
-				    offset_in_page(cpu_addr);
-	}
-
-	WARN_ON(!virt_addr_valid(cpu_addr));
-	return virt_to_phys(cpu_addr);
-}
-
 /**
  * rproc_da_to_va() - lookup the kernel virtual address for a remoteproc address
  * @rproc: handle of a remote processor
@@ -1678,6 +1788,8 @@ int rproc_del(struct rproc *rproc)
 
 	rproc_delete_debug_dir(rproc);
 
+	device_for_each_child(rproc->dev.parent, rproc,
+			      rproc_memdev_unregister);
 	/* the rproc is downref'ed as soon as it's removed from the klist */
 	mutex_lock(&rproc_list_mutex);
 	list_del(&rproc->node);
-- 
1.9.1

  parent reply	other threads:[~2017-11-30 16:49 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-30 16:46 [PATCH v2 00/16] remoteproc: add fixed memory region support Loic Pallardy
2017-11-30 16:46 ` [PATCH v2 01/16] remoteproc: add rproc_va_to_pa function Loic Pallardy
2017-12-14  0:30   ` Bjorn Andersson
2018-01-12  7:43     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 02/16] remoteproc: add release ops in rproc_mem_entry struct Loic Pallardy
2017-12-14  0:34   ` Bjorn Andersson
2018-01-12  7:43     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 03/16] remoteproc: introduce rproc_add_carveout function Loic Pallardy
2017-12-14  0:36   ` Bjorn Andersson
2018-01-12  7:45     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 04/16] remoteproc: introduce rproc_find_carveout_by_da Loic Pallardy
2017-12-14  0:45   ` Bjorn Andersson
2018-01-12  7:48     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 05/16] remoteproc: modify rproc_handle_carveout to support preallocated region Loic Pallardy
2017-12-14  0:59   ` Bjorn Andersson
2018-01-12  7:56     ` Loic PALLARDY
2018-10-23 17:40       ` Suman Anna
2018-10-23 19:09         ` Loic PALLARDY
2018-10-23 19:12           ` Suman Anna
2017-11-30 16:46 ` [PATCH v2 06/16] remoteproc: modify vring allocation " Loic Pallardy
2017-12-14  1:09   ` Bjorn Andersson
2018-01-12  8:13     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 07/16] remoteproc: st: add reserved memory support Loic Pallardy
2017-12-14  1:15   ` Bjorn Andersson
2018-01-12  8:19     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 08/16] remoteproc: add name in rproc_mem_entry struct Loic Pallardy
2017-12-14  1:21   ` Bjorn Andersson
2018-01-12  8:19     ` Loic PALLARDY
2017-11-30 16:46 ` Loic Pallardy [this message]
2017-11-30 16:46 ` [PATCH v2 10/16] remoteproc: add memory device registering in rproc_add_carveout Loic Pallardy
2017-12-14  1:29   ` Bjorn Andersson
2018-01-15  9:09     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 11/16] remoteproc: introduce rproc_find_carveout_by_name function Loic Pallardy
2017-12-14  1:32   ` Bjorn Andersson
2018-01-15  9:10     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 12/16] remoteproc: look-up memory-device for vring allocation Loic Pallardy
2017-12-14  1:44   ` Bjorn Andersson
2018-01-15 20:44     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 13/16] remoteproc: look-up memory-device for virtio device allocation Loic Pallardy
2017-12-14  5:32   ` Bjorn Andersson
2018-01-15 20:57     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 14/16] remoteproc: look-up pre-registered carveout by name for carveout allocation Loic Pallardy
2017-12-14  5:34   ` Bjorn Andersson
2018-01-15 20:59     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 15/16] remoteproc: st: associate memory device to memory regions Loic Pallardy
2017-12-14  5:37   ` Bjorn Andersson
2018-01-15 21:04     ` Loic PALLARDY
2017-11-30 16:46 ` [PATCH v2 16/16] rpmsg: virtio: allocate buffer from parent Loic Pallardy

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=1512060411-729-10-git-send-email-loic.pallardy@st.com \
    --to=loic.pallardy@st.com \
    --cc=arnaud.pouliquen@st.com \
    --cc=benjamin.gaignard@linaro.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=ohad@wizery.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).