[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V2 22/33] xen/arm: Use the device tree to map the address range and IRQ to dom0
On 05/08/2013 04:28 PM, Ian Campbell wrote: > On Wed, 2013-05-08 at 03:33 +0100, Julien Grall wrote: >> - gic_route_irq_to_guest takes a dt_irq instead of an IRQ number >> - remove hardcoded address/IRQ >> >> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> >> >> Changes in v2: >> - Use the new function dt_irq_is_level_trigger >> - Disable DEBUG_DT by default >> - Rename parse_device_tree to map_device_from_device_tree > > Should be map_devices_... Will be fix on the next patch series. >> + /** > > Javadoc! > >> + * Don't map IRQ that have no physical meaning >> + * ie: IRQ whose controller is not the GIC >> + */ >> + if ( rirq.controller != dt_interrupt_controller ) >> + { >> + DPRINT("irq %u skipped it controller (%s)\n", > > you might mean "skipped its controller" ? But I think a clearer message > would be "irq %u not connected to primary controller" or something. > >> + i, dt_node_full_name(rirq.controller)); >> + continue; >> + } >> + >> + res = dt_irq_translate(&rirq, &irq); >> + if ( res ) >> + { >> + printk(XENLOG_ERR "Unable to translate irq %u for %s\n", >> + i, dt_node_full_name(dev)); >> + return res; >> + } >> + >> + DPRINT("irq %u = %u type = %#x\n", i, irq.irq, irq.type); > > The # format specifier is required by $STANDARD to not be all that > sensible and/or consistent when when the value is 0, i.e. > printf("%#x\n", 0) => "0" > printf("%#x\n", 1) => "0x1" > Worse if you use widths then: > printf("%#02x\n", 0); => "00" > printf("%#02x\n", 1); => "0x1" > printf("%#04x\n", 0); => "0000" > printf("%#04x\n", 1); => "0x01" > > For this reason we tend to avoid # and just use "0x%...", assuming > irq==0 is a possibility, and likewise below addr==0 it's probably better > to avoid #. Thanks for this hint. I will replace all my %#x by 0x%x. >> + /* Don't check return because the IRQ can be use by multiple device >> */ > > "used by" > >> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c >> index f7b9889..ddad0c8 100644 >> --- a/xen/arch/arm/gic.c >> +++ b/xen/arch/arm/gic.c >> @@ -692,13 +692,14 @@ void gic_inject(void) >> gic_inject_irq_start(); >> } >> >> -int gic_route_irq_to_guest(struct domain *d, unsigned int irq, >> +int gic_route_irq_to_guest(struct domain *d, const struct dt_irq *irq, >> const char * devname) >> { >> struct irqaction *action; >> - struct irq_desc *desc = irq_to_desc(irq); >> + struct irq_desc *desc = irq_to_desc(irq->irq); >> unsigned long flags; >> int retval; >> + bool_t level; >> >> action = xmalloc(struct irqaction); >> if (!action) >> @@ -706,6 +707,7 @@ int gic_route_irq_to_guest(struct domain *d, unsigned >> int irq, >> >> action->dev_id = d; >> action->name = devname; >> + action->free_on_release = 1; >> >> spin_lock_irqsave(&desc->lock, flags); >> spin_lock(&gic.lock); >> @@ -713,9 +715,11 @@ int gic_route_irq_to_guest(struct domain *d, unsigned >> int irq, >> desc->handler = &gic_guest_irq_type; >> desc->status |= IRQ_GUEST; >> >> - gic_set_irq_properties(irq, 1, 1u << smp_processor_id(), 0xa0); >> + level = dt_irq_is_level_trigger(irq); >> + >> + gic_set_irq_properties(irq->irq, level, 1u << smp_processor_id(), 0xa0); > > By the end of this series are all callers going through the above dance? > git_set_irq_properties could take a dt_irq? No. I can add patch to use a dt_irq. -- Julien _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |