[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH WIP v1 08/10] HACK: xen: arm: Add mask, unmask and eoi platform hooks.
Not to be applied until better understood. Linux has these hooks and uses them on Tegra. However I don't think they are strictly needed (only for power gating stuff perhaps?). I implemented them while investigating some other issues, used by later "Tegra hacking" patch which isn't actually needed for a working board, AFAICT. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/gic-v2.c | 3 +++ xen/arch/arm/platform.c | 16 ++++++++++++++++ xen/include/asm-arm/platform.h | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index 2f5d33b..033a94a 100644 --- a/xen/arch/arm/gic-v2.c +++ b/xen/arch/arm/gic-v2.c @@ -537,6 +537,7 @@ static void gicv2_irq_enable(struct irq_desc *desc) clear_bit(_IRQ_DISABLED, &desc->status); dsb(sy); /* Enable routing */ + platform_irq_unmask(desc); writel_gicd((1u << (irq % 32)), GICD_ISENABLER + (irq / 32) * 4); spin_unlock_irqrestore(&gicv2.lock, flags); } @@ -552,6 +553,7 @@ static void gicv2_irq_disable(struct irq_desc *desc) /* Disable routing */ writel_gicd(1u << (irq % 32), GICD_ICENABLER + (irq / 32) * 4); set_bit(_IRQ_DISABLED, &desc->status); + platform_irq_mask(desc); spin_unlock_irqrestore(&gicv2.lock, flags); } @@ -574,6 +576,7 @@ static void gicv2_irq_ack(struct irq_desc *desc) static void gicv2_host_irq_end(struct irq_desc *desc) { + platform_irq_eoi(desc); /* Lower the priority */ gicv2_eoi_irq(desc); /* Deactivate */ diff --git a/xen/arch/arm/platform.c b/xen/arch/arm/platform.c index c58e251..3255c6a 100644 --- a/xen/arch/arm/platform.c +++ b/xen/arch/arm/platform.c @@ -160,6 +160,22 @@ bool_t platform_device_is_blacklisted(const struct dt_device_node *node) return (dt_match_node(blacklist, node) != NULL); } +void platform_irq_eoi(struct irq_desc *desc) +{ + if ( platform && platform->irq_eoi ) + platform->irq_eoi(desc); +} +void platform_irq_mask(struct irq_desc *desc) +{ + if ( platform && platform->irq_mask ) + platform->irq_mask(desc); +} +void platform_irq_unmask(struct irq_desc *desc) +{ + if ( platform && platform->irq_unmask ) + platform->irq_unmask(desc); +} + void platform_route_irq_to_guest(struct domain *d, struct irq_desc *desc) { if ( platform && platform->route_irq_to_guest ) diff --git a/xen/include/asm-arm/platform.h b/xen/include/asm-arm/platform.h index 22d1f8b..8b4c807 100644 --- a/xen/include/asm-arm/platform.h +++ b/xen/include/asm-arm/platform.h @@ -27,6 +27,11 @@ struct platform_desc { /* Platform power-off */ void (*poweroff)(void); + /* GIC hooks */ + void (*irq_eoi)(struct irq_desc *); + void (*irq_mask)(struct irq_desc *); + void (*irq_unmask)(struct irq_desc *); + void (*route_irq_to_guest)(struct domain *d, struct irq_desc *); /* @@ -72,6 +77,9 @@ bool_t platform_has_quirk(uint32_t quirk); bool_t platform_device_is_blacklisted(const struct dt_device_node *node); unsigned int platform_dom0_evtchn_ppi(void); void platform_dom0_gnttab(paddr_t *start, paddr_t *size); +void platform_irq_eoi(struct irq_desc *); +void platform_irq_mask(struct irq_desc *); +void platform_irq_unmask(struct irq_desc *); void platform_route_irq_to_guest(struct domain *, struct irq_desc *); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |