From: Hongzhan Chen <hongzhan.c...@intel.com> implement oob irq request and free and post for both TIMER_OOB_IPI and RESCHEDULE_OOB_IPI
Signed-off-by: Hongzhan Chen <hongzhan.c...@intel.com> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- .../kernel/dovetail/pipeline/pipeline.h | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/include/cobalt/kernel/dovetail/pipeline/pipeline.h b/include/cobalt/kernel/dovetail/pipeline/pipeline.h index 1d4e3f91d6..bbd45d13b3 100644 --- a/include/cobalt/kernel/dovetail/pipeline/pipeline.h +++ b/include/cobalt/kernel/dovetail/pipeline/pipeline.h @@ -8,9 +8,12 @@ #include <linux/irq_pipeline.h> #include <cobalt/kernel/assert.h> #include <asm/xenomai/features.h> +#include <pipeline/machine.h> typedef unsigned long spl_t; +void xnintr_core_clock_handler(void); + /* * We only keep the LSB when testing in SMP mode in order to strip off * the recursion marker (0x2) the nklock may store there. @@ -30,18 +33,28 @@ typedef unsigned long spl_t; #ifdef CONFIG_SMP +static irqreturn_t reschedule_interrupt_handler(int irq, void *dev_id) +{ + + /* Will reschedule from irq_exit_pipeline. */ + + return IRQ_HANDLED; +} + static inline int pipeline_request_resched_ipi(void (*handler)(void)) { /* Trap the out-of-band rescheduling interrupt. */ - TODO(); - - return 0; + return __request_percpu_irq(RESCHEDULE_OOB_IPI, + reschedule_interrupt_handler, + IRQF_OOB, + "Xenomai reschedule", + &cobalt_machine_cpudata); } static inline void pipeline_free_resched_ipi(void) { /* Release the out-of-band rescheduling interrupt. */ - TODO(); + free_percpu_irq(RESCHEDULE_OOB_IPI, &cobalt_machine_cpudata); } static inline void pipeline_send_resched_ipi(const struct cpumask *dest) @@ -50,21 +63,29 @@ static inline void pipeline_send_resched_ipi(const struct cpumask *dest) * Trigger the out-of-band rescheduling interrupt on remote * CPU(s). */ - TODO(); + irq_send_oob_ipi(RESCHEDULE_OOB_IPI, dest); +} + +static irqreturn_t timer_ipi_interrupt_handler(int irq, void *dev_id) +{ + xnintr_core_clock_handler(); + + return IRQ_HANDLED; } static inline int pipeline_request_timer_ipi(void (*handler)(void)) { /* Trap the out-of-band timer interrupt. */ - TODO(); - - return 0; + return __request_percpu_irq(TIMER_OOB_IPI, + timer_ipi_interrupt_handler, + IRQF_OOB, "Xenomai timer IPI", + &cobalt_machine_cpudata); } static inline void pipeline_free_timer_ipi(void) { /* Release the out-of-band timer interrupt. */ - TODO(); + free_percpu_irq(TIMER_OOB_IPI, &cobalt_machine_cpudata); } static inline void pipeline_send_timer_ipi(const struct cpumask *dest) @@ -72,7 +93,7 @@ static inline void pipeline_send_timer_ipi(const struct cpumask *dest) /* * Trigger the out-of-band timer interrupt on remote CPU(s). */ - TODO(); + irq_send_oob_ipi(TIMER_OOB_IPI, dest); } #else /* !CONFIG_SMP */ -- 2.26.2