From mboxrd@z Thu Jan 1 00:00:00 1970 From: guoren@kernel.org Subject: [PATCH 11/13] csky: Add irq_work support Date: Sat, 1 Aug 2020 01:14:11 +0000 Message-ID: <1596244453-98575-12-git-send-email-guoren@kernel.org> References: <1596244453-98575-1-git-send-email-guoren@kernel.org> Return-path: Received: from mail.kernel.org ([198.145.29.99]:43920 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728324AbgHABO6 (ORCPT ); Fri, 31 Jul 2020 21:14:58 -0400 In-Reply-To: <1596244453-98575-1-git-send-email-guoren@kernel.org> Sender: linux-arch-owner@vger.kernel.org List-ID: To: guoren@kernel.org, arnd@arndb.de Cc: linux-kernel@vger.kernel.org, linux-csky@vger.kernel.org, linux-arch@vger.kernel.org, Guo Ren From: Guo Ren Running work in hardware interrupt context for csky. Implement: - arch_irq_work_raise() - arch_irq_work_has_interrupt() Signed-off-by: Guo Ren Cc: Arnd Bergmann --- arch/csky/include/asm/irq_work.h | 11 +++++++++++ arch/csky/kernel/smp.c | 12 ++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 arch/csky/include/asm/irq_work.h diff --git a/arch/csky/include/asm/irq_work.h b/arch/csky/include/asm/irq_work.h new file mode 100644 index 00000000..33aaf39 --- /dev/null +++ b/arch/csky/include/asm/irq_work.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __ASM_CSKY_IRQ_WORK_H +#define __ASM_CSKY_IRQ_WORK_H + +static inline bool arch_irq_work_has_interrupt(void) +{ + return true; +} +extern void arch_irq_work_raise(void); +#endif /* __ASM_CSKY_IRQ_WORK_H */ diff --git a/arch/csky/kernel/smp.c b/arch/csky/kernel/smp.c index 1945fb2..60f2ab1 100644 --- a/arch/csky/kernel/smp.c +++ b/arch/csky/kernel/smp.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,7 @@ enum ipi_message_type { IPI_EMPTY, IPI_RESCHEDULE, IPI_CALL_FUNC, + IPI_IRQ_WORK, IPI_MAX }; @@ -53,6 +55,9 @@ static irqreturn_t handle_ipi(int irq, void *dev) if (ops & (1 << IPI_CALL_FUNC)) generic_smp_call_function_interrupt(); + if (ops & (1 << IPI_IRQ_WORK)) + irq_work_run(); + BUG_ON((ops >> IPI_MAX) != 0); } @@ -108,6 +113,13 @@ void smp_send_reschedule(int cpu) send_ipi_message(cpumask_of(cpu), IPI_RESCHEDULE); } +#ifdef CONFIG_IRQ_WORK +void arch_irq_work_raise(void) +{ + send_ipi_message(cpumask_of(smp_processor_id()), IPI_IRQ_WORK); +} +#endif + void __init smp_prepare_boot_cpu(void) { } -- 2.7.4