Skip to content

Commit f70fdb4

Browse files
Srinivas-KandagatlaMarc Zyngier
authored andcommitted
irqchip/gic: Add support to device tree based quirks
This patch adds support to device tree based quirks based on device tree compatible string. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
1 parent 7c81315 commit f70fdb4

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

drivers/irqchip/irq-gic-common.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ void gic_set_kvm_info(const struct gic_kvm_info *info)
3636
gic_kvm_info = info;
3737
}
3838

39+
void gic_enable_of_quirks(const struct device_node *np,
40+
const struct gic_quirk *quirks, void *data)
41+
{
42+
for (; quirks->desc; quirks++) {
43+
if (!of_device_is_compatible(np, quirks->compatible))
44+
continue;
45+
if (quirks->init(data))
46+
pr_info("GIC: enabling workaround for %s\n",
47+
quirks->desc);
48+
}
49+
}
50+
3951
void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
4052
void *data)
4153
{

drivers/irqchip/irq-gic-common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
struct gic_quirk {
2525
const char *desc;
26+
const char *compatible;
2627
bool (*init)(void *data);
2728
u32 iidr;
2829
u32 mask;
@@ -35,6 +36,8 @@ void gic_dist_config(void __iomem *base, int gic_irqs,
3536
void gic_cpu_config(void __iomem *base, void (*sync_access)(void));
3637
void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
3738
void *data);
39+
void gic_enable_of_quirks(const struct device_node *np,
40+
const struct gic_quirk *quirks, void *data);
3841

3942
void gic_set_kvm_info(const struct gic_kvm_info *info);
4043

drivers/irqchip/irq-gic-v3.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,11 @@ static void __init gic_of_setup_kvm_info(struct device_node *node)
12711271
gic_set_kvm_info(&gic_v3_kvm_info);
12721272
}
12731273

1274+
static const struct gic_quirk gic_quirks[] = {
1275+
{
1276+
}
1277+
};
1278+
12741279
static int __init gic_of_init(struct device_node *node, struct device_node *parent)
12751280
{
12761281
void __iomem *dist_base;
@@ -1318,6 +1323,8 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
13181323
if (of_property_read_u64(node, "redistributor-stride", &redist_stride))
13191324
redist_stride = 0;
13201325

1326+
gic_enable_of_quirks(node, gic_quirks, &gic_data);
1327+
13211328
err = gic_init_bases(dist_base, rdist_regs, nr_redist_regions,
13221329
redist_stride, &node->fwnode);
13231330
if (err)

0 commit comments

Comments
 (0)