libsel4simple: Add IRQControl_GetTrigger interface
Allow using IRQControl_GetTrigger to specify edge or level trigger on
ARM platforms.
diff --git a/libsel4platsupport/src/arch/arm/device.c b/libsel4platsupport/src/arch/arm/device.c
index 68536d2..d7e5be1 100644
--- a/libsel4platsupport/src/arch/arm/device.c
+++ b/libsel4platsupport/src/arch/arm/device.c
@@ -13,9 +13,13 @@
#include <sel4platsupport/device.h>
#include <utils/util.h>
-int sel4platsupport_arch_copy_irq_cap(UNUSED arch_simple_t *arch_simple, UNUSED ps_irq_t *irq,
- UNUSED cspacepath_t *dest)
+int sel4platsupport_arch_copy_irq_cap(arch_simple_t *arch_simple, ps_irq_t *irq, cspacepath_t *dest)
{
- ZF_LOGE("unknown irq type");
- return -1;
+ switch (irq->type) {
+ case PS_TRIGGER:
+ return arch_simple_get_IRQ_trigger(arch_simple, irq->trigger.number, irq->trigger.trigger, *dest);
+ default:
+ ZF_LOGE("unknown irq type");
+ return -1;
+ }
}
diff --git a/libsel4simple-default/src/arch/arm/default.c b/libsel4simple-default/src/arch/arm/default.c
index dc4d837..2d266c1 100644
--- a/libsel4simple-default/src/arch/arm/default.c
+++ b/libsel4simple-default/src/arch/arm/default.c
@@ -26,6 +26,12 @@
return seL4_IRQControl_Get(seL4_CapIRQControl, irq, root, index, depth);
}
+seL4_Error simple_default_get_irq_trigger(void *data, int irq, int trigger, seL4_CNode root,
+ seL4_Word index, uint8_t depth)
+{
+ return seL4_IRQControl_GetTrigger(seL4_CapIRQControl, irq, trigger, root, index, depth);
+}
+
#ifdef CONFIG_ARM_SMMU
seL4_Error simple_default_get_iospace_cap_count(void *data, int *count)
{
@@ -86,6 +92,7 @@
{
simple->data = data;
simple->irq = simple_default_get_irq;
+ simple->irq_trigger = simple_default_get_irq_trigger;
#ifdef CONFIG_ARM_SMMU
simple->iospace_cap_count = simple_default_get_iospace_cap_count;
simple->iospace_get_nth_cap = simple_default_get_iospace_nth_cap;
diff --git a/libsel4simple/arch_include/arm/simple/arch/simple.h b/libsel4simple/arch_include/arm/simple/arch/simple.h
index 24ad5bb..eeff0da 100644
--- a/libsel4simple/arch_include/arm/simple/arch/simple.h
+++ b/libsel4simple/arch_include/arm/simple/arch/simple.h
@@ -33,12 +33,15 @@
* @param Depth of index
*/
typedef seL4_Error (*simple_get_IRQ_handler_fn)(void *data, int irq, seL4_CNode cnode, seL4_Word index, uint8_t depth);
+typedef seL4_Error (*simple_get_IRQ_trigger_fn)(void *data, int irq, int trigger, seL4_CNode root,
+ seL4_Word index, uint8_t depth);
typedef seL4_Error (*simple_get_iospace_cap_count_fn)(void *data, int *count);
typedef seL4_CPtr (*simple_get_nth_iospace_cap_fn)(void *data, int n);
typedef struct arch_simple {
simple_get_IRQ_handler_fn irq;
+ simple_get_IRQ_trigger_fn irq_trigger;
#ifdef CONFIG_ARM_SMMU
simple_get_iospace_cap_count_fn iospace_cap_count;
simple_get_nth_iospace_cap_fn iospace_get_nth_cap;
@@ -53,3 +56,17 @@
return seL4_IllegalOperation;
}
+static inline seL4_Error arch_simple_get_IRQ_trigger(arch_simple_t *simple, int irq, int trigger,
+ cspacepath_t path)
+{
+ if (!simple) {
+ ZF_LOGE("Simple is NULL");
+ return seL4_InvalidArgument;
+ }
+ if (!simple->irq_trigger) {
+ ZF_LOGE("Not implemented");
+ return seL4_InvalidArgument;
+ }
+
+ return simple->irq_trigger(simple->data, irq, trigger, path.root, path.capPtr, path.capDepth);
+}