On 6/22/26 12:10 AM, Alexandre Courbot wrote: > The `Fsp` instance was only used in the Hopper+ boot path, and > consequently built locally (and immediately dropped) in it. > > This worked well as a temporary measure, but the FSP is also needed in > other parts of the driver, for instance vGPU.
Or: "will be needed, in future patchsets", but not in this one. May I suggest that we put this patch in one of those future patchsets, instead of trying to do it here, in advance of anything using it? thanks, -- John Hubbard > > Thus, create the `Fsp` instance in the `Gpu` constructor and store it > there, passing it to the GSP boot as a mutable reference using > `GspBootContext`. This makes the `Fsp` available even after the GSP is > booted. > > Signed-off-by: Alexandre Courbot <[email protected]> > --- > drivers/gpu/nova-core/gpu.rs | 15 ++++++++++++++- > drivers/gpu/nova-core/gsp.rs | 2 ++ > drivers/gpu/nova-core/gsp/hal/gh100.rs | 9 +++------ > 3 files changed, 19 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs > index 2e76e4bf79b2..e5ebd79c9020 100644 > --- a/drivers/gpu/nova-core/gpu.rs > +++ b/drivers/gpu/nova-core/gpu.rs > @@ -21,11 +21,13 @@ > Falcon, // > }, > fb::SysmemFlush, > + fsp::Fsp, > gsp::{ > self, > commands::GetGspStaticInfoReply, > Gsp, > - GspBootContext, // > + GspBootContext, > + GspBootMethod, // > }, > regs, > }; > @@ -261,6 +263,10 @@ struct GspResources<'gpu> { > gsp_falcon: Falcon<GspFalcon>, > /// SEC2 falcon instance, used for GSP boot up and cleanup. > sec2_falcon: Falcon<Sec2Falcon>, > + /// FSP instance, if on an arch that supports it. > + // TODO: use different resource types for each boot method, and make the > relevant Gsp methods > + // generic against them. > + fsp: Option<Fsp>, > /// GSP runtime data. > #[pin] > gsp: Gsp, > @@ -304,6 +310,7 @@ fn drop(self: Pin<&mut Self>) { > chipset: this.spec.chipset, > gsp_falcon: &*this.gsp_falcon, > sec2_falcon: &*this.sec2_falcon, > + fsp: this.fsp.as_mut(), > }, > bundle, > ) > @@ -354,6 +361,11 @@ pub(crate) fn new( > > sec2_falcon: Falcon::new(dev, spec.chipset)?, > > + fsp: match spec.chipset.gsp_boot_method() { > + GspBootMethod::Sec2 { .. } => None, > + GspBootMethod::Fsp => Some(Fsp::wait_secure_boot(dev, > bar, spec.chipset)?), > + }, > + > gsp <- Gsp::new(pdev), > > // This member must be initialized last, so the > `UnloadBundle` can never be dropped > @@ -365,6 +377,7 @@ pub(crate) fn new( > chipset: spec.chipset, > gsp_falcon, > sec2_falcon, > + fsp: fsp.as_mut(), > })?, > }), > > diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs > index 771b38e6335d..ff438506070a 100644 > --- a/drivers/gpu/nova-core/gsp.rs > +++ b/drivers/gpu/nova-core/gsp.rs > @@ -38,6 +38,7 @@ > sec2::Sec2 as Sec2Falcon, > Falcon, // > }, > + fsp::Fsp, > gpu::{ > Architecture, > Chipset, // > @@ -62,6 +63,7 @@ pub(crate) struct GspBootContext<'a> { > pub(crate) chipset: Chipset, > pub(crate) gsp_falcon: &'a Falcon<GspFalcon>, > pub(crate) sec2_falcon: &'a Falcon<Sec2Falcon>, > + pub(crate) fsp: Option<&'a mut Fsp>, > } > > impl<'a> GspBootContext<'a> { > diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs > b/drivers/gpu/nova-core/gsp/hal/gh100.rs > index 7bba18ba2f75..8673a749dbac 100644 > --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs > +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs > @@ -17,10 +17,7 @@ > Falcon, // > }, > fb::FbLayout, > - fsp::{ > - FmcBootArgs, > - Fsp, // > - }, > + fsp::FmcBootArgs, > gsp::{ > hal::{ > GspHal, > @@ -152,12 +149,12 @@ fn boot( > let mut unload_bundle = Err(EAGAIN); > > let res = (|| { > + let fsp = ctx.fsp.as_mut().ok_or(ENODEV)?; > + > unload_bundle = Ok(crate::gsp::UnloadBundle( > KBox::new(FspUnloadBundle, GFP_KERNEL)? as KBox<dyn > UnloadBundle>, > )); > > - let mut fsp = Fsp::wait_secure_boot(dev, bar, chipset)?; > - > let args = FmcBootArgs::new( > dev, > chipset, >
