From nobody Sat Sep 26 13:46:47 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012040.outbound.protection.outlook.com [40.93.195.40]) (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 CFC2437B012; Tue, 1 Sep 2026 05:07:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.40 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788239232; cv=fail; b=B3AnCr+D0J1FRTjTx4OkOXVAwhEAMb5NleBsTLRX/XZYRUI95Rfi6YKOgwMIGOnx4Yop50ek5fVMRJCIPjL36Y9gfFCaK7sKoTzaEkBXSReqOG0cwIxp2JgLbc2c0fmuq9D0gNg6Rz03yT2nYp2TRekaixzMHHsqH/wHDZpMiNY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788239232; c=relaxed/simple; bh=zCA+7k1YmRNbq5mK8JNPRmJOkN1iTeOLW0ried5pXPQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=XqNkrRu5WGnc8DC5+ZJgWa4E0V81zK4Qt2K5rcjucgLAtg40WznBsiCL+o+rzvOEiO+SPurvzdv/NYBqMYT/Q6bBW1p/lsimcjRGs8qbtmNG+Sr+vxHHD8rEvWFi7S25h70jWNf30TLTBMN5A/uOIJ3VOae2oIUh/Q+6c+O7sBg= 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=H9Q8LS9w; arc=fail smtp.client-ip=40.93.195.40 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="H9Q8LS9w" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dQ80nmOr6hVsfYlMZmUFYjIazRwf9VL/IxsThPr4xXQ7jfiU+NiOlaWj1awO+++SZyabP2S/R+v9jqPKClhMETfuZWR3CyPQt5tCvcJ8j9dbIXW+yR+9kREZS9UvnWK21DKMAYH0WvKl2gOojBeUxDHMV5MaZmlHaiFCDmHE1l0M9jV4xee9OZlXdsu2ZWnkbwt363Yp9CV0CJBX28/rrStHma/+O1oYfZqZ2pMsrq2t+zruDFbKtZgHiVqSUv1gi7IOnWj/1xzZ5zhXy8nbo7KJDdHuhJQIKGCfJFGOuli5pxcLoDxQToBjJw/zceTTG0SkY/GKKHEote3sEOVtVw== 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=Nx+YOVj9BOadj8fcx8ZuWX4Mp+U3Dt8u6kYXRmeN0Uw=; b=sLuced9qIjQIRBXBt4oGlqUGLE40d5xgeBImMXYzIx475zcm8E5PwH9m+aPCwW9RPzGqBSYQzfLkWsb4nyvJV0VvWHKTIk2KNVjklQThJdGuKNz2AJPXwUZcQnlPTPwkb1TfRVK/m+IhwNNwikvct5rqMNmK9It61jzFryhIp8rGWYWqzUYoEdB5vKwsY8nBGZWVg4xreodC0b3rtZZ4pgLhHDyS31CzOHxujhlwOI5Aj2UDU/vt18+bPQzr2MZmh5WEzjw9rBGpQP/dWYgZSHjtUi2Ufs5Fh/jGKQLOfp1ZgAQ9jvX2xRg/sCuylf6EQNgCdFl4u9QgG86sq1nEHQ== 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=Nx+YOVj9BOadj8fcx8ZuWX4Mp+U3Dt8u6kYXRmeN0Uw=; b=H9Q8LS9wfpbaoxTWaBDHDRhdfSpYLVM6PHzaBRDs3cy56F2hQx0G8zzwglmoC/UloIBlapFA+6y2BpvS0UCDDmHfYxTgr6uJanamnr0w8hX3QMhlMkCWUhyTV/sLNNM4rDSDycr8Et5uatbSkTYqsmSCilMfRdCRaBMUY8rMAqQVmQIlCakvarndFROQNPC+LmhDKyEl1EgN418EZ0LHx4BYrNAHtKFlfShKubxzC2ZAZm5zIp/PfAJ/G02fGKCvbsIUPtzv4P9gDTreFTwF4SAY/rx9SvVvSTGtVvoiNuzdr5NQiGZ2uNQDO9qxjHA0ZJS4nARKbYOlH3meOueyKQ== 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 DM6PR12MB4355.namprd12.prod.outlook.com (2603:10b6:5:2a3::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 05:07:05 +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; Tue, 1 Sep 2026 05:07:04 +0000 From: Eliot Courtney Date: Tue, 01 Sep 2026 14:06:40 +0900 Subject: [PATCH v2 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: <20260901-cv-v2-1-446bc69d2ade@nvidia.com> References: <20260901-cv-v2-0-446bc69d2ade@nvidia.com> In-Reply-To: <20260901-cv-v2-0-446bc69d2ade@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: TYCPR01CA0172.jpnprd01.prod.outlook.com (2603:1096:400:2b2::9) 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_|DM6PR12MB4355:EE_ X-MS-Office365-Filtering-Correlation-Id: da8bc651-2ee9-4405-427f-08df07e6dd34 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|10070799003|1800799024|376014|7416014|23010399003|18002099003|22082099003|56012099006|3023799007|6133799003|5023799004|11063799006|10067099003|921020; X-Microsoft-Antispam-Message-Info: 8DjHlU5N2CQnuva6DIO6GKKc/S9Tg+3cEyR7smh1Peb9BfYLcNMbao9uUMdGNDtJ1IO/jM/R9m9Z5N7PbUQC7mL+q0UDlMuQqcbX2FCKay3prtJKLZ+TAUVrnCGOM/Ocqdy7+zYpMdD5wt0is7yuWBlHIxKfB+tm57KCabJU8RTNFgjoqW1/RSPt00x5YJHhubKKSI9u658JkZtiyJ3CsJCyW4oucpwKY4X2UIl5qNMjYn3hcwZM+px748OeDF083EyoJIkRo8JtdEZPY1SH+LrSTbOc6Y4SK8gych8nULQgVhr0bRzX2Yo5pZdZfFoMV5u9HwcQLCrOVoaBK8wFiKriNNjL/A41uRAmRPLl1hgmCo503iewI4oUDoJJ4bhACENuGc1pPs0OAyvG+ischyaYjqVdmhKuCK0PwoFoIuXiVf3kqiDHnV1NNdivYasKZfExwnDIt2MFZzjBVYtb9qMwYDeI23RgUrsCqKMP95GbCFcUo2c4Kzn80/cdTNDvwJAass0lC8LMmq30mCcyXqNKiTuq5pMn8BIcFhwAUkusqzRmI0MD2kx/QuBX0rhnx0JxFt8OIWyeDs/jsksR9D9fHVyBB05x6PCT334BTmiR8Rjuk/IjgkdlF0yTyQwNY36WKNhS38aovVA4F8JCUAKJLtdOLhwZjnZkxrUsEORQgcV7TaWU0NDoakwLcvafdm2p2U/rlYApsdvUhbeQuQ== 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)(366016)(10070799003)(1800799024)(376014)(7416014)(23010399003)(18002099003)(22082099003)(56012099006)(3023799007)(6133799003)(5023799004)(11063799006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?YUxvLzdXdlhQQldwVFVJdlcxb3lFdENESkhmR2pqNW5MVHd6SWxmSTF1LzRn?= =?utf-8?B?SitnRWtUNlZsN1hvbGx1MTl0ak4yY1BKYnJFZ1IrOWNBekRSb2JpM284MnFK?= =?utf-8?B?UGl1TDBmaXoveGxjU0RZQ0xLUHhkUVkzcW0xMXFIWGRUUU43enhKc21mZkxw?= =?utf-8?B?ZnJEKzFDUm55ZS9hRW04TWxDdE95Zkg4MlZDamJiSkhWQm1hMHRCaklsOXRP?= =?utf-8?B?RG5XUWgrTlg0aFpQUkhvN1R4cXRHR3Rhc1k1ME5NM0lZb25HZWVwOGZINjkr?= =?utf-8?B?RUhTa1VkRnNldU5wcU56Q1VGV25LOTM4MU5iY3dRN2lsbWxVdmQ4L0hMRWg1?= =?utf-8?B?bjFVU29Td3ZjV3gxUmg4Sk4zRHIzTnpLZXdnTTlLNlVkRXBWcnFIdmQ1amJU?= =?utf-8?B?bVhzNTdTSzJSMGRxYVJEdlFyMStlcHczMjFLeTNLMjdpUTN2UllRTjh0TWxs?= =?utf-8?B?MzZhdlZ1OTBrRE05ZjBIL0MrS2VqZDdqeVJtaERwU29ZK09rdzRLQXp6dTBj?= =?utf-8?B?bndGS1pLak1peUJ4RVR3eENLT252VnRaR3FGNnlXT2lBMWZBamNIaDlnVHBz?= =?utf-8?B?RCtUbWlVck1lV29WNDlNVXI3THQ2U2J5RWZHOHhFT2hpS1kzZzhnNFhIN0w3?= =?utf-8?B?UGIvd0dtZllxL1RVdjhjZm55eVB1ZnE4ZGxCdjRBbS93a1dCN0VTMzhKdWV6?= =?utf-8?B?OEFnK05qYlZUNTYzbnd6YldmSmw4cnVjVmF5NWRwZ09lSkxBTnRObFRKZXZa?= =?utf-8?B?M3ZnVjNqbTlZTzdTZ2VubzhpbUY5emxvYVBYbU5uOStZWVdDcGlvM0tPUFFO?= =?utf-8?B?WDVUSm1Xem1KWGtRK0Y0NmFkUVBUZE9PTzB6NVN4VDBSUXVHZzlJM1djTUlD?= =?utf-8?B?ejllaWhvRlhMemtwdlgvOXVhUnJlVmpRSkJWRlFvSWhVQjA4WTdXQy9mUHE3?= =?utf-8?B?Mnp4NG4yanZQdi9WNTVWNVRCZnY2a1VLcFlxK0pNSXVaQlNYaEt5SElnc3dk?= =?utf-8?B?MHBIeDdlN1NmMSthSk5iaWhIc2QraXdwRVNlNHUyMjlMbEVFL1c3aE1OYmk5?= =?utf-8?B?OGliZkNlYVhYbW13bmNYT0xKanljVGFQdWlWNkFpOHplR0ZoNWxpdWZwQUp0?= =?utf-8?B?azdvQzBNL2JGTnAwMmVYYk1yWE5pc3BpY3pSaitsRVg2NFVQWnQ0ZlNBUjFM?= =?utf-8?B?T1RxZ3gvb1ZqSmZiMXI4MlFOVVl6cnBNY0lkM2dkSzg1WWk0V29hZVQrbFg1?= =?utf-8?B?Zmg2NFd0R0FMaU55ZTMrbVVhSUwyWTNrVElEa0pTbUgxV1NEZ0M4cGtUQXBu?= =?utf-8?B?VzdwZWlXSVN2MlliMFVYZXdZdWF6c3NiZ2R1blRxdGY2L1RpUzlVbmRxYk9S?= =?utf-8?B?bEw4eU0vRlJwNTVMSEYrYXBVRFpvVTdTbG0vMCt2SVlRTVNjR3BmNGZPajJs?= =?utf-8?B?bVVCbTBiM3FkcSs4R28xS2pnZWs2R0xOYTEwdGt4ZWYyY2M4V3VCNXVvTHY4?= =?utf-8?B?VTJJQzhYdnM0cXZkSUM1aHRnRVJZdGw2eXQ3WTM3eGVDZzF6eU9EcEVZOTZs?= =?utf-8?B?YWhFZXdsZ0NLcVV2MnlDM3gzMEJtOWZxRis1UE9QeWtYUkFpem5tMUYrd01Y?= =?utf-8?B?anRvMTQ0OFU1ZjVuL1JRYmNQVEtSMHZiYy9hTk9FU3JuT0YwMnVvM0NxMkhF?= =?utf-8?B?OUNMcUYvcE1hWVFkOWhmNE9xRE5hN1I2cjVpWW14ejFzbUI1N29ZVFpzU3M5?= =?utf-8?B?MTAzTDNodU9lOHpnUlRhR3hHbkoxamRkNGE3ejBzRnpxNUx5Vk9jZ3BXNzJo?= =?utf-8?B?Y3BCaE1xT1cvUjc0YUIvTGp1RTZTRHlLVXQ1VTNlL1ZudEpqeUVZbm1nbUVv?= =?utf-8?B?T3FEM3NiS2wyaDdmMmU4OSs0Tk12RnVOZWpEVlBrOEo3aUdoUkdXUkxBL3lo?= =?utf-8?B?dkx6MmxSRm10ZDJyM1NKemptV1dVZTdzbUxBZ3paYThqd1RWRFdXeXZhc01E?= =?utf-8?B?MG9KbjVVWDE5OThsMW4wUXY5QUx4cjkvRlhQb0NRN3FvbkQ1NW01UUdZNWpM?= =?utf-8?B?dGNkOXgzcDBZUkJ3N3EzdGxIemVRVTJva2ExY1F5M3BEUk8rVWFFQnlzbllv?= =?utf-8?B?RGhVWCtWME1VdGY3ZlhqNENsc0V1OERWM1dFRkpYSFNyVE5QczFSVkFoWllX?= =?utf-8?B?S1BiSVo3d0M3R2ZFYXNSTXBKRGd6Y1FUY0JVVFZVaW5BR2owOVB0Qi9waEQz?= =?utf-8?B?OXNFOEdHODV3aTZ3QkxSY1YrR25nWGZxK0tnNklhTWoycG02ejlRdEhCdmQv?= =?utf-8?B?cGtlQ2loUlVVTTA2U0hlcmZ3TzFHdGQ1TFpiblRYSDFnL0hJMFVRUElrd3hN?= =?utf-8?Q?H/X8p4bzKWpLeaRM99OggdRG/oF5ooy01QfiET4pwwR3A?= X-MS-Exchange-AntiSpam-MessageData-1: PsixfWShU6/YsQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: da8bc651-2ee9-4405-427f-08df07e6dd34 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 05:07:04.6554 (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: sOEOLN4dfDOfEZm1Y2WH3XxSgNZMMG0ovbCC0k5EkHoyNNcz5AGtR5WhL72Rly1e+1iBnDTc2kFRzZ5QRCAdkw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4355 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 --- rust/kernel/num.rs | 133 +++++++++++++++++++++++++++++++++++++++++= ++++ rust/kernel/num/bounded.rs | 19 +++++++ rust/kernel/ptr.rs | 14 +++++ 3 files changed, 166 insertions(+) diff --git a/rust/kernel/num.rs b/rust/kernel/num.rs index dbe848e30efe..01ae2538b3e4 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,138 @@ =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. +#[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 0, "Constant cannot be zero."); + const_assert!( + V >=3D <$type>::MIN as i128 && V <=3D <$type>::MAX as = i128, + "Constant cannot be represented by the underlying type= ." + ); + + core::num::NonZero::new(V as $type).unwrap() + }; + } + )* + }; +} + +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..0cfb3ef16a6d 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..ecb73bdb0c5f 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 13:46:47 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012040.outbound.protection.outlook.com [40.93.195.40]) (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 BB3A037CD3D; Tue, 1 Sep 2026 05:07:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.40 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788239234; cv=fail; b=FOu+4MLftw71ZHWug1mcf+WOn5rEKe8XTtik1MnzXuLhDYaxVaR3GpRTg8xcCA8USXQu8aDsy6aElhj5tSwvFSY34iQFg09Uz6U1m/K2nIG7TNCMs/wqc8ZtJQ8f5Qa0k0TyGt0uouWDEwv1238ZEM3usnop02saEFareuMapxc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788239234; c=relaxed/simple; bh=sHsWTA2t+BukvH1dFjd4NSkc1Jz0OCpoMCoiVS1iqlY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=EexAMdqmm2DHiQtdedPIDx3u+JIoJDUqPmFQfROomPk2Ov8HKQ3bZboOCiiUogzdUbw2su68a+b22zj6xBSRi442QcwBUIjPzcn6k+136752p5JUVqcrATRrV3uSH23Dkm28BvgWvHpDrSETkCHks8x+jOim6T/cuJhPO2xVAzc= 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=Cz0N78k1; arc=fail smtp.client-ip=40.93.195.40 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="Cz0N78k1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ofFjiFz0iGr+it6MxoTPwc8rCmmkPsZIou2BzP41xvrz9/LgU9peU1rHhwZa16xhWnn2PcsLCI6VQIZogoihuIGlsigcUDB6RooOh2L245JfRHfe7KH5IfFAXAkg2/gIfmuQX2HFH1/1607V+MBJbvSEQ3quYvIezAPknJbepT90lPKtX/K+2I80bhfFpvtIPgBMRp7Hy7AGQJ33Q9qI8V3GVoPyQd8Ffyb9yg1QFtSPxE7Unj5z+hTzz1l5AxJLscRbH39vhqHYDI21t6/aqH/qpuCZIHrAqRYKPULY1QBuPAaw2XzGDVabExs0+ZXhn00OpaeWY8tlwKbw22Ktmw== 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=kQpZ3a2f+LqsfUy7ar+HiczTCtS9VKXENlMnptM23LA=; b=rkpI1XzbZr54WfE/V1O7oMoqrml34ZVA9QrsSQm0we8B7KxLnjmzj7qkuiQKF2XjHUjXrZkEC3jxuon1ir58KOvJb+bJfkyiXpyEBM9WsfGgBTUP78loQlnqqi9ymDWp1S7zKjnHtPizOsDLb3KkxOqBMJ+DfIUCAIbLRvNaVrq+2HFM2mUPxJJ0BJfTZQk/wogkzGN/6cU3n5JrnQvl9VepZrz02zfPh9bmA3E+gTKNWGx6ajdR9v4jv85YWm903MCnQgrDXl2d9M6ufZW5SJ3DLBKTFqhlnsBBqxKN/tCJbh4ON+JZwsUxfmZv1jM8J0PRxSMcyb4Gr7IOYvjkMA== 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=kQpZ3a2f+LqsfUy7ar+HiczTCtS9VKXENlMnptM23LA=; b=Cz0N78k1CoYLABEW/4opVxSHqPmtfBlHOMhovuu+JOChBTfk1sYPTKk66BIqgvG1a2NFd/H5wA8HYumYR+AZcm5lso0s/sQr7gUIP56bkQfHVZHcGVTi8La21HbzB64Bhs38mhPXNmy3YtTkvdjfTYylS2ydrixU6vb95K8kIpDYbg6vjum3ALwG0cImh1am9HQ0pHPsTRJADnFDRalcvnYEwbk2tJjl8q6AXqtY3EIpQtsqCB8IbetVEBLb2TrK0hTFFPdQQtOSzCu6mlC2tZR092Z73T3xDXeQs16/hBRl3m5ns7fPUMQiRAbx7mzQqLyv3q1cTItLE6wP1+TgBw== 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 DM6PR12MB4355.namprd12.prod.outlook.com (2603:10b6:5:2a3::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 05:07: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; Tue, 1 Sep 2026 05:07:08 +0000 From: Eliot Courtney Date: Tue, 01 Sep 2026 14:06:41 +0900 Subject: [PATCH v2 2/3] rust: prelude: add `num::cv` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-cv-v2-2-446bc69d2ade@nvidia.com> References: <20260901-cv-v2-0-446bc69d2ade@nvidia.com> In-Reply-To: <20260901-cv-v2-0-446bc69d2ade@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: TYCPR01CA0161.jpnprd01.prod.outlook.com (2603:1096:400:2b1::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_|DM6PR12MB4355:EE_ X-MS-Office365-Filtering-Correlation-Id: 420e984f-18b8-4a75-e8f8-08df07e6df5a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|10070799003|1800799024|376014|7416014|23010399003|18002099003|22082099003|56012099006|11063799006|10067099003|921020; X-Microsoft-Antispam-Message-Info: VOoHi79sIzVh7mlEXSKCQCe4a/47kn2rXQvRuNFbl5Zk+yXlp/lp3zr3mnL5T/eqfSC592Gv9jaT44ktEi+zJkkXmJH4PJaPe+ubKs8Pm5CIISo/fcIuyMUSUaxiyj9fnRDYLZwYGPUY2/98h/PerbINlFlFREaFKTrjMuKeh13AQiRWXPjwZfOoYY/wT0M3ZkUg25i0BbO4zSFOiUrSK3ClZOX25GBaTv1wCRVIiHjbDZTBB1evS3Ie7QzhoBy3LyMBanApB591VRBbSs6Z0iKr1lvjmCKCGy4CD2ikzNxsNrw6ph7yA/TMWoMaVMkkGDOINQGvw/1/vfz+XRHBSa/jk1LTEFkUWpk0AQ3D7jwJT+3nImoRe0FD4nxh5h7arYWooNvR3K4hfoqPZDdUN6Mordt1G68E+yTAj9fuS5KfrHmXcC+pHe0Et8nW1PBEH2Vc7IO6s//52gcqdlELJDUXh/Fqud++kS24qU6LRQbtWbhoCQZyLZrxnUYjVD4NMUG4Cz9UeAoK17u+Bnrz783h/WiJc+YKL7RXi1hB9JHWCPsud38eb5FkpfaEnGQ9F/4xwB0I3Tf9/XWiRcr42Wr/1oTsQ8Q5FP+8M4eTbzD5nq/2EA/uElIXp/nZqV68qkFr4C4Xv5RIR78aBTTEk0vyA+F16BRmyKS9LQsUujWl5BeGWZdwJxW/c7N/KGSDHzUrI0i58VXqhgXVkR6bvw== 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)(366016)(10070799003)(1800799024)(376014)(7416014)(23010399003)(18002099003)(22082099003)(56012099006)(11063799006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ankydmJOUjJ2Z2xQbjhZNktvcDJQWGNiQ2FwOWoxVTFmTVMzUGVSS2RCMGtB?= =?utf-8?B?NnNuQUd1RytLNFFiOVpERlh3SkZvcHJUaGVrUC9VRm95VzBPcjQ3b3RWME80?= =?utf-8?B?bERZeHVYU1prcVNIVnpzQ09MaFd3ZXdSSVRVU0NKb2tKQzhtZmNCT09JZDlO?= =?utf-8?B?cjlRMDlWTkFodTB0eGNRWTBoUG1TUlF2Sm5pTU1wbHpjK2dZNExJWmhXMmJo?= =?utf-8?B?dHFtcHdLT2YyOG5EeHJFcGVqK2Nid0lFL0NWbVFIdzl5bVlsS0NaSitlNyt3?= =?utf-8?B?T09FN1lWRUdnWFRXTjFqTUtHbGt2RkYybSthUUhHSXp3ZHAySGt1S2EyY0pl?= =?utf-8?B?M1pXdUVObmx2UW5DNUZwd3VQQkZjb2N6Nm5sWnpQN3F1dHYrUFpISHJJZDNE?= =?utf-8?B?S2lxUXZkSmVLdXMwdGNlallVdGhUK0JDdzhZdmxwak1QbS9JS3RCZElQY2Rm?= =?utf-8?B?WXA5YndJcldHd2lad0NnaTRDeFdEaDk0SXZUZ0ZraEx4QTJibHJ5cDVueTQr?= =?utf-8?B?TlVpb1BlLytXSG1TY0tzNXNyQVhpSVBRaXU1S1Zac0hYdllSZm5md2g3OSsy?= =?utf-8?B?eTNFKzBiNkFtMm9OZU9lVTdMUVY3S0ZDSnpoc0J1bmhpZnhZSDhZSGNBeHhR?= =?utf-8?B?Z2wwS0o2Vm9NdE5jVXpSNUtUNnFSNFRSMVZnckNoZ3VGRGRRRlRvV3piUVpm?= =?utf-8?B?Szd5UU5RWHo4VTdWNjR3SWV2ak92aVgyY2NYWW1Kdk8rL0M4VnFidUpGeG5L?= =?utf-8?B?SjFuMVNuTDJEL3BLRTgvS0Y0MEptcklYKzVLSkhKYnl0QWx2bkxheGlSQjk5?= =?utf-8?B?bnJLK3JhWHR3SmlscDQyejh1V2ZCT2phbTJacFUwV08rekFiUEpwRVBPWERn?= =?utf-8?B?UjJHMWoxd1F6SmJUZHpEN2NJTzc0S05TRG9CdFNsRE40YjMvMGFVK0d5cEhY?= =?utf-8?B?M2xMb3doMTVodlZEUDhwWXdvM0M1WnhsR0FPdytLTjVnTWZURlkzUWdVakUr?= =?utf-8?B?ZTFrcktyZGxudGJnMTQ1NGVGbFVwZDMraWo0ZFlJMlpJa1VOSWp5MDhnSjBu?= =?utf-8?B?b29uOHgvak8vd1ZPNTlYZHZHYkZQRGFYUWFwSTV6aFVJK3R4TWRNcTNPR25p?= =?utf-8?B?K0J2cnlObDlQUmo5NEQ2Y0l3clBHZTNRdXBVd0p4Kzhwbmc4RkFMQnhHMGw2?= =?utf-8?B?bHdxc1VZakpodDM0VFBmRUJkdG9BMHNFd2NjNWtHNXpZZzhFeXNLeFM1VTM5?= =?utf-8?B?SDROSVA5SkZHMzdXM2g3WjVJTE9ndjU1SEVvbzNnUEpuVWh1ckRienRIU3Vl?= =?utf-8?B?OFdPajFPa01GNkpSNzVNaG1XemtkUHBDbHVwRlMrYlBNSHRmRTRKSE9Oc25V?= =?utf-8?B?SG1Nb0JDMFptYWpKQzdGbWg2UDkzNzgwVjhTaHJ1eTBsck9HOWdjN2QxYk51?= =?utf-8?B?V0dEajdjQ01LM1kwNmN0bW00OWhqWFVyNktxVkxPeVoxQWZvR0R0R0s4K2E0?= =?utf-8?B?SjFrMXB1dmcyNTkzUnZuN0wxRFJxK25kQzRxTVh1NzN1cGlYTC9WVVp5S1lL?= =?utf-8?B?eHZoWlNKREVqd2g0cHJMSHZhTWFjMCtuU3JMVXdOU3dGR24yQ1NFdTFlTGdG?= =?utf-8?B?b2pacDRNekRKQWxtWjVVZnVNRi9yL1FvVHgyeVMrZGF2OVF4RTJLUVZNN3ZV?= =?utf-8?B?RXd6N0gvc3NMSDVhVm1BL3BZUWJTVzBEYXFGVkVYdDV6UnJpVGg5RTRpb2d4?= =?utf-8?B?WG42dENSK09nZE5kVnZ5SmliSHlhSnIvVEpQUDVXTmVKYWVndFNudmVyUisv?= =?utf-8?B?cnR4Z0lSUHRuSUxkd2ZPZk9KU3k2aWU1dzlwZUFieFV1eHlBM1VheEwxRWN2?= =?utf-8?B?SE4ySzltSCtVVlk4emlRNHJDS2xieExZajZSTXYzZmZZNjRnVzRiMVFDSWRB?= =?utf-8?B?TEl6UERDU1NwZGdLU1I5OVlFTUtWWmRXWS8xM1Yrbk5SZzI5SWtidHU2RVpB?= =?utf-8?B?Z1pxL1NqNlNOZDlFcGtmZWZBQ01lVjNSeVgvNkw0Mmd3RktBbjlsR1k4aVJj?= =?utf-8?B?RGNHdzV3L0tzQVI2UjNXQWZGajhNc0RjMjZyNE01c1lVSEhES0l0R1ptUzhM?= =?utf-8?B?SnZvaU1Ea2xjNWZhc3MyUE41R2hWR1J1Y0N0SDhUQmJqSklXUHQ0VE9UWERj?= =?utf-8?B?bWhMOGorbWY3WmQ1UkpoaXRFcUY2RFp3dEo0ZFFRellBM25aUmY1UUFsVjRp?= =?utf-8?B?d1VvMUtFZ0VkU21WRDBCc0NHSWVQd2ZhVW1xZXJuTE0zU1ltSDhoWkh6OGhV?= =?utf-8?B?eGdINWxkeVU3Z1JnWU1SWkVGeVdrZ2FWSllEMkhiTS8xcVFjZlRSd202RGpj?= =?utf-8?Q?NOycfK/owBgxHSgvckVjbeTteygCeo6VkjrtFEUXyQ2Tf?= X-MS-Exchange-AntiSpam-MessageData-1: dC7CDRnEFbjmvQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 420e984f-18b8-4a75-e8f8-08df07e6df5a X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 05:07:08.2074 (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: ukWe1W5uRJhRpHazygIRTKA8eTwvXkjHGZ/GzDVV26x4QnNfcFejGM5pGG6zcWuNdJb3Qc4q1vo7HEpFb5qJ1Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4355 Add the `cv!` macro to the prelude so it doesn't need to be imported explicitly to use it. Signed-off-by: Eliot Courtney Reviewed-by: Gary Guo --- 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 01ae2538b3e4..2207088dfb65 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 13:46:47 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010032.outbound.protection.outlook.com [52.101.193.32]) (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 C24D837B012; Tue, 1 Sep 2026 05:07:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788239243; cv=fail; b=SgW168tuJL2eP7c+GriSSZkayF5tunC/QfdzLtjKiNuIXUxPe7dgGjxDkpcBhzWx0Gbfpe6JF84JzyXpM75Cd8o1fx9DwxWSIiOwFFAOai9n5bGiyaVnAIEEyGDwR5Eoy82Nnz1ov8325Z5UZBPFIwFgTm9w0NfvR2dDIgNe5NU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788239243; c=relaxed/simple; bh=FVwyi3kCKhiIv6OE0iqXi5pJhiTxZa2h7RPqLcbUfZM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=g1lfvvXPQ4OQVXiMdX9M3UgvyWDAOssJNxbyt8MMVGJ9okpLKY78AX0Ql3NfgDtILotI4Moq5MEnBuI99ltNV8PM37HHrTfGQHrs6IxukMYlSObUIHDUnI6gP0Ff7K5mfMWjWtcRFlEi7KUod/Z87oiHfr21aVY2Qczvyclre2A= 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=tweq7nvh; arc=fail smtp.client-ip=52.101.193.32 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="tweq7nvh" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kwNsKuXpgRZw9Ss4fwOORNOUJOz+2V1ya3lFbbEktbUsE1opWhcYilRZZXZyli7WAXbXUS0iQiMBpLezxt2oebqMa7jTQPYXFT1C39gMkfGi48Ax5IyuH2YP8IcYGmOLe0XnWFJLsVNSkgREzl00elwiHqEnVG7dy8iWAy0IRo1/5EoNxYy4KUJNEK5l8Ga3nHOzpUnSsTjXRr1mXJBecX8l/5HK6GbhUZAV2mMUsEMm8+gToZxICHWIJsFCI9IRPbJ/T8Dz/rAHth3gWeAc6k6YgcDRS1U0mNmb1aR4VqMXFfRjNKYwuXYuAY3oDMR8U1WrNt9zgX5uqYpSvssu4Q== 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=/kagjZ+EMfmaiH2nVKeat0CGL6mr/wfJtTPuNmfPWW0=; b=iLIykgmuzqaS22g41IuCEcI5On1cuz68JMbsgn2t4NT6Vzo9jRx7GrDQ5E1yECjll/kgZ+jfGxPpgXrsSNJcCI+XzrPuftbLjHZ13c34nX192aAQqhM6ZtMdIWy/g+BaDcg2cSM25O2wXg0CBTOPZe5t5HYABww5sY0e4dt9AK0PjzeYIkjKgxmDjQGPOvugSkfjyefcYGjly+G5c8J79OnqnDAJuAl3/QntIH9S5SQUf98mv+RWEuHNoN61OQsf2jW/0BENS0kCxQbHn3OlT1Nwl3VZ62xW4NnCQmYspcch6md2otTz389z0k36WkltGZ50/PtlMmqGovxPc6RtcQ== 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=/kagjZ+EMfmaiH2nVKeat0CGL6mr/wfJtTPuNmfPWW0=; b=tweq7nvh+CTV5WnOyENuuS5ROpNxXjKAnSuyT4rf8awQEBIIeZOMGsTfF/9jzbEgpoFesaM7Vp3T4NtDVFtGiOtqfxYKXe5zl+j1BFdP6Jtc7WHj6tZu7ygonhR7VqOOA3Y7dnHm4r1MastC85KLPqfKyGLPaNwbWjjRU4KAP7Tfe+UWxyFjB9D2vEGS+dLzWf6FXcYeaXK3cbI4fslcOCyBzhX/A2uOI07+TKeERiCsba307Ew0wiUSA4qywJNSaXAvBcYc7hm6ojkZ9JmSNqBpjMmkDZeQ3sYh+kS4ZfL0qYfLqDZ2byo2S81ibeqR0eaFgULygQrMwGKfa9YMeA== 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 DM6PR12MB4355.namprd12.prod.outlook.com (2603:10b6:5:2a3::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.13; Tue, 1 Sep 2026 05:07:14 +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; Tue, 1 Sep 2026 05:07:14 +0000 From: Eliot Courtney Date: Tue, 01 Sep 2026 14:06:42 +0900 Subject: [PATCH v2 3/3] gpu: nova-core: use cv! for constant casts Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-cv-v2-3-446bc69d2ade@nvidia.com> References: <20260901-cv-v2-0-446bc69d2ade@nvidia.com> In-Reply-To: <20260901-cv-v2-0-446bc69d2ade@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: PAZP264CA0243.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:239::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_|DM6PR12MB4355:EE_ X-MS-Office365-Filtering-Correlation-Id: 301dcfc4-f2ac-4e9b-e0cb-08df07e6e322 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|10070799003|1800799024|376014|7416014|23010399003|18002099003|22082099003|56012099006|3023799007|6133799003|11063799006|10067099003|921020; X-Microsoft-Antispam-Message-Info: vuvITqOa43aQvXg0w6yl7Nhsaxe+7amGFDNs+n8ux5ObHk0eYrP/SLQoubNO1Pwj6CDEIIUcv2efm8SxnXX29j2ZUEijs7jaO3jKFA1o/SC+55IxXMVqfPHhiPEcWA6Y3l2RUCJvaPkbv8OYV+rI/sM/AIlPYRPNrgLMVosqOuRAGmRAQreTgzuIqkHWDDPmj/MAWWLzKSB6X18NS8c3lHGaE9jd0CsU1Z0eq62bJvnApehgEt7114THxoXFSBjCJmhDvwhv+ZXhrYYDCKoD20cbsPAfuGsnFlJpGOOHOP6e3f8xXipF4b/sgIltCeA/HanpNCNwJgjM6ISkMAihhu4eA0jweMcbbpeiS/SQSN1hmxK6wbuV2TO84N35Pa3vryImGoVmlFVD4qEW6MJ+i+OMtgADQGPOKi6zYrqNZquZBI77AUAU+Vl6PmB4SN5gP91eNswXS8infxzf9DuMHyYo7sICXHjtSYq4hY+zEYyksJqdIkVHV/FxXDh+NBs3Z7e7Zw2/LN62B7C/qPpr/jmN9nTod4PBdEnBmwkxR/U5hHLTI6TxsdRgqdA75snNfmafNQtZT+5PWQj7ttSk3ZSlxgEX/w+p3basRLB33BGNmDZdaGI86rTXXW5y2yWQ7Pbx1lszRevnzKUtKd9biGDOIvkg356D1XHbOHDHoNqyNUEhVn8dyLn3uxWI4yDUyCXinqr9ME5zJdvqfmIZdw== 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)(366016)(10070799003)(1800799024)(376014)(7416014)(23010399003)(18002099003)(22082099003)(56012099006)(3023799007)(6133799003)(11063799006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Tlg2aW1sT1hsRi9RbE5NVXpnV29uWDllUUh0ZC9yK0oxYXd5YmVvTXdTNVNN?= =?utf-8?B?SWt6OFR4UmtnbUU4N0hScnVxbzFPVkVXL1lCZUxoZFlwM1U1QnBXaGZ1RU83?= =?utf-8?B?ektOaGZxaG8xaVgveTFoMUVTZGFzWjBacElVS2NZY0VUcVBOS3VwS3prR2t0?= =?utf-8?B?YmFiYVJwQWcxMTZuNjg3YW0xQjQ2OGN3enkwZjBIRW9yRVp1N0NKOCtvR0pi?= =?utf-8?B?cDVZT1BVSCtzVnY3NlBkQVAwam40NzFyS21QeWgwclcvMVFtOTdWQ1h5YURQ?= =?utf-8?B?ZzZ6QTdVV0lIaXBtWW5XTUlKT3o5M1RRcGlnWHMxejM1Z0ZnU1NDRERiRlhu?= =?utf-8?B?RHhkbVhXYXNJTWNSdTJGNmhrVGJtdkpPUGs2eW5PL0svcVhOWXdEU2lnMFJt?= =?utf-8?B?L1l0ODFWelhVVzJoU3F6bE5GOXpSVmc4dFpLWElXVnZ6R0ZtRDZ1VkNwOE16?= =?utf-8?B?Z08zNjgwb3JtcTFXb1E1RjIxVGR6Y1Fpa0xKVXNFdC95dkpjemNiMEpyTFRW?= =?utf-8?B?U2xjS3FadVpwRUJuRTN3MnBqSUpxVCs5UWFVNDRRNVlQSC8rd3hQaTRwcEx6?= =?utf-8?B?VzJZM1l0N1c3UmF6MHk2YS9wQlM5VkVlOXZldDZORlJScXVYVE8vNmd2dFRa?= =?utf-8?B?REtpTklrY1BwcXJrZkNnUmxrTlBJdDRuKzh5WXdRTmp3ckZKcXpBUGR4amgx?= =?utf-8?B?bUxkZW0wTkxsUFl4OGVyZlMyMnJDbklXT1BjcjdjanJSQjA2SFlNclhMV0l5?= =?utf-8?B?a0dqbXdhbWIzQ0ZxL041M2FlYlUwY0dIay9kTGNBbnM4WDhhMkswSUFSYzM1?= =?utf-8?B?Mnl4d2lwLzR1b0xMVlM3a0Z4MUZkVk9LWWV5Rm13Y0oxdHdCTXplREcvRXFl?= =?utf-8?B?M05jV3V3MGhuWktZWGNaemRvY0k1R0o3SEwvMmZYNDR1OU1oK2lscDkzVzFG?= =?utf-8?B?cGtOYnovdkV3RGE3QXRkTi9XTnpnUnJ2TG9FZkRDR3lsa2hKZHFoT3pWdVhN?= =?utf-8?B?MThYOXFNU3phdTRvb1h3T25vSHU2bzN5ME1VZWt0VU8rOTlySGNaZFcrWUpQ?= =?utf-8?B?M1FMYWJaUjlGRkVaZjNzMmMwWFBSMlJHeTZhVFlvUEhobmd0OEFvSmM0Uys4?= =?utf-8?B?aFFQMEpqKzRvQXFTeXNGV1MzR3hjZ001ZmZJSVpzaU12d1A4ckpldEw1ZFVT?= =?utf-8?B?R096ek9WUXVpS1Z3YVBCQWRZMkFIUXM4N3dKTVhrdVYwTW1KL2NSSkV0NnVT?= =?utf-8?B?WnpjalRMQ0Q1WjNGbFZ0Q2YyeVJwM3ZQcVZqRGx3UGN0bjdhRmt0Z1huVWgr?= =?utf-8?B?OUZlVVFJREhNQWhIYUZtVmJBSWx3TTV4ZUdXcnprUHhaNVZtZUx2YStpWXVt?= =?utf-8?B?Tk5wMkkzaThMbnVSYm9iY1NwY1JmN3JicnZJS1krZ1NZWm5Gc0QrczRFQW1H?= =?utf-8?B?QjZkTXZvS09rOUJXd05jK2FaeG00ZkZkZXN3dUxmRFZpemxobkJJSG5TUloy?= =?utf-8?B?M3YrYjVrZXQwci83TEpCQVhoZ2JKYTViQmJ4cTIvRFI4dDIxazBBcVhrTVJz?= =?utf-8?B?MVB1Y3VqakptYVFMVXVIWE5ZazZYT1Y2bHFZQ2pGVnVQRThuQzNQYVhlaTJz?= =?utf-8?B?dUlJbzJzTURWQTc4SDczbEZJNkp4TGM1MGZzb3dTdTkrUlRNZktJaDFHbDll?= =?utf-8?B?UTg3L05WSUF5S3BZY0NNUjQ1M09FQWprMWVjdExHRlZZMWNVbFUraVg2VDlG?= =?utf-8?B?Ti94Y0FPRTlRSW9MNWgvVWRkODcydUFDMWZUdVZwYUtDT21lYUU1RXRtdFlS?= =?utf-8?B?ZktwSjRsL2Y1Ung1T2ppMjVRc0dtUzRoRTN5WWdTL3NXRFRMSkFNYlJvYTV3?= =?utf-8?B?UGVpbjJ1cXlOc0xVbE03eXl5N1RjcWlVdHhQdmJBM0xzRFI5WnFpTkdzMURJ?= =?utf-8?B?TlhoNTh5Tm0ycDZsNnBpYklsa0s4NWx0RElXUlVucXJNRHVSK3FLNDNkeG5r?= =?utf-8?B?Y3RLODNjWEJseEhhS3BpZ3FVdHpUdXkzYW1UYnNSdVkyalAxWHh5N0NQUGdz?= =?utf-8?B?c1hZUHlDR3BWWXlUQUpXbDVEMlpjSVc3UWE4c1JxSldKV0tNb0RkRmIrK0xS?= =?utf-8?B?UlJxei8xQU1zeTlsYUdTZHU2cGZaTFNva2c4K0NYbEdiY2JhSWVxVDJ3Uk5E?= =?utf-8?B?OW1iaUZGNlJSR0QxQnFYRlMrUmhVaHdvYVRDekhTLzU4ek8ybTMwTWUwYjFs?= =?utf-8?B?d3orMEhlbVpHdUdPU1U0bXo4ZjdZT1JnQ0ZzNEpKeVdWaVFsaEpqcDFsL1po?= =?utf-8?B?WTdySzE3MVVjdE1xb2RWUXE4V0JhVlkxQXh2eWwzVTB2R0tmdlorU1dDZDli?= =?utf-8?Q?B5P//4UcFzFMryvd8unmElCUY31YmYs3EfQ1BsPcosSS6?= X-MS-Exchange-AntiSpam-MessageData-1: 9S83OnNFGm+P8g== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 301dcfc4-f2ac-4e9b-e0cb-08df07e6e322 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 05:07:14.6866 (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: ugPZP9jpaf8HKbw6cj5KPyO0RCYmIPi4d0PAs9W+bCtQ1rsiDIHNw3wyBfcmcVALKSzVcqZt+1YE4SBjRPMbVQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4355 The new `cv!` macro allows safe casting of constant expressions in a const context. Update code in nova-core to use it. Signed-off-by: Eliot Courtney Reviewed-by: Gary Guo --- 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