From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <43D5FF83.7050305@domain.hid> Date: Tue, 24 Jan 2006 11:20:51 +0100 From: Wolfgang Grandegger MIME-Version: 1.0 Subject: Re: [Xenomai-core] Missing IRQ end function on PowerPC References: <43CE1C28.6060001@domain.hid> <17359.34362.870823.168739@domain.hid> <43CF8ECF.4020805@domain.hid> <17359.37814.257893.95482@domain.hid> In-Reply-To: <17359.37814.257893.95482@domain.hid> Content-Type: multipart/mixed; boundary="------------040501040506080502010405" List-Id: "Xenomai life and development \(bug reports, patches, discussions\)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gilles Chanteperdrix Cc: xenomai@xenomai.org This is a multi-part message in MIME format. --------------040501040506080502010405 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Gilles Chanteperdrix wrote: > Wolfgang Grandegger wrote: > > Therefore we need a dedicated function to re-enable interrupts in the > > ISR. We could name it *_end_irq, but maybe *_enable_isr_irq is more > > obvious. On non-PPC archs it would translate to *_irq_enable. I > > realized, that *_irq_enable is used in various place/skins and therefore > > I have not yet provided a patch. > > The function xnarch_irq_enable seems to be called in only two functions, > xintr_enable and xnintr_irq_handler when the flag XN_ISR_ENABLE is set. > > In any case, since I am not sure if this has to be done at the Adeos > level or in Xenomai, we will wait for Philippe to come back and decide. Attached is a temporary Xenomai patch fixing the IRQ end problem for the PowerPC arch. I had a closer look to the various IRQ end functions on PowerPC: ic_end(unsigned int irq) { ic_ack(irq); if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { ic_enable(irq); } } In most cases the end functions do the same than the begin functions but there are exceptions where the end functions do an additional ic_ack() as shown above. Wolfgang. --------------040501040506080502010405 Content-Type: text/x-patch; name="xenomai-2.1-end-irq.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xenomai-2.1-end-irq.patch" + diff -u xenomai/include/asm-generic/hal.h.IRQEND xenomai/include/asm-generic/hal.h --- xenomai/include/asm-generic/hal.h.IRQEND 2006-01-11 18:03:34.000000000 +0100 +++ xenomai/include/asm-generic/hal.h 2006-01-19 20:52:40.000000000 +0100 @@ -357,6 +357,8 @@ int rthal_irq_disable(unsigned irq); +int rthal_irq_end(unsigned irq); + int rthal_irq_host_request(unsigned irq, irqreturn_t (*handler)(int irq, void *dev_id, + diff -u xenomai/include/asm-generic/system.h.IRQEND xenomai/include/asm-generic/system.h --- xenomai/include/asm-generic/system.h.IRQEND 2006-01-11 18:03:34.000000000 +0100 +++ xenomai/include/asm-generic/system.h 2006-01-19 20:50:17.000000000 +0100 @@ -496,6 +496,12 @@ return rthal_irq_disable(irq); } +static inline int xnarch_end_irq (unsigned irq) + +{ + return rthal_irq_end(irq); +} + static inline void xnarch_chain_irq (unsigned irq) { + diff -u xenomai/include/asm-uvm/system.h.IRQEND xenomai/include/asm-uvm/system.h --- xenomai/include/asm-uvm/system.h.IRQEND 2006-01-11 18:03:34.000000000 +0100 +++ xenomai/include/asm-uvm/system.h 2006-01-19 20:51:36.000000000 +0100 @@ -296,6 +296,13 @@ return -ENOSYS; } +static inline int xnarch_end_irq (unsigned irq) + +{ + return -ENOSYS; +} + + static inline void xnarch_chain_irq (unsigned irq) { /* Nop */ } + diff -u xenomai/ksrc/arch/generic/hal.c.IRQEND xenomai/ksrc/arch/generic/hal.c --- xenomai/ksrc/arch/generic/hal.c.IRQEND 2006-01-11 18:03:42.000000000 +0100 +++ xenomai/ksrc/arch/generic/hal.c 2006-01-19 20:54:06.000000000 +0100 @@ -1156,6 +1156,7 @@ EXPORT_SYMBOL(rthal_irq_release); EXPORT_SYMBOL(rthal_irq_enable); EXPORT_SYMBOL(rthal_irq_disable); +EXPORT_SYMBOL(rthal_irq_end); EXPORT_SYMBOL(rthal_irq_host_request); EXPORT_SYMBOL(rthal_irq_host_release); EXPORT_SYMBOL(rthal_irq_host_pend); + diff -u xenomai/ksrc/arch/powerpc/hal.c.IRQEND xenomai/ksrc/arch/powerpc/hal.c --- xenomai/ksrc/arch/powerpc/hal.c.IRQEND 2006-01-11 18:03:41.000000000 +0100 +++ xenomai/ksrc/arch/powerpc/hal.c 2006-01-19 21:56:19.000000000 +0100 @@ -356,6 +356,27 @@ return 0; } +int rthal_irq_end (unsigned irq) + +{ + if (irq >= IPIPE_NR_XIRQS) + return -EINVAL; + + if (rthal_irq_descp(irq)->handler != NULL) + { + if (rthal_irq_descp(irq)->handler->end != NULL) + rthal_irq_descp(irq)->handler->end(irq); + else if (rthal_irq_descp(irq)->handler->enable != NULL) + rthal_irq_descp(irq)->handler->enable(irq); + else + return -ENODEV; + } + else + return -ENODEV; + + return 0; +} + static inline int do_exception_event (unsigned event, unsigned domid, void *data) { + diff -u xenomai/ksrc/nucleus/intr.c.IRQEND xenomai/ksrc/nucleus/intr.c --- xenomai/ksrc/nucleus/intr.c.IRQEND 2006-01-11 18:03:42.000000000 +0100 +++ xenomai/ksrc/nucleus/intr.c 2006-01-19 20:42:53.000000000 +0100 @@ -363,7 +363,7 @@ ++intr->hits; if (s & XN_ISR_ENABLE) - xnarch_enable_irq(irq); + xnarch_end_irq(irq); if (s & XN_ISR_CHAINED) xnarch_chain_irq(irq); --------------040501040506080502010405--