Skip to content

Commit

Permalink
irqchip/gic: Make quirks matching conditional on init return value
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Marc Zyngier <[email protected]>
  • Loading branch information
Ard Biesheuvel authored and Marc Zyngier committed Oct 19, 2017
1 parent fa15001 commit 9d111d4
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 6 deletions.
5 changes: 3 additions & 2 deletions drivers/irqchip/irq-gic-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/irqchip/irq-gic-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

struct gic_quirk {
const char *desc;
void (*init)(void *data);
bool (*init)(void *data);
u32 iidr;
u32 mask;
};
Expand Down
12 changes: 9 additions & 3 deletions drivers/irqchip/irq-gic-v3-its.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down

0 comments on commit 9d111d4

Please sign in to comment.