From: Hongzhan Chen <hongzhan.c...@intel.com>

inband sirq request through synthetic_irq_domain and free and post
srq.

Signed-off-by: Hongzhan Chen <hongzhan.c...@intel.com>
Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
---
 .../cobalt/kernel/dovetail/pipeline/sirq.h    | 28 +++++++++++++++----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/include/cobalt/kernel/dovetail/pipeline/sirq.h 
b/include/cobalt/kernel/dovetail/pipeline/sirq.h
index be9dc587fb..1da9d13b21 100644
--- a/include/cobalt/kernel/dovetail/pipeline/sirq.h
+++ b/include/cobalt/kernel/dovetail/pipeline/sirq.h
@@ -23,9 +23,24 @@ int pipeline_create_inband_sirq(irqreturn_t (*handler)(int 
irq, void *dev_id))
         * Allocate an IRQ from the synthetic interrupt domain then
         * trap it to @handler, to be fired from the in-band stage.
         */
-       TODO();
+       int sirq, ret;
 
-       return 0;
+       sirq = irq_create_direct_mapping(synthetic_irq_domain);
+       if (sirq == 0)
+               return -EAGAIN;
+
+       ret = __request_percpu_irq(sirq,
+                       handler,
+                       IRQF_NO_THREAD,
+                       "Inband sirq",
+                       &cobalt_machine_cpudata);
+
+       if (ret) {
+               irq_dispose_mapping(sirq);
+               return ret;
+       }
+
+       return sirq;
 }
 
 static inline
@@ -35,13 +50,16 @@ void pipeline_delete_inband_sirq(int sirq)
         * Free the synthetic IRQ then deallocate it to its
         * originating domain.
         */
-       TODO();
+       free_percpu_irq(sirq,
+               &cobalt_machine_cpudata);
+
+       irq_dispose_mapping(sirq);
 }
 
 static inline void pipeline_post_sirq(int sirq)
 {
        /* Trigger the synthetic IRQ */
-       TODO();
+       irq_post_inband(sirq);
 }
 
-#endif /* !_COBALT_KERNEL_IPIPE_SIRQ_H */
+#endif /* !_COBALT_KERNEL_DOVETAIL_SIRQ_H */
-- 
2.26.2


Reply via email to