public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Robert Richter <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: hpa@zytor.com, rrichter@cavium.com, tchalamarla@cavium.com,
	jason@lakedaemon.net, marc.zyngier@arm.com, mingo@kernel.org,
	tglx@linutronix.de, linux-kernel@vger.kernel.org,
	catalin.marinas@arm.com
Subject: [tip:irq/core] irqchip/gicv3-its: Add HW revision detection and configuration
Date: Tue, 29 Sep 2015 01:16:44 -0700	[thread overview]
Message-ID: <tip-67510ccafb9d69e79079b5cd6c9959025bc02061@git.kernel.org> (raw)
In-Reply-To: <1442869119-1814-5-git-send-email-rric@kernel.org>

Commit-ID:  67510ccafb9d69e79079b5cd6c9959025bc02061
Gitweb:     http://git.kernel.org/tip/67510ccafb9d69e79079b5cd6c9959025bc02061
Author:     Robert Richter <rrichter@cavium.com>
AuthorDate: Mon, 21 Sep 2015 22:58:37 +0200
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Tue, 29 Sep 2015 10:10:53 +0200

irqchip/gicv3-its: Add HW revision detection and configuration

Some GIC revisions require an individual configuration to esp. add
workarounds for HW bugs. This patch implements generic code to parse
the hw revision provided by an IIDR register value and runs specific
code if hw matches. A function is added that reads the IIDR registers
for ITS (GITS_IIDR) and then goes through a list of init functions to
be called for specific versions. Same could be done for GICV3
(GICD_IIDR), but there are no users yet for it.

The patch is needed to implement workarounds for HW errata in Cavium's
ThunderX GICV3 ITS.

Signed-off-by: Robert Richter <rrichter@cavium.com>
Reviewed-by: Marc Zygnier <marc.zyngier@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Tirumalesh Chalamarla <tchalamarla@cavium.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Jason Cooper <jason@lakedaemon.net>
Link: http://lkml.kernel.org/r/1442869119-1814-5-git-send-email-rric@kernel.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 drivers/irqchip/irq-gic-common.c | 11 +++++++++++
 drivers/irqchip/irq-gic-common.h |  9 +++++++++
 drivers/irqchip/irq-gic-v3-its.c | 16 ++++++++++++++++
 3 files changed, 36 insertions(+)

diff --git a/drivers/irqchip/irq-gic-common.c b/drivers/irqchip/irq-gic-common.c
index 9448e39..44a077f 100644
--- a/drivers/irqchip/irq-gic-common.c
+++ b/drivers/irqchip/irq-gic-common.c
@@ -21,6 +21,17 @@
 
 #include "irq-gic-common.h"
 
+void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
+		void *data)
+{
+	for (; quirks->desc; quirks++) {
+		if (quirks->iidr != (quirks->mask & iidr))
+			continue;
+		quirks->init(data);
+		pr_info("GIC: enabling workaround for %s\n", quirks->desc);
+	}
+}
+
 int gic_configure_irq(unsigned int irq, unsigned int type,
 		       void __iomem *base, void (*sync_access)(void))
 {
diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
index 35a9884..fff697d 100644
--- a/drivers/irqchip/irq-gic-common.h
+++ b/drivers/irqchip/irq-gic-common.h
@@ -20,10 +20,19 @@
 #include <linux/of.h>
 #include <linux/irqdomain.h>
 
+struct gic_quirk {
+	const char *desc;
+	void (*init)(void *data);
+	u32 iidr;
+	u32 mask;
+};
+
 int gic_configure_irq(unsigned int irq, unsigned int type,
                        void __iomem *base, void (*sync_access)(void));
 void gic_dist_config(void __iomem *base, int gic_irqs,
 		     void (*sync_access)(void));
 void gic_cpu_config(void __iomem *base, void (*sync_access)(void));
+void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
+		void *data);
 
 #endif /* _IRQ_GIC_COMMON_H */
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 549e716..82622af 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -37,6 +37,8 @@
 #include <asm/cputype.h>
 #include <asm/exception.h>
 
