From nobody Sat Sep 26 11:01:08 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013068.outbound.protection.outlook.com [40.107.201.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D83B40A953; Wed, 2 Sep 2026 09:17:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340631; cv=fail; b=oekDVPB0QOavrNuMmB3wSSMOLD3FJPWiny0aKD2unxVnm9QmY+HgwK/rG8J5Eps1SLDh4YrEi4cRaVEAgF3PSBDg2ylWfMRsnNs9JZLab/gEr85lOg2gLDEwW8+lp8fRrjXwTNWIKbEmEYUjvgLMwICQkyTYMW7ISsCzDHGKTWY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340631; c=relaxed/simple; bh=44tyRl6XMon2+Oy1tGeSY0pgYa1ICO7g58XSptBKPHI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=i7oMK4OXAtFa2L/VY0r37MX5iP5k9Z9s6cRw2qYkG//2Hef4yXOfd3bFwpjwT8jSyJu5SM4QBL3R2ma9BEc/xW5dpkPT9wQFAIb+Bkx7dcOxn4PuoOq5NEGL769CllCDa40XWwRX1NYvTu2XhR+OPP2zh5b9TUnQsSluttg3JlQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=oUd5+pVe; arc=fail smtp.client-ip=40.107.201.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="oUd5+pVe" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W+PvWRcgYSPnyoBSX//6zgcYyTXX036eVMaHerFsCtfNr1LSNzyAyxgxGkEV6VmO7mhI2l92cnKfnCsIkZWD9Pel3t5FI0OsGNHxy9M3VJp11msL86ZVIi1zgwfASKFu5N8qXt15T2JkCCYSq8c3LuWoGAOPvbP6H5chlhZGiabD4PaAaL6+3qJiBd8S8eZOQ3hW5XDQ8/ES5KYep7bE2jljBpc90ZEnYE8YpH5anmUoJ/K8NaQtxGlzxtVRA8f1ifOe8w33TQmlmJMUHVSU0Os/TptIH6u4Hwy21cF2nC5NlPufQmSEZcH5dMr/Ha1xgTGzKt7tq9La1W1T54UnOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=grBtS3F+lRjlVWXAb4lZXh4ngV4EekOYFIZzRBL8BTc=; b=Dk78LZL4MzG7LikMCElEUmJN0+hxQbUXdGYW4ZHcoQZklI7j47h2ZzlHl2G+a0ele+ak8AP2NFSydxgm0AW7CSagFiKowaLplIkJgSbz1jwx4ff9+Shr+rwBkrFB3giczIAw1Jd7cfyfYtJrDw8RYSKhdotTOI5ihEQbkFnnhtoJs9tAkfnaohRyr9oiCwSTJvZdRiDdHvB7BYP2Zpk/0xt4/lsNUfGnq2kYKugN44BZR3EA6/uu0oIWcmxygi1uSroEbKxQO1HKVLVyFg/mRdkm1dbmn4Jt5EjroJ+Ka5SBBv31iQaSvifoQ5Rz3NuJyrl/RshZXiX7Z4Uusp1Nxg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=grBtS3F+lRjlVWXAb4lZXh4ngV4EekOYFIZzRBL8BTc=; b=oUd5+pVecwm+BQhLjte5r1bW0tvT8Y6qy2+mhtL0SD/2MHKwt6s8eT/bhoMZclySG+ikBIjHvXsf472Y9Cgq2abQdvelzuF4QNXpGhhUc+CfRULX3Cmz752uV/6pwv6Xcgr9KWoPswHRBMDuke6TSlIdIoIG6x30hZ4NZY0M1FdjvEmUuxBP8r6zjshWAOk1HmJ3kfujVhXgPacj0z39a3X8UfXPdPGAqhNsfCRzjuWTYImFFUsqZiR23PyDSnIZgbeItFrlHnIwAVlxCS/72zY7jfn9mVLsiKPmrIG1h8tt1lBz1Zv1zzrsWhgu8m2XAlqcWazh27F/jdU5XoNXRg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by CY5PR12MB6227.namprd12.prod.outlook.com (2603:10b6:930:21::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 09:17:04 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Wed, 2 Sep 2026 09:17:04 +0000 From: Eliot Courtney Date: Wed, 02 Sep 2026 18:16:40 +0900 Subject: [PATCH v3 1/3] rust: num: add cv! macro to create values from constant expressions Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-cv-v3-1-0f90659e711d@nvidia.com> References: <20260902-cv-v3-0-0f90659e711d@nvidia.com> In-Reply-To: <20260902-cv-v3-0-0f90659e711d@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4P286CA0039.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:2b2::7) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|CY5PR12MB6227:EE_ X-MS-Office365-Filtering-Correlation-Id: 09a42b66-2cb9-4b62-7bba-08df08d2f41f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|23010399003|1800799024|10070799003|366016|921020|6133799003|11063799006|10067099003|5023799004|3023799007|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: 0uCx5pBB0KMs4XZA3lpAdVVsRFMIhOH+eDWl81/PkJeK3aBps19VRQheRLZTh4XKbz3YPcLZKjuTyn874z0xILMWE45kC0LYA20SDOvlpCN2cE7euiGrf/GbsKlEfJaQYwo91+3NFzqXNGxUvk3PdHH10KCbwW9kzNDMWB2K6BgzlcdzAdZtA0S/eolSn8oo4WIVb/Q5V77OOKPDjj1J+xilVHV/W4x6q0Hk7tu2J7cPnOgY9Jp2koEYDELbyxduwtZXdRWEAYsHr67yj+5lQkGyE4FYjhOe+zNk1s/scwQ4ZUd5DXmkH+rbIuBTs8X1BBu5D8BDXcE4BXEPxo1u+IQfCukLH0lbDyDbCio6YJ0asIvCSWnc+SJHY80FLEuoqRFKEfEm8D67lU37gNhrqrzi6uRGInqs/mvHYPtiWWiH78OWuGgp3rV5VCYyPbQd+jfqeBiWAdT9257H27TnupU8zfrniUrdHYHNSxUVINmUmNP/VrQwHaVdgQi3vvAZWz8iHOH8Yo0XuWOwoNAoCw9xk49E6Dhgm+3L/X9+WG9RE0Xn5q0VI6PHzNgWy3MxpYMzzIyG//9VHx4dN2abidVDOSX5FRlUWhOmXi4fP9hnxB85WHrHLIgwERl+PdkH16FCVj3gwmsqZObKhMgKOMQhBfCfUjGZKD97SQ1srwRyEcgkvMKPaCVrBE8p4P4i7UUsMeABfGN/fWlEP16SDg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(23010399003)(1800799024)(10070799003)(366016)(921020)(6133799003)(11063799006)(10067099003)(5023799004)(3023799007)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bHpJTTdkdjBIQklPN1FLRXZLTlJOOXU3R3pUNW9YajRoaXZBQXcvUE0zUHRj?= =?utf-8?B?UWxBc3FEUC9XVlJFRDlhOU02bmhTdFVvZVpjS1FETEo4ZGpPTTU5cDVoQ2N1?= =?utf-8?B?QlZtK1ozWEt1SnhHdnhkamZHYXM5Slg2OFV2Z2JLeUZha2RibFRHWEJNVkc0?= =?utf-8?B?RU16ZHEvRWVCSjU1RGlvL2RFcGNiK0FtSEh4TytVSUEzb1hZUkRUdUc4UTdX?= =?utf-8?B?WFNLeDlvTDNmL055aW81VnN6NGZZbnhWWWY3WSs3WnVxTUxNMnlxRkxFbjZz?= =?utf-8?B?K203M3EvNkx4d2lVN1RaMC9hOFJSSzRBaWx5NGlCa3Y4cXkzTDNvaDk2UGh0?= =?utf-8?B?d0k1cVgvY1p4cTJkZlhPUFhGTkFsd0JyNy9RUVhFakxmTTlxenUrS1dPZWdp?= =?utf-8?B?L1NWQmZ1Rkh1NkxQazE2TFFKcC8vTUVwOGo1VHNXS3E5SFljcjJBbktITjg0?= =?utf-8?B?V2tMblRlSjFmNjlUeUR6VjhWNlcrWHVWek5GTHNHMTU5WTNuSUMvNjJuOENr?= =?utf-8?B?UGZDRXBkSklwYXRIRUVKTnFKOG93NUY2UzVyNE55UndaRUZVSC9ORytFN0lp?= =?utf-8?B?TUVrOHlmbTgzc0tHanM0N1F6UGVVcUpUQllXZDQ0NWpLbzdyNDNCbThtZDRK?= =?utf-8?B?L0VpYXNDSU9iOG1sQUZ2SHJGRnJIOGczUWx0ZDUrc0QxK3V3c0M3bGZ3MXJr?= =?utf-8?B?L0ZObktiUWhDR1Z0a1lxSmYySFVySWlUUkREN1djdjRxOUVNeDJlL1VVVFNi?= =?utf-8?B?MUcyRnBKRVlvQlVYdTJnRE92QzNWZkMreEFOd2x3VFp6WEtLYnhaayt4R2VD?= =?utf-8?B?b3h4Um5FM1hubyt6RVB3TTVxb05kQ0dHTzViYjNFM2t6VXREQ1JvazUxMGVI?= =?utf-8?B?R0NXY3IzT2RKL3ZNblhFamZBWmRPNnI5U0pKNHp6Rm92RUowZ08vQ1IzVHFP?= =?utf-8?B?bFRCamhrWFFJZ2d2TDQ2MXhIYzk1MWwyYXpaaytmTGpNK1NlTDUrMnd3R0RV?= =?utf-8?B?VitUQnBkT1VCUGZtN3ZEaEhTQ0tnTlVkUjI0V1pqdEYvWUFRWGpBREQxVUhj?= =?utf-8?B?WFFCVXo4ck56NERjd1QzN1I5Z0RiZ09BdlNJMEZ0b2w3S0IvYlJicU14bGsx?= =?utf-8?B?NnJXK1hDTUFRbmVQWXRtQVQ5bWF1RFJqS3dtbWtxVVhMZmdOcjN1S2krNXhn?= =?utf-8?B?MWt3M3FrRUV1SmxKT3RxNW1aRzNpT1orN0tNZkZSQXpmVG5ZdkF1ekZrMjJQ?= =?utf-8?B?MC83aGkzMW1JWTZPWlhYVGt6V2prYmc4SjZHajJKaWovbWYvMFUzVVVFUjNw?= =?utf-8?B?NG1tcUpLMUdYWi9FV05PZERrTEt4QTlxeU5ESW9OVGN2d0x3cDAyMHBEc0FF?= =?utf-8?B?ekVnK1BLVk9YYW1WRXNJeVNyVGtaUG15YklzcXBBZVFLNzBadWE3amg0L2po?= =?utf-8?B?c2IrSm9wMWJSK21GOVdZOVc1VXRoQ2dRQUlUMG8yTTM2WEt0UDFQakQzRmkr?= =?utf-8?B?VFlWQTd5TGFTeTZEMVd4MlJRbWM0VVNRc1AvV0JLSU9adm1scTFrenRaNE5k?= =?utf-8?B?R0FQcElTRzkxRURDYWhuLzlncS9qRUhWR0dGSXdKSkJhUnB3VUlZbThxRlpx?= =?utf-8?B?Z1A1L1V5MzdUaEsvQ1g4UTBFYm90N2dUK2ErSTE1NFBJaWs3SnF5TG85MGNG?= =?utf-8?B?MllFOUdUc0FEWUdSRDhwaWhnUnRYQzlnVTdKLzJ6NEQvWWFRbHVhWm90OVo3?= =?utf-8?B?MlZmUklLM2l1K0ZZcmZLR0k0TThUWGhTQVArdGFjLzFvMEtuNytKWXBkRmhV?= =?utf-8?B?ei9uY0xMVW44bFBERDVHaXduZG9jYWtyRGJadWlxcUpOMTFpdktiWUo5N1ZQ?= =?utf-8?B?bUE1TStWaHBjeEtpNkNDZVdUSkNDY0RpMUJyb243YUFVYi9rWTJWWk8wYnJL?= =?utf-8?B?N09tWDhsQVlrRGhrbFU1a0RFR2N1R09BU0pUYUR1SDlyZFFlU2c2eHFHdGJN?= =?utf-8?B?K25ldmpsN1pTUTFGeTVCclpid0hMNDJxVDBBK29HcEtaMC80MCs4bmFXZTNU?= =?utf-8?B?Kyt3WFJaSHV3QWdtbWJqVU5DN3dHTmw2Si9aeTdIOHdRZUptZXJtK1dwVlZo?= =?utf-8?B?NkVyZzV4c0dQR2VLTzFITUtmWThJVkIvb3UxTXVQZnpkR3ZnbVJ5TnRhOE9Y?= =?utf-8?B?L29mWXJnWnlhRTRxYkFwVWlmY3E3YzVLRTcxSEdzcVhlbDJERzljSVNLQUEr?= =?utf-8?B?eEdkMDFwS0FnNnhXRS96QVNPTDhOZHNDTDY2ajJ4WW9YQU1OMFRDalM5UmZn?= =?utf-8?B?eFNHeUQwSzZyNXZPSFovQlI3TjdUaDkyUFhYRk5UL3MycmVjMU1ZMnh3bTIr?= =?utf-8?Q?A6q5/QUEGpwDlKCaKP6fGHQrPGlPm73FNWD+pBd8y7cnA?= X-MS-Exchange-AntiSpam-MessageData-1: 7ZaU4d+JtaAypQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 09a42b66-2cb9-4b62-7bba-08df08d2f41f X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 09:17:04.3703 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KeNlu86JQ2rIDZkMdHZHsST0SwlQ6/xGWMrg3TLQDqUyfUDetP0VdjFl4ps/1r1MGJ8kyd4J0wRDWdVj96f+dA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6227 Currently, using NonZero/Bounded constants is quite verbose. It's unfortunate because it disincentivizes using it in interface boundaries. Introduce a macro to make it nicer to use. The macro `cv!` (for constant value) takes a const integer expression and widens it to i128 (at build time only) before passing it as a const generic value to a new trait `FromConst`. The value is then converted and appears in the associated constant `FromConst::VALUE`. The trait is implemented by NonZero, Bounded, and Alignment and lets values of each be constructed from constants without a verbose turbofish syntax. For example, `const { NonZero::new(1).unwrap() }` can be written as `cv!(1)`. Suggested-by: Gary Guo Signed-off-by: Eliot Courtney Reviewed-by: Gary Guo --- rust/kernel/num.rs | 138 +++++++++++++++++++++++++++++++++++++++++= ++++ rust/kernel/num/bounded.rs | 19 +++++++ rust/kernel/ptr.rs | 14 +++++ 3 files changed, 171 insertions(+) diff --git a/rust/kernel/num.rs b/rust/kernel/num.rs index dbe848e30efe..9435459376a4 100644 --- a/rust/kernel/num.rs +++ b/rust/kernel/num.rs @@ -2,6 +2,7 @@ =20 //! Additional numerical features for the kernel. =20 +use crate::const_assert; use core::ops; =20 pub mod bounded; @@ -9,6 +10,143 @@ =20 pub use bounded::*; =20 +/// Creates a value from an integer constant expression, with validity che= cked at build time. +/// +/// This works for any type that implements [`FromConst`], with the target= type inferred from +/// the context, or named explicitly with `cv!(value =3D> Type)`. +/// +/// # Examples +/// +/// ``` +/// use core::num::NonZero; +/// use kernel::num::Bounded; +/// use kernel::num::cv; +/// use kernel::ptr::Alignment; +/// +/// let v: NonZero =3D cv!(8); +/// assert_eq!(v.get(), 8); +/// +/// // Any integer constant expression works, not only literals. +/// let m: NonZero =3D cv!(usize::MAX); +/// assert_eq!(m.get(), usize::MAX); +/// +/// let b: Bounded =3D cv!(15); +/// assert_eq!(b.get(), 15); +/// +/// let a: Alignment =3D cv!(4096); +/// assert_eq!(a.as_usize(), 4096); +/// +/// // Checked narrowing of integer constants, including in `const` items. +/// const SMALL: u8 =3D cv!(200u32); +/// assert_eq!(SMALL, 200); +/// +/// const N: NonZero =3D cv!(5); +/// assert_eq!(N.get(), 5); +/// +/// // The target type can be given explicitly. +/// let e =3D cv!(200u32 =3D> u8); +/// assert_eq!(e, 200); +/// +/// // With an explicit primitive target, the expression can use generic p= arameters. +/// const fn as_u64() -> u64 { +/// cv!(KEY =3D> u64) +/// } +/// assert_eq!(as_u64::<0x40>(), 0x40); +/// ``` +#[macro_export] +#[doc(hidden)] +macro_rules! cv { + (@cast $v:expr =3D> $t:ty) =3D> { + const { + #[allow(unused_comparisons, unused_assignments, clippy::as_und= erscore)] + { + let v =3D $v; + let r =3D v as $t; + // Pin `back` to `v`'s type so `as _` casts back to the so= urce type. + let mut back =3D v; + back =3D r as _; + + ::core::assert!( + back =3D=3D v && (v < 0) =3D=3D (r < 0), + "value does not fit into the target type" + ); + + r + } + } + }; + ($v:expr =3D> u8) =3D> { $crate::cv!(@cast $v =3D> u8) }; + ($v:expr =3D> u16) =3D> { $crate::cv!(@cast $v =3D> u16) }; + ($v:expr =3D> u32) =3D> { $crate::cv!(@cast $v =3D> u32) }; + ($v:expr =3D> u64) =3D> { $crate::cv!(@cast $v =3D> u64) }; + ($v:expr =3D> u128) =3D> { $crate::cv!(@cast $v =3D> u128) }; + ($v:expr =3D> usize) =3D> { $crate::cv!(@cast $v =3D> usize) }; + ($v:expr =3D> i8) =3D> { $crate::cv!(@cast $v =3D> i8) }; + ($v:expr =3D> i16) =3D> { $crate::cv!(@cast $v =3D> i16) }; + ($v:expr =3D> i32) =3D> { $crate::cv!(@cast $v =3D> i32) }; + ($v:expr =3D> i64) =3D> { $crate::cv!(@cast $v =3D> i64) }; + ($v:expr =3D> i128) =3D> { $crate::cv!(@cast $v =3D> i128) }; + ($v:expr =3D> isize) =3D> { $crate::cv!(@cast $v =3D> isize) }; + ($v:expr =3D> $t:ty) =3D> { + <$t as $crate::num::FromConst<{ $crate::cv!(@cast $v =3D> i128) }>= >::VALUE + }; + ($v:expr) =3D> { + <_ as $crate::num::FromConst<{ $crate::cv!(@cast $v =3D> i128) }>>= ::VALUE + }; +} +#[doc(inline)] +pub use cv; + +/// Types that can be created from an integer constant expression validate= d at build time. +/// +/// Implement this trait to make a type usable with [`cv!`]. Use the [`cv`= ] macro, not this trait +/// directly, for creating values. +#[diagnostic::on_unimplemented(message =3D "`{Self}` cannot be converted f= rom a constant")] +pub trait FromConst: Sized { + /// The value that corresponds to the constant `V`. + /// + /// Fails the build if `V` is not a valid value for `Self`. + const VALUE: Self; +} + +/// Implements [`FromConst`] for primitive integer types and their [`NonZe= ro`](core::num::NonZero) +/// versions. +macro_rules! impl_from_const { + ($($type:ty)*) =3D> { + $( + impl FromConst for $type { + const VALUE: Self =3D { + const_assert!( + V >=3D <$type>::MIN as i128 && V <=3D <$type>::MAX as = i128, + "constant cannot be represented by the target type" + ); + + V as $type + }; + } + + impl FromConst for core::num::NonZero<$type> { + const VALUE: Self =3D { + const_assert!( + V >=3D <$type>::MIN as i128 && V <=3D <$type>::MAX as = i128, + "constant cannot be represented by the underlying type" + ); + + match core::num::NonZero::new(V as $type) { + Some(value) =3D> value, + None =3D> panic!("constant cannot be zero"), + } + }; + } + )* + }; +} + +impl_from_const!( + u8 u16 u32 u64 usize + i8 i16 i32 i64 isize +); + /// Designates unsigned primitive types. pub enum Unsigned {} =20 diff --git a/rust/kernel/num/bounded.rs b/rust/kernel/num/bounded.rs index 2a2b0a4bca5e..f720eb44e7d3 100644 --- a/rust/kernel/num/bounded.rs +++ b/rust/kernel/num/bounded.rs @@ -14,6 +14,7 @@ =20 use kernel::{ num::{ + FromConst, Integer, Unsigned, // }, @@ -272,6 +273,24 @@ pub const fn new() -> Self { unsafe { Self::__new(VALUE) } } } + + impl FromConst for Bounded<$type, = N> { + const VALUE: Self =3D { + const_assert!( + V >=3D <$type>::MIN as i128 && V <=3D <$type>::MAX as = i128, + "constant cannot be represented by the underlying type" + ); + // Statically assert that `V` fits within the set number o= f bits. + const_assert!( + fits_within!(V as $type, $type, N), + "constant cannot be represented within the given numbe= r of bits" + ); + + // SAFETY: the asserts above confirmed that `V` can be rep= resented within `N` + // bits. + unsafe { Self::__new(V as $type) } + }; + } )* }; } diff --git a/rust/kernel/ptr.rs b/rust/kernel/ptr.rs index 82acb531b17b..ac1662c3c8af 100644 --- a/rust/kernel/ptr.rs +++ b/rust/kernel/ptr.rs @@ -166,6 +166,20 @@ pub const fn mask(self) -> usize { } } =20 +impl crate::num::FromConst for Alignment { + const VALUE: Self =3D { + const_assert!( + V > 0 && V <=3D usize::MAX as i128, + "constant cannot be represented as an Alignment" + ); + + match Alignment::new_checked(V as usize) { + Some(alignment) =3D> alignment, + None =3D> panic!("constant is not a power of two"), + } + }; +} + /// Trait for items that can be aligned against an [`Alignment`]. pub trait Alignable: Sized { /// Aligns `self` down to `alignment`. --=20 2.55.0 From nobody Sat Sep 26 11:01:08 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013068.outbound.protection.outlook.com [40.107.201.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60DA7411F8B; Wed, 2 Sep 2026 09:17:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340632; cv=fail; b=IUFJDoCjzvSQH7elfovcef5x6se5V/GaFf0JEcxKit8MccJUx90tSHdxTdZJ7BJ2E/B0RzzKfu1lZ6gxx4SPomu4dzXZ65/w3jzvyVOqlFb0tiodRmUvcdIqCsKnCxr4fV4P4B4qBo9la3GmVmT8cBv3gVLb9bTyFjBJfJJVd24= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340632; c=relaxed/simple; bh=svyplPVbHQfs15h9nOr6zx1/vchbeAVtMssZqreVUwU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=peEasedZFIGvqdlSYQ8WT+bzRmg+O2iD0tIlMsphZhSuDudJAz5exzC5FA2V5p9tC166nVCCNQeUhPz3v0MHIPD6pOhCL64rI8jFmTAs/NWsDrrdYSmOwX6N1FAg+28PgdVR37VEiFHD2qlcpNIGcsjZ2+5I2RmUcfQhglcTzxk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=S6i5QnA2; arc=fail smtp.client-ip=40.107.201.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="S6i5QnA2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mHWI0jNcD3BHY933s/QNE4xLzIN+WRHAAjwNRrg1YQ8KFqv5C93piCH5z4nLXJEg6XAYoGY9wPI+zszwy4CuiY3uMksIE3MUxI3lII0NeN4O4+EmFDEsusggyDyInAGDd2NpWYg9bUtNDt/ApZh0Zpy4HHW0Pqvh9DSxvKi9MdJGnVG9ajUKIIMUGr/NaG8THgluGLA6Jfp0QAzcRwQ8yQk47sV0Y3vEu4T2ijK0mWeUmtld4uS3aWtxh0p9apcHUEIYgMMr/uykZBS8rpuQLCpDo8N1hAp+DqD2LxlYSlQjhI6qnlphC60DfaOyhXoP5IJGMg0/AFMCEliZyOp3Pg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WaKRd3EWTTSVC1DRyAsw6o7D2mWSxccHnR09kX80NQ4=; b=bNClqGE6WgbLhutT/l+Lm+NMWF/LLtGifPQWYG92dUp6Quez64NS3uYao7We+TpEVstxllMAfGT3Ly8xBFmbqX5LKqvGLzRo9bgQkh2DHdtpcBYrhTXY9VSsJdp1ZCdrx31PQ7j9nihmFX+pivIBkmt6yl5Q0L3sqf5RBvqttaEX+VXc6CSdKeQpXbBmAzPZrwHxqU9sE9BC4lt0j7i31nqPTR5qP8Sr+Au6mgvyU15F5XncP/Q/hGBbfTJ4h556fkNO1jRKS07Uz36YNjyGkNIiLYtv7busGD3Dj7LyDHlqlBSiixr6Zz0pU6WrBq307RtnI0YZlOsR86GDdgYfYw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WaKRd3EWTTSVC1DRyAsw6o7D2mWSxccHnR09kX80NQ4=; b=S6i5QnA2tzRCq6GOXxAK7DSXPGzkz30gtEs7uhrdIzMF9ji1A6HjI4FyS11DjIvJkJNSsbowXGoaTg2BHUn+xJO/6h3qVWfeKAyQ38ZRdVt/GUIlDQG9qJZ5Um+SNe69rc1Uvi9nrQ7pJmSi+/VtPWLscXuNVP3yoEEHn/pxWcHVWv9dCZclR+ef+yUT+jF5PksGgSQXilDAciIn0tgqFH+6VvRdnqvx0FXYsE4ERCyQ0RuJNkZmcP1fby7pfevHWDNHf3wIPs1S86jnmv1zPtvmymYGLuxGWFygBwU/AiLQORlzXIUExmEJUMxBId0sAT74PqhiVzHf+IK0IhitUg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by CY5PR12MB6227.namprd12.prod.outlook.com (2603:10b6:930:21::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 09:17:08 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Wed, 2 Sep 2026 09:17:08 +0000 From: Eliot Courtney Date: Wed, 02 Sep 2026 18:16:41 +0900 Subject: [PATCH v3 2/3] rust: prelude: add `num::cv` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-cv-v3-2-0f90659e711d@nvidia.com> References: <20260902-cv-v3-0-0f90659e711d@nvidia.com> In-Reply-To: <20260902-cv-v3-0-0f90659e711d@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP286CA0009.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:26c::11) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|CY5PR12MB6227:EE_ X-MS-Office365-Filtering-Correlation-Id: 483183a0-a97c-4187-23ab-08df08d2f65d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|23010399003|1800799024|10070799003|366016|921020|11063799006|10067099003|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: Axt1K6qHWw49L8izoG37Fi8gW9GxupENTfbbxKZrkTQtnz93e4bdNK+3k/hv3lol/lX6qM6nNoKiFxouAhN8fyDvDATj/DlHlbB9s8iQ0tnA5f4kE3DZlkyfKNrYWcdmX8h02W+uwVylc40vseV9D7susFXR52huZ8dVEDijZricQGa0BbZdNYpcHfXr+jNYmYIb5MIsOpKiefLlARcHOzLEtj3w8tcSGFlYcfQsD/f2R0sxrvAS1uJS5YzNZK5r5Zw4dT2F54s6sviYiXjW+MgJM2RVCu4V4/ghxvLV5Haou1jeP6/wsudGdWip006QgheWscJcpX+sDUoNd3mKmut9ifOpln9ZRaLfau80kfiw2EnUHqNqeciTtamrFSWQybAKEv2rW95u/YdSeFX3m+2zYHXVqnmG5Jan/0NGCsk2bNEjltEBMvK64PUHihB00h4RqMUvrEhikCaVEir9/dWv2RwKbHcb8doC7OPCcIIbidknmH+bWQwciQ0dcB3AL9UHKeQpPqodeyWEgfoIKdX0F4fJ5H3YEEqLurB2wyUCnMTaXG1cq/HRgGgHIKt0QGDxXwqg5PolrRt5x8v6BAmpf8dNLhrq9PlEp2EyeYGIU12wrvcH1kwgigTxD7QFbjWx7bFdRAR/KHjndOWaqLtb0NPuOOt4TMcZg7u7g9FL4wOoVCnBsczX6cqfIDcQlXGGXZKfj4WqSFQBzHQrEA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(23010399003)(1800799024)(10070799003)(366016)(921020)(11063799006)(10067099003)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?b0NiaXZocFhYRmlaMnZvZktPRHRucmJYcmJUYjAzK1hscm83bFFXbDN2bkN4?= =?utf-8?B?SXJ6UXZGNk5wVzJFeHBMVzlHaW8yWllOdDAzcnU5MDhDVjRaY2JRdFpzUGhs?= =?utf-8?B?K2VnTVQ0amJZdk4vODFCOWdOa3FFc2lwRUVoeTFmUnRuVjJOenZUd1Q0bXRT?= =?utf-8?B?OEYyUGwyUUxLKytQa3grYW8wSWdkVmt3QnI3WFdnektLOXRUOFhHWFA0NUxO?= =?utf-8?B?N1VWSDlzWmxTb2JzdnhlakJvelp6UTM5dUtkekx1dmc4S3dpQzRpbm9rVXJi?= =?utf-8?B?QVBoK0RWT2NsdWhsL1JqV2xLWXdZRk5VcG1hTkJKRVVGeXNVLzh5MjNFRHRx?= =?utf-8?B?dUk0R0l2YVMvN0VtL2lnWUtveVJOaldrNmtCQ20xeVlmTExFS3M1cy9OY0cv?= =?utf-8?B?SkhobnhlTE9IajhaL1FWTm84SDVaYXBlTVRhU1QzSjFuQXFMcjJPSU1EVVdK?= =?utf-8?B?KzB2ZWxEMWYzRWZHTUxwZ1lGZlVsamNIelZ2VzJsdTBQaTVlUzl1YXNHblFw?= =?utf-8?B?alNQd0tpc1JseUd6TzFuMC82N2M4d282cGN6RGJKZlpuaHMyYkdLc3FYZmdD?= =?utf-8?B?WTZKZzhxNldyMWJiQTVwSXoxRHlpaUt3Vit5NFd2TmxMTVl2K0V2b3VxTk9r?= =?utf-8?B?Z05Rb3ppcU40ZXNGeTQrak9sYWJYc3prS2NQa0UxMUQrMkk4M2xqcjRxNks4?= =?utf-8?B?MXl5bHFDSmRqVFNUQWVMVkgyck40K0hkU3lZVkhOS2tRaGNPMENVM21QRVAw?= =?utf-8?B?NHRhc1hxaE53eEo5UnNmeCtUWjc1RERvaVZ6K0xsRXd3K2g2Y2hQbUcrVmFC?= =?utf-8?B?Y1hOeVcrYXdvTWNWWGZmb0tDaEMvRXlJZ0ZpOGM1MzlTbW05d1NtMkNDc0NO?= =?utf-8?B?MkVBcWN1WG5wVXd4OVE0czQ0bXB5VUhMVlFKaTU2NHFJZ0FyYUtGM1RRNXR2?= =?utf-8?B?bFNYMWUrYjRjSitWZExCUVU5QXJqTGdEVE1seXRIa0hFZnFhZWhMMjdiaXp4?= =?utf-8?B?Z0tHbGdFNW0vcEU1Y1Q3NjZkS0pCVkdaMjVMd3dRYzlCWXNldWxLY3I2QzB4?= =?utf-8?B?UHhGbVZ2akVpTGh6bnlJRG9wekprZ29DK1NvSVRZbDVKSVBkLzB6VkpvbzNy?= =?utf-8?B?TTE2eWVZYW5raWp2MzRvaXNjT29CenhCRFNUa1hQVXlCNjI4TmliNVU4R3Fm?= =?utf-8?B?T013TkFndUhXQk5IbElzOWxnZkphaDROY0hKM2svQnI5R2tuYU5IT2xnZGFS?= =?utf-8?B?czhvL2RyWTBUakY4aFNUdTBMczdYdU8xeTYwNlA3dDRhYXFGZUE3OE40bUJ6?= =?utf-8?B?L3JIYWxnWUNRMWFvRDZDLzN4Ty9MeGEyUTVZa0pwNXBjMHJramErQkJYcTdB?= =?utf-8?B?RDN6dll6WjdYZEkrbTFWM0o2Y0s1bVp1S0hxMXBxNWVjdXRyS21kWVFOVWxV?= =?utf-8?B?anBFQXVscDdtbWRlM00yZUMwVWxsSi96dE1IY2VMd3FhUkJmeFRGRURTV0wy?= =?utf-8?B?R2tSMEdzc3RXMUxSRXNhTjk4TXEyNk1xOVY2RkZESmV6bUFtQUxqOThIc3FF?= =?utf-8?B?eHIwRWN3amIyaFA4TUdSd2lMKzZiL21sVUlMK2hlRmR0T0EwbnM2U2I3RjFO?= =?utf-8?B?Ri9xNHNSS2ZLeE9CZDNjQWw5YmgxWk9LQmpOcFB0T1VYa2l0YXhqMVpyQlo3?= =?utf-8?B?ZFhFVms0cml2S0I2cXRYZ1d4R0ViWUd4RmFvY0VnRnJTa3VoMHpUcXh5L0xk?= =?utf-8?B?ekdyTWpPYkJmWWNTeHp1UEFHVVgyYWN5R1FTa3BuMEN5REJ6S0oyOUg5S1Q4?= =?utf-8?B?K0ZKVEtWWVIwb3N0SldZZ1F4TTRnU1phcG1xRXprRzBFSTd2dWdTU3dWczlr?= =?utf-8?B?bUwxV0FMZ2F5RnBtNlFUeVBvVWxzOHhhVVhvK3pwMzI2SVZlYVRNUWE2T3lU?= =?utf-8?B?YjB1TlBWT0VlTFVzZ0svZlhrbDdDV3Jqa1lRc1RrOWR5SzFib3lLaWUwMXZF?= =?utf-8?B?QXAxUXd3SXFHb0ROWDZ4b2lJUFpoYk5wcGViMEVGcW03a0dmRnBMQTk4ZGpB?= =?utf-8?B?bGZuUzhsMTdqenJoYUYzRXlZbFA5WmNmejJvR1BnMjFVcWN6M3RHcjZzajJG?= =?utf-8?B?NVVjK050b285OEV4eWowQTVnQXYvUll4dFJJRDZBNzFCd3pyUFcrNnRMdVN3?= =?utf-8?B?ZWZwaU1lc3hjR1pMNjR2dzZ2VDJhRlFOaVVzWkFlVExEUXQrL1hDekdqbVFj?= =?utf-8?B?YU5PWTQvcnc0NXpuYjJoV29ncGJoNjhFMlFaTzdTa1hObkg0TjQ2QnZJdnFF?= =?utf-8?B?MXhYWWhKUHdjNG5xVUk3N1E2VC80R0grS1RPUEJBWks0eFg4SFAxV0wwSVdk?= =?utf-8?Q?R1LWa9THi8V7RkFjB+3p8vVgw94Hx5q2AJA2bkpMDmGP+?= X-MS-Exchange-AntiSpam-MessageData-1: 1PN55sje6hqHow== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 483183a0-a97c-4187-23ab-08df08d2f65d X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 09:17:08.0378 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: sKaYuPGsqlxmbI9vlK5SRMqELDGHoj1GmXKPEdgX9kuJPSJJj83OSW614LL0vsYwJ3/L+UDcPh6vjQyPQO2FMw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6227 Add the `cv!` macro to the prelude so it doesn't need to be imported explicitly to use it. Reviewed-by: Gary Guo Signed-off-by: Eliot Courtney --- rust/kernel/num.rs | 1 - rust/kernel/prelude.rs | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/kernel/num.rs b/rust/kernel/num.rs index 9435459376a4..08862fe6ceee 100644 --- a/rust/kernel/num.rs +++ b/rust/kernel/num.rs @@ -20,7 +20,6 @@ /// ``` /// use core::num::NonZero; /// use kernel::num::Bounded; -/// use kernel::num::cv; /// use kernel::ptr::Alignment; /// /// let v: NonZero =3D cv!(8); diff --git a/rust/kernel/prelude.rs b/rust/kernel/prelude.rs index ca396f1f78a6..5facf8f7af90 100644 --- a/rust/kernel/prelude.rs +++ b/rust/kernel/prelude.rs @@ -106,6 +106,7 @@ Result, // }, init::InPlaceInit, + num::cv, pr_alert, pr_crit, pr_debug, --=20 2.55.0 From nobody Sat Sep 26 11:01:08 2026 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011049.outbound.protection.outlook.com [52.101.52.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 902E5415B71; Wed, 2 Sep 2026 09:17:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340638; cv=fail; b=Afa3CLhH3/qCufCHO/C0ibQbjNFmTEaklCvO6C2Iv02puy6TnSV7ay+XK7AD5HG4cuOxfwjH0sYvoRfxoaUFXxDYex5/NNCB6o9Xyo9UbFJAVk1+jLP/8ojMtyqLhPRnp08LPlnfBUO0c+ePYfgdiHojfAafoeJJ/X9JSvTzVKc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788340638; c=relaxed/simple; bh=IH18f+PnDVpcLMGONogzZqElIPODgt6o5z2YhlldN4k=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=RDQ7RSgA0Wssf8v+bc7bKnSKOqatysDErj/jvr/sv/cKk2FP3rjgwpCTT338Qer+3RZ3SO2b1l2nFjsxFAhHB7ZhkjclNc5b3npAnE5EBY1LmXcAkMLVzKsL1XJ5+nl6qJCi7ypzE3rMM/Y6n963TaFJCUFbhRd48IxI4SSphbU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=jgAKT0Gq; arc=fail smtp.client-ip=52.101.52.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="jgAKT0Gq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NVIoZQEppQY9OfAaf/mmnII+nxI8oqOnJevoSKEFogn9/JIzTYU713TFIMbMat0T0Xm/rKfO8t/FOAAZR2Daq6e29zf6TGi0QxQK1/pNEBh0XA9tKjBmQuxWgquD1wMsOob7FUT07xYwokaKDONpSyP/rUUfqS6F6hqNGX3uA8gJBu1ZBEQbZNGW3zFILzGPAsthFqaD3J1Q2jNTHegIcu97y5wNZmJvppTucIGd3khamDY7/YlrKkepvzLA6XB8VbT+qBIql7f2ectCdhEJb3HjnQfTud4MYpLymNle4R9akFGxg/P/f0QlsssLDJEoPcuOaWhZm5VCRqhcK0gIqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c13GYpTKUIMSxS2r4kuOiGCqk1anXCVLCxVqtXKNQAw=; b=h594ulUiMPhIrubcS+gpDRlBSk4tPS7dL/yD437Xi/nbFmsDJkNAp40gOev3bf6ArHOXZ+xArDRXr/HAS8vhGyZfb78wthXC4EEwbMaGXaq3WbrWPfNuGH2GSDwyYLfcvL9wOeoRlTp0omDzhLPdzFOCXfbs0nMQd4rZeM9i89uj8G19s9jURWjP1y0znVkpPV2lJJxTtVTTK2lVYiSCSDRdoPcj1g7TARRHTCDwCKAjJYmWVR4aXzgtIof8rFJFwLoWbTsAM4GM7QQp7prIUtFUsJF7PXQytlkdTStHSrvjxHIitRZA6b7B5mjN/VJpNfROF+AQKEF61fQVWQNT4A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c13GYpTKUIMSxS2r4kuOiGCqk1anXCVLCxVqtXKNQAw=; b=jgAKT0Gq17tE6DpMiS3Toz7hEZB72kfNUuOlmGkNtAvgx+oi5i1BMFmFW4s/3KjiZwdApXxtHt2SlYNePpWAJ8d1jOAi6ApcM7tkejHoWXHR4G8SOb/syPmj/S3QFXFMIbMEUNxxw2Qgw3XpCj5k2G1t1bnW9iluk4b13Sqsq+FwIDAqXXk33xoqprDAa3RUiPIvndTtkSBLfJBZMVlxQrYxk4iBcibkHFvlwq6/YxSWRMONdAYKuCexXKqwQL3UcOEN6KTSFelIJKj2QxGsxWRxdNOUWYZdjSk6Iz0ESY052F7GeMmijYyGxjtYG+U2uy9TSx3zslTNhYNYsFwBmA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by CY5PR12MB6227.namprd12.prod.outlook.com (2603:10b6:930:21::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Wed, 2 Sep 2026 09:17:11 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Wed, 2 Sep 2026 09:17:11 +0000 From: Eliot Courtney Date: Wed, 02 Sep 2026 18:16:42 +0900 Subject: [PATCH v3 3/3] gpu: nova-core: use cv! for constant casts Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-cv-v3-3-0f90659e711d@nvidia.com> References: <20260902-cv-v3-0-0f90659e711d@nvidia.com> In-Reply-To: <20260902-cv-v3-0-0f90659e711d@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP286CA0140.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:31b::14) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|CY5PR12MB6227:EE_ X-MS-Office365-Filtering-Correlation-Id: 2da14ee8-4338-48aa-3cdf-08df08d2f87d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|23010399003|1800799024|10070799003|366016|921020|6133799003|11063799006|10067099003|3023799007|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: MtI0ssmKeOfOnvV6hbUlNDHI324pzuedbIxKx2iWA1orm+wsI2lF+FCS0Wi6dArjmOm93DA7CAzgNJuNZOg51kRM0QnXokd7XAWg2ANOFUOfynunp2h4POv/EX53ZqI00hEjvwAQEBHOw5g8OqqVSDpbY4/NkkJRRgxlYrWAGf4NLbPzKbDHDWbLP4OA3UBDuVWqeUdsGR589WBCg9j6sE5b+l1i+Mqw1ZZNZSl3sx+6GqmgDXxNqN9pM7GIhxGhATSgoHJOvioFw2vDkZwn9cChyRZp7rPG7hBOuk7PwChufBBzH6vKl5i0BnPYuDqfOASxih1v1qm+3M13pnf9V70bXgHS9pAwataES1n7Z5ky5zFfrPstU7pSE9D2TTyObwxe1OCK3jDqCOhqMnL8Mt45Z/x2j/aRbmHHs6MiyPWQtt7lQzQuySaERP8Bvm5W+9LL0XSwKMa/2RZ1Thy7dl4uXNoYo7C7CsT0Yxxy+nuu8wrTElNVnZa8FRoJ3Wzvg9RGDkF3SQhux38P8cRi2Gi71HdB/Ng7BMzJauDW0bE6MO84CK9x1/0xX4qSM7uj4weo7hE0+yFBz4uTgP4ivjCHH2TFgNnxoPdiF5Lp4Ah+BRpuSbPGSvl+GOW6SLZR6V3XL24K3syDGinV8WG1J6W1n/3b8uxMHQl2sUfy2Th0kNCe8zXQ0bN+naRAd0rjoh1G1N5BmwlUOYt5JqcgfA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(23010399003)(1800799024)(10070799003)(366016)(921020)(6133799003)(11063799006)(10067099003)(3023799007)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?a0RkTHo5eitLMEUvejRudVZ5VTlrL3F4NkRxOWlTSmcwUElPYU5MZ0RVS2hV?= =?utf-8?B?b0pScitreTliSFdMVmRncUNQYWhtamx0ZGMwdThaeUU0U1VjbHp0ZzUxeUJM?= =?utf-8?B?QVdFZlpBc01xZDlCck93bHQ5UGZPZEJzVzZmdWxvRlVUMHM5aTYyUHZTeDZJ?= =?utf-8?B?QUQzS1Y4TlBZVzVUd2FHbHBuS1MwSVl2N3ZBWCtsQ2NadGw4OHRVN2lSRFls?= =?utf-8?B?VHhQd0NhS2UyS2Fya1pRUGgyT3BpUThVbzdLaXh0aSsrMHVMVnY1NTZUckpD?= =?utf-8?B?dDZlbUVoL0Q3YnAzaG94djVuYldGOG1nbGtIQUZTUnpBZGdmZlhIVlhPWEQ5?= =?utf-8?B?MmYyVzRFREVJNjNTRG80aE9VZmF5ZlJQamJDbWp2akdxQ3RZNW9qVTRHSlhq?= =?utf-8?B?enJlNThwczY2K0NhV2RxL0xvdHYzdXdCRVR1V25kdXBpaldZYmtFcVJFUjFZ?= =?utf-8?B?SjlRbm8rOUphekxoVDViTiswYlcyVjNDclZRZXY2d1AzM0dkR0NKMkwwVnhy?= =?utf-8?B?TnQ4K0hNSVA5cWhNcWdTekxVOXQ4eG4reGpaVkRXZ29SZmVqZFFSb1lTVEhP?= =?utf-8?B?WXFOdkpUU0hIOGZ6TnBlbWdQSzVxR2hwc01NUlRjYytIa3B4NFE3R05BQ0Ry?= =?utf-8?B?OG90anFVc3hUeExnMEMzTWduY2lqeTJRaUhzbTR0YVc4QkNLWTIvWks5MWp3?= =?utf-8?B?YzlBTXdTemZ4ajJwWGdnVE80N1FJVStqaEpydmpwQ0M1S2lseTdKVDZxRHNV?= =?utf-8?B?VFltRXhYK1MyRjg4Y043dWZieEovVE9vOWhzU1V5ZVVyUWVKc0VIQlcrYUt6?= =?utf-8?B?RHN1Y3F3d3pZZVFFd3BnSUx1WEY3NklZZmZUTWdRaXVqTDBrc2s4YlBhZmFy?= =?utf-8?B?blVTN3pLWnpacWxQZlZIUDV3c0FhZ1J2Z3VhbFFVaXZYMGxMTjQ1SXZUU0tZ?= =?utf-8?B?ZEs3cDZLWVBsbHMwaG5nL0xvbWZVZWk4SWZrWW56SG4yVmpwRWhscTdOK3ky?= =?utf-8?B?MHpVTHFoQnNCNEdjeElpaFBjK1BGNTloMzI4ODE4aGJGeFM4MTEwSXBlSW5a?= =?utf-8?B?M0h0UGxWU3dGaDZhU1gwWnJFOGVhOXZOeFVrVENkR3AwbzBwdDNvaHhoeDlO?= =?utf-8?B?c1lobEgvWmovcGsxUE1nTFRpbEM4Q2d6ZnpSOW80a0xNYitnSWE2cm5iN3Ro?= =?utf-8?B?YWRXS1hLWlBPWmVrd2d0TDVJeTZFYTI3amJMelNkVHk2VmdxeXovdWJRYkt5?= =?utf-8?B?dEJyOFJFUlVFZE9CVWJXZ0dPcDhtbHVBWENEQlJHZ09kVzR0MHZNeDJiZVI5?= =?utf-8?B?S293UEhkdld2YW5YVWkxenArNkhvWE04TEZaaGUxcitkNVkvWDd3c1pGZWhH?= =?utf-8?B?ZUJ5Vm5WVDBvZXMyeFU3VVdmU245dFlKZ0Eyc3NDZnhwWlZocTBtOU9uZjQr?= =?utf-8?B?amJLaTExOWpmNG44ejd0Z21rNEMxUXVuS1NMTEQ3V1ZaTkRnMkNqajVORWF4?= =?utf-8?B?eFpGem1kakNuN1g4N3pVbE5tQ0svNGNQcExXVXJtYkxUQnFNNW5PRCtPSldr?= =?utf-8?B?TDhvbFl0RzIxNmNaRlNST3hGTWpJTm5RMVFUUXc5aGZPZHgyMnJuMnhnbnpk?= =?utf-8?B?Z0N3bGNtRDFqd1d2K2FLRm5IczF2WkRQRnRVWGUzVCtISk1ZSHcvNHRQTjVL?= =?utf-8?B?NDI1aVBua3pyVWNZTFgzODVvMytKZ0lVWldtT1g0WmZaSHFhVzJJUFBYMFdT?= =?utf-8?B?QmxJUzJacW9CK084NElFYVdMQnFJRkl3eGtaN2pzTy82am1aWDFuK0gvMjdE?= =?utf-8?B?eXB1bk1vMWQ4V2oycUg2aUxQOGlwdEZqMmt3cUtHTXZmc2wwOEZFSGlmZVJ1?= =?utf-8?B?Y2kvYXpOU05pQ3lMMnFvTVVPaTM5RlpSSmIxemRHYmJUbzc5MCtEclhXdEVr?= =?utf-8?B?dWdLN3lBcW1CUFF6MUVzMUwxWGY2c3ZERTBiOWprY29PblpsSDlndS8vc2ph?= =?utf-8?B?aGFWdy9YalNwaXpvOXhITXZhYmoyMk5NKzFNVjlSNTJKMmF6NDJpanZuWlNH?= =?utf-8?B?NGNIOFBId1dmLzRwZWZIalgwSGliNkJjdXVQNmo3bkUwSzJ1Uktwd3NjdDdU?= =?utf-8?B?TkpERHhLd3FZY2Q1cWo2N2RBZHJDNFJMY1J3b29XaWpSWjI5dzBGYlJIK2wy?= =?utf-8?B?eENuM1JQeEt1b2ZFdzJuRGZXQk1kYnpYY2JmQm9PdTdINHdwWkNIRG42ZTJ2?= =?utf-8?B?WVVoVzduVE52SlNzcnZxQWV0Vkx3NUUxaisvRGhyTlRpYjMxelBGd3VRWlIz?= =?utf-8?B?dWg5N0NueXlpMmxmRm92b1NQNW5MRnF2end2WCszUk1GRlJlbDNQVzB4NG1M?= =?utf-8?Q?8AvFGhVNOHXkkC7IzwGRAJYK4GqF1ZHAPfcuqAF3RTnNC?= X-MS-Exchange-AntiSpam-MessageData-1: yJl0VgoCYAOEnQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2da14ee8-4338-48aa-3cdf-08df08d2f87d X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Sep 2026 09:17:11.7588 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Q19z+sPjHZoEflzU2wiVxcKbI0vCfLEH0mdMF9kUCXZ6DHkIgni60YCvwpAPeiJV/SiDM4Z1CeskjShGGHTiew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6227 The new `cv!` macro allows safe casting of constant expressions in a const context. Update code in nova-core to use it. Reviewed-by: Gary Guo Signed-off-by: Eliot Courtney --- drivers/gpu/nova-core/falcon.rs | 9 ++-- drivers/gpu/nova-core/fb/hal/gb100.rs | 4 +- drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 7 +-- drivers/gpu/nova-core/fsp.rs | 3 +- drivers/gpu/nova-core/gsp/cmdq.rs | 6 +-- drivers/gpu/nova-core/gsp/fw.rs | 38 +++++++-------- drivers/gpu/nova-core/gsp/fw/commands.rs | 2 +- drivers/gpu/nova-core/num.rs | 55 +-----------------= ---- 8 files changed, 28 insertions(+), 96 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 65cb12d26e2b..0e0383331f42 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -29,11 +29,8 @@ driver::Bar0, falcon::hal::LoadMethod, gpu::Chipset, - num::{ - self, - FromSafeCast, // - }, - regs, + num::FromSafeCast, + regs, // }; =20 pub(crate) mod fsp; @@ -510,7 +507,7 @@ fn dma_wr( target_mem: FalconMem, load_offsets: FalconDmaLoadTarget, ) -> Result { - const DMA_LEN: u32 =3D num::usize_into_u32::<{ MEM_BLOCK_ALIGNMENT= }>(); + const DMA_LEN: u32 =3D cv!(MEM_BLOCK_ALIGNMENT); =20 // DMA transfers can only be done in units of 256 bytes. Compute h= ow many such transfers we // need to perform. diff --git a/drivers/gpu/nova-core/fb/hal/gb100.rs b/drivers/gpu/nova-core/= fb/hal/gb100.rs index d9e4d62ae632..0bf00d381607 100644 --- a/drivers/gpu/nova-core/fb/hal/gb100.rs +++ b/drivers/gpu/nova-core/fb/hal/gb100.rs @@ -26,7 +26,6 @@ hal::FbHal, regs, // }, - num::usize_into_u32, }; =20 struct Gb100; @@ -82,8 +81,7 @@ fn write_sysmem_flush_page_gb100(bar: Bar0<'_>, addr: Bou= nded) { =20 // This PMU reservation size is r570-specific. pub(super) const fn pmu_reserved_size_gb100() -> u32 { - usize_into_u32::<{ const_align_up(SZ_8M + SZ_16M + SZ_4K, Alignment::n= ew::()).unwrap() }>( - ) + cv!(const_align_up(SZ_8M + SZ_16M + SZ_4K, Alignment::new::()= ).unwrap()) } =20 impl FbHal for Gb100 { diff --git a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs b/drivers/g= pu/nova-core/firmware/fwsec/bootloader.rs index ec4d92317a93..b51aca619a8c 100644 --- a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs +++ b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs @@ -14,10 +14,7 @@ dma::Coherent, io::{register::WithBase, Io}, prelude::*, - ptr::{ - Alignable, - Alignment, // - }, + ptr::Alignable, sizes, transmute::AsBytes, }; @@ -134,7 +131,7 @@ pub(crate) fn new( let code_size =3D usize::from_safe_cast(tlv.get_u32(b"CDSZ")?); let code =3D blob.get(..code_size).ok_or(EINVAL)?; let aligned_code_size =3D code_size - .align_up(Alignment::new::<{ falcon::MEM_BLOCK_ALIGNMENT }= >()) + .align_up(cv!(falcon::MEM_BLOCK_ALIGNMENT)) .ok_or(EINVAL)?; =20 let mut ucode =3D KVec::with_capacity(aligned_code_size, GFP_K= ERNEL)?; diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs index ab685fb4168f..e15d0af95499 100644 --- a/drivers/gpu/nova-core/fsp.rs +++ b/drivers/gpu/nova-core/fsp.rs @@ -47,7 +47,6 @@ NvdmHeader, NvdmType, // }, - num, regs, // }; =20 @@ -285,7 +284,7 @@ fn new<'a>( }; =20 let version =3D hal.cot_version(); - let size =3D num::usize_into_u16::<{ core::mem::size_of::() }>(); + let size =3D cv!(core::mem::size_of::() =3D> u16); =20 Ok(init!(Self { header: FspMessageHeader::new(NvdmType::Cot), diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 6da728201281..bf8ade55b304 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -162,7 +162,7 @@ fn read( #[repr(C, align(0x1000))] #[derive(Debug)] struct MsgqData { - data: [[u8; GSP_PAGE_SIZE]; num::u32_as_usize(MSGQ_NUM_PAGES)], + data: [[u8; GSP_PAGE_SIZE]; cv!(MSGQ_NUM_PAGES)], } =20 // Annoyingly we are forced to use a literal to specify the alignment of @@ -235,8 +235,8 @@ unsafe impl FromBytes for GspMem {} impl DmaGspMem { /// Allocate a new instance and map it for `dev`. fn new(dev: &device::Device) -> Result { - const MSGQ_SIZE: u32 =3D num::usize_into_u32::<{ size_of::()= }>(); - const RX_HDR_OFF: u32 =3D num::usize_into_u32::<{ mem::offset_of!(= Msgq, rx) }>(); + const MSGQ_SIZE: u32 =3D cv!(size_of::()); + const RX_HDR_OFF: u32 =3D cv!(mem::offset_of!(Msgq, rx)); =20 let mut gsp_mem =3D CoherentBox::::zeroed(dev, GFP_KERNEL)= ?; gsp_mem.cpuq.tx =3D MsgqTxHeader::new(MSGQ_SIZE, RX_HDR_OFF, MSGQ_= NUM_PAGES); diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 05f54fee6186..33ec3d983c08 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -57,7 +57,7 @@ =20 /// Maximum size of a single GSP message queue element in bytes. pub(crate) const GSP_MSG_QUEUE_ELEMENT_SIZE_MAX: usize =3D - num::u32_as_usize(bindings::GSP_MSG_QUEUE_ELEMENT_SIZE_MAX); + cv!(bindings::GSP_MSG_QUEUE_ELEMENT_SIZE_MAX); =20 /// Empty type to group methods related to heap parameters for running the= GSP firmware. enum GspFwHeapParams {} @@ -110,20 +110,18 @@ pub(crate) struct LibosParams { impl LibosParams { /// Version 2 of the GSP LIBOS (Turing and GA100) const LIBOS2: LibosParams =3D LibosParams { - carveout_size: num::u32_as_u64(bindings::GSP_FW_HEAP_PARAM_OS_SIZE= _LIBOS2), - allowed_heap_size: num::u32_as_u64(bindings::GSP_FW_HEAP_SIZE_OVER= RIDE_LIBOS2_MIN_MB) + carveout_size: cv!(bindings::GSP_FW_HEAP_PARAM_OS_SIZE_LIBOS2), + allowed_heap_size: cv!(bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_= MIN_MB =3D> u64) * u64::SZ_1M - ..num::u32_as_u64(bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_M= AX_MB) * u64::SZ_1M, + ..cv!(bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_MAX_MB =3D> u= 64) * u64::SZ_1M, }; =20 /// Version 3 of the GSP LIBOS (GA102+) const LIBOS3: LibosParams =3D LibosParams { - carveout_size: num::u32_as_u64(bindings::GSP_FW_HEAP_PARAM_OS_SIZE= _LIBOS3_BAREMETAL), - allowed_heap_size: num::u32_as_u64( - bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_BAREMETAL_MIN_MB, - ) * u64::SZ_1M - ..num::u32_as_u64(bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_B= AREMETAL_MAX_MB) - * u64::SZ_1M, + carveout_size: cv!(bindings::GSP_FW_HEAP_PARAM_OS_SIZE_LIBOS3_BARE= METAL), + allowed_heap_size: cv!(bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_= BAREMETAL_MIN_MB =3D> u64) + * u64::SZ_1M + ..cv!(bindings::GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_BAREMETAL_MAX= _MB =3D> u64) * u64::SZ_1M, }; =20 /// Returns the libos parameters corresponding to `chipset`. @@ -682,12 +680,8 @@ fn id8(name: &str) -> u64 { id8: id8(name), pa: obj.dma_address(), size: num::usize_as_u64(obj.size()), - kind: num::u32_into_u8::< - { bindings::LibosMemoryRegionKind_LIBOS_MEMORY_REGION_CONT= IGUOUS }, - >(), - loc: num::u32_into_u8::< - { bindings::LibosMemoryRegionLoc_LIBOS_MEMORY_REGION_LOC_S= YSMEM }, - >(), + kind: cv!(bindings::LibosMemoryRegionKind_LIBOS_MEMORY_REGION_= CONTIGUOUS), + loc: cv!(bindings::LibosMemoryRegionLoc_LIBOS_MEMORY_REGION_LO= C_SYSMEM), ..Zeroable::init_zeroed() }); =20 @@ -715,12 +709,12 @@ pub(crate) fn new(msgq_size: u32, rx_hdr_offset: u32,= msg_count: u32) -> Self { Self(bindings::msgqTxHeader { version: 0, size: msgq_size, - msgSize: num::usize_into_u32::(), + msgSize: cv!(GSP_PAGE_SIZE), msgCount: msg_count, writePtr: 0, flags: 1, rxHdrOff: rx_hdr_offset, - entryOff: num::usize_into_u32::(), + entryOff: cv!(GSP_PAGE_SIZE), }) } =20 @@ -947,9 +941,9 @@ impl MessageQueueInitArguments { fn new(cmdq: &Cmdq) -> impl Init + '_ { init!(MessageQueueInitArguments { sharedMemPhysAddr: cmdq.dma_addr, - pageTableEntryCount: num::usize_into_u32::<{ Cmdq::NUM_PTES }>= (), - cmdQueueOffset: num::usize_as_u64(Cmdq::CMDQ_OFFSET), - statQueueOffset: num::usize_as_u64(Cmdq::STATQ_OFFSET), + pageTableEntryCount: cv!(Cmdq::NUM_PTES), + cmdQueueOffset: u64::from_safe_cast(Cmdq::CMDQ_OFFSET), + statQueueOffset: u64::from_safe_cast(Cmdq::STATQ_OFFSET), ..Zeroable::init_zeroed() }) } @@ -969,7 +963,7 @@ impl GspAcrBootGspRmParams { fn new(target: GspDmaTarget, wpr_meta_addr: u64) -> impl Init { let params =3D init!(Self { target: target as u32, - gspRmDescSize: num::usize_into_u32::<{ size_of::= () }>(), + gspRmDescSize: cv!(size_of::()), gspRmDescOffset: wpr_meta_addr, bIsGspRmBoot: 1, wprCarveoutOffset: 0, diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index 6dc31d1bf5ae..384eccf3c44a 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -82,7 +82,7 @@ pub(crate) fn new(offset: u32, value: u32) -> Self { =20 // We only support DWORD types for now. Support for other = types // will come later if required. - type_: bindings::REGISTRY_TABLE_ENTRY_TYPE_DWORD as u8, + type_: cv!(bindings::REGISTRY_TABLE_ENTRY_TYPE_DWORD), __bindgen_padding_0: Default::default(), data: value, length: 0, diff --git a/drivers/gpu/nova-core/num.rs b/drivers/gpu/nova-core/num.rs index 6eb174d136ab..2e5c9937b3a6 100644 --- a/drivers/gpu/nova-core/num.rs +++ b/drivers/gpu/nova-core/num.rs @@ -96,8 +96,7 @@ pub(crate) const fn [<$from _as_ $into>](value: $from) ->= $into { /// /// Prefer this over the `as` keyword to ensure no lossy casts are perform= ed. /// -/// If you need to perform a conversion in `const` context, use [`u64_as_u= size`], [`u32_as_usize`], -/// [`usize_as_u64`], etc. +/// If you need to perform a conversion in `const` context, use [`cv!`](ke= rnel::num::cv). /// /// # Examples /// @@ -164,58 +163,6 @@ fn into_safe_cast(self) -> T { } } =20 -/// Implements lossless conversion of a constant from a larger type into a= smaller one. -macro_rules! impl_const_into { - ($from:ty =3D> { $($into:ty),* }) =3D> { - $( - paste! { - #[doc =3D ::core::concat!( - "Performs a build-time safe conversion of a [`", - ::core::stringify!($from), - "`] constant value into a [`", - ::core::stringify!($into), - "`].")] - /// - /// This checks at compile-time that the conversion is lossles= s, and triggers a build - /// error if it isn't. - /// - /// # Examples - /// - /// ``` - /// use crate::num; - /// - /// // Succeeds because the value of the source fits into the = destination's type. - #[doc =3D ::core::concat!( - "assert_eq!(num::", - ::core::stringify!($from), - "_into_", - ::core::stringify!($into), - "::<1", - ::core::stringify!($from), - ">(), 1", - ::core::stringify!($into), - ");")] - /// ``` - #[allow(unused)] - pub(crate) const fn [<$from _into_ $into>]() -= > $into { - // Make sure that the target type is smaller than the sour= ce one. - static_assert!($from::BITS >=3D $into::BITS); - // CAST: we statically enforced above that `$from` is larg= er than `$into`, so the - // `as` conversion will be lossless. - build_assert!(N >=3D $into::MIN as $from && N <=3D $into::= MAX as $from); - - N as $into - } - } - )* - }; -} - -impl_const_into!(usize =3D> { u8, u16, u32 }); -impl_const_into!(u64 =3D> { u8, u16, u32 }); -impl_const_into!(u32 =3D> { u8, u16 }); -impl_const_into!(u16 =3D> { u8 }); - /// Creates an enum type associated to a [`Bounded`](kernel::num::Bounded)= , with a [`From`] /// conversion to the associated `Bounded` and either a [`TryFrom`] or `Fr= om` conversion from the /// associated `Bounded`. --=20 2.55.0