On Mon Jun 29, 2026 at 11:09 PM JST, Alexandre Courbot wrote:
> The construction of the unload bundle is currently a bit convoluted and
> could be done in one function instead of two.
>
> Additionally, turn that function into a method of `Tu102`. A following
> patch will turn the "use FWSEC bootloader" property into a flag of the
> TU102 HAL itself, and making this a method will allow the code to access
> it instead of querying `Chipset`.
>
> Signed-off-by: Alexandre Courbot <[email protected]>
> ---
>  drivers/gpu/nova-core/gsp/hal/tu102.rs | 87 
> ++++++++++++++++------------------
>  1 file changed, 41 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/gsp/hal/tu102.rs 
> b/drivers/gpu/nova-core/gsp/hal/tu102.rs
> index ef465b99af05..0505a5beee6e 100644
> --- a/drivers/gpu/nova-core/gsp/hal/tu102.rs
> +++ b/drivers/gpu/nova-core/gsp/hal/tu102.rs
> @@ -56,22 +56,6 @@ enum FwsecUnloadFirmware {
>  }
>  
>  impl FwsecUnloadFirmware {
> -    /// Loads the FWSEC SB firmware, as well as its bootloader if `chipset` 
> requires it.
> -    fn new(
> -        dev: &device::Device<device::Bound>,
> -        chipset: Chipset,
> -        bios: &Vbios,
> -        gsp_falcon: &Falcon<'_, GspEngine>,
> -    ) -> Result<Self> {
> -        let fwsec_sb = FwsecFirmware::new(dev, gsp_falcon, bios, 
> FwsecCommand::Sb)?;
> -
> -        Ok(if chipset.needs_fwsec_bootloader() {
> -            Self::WithBl(FwsecFirmwareWithBl::new(fwsec_sb, dev, chipset)?)
> -        } else {
> -            Self::WithoutBl(fwsec_sb)
> -        })
> -    }
> -
>      /// Runs the FWSEC SB firmware.
>      fn run(
>          &self,
> @@ -93,33 +77,6 @@ struct Sec2UnloadBundle {
>      booter_unloader: BooterFirmware,
>  }
>  
> -impl Sec2UnloadBundle {
> -    /// Load and prepare the resources required to properly reset the GSP 
> after it has been stopped.
> -    fn build(
> -        dev: &device::Device<device::Bound>,
> -        chipset: Chipset,
> -        bios: &Vbios,
> -        gsp_falcon: &Falcon<'_, GspEngine>,
> -        sec2_falcon: &Falcon<'_, Sec2>,
> -    ) -> Result<KBox<dyn UnloadBundle>> {
> -        KBox::new(
> -            Self {
> -                fwsec_sb: FwsecUnloadFirmware::new(dev, chipset, bios, 
> gsp_falcon)?,
> -                booter_unloader: BooterFirmware::new(
> -                    dev,
> -                    BooterKind::Unloader,
> -                    chipset,
> -                    FIRMWARE_VERSION,
> -                    sec2_falcon,
> -                )?,
> -            },
> -            GFP_KERNEL,
> -        )
> -        .map(|b| b as KBox<dyn UnloadBundle>)
> -        .map_err(Into::into)
> -    }
> -}
> -
>  impl UnloadBundle for Sec2UnloadBundle {
>      fn run(&self, ctx: &GspBootContext<'_>) -> Result {
>          let dev = ctx.dev();
> @@ -257,6 +214,44 @@ fn run_fwsec_frts(
>  
>  struct Tu102;
>  
> +impl Tu102 {
> +    /// Load and prepare the resources required to properly reset the GSP 
> after it has been stopped.
> +    fn build_unload_bundle(
> +        &self,
> +        dev: &device::Device<device::Bound>,
> +        chipset: Chipset,
> +        bios: &Vbios,
> +        gsp_falcon: &Falcon<'_, GspEngine>,
> +        sec2_falcon: &Falcon<'_, Sec2>,
> +    ) -> Result<crate::gsp::UnloadBundle> {
> +        // Load the FWSEC SB firmware, as well as its bootloader if required.
> +        let fwsec_sb =
> +            FwsecFirmware::new(dev, gsp_falcon, bios, 
> FwsecCommand::Sb).and_then(|fwsec_sb| {
> +                Ok(if chipset.needs_fwsec_bootloader() {
> +                    
> FwsecUnloadFirmware::WithBl(FwsecFirmwareWithBl::new(fwsec_sb, dev, chipset)?)
> +                } else {
> +                    FwsecUnloadFirmware::WithoutBl(fwsec_sb)
> +                })
> +            })?;

nit: Maybe nicer to write this like:
```
// Load the FWSEC SB firmware, as well as its bootloader if required.
let fwsec_sb = FwsecFirmware::new(dev, gsp_falcon, bios, FwsecCommand::Sb)?;
let fwsec_sb = if self.needs_fwsec_bootloader {
    FwsecUnloadFirmware::WithBl(FwsecFirmwareWithBl::new(fwsec_sb, dev, 
chipset)?)
} else {
    FwsecUnloadFirmware::WithoutBl(fwsec_sb)
};
```

With that,

Reviewed-by: Eliot Courtney <[email protected]>

> +
> +        KBox::new(
> +            Sec2UnloadBundle {
> +                fwsec_sb,
> +                booter_unloader: BooterFirmware::new(
> +                    dev,
> +                    BooterKind::Unloader,
> +                    chipset,
> +                    FIRMWARE_VERSION,
> +                    sec2_falcon,
> +                )?,
> +            },
> +            GFP_KERNEL,
> +        )
> +        .map(|b| crate::gsp::UnloadBundle(b))
> +        .map_err(Into::into)
> +    }
> +}
> +
>  impl GspHal for Tu102 {
>      fn boot(
>          &self,
> @@ -277,10 +272,10 @@ fn boot(
>          //
>          // If the unload bundle creation fails, the GPU will need to be 
> reset before the driver can
>          // be probed again.
> -        let unload_bundle = Sec2UnloadBundle::build(dev, chipset, &bios, 
> gsp_falcon, sec2_falcon)
> +        let unload_bundle = self
> +            .build_unload_bundle(dev, chipset, &bios, gsp_falcon, 
> sec2_falcon)
>              .inspect_err(|e| dev_warn!(dev, "Failed to prepare unload 
> firmware: {:?}\n", e))
> -            .ok()
> -            .map(crate::gsp::UnloadBundle);
> +            .ok();
>  
>          // Run the unload bundle to try and recover the GSP if an error 
> occurs.
>          let unload_guard = ScopeGuard::new_with_data(unload_bundle, 
> |unload_bundle| {

Reply via email to