+#include "irq-gic-common.h"
+
 #define ITS_FLAGS_CMDQ_NEEDS_FLUSHING		(1 << 0)
 
 #define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING	(1 << 0)
@@ -1375,6 +1377,18 @@ static int its_force_quiescent(void __iomem *base)
 	}
 }
 
+static const struct gic_quirk its_quirks[] = {
+	{
+	}
+};
+
+static void its_enable_quirks(struct its_node *its)
+{
+	u32 iidr = readl_relaxed(its->base + GITS_IIDR);
+
+	gic_enable_quirks(iidr, its_quirks, its);
+}
+
 static int its_probe(struct device_node *node, struct irq_domain *parent)
 {
 	struct resource res;
@@ -1433,6 +1447,8 @@ static int its_probe(struct device_node *node, struct irq_domain *parent)
 	}
 	its->cmd_write = its->cmd_base;
 
+	its_enable_quirks(its);
+
 	err = its_alloc_tables(node->full_name, its);
 	if (err)
 		goto out_free_cmd;

  parent reply	other threads:[~2015-09-29  8:17 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-21 20:58 [PATCH v5 0/6] irqchip, gicv3: Updates and Cavium ThunderX errata workarounds Robert Richter
2015-09-21 20:58 ` [PATCH v5 1/6] irqchip, gicv3-its: Add range check for number of allocated pages Robert Richter
2015-09-29  8:15   ` [tip:irq/core] irqchip/gicv3-its: " tip-bot for Robert Richter
2015-09-21 20:58 ` [PATCH v5 2/6] irqchip, gicv3: Workaround for Cavium ThunderX erratum 23154 Robert Richter
2015-09-22 16:50   ` Marc Zyngier
2015-09-29  8:16   ` [tip:irq/core] irqchip/gicv3: " tip-bot for Robert Richter
2015-09-21 20:58 ` [PATCH v5 3/6] irqchip, gicv3-its: Read typer register outside the loop Robert Richter
2015-09-29  8:16   ` [tip:irq/core] irqchip/gicv3-its: " tip-bot for Robert Richter
2015-09-21 20:58 ` [PATCH v5 4/6] irqchip, gicv3-its: Add HW revision detection and configuration Robert Richter
2015-09-22 16:51   ` Marc Zyngier
2015-09-29  8:16   ` tip-bot for Robert Richter [this message]
2015-09-21 20:58 ` [PATCH v5 5/6] irqchip, gicv3-its: Workaround for Cavium ThunderX errata 22375, 24313 Robert Richter
2015-09-22 16:52   ` Marc Zyngier
2015-09-29  8:17   ` [tip:irq/core] irqchip/gicv3-its: " tip-bot for Robert Richter
2015-09-21 20:58 ` [PATCH v5 6/6] irqchip, gicv3-its: Use new jump label API Robert Richter
2015-09-22 16:53   ` Marc Zyngier
2015-09-29  8:17   ` [tip:irq/core] irqchip/gicv3-its: " tip-bot for Robert Richter
2015-09-22 16:57 ` [PATCH v5 0/6] irqchip, gicv3: Updates and Cavium ThunderX errata workarounds Marc Zyngier
2015-09-22 18:09   ` Marc Zyngier
2015-09-22 18:27     ` Will Deacon
2015-09-22 19:41       ` Marc Zyngier
2015-09-24 16:54         ` Catalin Marinas
2015-09-24 17:01         ` Robert Richter

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=tip-67510ccafb9d69e79079b5cd6c9959025bc02061@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=catalin.marinas@arm.com \
    --cc=hpa@zytor.com \
    --cc=jason@lakedaemon.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mingo@kernel.org \
    --cc=rrichter@cavium.com \
    --cc=tchalamarla@cavium.com \
    --cc=tglx@linutronix.de \
    /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