From: "Eliot Courtney" <ecourtney@nvidia.com>
To: "Alexandre Courbot" <acourbot@nvidia.com>,
"Danilo Krummrich" <dakr@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>
Cc: "John Hubbard" <jhubbard@nvidia.com>,
"Alistair Popple" <apopple@nvidia.com>,
"Joel Fernandes" <joelagnelf@nvidia.com>,
"Timur Tabi" <ttabi@nvidia.com>, "Zhi Wang" <zhiw@nvidia.com>,
"Eliot Courtney" <ecourtney@nvidia.com>,
<dri-devel@lists.freedesktop.org>, <linux-kernel@vger.kernel.org>,
<linux-riscv@lists.infradead.org>, <linux-doc@vger.kernel.org>,
<rust-for-linux@vger.kernel.org>
Subject: Re: [PATCH 7/8] gpu: nova-core: convert falcon registers to kernel register macro
Date: Thu, 19 Mar 2026 14:35:17 +0900 [thread overview]
Message-ID: <DH6IJKX25H7H.28NWD4KJSXX73@nvidia.com> (raw)
In-Reply-To: <20260318-b4-nova-register-v1-7-22a358aa4c63@nvidia.com>
On Wed Mar 18, 2026 at 5:06 PM JST, Alexandre Courbot wrote:
> Convert all PFALCON, PFALCON2 and PRISCV registers to use the kernel's
> register macro and update the code accordingly.
>
> Because they rely on the same types to implement relative registers,
> they need to be updated in lockstep.
>
> nova-core's local register macro is now unused, so remove it.
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
> drivers/gpu/nova-core/falcon.rs | 333 +++++-----
> drivers/gpu/nova-core/falcon/gsp.rs | 22 +-
> drivers/gpu/nova-core/falcon/hal/ga102.rs | 55 +-
> drivers/gpu/nova-core/falcon/hal/tu102.rs | 12 +-
> drivers/gpu/nova-core/falcon/sec2.rs | 17 +-
> drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 19 +-
> drivers/gpu/nova-core/regs.rs | 350 +++++-----
> drivers/gpu/nova-core/regs/macros.rs | 739 ---------------------
> 8 files changed, 421 insertions(+), 1126 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs
> index 4721865f59d9..90afef40acd0 100644
> --- a/drivers/gpu/nova-core/falcon.rs
> +++ b/drivers/gpu/nova-core/falcon.rs
> @@ -14,9 +14,14 @@
> DmaMask, //
> },
> io::{
> - poll::read_poll_timeout, //
> + poll::read_poll_timeout,
> + register::{
> + RegisterBase,
> + WithBase, //
> + },
> Io,
> },
> + num::Bounded,
> prelude::*,
> sync::aref::ARef,
> time::Delta,
> @@ -33,7 +38,6 @@
> IntoSafeCast, //
> },
> regs,
> - regs::macros::RegisterBase, //
> };
>
> pub(crate) mod gsp;
> @@ -44,11 +48,14 @@
> pub(crate) const MEM_BLOCK_ALIGNMENT: usize = 256;
>
> // TODO[FPRI]: Replace with `ToPrimitive`.
> -macro_rules! impl_from_enum_to_u8 {
> - ($enum_type:ty) => {
> - impl From<$enum_type> for u8 {
> +macro_rules! impl_from_enum_to_bounded {
> + ($enum_type:ty, $length:literal) => {
> + impl From<$enum_type> for Bounded<u32, $length> {
> fn from(value: $enum_type) -> Self {
> - value as u8
> + // Shift the value left by the number of unused bits.
> + let b = Bounded::<u32, 32>::from((value as u32) << (32 - $length));
> + // Shift back right to create a `Bounded` of the expected width.
> + b.shr::<{ 32 - $length }, $length>()
> }
> }
> };
This can silently truncate stuff if we typo the wrong bounded size.
Any reason not to use `Bounded::from_expr(value as u32)` for this?
> diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs
> index 4ac4e9126db8..08d9a9697adc 100644
> --- a/drivers/gpu/nova-core/regs.rs
> +++ b/drivers/gpu/nova-core/regs.rs
> @@ -1,13 +1,10 @@
> // SPDX-License-Identifier: GPL-2.0
>
> -// Required to retain the original register names used by OpenRM, which are all capital snake case
> -// but are mapped to types.
> -#![allow(non_camel_case_types)]
> -
> -#[macro_use]
> -pub(crate) mod macros;
> -
> use kernel::{
> + io::{
> + register::WithBase,
> + Io, //
> + },
> prelude::*,
> time, //
> };
> @@ -314,60 +311,147 @@ pub(crate) fn vga_workspace_addr(self) -> Option<u64> {
>
> // PFALCON
>
> -register!(NV_PFALCON_FALCON_IRQSCLR @ PFalconBase[0x00000004] {
> - 4:4 halt as bool;
> - 6:6 swgen0 as bool;
> -});
> +nv_reg! {
> + NV_PFALCON_FALCON_IRQSCLR @ PFalconBase + 0x00000004 {
> + 4:4 halt => bool;
> + 6:6 swgen0 => bool;
> + }
>
> -register!(NV_PFALCON_FALCON_MAILBOX0 @ PFalconBase[0x00000040] {
> - 31:0 value as u32;
> -});
> + NV_PFALCON_FALCON_MAILBOX0 @ PFalconBase + 0x00000040 {
> + 31:0 value => u32;
> + }
>
> -register!(NV_PFALCON_FALCON_MAILBOX1 @ PFalconBase[0x00000044] {
> - 31:0 value as u32;
> -});
> + NV_PFALCON_FALCON_MAILBOX1 @ PFalconBase + 0x00000044 {
> + 31:0 value => u32;
> + }
>
> -// Used to store version information about the firmware running
> -// on the Falcon processor.
> -register!(NV_PFALCON_FALCON_OS @ PFalconBase[0x00000080] {
> - 31:0 value as u32;
> -});
> + /// Used to store version information about the firmware running
> + /// on the Falcon processor.
> + NV_PFALCON_FALCON_OS @ PFalconBase + 0x00000080 {
> + 31:0 value => u32;
> + }
>
> -register!(NV_PFALCON_FALCON_RM @ PFalconBase[0x00000084] {
> - 31:0 value as u32;
> -});
> + NV_PFALCON_FALCON_RM @ PFalconBase + 0x00000084 {
> + 31:0 value => u32;
> + }
>
> -register!(NV_PFALCON_FALCON_HWCFG2 @ PFalconBase[0x000000f4] {
> - 10:10 riscv as bool;
> - 12:12 mem_scrubbing as bool, "Set to 0 after memory scrubbing is completed";
> - 31:31 reset_ready as bool, "Signal indicating that reset is completed (GA102+)";
> -});
> + NV_PFALCON_FALCON_HWCFG2 @ PFalconBase + 0x000000f4 {
> + 10:10 riscv => bool;
> + /// Set to 0 after memory scrubbing is completed.
> + 12:12 mem_scrubbing => bool;
> + /// Signal indicating that reset is completed (GA102+).
> + 31:31 reset_ready => bool;
> + }
>
> -impl NV_PFALCON_FALCON_HWCFG2 {
> - /// Returns `true` if memory scrubbing is completed.
> - pub(crate) fn mem_scrubbing_done(self) -> bool {
> - !self.mem_scrubbing()
> + NV_PFALCON_FALCON_CPUCTL @ PFalconBase + 0x00000100 {
> + 1:1 startcpu => bool;
> + 4:4 halted => bool;
> + 6:6 alias_en => bool;
> + }
> +
> + NV_PFALCON_FALCON_BOOTVEC @ PFalconBase + 0x00000104 {
> + 31:0 value => u32;
> + }
> +
> + NV_PFALCON_FALCON_DMACTL @ PFalconBase + 0x0000010c {
> + 0:0 require_ctx => bool;
> + 1:1 dmem_scrubbing => bool;
> + 2:2 imem_scrubbing => bool;
> + 6:3 dmaq_num;
> + 7:7 secure_stat => bool;
> + }
> +
> + NV_PFALCON_FALCON_DMATRFBASE @ PFalconBase + 0x00000110 {
> + 31:0 base => u32;
> + }
> +
> + NV_PFALCON_FALCON_DMATRFMOFFS @ PFalconBase + 0x00000114 {
> + 23:0 offs;
> + }
> +
> + NV_PFALCON_FALCON_DMATRFCMD @ PFalconBase + 0x00000118 {
> + 0:0 full => bool;
> + 1:1 idle => bool;
> + 3:2 sec;
> + 4:4 imem => bool;
> + 5:5 is_write => bool;
> + 10:8 size ?=> DmaTrfCmdSize;
> + 14:12 ctxdma;
> + 16:16 set_dmtag;
> + }
> +
> + NV_PFALCON_FALCON_DMATRFFBOFFS @ PFalconBase + 0x0000011c {
> + 31:0 offs => u32;
> + }
> +
> + NV_PFALCON_FALCON_DMATRFBASE1 @ PFalconBase + 0x00000128 {
> + 8:0 base;
> + }
> +
> + NV_PFALCON_FALCON_HWCFG1 @ PFalconBase + 0x0000012c {
> + /// Core revision.
> + 3:0 core_rev ?=> FalconCoreRev;
> + /// Security model.
> + 5:4 security_model ?=> FalconSecurityModel;
> + /// Core revision subversion.
> + 7:6 core_rev_subversion => FalconCoreRevSubversion;
> + }
> +
> + NV_PFALCON_FALCON_CPUCTL_ALIAS @ PFalconBase + 0x00000130 {
> + 1:1 startcpu => bool;
> + }
> +
> + /// IMEM access control register. Up to 4 ports are available for IMEM access.
> + NV_PFALCON_FALCON_IMEMC[4, stride = 16] @ PFalconBase + 0x00000180 {
> + /// IMEM block and word offset.
> + 15:0 offs;
> + /// Auto-increment on write.
> + 24:24 aincw => bool;
> + /// Access secure IMEM.
> + 28:28 secure => bool;
> + }
> +
> + /// IMEM data register. Reading/writing this register accesses IMEM at the address
> + /// specified by the corresponding IMEMC register.
> + NV_PFALCON_FALCON_IMEMD[4, stride = 16] @ PFalconBase + 0x00000184 {
> + 31:0 data;
> + }
> +
> + /// IMEM tag register. Used to set the tag for the current IMEM block.
> + NV_PFALCON_FALCON_IMEMT[4, stride = 16] @ PFalconBase + 0x00000188 {
> + 15:0 tag;
> + }
> +
> + /// DMEM access control register. Up to 8 ports are available for DMEM access.
> + NV_PFALCON_FALCON_DMEMC[8, stride = 8] @ PFalconBase + 0x000001c0 {
> + /// DMEM block and word offset.
> + 15:0 offs;
> + /// Auto-increment on write.
> + 24:24 aincw => bool;
> + }
> +
> + /// DMEM data register. Reading/writing this register accesses DMEM at the address
> + /// specified by the corresponding DMEMC register.
> + NV_PFALCON_FALCON_DMEMD[8, stride = 8] @ PFalconBase + 0x000001c4 {
> + 31:0 data;
> + }
> +
> + /// Actually known as `NV_PSEC_FALCON_ENGINE` and `NV_PGSP_FALCON_ENGINE` depending on the
> + /// falcon instance.
> + NV_PFALCON_FALCON_ENGINE @ PFalconBase + 0x000003c0 {
> + 0:0 reset => bool;
> + }
> +
> + NV_PFALCON_FBIF_TRANSCFG[8] @ PFalconBase + 0x00000600 {
> + 1:0 target ?=> FalconFbifTarget;
> + 2:2 mem_type => FalconFbifMemType;
> + }
> +
> + NV_PFALCON_FBIF_CTL @ PFalconBase + 0x00000624 {
> + 7:7 allow_phys_no_ctx => bool;
> }
> }
>
> -register!(NV_PFALCON_FALCON_CPUCTL @ PFalconBase[0x00000100] {
> - 1:1 startcpu as bool;
> - 4:4 halted as bool;
> - 6:6 alias_en as bool;
> -});
> -
> -register!(NV_PFALCON_FALCON_BOOTVEC @ PFalconBase[0x00000104] {
> - 31:0 value as u32;
> -});
> -
> -register!(NV_PFALCON_FALCON_DMACTL @ PFalconBase[0x0000010c] {
> - 0:0 require_ctx as bool;
> - 1:1 dmem_scrubbing as bool;
> - 2:2 imem_scrubbing as bool;
> - 6:3 dmaq_num as u8;
> - 7:7 secure_stat as bool;
> -});
> -
> impl NV_PFALCON_FALCON_DMACTL {
> /// Returns `true` if memory scrubbing is completed.
> pub(crate) fn mem_scrubbing_done(self) -> bool {
> @@ -375,147 +459,81 @@ pub(crate) fn mem_scrubbing_done(self) -> bool {
> }
> }
>
> -register!(NV_PFALCON_FALCON_DMATRFBASE @ PFalconBase[0x00000110] {
> - 31:0 base as u32;
> -});
> -
> -register!(NV_PFALCON_FALCON_DMATRFMOFFS @ PFalconBase[0x00000114] {
> - 23:0 offs as u32;
> -});
> -
> -register!(NV_PFALCON_FALCON_DMATRFCMD @ PFalconBase[0x00000118] {
> - 0:0 full as bool;
> - 1:1 idle as bool;
> - 3:2 sec as u8;
> - 4:4 imem as bool;
> - 5:5 is_write as bool;
> - 10:8 size as u8 ?=> DmaTrfCmdSize;
> - 14:12 ctxdma as u8;
> - 16:16 set_dmtag as u8;
> -});
> -
> impl NV_PFALCON_FALCON_DMATRFCMD {
> /// Programs the `imem` and `sec` fields for the given FalconMem
> pub(crate) fn with_falcon_mem(self, mem: FalconMem) -> Self {
> - self.set_imem(mem != FalconMem::Dmem)
> - .set_sec(if mem == FalconMem::ImemSecure { 1 } else { 0 })
> + let this = self.with_imem(mem != FalconMem::Dmem);
> +
> + match mem {
> + FalconMem::ImemSecure => this.with_const_sec::<1>(),
> + _ => this.with_const_sec::<0>(),
> + }
> }
> }
>
> -register!(NV_PFALCON_FALCON_DMATRFFBOFFS @ PFalconBase[0x0000011c] {
> - 31:0 offs as u32;
> -});
> -
> -register!(NV_PFALCON_FALCON_DMATRFBASE1 @ PFalconBase[0x00000128] {
> - 8:0 base as u16;
> -});
> -
> -register!(NV_PFALCON_FALCON_HWCFG1 @ PFalconBase[0x0000012c] {
> - 3:0 core_rev as u8 ?=> FalconCoreRev, "Core revision";
> - 5:4 security_model as u8 ?=> FalconSecurityModel, "Security model";
> - 7:6 core_rev_subversion as u8 ?=> FalconCoreRevSubversion, "Core revision subversion";
> -});
> -
> -register!(NV_PFALCON_FALCON_CPUCTL_ALIAS @ PFalconBase[0x00000130] {
> - 1:1 startcpu as bool;
> -});
> -
> -// IMEM access control register. Up to 4 ports are available for IMEM access.
> -register!(NV_PFALCON_FALCON_IMEMC @ PFalconBase[0x00000180[4; 16]] {
> - 15:0 offs as u16, "IMEM block and word offset";
> - 24:24 aincw as bool, "Auto-increment on write";
> - 28:28 secure as bool, "Access secure IMEM";
> -});
> -
> -// IMEM data register. Reading/writing this register accesses IMEM at the address
> -// specified by the corresponding IMEMC register.
> -register!(NV_PFALCON_FALCON_IMEMD @ PFalconBase[0x00000184[4; 16]] {
> - 31:0 data as u32;
> -});
> -
> -// IMEM tag register. Used to set the tag for the current IMEM block.
> -register!(NV_PFALCON_FALCON_IMEMT @ PFalconBase[0x00000188[4; 16]] {
> - 15:0 tag as u16;
> -});
> -
> -// DMEM access control register. Up to 8 ports are available for DMEM access.
> -register!(NV_PFALCON_FALCON_DMEMC @ PFalconBase[0x000001c0[8; 8]] {
> - 15:0 offs as u16, "DMEM block and word offset";
> - 24:24 aincw as bool, "Auto-increment on write";
> -});
> -
> -// DMEM data register. Reading/writing this register accesses DMEM at the address
> -// specified by the corresponding DMEMC register.
> -register!(NV_PFALCON_FALCON_DMEMD @ PFalconBase[0x000001c4[8; 8]] {
> - 31:0 data as u32;
> -});
> -
> -// Actually known as `NV_PSEC_FALCON_ENGINE` and `NV_PGSP_FALCON_ENGINE` depending on the falcon
> -// instance.
> -register!(NV_PFALCON_FALCON_ENGINE @ PFalconBase[0x000003c0] {
> - 0:0 reset as bool;
> -});
> -
> impl NV_PFALCON_FALCON_ENGINE {
> /// Resets the falcon
> pub(crate) fn reset_engine<E: FalconEngine>(bar: &Bar0) {
> - Self::read(bar, &E::ID).set_reset(true).write(bar, &E::ID);
> + bar.update(Self::of::<E>(), |r| r.with_reset(true));
>
> // TIMEOUT: falcon engine should not take more than 10us to reset.
> time::delay::fsleep(time::Delta::from_micros(10));
>
> - Self::read(bar, &E::ID).set_reset(false).write(bar, &E::ID);
> + bar.update(Self::of::<E>(), |r| r.with_reset(false));
> }
> }
>
> -register!(NV_PFALCON_FBIF_TRANSCFG @ PFalconBase[0x00000600[8]] {
> - 1:0 target as u8 ?=> FalconFbifTarget;
> - 2:2 mem_type as bool => FalconFbifMemType;
> -});
> -
> -register!(NV_PFALCON_FBIF_CTL @ PFalconBase[0x00000624] {
> - 7:7 allow_phys_no_ctx as bool;
> -});
> +impl NV_PFALCON_FALCON_HWCFG2 {
> + /// Returns `true` if memory scrubbing is completed.
> + pub(crate) fn mem_scrubbing_done(self) -> bool {
> + !self.mem_scrubbing()
> + }
> +}
>
> /* PFALCON2 */
>
> -register!(NV_PFALCON2_FALCON_MOD_SEL @ PFalcon2Base[0x00000180] {
> - 7:0 algo as u8 ?=> FalconModSelAlgo;
> -});
> +nv_reg! {
> + NV_PFALCON2_FALCON_MOD_SEL @ PFalcon2Base + 0x00000180 {
> + 7:0 algo ?=> FalconModSelAlgo;
> + }
>
> -register!(NV_PFALCON2_FALCON_BROM_CURR_UCODE_ID @ PFalcon2Base[0x00000198] {
> - 7:0 ucode_id as u8;
> -});
> + NV_PFALCON2_FALCON_BROM_CURR_UCODE_ID @ PFalcon2Base + 0x00000198 {
> + 7:0 ucode_id => u8;
> + }
>
> -register!(NV_PFALCON2_FALCON_BROM_ENGIDMASK @ PFalcon2Base[0x0000019c] {
> - 31:0 value as u32;
> -});
> + NV_PFALCON2_FALCON_BROM_ENGIDMASK @ PFalcon2Base + 0x0000019c {
> + 31:0 value => u32;
> + }
>
> -// OpenRM defines this as a register array, but doesn't specify its size and only uses its first
> -// element. Be conservative until we know the actual size or need to use more registers.
> -register!(NV_PFALCON2_FALCON_BROM_PARAADDR @ PFalcon2Base[0x00000210[1]] {
> - 31:0 value as u32;
> -});
> + /// OpenRM defines this as a register array, but doesn't specify its size and only uses its
> + /// first element. Be conservative until we know the actual size or need to use more registers.
> + NV_PFALCON2_FALCON_BROM_PARAADDR[1] @ PFalcon2Base + 0x00000210 {
> + 31:0 value => u32;
> + }
> +}
>
> // PRISCV
>
> -// RISC-V status register for debug (Turing and GA100 only).
> -// Reflects current RISC-V core status.
> -register!(NV_PRISCV_RISCV_CORE_SWITCH_RISCV_STATUS @ PFalcon2Base[0x00000240] {
> - 0:0 active_stat as bool, "RISC-V core active/inactive status";
> -});
> -
> // GA102 and later
> -register!(NV_PRISCV_RISCV_CPUCTL @ PFalcon2Base[0x00000388] {
> - 0:0 halted as bool;
> - 7:7 active_stat as bool;
> -});
> +nv_reg! {
> + /// RISC-V status register for debug (Turing and GA100 only).
> + /// Reflects current RISC-V core status.
> + NV_PRISCV_RISCV_CORE_SWITCH_RISCV_STATUS @ PFalcon2Base + 0x00000240 {
> + /// RISC-V core active/inactive status.
> + 0:0 active_stat => bool;
> + }
The above comment says "GA102 and later" but right after it has
"Turing and GA100 only" which seems incongruous.
next prev parent reply other threads:[~2026-03-19 5:35 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-18 8:05 [PATCH 0/8] gpu: nova-core: convert registers to use the kernel register macro Alexandre Courbot
2026-03-18 8:05 ` [PATCH 1/8] gpu: nova-core: convert PMC registers to " Alexandre Courbot
2026-03-18 13:28 ` Gary Guo
2026-03-19 14:39 ` Alexandre Courbot
2026-03-19 1:42 ` Eliot Courtney
2026-03-19 2:07 ` Alexandre Courbot
2026-03-19 2:16 ` Eliot Courtney
2026-03-19 14:18 ` Alexandre Courbot
2026-03-18 8:06 ` [PATCH 2/8] gpu: nova-core: convert PBUS " Alexandre Courbot
2026-03-19 1:43 ` Eliot Courtney
2026-03-18 8:06 ` [PATCH 3/8] gpu: nova-core: convert PFB " Alexandre Courbot
2026-03-19 1:51 ` Eliot Courtney
2026-03-18 8:06 ` [PATCH 4/8] gpu: nova-core: convert GC6 " Alexandre Courbot
2026-03-19 2:07 ` Eliot Courtney
2026-03-19 14:19 ` Alexandre Courbot
2026-03-18 8:06 ` [PATCH 5/8] gpu: nova-core: convert FUSE " Alexandre Courbot
2026-03-19 2:17 ` Eliot Courtney
2026-03-19 14:24 ` Alexandre Courbot
2026-03-18 8:06 ` [PATCH 6/8] gpu: nova-core: convert PDISP " Alexandre Courbot
2026-03-19 2:18 ` Eliot Courtney
2026-03-18 8:06 ` [PATCH 7/8] gpu: nova-core: convert falcon " Alexandre Courbot
2026-03-19 5:35 ` Eliot Courtney [this message]
2026-03-19 14:34 ` Alexandre Courbot
2026-03-18 8:06 ` [PATCH 8/8] Documentation: nova: remove register abstraction task Alexandre Courbot
2026-03-19 2:20 ` Eliot Courtney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DH6IJKX25H7H.28NWD4KJSXX73@nvidia.com \
--to=ecourtney@nvidia.com \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=apopple@nvidia.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=jhubbard@nvidia.com \
--cc=joelagnelf@nvidia.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=lossin@kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=tmgross@umich.edu \
--cc=ttabi@nvidia.com \
--cc=tzimmermann@suse.de \
--cc=zhiw@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox