From a75718afc9a5c61d9266d5d0010228a6a3bb7233 Mon Sep 17 00:00:00 2001 From: Timur Tabi Date: Thu, 22 Jan 2026 16:28:43 -0600 Subject: [PATCH] gpu: nova-core: add NV_PFALCON_FALCON_ENGINE::reset_engine() Add a method for the NV_PFALCON_FALCON_ENGINE register that reset the Falcon, and update the reset_eng() HAL functions to use it. Signed-off-by: Timur Tabi Reviewed-by: Gary Guo Acked-by: Danilo Krummrich Link: https://patch.msgid.link/20260122222848.2555890-9-ttabi@nvidia.com Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon/hal/ga102.rs | 9 +-------- drivers/gpu/nova-core/falcon/hal/tu102.rs | 9 +-------- drivers/gpu/nova-core/regs.rs | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/nova-core/falcon/hal/ga102.rs b/drivers/gpu/nova-core/falcon/hal/ga102.rs index 61cc3d261196..39863813a2bf 100644 --- a/drivers/gpu/nova-core/falcon/hal/ga102.rs +++ b/drivers/gpu/nova-core/falcon/hal/ga102.rs @@ -6,7 +6,6 @@ use kernel::{ device, io::poll::read_poll_timeout, prelude::*, - time::delay::fsleep, time::Delta, // }; @@ -147,13 +146,7 @@ impl FalconHal for Ga102 { Delta::from_micros(150), ); - regs::NV_PFALCON_FALCON_ENGINE::update(bar, &E::ID, |v| v.set_reset(true)); - - // TIMEOUT: falcon engine should not take more than 10us to reset. - fsleep(Delta::from_micros(10)); - - regs::NV_PFALCON_FALCON_ENGINE::update(bar, &E::ID, |v| v.set_reset(false)); - + regs::NV_PFALCON_FALCON_ENGINE::reset_engine::(bar); self.reset_wait_mem_scrubbing(bar)?; Ok(()) diff --git a/drivers/gpu/nova-core/falcon/hal/tu102.rs b/drivers/gpu/nova-core/falcon/hal/tu102.rs index 586d5dc6b417..23fbf6110572 100644 --- a/drivers/gpu/nova-core/falcon/hal/tu102.rs +++ b/drivers/gpu/nova-core/falcon/hal/tu102.rs @@ -5,7 +5,6 @@ use core::marker::PhantomData; use kernel::{ io::poll::read_poll_timeout, prelude::*, - time::delay::fsleep, time::Delta, // }; @@ -65,13 +64,7 @@ impl FalconHal for Tu102 { } fn reset_eng(&self, bar: &Bar0) -> Result { - regs::NV_PFALCON_FALCON_ENGINE::update(bar, &E::ID, |v| v.set_reset(true)); - - // TIMEOUT: falcon engine should not take more than 10us to reset. - fsleep(Delta::from_micros(10)); - - regs::NV_PFALCON_FALCON_ENGINE::update(bar, &E::ID, |v| v.set_reset(false)); - + regs::NV_PFALCON_FALCON_ENGINE::reset_engine::(bar); self.reset_wait_mem_scrubbing(bar)?; Ok(()) diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index cd7b7aa6fc2a..ea0d32f5396c 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -7,13 +7,18 @@ #[macro_use] pub(crate) mod macros; -use kernel::prelude::*; +use kernel::{ + prelude::*, + time, // +}; use crate::{ + driver::Bar0, falcon::{ DmaTrfCmdSize, FalconCoreRev, FalconCoreRevSubversion, + FalconEngine, FalconFbifMemType, FalconFbifTarget, FalconMem, @@ -365,6 +370,18 @@ register!(NV_PFALCON_FALCON_ENGINE @ PFalconBase[0x000003c0] { 0:0 reset as bool; }); +impl NV_PFALCON_FALCON_ENGINE { + /// Resets the falcon + pub(crate) fn reset_engine(bar: &Bar0) { + Self::read(bar, &E::ID).set_reset(true).write(bar, &E::ID); + + // TIMEOUT: falcon engine should not take more than 10us to reset. + time::delay::fsleep(time::Delta::from_micros(10)); + + Self::read(bar, &E::ID).set_reset(false).write(bar, &E::ID); + } +} + register!(NV_PFALCON_FBIF_TRANSCFG @ PFalconBase[0x00000600[8]] { 1:0 target as u8 ?=> FalconFbifTarget; 2:2 mem_type as bool => FalconFbifMemType; -- 2.47.3