On Wed Sep 3, 2025 at 4:08 PM JST, Alexandre Courbot wrote:
> On Wed Sep 3, 2025 at 4:53 AM JST, Danilo Krummrich wrote:
>> On Tue Sep 2, 2025 at 4:31 PM CEST, Alexandre Courbot wrote:
>>> diff --git a/drivers/gpu/nova-core/driver.rs 
>>> b/drivers/gpu/nova-core/driver.rs
>>> index 
>>> 274989ea1fb4a5e3e6678a08920ddc76d2809ab2..1062014c0a488e959379f009c2e8029ffaa1e2f8
>>>  100644
>>> --- a/drivers/gpu/nova-core/driver.rs
>>> +++ b/drivers/gpu/nova-core/driver.rs
>>> @@ -6,6 +6,8 @@
>>>  
>>>  #[pin_data]
>>>  pub(crate) struct NovaCore {
>>> +    // Placeholder for the real `Gsp` object once it is built.
>>> +    pub(crate) gsp: (),
>>>      #[pin]
>>>      pub(crate) gpu: Gpu,
>>>      _reg: auxiliary::Registration,
>>> @@ -40,8 +42,14 @@ fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) 
>>> -> Result<Pin<KBox<Self
>>>          )?;
>>>  
>>>          let this = KBox::pin_init(
>>> -            try_pin_init!(Self {
>>> +            try_pin_init!(&this in Self {
>>>                  gpu <- Gpu::new(pdev, bar)?,
>>> +                gsp <- {
>>> +                    // SAFETY: `this.gpu` is initialized to a valid value.
>>> +                    let gpu = unsafe { &(*this.as_ptr()).gpu };
>>> +
>>> +                    gpu.start_gsp(pdev)?
>>> +                },
>>
>> Please use pin_chain() [1] for this.
>
> Sorry, but I couldn't figure out how I can use pin_chain here (and
> couldn't find any relevant example in the kernel code either). Can you
> elaborate a bit?

To be more specific on what I don't get: I see how pin_chain could be
used to initialize a structure which dependent member can take a
temporary value (like a pointer set to `null`), but in this case `gsp`
must be initialized with the result of `start_gsp`, and there is no
"default" valid value for it meanwhile (I use `()` as its type, but it
is a temporary placeholder). But maybe I am just misunderstanding
something about how `pin_chain` can be used.

Reply via email to