irqchip/gic: Make quirks matching conditional on init return value
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 17 Oct 2017 16:55:55 +0000 (17:55 +0100)
committerMarc Zyngier <marc.zyngier@arm.com>
Thu, 19 Oct 2017 10:22:38 +0000 (11:22 +0100)
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>
drivers/irqchip/irq-gic-common.c
drivers/irqchip/irq-gic-common.h
drivers/irqchip/irq-gic-v3-its.c

index 9ae71804b5dd67bf27322f88b7066f9e646fbdb5..30017df5b54c8c440be595579703d2f52fbceac2 100644 (file)
@@ -40,8 +40,9 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
        for (; quirks->desc; quirks++) {
                if (quirks->iidr != (quirks->mask & iidr))
                        continue;
-               quirks->init(data);
-               pr_info("GIC: enabling workaround for %s\n", quirks->desc);
+               if (quirks->init(data))
+                       pr_info("GIC: enabling workaround for %s\n",
+                               quirks->desc);
        }
 }
 
index 205e5fddf6da6e870bd90174c486c9a8d3440855..3919cd7c5285d3490290b7e271c5e283cff07d55 100644 (file)
@@ -23,7 +23,7 @@
 
 struct gic_quirk {
        const char *desc;
-       void (*init)(void *data);
+       bool (*init)(void *data);
        u32 iidr;
        u32 mask;
 };
index fbb8eba2ac845a3cbe9159d1046d233cd77e3a23..4d432804c2bc3467ecf0b7e16f59a96c8d101ec9 100644 (file)
@@ -2730,28 +2730,34 @@ static int its_force_quiescent(void __iomem *base)
        }
 }
 
-static void __maybe_unused its_enable_quirk_cavium_22375(void *data)
+static bool __maybe_unused its_enable_quirk_cavium_22375(void *data)
 {
        struct its_node *its = data;
 
        /* erratum 22375: only alloc 8MB table size */
        its->device_ids = 0x14;         /* 20 bits, 8MB */
        its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_22375;
+
+       return true;
 }
 
-static void __maybe_unused its_enable_quirk_cavium_23144(void *data)
+static bool __maybe_unused its_enable_quirk_cavium_23144(void *data)
 {
        struct its_node *its = data;
 
        its->flags |= ITS_FLAGS_WORKAROUND_CAVIUM_23144;
+
+       return true;
 }
 
-static void __maybe_unused its_enable_quirk_qdf2400_e0065(void *data)
+static bool __maybe_unused its_enable_quirk_qdf2400_e0065(void *data)
 {
        struct its_node *its = data;
 
        /* On QDF2400, the size of the ITE is 16Bytes */
        its->ite_size = 16;
+
+       return true;
 }
 
 static const struct gic_quirk its_quirks[] = {