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