On Wed Jun 4, 2025 at 6:45 AM JST, Lyude Paul wrote: > On Wed, 2025-05-21 at 15:45 +0900, Alexandre Courbot wrote: >> With all the required pieces in place, load FWSEC-FRTS onto the GSP >> falcon, run it, and check that it successfully carved out the WPR2 >> region out of framebuffer memory. >> >> Signed-off-by: Alexandre Courbot <acour...@nvidia.com> >> --- >> drivers/gpu/nova-core/falcon.rs | 3 --- >> drivers/gpu/nova-core/gpu.rs | 57 >> ++++++++++++++++++++++++++++++++++++++++- >> drivers/gpu/nova-core/regs.rs | 15 +++++++++++ >> 3 files changed, 71 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/nova-core/falcon.rs >> b/drivers/gpu/nova-core/falcon.rs >> index >> f224ca881b72954d17fee87278ecc7a0ffac5322..91f0451a04e7b4d0631fbcf9b1e76e59d5dfb7e8 >> 100644 >> --- a/drivers/gpu/nova-core/falcon.rs >> +++ b/drivers/gpu/nova-core/falcon.rs >> @@ -2,9 +2,6 @@ >> >> //! Falcon microprocessor base support >> >> -// To be removed when all code is used. >> -#![expect(dead_code)] >> - >> use core::ops::Deref; >> use core::time::Duration; >> use hal::FalconHal; >> diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs >> index >> 5a4c23a7a6c22abc1f6e72a307fa3336d731a396..280929203189fba6ad8e37709927597bb9c7d545 >> 100644 >> --- a/drivers/gpu/nova-core/gpu.rs >> +++ b/drivers/gpu/nova-core/gpu.rs >> @@ -246,7 +246,7 @@ pub(crate) fn new( >> >> let bios = Vbios::new(pdev, bar)?; >> >> - let _fwsec_frts = FwsecFirmware::new( >> + let fwsec_frts = FwsecFirmware::new( >> &gsp_falcon, >> pdev.as_ref(), >> bar, >> @@ -257,6 +257,61 @@ pub(crate) fn new( >> }, >> )?; >> >> + // Check that the WPR2 region does not already exists - if it does, >> the GPU needs to be >> + // reset. >> + if regs::NV_PFB_PRI_MMU_WPR2_ADDR_HI::read(bar).hi_val() != 0 { >> + dev_err!( >> + pdev.as_ref(), >> + "WPR2 region already exists - GPU needs to be reset to >> proceed\n" >> + ); >> + return Err(EBUSY); >> + } >> + >> + // Reset falcon, load FWSEC-FRTS, and run it. >> + gsp_falcon.reset(bar)?; >> + gsp_falcon.dma_load(bar, &fwsec_frts)?; >> + let (mbox0, _) = gsp_falcon.boot(bar, Some(0), None)?; >> + if mbox0 != 0 { >> + dev_err!(pdev.as_ref(), "FWSEC firmware returned error {}\n", >> mbox0); >> + return Err(EINVAL); >> + } >> + >> + // SCRATCH_E contains FWSEC-FRTS' error code, if any. >> + let frts_status = >> regs::NV_PBUS_SW_SCRATCH_0E::read(bar).frts_err_code(); >> + if frts_status != 0 { >> + dev_err!( >> + pdev.as_ref(), >> + "FWSEC-FRTS returned with error code {:#x}", >> + frts_status >> + ); >> + return Err(EINVAL); >> + } >> + >> + // Check the WPR2 has been created as we requested. >> + let (wpr2_lo, wpr2_hi) = ( >> + (regs::NV_PFB_PRI_MMU_WPR2_ADDR_LO::read(bar).lo_val() as u64) >> << 12, >> + (regs::NV_PFB_PRI_MMU_WPR2_ADDR_HI::read(bar).hi_val() as u64) >> << 12, >> + ); >> + if wpr2_hi == 0 { >> + dev_err!( >> + pdev.as_ref(), >> + "WPR2 region not created after running FWSEC-FRTS\n" >> + ); >> + >> + return Err(ENOTTY); > > ENOTTY? Is this correct?
Probably not - I guess `EIO` would be better to express a firmware failure? (and for the errors around this one as well). > >> + } else if wpr2_lo != fb_layout.frts.start { >> + dev_err!( >> + pdev.as_ref(), >> + "WPR2 region created at unexpected address {:#x} ; expected >> {:#x}\n", > > Extra space (but if that's intentional, feel free to leave it) Oops, French typography habits. ;) > > Besides those two nits: Reviewed-by: Lyude Paul <ly...@redhat.com> Thanks!