aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2017-10-17 12:55:55 -0400
committerMarc Zyngier <marc.zyngier@arm.com>2017-10-19 06:22:38 -0400
commit9d111d49106b61f5a652d5418e85d8741b1a0427 (patch)
treea094c133a7f1d0d453791e950ec10e0b6b2ec805
parentfa1500191958660952a3a8466aad54003701a7b6 (diff)
irqchip/gic: Make quirks matching conditional on init return value
As it turns out, the IIDR is not sufficient to distinguish between GICv3 implementations when it comes to enabling quirks. So update the prototype of the init() hook to return a bool, and interpret a 'false' return value as no match, in which case the 'enabling workaround' log message should not be printed. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r--drivers/irqchip/irq-gic-common.c5
-rw-r--r--drivers/irqchip/irq-gic-common.h2
-rw-r--r--drivers/irqchip/irq-gic-v3-its.c12
3 files changed, 13 insertions, 6 deletions
diff --git a/drivers/irqchip/irq-gic-common.c b/drivers/irqchip/irq-gic-common.c
index 9ae71804b5dd..30017df5b54c 100644
--- a/drivers/irqchip/irq-gic-common.c
+++ b/drivers/irqchip/irq-gic-common.c
@@ -40,8 +40,9 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
40 for (; quirks->desc; quirks++) { 40 for (; quirks->desc; quirks++) {
41 if (quirks->iidr != (quirks->mask & iidr)) 41 if (quirks->iidr != (quirks->mask & iidr))
42 continue; 42 continue;
43 quirks->init(data); 43 if (quirks->init(data))
44 pr_info("GIC: enabling workaround for %s\n", quirks->desc); 44 pr_info("GIC: enabling workaround for %s\n",
45 quirks->desc);
45 } 46 }
46} 47}
47 48
diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
index 205e5fddf6da..3919cd7c5285 100644
--- a/drivers/irqchip/irq-gic-common.h
+++ b/drivers/irqchip/irq-gic-common.h
@@ -23,7 +23,7 @@
23 23
24struct gic_quirk { 24struct gic_quirk {
25 const char *desc; 25 const char *desc;
26 void (*init)(void *data); 26 bool (*init)(void *data);
27 u32 iidr; 27 u32 iidr;
28 u32 mask; 28 u32 mask;
29}; 29};
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index fbb8eba2ac84..4d432804c2bc 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -2730,28 +2730,34 @@ static int its_force_quiescent(void __iomem *base)
2730 } 2730 }
2731} 2731}
2732 2732
2733static void __maybe_unused its_enable_quirk_cavium_22375(void *data) 2733static bool __maybe_unused its_enable_quirk_cavium_22375(void *data)
2734{ 2734{
2735 struct its_node *its = data; 2735 struct its_node *its = data;
2736 2736
2737 /* erratum 22375: only alloc 8MB table size */ 2737 /* erratum 22375: only alloc 8MB table size */
2738 its->device_ids = 0x14; /* 20 bits, 8MB */ 2738 its->device_ids = 0x14; /* 20 bits, 8MB */
2739 its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_22375; 2739 its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_22375;
2740
2741 return true;
2740} 2742}
2741 2743
2742static void __maybe_unused its_enable_quirk_cavium_23144(void *data) 2744static bool __maybe_unused its_enable_quirk_cavium_23144(void *data)
2743{ 2745{
2744 struct its_node *its = data; 2746 struct its_node *its = data;
2745 2747
2746 its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_23144; 2748 its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_23144;
2749
2750 return true;
2747} 2751}
2748 2752
2749static void __maybe_unused its_enable_quirk_qdf2400_e0065(void *data) 2753static bool __maybe_unused its_enable_quirk_qdf2400_e0065(void *data)
2750{ 2754{
2751 struct its_node *its = data; 2755 struct its_node *its = data;
2752 2756
2753 /* On QDF2400, the size of the ITE is 16Bytes */ 2757 /* On QDF2400, the size of the ITE is 16Bytes */
2754 its->ite_size = 16; 2758 its->ite_size = 16;
2759
2760 return true;
2755} 2761}
2756 2762
2757static const struct gic_quirk its_quirks[] = { 2763static const struct gic_quirk its_quirks[] = {