On Tue, Oct 15, 2024 at 11:15 PM Patrick Rudolph <patrick.rudo...@9elements.com> wrote: > > Translate IRQs by implementing of_xlate() as required by > irq_get_by_index() to parse interrupt properties. > > Map DT interrupts to ARM GIC interrupts as follows: > > - Interrupt numbers ID32-ID1019 are used for SPIs > - ID0-ID15 are used for SGIs > - ID16-ID31 are used for PPIs > > TEST: Booted on qemu sbsa-ref that has a GICV3. > > Signed-off-by: Patrick Rudolph <patrick.rudo...@9elements.com>
Reviewed-by: Moritz Fischer <mori...@google.com> > --- > Changelog v9: > - Require at least 3 interrupt-cells > - Map SPI interrupts to ID32+ > - Map PPI interrupts to ID16+ > --- > arch/arm/lib/gic-v3-its.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/arch/arm/lib/gic-v3-its.c b/arch/arm/lib/gic-v3-its.c > index 22fa46a341..58f8bf864f 100644 > --- a/arch/arm/lib/gic-v3-its.c > +++ b/arch/arm/lib/gic-v3-its.c > @@ -4,9 +4,11 @@ > */ > #include <cpu_func.h> > #include <dm.h> > +#include <irq.h> > #include <asm/gic.h> > #include <asm/gic-v3.h> > #include <asm/io.h> > +#include <dt-bindings/interrupt-controller/arm-gic.h> > #include <linux/bitops.h> > #include <linux/printk.h> > #include <linux/sizes.h> > @@ -163,8 +165,30 @@ static const struct udevice_id gic_v3_ids[] = { > {} > }; > > +static int arm_gic_v3_of_xlate(struct irq *irq, struct ofnode_phandle_args > *args) > +{ > + if (args->args_count < 3) { > + log_debug("Invalid args_count: %d\n", args->args_count); > + return -EINVAL; > + } > + > + if (args->args[0] == GIC_SPI) > + irq->id = args->args[1] + 32; > + else > + irq->id = args->args[1] + 16; > + > + irq->flags = args->args[2]; > + > + return 0; > +} > + > +static const struct irq_ops arm_gic_v3_ops = { > + .of_xlate = arm_gic_v3_of_xlate, > +}; > + > U_BOOT_DRIVER(arm_gic_v3) = { > .name = "gic-v3", > .id = UCLASS_IRQ, > .of_match = gic_v3_ids, > + .ops = &arm_gic_v3_ops, > }; > -- > 2.46.2 >