Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1389859

[PATCH v8 6/8] irqchip/gicv2m: implement msi_doorbell_info callback

Path csiph.com!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod
From Eric Auger <eric.auger@linaro.org>
Newsgroups linux.kernel
Subject [PATCH v8 6/8] irqchip/gicv2m: implement msi_doorbell_info callback
Date Thu, 28 Apr 2016 10:30:01 +0200
Message-ID <rsPuF-4Y-9@gated-at.bofh.it> (permalink)
References <rsPuF-4Y-3@gated-at.bofh.it>
X-Original-To eric.auger@st.com, eric.auger@linaro.org, robin.murphy@arm.com, alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de, jason@lakedaemon.net, marc.zyngier@arm.com, christoffer.dall@linaro.org, linux-arm-kernel@lists.infradead.org
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RIyfSGMapPYj8mFRsSmFGB1ucgGlVgNCjHpl+3mBxuM=; b=j0wZPC97hLo5LI3jvf28tyBr+V3Z5aLmc8oRXNCTmkH2ssulquWtb6nEFoWe3yDqAf HuKeTgeoMezozdQ9rcFz44AFCKuvl85aPFpC5xiOQzrrGOI5QJSKFe10CBxGLK0K6x05 aOe9qZdtwWRHB2BS/vgj4pNsHbHkCy8vjw7jw=
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RIyfSGMapPYj8mFRsSmFGB1ucgGlVgNCjHpl+3mBxuM=; b=l4T8NfrVPswsWeE2qCnhAeOciEP+u/kD+545n1quZcuZCjsBJ4JMMRR7Y+G7zkYX9y /09oyF9PjuZBPgB7o6T/1Zhuax7+ZXdAiRMubw5JTY3TdQuHkNjfbJnvAX+w9L5QV1ds iPsQjAfldik1Ujv7Wglx2MiwCuBzQAr5tq/Xa8F+amnWYj0Cwe9YNW1vMkbBvZCNyQ9+ RA2VdbT1EAr0IXyTuOhDXvJoedFxqLHMmAdmraAdXaM9zg+oPp9gOMlTRzTmgw1w6skh vxSQLbxG1/7f8c+cZ4At/GCgvhi6iAMi74bANmhOl2BPPp+4iccAa+/JJJyLEh58r/jB FO+A==
X-Gm-Message-State AOPr4FVstKGxr9EsHL7wO3mbDYSYzSkwuClnaD/0x7M15rz/YN0nbovKrgrwNKx2hkNP25Wq
X-Received by 10.194.62.145 with SMTP id y17mr14866531wjr.109.1461831766976; Thu, 28 Apr 2016 01:22:46 -0700 (PDT)
X-Mailer git-send-email 1.9.1
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 119
Organization linux.* mail to news gateway
X-Original-Cc patches@linaro.org, linux-kernel@vger.kernel.org, Bharat.Bhushan@freescale.com, pranav.sawargaonkar@gmail.com, p.fedin@samsung.com, iommu@lists.linux-foundation.org, Jean-Philippe.Brucker@arm.com, julien.grall@arm.com
X-Original-Date Thu, 28 Apr 2016 08:22:08 +0000
X-Original-Message-ID <1461831730-5575-7-git-send-email-eric.auger@linaro.org>
X-Original-References <1461831730-5575-1-git-send-email-eric.auger@linaro.org>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1389859

Show key headers only | View raw


This patch implements the msi_doorbell_info callback in the
gicv2m driver.

The driver now is able to return its doorbell characteristics
(base, size, prot). A single doorbell is exposed.

This will allow the msi layer to iommu_map this doorbell when
requested.

Signed-off-by: Eric Auger <eric.auger@linaro.org>

---

v7 -> v8:
- gicv2m_msi_doorbell_info does not return a pointer to const
- remove spurious !v2m check
- add IOMMU_MMIO flag

v7: creation
---
 drivers/irqchip/irq-gic-v2m.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c
index 28f047c..a1ea40c 100644
--- a/drivers/irqchip/irq-gic-v2m.c
+++ b/drivers/irqchip/irq-gic-v2m.c
@@ -24,6 +24,8 @@
 #include <linux/of_pci.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
