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);
+}