On Sat Dec 6, 2025 at 8:22 AM JST, Timur Tabi wrote:
> On Fri, 2025-12-05 at 09:35 +0900, Alexandre Courbot wrote:
>> With one caveat: `new` now returns a 4K object on the stack, which we
>> definitely want to avoid. So maybe we can have a wrapper for things we
>> want to align the 4K:
>>
>> #[repr(C)]
>> pub(crate) struct GspPageAligned<T> {
>> pub(crate) inner: T,
>> padding: [u8; GSP_PAGE_SIZE - core::mem::size_of::<T>()],
>> }
>
> This doesn't seem to work.
>
> error: generic parameters may not be used in const operations
> --> drivers/gpu/nova-core/gsp/fw.rs:894:56
> |
> 894 | ...::mem::size_of::<T>()],
> | ^ cannot perform const operation using `T`
> |
>
Argh, the good old "can't use generics in const expressions".
> I've tried different things and they all generate various compilation errors.
>
> I'll just post a v3 with my version, and then you can experiment with it to
> see if you can get
> GspPageAligned aligned to work on top of it.
Sure, let me check.
>
>>
>> We would then allocate the CoherentAllocation using a
>> `GspPageAligned<GspArgumentsCached>`, and initialize its useful data
>> with:
>>
>> dma_write!(rmargs[0].inner = fw::GspArgumentsCached::new(&cmdq))?;
>
> So I assume you mean this:
>
> let rmargs =
> CoherentAllocation::<GspPageAligned<GspArgumentsCached>>::alloc_coherent(
> dev,
> 1,
> GFP_KERNEL | __GFP_ZERO,
> )?;
> dma_write!(rmargs[0].inner = fw::GspArgumentsCached::new(&cmdq))?;
Yup, that's what I had in mind.