+#include <linux/percpu.h>
+#include <linux/iommu.h>
 
 /*
 * MSI_TYPER:
@@ -64,6 +66,7 @@ struct v2m_data {
 	u32 nr_spis;		/* The number of SPIs for MSIs */
 	unsigned long *bm;	/* MSI vector bitmap */
 	u32 flags;		/* v2m flags for specific implementation */
+	struct irq_chip_msi_doorbell_info doorbell_info;
 };
 
 static void gicv2m_mask_msi_irq(struct irq_data *d)
@@ -105,6 +108,14 @@ static void gicv2m_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
 		msg->data -= v2m->spi_start;
 }
 
+static inline struct irq_chip_msi_doorbell_info *
+gicv2m_msi_doorbell_info(struct irq_data *data)
+{
+	struct v2m_data *v2m = irq_data_get_irq_chip_data(data);
+
+	return &v2m->doorbell_info;
+}
+
 static struct irq_chip gicv2m_irq_chip = {
 	.name			= "GICv2m",
 	.irq_mask		= irq_chip_mask_parent,
@@ -112,6 +123,7 @@ static struct irq_chip gicv2m_irq_chip = {
 	.irq_eoi		= irq_chip_eoi_parent,
 	.irq_set_affinity	= irq_chip_set_affinity_parent,
 	.irq_compose_msi_msg	= gicv2m_compose_msi_msg,
+	.msi_doorbell_info	= gicv2m_msi_doorbell_info,
 };
 
 static int gicv2m_irq_gic_domain_alloc(struct irq_domain *domain,
@@ -247,6 +259,7 @@ static void gicv2m_teardown(void)
 
 	list_for_each_entry_safe(v2m, tmp, &v2m_nodes, entry) {
 		list_del(&v2m->entry);
+		free_percpu(v2m->doorbell_info.percpu_doorbells);
 		kfree(v2m->bm);
 		iounmap(v2m->base);
 		of_node_put(to_of_node(v2m->fwnode));
@@ -299,6 +312,7 @@ static int __init gicv2m_init_one(struct fwnode_handle *fwnode,
 {
 	int ret;
 	struct v2m_data *v2m;
+	phys_addr_t __percpu *doorbell;
 
 	v2m = kzalloc(sizeof(struct v2m_data), GFP_KERNEL);
 	if (!v2m) {
@@ -311,11 +325,23 @@ static int __init gicv2m_init_one(struct fwnode_handle *fwnode,
 
 	memcpy(&v2m->res, res, sizeof(struct resource));
 
+	v2m->doorbell_info.percpu_doorbells =
+		alloc_percpu(phys_addr_t);
+	if (WARN_ON(!v2m->doorbell_info.percpu_doorbells)) {
+		ret = -ENOMEM;
+		goto err_free_v2m;
+	}
+	doorbell = per_cpu_ptr(v2m->doorbell_info.percpu_doorbells, 0);
+	*doorbell = v2m->res.start;
+	v2m->doorbell_info.size = 4;
+	v2m->doorbell_info.prot = IOMMU_WRITE | IOMMU_MMIO;
+	v2m->doorbell_info.nb_doorbells = 1;
+
 	v2m->base = ioremap(v2m->res.start, resource_size(&v2m->res));
 	if (!v2m->base) {
 		pr_err("Failed to map GICv2m resource\n");
 		ret = -ENOMEM;
-		goto err_free_v2m;
+		goto err_free_v2m_doorbells;
 	}
 
 	if (spi_start && nr_spis) {
@@ -359,6 +385,8 @@ static int __init gicv2m_init_one(struct fwnode_handle *fwnode,
 
 err_iounmap:
 	iounmap(v2m->base);
+err_free_v2m_doorbells:
+	free_percpu(v2m->doorbell_info.percpu_doorbells);
 err_free_v2m:
 	kfree(v2m);
 	return ret;
-- 
1.9.1

Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread


Thread

[PATCH v8 6/8] irqchip/gicv2m: implement msi_doorbell_info callback Eric Auger <eric.auger@linaro.org> - 2016-04-28 10:30 +0200
  Re: [PATCH v8 6/8] irqchip/gicv2m: implement msi_doorbell_info  callback Marc Zyngier <marc.zyngier@arm.com> - 2016-05-04 15:10 +0200

csiph-web