* [PATCH dovetail v10 00/11] riscv: Add dovetail support
@ 2026-07-06 18:29 Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 01/11] riscv: introduce raw console device Tobias Schaffner
` (11 more replies)
0 siblings, 12 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Hi all,
this series introduces initial support for Dovetail on RISC-V.
Feedback, suggestions, and especially reviews are very welcome.
Changes since v1:
* Disable independent irq/softirq stack usage when pipelining
* Drop KVM changes as long as they can not be properly tested
Changes since v2:
* Rework trap handling
Changes since v3:
* Included the IRQ pipelining patches to have all riscv specific
patches included
* Rebased to dovetail/v6.18.y-dovetail-rebase
* Merged most of the fixes
* Fixed IRQ Stack handling and enabled IRQ_STACKS again
Changes since v4:
* Rebased to dovetail/v7.0.y-dovetail-rebase
* Applied suggestions from the last patch set
* Added starfive-visionfive2 board support
* Introduced raw console device based on sbi debug console
* Reworked pipelined irq handling
Changes since v5:
* Rebased to tip of dovetail/v7.0.y-dovetail-rebase
* Applied suggestions from the last patch set
* Use mark_trap_entry/exit_raw for kernel mode exception paths which
use irq_nmi_entry/exit for now, as the nmi irq handlers expect hard
irqs to stay off. This may be be subject to further optimization at
a later stage, but I do not see any negative impact latency wise in
my tests.
Changes since v6:
Address the review comments from the last patch set:
* Keep the virtual irq state in sync with the hard irq state in trap
handlers
* Fix irq_nesting imbalance when running with disabled IRQ_STACKS
Changes since v7:
* Simplify Trap handling
* Rebase to wip/flo/v7.1-dovetail-rebase
Changes since v8:
* Further simplify trap handling adressing Florians suggestions and
recent fixes to irq-entry-common
Changes since v9:
* Fix checkpatch finding in patch 11 "riscv: Add dovetail support"
Tobias Schaffner (11):
riscv: introduce raw console device
riscv: irq_pipeline: add IRQ pipelining core
irqchip/riscv-aplic-direct: enable pipelined interrupt control
irqchip/irq-riscv-aplic-msi: enable pipelined interrupt control
irqchip/irq-riscv-imsic-platform: enable pipelined interrupt control
irqchip/irq-riscv-intc: enable pipelined interrupt control
irqchip/irq-sifive-plic: enable pipelined interrupt control
clocksource/timer-riscv: irq_pipeline: enable pipelined clock events
pinctrl: starfive: irq_pipeline: enable pipelined interrupt control
PCI: plda: irq_pipeline: enable pipelined interrupt control
riscv: dovetail: add core support
arch/riscv/Kconfig | 3 +
arch/riscv/include/asm/dovetail.h | 24 +++
arch/riscv/include/asm/entry-common.h | 3 +-
arch/riscv/include/asm/irq_pipeline.h | 143 +++++++++++++
arch/riscv/include/asm/irqflags.h | 32 ++-
arch/riscv/include/asm/mmu_context.h | 2 +
arch/riscv/include/asm/smp.h | 25 +++
arch/riscv/include/asm/syscall.h | 6 +
arch/riscv/include/asm/thread_info.h | 17 ++
arch/riscv/kernel/Makefile | 2 +
arch/riscv/kernel/irq_pipeline.c | 26 +++
arch/riscv/kernel/kernel_mode_vector.c | 2 +-
arch/riscv/kernel/raw_printk.c | 33 +++
arch/riscv/kernel/sbi-ipi.c | 12 +-
arch/riscv/kernel/smp.c | 56 +++--
arch/riscv/kernel/smpboot.c | 2 +-
arch/riscv/kernel/traps.c | 199 +++++++++++++++---
arch/riscv/mm/context.c | 20 +-
arch/riscv/mm/fault.c | 8 +-
drivers/clocksource/timer-riscv.c | 11 +-
drivers/irqchip/irq-riscv-aplic-direct.c | 3 +-
drivers/irqchip/irq-riscv-aplic-msi.c | 3 +-
drivers/irqchip/irq-riscv-imsic-platform.c | 4 +-
drivers/irqchip/irq-riscv-intc.c | 2 +
drivers/irqchip/irq-sifive-plic.c | 10 +-
drivers/pci/controller/plda/pcie-plda-host.c | 2 +
.../starfive/pinctrl-starfive-jh7110.c | 2 +-
.../starfive/pinctrl-starfive-jh7110.h | 2 +-
28 files changed, 577 insertions(+), 77 deletions(-)
create mode 100644 arch/riscv/include/asm/dovetail.h
create mode 100644 arch/riscv/include/asm/irq_pipeline.h
create mode 100644 arch/riscv/kernel/irq_pipeline.c
create mode 100644 arch/riscv/kernel/raw_printk.c
--
2.43.0
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 01/11] riscv: introduce raw console device
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 02/11] riscv: irq_pipeline: add IRQ pipelining core Tobias Schaffner
` (10 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
arch/riscv/kernel/Makefile | 1 +
arch/riscv/kernel/raw_printk.c | 33 +++++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+)
create mode 100644 arch/riscv/kernel/raw_printk.c
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index cabb99cadfb6..4e310257499a 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -104,6 +104,7 @@ obj-$(CONFIG_RISCV_SBI) += sbi.o sbi_ecall.o
ifeq ($(CONFIG_RISCV_SBI), y)
obj-$(CONFIG_SMP) += sbi-ipi.o
obj-$(CONFIG_SMP) += cpu_ops_sbi.o
+obj-$(CONFIG_RAW_PRINTK) += raw_printk.o
endif
obj-$(CONFIG_HOTPLUG_CPU) += cpu-hotplug.o
obj-$(CONFIG_PARAVIRT) += paravirt.o
diff --git a/arch/riscv/kernel/raw_printk.c b/arch/riscv/kernel/raw_printk.c
new file mode 100644
index 000000000000..aa2f287daa29
--- /dev/null
+++ b/arch/riscv/kernel/raw_printk.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Raw console device for RISC-V using SBI debug console (DBCN).
+ *
+ * Copyright (C) 2026 Siemens AG
+ * Author: Tobias Schaffner <tobias.schaffner@siemens.com>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/console.h>
+#include <linux/init.h>
+#include <asm/sbi.h>
+
+static void raw_console_write(struct console *co,
+ const char *s, unsigned int count)
+{
+ sbi_debug_console_write(s, count);
+}
+
+static struct console raw_console = {
+ .name = "rawcon",
+ .write_raw = raw_console_write,
+ .flags = CON_PRINTBUFFER | CON_ENABLED,
+ .index = -1,
+};
+
+static int __init raw_console_init(void)
+{
+ register_console(&raw_console);
+
+ return 0;
+}
+console_initcall(raw_console_init);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 02/11] riscv: irq_pipeline: add IRQ pipelining core
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 01/11] riscv: introduce raw console device Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 03/11] irqchip/riscv-aplic-direct: enable pipelined interrupt control Tobias Schaffner
` (9 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner, shannmu
This patchset integrates IRQ pipelining into the RISC-V architecture,
bringing it in line with the Dovetail/IRQ pipeline model used on other
architectures. It adds the core pipelining infrastructure and adapts
low-level primitives to cleanly separate in-band and out-of-band
interrupt handling.
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Co-authored-by: shannmu <shanmu1901@gmail.com>
Co-authored-by: Philippe Gerum <rpm@xenomai.org>
---
arch/riscv/Kconfig | 1 +
arch/riscv/include/asm/entry-common.h | 3 +-
arch/riscv/include/asm/irq_pipeline.h | 143 +++++++++++++++++++++++++
arch/riscv/include/asm/irqflags.h | 32 ++++--
arch/riscv/include/asm/smp.h | 25 +++++
arch/riscv/include/asm/thread_info.h | 9 ++
arch/riscv/kernel/Makefile | 1 +
arch/riscv/kernel/irq_pipeline.c | 26 +++++
arch/riscv/kernel/kernel_mode_vector.c | 2 +-
arch/riscv/kernel/sbi-ipi.c | 12 ++-
arch/riscv/kernel/smp.c | 56 ++++++----
arch/riscv/kernel/smpboot.c | 2 +-
arch/riscv/kernel/traps.c | 85 +++++++++++++++
arch/riscv/mm/fault.c | 8 +-
14 files changed, 370 insertions(+), 35 deletions(-)
create mode 100644 arch/riscv/include/asm/irq_pipeline.h
create mode 100644 arch/riscv/kernel/irq_pipeline.c
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index c5754942cf85..7c58654c4ece 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -150,6 +150,7 @@ config RISCV
select HAVE_ARCH_USERFAULTFD_MINOR if 64BIT && USERFAULTFD
select HAVE_ARCH_USERFAULTFD_WP if 64BIT && MMU && USERFAULTFD && RISCV_ISA_SVRSW60T59B
select HAVE_ARCH_VMAP_STACK if MMU && 64BIT
+ select HAVE_IRQ_PIPELINE
select HAVE_ASM_MODVERSIONS
select HAVE_CONTEXT_TRACKING_USER
select HAVE_DEBUG_KMEMLEAK
diff --git a/arch/riscv/include/asm/entry-common.h b/arch/riscv/include/asm/entry-common.h
index 34ed149af5d1..28ea8090316d 100644
--- a/arch/riscv/include/asm/entry-common.h
+++ b/arch/riscv/include/asm/entry-common.h
@@ -22,7 +22,8 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
-void handle_page_fault(struct pt_regs *regs);
+struct irqentry_state;
+void handle_page_fault(struct pt_regs *regs, struct irqentry_state state);
void handle_break(struct pt_regs *regs);
#ifdef CONFIG_RISCV_MISALIGNED
diff --git a/arch/riscv/include/asm/irq_pipeline.h b/arch/riscv/include/asm/irq_pipeline.h
new file mode 100644
index 000000000000..d4d4b7e79c67
--- /dev/null
+++ b/arch/riscv/include/asm/irq_pipeline.h
@@ -0,0 +1,143 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * IRQ Pipelining adapted from the ARM version.
+ *
+ * Copyright (C) 2024-2026 Siemens AG
+ * Author: Tobias Schaffner <tobias.schaffner@siemens.com>.
+ */
+
+#ifndef _ASM_RISCV_IRQ_PIPELINE_H
+#define _ASM_RISCV_IRQ_PIPELINE_H
+
+#ifdef CONFIG_IRQ_PIPELINE
+
+#include <asm/ptrace.h>
+#include <asm/smp.h>
+
+#define OOB_NR_IPI 3
+
+extern int ipi_virq_base;
+
+#define CALL_FUNCTION_OOB_IPI (ipi_virq_base + OOB_CALL_FUNCTION_IPI)
+#define RESCHEDULE_OOB_IPI (ipi_virq_base + OOB_RESCHEDULE_IPI)
+#define TIMER_OOB_IPI (ipi_virq_base + OOB_TIMER_IPI)
+
+/* NOTE: Any bit should be fine as long as we don't hit SR_SIE or SR_MIE. */
+#define IRQMASK_i_POS 31
+
+static inline notrace
+unsigned long arch_irqs_virtual_to_native_flags(int stalled)
+{
+ if (!stalled)
+ return SR_IE;
+ return 0;
+}
+
+static inline notrace
+unsigned long arch_irqs_native_to_virtual_flags(unsigned long flags)
+{
+ return (!!native_irqs_disabled_flags(flags)) << IRQMASK_i_POS;
+}
+
+static inline int arch_irqs_disabled_flags(unsigned long flags)
+{
+ return native_irqs_disabled_flags(flags);
+}
+
+static inline notrace void arch_local_irq_enable(void)
+{
+ barrier();
+ inband_irq_enable();
+}
+
+static inline notrace void arch_local_irq_disable(void)
+{
+ inband_irq_disable();
+ barrier();
+}
+
+static inline notrace unsigned long arch_local_save_flags(void)
+{
+ int stalled = inband_irqs_disabled();
+
+ barrier();
+ return arch_irqs_virtual_to_native_flags(stalled);
+}
+
+static inline notrace unsigned long arch_local_irq_save(void)
+{
+ int stalled = inband_irq_save();
+
+ barrier();
+ return arch_irqs_virtual_to_native_flags(stalled);
+}
+
+/* set interrupt enabled status */
+static inline void arch_local_irq_restore(unsigned long flags)
+{
+ inband_irq_restore(arch_irqs_disabled_flags(flags));
+ barrier();
+}
+
+static inline
+void arch_save_timer_regs(struct pt_regs *dst, struct pt_regs *src)
+{
+ dst->status = src->status;
+ dst->epc = src->epc;
+}
+
+#else /* !CONFIG_IRQ_PIPELINE */
+
+static inline unsigned long arch_local_irq_save(void)
+{
+ return native_irq_save();
+}
+
+static inline void arch_local_irq_enable(void)
+{
+ native_irq_enable();
+}
+
+static inline void arch_local_irq_disable(void)
+{
+ native_irq_disable();
+}
+
+static inline unsigned long arch_local_save_flags(void)
+{
+ return native_save_flags();
+}
+
+static inline void arch_local_irq_restore(unsigned long flags)
+{
+ native_irq_restore(flags);
+}
+
+static inline int arch_irqs_disabled_flags(unsigned long flags)
+{
+ return native_irqs_disabled_flags(flags);
+}
+
+#endif /* !CONFIG_IRQ_PIPELINE */
+
+/* test hardware interrupt enable bit */
+static inline int arch_irqs_disabled(void)
+{
+ return arch_irqs_disabled_flags(arch_local_save_flags());
+}
+
+struct pt_regs;
+
+extern void (*handle_arch_irq)(struct pt_regs *);
+
+static inline void arch_handle_irq_pipelined(struct pt_regs *regs)
+{
+ handle_arch_irq(regs);
+}
+
+static inline int arch_enable_oob_stage(void)
+{
+ return 0;
+}
+
+#endif /* _ASM_RISCV_IRQ_PIPELINE_H */
diff --git a/arch/riscv/include/asm/irqflags.h b/arch/riscv/include/asm/irqflags.h
index 6fd8cbfcfcc7..c3087b74752b 100644
--- a/arch/riscv/include/asm/irqflags.h
+++ b/arch/riscv/include/asm/irqflags.h
@@ -10,45 +10,57 @@
#include <asm/csr.h>
/* read interrupt enabled status */
-static inline unsigned long arch_local_save_flags(void)
+static inline unsigned long native_save_flags(void)
{
- return csr_read(CSR_STATUS);
+ return csr_read(CSR_STATUS) & SR_IE;
}
/* unconditionally enable interrupts */
-static inline void arch_local_irq_enable(void)
+static inline void native_irq_enable(void)
{
csr_set(CSR_STATUS, SR_IE);
}
/* unconditionally disable interrupts */
-static inline void arch_local_irq_disable(void)
+static inline void native_irq_disable(void)
{
csr_clear(CSR_STATUS, SR_IE);
}
/* get status and disable interrupts */
-static inline unsigned long arch_local_irq_save(void)
+static inline unsigned long native_irq_save(void)
{
return csr_read_clear(CSR_STATUS, SR_IE);
}
/* test flags */
-static inline int arch_irqs_disabled_flags(unsigned long flags)
+static inline int native_irqs_disabled_flags(unsigned long flags)
{
return !(flags & SR_IE);
}
/* test hardware interrupt enable bit */
-static inline int arch_irqs_disabled(void)
+static inline bool native_irqs_disabled(void)
{
- return arch_irqs_disabled_flags(arch_local_save_flags());
+ return native_irqs_disabled_flags(native_save_flags());
}
/* set interrupt enabled status */
-static inline void arch_local_irq_restore(unsigned long flags)
+static inline void native_irq_restore(unsigned long flags)
{
- csr_set(CSR_STATUS, flags & SR_IE);
+ if (flags & SR_IE)
+ csr_set(CSR_STATUS, SR_IE);
+ else
+ csr_clear(CSR_STATUS, SR_IE);
+}
+
+#include <asm/irq_pipeline.h>
+
+static inline void native_irq_sync(void)
+{
+ native_irq_enable();
+ asm volatile("nop" : : : "memory");
+ native_irq_disable();
}
#endif /* _ASM_RISCV_IRQFLAGS_H */
diff --git a/arch/riscv/include/asm/smp.h b/arch/riscv/include/asm/smp.h
index 0ecc67641b09..8a409484d002 100644
--- a/arch/riscv/include/asm/smp.h
+++ b/arch/riscv/include/asm/smp.h
@@ -15,6 +15,31 @@
struct seq_file;
extern unsigned long boot_cpu_hartid;
+#ifdef CONFIG_IRQ_PIPELINE
+extern int ipi_max;
+#define IRQ_RISCV_IPI_MAX ipi_max
+#else
+#define IRQ_RISCV_IPI_MAX BITS_PER_BYTE
+#endif
+
+enum ipi_message_type {
+ IPI_RESCHEDULE,
+ IPI_CALL_FUNC,
+ IPI_CPU_STOP,
+ IPI_CPU_CRASH_STOP,
+ IPI_IRQ_WORK,
+ IPI_TIMER,
+ IPI_CPU_BACKTRACE,
+ IPI_KGDB_ROUNDUP,
+#ifdef CONFIG_IRQ_PIPELINE
+ OOB_TIMER_IPI,
+ OOB_RESCHEDULE_IPI,
+ OOB_CALL_FUNCTION_IPI,
+#endif
+ IPI_MAX,
+
+};
+
#ifdef CONFIG_SMP
#include <linux/jump_label.h>
diff --git a/arch/riscv/include/asm/thread_info.h b/arch/riscv/include/asm/thread_info.h
index 55019fdfa9ec..8bfb02064f48 100644
--- a/arch/riscv/include/asm/thread_info.h
+++ b/arch/riscv/include/asm/thread_info.h
@@ -52,6 +52,10 @@
*/
struct thread_info {
unsigned long flags; /* low level flags */
+#ifdef CONFIG_IRQ_PIPELINE
+ __u32 local_flags; /* local (synchronous) flags */
+#define ti_local_flags(__ti) ((__ti)->local_flags)
+#endif
int preempt_count; /* 0=>preemptible, <0=>BUG */
/*
* These stack pointers are overwritten on every system call or
@@ -124,4 +128,9 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
#define _TIF_RISCV_V_DEFER_RESTORE BIT(TIF_RISCV_V_DEFER_RESTORE)
+/*
+ * Local (synchronous) thread flags.
+ */
+#define _TLF_OOB 0x0001
+
#endif /* _ASM_RISCV_THREAD_INFO_H */
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 4e310257499a..fb51d1bc5e3a 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -93,6 +93,7 @@ obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_MODULE_SECTIONS) += module-sections.o
obj-$(CONFIG_CPU_PM) += suspend_entry.o suspend.o
+obj-$(CONFIG_IRQ_PIPELINE) += irq_pipeline.o
obj-$(CONFIG_HIBERNATION) += hibernate.o hibernate-asm.o
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
diff --git a/arch/riscv/kernel/irq_pipeline.c b/arch/riscv/kernel/irq_pipeline.c
new file mode 100644
index 000000000000..a478e9c3b3a4
--- /dev/null
+++ b/arch/riscv/kernel/irq_pipeline.c
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * IRQ Pipelining implementation adapted from the ARM version.
+ *
+ * Copyright (C) 2024-2026 Siemens AG
+ * Author: Tobias Schaffner <tobias.schaffner@siemens.com>.
+ */
+#include <linux/irq.h>
+#include <linux/irq_pipeline.h>
+
+void arch_do_IRQ_pipelined(struct irq_desc *desc)
+{
+ struct pt_regs *regs = raw_cpu_ptr(&irq_pipeline.tick_regs);
+ struct pt_regs *old_regs = set_irq_regs(regs);
+
+ irq_enter_rcu();
+ handle_irq_desc(desc);
+ irq_exit_rcu();
+
+ set_irq_regs(old_regs);
+}
+
+void __init arch_irq_pipeline_init(void)
+{
+ /* no per-arch init. */
+}
diff --git a/arch/riscv/kernel/kernel_mode_vector.c b/arch/riscv/kernel/kernel_mode_vector.c
index 99972a48e86b..c4444577449c 100644
--- a/arch/riscv/kernel/kernel_mode_vector.c
+++ b/arch/riscv/kernel/kernel_mode_vector.c
@@ -171,7 +171,7 @@ asmlinkage void riscv_v_context_nesting_end(struct pt_regs *regs)
struct __riscv_v_ext_state *vstate = ¤t->thread.kernel_vstate;
u32 depth;
- WARN_ON(!irqs_disabled());
+ WARN_ON(!hard_irqs_disabled());
if (!riscv_preempt_v_started(current))
return;
diff --git a/arch/riscv/kernel/sbi-ipi.c b/arch/riscv/kernel/sbi-ipi.c
index 0cc5559c08d8..600e2b51f1de 100644
--- a/arch/riscv/kernel/sbi-ipi.c
+++ b/arch/riscv/kernel/sbi-ipi.c
@@ -57,7 +57,7 @@ void __init sbi_ipi_init(void)
return;
}
- virq = ipi_mux_create(BITS_PER_BYTE, sbi_send_ipi);
+ virq = ipi_mux_create(IRQ_RISCV_IPI_MAX, sbi_send_ipi);
if (virq <= 0) {
pr_err("unable to create muxed IPIs\n");
irq_dispose_mapping(sbi_ipi_virq);
@@ -75,12 +75,18 @@ void __init sbi_ipi_init(void)
"irqchip/sbi-ipi:starting",
sbi_ipi_starting_cpu, NULL);
- riscv_ipi_set_virq_range(virq, BITS_PER_BYTE);
+ riscv_ipi_set_virq_range(virq, IRQ_RISCV_IPI_MAX);
pr_info("providing IPIs using SBI IPI extension\n");
/*
* Use the SBI remote fence extension to avoid
* the extra context switch needed to handle IPIs.
+ *
+ * When the IRQ pipeline is enabled, avoid the SBI remote fence
+ * extension because SBI rfence traps to M-mode via ecall.
+ * Use the IPI-based fence path instead, which stays entirely in
+ * S-mode and can be preempted by OOB interrupts.
*/
- static_branch_enable(&riscv_sbi_for_rfence);
+ if (!irqs_pipelined())
+ static_branch_enable(&riscv_sbi_for_rfence);
}
diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
index 5ed5095320e6..8f842aec1e0e 100644
--- a/arch/riscv/kernel/smp.c
+++ b/arch/riscv/kernel/smp.c
@@ -21,6 +21,7 @@
#include <linux/seq_file.h>
#include <linux/delay.h>
#include <linux/irq.h>
+#include <linux/irq_pipeline.h>
#include <linux/irq_work.h>
#include <linux/nmi.h>
@@ -28,18 +29,6 @@
#include <asm/cacheflush.h>
#include <asm/cpu_ops.h>
-enum ipi_message_type {
- IPI_RESCHEDULE,
- IPI_CALL_FUNC,
- IPI_CPU_STOP,
- IPI_CPU_CRASH_STOP,
- IPI_IRQ_WORK,
- IPI_TIMER,
- IPI_CPU_BACKTRACE,
- IPI_KGDB_ROUNDUP,
- IPI_MAX
-};
-
static const char * const ipi_names[] = {
[IPI_RESCHEDULE] = "Rescheduling interrupts",
[IPI_CALL_FUNC] = "Function call interrupts",
@@ -49,6 +38,11 @@ static const char * const ipi_names[] = {
[IPI_TIMER] = "Timer broadcast interrupts",
[IPI_CPU_BACKTRACE] = "CPU backtrace interrupts",
[IPI_KGDB_ROUNDUP] = "KGDB roundup interrupts",
+#ifdef CONFIG_IRQ_PIPELINE
+ [OOB_TIMER_IPI] = "OOB timer interrupts",
+ [OOB_RESCHEDULE_IPI] = "OOB reschedule interrupts",
+ [OOB_CALL_FUNCTION_IPI] = "OOB call function interrupts",
+#endif
};
unsigned long __cpuid_to_hartid_map[NR_CPUS] __ro_after_init = {
@@ -63,11 +57,35 @@ void __init smp_setup_processor_id(void)
pr_info("Booting Linux on hartid %lu\n", boot_cpu_hartid);
}
-static DEFINE_PER_CPU_READ_MOSTLY(int, ipi_dummy_dev);
-static int ipi_virq_base __ro_after_init;
+int ipi_virq_base __ro_after_init;
static int nr_ipi __ro_after_init = IPI_MAX;
static struct irq_desc *ipi_desc[IPI_MAX] __read_mostly;
+#ifdef CONFIG_IRQ_PIPELINE
+#define INBAND_IPI_MAX (IPI_MAX - OOB_NR_IPI)
+int ipi_max __ro_after_init = IPI_MAX;
+
+void irq_send_oob_ipi(unsigned int irq,
+ const struct cpumask *cpumask)
+{
+ unsigned int op = irq - ipi_virq_base;
+
+ if (WARN_ON(irq_pipeline_debug() &&
+ (op < INBAND_IPI_MAX ||
+ op >= IPI_MAX)))
+ return;
+
+ /* Init oob ipis at first involve*/
+ if (unlikely(ipi_desc[op] == NULL))
+ ipi_desc[op] = irq_to_desc(irq);
+
+ __ipi_send_mask(ipi_desc[op], cpumask);
+}
+EXPORT_SYMBOL_GPL(irq_send_oob_ipi);
+#else
+#define INBAND_IPI_MAX IPI_MAX
+#endif
+
int riscv_hartid_to_cpuid(unsigned long hartid)
{
int i;
@@ -95,7 +113,7 @@ static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs)
atomic_dec(&waiting_for_crash_ipi);
- local_irq_disable();
+ local_irq_disable_full();
#ifdef CONFIG_HOTPLUG_CPU
if (cpu_has_hotplug(cpu))
@@ -209,9 +227,11 @@ void riscv_ipi_set_virq_range(int virq, int nr)
/* Request IPIs */
for (i = 0; i < nr_ipi; i++) {
- err = request_percpu_irq(ipi_virq_base + i, handle_IPI,
- ipi_names[i], &ipi_dummy_dev);
- WARN_ON(err);
+ if (i < INBAND_IPI_MAX) {
+ err = request_percpu_irq(ipi_virq_base + i, handle_IPI,
+ ipi_names[i], &irq_stat);
+ WARN_ON(err);
+ }
ipi_desc[i] = irq_to_desc(ipi_virq_base + i);
irq_set_status_flags(ipi_virq_base + i, IRQ_HIDDEN);
diff --git a/arch/riscv/kernel/smpboot.c b/arch/riscv/kernel/smpboot.c
index 8b628580fe11..3eda9cbb31c3 100644
--- a/arch/riscv/kernel/smpboot.c
+++ b/arch/riscv/kernel/smpboot.c
@@ -259,6 +259,6 @@ asmlinkage __visible void smp_callin(void)
#ifndef CONFIG_HOTPLUG_PARALLEL
complete(&cpu_running);
#endif
- local_irq_enable();
+ local_irq_enable_full();
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
}
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 8c62c771a656..fe6c547c93e4 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -112,10 +112,32 @@ void die(struct pt_regs *regs, const char *str)
make_task_dead(SIGSEGV);
}
+static __always_inline
+bool mark_trap_entry(struct pt_regs *regs)
+{
+ if (likely(running_inband())) {
+ if (user_mode(regs))
+ hard_cond_local_irq_enable();
+ return true;
+ }
+
+ return false;
+}
+
+static __always_inline
+void mark_trap_exit(struct pt_regs *regs)
+{
+ if (likely(running_inband()) && user_mode(regs))
+ hard_cond_local_irq_disable();
+}
+
void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr)
{
struct task_struct *tsk = current;
+ if (!mark_trap_entry(regs))
+ return;
+
if (show_unhandled_signals && unhandled_signal(tsk, signo)
&& printk_ratelimit()) {
pr_info("%s[%d]: unhandled signal %d code 0x%x at 0x" REG_FMT,
@@ -127,6 +149,8 @@ void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr)
}
force_sig_fault(signo, code, (void __user *)addr);
+
+ mark_trap_exit(regs);
}
static void do_trap_error(struct pt_regs *regs, int signo, int code,
@@ -421,6 +445,65 @@ asmlinkage __visible noinstr void do_page_fault(struct pt_regs *regs)
}
#endif
+#ifdef CONFIG_IRQ_PIPELINE
+
+extern void (*handle_arch_irq)(struct pt_regs *);
+
+static void noinstr handle_riscv_irq_pipelined(struct pt_regs *regs)
+{
+ struct pt_regs *old_regs = set_irq_regs(regs);
+ handle_arch_irq(regs);
+ set_irq_regs(old_regs);
+}
+
+DEFINE_PER_CPU(int, irq_nesting);
+
+static void noinstr handle_riscv_irq_pipelined_on_stack(struct pt_regs *regs)
+{
+ int nesting = this_cpu_inc_return(irq_nesting);
+
+ if (IS_ENABLED(CONFIG_IRQ_STACKS) && nesting == 1)
+ call_on_irq_stack(regs, handle_riscv_irq_pipelined);
+ else
+ handle_riscv_irq_pipelined(regs);
+ this_cpu_dec(irq_nesting);
+}
+
+asmlinkage void noinstr do_irq(struct pt_regs *regs)
+{
+ irqentry_state_t state;
+ struct irq_stage_data *prevd;
+
+ /* OOB fast path: Log the IRQ and return. */
+ if (unlikely(running_oob() || irqs_disabled())) {
+ instrumentation_begin();
+ prevd = handle_irq_pipelined_prepare(regs);
+ handle_riscv_irq_pipelined(regs);
+ handle_irq_pipelined_finish(prevd, regs);
+ if (running_inband() && user_mode(regs)) {
+ stall_inband_nocheck();
+ irqentry_exit_to_user_mode(regs);
+ }
+ instrumentation_end();
+ return;
+ }
+
+ /* Handle inband IRQ. */
+ state = irqentry_enter(regs);
+ instrumentation_begin();
+ prevd = handle_irq_pipelined_prepare(regs);
+ handle_riscv_irq_pipelined_on_stack(regs);
+ trace_hardirqs_on();
+ unstall_inband_nocheck();
+ handle_irq_pipelined_finish(prevd, regs);
+ stall_inband_nocheck();
+ trace_hardirqs_off();
+ instrumentation_end();
+ irqentry_exit(regs, state);
+}
+
+#else /* !CONFIG_IRQ_PIPELINE */
+
static void noinstr handle_riscv_irq(struct pt_regs *regs)
{
struct pt_regs *old_regs;
@@ -444,6 +527,8 @@ asmlinkage void noinstr do_irq(struct pt_regs *regs)
irqentry_exit(regs, state);
}
+#endif /* !CONFIG_IRQ_PIPELINE */
+
#ifdef CONFIG_GENERIC_BUG
int is_valid_bugaddr(unsigned long pc)
{
diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c
index 04ed6f8acae4..c5709112c346 100644
--- a/arch/riscv/mm/fault.c
+++ b/arch/riscv/mm/fault.c
@@ -79,6 +79,7 @@ static void show_pte(unsigned long addr)
static void die_kernel_fault(const char *msg, unsigned long addr,
struct pt_regs *regs)
{
+ irq_pipeline_oops();
bust_spinlocks(1);
pr_alert("Unable to handle kernel %s at virtual address " REG_FMT "\n", msg,
@@ -275,7 +276,7 @@ static inline bool access_error(unsigned long cause, struct vm_area_struct *vma)
* This routine handles page faults. It determines the address and the
* problem, and then passes it off to one of the appropriate routines.
*/
-void handle_page_fault(struct pt_regs *regs)
+void handle_page_fault(struct pt_regs *regs, irqentry_state_t state)
{
struct task_struct *tsk;
struct vm_area_struct *vma;
@@ -315,8 +316,13 @@ void handle_page_fault(struct pt_regs *regs)
}
/* Enable interrupts if they were enabled in the parent context. */
+#ifdef CONFIG_IRQ_PIPELINE
+ if (state.stage_info != IRQENTRY_INBAND_STALLED)
+ local_irq_enable_full();
+#else
if (!regs_irqs_disabled(regs))
local_irq_enable();
+#endif
/*
* If we're in an interrupt, have no user context, or are running
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 03/11] irqchip/riscv-aplic-direct: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 01/11] riscv: introduce raw console device Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 02/11] riscv: irq_pipeline: add IRQ pipelining core Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 04/11] irqchip/irq-riscv-aplic-msi: " Tobias Schaffner
` (8 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/irqchip/irq-riscv-aplic-direct.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/irqchip/irq-riscv-aplic-direct.c b/drivers/irqchip/irq-riscv-aplic-direct.c
index 5a9650225dd8..b5d7205e1055 100644
--- a/drivers/irqchip/irq-riscv-aplic-direct.c
+++ b/drivers/irqchip/irq-riscv-aplic-direct.c
@@ -89,7 +89,8 @@ static struct irq_chip aplic_direct_chip = {
#endif
.flags = IRQCHIP_SET_TYPE_MASKED |
IRQCHIP_SKIP_SET_WAKE |
- IRQCHIP_MASK_ON_SUSPEND,
+ IRQCHIP_MASK_ON_SUSPEND |
+ IRQCHIP_PIPELINE_SAFE,
};
static int aplic_direct_irqdomain_translate(struct irq_domain *d, struct irq_fwspec *fwspec,
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 04/11] irqchip/irq-riscv-aplic-msi: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (2 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 03/11] irqchip/riscv-aplic-direct: enable pipelined interrupt control Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 05/11] irqchip/irq-riscv-imsic-platform: " Tobias Schaffner
` (7 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/irqchip/irq-riscv-aplic-msi.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/irqchip/irq-riscv-aplic-msi.c b/drivers/irqchip/irq-riscv-aplic-msi.c
index fb8d1838609f..25de8929ea37 100644
--- a/drivers/irqchip/irq-riscv-aplic-msi.c
+++ b/drivers/irqchip/irq-riscv-aplic-msi.c
@@ -156,7 +156,8 @@ static const struct msi_domain_template aplic_msi_template = {
.irq_write_msi_msg = aplic_msi_write_msg,
.flags = IRQCHIP_SET_TYPE_MASKED |
IRQCHIP_SKIP_SET_WAKE |
- IRQCHIP_MASK_ON_SUSPEND,
+ IRQCHIP_MASK_ON_SUSPEND |
+ IRQCHIP_PIPELINE_SAFE,
},
.ops = {
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 05/11] irqchip/irq-riscv-imsic-platform: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (3 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 04/11] irqchip/irq-riscv-aplic-msi: " Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 06/11] irqchip/irq-riscv-intc: " Tobias Schaffner
` (6 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/irqchip/irq-riscv-imsic-platform.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/irqchip/irq-riscv-imsic-platform.c b/drivers/irqchip/irq-riscv-imsic-platform.c
index 643c8e459611..0b0dafecbfff 100644
--- a/drivers/irqchip/irq-riscv-imsic-platform.c
+++ b/drivers/irqchip/irq-riscv-imsic-platform.c
@@ -219,7 +219,9 @@ static struct irq_chip imsic_irq_base_chip = {
.irq_retrigger = imsic_irq_retrigger,
.irq_ack = imsic_irq_ack,
.irq_compose_msi_msg = imsic_irq_compose_msg,
- .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND,
+ .flags = IRQCHIP_SKIP_SET_WAKE |
+ IRQCHIP_MASK_ON_SUSPEND |
+ IRQCHIP_PIPELINE_SAFE,
};
static int imsic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 06/11] irqchip/irq-riscv-intc: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (4 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 05/11] irqchip/irq-riscv-imsic-platform: " Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 07/11] irqchip/irq-sifive-plic: " Tobias Schaffner
` (5 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/irqchip/irq-riscv-intc.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/irqchip/irq-riscv-intc.c b/drivers/irqchip/irq-riscv-intc.c
index 84418dbd5a27..855ce8dde27a 100644
--- a/drivers/irqchip/irq-riscv-intc.c
+++ b/drivers/irqchip/irq-riscv-intc.c
@@ -111,6 +111,7 @@ static struct irq_chip riscv_intc_chip = {
.irq_mask = riscv_intc_irq_mask,
.irq_unmask = riscv_intc_irq_unmask,
.irq_eoi = riscv_intc_irq_eoi,
+ .flags = IRQCHIP_PIPELINE_SAFE,
};
static struct irq_chip andes_intc_chip = {
@@ -118,6 +119,7 @@ static struct irq_chip andes_intc_chip = {
.irq_mask = andes_intc_irq_mask,
.irq_unmask = andes_intc_irq_unmask,
.irq_eoi = riscv_intc_irq_eoi,
+ .flags = IRQCHIP_PIPELINE_SAFE,
};
static int riscv_intc_domain_map(struct irq_domain *d, unsigned int irq,
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 07/11] irqchip/irq-sifive-plic: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (5 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 06/11] irqchip/irq-riscv-intc: " Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 08/11] clocksource/timer-riscv: irq_pipeline: enable pipelined clock events Tobias Schaffner
` (4 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/irqchip/irq-sifive-plic.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c
index 5b0dac104814..e9ea0c86366e 100644
--- a/drivers/irqchip/irq-sifive-plic.c
+++ b/drivers/irqchip/irq-sifive-plic.c
@@ -88,7 +88,7 @@ struct plic_handler {
* Protect mask operations on the registers given that we can't
* assume atomic memory operations work on them.
*/
- raw_spinlock_t enable_lock;
+ hard_spinlock_t enable_lock;
void __iomem *enable_base;
u32 *enable_save;
struct plic_priv *priv;
@@ -227,7 +227,8 @@ static struct irq_chip plic_edge_chip = {
#endif
.irq_set_type = plic_irq_set_type,
.flags = IRQCHIP_SKIP_SET_WAKE |
- IRQCHIP_AFFINITY_PRE_STARTUP,
+ IRQCHIP_AFFINITY_PRE_STARTUP |
+ IRQCHIP_PIPELINE_SAFE,
};
static struct irq_chip plic_chip = {
@@ -242,7 +243,8 @@ static struct irq_chip plic_chip = {
#endif
.irq_set_type = plic_irq_set_type,
.flags = IRQCHIP_SKIP_SET_WAKE |
- IRQCHIP_AFFINITY_PRE_STARTUP,
+ IRQCHIP_AFFINITY_PRE_STARTUP |
+ IRQCHIP_PIPELINE_SAFE,
};
static int plic_irq_set_type(struct irq_data *d, unsigned int type)
@@ -444,7 +446,7 @@ static irq_hw_number_t cp100_get_hwirq(struct plic_handler *handler, void __iome
u32 iso_mask;
int i;
- guard(raw_spinlock)(&handler->enable_lock);
+ guard(hard_spinlock)(&handler->enable_lock);
/* Existing enable state is already cached in enable_save */
iso_mask = cp100_isolate_pending_irq(nr_irq_groups, handler);
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 08/11] clocksource/timer-riscv: irq_pipeline: enable pipelined clock events
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (6 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 07/11] irqchip/irq-sifive-plic: " Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 09/11] pinctrl: starfive: irq_pipeline: enable pipelined interrupt control Tobias Schaffner
` (3 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/clocksource/timer-riscv.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/clocksource/timer-riscv.c b/drivers/clocksource/timer-riscv.c
index cfc4d83c42c0..fceebef28978 100644
--- a/drivers/clocksource/timer-riscv.c
+++ b/drivers/clocksource/timer-riscv.c
@@ -71,7 +71,8 @@ static int riscv_clock_shutdown(struct clock_event_device *evt)
static unsigned int riscv_clock_event_irq;
static DEFINE_PER_CPU(struct clock_event_device, riscv_clock_event) = {
.name = "riscv_timer_clockevent",
- .features = CLOCK_EVT_FEAT_ONESHOT,
+ .features = CLOCK_EVT_FEAT_ONESHOT |
+ CLOCK_EVT_FEAT_PIPELINE,
.rating = 100,
.set_next_event = riscv_clock_next_event,
.set_state_shutdown = riscv_clock_shutdown,
@@ -150,7 +151,7 @@ static irqreturn_t riscv_timer_interrupt(int irq, void *dev_id)
struct clock_event_device *evdev = this_cpu_ptr(&riscv_clock_event);
riscv_clock_event_stop();
- evdev->event_handler(evdev);
+ clockevents_handle_event(evdev);
return IRQ_HANDLED;
}
@@ -182,9 +183,9 @@ static int __init riscv_timer_init_common(void)
sched_clock_register(riscv_sched_clock, 64, riscv_timebase);
- error = request_percpu_irq(riscv_clock_event_irq,
- riscv_timer_interrupt,
- "riscv-timer", &riscv_clock_event);
+ error = request_percpu_irq_affinity_flags(riscv_clock_event_irq,
+ riscv_timer_interrupt, IRQF_TIMER,
+ "riscv-timer", NULL, &riscv_clock_event);
if (error) {
pr_err("registering percpu irq failed [%d]\n", error);
return error;
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 09/11] pinctrl: starfive: irq_pipeline: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (7 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 08/11] clocksource/timer-riscv: irq_pipeline: enable pipelined clock events Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 10/11] PCI: plda: " Tobias Schaffner
` (2 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c | 2 +-
drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c b/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c
index e44480e71ea8..88c8940fd975 100644
--- a/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c
+++ b/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c
@@ -829,7 +829,7 @@ static struct irq_chip jh7110_irq_chip = {
.irq_mask_ack = jh7110_irq_mask_ack,
.irq_unmask = jh7110_irq_unmask,
.irq_set_type = jh7110_irq_set_type,
- .flags = IRQCHIP_IMMUTABLE | IRQCHIP_SET_TYPE_MASKED,
+ .flags = IRQCHIP_IMMUTABLE | IRQCHIP_SET_TYPE_MASKED | IRQCHIP_PIPELINE_SAFE,
GPIOCHIP_IRQ_RESOURCE_HELPERS,
};
diff --git a/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h b/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h
index 2da2d6858008..959578765cba 100644
--- a/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h
+++ b/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.h
@@ -15,7 +15,7 @@ struct jh7110_pinctrl {
struct device *dev;
struct gpio_chip gc;
struct pinctrl_gpio_range gpios;
- raw_spinlock_t lock;
+ hard_spinlock_t lock;
void __iomem *base;
struct pinctrl_dev *pctl;
/* register read/write mutex */
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 10/11] PCI: plda: irq_pipeline: enable pipelined interrupt control
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (8 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 09/11] pinctrl: starfive: irq_pipeline: enable pipelined interrupt control Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 11/11] riscv: dovetail: add core support Tobias Schaffner
2026-07-07 10:02 ` [PATCH dovetail v10 00/11] riscv: Add dovetail support Florian Bezdeka
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
drivers/pci/controller/plda/pcie-plda-host.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/pci/controller/plda/pcie-plda-host.c b/drivers/pci/controller/plda/pcie-plda-host.c
index 3c2f68383010..8f0fda4b9421 100644
--- a/drivers/pci/controller/plda/pcie-plda-host.c
+++ b/drivers/pci/controller/plda/pcie-plda-host.c
@@ -244,6 +244,7 @@ static struct irq_chip plda_intx_irq_chip = {
.irq_ack = plda_ack_intx_irq,
.irq_mask = plda_mask_intx_irq,
.irq_unmask = plda_unmask_intx_irq,
+ .flags = IRQCHIP_PIPELINE_SAFE,
};
static int plda_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
@@ -358,6 +359,7 @@ static struct irq_chip plda_event_irq_chip = {
.irq_ack = plda_ack_event_irq,
.irq_mask = plda_mask_event_irq,
.irq_unmask = plda_unmask_event_irq,
+ .flags = IRQCHIP_PIPELINE_SAFE,
};
static const struct plda_event_ops plda_event_ops = {
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH dovetail v10 11/11] riscv: dovetail: add core support
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (9 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 10/11] PCI: plda: " Tobias Schaffner
@ 2026-07-06 18:29 ` Tobias Schaffner
2026-07-07 10:02 ` [PATCH dovetail v10 00/11] riscv: Add dovetail support Florian Bezdeka
11 siblings, 0 replies; 17+ messages in thread
From: Tobias Schaffner @ 2026-07-06 18:29 UTC (permalink / raw)
To: xenomai; +Cc: rpm, florian.bezdeka, jan.kiszka, Tobias Schaffner
Add Dovetail co-kernel support for RISC-V, including, irq pipeline
integration, out-of-band aware trap handling and memory management.
Signed-off-by: Tobias Schaffner <tobias.schaffner@siemens.com>
---
arch/riscv/Kconfig | 2 +
arch/riscv/include/asm/dovetail.h | 24 ++++++
arch/riscv/include/asm/mmu_context.h | 2 +
arch/riscv/include/asm/syscall.h | 6 ++
arch/riscv/include/asm/thread_info.h | 8 ++
arch/riscv/kernel/traps.c | 114 +++++++++++++++++++++------
arch/riscv/mm/context.c | 20 ++++-
7 files changed, 148 insertions(+), 28 deletions(-)
create mode 100644 arch/riscv/include/asm/dovetail.h
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 7c58654c4ece..912aada80962 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -151,6 +151,7 @@ config RISCV
select HAVE_ARCH_USERFAULTFD_WP if 64BIT && MMU && USERFAULTFD && RISCV_ISA_SVRSW60T59B
select HAVE_ARCH_VMAP_STACK if MMU && 64BIT
select HAVE_IRQ_PIPELINE
+ select HAVE_DOVETAIL
select HAVE_ASM_MODVERSIONS
select HAVE_CONTEXT_TRACKING_USER
select HAVE_DEBUG_KMEMLEAK
@@ -376,6 +377,7 @@ config AS_HAS_OPTION_ARCH
source "arch/riscv/Kconfig.socs"
source "arch/riscv/Kconfig.errata"
+source "kernel/Kconfig.dovetail"
menu "Platform type"
diff --git a/arch/riscv/include/asm/dovetail.h b/arch/riscv/include/asm/dovetail.h
new file mode 100644
index 000000000000..e5a46cf1f67f
--- /dev/null
+++ b/arch/riscv/include/asm/dovetail.h
@@ -0,0 +1,24 @@
+/*
+* SPDX-License-Identifier: GPL-2.0
+*
+* Copyright (C) 2024-2026 Siemens AG
+* Author: Tobias Schaffner <tobias.schaffner@siemens.com>.
+*/
+#ifndef _ASM_RISCV_DOVETAIL_H
+#define _ASM_RISCV_DOVETAIL_H
+
+#if !defined(__ASSEMBLY__)
+#ifdef CONFIG_DOVETAIL
+
+static inline void arch_dovetail_exec_prepare(void)
+{ }
+
+static inline void arch_dovetail_switch_prepare(bool leave_inband)
+{ }
+
+static inline void arch_dovetail_switch_finish(bool enter_inband)
+{ }
+
+#endif /* CONFIG_DOVETAIL */
+#endif /* !__ASSEMBLY__ */
+#endif /* _ASM_RISCV_DOVETAIL_H */
diff --git a/arch/riscv/include/asm/mmu_context.h b/arch/riscv/include/asm/mmu_context.h
index dbf27a78df6c..a1ac9192d51c 100644
--- a/arch/riscv/include/asm/mmu_context.h
+++ b/arch/riscv/include/asm/mmu_context.h
@@ -15,6 +15,8 @@
void switch_mm(struct mm_struct *prev, struct mm_struct *next,
struct task_struct *task);
+void switch_oob_mm(struct mm_struct *prev, struct mm_struct *next,
+ struct task_struct *task);
#define activate_mm activate_mm
static inline void activate_mm(struct mm_struct *prev,
diff --git a/arch/riscv/include/asm/syscall.h b/arch/riscv/include/asm/syscall.h
index 8067e666a4ca..12376b54268e 100644
--- a/arch/riscv/include/asm/syscall.h
+++ b/arch/riscv/include/asm/syscall.h
@@ -117,6 +117,12 @@ static inline bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs)
return false;
}
+static inline unsigned long syscall_get_arg0(struct task_struct *task,
+ struct pt_regs *regs)
+{
+ return regs->orig_a0;
+}
+
asmlinkage long sys_riscv_flush_icache(uintptr_t, uintptr_t, uintptr_t);
asmlinkage long sys_riscv_hwprobe(struct riscv_hwprobe *, size_t, size_t,
diff --git a/arch/riscv/include/asm/thread_info.h b/arch/riscv/include/asm/thread_info.h
index 8bfb02064f48..4934b7c8f1f1 100644
--- a/arch/riscv/include/asm/thread_info.h
+++ b/arch/riscv/include/asm/thread_info.h
@@ -41,6 +41,7 @@
#include <asm/processor.h>
#include <asm/csr.h>
+#include <dovetail/thread_info.h>
/*
* low level task data that entry.S needs immediate access to
@@ -80,6 +81,7 @@ struct thread_info {
#ifdef CONFIG_RISCV_USER_CFI
struct cfi_state user_cfi_state;
#endif
+ struct oob_thread_state oob_state; /* co-kernel thread state */
};
#ifdef CONFIG_SHADOW_CALL_STACK
@@ -123,6 +125,9 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
#include <asm-generic/thread_info_tif.h>
+#define TIF_MAYDAY 14 /* emergency trap pending */
+#define _TIF_MAYDAY (1 << TIF_MAYDAY)
+
#define TIF_32BIT 16 /* compat-mode 32bit process */
#define TIF_RISCV_V_DEFER_RESTORE 17 /* restore Vector before returning to user */
@@ -132,5 +137,8 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
* Local (synchronous) thread flags.
*/
#define _TLF_OOB 0x0001
+#define _TLF_DOVETAIL 0x0002
+#define _TLF_OFFSTAGE 0x0004
+#define _TLF_OOBTRAP 0x0008
#endif /* _ASM_RISCV_THREAD_INFO_H */
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index fe6c547c93e4..ef368954e81d 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -22,6 +22,8 @@
#include <linux/irq.h>
#include <linux/kexec.h>
#include <linux/entry-common.h>
+#include <linux/audit.h>
+#include <linux/dovetail.h>
#include <asm/asm-prototypes.h>
#include <asm/bug.h>
@@ -115,18 +117,24 @@ void die(struct pt_regs *regs, const char *str)
static __always_inline
bool mark_trap_entry(struct pt_regs *regs)
{
+ oob_trap_notify(regs->cause, regs);
+
if (likely(running_inband())) {
if (user_mode(regs))
hard_cond_local_irq_enable();
return true;
}
+ oob_trap_unwind(regs->cause, regs);
+
return false;
}
static __always_inline
void mark_trap_exit(struct pt_regs *regs)
{
+ oob_trap_unwind(regs->cause, regs);
+
if (likely(running_inband()) && user_mode(regs))
hard_cond_local_irq_disable();
}
@@ -172,13 +180,19 @@ asmlinkage __visible __trap_section void name(struct pt_regs *regs) \
{ \
if (user_mode(regs)) { \
irqentry_enter_from_user_mode(regs); \
- local_irq_enable(); \
- do_trap_error(regs, signo, code, regs->epc, "Oops - " str); \
- local_irq_disable(); \
+ if (mark_trap_entry(regs)) { \
+ local_irq_enable(); \
+ do_trap_error(regs, signo, code, regs->epc, "Oops - " str); \
+ local_irq_disable(); \
+ mark_trap_exit(regs); \
+ } \
irqentry_exit_to_user_mode(regs); \
} else { \
irqentry_state_t state = irqentry_nmi_enter(regs); \
- do_trap_error(regs, signo, code, regs->epc, "Oops - " str); \
+ if (mark_trap_entry(regs)) { \
+ do_trap_error(regs, signo, code, regs->epc, "Oops - " str); \
+ mark_trap_exit(regs); \
+ } \
irqentry_nmi_exit(regs, state); \
} \
}
@@ -198,21 +212,26 @@ asmlinkage __visible __trap_section void do_trap_insn_illegal(struct pt_regs *re
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
- local_irq_enable();
+ if (mark_trap_entry(regs)) {
+ local_irq_enable();
- handled = riscv_v_first_use_handler(regs);
- if (!handled)
- do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->epc,
- "Oops - illegal instruction");
+ handled = riscv_v_first_use_handler(regs);
- local_irq_disable();
+ if (!handled)
+ do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->epc,
+ "Oops - illegal instruction");
+
+ local_irq_disable();
+ mark_trap_exit(regs);
+ }
irqentry_exit_to_user_mode(regs);
} else {
irqentry_state_t state = irqentry_nmi_enter(regs);
-
- do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->epc,
- "Oops - illegal instruction");
-
+ if (mark_trap_entry(regs)) {
+ do_trap_error(regs, SIGILL, ILL_ILLOPC, regs->epc,
+ "Oops - illegal instruction");
+ mark_trap_exit(regs);
+ }
irqentry_nmi_exit(regs, state);
}
}
@@ -244,17 +263,26 @@ static void do_trap_misaligned(struct pt_regs *regs, enum misaligned_access_type
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
+ if (!mark_trap_entry(regs))
+ goto out;
local_irq_enable();
} else {
state = irqentry_nmi_enter(regs);
+ if (!mark_trap_entry(regs))
+ goto out;
}
if (misaligned_handler[type].handler(regs))
do_trap_error(regs, SIGBUS, BUS_ADRALN, regs->epc,
misaligned_handler[type].type_str);
- if (user_mode(regs)) {
+ if (user_mode(regs))
local_irq_disable();
+
+ mark_trap_exit(regs);
+
+out:
+ if (user_mode(regs)) {
irqentry_exit_to_user_mode(regs);
} else {
irqentry_nmi_exit(regs, state);
@@ -330,17 +358,21 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
- local_irq_enable();
+ if (mark_trap_entry(regs)) {
+ local_irq_enable();
- handle_break(regs);
+ handle_break(regs);
- local_irq_disable();
+ local_irq_disable();
+ mark_trap_exit(regs);
+ }
irqentry_exit_to_user_mode(regs);
} else {
irqentry_state_t state = irqentry_nmi_enter(regs);
-
- handle_break(regs);
-
+ if (mark_trap_entry(regs)) {
+ handle_break(regs);
+ mark_trap_exit(regs);
+ }
irqentry_nmi_exit(regs, state);
}
}
@@ -359,6 +391,15 @@ void do_trap_ecall_u(struct pt_regs *regs)
syscall = syscall_enter_from_user_mode(regs, syscall);
+ if (dovetailing()) {
+ if (syscall == EXIT_SYSCALL_OOB) {
+ hard_local_irq_disable();
+ return;
+ }
+ if (syscall == EXIT_SYSCALL_TAIL)
+ goto done_inband;
+ }
+
add_random_kstack_offset();
if (syscall >= 0 && syscall < NR_syscalls) {
@@ -366,6 +407,13 @@ void do_trap_ecall_u(struct pt_regs *regs)
syscall_handler(regs, syscall);
}
+done_inband:
+ /*
+ * Dovetail: balance audit entry that generic exit
+ * skips for in_oob_syscall().
+ */
+ if (dovetailing() && in_oob_syscall(regs))
+ audit_syscall_exit(regs);
syscall_exit_to_user_mode(regs);
} else {
irqentry_state_t state = irqentry_nmi_enter(regs);
@@ -420,11 +468,13 @@ asmlinkage __visible __trap_section void do_trap_software_check(struct pt_regs *
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
+ if (mark_trap_entry(regs)) {
+ /* not a cfi violation, then merge into flow of unknown trap handler */
+ if (!handle_user_cfi_violation(regs))
+ do_trap_unknown(regs);
- /* not a cfi violation, then merge into flow of unknown trap handler */
- if (!handle_user_cfi_violation(regs))
- do_trap_unknown(regs);
-
+ mark_trap_exit(regs);
+ }
irqentry_exit_to_user_mode(regs);
} else {
/* sw check exception coming from kernel is a bug in kernel */
@@ -437,10 +487,22 @@ asmlinkage __visible noinstr void do_page_fault(struct pt_regs *regs)
{
irqentry_state_t state = irqentry_enter(regs);
- handle_page_fault(regs);
+ mark_trap_entry(regs);
+
+ BUG_ON(dovetail_debug() && !running_inband());
+
+ if (!user_mode(regs))
+ hard_cond_local_irq_enable();
+
+ handle_page_fault(regs, state);
local_irq_disable();
+ mark_trap_exit(regs);
+
+ if (!user_mode(regs))
+ hard_cond_local_irq_disable();
+
irqentry_exit(regs, state);
}
#endif
diff --git a/arch/riscv/mm/context.c b/arch/riscv/mm/context.c
index 55c20ad1f744..8f38b4a5eb26 100644
--- a/arch/riscv/mm/context.c
+++ b/arch/riscv/mm/context.c
@@ -25,7 +25,7 @@ static unsigned long num_asids;
static atomic_long_t current_version;
-static DEFINE_RAW_SPINLOCK(context_lock);
+static DEFINE_HARD_SPINLOCK(context_lock);
static cpumask_t context_tlb_flush_pending;
static unsigned long *context_asid_map;
@@ -315,7 +315,7 @@ static inline void flush_icache_deferred(struct mm_struct *mm, unsigned int cpu,
#endif
}
-void switch_mm(struct mm_struct *prev, struct mm_struct *next,
+static void do_switch_mm(struct mm_struct *prev, struct mm_struct *next,
struct task_struct *task)
{
unsigned int cpu;
@@ -336,3 +336,19 @@ void switch_mm(struct mm_struct *prev, struct mm_struct *next,
flush_icache_deferred(next, cpu, task);
}
+
+void switch_mm(struct mm_struct *prev, struct mm_struct *next,
+ struct task_struct *task)
+{
+ unsigned long flags;
+
+ protect_inband_mm(flags);
+ do_switch_mm(prev, next, task);
+ unprotect_inband_mm(flags);
+}
+
+void switch_oob_mm(struct mm_struct *prev, struct mm_struct *next,
+ struct task_struct *task)
+{
+ do_switch_mm(prev, next, task);
+}
--
2.43.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH dovetail v10 00/11] riscv: Add dovetail support
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
` (10 preceding siblings ...)
2026-07-06 18:29 ` [PATCH dovetail v10 11/11] riscv: dovetail: add core support Tobias Schaffner
@ 2026-07-07 10:02 ` Florian Bezdeka
2026-07-07 10:51 ` Bezdeka, Florian
2026-07-07 13:53 ` Philippe Gerum
11 siblings, 2 replies; 17+ messages in thread
From: Florian Bezdeka @ 2026-07-07 10:02 UTC (permalink / raw)
To: Tobias Schaffner, xenomai, Philippe Gerum; +Cc: jan.kiszka
On Mon, 2026-07-06 at 20:29 +0200, Tobias Schaffner wrote:
> Hi all,
>
> this series introduces initial support for Dovetail on RISC-V.
>
> Feedback, suggestions, and especially reviews are very welcome.
>
> Changes since v1:
> * Disable independent irq/softirq stack usage when pipelining
> * Drop KVM changes as long as they can not be properly tested
>
> Changes since v2:
> * Rework trap handling
>
> Changes since v3:
> * Included the IRQ pipelining patches to have all riscv specific
> patches included
> * Rebased to dovetail/v6.18.y-dovetail-rebase
> * Merged most of the fixes
> * Fixed IRQ Stack handling and enabled IRQ_STACKS again
>
> Changes since v4:
> * Rebased to dovetail/v7.0.y-dovetail-rebase
> * Applied suggestions from the last patch set
> * Added starfive-visionfive2 board support
> * Introduced raw console device based on sbi debug console
> * Reworked pipelined irq handling
>
> Changes since v5:
> * Rebased to tip of dovetail/v7.0.y-dovetail-rebase
> * Applied suggestions from the last patch set
> * Use mark_trap_entry/exit_raw for kernel mode exception paths which
> use irq_nmi_entry/exit for now, as the nmi irq handlers expect hard
> irqs to stay off. This may be be subject to further optimization at
> a later stage, but I do not see any negative impact latency wise in
> my tests.
>
> Changes since v6:
> Address the review comments from the last patch set:
> * Keep the virtual irq state in sync with the hard irq state in trap
> handlers
> * Fix irq_nesting imbalance when running with disabled IRQ_STACKS
>
> Changes since v7:
> * Simplify Trap handling
> * Rebase to wip/flo/v7.1-dovetail-rebase
>
> Changes since v8:
> * Further simplify trap handling adressing Florians suggestions and
> recent fixes to irq-entry-common
>
> Changes since v9:
> * Fix checkpatch finding in patch 11 "riscv: Add dovetail support"
>
Thanks, applied to the following branches:
dovetail: wip/flo/v7.1-dovetail-rebase
evl: wip/flo/v7.1-evl-rebase
Philippe, final test run has been scheduled, expecting both branches to
be taken over by you. Any left overs?
Best regards,
Florian
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH dovetail v10 00/11] riscv: Add dovetail support
2026-07-07 10:02 ` [PATCH dovetail v10 00/11] riscv: Add dovetail support Florian Bezdeka
@ 2026-07-07 10:51 ` Bezdeka, Florian
2026-07-07 13:56 ` Philippe Gerum
2026-07-07 13:53 ` Philippe Gerum
1 sibling, 1 reply; 17+ messages in thread
From: Bezdeka, Florian @ 2026-07-07 10:51 UTC (permalink / raw)
To: Schaffner, Tobias, rpm@xenomai.org, xenomai@lists.linux.dev; +Cc: Kiszka, Jan
On Tue, 2026-07-07 at 12:02 +0200, Florian Bezdeka wrote:
> On Mon, 2026-07-06 at 20:29 +0200, Tobias Schaffner wrote:
> > Hi all,
> >
> > this series introduces initial support for Dovetail on RISC-V.
> >
> > Feedback, suggestions, and especially reviews are very welcome.
> >
> > Changes since v1:
> > * Disable independent irq/softirq stack usage when pipelining
> > * Drop KVM changes as long as they can not be properly tested
> >
> > Changes since v2:
> > * Rework trap handling
> >
> > Changes since v3:
> > * Included the IRQ pipelining patches to have all riscv specific
> > patches included
> > * Rebased to dovetail/v6.18.y-dovetail-rebase
> > * Merged most of the fixes
> > * Fixed IRQ Stack handling and enabled IRQ_STACKS again
> >
> > Changes since v4:
> > * Rebased to dovetail/v7.0.y-dovetail-rebase
> > * Applied suggestions from the last patch set
> > * Added starfive-visionfive2 board support
> > * Introduced raw console device based on sbi debug console
> > * Reworked pipelined irq handling
> >
> > Changes since v5:
> > * Rebased to tip of dovetail/v7.0.y-dovetail-rebase
> > * Applied suggestions from the last patch set
> > * Use mark_trap_entry/exit_raw for kernel mode exception paths which
> > use irq_nmi_entry/exit for now, as the nmi irq handlers expect hard
> > irqs to stay off. This may be be subject to further optimization at
> > a later stage, but I do not see any negative impact latency wise in
> > my tests.
> >
> > Changes since v6:
> > Address the review comments from the last patch set:
> > * Keep the virtual irq state in sync with the hard irq state in trap
> > handlers
> > * Fix irq_nesting imbalance when running with disabled IRQ_STACKS
> >
> > Changes since v7:
> > * Simplify Trap handling
> > * Rebase to wip/flo/v7.1-dovetail-rebase
> >
> > Changes since v8:
> > * Further simplify trap handling adressing Florians suggestions and
> > recent fixes to irq-entry-common
> >
> > Changes since v9:
> > * Fix checkpatch finding in patch 11 "riscv: Add dovetail support"
> >
>
> Thanks, applied to the following branches:
>
> dovetail: wip/flo/v7.1-dovetail-rebase
> evl: wip/flo/v7.1-evl-rebase
>
> Philippe, final test run has been scheduled, expecting both branches to
> be taken over by you. Any left overs?
Yep. I forgot two commits 64afd165 and 0679eb1e from the 7.0 branch.
I will fix that in a minute.
>
> Best regards,
> Florian
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH dovetail v10 00/11] riscv: Add dovetail support
2026-07-07 10:02 ` [PATCH dovetail v10 00/11] riscv: Add dovetail support Florian Bezdeka
2026-07-07 10:51 ` Bezdeka, Florian
@ 2026-07-07 13:53 ` Philippe Gerum
1 sibling, 0 replies; 17+ messages in thread
From: Philippe Gerum @ 2026-07-07 13:53 UTC (permalink / raw)
To: Florian Bezdeka; +Cc: Tobias Schaffner, xenomai, jan.kiszka
Florian Bezdeka <florian.bezdeka@siemens.com> writes:
> On Mon, 2026-07-06 at 20:29 +0200, Tobias Schaffner wrote:
>> Hi all,
>>
>> this series introduces initial support for Dovetail on RISC-V.
>>
>> Feedback, suggestions, and especially reviews are very welcome.
>>
>> Changes since v1:
>> * Disable independent irq/softirq stack usage when pipelining
>> * Drop KVM changes as long as they can not be properly tested
>>
>> Changes since v2:
>> * Rework trap handling
>>
>> Changes since v3:
>> * Included the IRQ pipelining patches to have all riscv specific
>> patches included
>> * Rebased to dovetail/v6.18.y-dovetail-rebase
>> * Merged most of the fixes
>> * Fixed IRQ Stack handling and enabled IRQ_STACKS again
>>
>> Changes since v4:
>> * Rebased to dovetail/v7.0.y-dovetail-rebase
>> * Applied suggestions from the last patch set
>> * Added starfive-visionfive2 board support
>> * Introduced raw console device based on sbi debug console
>> * Reworked pipelined irq handling
>>
>> Changes since v5:
>> * Rebased to tip of dovetail/v7.0.y-dovetail-rebase
>> * Applied suggestions from the last patch set
>> * Use mark_trap_entry/exit_raw for kernel mode exception paths which
>> use irq_nmi_entry/exit for now, as the nmi irq handlers expect hard
>> irqs to stay off. This may be be subject to further optimization at
>> a later stage, but I do not see any negative impact latency wise in
>> my tests.
>>
>> Changes since v6:
>> Address the review comments from the last patch set:
>> * Keep the virtual irq state in sync with the hard irq state in trap
>> handlers
>> * Fix irq_nesting imbalance when running with disabled IRQ_STACKS
>>
>> Changes since v7:
>> * Simplify Trap handling
>> * Rebase to wip/flo/v7.1-dovetail-rebase
>>
>> Changes since v8:
>> * Further simplify trap handling adressing Florians suggestions and
>> recent fixes to irq-entry-common
>>
>> Changes since v9:
>> * Fix checkpatch finding in patch 11 "riscv: Add dovetail support"
>>
>
> Thanks, applied to the following branches:
>
> dovetail: wip/flo/v7.1-dovetail-rebase
> evl: wip/flo/v7.1-evl-rebase
>
> Philippe, final test run has been scheduled, expecting both branches to
> be taken over by you. Any left overs?
>
Nothing in my Dovetail queue at the moment, we should be all set for
releasing Dovetail 7.1. I'll reconcile wip/flo/v7.1-evl-rebase and evl
upstream from that point.
--
Philippe.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH dovetail v10 00/11] riscv: Add dovetail support
2026-07-07 10:51 ` Bezdeka, Florian
@ 2026-07-07 13:56 ` Philippe Gerum
2026-07-07 22:01 ` Florian Bezdeka
0 siblings, 1 reply; 17+ messages in thread
From: Philippe Gerum @ 2026-07-07 13:56 UTC (permalink / raw)
To: Bezdeka, Florian; +Cc: Schaffner, Tobias, xenomai@lists.linux.dev, Kiszka, Jan
"Bezdeka, Florian" <florian.bezdeka@siemens.com> writes:
> On Tue, 2026-07-07 at 12:02 +0200, Florian Bezdeka wrote:
>> On Mon, 2026-07-06 at 20:29 +0200, Tobias Schaffner wrote:
>> > Hi all,
>> >
>> > this series introduces initial support for Dovetail on RISC-V.
>> >
>> > Feedback, suggestions, and especially reviews are very welcome.
>> >
>> > Changes since v1:
>> > * Disable independent irq/softirq stack usage when pipelining
>> > * Drop KVM changes as long as they can not be properly tested
>> >
>> > Changes since v2:
>> > * Rework trap handling
>> >
>> > Changes since v3:
>> > * Included the IRQ pipelining patches to have all riscv specific
>> > patches included
>> > * Rebased to dovetail/v6.18.y-dovetail-rebase
>> > * Merged most of the fixes
>> > * Fixed IRQ Stack handling and enabled IRQ_STACKS again
>> >
>> > Changes since v4:
>> > * Rebased to dovetail/v7.0.y-dovetail-rebase
>> > * Applied suggestions from the last patch set
>> > * Added starfive-visionfive2 board support
>> > * Introduced raw console device based on sbi debug console
>> > * Reworked pipelined irq handling
>> >
>> > Changes since v5:
>> > * Rebased to tip of dovetail/v7.0.y-dovetail-rebase
>> > * Applied suggestions from the last patch set
>> > * Use mark_trap_entry/exit_raw for kernel mode exception paths which
>> > use irq_nmi_entry/exit for now, as the nmi irq handlers expect hard
>> > irqs to stay off. This may be be subject to further optimization at
>> > a later stage, but I do not see any negative impact latency wise in
>> > my tests.
>> >
>> > Changes since v6:
>> > Address the review comments from the last patch set:
>> > * Keep the virtual irq state in sync with the hard irq state in trap
>> > handlers
>> > * Fix irq_nesting imbalance when running with disabled IRQ_STACKS
>> >
>> > Changes since v7:
>> > * Simplify Trap handling
>> > * Rebase to wip/flo/v7.1-dovetail-rebase
>> >
>> > Changes since v8:
>> > * Further simplify trap handling adressing Florians suggestions and
>> > recent fixes to irq-entry-common
>> >
>> > Changes since v9:
>> > * Fix checkpatch finding in patch 11 "riscv: Add dovetail support"
>> >
>>
>> Thanks, applied to the following branches:
>>
>> dovetail: wip/flo/v7.1-dovetail-rebase
>> evl: wip/flo/v7.1-evl-rebase
>>
>> Philippe, final test run has been scheduled, expecting both branches to
>> be taken over by you. Any left overs?
>
> Yep. I forgot two commits 64afd165 and 0679eb1e from the 7.0 branch.
>
> I will fix that in a minute.
>
Ok, please strip the reference to "cobalt" in the CLOCK_EVT_FEAT* commit
when reconciling the evl trees, this might be confusing.
--
Philippe.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH dovetail v10 00/11] riscv: Add dovetail support
2026-07-07 13:56 ` Philippe Gerum
@ 2026-07-07 22:01 ` Florian Bezdeka
0 siblings, 0 replies; 17+ messages in thread
From: Florian Bezdeka @ 2026-07-07 22:01 UTC (permalink / raw)
To: Philippe Gerum; +Cc: Schaffner, Tobias, xenomai@lists.linux.dev, Kiszka, Jan
On Tue, 2026-07-07 at 15:56 +0200, Philippe Gerum wrote:
> Ok, please strip the reference to "cobalt" in the CLOCK_EVT_FEAT* commit
> when reconciling the evl trees, this might be confusing.
>
Right. Done.
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2026-07-07 22:01 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-06 18:29 [PATCH dovetail v10 00/11] riscv: Add dovetail support Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 01/11] riscv: introduce raw console device Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 02/11] riscv: irq_pipeline: add IRQ pipelining core Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 03/11] irqchip/riscv-aplic-direct: enable pipelined interrupt control Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 04/11] irqchip/irq-riscv-aplic-msi: " Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 05/11] irqchip/irq-riscv-imsic-platform: " Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 06/11] irqchip/irq-riscv-intc: " Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 07/11] irqchip/irq-sifive-plic: " Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 08/11] clocksource/timer-riscv: irq_pipeline: enable pipelined clock events Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 09/11] pinctrl: starfive: irq_pipeline: enable pipelined interrupt control Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 10/11] PCI: plda: " Tobias Schaffner
2026-07-06 18:29 ` [PATCH dovetail v10 11/11] riscv: dovetail: add core support Tobias Schaffner
2026-07-07 10:02 ` [PATCH dovetail v10 00/11] riscv: Add dovetail support Florian Bezdeka
2026-07-07 10:51 ` Bezdeka, Florian
2026-07-07 13:56 ` Philippe Gerum
2026-07-07 22:01 ` Florian Bezdeka
2026-07-07 13:53 ` Philippe Gerum
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.