* [PATCH v3] drm/tyr: add Job IRQ handling
@ 2026-08-03 13:34 Laura Nao
2026-08-04 12:23 ` Link Mauve
0 siblings, 1 reply; 5+ messages in thread
From: Laura Nao @ 2026-08-03 13:34 UTC (permalink / raw)
To: Daniel Almeida, Alice Ryhl, Danilo Krummrich, David Airlie,
Simona Vetter, Miguel Ojeda, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
Trevor Gross, Tamir Duberstein, Alexandre Courbot,
Onur Özkan
Cc: linux-kernel, dri-devel, rust-for-linux, kernel, Deborah Brouwer,
Laura Nao
Add a threaded IRQ wrapper for Tyr interrupt sources and use it to
handle the firmware Job IRQ.
The Job IRQ reports requests from the CSF firmware, including global
interface requests and CSG attention bits. Only the GLB bit is currently
handled, as it will be used to check firmware readiness. CSG bits
handling will be added at a later stage. Add a Job IRQ handler that
masks the interrupt in the primary IRQ handler, processes pending raw
status in the threaded handler, clears the handled bit, and reenables
the mask before returning.
Add a wait queue and a bool flag so the handler can signal firmware
readiness when the GLB bit is set.
Co-developed-by: Daniel Almeida <daniel.almeida@collabora.com>
Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
Co-developed-by: Deborah Brouwer <deborah.brouwer@collabora.com>
Signed-off-by: Deborah Brouwer <deborah.brouwer@collabora.com>
Signed-off-by: Laura Nao <laura.nao@collabora.com>
---
Changes in v3:
- Propagated request_threaded_irq_by_name safety requirement up the
call chain, made TyrIrq::request() and job_irq_init() unsafe
- Dropped CSG bits masking, added TODO comment to note this will be
handled at a later stage. Reworded commit message to reflect the
change.
- Added documentation for TyrIrqTrait, TyrIrq, JobIrq and job_irq_init()
- Link to v2: https://lore.kernel.org/r/20260729-tyr-irq-v2-v2-1-c2750fc11d59@collabora.com
Changes in v2:
- Dropped Wait custom type in favor of WaitQueue
- Renamed JobIrq lifetime to generic 'a
This patch follows up to [1], which adds support for firmware loading
and MCU booting to the Tyr driver. The changes included here were
originally introduced in its v4[2], then dropped to reduce the scope of
the series, and have been adjusted to work with the HRT (Higher-Ranked
Lifetime Types) driver architecture recently introduced.
The patch adds a threaded IRQ wrapper for the firmware Job interrupts,
used to signal events from the global CSF (GLB) and Command Stream Group
(CSG) interfaces.
These changes will be later used to wait for global CSF interface
readiness after firmware boot, as part of the CSF firmware interfaces
support that will be submitted as a separate series.
This patch is based on drm-rust-next and depends on:
- [PATCH v2] rust: irq: make Registration compatible with lifetime-bound drivers[3]
- [PATCH 0/5] rust: sync: add WaitQueue infrastructure[4]
Note: [4] doesn't apply cleanly on drm-rust-next at the moment, due to
missing changes in rust/kernel/sync/lock/spinlock.rs[5]. I've applied
all dependencies and fixed conflicts for the purpose of testing this
patch on top of drm-rust-next, a branch with these changes is available
here: https://gitlab.freedesktop.org/laura.nao/linux/-/commits/b4/tyr-irq-v3
[1] https://lore.kernel.org/all/20260728-fw-boot-b4-v10-0-9187aefa3f2f@collabora.com/
[2] https://lore.kernel.org/rust-for-linux/20260424-b4-fw-boot-v4-v4-15-a5d91050789d@collabora.com/
[3] https://lore.kernel.org/rust-for-linux/20260719153631.559341-1-dakr@kernel.org/
[4] https://lore.kernel.org/rust-for-linux/20260726223613.1242940-1-dakr@kernel.org/
[5] https://lore.kernel.org/all/20260302232154.861916-1-lyude@redhat.com/
---
drivers/gpu/drm/tyr/driver.rs | 97 ++++++++++++++++++++++++++++++++++++++
drivers/gpu/drm/tyr/fw/irq.rs | 105 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 202 insertions(+)
diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs
index d78ad9d292ff..53e15f7da853 100644
--- a/drivers/gpu/drm/tyr/driver.rs
+++ b/drivers/gpu/drm/tyr/driver.rs
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0 or MIT
+use core::marker::PhantomPinned;
+
use kernel::{
clk::{
Clk,
@@ -21,6 +23,13 @@
poll,
Io, //
},
+ irq::{
+ Flags,
+ IrqReturn,
+ ThreadedHandler,
+ ThreadedIrqReturn,
+ ThreadedRegistration, //
+ },
new_mutex,
of,
platform,
@@ -236,3 +245,91 @@ struct Regulators {
_mali: Regulator<regulator::Enabled>,
_sram: Regulator<regulator::Enabled>,
}
+
+/// Trait describing the operations required to service a Tyr interrupt source.
+pub(crate) trait TyrIrqTrait: Sync {
+ /// Returns the masked interrupt status.
+ fn read_status(&self) -> u32;
+
+ /// Clears all bits in the mask register, disabling the interrupt sources.
+ fn clear_mask(&self);
+
+ /// Sets the mask register to re-enable the interrupt sources.
+ fn reenable_mask(&self);
+
+ /// Returns the raw interrupt status, regardless of the current mask.
+ fn read_raw_status(&self) -> u32;
+
+ /// Clears the given bits in the interrupt status register.
+ fn clear_status(&self, status: u32);
+
+ /// Returns the bitmask of interrupt sources handled by this instance.
+ fn mask(&self) -> u32;
+
+ /// Handles the given pending, unmasked interrupt bits.
+ fn handle(&self, status: u32);
+}
+
+/// A threaded IRQ wrapper shared by all Tyr interrupt sources.
+#[pin_data]
+pub(crate) struct TyrIrq<T: TyrIrqTrait> {
+ /// The interrupt source.
+ irq: T,
+ #[pin]
+ _pin: PhantomPinned,
+}
+
+impl<T: TyrIrqTrait> TyrIrq<T> {
+ /// Requests a threaded IRQ registration for `irq`, using `name` to look up the interrupt.
+ ///
+ /// # Safety
+ ///
+ /// Callers must not `mem::forget()` the resulting registration or otherwise prevent its
+ /// [`Drop`] implementation from running.
+ #[allow(dead_code)]
+ pub(crate) unsafe fn request<'a>(
+ pdev: &'a platform::Device<Bound>,
+ name: &'static CStr,
+ irq: T,
+ ) -> Result<impl PinInit<ThreadedRegistration<'a, Self>, Error> + 'a>
+ where
+ T: 'a,
+ {
+ let handler = try_pin_init!(Self {
+ irq,
+ _pin: PhantomPinned,
+ });
+
+ // SAFETY: The caller guarantees the resulting registration will not be leaked.
+ Ok(unsafe { pdev.request_threaded_irq_by_name(Flags::SHARED, name, name, handler) })
+ }
+}
+
+impl<T: TyrIrqTrait> ThreadedHandler for TyrIrq<T> {
+ fn handle(&self) -> ThreadedIrqReturn {
+ let masked_status = self.irq.read_status();
+
+ if masked_status == 0 {
+ return ThreadedIrqReturn::None;
+ }
+ self.irq.clear_mask();
+ ThreadedIrqReturn::WakeThread
+ }
+
+ fn handle_threaded(&self) -> IrqReturn {
+ let mut ret = IrqReturn::None;
+
+ loop {
+ let raw_status = self.irq.read_raw_status() & self.irq.mask();
+ if raw_status == 0 {
+ break;
+ }
+ self.irq.handle(raw_status);
+ self.irq.clear_status(raw_status);
+ ret = IrqReturn::Handled;
+ }
+
+ self.irq.reenable_mask();
+ ret
+ }
+}
diff --git a/drivers/gpu/drm/tyr/fw/irq.rs b/drivers/gpu/drm/tyr/fw/irq.rs
new file mode 100644
index 000000000000..6eeb1399a7b3
--- /dev/null
+++ b/drivers/gpu/drm/tyr/fw/irq.rs
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+
+//! IRQ handling for the Job IRQ.
+//!
+//! The Job IRQ signals events from the MCU, including global interface acknowledgements.
+#![allow(dead_code)]
+
+use core::sync::atomic::{
+ AtomicBool,
+ Ordering, //
+};
+
+use kernel::{
+ c_str,
+ device::Bound, //
+ io::Io,
+ irq::ThreadedRegistration,
+ platform,
+ prelude::*,
+ sync::{
+ Arc,
+ WaitQueue, //
+ },
+};
+
+use crate::{
+ driver::{
+ IoMem,
+ TyrIrq,
+ TyrIrqTrait, //
+ },
+ regs::job_control::{
+ JOB_IRQ_CLEAR,
+ JOB_IRQ_MASK,
+ JOB_IRQ_RAWSTAT,
+ JOB_IRQ_STATUS, //
+ }, //
+};
+
+// The Job IRQ, signalling requests or notification from the MCU.
+pub(crate) struct JobIrq<'a> {
+ /// GPU MMIO register mapping.
+ iomem: Arc<IoMem<'a>>,
+ /// Flag to signal firmware readiness.
+ fw_ready: Arc<AtomicBool>,
+ /// Wait queue used to signal firmware events to waiters.
+ job_irq_wait: Arc<WaitQueue>,
+}
+
+/// Requests a threaded IRQ registration for the Job IRQ.
+///
+/// # Safety
+///
+/// Callers must not `mem::forget()` the resulting registration or otherwise prevent its
+/// [`Drop`] implementation from running.
+pub(crate) unsafe fn job_irq_init<'a>(
+ pdev: &'a platform::Device<Bound>,
+ iomem: Arc<IoMem<'a>>,
+ fw_ready: Arc<AtomicBool>,
+ job_irq_wait: Arc<WaitQueue>,
+) -> Result<impl PinInit<ThreadedRegistration<'a, TyrIrq<JobIrq<'a>>>, Error> + 'a> {
+ iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
+ let job_irq = JobIrq {
+ iomem: iomem.clone(),
+ fw_ready,
+ job_irq_wait,
+ };
+ // SAFETY: The caller guarantees the resulting registration will not be leaked.
+ unsafe { TyrIrq::request(pdev, c_str!("job"), job_irq) }
+}
+
+impl TyrIrqTrait for JobIrq<'_> {
+ fn read_status(&self) -> u32 {
+ self.iomem.read(JOB_IRQ_STATUS).into_raw()
+ }
+
+ fn clear_mask(&self) {
+ self.iomem.write_reg(JOB_IRQ_MASK::zeroed());
+ }
+
+ fn reenable_mask(&self) {
+ self.iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
+ }
+
+ fn read_raw_status(&self) -> u32 {
+ self.iomem.read(JOB_IRQ_RAWSTAT).into_raw()
+ }
+
+ fn clear_status(&self, status: u32) {
+ self.iomem.write_reg(JOB_IRQ_CLEAR::from_raw(status));
+ }
+
+ fn mask(&self) -> u32 {
+ JOB_IRQ_MASK::zeroed().with_glb(true).into_raw()
+ }
+
+ fn handle(&self, status: u32) {
+ // TODO: handle other Job IRQ events (e.g. CSG attention bits) here once
+ // support for them is added.
+ if JOB_IRQ_RAWSTAT::from_raw(status).glb() {
+ self.fw_ready.store(true, Ordering::Release);
+ self.job_irq_wait.wake_up_all();
+ }
+ }
+}
---
base-commit: 98ae54f97175c4992b4e5bff53f3c6bc24f0f491
change-id: 20260728-tyr-irq-v2-0b3c5022be33
Best regards,
--
Laura Nao <laura.nao@collabora.com>
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3] drm/tyr: add Job IRQ handling
2026-08-03 13:34 [PATCH v3] drm/tyr: add Job IRQ handling Laura Nao
@ 2026-08-04 12:23 ` Link Mauve
2026-08-05 10:48 ` Laura Nao
2026-08-06 12:09 ` Gary Guo
0 siblings, 2 replies; 5+ messages in thread
From: Link Mauve @ 2026-08-04 12:23 UTC (permalink / raw)
To: Laura Nao
Cc: Daniel Almeida, Alice Ryhl, Danilo Krummrich, David Airlie,
Simona Vetter, Miguel Ojeda, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
Trevor Gross, Tamir Duberstein, Alexandre Courbot,
Onur Özkan, linux-kernel, dri-devel, rust-for-linux, kernel,
Deborah Brouwer
Hi,
On Mon, Aug 03, 2026 at 03:34:37PM +0200, Laura Nao wrote:
> Add a threaded IRQ wrapper for Tyr interrupt sources and use it to
> handle the firmware Job IRQ.
>
> The Job IRQ reports requests from the CSF firmware, including global
> interface requests and CSG attention bits. Only the GLB bit is currently
> handled, as it will be used to check firmware readiness. CSG bits
> handling will be added at a later stage. Add a Job IRQ handler that
> masks the interrupt in the primary IRQ handler, processes pending raw
> status in the threaded handler, clears the handled bit, and reenables
> the mask before returning.
> Add a wait queue and a bool flag so the handler can signal firmware
> readiness when the GLB bit is set.
[…]
> diff --git a/drivers/gpu/drm/tyr/fw/irq.rs b/drivers/gpu/drm/tyr/fw/irq.rs
> new file mode 100644
> index 000000000000..6eeb1399a7b3
> --- /dev/null
> +++ b/drivers/gpu/drm/tyr/fw/irq.rs
> @@ -0,0 +1,105 @@
[…]
> +/// Requests a threaded IRQ registration for the Job IRQ.
> +///
> +/// # Safety
> +///
> +/// Callers must not `mem::forget()` the resulting registration or otherwise prevent its
> +/// [`Drop`] implementation from running.
> +pub(crate) unsafe fn job_irq_init<'a>(
> + pdev: &'a platform::Device<Bound>,
> + iomem: Arc<IoMem<'a>>,
> + fw_ready: Arc<AtomicBool>,
> + job_irq_wait: Arc<WaitQueue>,
> +) -> Result<impl PinInit<ThreadedRegistration<'a, TyrIrq<JobIrq<'a>>>, Error> + 'a> {
> + iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
> + let job_irq = JobIrq {
> + iomem: iomem.clone(),
> + fw_ready,
> + job_irq_wait,
> + };
> + // SAFETY: The caller guarantees the resulting registration will not be leaked.
> + unsafe { TyrIrq::request(pdev, c_str!("job"), job_irq) }
Nowadays we use the shorter c"job" way of creating a &CStr, and I think
the macro will even generate warnings in some configurations (perhaps
CLIPPY=1?).
> +}
> +
> +impl TyrIrqTrait for JobIrq<'_> {
> + fn read_status(&self) -> u32 {
> + self.iomem.read(JOB_IRQ_STATUS).into_raw()
> + }
> +
> + fn clear_mask(&self) {
> + self.iomem.write_reg(JOB_IRQ_MASK::zeroed());
> + }
> +
> + fn reenable_mask(&self) {
> + self.iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
> + }
> +
> + fn read_raw_status(&self) -> u32 {
> + self.iomem.read(JOB_IRQ_RAWSTAT).into_raw()
> + }
> +
> + fn clear_status(&self, status: u32) {
> + self.iomem.write_reg(JOB_IRQ_CLEAR::from_raw(status));
> + }
> +
> + fn mask(&self) -> u32 {
> + JOB_IRQ_MASK::zeroed().with_glb(true).into_raw()
> + }
> +
> + fn handle(&self, status: u32) {
> + // TODO: handle other Job IRQ events (e.g. CSG attention bits) here once
> + // support for them is added.
> + if JOB_IRQ_RAWSTAT::from_raw(status).glb() {
> + self.fw_ready.store(true, Ordering::Release);
> + self.job_irq_wait.wake_up_all();
> + }
> + }
> +}
>
> ---
> base-commit: 98ae54f97175c4992b4e5bff53f3c6bc24f0f491
> change-id: 20260728-tyr-irq-v2-0b3c5022be33
>
> Best regards,
> --
> Laura Nao <laura.nao@collabora.com>
>
>
Thanks,
--
Link Mauve
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] drm/tyr: add Job IRQ handling
2026-08-04 12:23 ` Link Mauve
@ 2026-08-05 10:48 ` Laura Nao
2026-08-06 8:27 ` Alice Ryhl
2026-08-06 12:09 ` Gary Guo
1 sibling, 1 reply; 5+ messages in thread
From: Laura Nao @ 2026-08-05 10:48 UTC (permalink / raw)
To: linkmauve
Cc: a.hindborg, acourbot, airlied, aliceryhl, bjorn3_gh, boqun, dakr,
daniel.almeida, deborah.brouwer, dri-devel, gary, kernel,
laura.nao, linux-kernel, lossin, ojeda, rust-for-linux, simona,
tamird, tmgross, work
Hello,
On 8/4/26 14:23, Link Mauve wrote:
> Hi,
>
> On Mon, Aug 03, 2026 at 03:34:37PM +0200, Laura Nao wrote:
>> Add a threaded IRQ wrapper for Tyr interrupt sources and use it to
>> handle the firmware Job IRQ.
>>
>> The Job IRQ reports requests from the CSF firmware, including global
>> interface requests and CSG attention bits. Only the GLB bit is currently
>> handled, as it will be used to check firmware readiness. CSG bits
>> handling will be added at a later stage. Add a Job IRQ handler that
>> masks the interrupt in the primary IRQ handler, processes pending raw
>> status in the threaded handler, clears the handled bit, and reenables
>> the mask before returning.
>> Add a wait queue and a bool flag so the handler can signal firmware
>> readiness when the GLB bit is set.
> […]
>> diff --git a/drivers/gpu/drm/tyr/fw/irq.rs b/drivers/gpu/drm/tyr/fw/irq.rs
>> new file mode 100644
>> index 000000000000..6eeb1399a7b3
>> --- /dev/null
>> +++ b/drivers/gpu/drm/tyr/fw/irq.rs
>> @@ -0,0 +1,105 @@
> […]
>> +/// Requests a threaded IRQ registration for the Job IRQ.
>> +///
>> +/// # Safety
>> +///
>> +/// Callers must not `mem::forget()` the resulting registration or otherwise prevent its
>> +/// [`Drop`] implementation from running.
>> +pub(crate) unsafe fn job_irq_init<'a>(
>> + pdev: &'a platform::Device<Bound>,
>> + iomem: Arc<IoMem<'a>>,
>> + fw_ready: Arc<AtomicBool>,
>> + job_irq_wait: Arc<WaitQueue>,
>> +) -> Result<impl PinInit<ThreadedRegistration<'a, TyrIrq<JobIrq<'a>>>, Error> + 'a> {
>> + iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
>> + let job_irq = JobIrq {
>> + iomem: iomem.clone(),
>> + fw_ready,
>> + job_irq_wait,
>> + };
>> + // SAFETY: The caller guarantees the resulting registration will not be leaked.
>> + unsafe { TyrIrq::request(pdev, c_str!("job"), job_irq) }
>
> Nowadays we use the shorter c"job" way of creating a &CStr, and I think
> the macro will even generate warnings in some configurations (perhaps
> CLIPPY=1?).
>
Got it, I didn't get the warning with CLIPPY=1, I'll double check my
configuration.
I'll fix this in the next revision. Thanks for the heads up!
Best,
Laura
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] drm/tyr: add Job IRQ handling
2026-08-05 10:48 ` Laura Nao
@ 2026-08-06 8:27 ` Alice Ryhl
0 siblings, 0 replies; 5+ messages in thread
From: Alice Ryhl @ 2026-08-06 8:27 UTC (permalink / raw)
To: Laura Nao
Cc: linkmauve, a.hindborg, acourbot, airlied, bjorn3_gh, boqun, dakr,
daniel.almeida, deborah.brouwer, dri-devel, gary, kernel,
linux-kernel, lossin, ojeda, rust-for-linux, simona, tamird,
tmgross, work
On Wed, Aug 05, 2026 at 12:48:15PM +0200, Laura Nao wrote:
> Hello,
>
> On 8/4/26 14:23, Link Mauve wrote:
> > Hi,
> >
> > On Mon, Aug 03, 2026 at 03:34:37PM +0200, Laura Nao wrote:
> >> Add a threaded IRQ wrapper for Tyr interrupt sources and use it to
> >> handle the firmware Job IRQ.
> >>
> >> The Job IRQ reports requests from the CSF firmware, including global
> >> interface requests and CSG attention bits. Only the GLB bit is currently
> >> handled, as it will be used to check firmware readiness. CSG bits
> >> handling will be added at a later stage. Add a Job IRQ handler that
> >> masks the interrupt in the primary IRQ handler, processes pending raw
> >> status in the threaded handler, clears the handled bit, and reenables
> >> the mask before returning.
> >> Add a wait queue and a bool flag so the handler can signal firmware
> >> readiness when the GLB bit is set.
> > […]
> >> diff --git a/drivers/gpu/drm/tyr/fw/irq.rs b/drivers/gpu/drm/tyr/fw/irq.rs
> >> new file mode 100644
> >> index 000000000000..6eeb1399a7b3
> >> --- /dev/null
> >> +++ b/drivers/gpu/drm/tyr/fw/irq.rs
> >> @@ -0,0 +1,105 @@
> > […]
> >> +/// Requests a threaded IRQ registration for the Job IRQ.
> >> +///
> >> +/// # Safety
> >> +///
> >> +/// Callers must not `mem::forget()` the resulting registration or otherwise prevent its
> >> +/// [`Drop`] implementation from running.
> >> +pub(crate) unsafe fn job_irq_init<'a>(
> >> + pdev: &'a platform::Device<Bound>,
> >> + iomem: Arc<IoMem<'a>>,
> >> + fw_ready: Arc<AtomicBool>,
> >> + job_irq_wait: Arc<WaitQueue>,
> >> +) -> Result<impl PinInit<ThreadedRegistration<'a, TyrIrq<JobIrq<'a>>>, Error> + 'a> {
> >> + iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
> >> + let job_irq = JobIrq {
> >> + iomem: iomem.clone(),
> >> + fw_ready,
> >> + job_irq_wait,
> >> + };
> >> + // SAFETY: The caller guarantees the resulting registration will not be leaked.
> >> + unsafe { TyrIrq::request(pdev, c_str!("job"), job_irq) }
> >
> > Nowadays we use the shorter c"job" way of creating a &CStr, and I think
> > the macro will even generate warnings in some configurations (perhaps
> > CLIPPY=1?).
> >
>
> Got it, I didn't get the warning with CLIPPY=1, I'll double check my
> configuration.
There's not any warning for using it, because macros still need it
sometimes.
Alice
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] drm/tyr: add Job IRQ handling
2026-08-04 12:23 ` Link Mauve
2026-08-05 10:48 ` Laura Nao
@ 2026-08-06 12:09 ` Gary Guo
1 sibling, 0 replies; 5+ messages in thread
From: Gary Guo @ 2026-08-06 12:09 UTC (permalink / raw)
To: Link Mauve, Laura Nao
Cc: Daniel Almeida, Alice Ryhl, Danilo Krummrich, David Airlie,
Simona Vetter, Miguel Ojeda, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
Trevor Gross, Tamir Duberstein, Alexandre Courbot,
Onur Özkan, linux-kernel, dri-devel, rust-for-linux, kernel,
Deborah Brouwer
On Tue Aug 4, 2026 at 1:23 PM BST, Link Mauve wrote:
> Hi,
>
> On Mon, Aug 03, 2026 at 03:34:37PM +0200, Laura Nao wrote:
>> Add a threaded IRQ wrapper for Tyr interrupt sources and use it to
>> handle the firmware Job IRQ.
>>
>> The Job IRQ reports requests from the CSF firmware, including global
>> interface requests and CSG attention bits. Only the GLB bit is currently
>> handled, as it will be used to check firmware readiness. CSG bits
>> handling will be added at a later stage. Add a Job IRQ handler that
>> masks the interrupt in the primary IRQ handler, processes pending raw
>> status in the threaded handler, clears the handled bit, and reenables
>> the mask before returning.
>> Add a wait queue and a bool flag so the handler can signal firmware
>> readiness when the GLB bit is set.
> […]
>> diff --git a/drivers/gpu/drm/tyr/fw/irq.rs b/drivers/gpu/drm/tyr/fw/irq.rs
>> new file mode 100644
>> index 000000000000..6eeb1399a7b3
>> --- /dev/null
>> +++ b/drivers/gpu/drm/tyr/fw/irq.rs
>> @@ -0,0 +1,105 @@
> […]
>> +/// Requests a threaded IRQ registration for the Job IRQ.
>> +///
>> +/// # Safety
>> +///
>> +/// Callers must not `mem::forget()` the resulting registration or otherwise prevent its
>> +/// [`Drop`] implementation from running.
>> +pub(crate) unsafe fn job_irq_init<'a>(
>> + pdev: &'a platform::Device<Bound>,
>> + iomem: Arc<IoMem<'a>>,
>> + fw_ready: Arc<AtomicBool>,
>> + job_irq_wait: Arc<WaitQueue>,
>> +) -> Result<impl PinInit<ThreadedRegistration<'a, TyrIrq<JobIrq<'a>>>, Error> + 'a> {
>> + iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
>> + let job_irq = JobIrq {
>> + iomem: iomem.clone(),
>> + fw_ready,
>> + job_irq_wait,
>> + };
>> + // SAFETY: The caller guarantees the resulting registration will not be leaked.
>> + unsafe { TyrIrq::request(pdev, c_str!("job"), job_irq) }
>
> Nowadays we use the shorter c"job" way of creating a &CStr, and I think
> the macro will even generate warnings in some configurations (perhaps
> CLIPPY=1?).
klint will produce a warning for this, but clippy won't.
Best,
Gary
>
>> +}
>> +
>> +impl TyrIrqTrait for JobIrq<'_> {
>> + fn read_status(&self) -> u32 {
>> + self.iomem.read(JOB_IRQ_STATUS).into_raw()
>> + }
>> +
>> + fn clear_mask(&self) {
>> + self.iomem.write_reg(JOB_IRQ_MASK::zeroed());
>> + }
>> +
>> + fn reenable_mask(&self) {
>> + self.iomem.write_reg(JOB_IRQ_MASK::zeroed().with_glb(true));
>> + }
>> +
>> + fn read_raw_status(&self) -> u32 {
>> + self.iomem.read(JOB_IRQ_RAWSTAT).into_raw()
>> + }
>> +
>> + fn clear_status(&self, status: u32) {
>> + self.iomem.write_reg(JOB_IRQ_CLEAR::from_raw(status));
>> + }
>> +
>> + fn mask(&self) -> u32 {
>> + JOB_IRQ_MASK::zeroed().with_glb(true).into_raw()
>> + }
>> +
>> + fn handle(&self, status: u32) {
>> + // TODO: handle other Job IRQ events (e.g. CSG attention bits) here once
>> + // support for them is added.
>> + if JOB_IRQ_RAWSTAT::from_raw(status).glb() {
>> + self.fw_ready.store(true, Ordering::Release);
>> + self.job_irq_wait.wake_ua/rust/macros/module.rsp_all();
>> + }
>> + }
>> +}
>>
>> ---
>> base-commit: 98ae54f97175c4992b4e5bff53f3c6bc24f0f491
>> change-id: 20260728-tyr-irq-v2-0b3c5022be33
>>
>> Best regards,
>> --
>> Laura Nao <laura.nao@collabora.com>
>>
>>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-06 12:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-03 13:34 [PATCH v3] drm/tyr: add Job IRQ handling Laura Nao
2026-08-04 12:23 ` Link Mauve
2026-08-05 10:48 ` Laura Nao
2026-08-06 8:27 ` Alice Ryhl
2026-08-06 12:09 ` Gary Guo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox