[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
|