On Fri Aug 29, 2025 at 7:39 AM JST, Danilo Krummrich wrote:
> If built on architectures with CONFIG_ARCH_DMA_ADDR_T_64BIT=y nova-core
> produces that following build failures:
>
> error[E0308]: mismatched types
> --> drivers/gpu/nova-core/fb.rs:49:59
> |
> 49 | hal::fb_hal(chipset).write_sysmem_flush_page(bar,
> page.dma_handle())?;
> | -----------------------
> ^^^^^^^^^^^^^^^^^ expected `u64`, found `u32`
> | |
> | arguments to this method are incorrect
> |
> note: method defined here
> --> drivers/gpu/nova-core/fb/hal.rs:19:8
> |
> 19 | fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) ->
> Result;
> | ^^^^^^^^^^^^^^^^^^^^^^^
> help: you can convert a `u32` to a `u64`
> |
> 49 | hal::fb_hal(chipset).write_sysmem_flush_page(bar,
> page.dma_handle().into())?;
> |
> +++++++
>
> error[E0308]: mismatched types
> --> drivers/gpu/nova-core/fb.rs:65:47
> |
> 65 | if hal.read_sysmem_flush_page(bar) == self.page.dma_handle()
> {
> | ------------------------------- ^^^^^^^^^^^^^^^^^^^^^^
> expected `u64`, found `u32`
> | |
> | expected because this is `u64`
> |
> help: you can convert a `u32` to a `u64`
> |
> 65 | if hal.read_sysmem_flush_page(bar) ==
> self.page.dma_handle().into() {
> |
> +++++++
>
> error: this arithmetic operation will overflow
> --> drivers/gpu/nova-core/falcon.rs:469:23
> |
> 469 | .set_base((dma_start >> 40) as u16)
> | ^^^^^^^^^^^^^^^^^ attempt to shift right by
> `40_i32`, which would overflow
> |
> = note: `#[deny(arithmetic_overflow)]` on by default
>
> This is due to the code making assumptions on the width of dma_addr_t to
> be 64 bit.
>
> While this could technically be handled, it is rather painful to deal
> with, as the following example illustrates:
>
> pub(super) fn read_sysmem_flush_page_ga100(bar: &Bar0) -> DmaAddress {
> let addr =
> u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR::read(bar).adr_39_08())
> << FLUSH_SYSMEM_ADDR_SHIFT
> |
> u64::from(regs::NV_PFB_NISO_FLUSH_SYSMEM_ADDR_HI::read(bar).adr_63_40())
> << FLUSH_SYSMEM_ADDR_SHIFT_HI;
>
> addr.try_into().unwrap_or_else(|_| {
> kernel::warn_on!(true);
>
> 0
> })
> }
>
> At the same time there's not much value for nova-core to support 32-bit,
> given that the supported GPU architectures are Turing and later, hence
> depend on CONFIG_64BIT.
>
> Cc: John Hubbard <[email protected]>
> Reported-by: Miguel Ojeda <[email protected]>
> Closes: https://lore.kernel.org/lkml/[email protected]/
> Fixes: 6554ad65b589 ("gpu: nova-core: register sysmem flush page")
> Fixes: 69f5cd67ce41 ("gpu: nova-core: add falcon register definitions and
> base code")
> Signed-off-by: Danilo Krummrich <[email protected]>
Thanks!
Reviewed-by: Alexandre Courbot <[email protected]>