From: Eliot Courtney Date: Wed, 3 Jun 2026 07:30:25 +0000 (+0900) Subject: gpu: nova-core: add non-sec2 unload path X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c7fea1f70944c01acdaa3eaeb299770174cef37d;p=thirdparty%2Flinux.git gpu: nova-core: add non-sec2 unload path For non-sec2 it is only required to wait for GSP falcon to halt. This is because GSP does the main work of unloading on GPUs not using sec2. Signed-off-by: Eliot Courtney [ jhubbard: use Result instead of Result<()> in the UnloadBundle impl ] Signed-off-by: John Hubbard Link: https://patch.msgid.link/20260603-b4-blackwell-v13-8-d9f3a06939e0@nvidia.com Signed-off-by: Alexandre Courbot --- diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core/gsp/hal/gh100.rs index 57e31ef4819d..63aef7c65ce5 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -29,7 +29,10 @@ use crate::{ gpu::Chipset, gsp::{ boot::BootUnloadGuard, - hal::GspHal, + hal::{ + GspHal, + UnloadBundle, // + }, Gsp, GspFwWprMeta, // }, @@ -117,6 +120,28 @@ fn wait_for_gsp_lockdown_release( Ok(()) } +struct FspUnloadBundle; + +impl UnloadBundle for FspUnloadBundle { + fn run( + &self, + dev: &device::Device, + bar: &Bar0, + gsp_falcon: &Falcon, + _sec2_falcon: &Falcon, + ) -> Result { + // GSP falcon does most of the work of resetting, so just wait for it to finish. + read_poll_timeout( + || Ok(gsp_falcon.is_riscv_active(bar)), + |&active| !active, + Delta::from_millis(10), + Delta::from_secs(5), + ) + .map(|_| ()) + .inspect_err(|_| dev_err!(dev, "GSP falcon failed to halt\n")) + } +} + struct Gh100; impl GspHal for Gh100 { @@ -133,9 +158,18 @@ impl GspHal for Gh100 { fb_layout: &FbLayout, wpr_meta: &Coherent, gsp_falcon: &'a Falcon, - _sec2_falcon: &'a Falcon, + sec2_falcon: &'a Falcon, ) -> Result> { let fsp_fw = FspFirmware::new(dev, chipset, FIRMWARE_VERSION)?; + + let unload_bundle = crate::gsp::UnloadBundle( + KBox::new(FspUnloadBundle, GFP_KERNEL)? as KBox + ); + + // Wrap the unload bundle into a drop guard so it is automatically run upon failure. + let _unload_guard = + BootUnloadGuard::new(gsp, dev, bar, gsp_falcon, sec2_falcon, Some(unload_bundle)); + let mut fsp = Fsp::wait_secure_boot(dev, bar, chipset, fsp_fw)?; let args = FmcBootArgs::new(