[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 3/6] xen/arm: Allow platforms to hook IRQ routing.
Hello Kyle, On 05/09/2016 11:13, Kyle Temkin wrote: diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 52c9a01..402c766 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c [...] + +bool_t platform_irq_is_routable(struct dt_raw_irq * rirq) We are trying to move the code base to bool rather than bool_t. +{ + /* + * If we have a platform-specific method to determine if an IRQ is routable, + * check that; otherwise fall back to checking to see if an IRQ belongs to + * the GIC. + */ + if ( platform && platform->irq_is_routable ) + return platform->irq_is_routable(rirq); + else + return (rirq->controller == dt_interrupt_controller); +} + +int platform_irq_for_device(const struct dt_device_node *dev, int index) +{ + if ( platform && platform->irq_for_device ) + return platform->irq_for_device(dev, index); + else + return platform_get_irq(dev, index); IHMO the naming of this new function will confuse the user. Without any documentation it is not clear whether the user should call platform_irq_for_device or platform_get_irq. However, I am not sure to understand why you need to override platform_get_irq as the code is exactly the same and dt_irq_xlate could be overidden to return the IRQ. +} + + /* * Local variables: * mode: C [...] diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c index cf8b8b8..94d035a 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -103,7 +103,7 @@ static struct resource *platform_get_resource(struct platform_device *pdev, return ((ret) ? NULL : &res); case IORESOURCE_IRQ: - ret = platform_get_irq(pdev, num); + ret = platform_irq_for_device(pdev, num); if (ret < 0) return NULL; @@ -2349,7 +2349,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) } for (i = 0; i < num_irqs; ++i) { - int irq = platform_get_irq(pdev, i); + int irq = platform_irq_for_device(pdev, i); if (irq < 0) { dev_err(dev, "failed to get irq index %d\n", i); diff --git a/xen/include/asm-arm/platform.h b/xen/include/asm-arm/platform.h index f97315d..4ea278b 100644 --- a/xen/include/asm-arm/platform.h +++ b/xen/include/asm-arm/platform.h @@ -26,6 +26,13 @@ struct platform_desc { void (*reset)(void); /* Platform power-off */ void (*poweroff)(void); + /* Platform-specific IRQ routing */ + int (*route_irq_to_guest)(struct domain *d, unsigned int virq, + struct irq_desc *desc, unsigned int priority); + void (*route_irq_to_xen)(struct irq_desc *desc, unsigned int priority); + bool_t (*irq_is_routable)(struct dt_raw_irq * rirq); Please use bool here. + int (*irq_for_device)(const struct dt_device_node *dev, int index); + /* * Platform blacklist devices * List of devices which must not pass-through to a guest @@ -42,6 +49,13 @@ int platform_cpu_up(int cpu); #endif void platform_reset(void); void platform_poweroff(void); + +int platform_route_irq_to_guest(struct domain *d, unsigned int virq, + struct irq_desc *desc, unsigned int priority); +void platform_route_irq_to_xen(struct irq_desc *desc, unsigned int priority); +bool_t platform_irq_is_routable(struct dt_raw_irq *rirq); Ditto. +int platform_irq_for_device(const struct dt_device_node *dev, int index); + bool_t platform_device_is_blacklisted(const struct dt_device_node *node); #define PLATFORM_START(_name, _namestr) \ Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |