Rust for Linux List
 help / color / mirror / Atom feed
* [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1
@ 2026-01-07  1:24 Timur Tabi
  2026-01-07  1:24 ` [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings Timur Tabi
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Timur Tabi @ 2026-01-07  1:24 UTC (permalink / raw)
  To: Danilo Krummrich, Alexandre Courbot, Joel Fernandes, John Hubbard,
	nouveau, rust-for-linux

The NV_PFALCON_FALCON_DMATRFBASE/1 register pair supports DMA address
up to 49 bits only, but the write to DMATRFBASE1 could exceed that.
To mitigate, check first that the DMA address will fit.

Fixes: 69f5cd67ce41 ("gpu: nova-core: add falcon register definitions and base code")
Signed-off-by: Timur Tabi <ttabi@nvidia.com>
---
 drivers/gpu/nova-core/falcon.rs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs
index 82c661aef594..fe5abf64dd2b 100644
--- a/drivers/gpu/nova-core/falcon.rs
+++ b/drivers/gpu/nova-core/falcon.rs
@@ -493,7 +493,11 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
             Some(_) => (),
         };
 
-        // Set up the base source DMA address.
+        // Set up the base source DMA address.  DMATRFBASE only supports a 49-bit address.
+        if dma_start > kernel::dma::DmaMask::new::<49>().value() {
+            dev_err!(self.dev, "DMA address {:#x} exceeds 49 bits\n", dma_start);
+            return Err(ERANGE);
+        }
 
         regs::NV_PFALCON_FALCON_DMATRFBASE::default()
             // CAST: `as u32` is used on purpose since we do want to strip the upper bits, which

base-commit: 4348796233e736147e2e79c58784d0a9fb48867d
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  1:24 [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 Timur Tabi
@ 2026-01-07  1:24 ` Timur Tabi
  2026-01-07  2:10   ` John Hubbard
  2026-01-07  1:56 ` [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 John Hubbard
  2026-01-07  3:55 ` Joel Fernandes
  2 siblings, 1 reply; 14+ messages in thread
From: Timur Tabi @ 2026-01-07  1:24 UTC (permalink / raw)
  To: Danilo Krummrich, Alexandre Courbot, Joel Fernandes, John Hubbard,
	nouveau, rust-for-linux

Although the dev_xx!() macro calls do not technically require terminating
newlines for the format strings, they should be added any way to maintain
consistency, both within Rust code and with the C versions.

Signed-off-by: Timur Tabi <ttabi@nvidia.com>
---
 drivers/gpu/nova-core/falcon.rs           | 6 +++---
 drivers/gpu/nova-core/falcon/hal/ga102.rs | 4 ++--
 drivers/gpu/nova-core/gpu.rs              | 2 +-
 drivers/gpu/nova-core/gsp/sequencer.rs    | 6 +++---
 drivers/gpu/nova-core/vbios.rs            | 2 +-
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs
index fe5abf64dd2b..c1cb31c856b5 100644
--- a/drivers/gpu/nova-core/falcon.rs
+++ b/drivers/gpu/nova-core/falcon.rs
@@ -466,7 +466,7 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
         if dma_start % DmaAddress::from(DMA_LEN) > 0 {
             dev_err!(
                 self.dev,
-                "DMA transfer start addresses must be a multiple of {}",
+                "DMA transfer start addresses must be a multiple of {}\n",
                 DMA_LEN
             );
             return Err(EINVAL);
@@ -483,11 +483,11 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
             .and_then(|size| size.checked_add(load_offsets.src_start))
         {
             None => {
-                dev_err!(self.dev, "DMA transfer length overflow");
+                dev_err!(self.dev, "DMA transfer length overflow\n");
                 return Err(EOVERFLOW);
             }
             Some(upper_bound) if usize::from_safe_cast(upper_bound) > fw.size() => {
-                dev_err!(self.dev, "DMA transfer goes beyond range of DMA object");
+                dev_err!(self.dev, "DMA transfer goes beyond range of DMA object\n");
                 return Err(EINVAL);
             }
             Some(_) => (),
diff --git a/drivers/gpu/nova-core/falcon/hal/ga102.rs b/drivers/gpu/nova-core/falcon/hal/ga102.rs
index 69a7a95cac16..0bdfe45a2d03 100644
--- a/drivers/gpu/nova-core/falcon/hal/ga102.rs
+++ b/drivers/gpu/nova-core/falcon/hal/ga102.rs
@@ -52,7 +52,7 @@ fn signature_reg_fuse_version_ga102(
     let ucode_idx = match usize::from(ucode_id) {
         ucode_id @ 1..=regs::NV_FUSE_OPT_FPF_SIZE => ucode_id - 1,
         _ => {
-            dev_err!(dev, "invalid ucode id {:#x}", ucode_id);
+            dev_err!(dev, "invalid ucode id {:#x}\n", ucode_id);
             return Err(EINVAL);
         }
     };
@@ -66,7 +66,7 @@ fn signature_reg_fuse_version_ga102(
     } else if engine_id_mask & 0x0400 != 0 {
         regs::NV_FUSE_OPT_FPF_GSP_UCODE1_VERSION::read(bar, ucode_idx).data()
     } else {
-        dev_err!(dev, "unexpected engine_id_mask {:#x}", engine_id_mask);
+        dev_err!(dev, "unexpected engine_id_mask {:#x}\n", engine_id_mask);
         return Err(EINVAL);
     };
 
diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
index 50d76092fbdd..9b042ef1a308 100644
--- a/drivers/gpu/nova-core/gpu.rs
+++ b/drivers/gpu/nova-core/gpu.rs
@@ -268,7 +268,7 @@ pub(crate) fn new<'a>(
             // We must wait for GFW_BOOT completion before doing any significant setup on the GPU.
             _: {
                 gfw::wait_gfw_boot_completion(bar)
-                    .inspect_err(|_| dev_err!(pdev.as_ref(), "GFW boot did not complete"))?;
+                    .inspect_err(|_| dev_err!(pdev.as_ref(), "GFW boot did not complete\n"))?;
             },
 
             sysmem_flush: SysmemFlush::register(pdev.as_ref(), bar, spec.chipset)?,
diff --git a/drivers/gpu/nova-core/gsp/sequencer.rs b/drivers/gpu/nova-core/gsp/sequencer.rs
index d78a30fbb70f..d965ffe9ba89 100644
--- a/drivers/gpu/nova-core/gsp/sequencer.rs
+++ b/drivers/gpu/nova-core/gsp/sequencer.rs
@@ -121,7 +121,7 @@ pub(crate) fn new(data: &[u8], dev: &device::Device) -> Result<(Self, usize)> {
         };
 
         if data.len() < size {
-            dev_err!(dev, "Data is not enough for command");
+            dev_err!(dev, "Data is not enough for command\n");
             return Err(EINVAL);
         }
 
@@ -320,7 +320,7 @@ fn next(&mut self) -> Option<Self::Item> {
 
         cmd_result.map_or_else(
             |_err| {
-                dev_err!(self.dev, "Error parsing command at offset {}", offset);
+                dev_err!(self.dev, "Error parsing command at offset {}\n", offset);
                 None
             },
             |(cmd, size)| {
@@ -382,7 +382,7 @@ pub(crate) fn run(cmdq: &mut Cmdq, params: GspSequencerParams<'a>) -> Result {
             dev: params.dev,
         };
 
-        dev_dbg!(sequencer.dev, "Running CPU Sequencer commands");
+        dev_dbg!(sequencer.dev, "Running CPU Sequencer commands\n");
 
         for cmd_result in sequencer.iter() {
             match cmd_result {
diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs
index 7c26e4a2d61c..e4eae9385f47 100644
--- a/drivers/gpu/nova-core/vbios.rs
+++ b/drivers/gpu/nova-core/vbios.rs
@@ -790,7 +790,7 @@ fn falcon_data_ptr(&self) -> Result<u32> {
         // read the 4 bytes at the offset specified in the token
         let offset = usize::from(token.data_offset);
         let bytes: [u8; 4] = self.base.data[offset..offset + 4].try_into().map_err(|_| {
-            dev_err!(self.base.dev, "Failed to convert data slice to array");
+            dev_err!(self.base.dev, "Failed to convert data slice to array\n");
             EINVAL
         })?;
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1
  2026-01-07  1:24 [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 Timur Tabi
  2026-01-07  1:24 ` [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings Timur Tabi
@ 2026-01-07  1:56 ` John Hubbard
  2026-01-07  2:04   ` Timur Tabi
  2026-01-07  3:55 ` Joel Fernandes
  2 siblings, 1 reply; 14+ messages in thread
From: John Hubbard @ 2026-01-07  1:56 UTC (permalink / raw)
  To: Timur Tabi, Danilo Krummrich, Alexandre Courbot, Joel Fernandes,
	nouveau, rust-for-linux

On 1/6/26 5:24 PM, Timur Tabi wrote:
> The NV_PFALCON_FALCON_DMATRFBASE/1 register pair supports DMA address
> up to 49 bits only, but the write to DMATRFBASE1 could exceed that.
> To mitigate, check first that the DMA address will fit.
> 
> Fixes: 69f5cd67ce41 ("gpu: nova-core: add falcon register definitions and base code")
> Signed-off-by: Timur Tabi <ttabi@nvidia.com>
> ---
>  drivers/gpu/nova-core/falcon.rs | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs
> index 82c661aef594..fe5abf64dd2b 100644
> --- a/drivers/gpu/nova-core/falcon.rs
> +++ b/drivers/gpu/nova-core/falcon.rs
> @@ -493,7 +493,11 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
>              Some(_) => (),
>          };
>  
> -        // Set up the base source DMA address.
> +        // Set up the base source DMA address.  DMATRFBASE only supports a 49-bit address.

Your commit log said it accurately, so I think we should use similar wording
here. So maybe:

   // Set up the base source DMA address.  The DMATRFBASE/1 register pair
   // only supports a 49-bit address.

However, one could argue that only the DMATRFBASE base matters
when considering overflow. But even so, it's slightly confusing
at first glance, to refer to a 32-bit register as only supporting
49-bit addresses. Of course yes, they can look at the register
which is shifted up, but still.

Either way is fine, I'm just fussing over nearly nothing here,
so:

Reviewed-by: John Hubbard <jhubbard@nvidia.com>


thanks,
-- 
John Hubbard

> +        if dma_start > kernel::dma::DmaMask::new::<49>().value() {
> +            dev_err!(self.dev, "DMA address {:#x} exceeds 49 bits\n", dma_start);
> +            return Err(ERANGE);
> +        }
>  
>          regs::NV_PFALCON_FALCON_DMATRFBASE::default()
>              // CAST: `as u32` is used on purpose since we do want to strip the upper bits, which
> 
> base-commit: 4348796233e736147e2e79c58784d0a9fb48867d



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1
  2026-01-07  1:56 ` [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 John Hubbard
@ 2026-01-07  2:04   ` Timur Tabi
  0 siblings, 0 replies; 14+ messages in thread
From: Timur Tabi @ 2026-01-07  2:04 UTC (permalink / raw)
  To: nouveau@lists.freedesktop.org, Alexandre Courbot, dakr@kernel.org,
	Joel Fernandes, John Hubbard, rust-for-linux@vger.kernel.org

On Tue, 2026-01-06 at 17:56 -0800, John Hubbard wrote:
> Your commit log said it accurately, so I think we should use similar wording
> here. So maybe:
> 
>    // Set up the base source DMA address.  The DMATRFBASE/1 register pair
>    // only supports a 49-bit address.

Yes, this is better.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  1:24 ` [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings Timur Tabi
@ 2026-01-07  2:10   ` John Hubbard
  2026-01-07  2:21     ` Timur Tabi
  2026-01-07  9:54     ` Miguel Ojeda
  0 siblings, 2 replies; 14+ messages in thread
From: John Hubbard @ 2026-01-07  2:10 UTC (permalink / raw)
  To: Timur Tabi, Danilo Krummrich, Alexandre Courbot, Joel Fernandes,
	nouveau, rust-for-linux, Miguel Ojeda, Alice Ryhl, Gary Guo

On 1/6/26 5:24 PM, Timur Tabi wrote:
> Although the dev_xx!() macro calls do not technically require terminating
> newlines for the format strings, they should be added any way to maintain
> consistency, both within Rust code and with the C versions.

I'd *tentatively* prefer to *omit* the \n's, because they are 
stripped out (and then re-added) as part of the printing
call stack, and so it seems nice to have less dead code on
the screen.

On the other hand, the output always gets a newline, so seeing
it on screen is actually informative in a way.

And yes consistency is important. But which way to head
toward? I checked the Rust for Linux code in drm-rust-next,
and we have:

Codebase                      WITH \n    WITHOUT \n    % with \n
----------------------------------------------------------------
samples/rust (dev_*!)              30            10          75%
samples/rust (pr_*!)               20             7          74%
nova-core (dev_*!) [after patch]   39            32          55%
nova-core (dev_*!) [before patch]  32            39          45%
nova (dev_*!)                       0             0           --
tyr (dev_*!)                        3             5          38%
pwm (dev_*!)                        3             6          33%
binder (pr_*!)                     17            62          22%

So there is not yet a clear convention visible in the code.

Miguel, Alice, Gary et al, is there actually a preference already?


thanks,
-- 
John Hubbard


> 
> Signed-off-by: Timur Tabi <ttabi@nvidia.com>
> ---
>  drivers/gpu/nova-core/falcon.rs           | 6 +++---
>  drivers/gpu/nova-core/falcon/hal/ga102.rs | 4 ++--
>  drivers/gpu/nova-core/gpu.rs              | 2 +-
>  drivers/gpu/nova-core/gsp/sequencer.rs    | 6 +++---
>  drivers/gpu/nova-core/vbios.rs            | 2 +-
>  5 files changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs
> index fe5abf64dd2b..c1cb31c856b5 100644
> --- a/drivers/gpu/nova-core/falcon.rs
> +++ b/drivers/gpu/nova-core/falcon.rs
> @@ -466,7 +466,7 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
>          if dma_start % DmaAddress::from(DMA_LEN) > 0 {
>              dev_err!(
>                  self.dev,
> -                "DMA transfer start addresses must be a multiple of {}",
> +                "DMA transfer start addresses must be a multiple of {}\n",
>                  DMA_LEN
>              );
>              return Err(EINVAL);
> @@ -483,11 +483,11 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
>              .and_then(|size| size.checked_add(load_offsets.src_start))
>          {
>              None => {
> -                dev_err!(self.dev, "DMA transfer length overflow");
> +                dev_err!(self.dev, "DMA transfer length overflow\n");
>                  return Err(EOVERFLOW);
>              }
>              Some(upper_bound) if usize::from_safe_cast(upper_bound) > fw.size() => {
> -                dev_err!(self.dev, "DMA transfer goes beyond range of DMA object");
> +                dev_err!(self.dev, "DMA transfer goes beyond range of DMA object\n");
>                  return Err(EINVAL);
>              }
>              Some(_) => (),
> diff --git a/drivers/gpu/nova-core/falcon/hal/ga102.rs b/drivers/gpu/nova-core/falcon/hal/ga102.rs
> index 69a7a95cac16..0bdfe45a2d03 100644
> --- a/drivers/gpu/nova-core/falcon/hal/ga102.rs
> +++ b/drivers/gpu/nova-core/falcon/hal/ga102.rs
> @@ -52,7 +52,7 @@ fn signature_reg_fuse_version_ga102(
>      let ucode_idx = match usize::from(ucode_id) {
>          ucode_id @ 1..=regs::NV_FUSE_OPT_FPF_SIZE => ucode_id - 1,
>          _ => {
> -            dev_err!(dev, "invalid ucode id {:#x}", ucode_id);
> +            dev_err!(dev, "invalid ucode id {:#x}\n", ucode_id);
>              return Err(EINVAL);
>          }
>      };
> @@ -66,7 +66,7 @@ fn signature_reg_fuse_version_ga102(
>      } else if engine_id_mask & 0x0400 != 0 {
>          regs::NV_FUSE_OPT_FPF_GSP_UCODE1_VERSION::read(bar, ucode_idx).data()
>      } else {
> -        dev_err!(dev, "unexpected engine_id_mask {:#x}", engine_id_mask);
> +        dev_err!(dev, "unexpected engine_id_mask {:#x}\n", engine_id_mask);
>          return Err(EINVAL);
>      };
>  
> diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
> index 50d76092fbdd..9b042ef1a308 100644
> --- a/drivers/gpu/nova-core/gpu.rs
> +++ b/drivers/gpu/nova-core/gpu.rs
> @@ -268,7 +268,7 @@ pub(crate) fn new<'a>(
>              // We must wait for GFW_BOOT completion before doing any significant setup on the GPU.
>              _: {
>                  gfw::wait_gfw_boot_completion(bar)
> -                    .inspect_err(|_| dev_err!(pdev.as_ref(), "GFW boot did not complete"))?;
> +                    .inspect_err(|_| dev_err!(pdev.as_ref(), "GFW boot did not complete\n"))?;
>              },
>  
>              sysmem_flush: SysmemFlush::register(pdev.as_ref(), bar, spec.chipset)?,
> diff --git a/drivers/gpu/nova-core/gsp/sequencer.rs b/drivers/gpu/nova-core/gsp/sequencer.rs
> index d78a30fbb70f..d965ffe9ba89 100644
> --- a/drivers/gpu/nova-core/gsp/sequencer.rs
> +++ b/drivers/gpu/nova-core/gsp/sequencer.rs
> @@ -121,7 +121,7 @@ pub(crate) fn new(data: &[u8], dev: &device::Device) -> Result<(Self, usize)> {
>          };
>  
>          if data.len() < size {
> -            dev_err!(dev, "Data is not enough for command");
> +            dev_err!(dev, "Data is not enough for command\n");
>              return Err(EINVAL);
>          }
>  
> @@ -320,7 +320,7 @@ fn next(&mut self) -> Option<Self::Item> {
>  
>          cmd_result.map_or_else(
>              |_err| {
> -                dev_err!(self.dev, "Error parsing command at offset {}", offset);
> +                dev_err!(self.dev, "Error parsing command at offset {}\n", offset);
>                  None
>              },
>              |(cmd, size)| {
> @@ -382,7 +382,7 @@ pub(crate) fn run(cmdq: &mut Cmdq, params: GspSequencerParams<'a>) -> Result {
>              dev: params.dev,
>          };
>  
> -        dev_dbg!(sequencer.dev, "Running CPU Sequencer commands");
> +        dev_dbg!(sequencer.dev, "Running CPU Sequencer commands\n");
>  
>          for cmd_result in sequencer.iter() {
>              match cmd_result {
> diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs
> index 7c26e4a2d61c..e4eae9385f47 100644
> --- a/drivers/gpu/nova-core/vbios.rs
> +++ b/drivers/gpu/nova-core/vbios.rs
> @@ -790,7 +790,7 @@ fn falcon_data_ptr(&self) -> Result<u32> {
>          // read the 4 bytes at the offset specified in the token
>          let offset = usize::from(token.data_offset);
>          let bytes: [u8; 4] = self.base.data[offset..offset + 4].try_into().map_err(|_| {
> -            dev_err!(self.base.dev, "Failed to convert data slice to array");
> +            dev_err!(self.base.dev, "Failed to convert data slice to array\n");
>              EINVAL
>          })?;
>  



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  2:10   ` John Hubbard
@ 2026-01-07  2:21     ` Timur Tabi
  2026-01-07  2:39       ` John Hubbard
  2026-01-07  9:54     ` Miguel Ojeda
  1 sibling, 1 reply; 14+ messages in thread
From: Timur Tabi @ 2026-01-07  2:21 UTC (permalink / raw)
  To: John Hubbard, gary@garyguo.net, rust-for-linux@vger.kernel.org,
	nouveau@lists.freedesktop.org, Joel Fernandes, dakr@kernel.org,
	aliceryhl@google.com, Alexandre Courbot, ojeda@kernel.org

On Tue, 2026-01-06 at 18:10 -0800, John Hubbard wrote:
> nova-core (dev_*!) [after patch]   39            32          55%
> nova-core (dev_*!) [before patch]  32            39          45%

This can't be right, because I checked thoroughly to make sure that my patch fixed ALL dev_xx
format strings.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  2:21     ` Timur Tabi
@ 2026-01-07  2:39       ` John Hubbard
  2026-01-07 10:22         ` Miguel Ojeda
  0 siblings, 1 reply; 14+ messages in thread
From: John Hubbard @ 2026-01-07  2:39 UTC (permalink / raw)
  To: Timur Tabi, gary@garyguo.net, rust-for-linux@vger.kernel.org,
	nouveau@lists.freedesktop.org, Joel Fernandes, dakr@kernel.org,
	aliceryhl@google.com, Alexandre Courbot, ojeda@kernel.org

On 1/6/26 6:21 PM, Timur Tabi wrote:
> On Tue, 2026-01-06 at 18:10 -0800, John Hubbard wrote:
>> nova-core (dev_*!) [after patch]   39            32          55%
>> nova-core (dev_*!) [before patch]  32            39          45%
> 
> This can't be right, because I checked thoroughly to make sure that my patch fixed ALL dev_xx
> format strings.

Did you? haha :)

drivers/gpu/nova-core/fb.rs:81-85

                dev_warn!(
                    &self.device,
                    "failed to unregister sysmem flush page: {:?}",
                    e
                )

drivers/gpu/nova-core/gsp/boot.rs:83-87

            dev_err!(
                dev,
                "FWSEC-FRTS returned with error code {:#x}",
                frts_status
            );

drivers/gpu/nova-core/gsp/cmdq.rs:616-620

            dev_err!(
                self.dev,
                "GSP RPC: receive: Call {} - bad checksum",
                header.sequence()
            );

drivers/gpu/nova-core/gsp/sequencer.rs:391-395

                    dev_err!(
                        sequencer.dev,
                        "Error running command at index {}",
                        sequencer.seq_info.cmd_index
                    );

drivers/gpu/nova-core/gsp/sequencer.rs:401-404

        dev_dbg!(
            sequencer.dev,
            "CPU Sequencer commands completed successfully"
        );

However, you *are* correct about the "this can't be right". I had a bug
in my search script. Updated numbers do actually lean much more
toward using the \n on screen:

Codebase                      WITH \n    WITHOUT \n    % with \n
----------------------------------------------------------------
samples/rust (dev_*!)              39             1          98%
samples/rust (pr_*!)               29             6          83%
nova-core (dev_*!)                 68             5          93%
nova (dev_*!)                       0             0           --
tyr (dev_*!)                        4             3          57%
pwm (dev_*!)                        7             2          78%
binder (pr_*!)                     22            57          28%



thanks,
-- 
John Hubbard


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1
  2026-01-07  1:24 [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 Timur Tabi
  2026-01-07  1:24 ` [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings Timur Tabi
  2026-01-07  1:56 ` [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 John Hubbard
@ 2026-01-07  3:55 ` Joel Fernandes
  2 siblings, 0 replies; 14+ messages in thread
From: Joel Fernandes @ 2026-01-07  3:55 UTC (permalink / raw)
  To: Timur Tabi
  Cc: Danilo Krummrich, Alexandre Courbot, John Hubbard,
	nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org



> On Jan 6, 2026, at 8:24 PM, Timur Tabi <ttabi@nvidia.com> wrote:
> 
> The NV_PFALCON_FALCON_DMATRFBASE/1 register pair supports DMA address
> up to 49 bits only, but the write to DMATRFBASE1 could exceed that.
> To mitigate, check first that the DMA address will fit.
> 
> Fixes: 69f5cd67ce41 ("gpu: nova-core: add falcon register definitions and base code")
> Signed-off-by: Timur Tabi <ttabi@nvidia.com>

Reviewed-by: Joel Fernandes <joelagnelf@nvidia.com>

Thanks.



> ---
> drivers/gpu/nova-core/falcon.rs | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs
> index 82c661aef594..fe5abf64dd2b 100644
> --- a/drivers/gpu/nova-core/falcon.rs
> +++ b/drivers/gpu/nova-core/falcon.rs
> @@ -493,7 +493,11 @@ fn dma_wr<F: FalconFirmware<Target = E>>(
>             Some(_) => (),
>         };
> 
> -        // Set up the base source DMA address.
> +        // Set up the base source DMA address.  DMATRFBASE only supports a 49-bit address.
> +        if dma_start > kernel::dma::DmaMask::new::<49>().value() {
> +            dev_err!(self.dev, "DMA address {:#x} exceeds 49 bits\n", dma_start);
> +            return Err(ERANGE);
> +        }
> 
>         regs::NV_PFALCON_FALCON_DMATRFBASE::default()
>             // CAST: `as u32` is used on purpose since we do want to strip the upper bits, which
> 
> base-commit: 4348796233e736147e2e79c58784d0a9fb48867d
> --
> 2.52.0
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  2:10   ` John Hubbard
  2026-01-07  2:21     ` Timur Tabi
@ 2026-01-07  9:54     ` Miguel Ojeda
  2026-01-08 12:55       ` Gary Guo
  1 sibling, 1 reply; 14+ messages in thread
From: Miguel Ojeda @ 2026-01-07  9:54 UTC (permalink / raw)
  To: John Hubbard
  Cc: Timur Tabi, Danilo Krummrich, Alexandre Courbot, Joel Fernandes,
	nouveau, rust-for-linux, Miguel Ojeda, Alice Ryhl, Gary Guo

On Wed, Jan 7, 2026 at 3:10 AM John Hubbard <jhubbard@nvidia.com> wrote:
>
> So there is not yet a clear convention visible in the code.
>
> Miguel, Alice, Gary et al, is there actually a preference already?

They are supposed to have the `\n`.

For a bit of context: when we discussed the printing a long time ago,
I originally had:

    info!("foo");

instead of:

    pr_info!("foo\n");

i.e. both the prefix and the newline were assumed, but we were asked
to keep it close to the C side, which is fair.

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  2:39       ` John Hubbard
@ 2026-01-07 10:22         ` Miguel Ojeda
  0 siblings, 0 replies; 14+ messages in thread
From: Miguel Ojeda @ 2026-01-07 10:22 UTC (permalink / raw)
  To: John Hubbard
  Cc: Timur Tabi, gary@garyguo.net, rust-for-linux@vger.kernel.org,
	nouveau@lists.freedesktop.org, Joel Fernandes, dakr@kernel.org,
	aliceryhl@google.com, Alexandre Courbot, ojeda@kernel.org

On Wed, Jan 7, 2026 at 3:39 AM John Hubbard <jhubbard@nvidia.com> wrote:
>
> samples/rust (pr_*!)               29             6          83%

2 of these 6 are expected, 4 aren't (`cont` level follows).

I have had a good first issue for these:

    https://github.com/Rust-for-Linux/linux/issues/1139

I just added a few more pointers to see if it helps people
contributing, and also a link to your table since it is a recent
search.

I also linked our other issue about having a `checkpatch` warning for
this, since most (but not all) should be finished in `\n`:

    https://github.com/Rust-for-Linux/linux/issues/1140

and the patch that would be nice to review/test/revive to see if we
can manage to land it:

    https://lore.kernel.org/rust-for-linux/20250207-checkpatch-newline2-v4-1-26d8e80d0059@invicto.ai/

(Or we do something like our past ksquirrel bot which is probably just
easier, to be honest)

Cheers,
Miguel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-07  9:54     ` Miguel Ojeda
@ 2026-01-08 12:55       ` Gary Guo
  2026-01-08 13:36         ` Danilo Krummrich
  0 siblings, 1 reply; 14+ messages in thread
From: Gary Guo @ 2026-01-08 12:55 UTC (permalink / raw)
  To: Miguel Ojeda
  Cc: John Hubbard, Timur Tabi, Danilo Krummrich, Alexandre Courbot,
	Joel Fernandes, nouveau, rust-for-linux, Miguel Ojeda, Alice Ryhl

On Wed, 7 Jan 2026 10:54:42 +0100
Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> wrote:

> On Wed, Jan 7, 2026 at 3:10 AM John Hubbard <jhubbard@nvidia.com> wrote:
> >
> > So there is not yet a clear convention visible in the code.
> >
> > Miguel, Alice, Gary et al, is there actually a preference already?  
> 
> They are supposed to have the `\n`.
> 
> For a bit of context: when we discussed the printing a long time ago,
> I originally had:
> 
>     info!("foo");
> 
> instead of:
> 
>     pr_info!("foo\n");
> 
> i.e. both the prefix and the newline were assumed, but we were asked
> to keep it close to the C side, which is fair.

In very early days (before RfL is upstreamed), I had a prototype print
macro that is designed like this:

	info!("foo"); // pr_info("foo\n");
	info!(target: dev, "foo"); // dev_info(dev, "foo\n");
	info!(target: dev, once, "foo"); // dev_info_once(dev, "foo\n");
	info!(target: dev, ratelimited, "foo"); // dev_info_ratelimited(dev, "foo\n");

There's a trait that is implemented for anything that can be used as a
printing target.

I still think this is superior than just having our macro mimicking the C
side (and as a result, having a lot of macros rather than just one for
each level).

I think with Rust printing machinary, `pr_cont` is rarely useful, instead
of calling `pr_info` followed by multiple `pr_cont`, you can just have a
custom `Display` implementation and print it in one go. This is also free
from racing against another print and have your lines broken into two
parts.

I would be much in favour of vouching deleteing `pr_cont` entirely from
Rust codebase and always have newlines automatically added.

Best,
Gary







^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-08 12:55       ` Gary Guo
@ 2026-01-08 13:36         ` Danilo Krummrich
  2026-01-08 13:42           ` Alice Ryhl
  2026-01-08 14:13           ` Gary Guo
  0 siblings, 2 replies; 14+ messages in thread
From: Danilo Krummrich @ 2026-01-08 13:36 UTC (permalink / raw)
  To: Gary Guo
  Cc: Miguel Ojeda, John Hubbard, Timur Tabi, Alexandre Courbot,
	Joel Fernandes, nouveau, rust-for-linux, Miguel Ojeda, Alice Ryhl,
	Greg Kroah-Hartman, Rafael J. Wysocki

(Cc: Greg, Rafael)

On Thu Jan 8, 2026 at 1:55 PM CET, Gary Guo wrote:
> In very early days (before RfL is upstreamed), I had a prototype print
> macro that is designed like this:
>
> 	info!("foo"); // pr_info("foo\n");
> 	info!(target: dev, "foo"); // dev_info(dev, "foo\n");
> 	info!(target: dev, once, "foo"); // dev_info_once(dev, "foo\n");
> 	info!(target: dev, ratelimited, "foo"); // dev_info_ratelimited(dev, "foo\n");
>
> There's a trait that is implemented for anything that can be used as a
> printing target.
>
> I still think this is superior than just having our macro mimicking the C
> side (and as a result, having a lot of macros rather than just one for
> each level).

Why do you think this syntax is superior?

One disadvantage for maintainers and reviewers would be that it is less
convinient to grep for pr_*() vs dev_*(), which is something that people
regularly get wrong. I.e. it regularly happens that people use pr_*() where they
actually print in the context of a specific device.

> I think with Rust printing machinary, `pr_cont` is rarely useful, instead
> of calling `pr_info` followed by multiple `pr_cont`, you can just have a
> custom `Display` implementation and print it in one go. This is also free
> from racing against another print and have your lines broken into two
> parts.

This I fully agree with.

> I would be much in favour of vouching deleteing `pr_cont` entirely from
> Rust codebase and always have newlines automatically added.

I don't think it is a good idea to always add newlines. It might be fine if you
only do C code or only do Rust code, but if you are switching back and forth, it
is a horrible inconsistency for muscle memory.

I'm pretty sure that this would turn into a generator for trivial fixup patches
either removing or adding the trailing '\n'. :)

- Danilo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-08 13:36         ` Danilo Krummrich
@ 2026-01-08 13:42           ` Alice Ryhl
  2026-01-08 14:13           ` Gary Guo
  1 sibling, 0 replies; 14+ messages in thread
From: Alice Ryhl @ 2026-01-08 13:42 UTC (permalink / raw)
  To: Danilo Krummrich
  Cc: Gary Guo, Miguel Ojeda, John Hubbard, Timur Tabi,
	Alexandre Courbot, Joel Fernandes, nouveau, rust-for-linux,
	Miguel Ojeda, Greg Kroah-Hartman, Rafael J. Wysocki

On Thu, Jan 8, 2026 at 2:36 PM Danilo Krummrich <dakr@kernel.org> wrote:
>
> (Cc: Greg, Rafael)
>
> On Thu Jan 8, 2026 at 1:55 PM CET, Gary Guo wrote:
> > In very early days (before RfL is upstreamed), I had a prototype print
> > macro that is designed like this:
> >
> >       info!("foo"); // pr_info("foo\n");
> >       info!(target: dev, "foo"); // dev_info(dev, "foo\n");
> >       info!(target: dev, once, "foo"); // dev_info_once(dev, "foo\n");
> >       info!(target: dev, ratelimited, "foo"); // dev_info_ratelimited(dev, "foo\n");
> >
> > There's a trait that is implemented for anything that can be used as a
> > printing target.
> >
> > I still think this is superior than just having our macro mimicking the C
> > side (and as a result, having a lot of macros rather than just one for
> > each level).
>
> Why do you think this syntax is superior?
>
> One disadvantage for maintainers and reviewers would be that it is less
> convinient to grep for pr_*() vs dev_*(), which is something that people
> regularly get wrong. I.e. it regularly happens that people use pr_*() where they
> actually print in the context of a specific device.
>
> > I think with Rust printing machinary, `pr_cont` is rarely useful, instead
> > of calling `pr_info` followed by multiple `pr_cont`, you can just have a
> > custom `Display` implementation and print it in one go. This is also free
> > from racing against another print and have your lines broken into two
> > parts.
>
> This I fully agree with.
>
> > I would be much in favour of vouching deleteing `pr_cont` entirely from
> > Rust codebase and always have newlines automatically added.
>
> I don't think it is a good idea to always add newlines. It might be fine if you
> only do C code or only do Rust code, but if you are switching back and forth, it
> is a horrible inconsistency for muscle memory.
>
> I'm pretty sure that this would turn into a generator for trivial fixup patches
> either removing or adding the trailing '\n'. :)

What about triggering a build failure if you forget the newline?

For cases where the \n is intentionally omitted for use with pr_cont!,
we can add separate syntax for making this explicit:

pr_info!("hello! thi", cont);
pr_cont!("s tring is split\n");

This way, you can't forget the newline, but you can still omit it if
you really want to use pr_cont.

Alice

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings
  2026-01-08 13:36         ` Danilo Krummrich
  2026-01-08 13:42           ` Alice Ryhl
@ 2026-01-08 14:13           ` Gary Guo
  1 sibling, 0 replies; 14+ messages in thread
From: Gary Guo @ 2026-01-08 14:13 UTC (permalink / raw)
  To: Danilo Krummrich
  Cc: Miguel Ojeda, John Hubbard, Timur Tabi, Alexandre Courbot,
	Joel Fernandes, nouveau, rust-for-linux, Miguel Ojeda, Alice Ryhl,
	Greg Kroah-Hartman, Rafael J. Wysocki

On Thu, 08 Jan 2026 14:36:21 +0100
"Danilo Krummrich" <dakr@kernel.org> wrote:

> (Cc: Greg, Rafael)
> 
> On Thu Jan 8, 2026 at 1:55 PM CET, Gary Guo wrote:
> > In very early days (before RfL is upstreamed), I had a prototype print
> > macro that is designed like this:
> >
> > 	info!("foo"); // pr_info("foo\n");
> > 	info!(target: dev, "foo"); // dev_info(dev, "foo\n");
> > 	info!(target: dev, once, "foo"); // dev_info_once(dev, "foo\n");
> > 	info!(target: dev, ratelimited, "foo"); // dev_info_ratelimited(dev, "foo\n");
> >
> > There's a trait that is implemented for anything that can be used as a
> > printing target.
> >
> > I still think this is superior than just having our macro mimicking the C
> > side (and as a result, having a lot of macros rather than just one for
> > each level).  
> 
> Why do you think this syntax is superior?
> 
> One disadvantage for maintainers and reviewers would be that it is less
> convinient to grep for pr_*() vs dev_*(), which is something that people
> regularly get wrong. I.e. it regularly happens that people use pr_*() where they
> actually print in the context of a specific device.
> 

One solution is perhaps to always ask people to specify a device so they
won't mix things up?

If they want to print without device then they can refer to `()` or
perhaps another marker type `info!(NoDevice, "...")`.

> > I think with Rust printing machinary, `pr_cont` is rarely useful, instead
> > of calling `pr_info` followed by multiple `pr_cont`, you can just have a
> > custom `Display` implementation and print it in one go. This is also free
> > from racing against another print and have your lines broken into two
> > parts.  
> 
> This I fully agree with.
> 
> > I would be much in favour of vouching deleteing `pr_cont` entirely from
> > Rust codebase and always have newlines automatically added.  
> 
> I don't think it is a good idea to always add newlines. It might be fine if you
> only do C code or only do Rust code, but if you are switching back and forth, it
> is a horrible inconsistency for muscle memory.
> 
> I'm pretty sure that this would turn into a generator for trivial fixup patches
> either removing or adding the trailing '\n'. :)

Well, we've seen that people will forget either way. :)

More seriously, printk actually strips out your newline. The new line at
the end of print gets turned into a flag on whether that log record is
continuable.

If we say "pr_cont" is not used in Rust, then it does not make sense to
leave any log entries continuable -- I would imagine in the future we
might even want to bypass all va-args machinary and just push the record
to the printk ringbuffer. Adding a newline just to have it stripped
doesn't sound ideal.

Best,
Gary


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2026-01-08 14:13 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-07  1:24 [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 Timur Tabi
2026-01-07  1:24 ` [PATCH 2/2] gpu: nova-core: add missing newlines to several print strings Timur Tabi
2026-01-07  2:10   ` John Hubbard
2026-01-07  2:21     ` Timur Tabi
2026-01-07  2:39       ` John Hubbard
2026-01-07 10:22         ` Miguel Ojeda
2026-01-07  9:54     ` Miguel Ojeda
2026-01-08 12:55       ` Gary Guo
2026-01-08 13:36         ` Danilo Krummrich
2026-01-08 13:42           ` Alice Ryhl
2026-01-08 14:13           ` Gary Guo
2026-01-07  1:56 ` [PATCH 1/2] gpu: nova-core: check for overflow to DMATRFBASE1 John Hubbard
2026-01-07  2:04   ` Timur Tabi
2026-01-07  3:55 ` Joel Fernandes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox