On Wed Sep 10, 2025 at 1:18 PM CEST, Alexandre Courbot wrote: > On Wed Sep 10, 2025 at 5:01 PM JST, Danilo Krummrich wrote: >> On Wed Sep 10, 2025 at 6:48 AM CEST, Alexandre Courbot wrote: >>> On Tue Sep 9, 2025 at 11:43 PM JST, Danilo Krummrich wrote: >>>> impl Gpu { >>>> pub(crate) fn new<'a>( >>>> dev: &'a Device<Bound>, >>>> bar: &'a Bar0 >>>> devres_bar: Arc<Devres<Bar0>>, >>>> ) -> impl PinInit<Self, Error> + 'a { >>>> try_pin_init(Self { >>>> bar: devres_bar, >>>> spec: Spec::new(bar)?, >>>> gsp_falcon: Falcon::<Gsp>::new(dev, spec.chipset)?, >>>> sec2_falcon: Falcon::<Sec2>::new(dev, spec.chipset)?, >>>> sysmem_flush: SysmemFlush::register(dev, bar, spec.chipset)? >>>> gsp <- Gsp::new(gsp_falcon, sec2_falcon, sysmem_flush)?, >>>> }) >>>> } >>>> } >>> >>> It does work. The bizareness of passing the `bar` twice aside, >> >> Yeah, but it really seems like a minor inconvinience. (Especially, since this >> will be the only occurance of this we'll ever have.) > > It's definitely not a big deal. > >> >>> here is what it looks like when I got it to compile: >> >> This looks great! >> >>> pub(crate) fn new<'a>( >>> pdev: &'a pci::Device<device::Bound>, >>> devres_bar: Arc<Devres<Bar0>>, >>> bar: &'a Bar0, >>> ) -> impl PinInit<Self, Error> + 'a { >>> try_pin_init!(Self { >>> spec: Spec::new(bar).inspect(|spec| { >>> dev_info!( >>> pdev.as_ref(), >>> "NVIDIA (Chipset: {}, Architecture: {:?}, Revision: >>> {})\n", >>> spec.chipset, >>> spec.chipset.arch(), >>> spec.revision >>> ); >>> })?, >> >> + _: { >> + gfw::wait_gfw_boot_completion(bar) >> + .inspect_err(|_| dev_err!(pdev.as_ref(), "GFW boot did >> not complete"))?; >> + }, >>> >>> sysmem_flush: SysmemFlush::register(pdev.as_ref(), bar, >>> spec.chipset)?, >>> >>> gsp_falcon: Falcon::<Gsp>::new( >>> pdev.as_ref(), >>> spec.chipset, >>> bar, >>> spec.chipset > Chipset::GA100, >>> ) >>> .inspect(|falcon| falcon.clear_swgen0_intr(bar))?, >>> >>> sec2_falcon: Falcon::<Sec2>::new(pdev.as_ref(), spec.chipset, >>> bar, true)?, >>> >> - gsp: Self::start_gsp(pdev, bar, spec.chipset, gsp_falcon, >> sec2_falcon)?, >> + gsp <- Self::start_gsp(pdev, bar, spec.chipset, gsp_falcon, >> sec2_falcon), >>> >>> bar: devres_bar, >>> }) >>> } >>> >>> The wait for GFW initialization had to be moved to `probe`, but that's >>> fine IMO. >> >> That's not necessary, you can keep it in Gpu::new() -- I don't see what's >> preventing us from that. I inserted it in the code above. > > This one didn't work for me, but maybe you have a newer version of the > internal references patch: > > error: no rules expected reserved identifier `_` > --> drivers/gpu/nova-core/gpu.rs:323:13 > | > 323 | _: { > | ^ no rules expected this token in macro call > | > note: while trying to match `)`
Yeah, you also need this patch [1]. [1] https://lore.kernel.org/all/20250905140534.3328297-1-los...@kernel.org/