From nobody Fri Apr 3 22:25:17 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011043.outbound.protection.outlook.com [40.93.194.43]) (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 10FB3396567; Mon, 23 Mar 2026 11:08:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.43 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774264100; cv=fail; b=AyGfJ2le0txnvrU16OkoNTOH/wi6C5LZXvhZfO5oOl6ZeihGsE3xmd0E0QQOWml4aiT/HTXyOX45DEhlnEfYkT2HbOySjqBa0Z2HiT12QqiDlJz6qQhpCUNZlws+Sqk8J7uywFzpcHJM7LXoXBtNosbNFKUG3166MqFHxm+vEzs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774264100; c=relaxed/simple; bh=CcalGaHoTYm2qvz52fMcgDBa9ApgDUq/FsSRifkzKOw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=gULVG1XEQTwg9Jia2UJXbDvmheDJzbG9X4KU+6fuqEleiJH28F9uPxCx14UeBjLFSXSEbTcGJZ3Y7J/zk34T+Umc8N23FcwMlQq+GnuFbCyMiix+KbOAf7hG3WPYYImeMSocPQfVDxQGutgIq/Gf5d4jQMF6Lb1EtIumIvAsO4M= 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=iveWuQhR; arc=fail smtp.client-ip=40.93.194.43 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="iveWuQhR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NhPnTQVVpW6Qw+emSkX81lgFGHnbcs/yr7r6R84zqmtojQ6vOG2oKZVtIDaGENWC4RxyyJIDesZY1h9XjPA1KryfMn02jlD4ljrFeXyAUt/IRFp/718O2GCPAZoZO6Dv6Qq46h4L3BCmgMEkXQEm8E24ffdF0ToU1gSr0tL2VkRMN96YOB3uZePzI95VqddJhWC/PUYKpOnHnEBPCLDprzIKnTCNOtay48NHY4TcipUdsC7C5Qb94H672gO6AJVtdMc3paZMTigMwlu0aO4LvQDdDzI7TbdeBc41D2WkjfqFr7fy+9aE6FpmCSa4Y+zuWqdHyclSHYGf8WiACjyOJg== 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=TaSIr2nT1OeLfpctS0/hOfTUQ1AYTjWXBNbumI6w+LU=; b=nalW8XThi0E3QxxWVxyC6IL3KZGscL4CMuOszC/jlSjjQseI3NRD1nBbIunCBRYQNIZGRXFr6bW5XQaOB5gv4ZSImoveWKxec0FyDb/N3EAlA5yfDmub8OMsavjqJVgyzwtsbNKJoG1PfTJqQobgGJ7koN4D5UNsJD/kKqom+Q8Ws0iNwNx/ATpLk+XOxsV8OPMwFNVZr5vbYWDp6H9kuFc/xTh6AlIt9mUHkLgZWGn17Z+s+/cL/4WKTER1kKNqtLXM/hnyZVhACZ2Cd/6p/YWH4+mL+34cxHiBmikgsysMYQwOhMtLRAmAS2fLIL8quwFamzycPJOmXqkWQMP4Jw== 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=TaSIr2nT1OeLfpctS0/hOfTUQ1AYTjWXBNbumI6w+LU=; b=iveWuQhRLBCBDTCb4JOIYM/donZLU1DEmWt1dG4+nuB+Fp+A3drYUDgLIZGSN3pNdYcKQ2bUF8zQ1MS+AT2cXDLhXX97Sw8ksqhj4xs9TDYd5KMkv+KcCMa32i8VSxzDW70wvIcjEVDfSD4ukzOJKunLte5cehdMUTO9QyRdWY3dofOUnzbfuAnzZ80fdjgZWSQrkXB8RpP/9+8zsa8YZ22MuMv7byQtZFtPnefiEkw/eotKA4ItMbn5J0yBvoR1iKFGL/qg2CbDKLEeJk3EL1jFPV2QI483pbJeZMQTW3pEmvF7qiuiMPBkkKvGxN0HdAb2n6gHu3T8Jh2NjIOA5A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by CH2PR12MB9458.namprd12.prod.outlook.com (2603:10b6:610:280::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.15; Mon, 23 Mar 2026 11:08:14 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9745.007; Mon, 23 Mar 2026 11:08:14 +0000 From: Alexandre Courbot Date: Mon, 23 Mar 2026 20:07:42 +0900 Subject: [PATCH v3 07/10] gpu: nova-core: falcon: introduce `bounded_enum` macro Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260323-b4-nova-register-v3-7-ae2486ecef1b@nvidia.com> References: <20260323-b4-nova-register-v3-0-ae2486ecef1b@nvidia.com> In-Reply-To: <20260323-b4-nova-register-v3-0-ae2486ecef1b@nvidia.com> To: Danilo Krummrich , Alice Ryhl , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Zhi Wang , Eliot Courtney , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-doc@vger.kernel.org, rust-for-linux@vger.kernel.org, Alexandre Courbot X-Mailer: b4 0.15.0 X-ClientProxiedBy: TYCP286CA0020.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:263::12) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|CH2PR12MB9458:EE_ X-MS-Office365-Filtering-Correlation-Id: a502bda3-fbc8-49fd-45b4-08de88cc7a37 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|7416014|1800799024|366016|921020|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: 3YpgT8KJvgx9cd5eyKmBBJWM1JuGXxQG4kogbYPaPEhTys2Baonw1YMrGoIRU1lEVdNnIv+DwZKjVHlleC/64KP/UcyAvyOAl2vLK8LghbO/BGuEqlCqisKs5n5HfrSgfzV3QOLnQwHspk4AyvARtw2pYRdLNoJNRgnQCHZtW5whEojClwaQJBfrSAzvumIf/6i3TzWdz5cGyRPNNKCGVMz6zyTan9cYCe6fPKCBemPKX1Caf3cd4Yy7a5fOdfJzpVeJ5BU4lsYakf37EWmkJ/Zb/5SwXjRumr0uf8Ju4dassyj5jefh9pVN+YM2yBTtIeZg5ZqUdYH328dEqrgY85A6aVO/AK19nBAJaimEHL0QLZFtKWR9KD0Zo8B5okahuN+IVyA0BfBIRjXmevQGwstX0Jnzvqo0LLTKljlv40rSBTBj567iAy1eQyCfy45EcYob+aXUL2wlVA3qVZhCUpETmSm0XOKl6vHZxb02bLOQy+nhoBFdb8MnaIK5KpE4P7agC4Ji7yYUYAgtMBfBpaMCdqgHv7r46Cz9kSKX772RAANKCGSzhejyqfW6uWihVJib89IEX0GxpuGndkeDKxTDuReLX5N5LheOU5s19UZrim8QcIaCvwZTN9jMGt7+seB4VanzWBeNkVNPdtFScfDbG9qGqHvRSs1TEZt9zHu7m+PIwHSoHyuge2nLg0WriDDzOIUYEWz0yeMV0cPQBUip15kLSVrSUxJDcONMb+CODNTL+ItJw6PulwXU9uyD/xDx2eN+UG8coJdh4AFjvA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(7416014)(1800799024)(366016)(921020)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VU1RRmJla1QyeENPNjVxMXN4MHJqUjdHbkZBL0FTZ3RyZVhGTnVDU2JXdkNU?= =?utf-8?B?WXdpK0RrS3JJTDBnTTRnTnNkWmZEWnkxNmRNVmNKVWpzeGNjaG1vUUtub0h4?= =?utf-8?B?d2dRcDk3M01sVkRYOHJhTWF6V1Y4RVVjMGpTY0N1bjl3b2VrQldjT3MrMjVN?= =?utf-8?B?SHVsdmgyc3lnZVNEMGJJVDJsUmIrekNDQ0Jhb3FpSlFsbWh5T21CZEdCQjRN?= =?utf-8?B?RzJhZ2RZTHYxWUVBUzBTT01lb1grUjZLNFpVVmlZQUZHUklwU1JVeHhtWGNs?= =?utf-8?B?Zm9pVHN3TUlWUVU4Zjg3MDhjRnI4M1hwZTdxcy9lRVVmcHYyT3lwcDhUaWxO?= =?utf-8?B?czFMUkZpUHl3SkhiM1pBSDdFY1JSSGZBSmN3VEp5bWUvaEg5b2Z0NFNjaWZO?= =?utf-8?B?Y3dMUnZEYWxuN2ptb2d4eTFqWm5TSkJUekNXWW1acGU1MmJOMUo5MDdRc1VU?= =?utf-8?B?ajN0c202VGkvVVgrWGg1K2oySTc2Unl0VUt0dzJrcnBMM0VsVFI2enNtamJi?= =?utf-8?B?dkpzMmh1ckt0ZHdIczhYWDJPQmUxOEV4cFhHSktsbU9qU2NUUTcyVXFSZEc0?= =?utf-8?B?UnBQRENlYUplMWJJUkJ1T0dpZ01yWW1RVFhXVkk2aGZnR1JNL3NERkFVaDUw?= =?utf-8?B?dm9vUUJGQ25hK2dYa2FCSHRhWHVGRGE3RTQ3V3lPL0tnb1oxdFFERC91YWVx?= =?utf-8?B?OGx0aE93dzMyU05Ec1FYbHpOQS82dytZZ0l6WWNoZEEwVUVZRzY0bzN0NEVY?= =?utf-8?B?Mi9ITHl5WG8yOEJQSEw0aGxPa3l6UDNQWEFhdmh0dFNqVkxWdzBnT3BpZkJ6?= =?utf-8?B?TWNuSFZ5ZC9KU0x2TkFpVXlZeFkyMDRrYmJzOVR5T2RMdzJ6U0pKZ3RKNEd1?= =?utf-8?B?N1Flb0kvRStGZW9pV0kybUFxY1lqQkQyQ1pBWFcrc0h2aTRJUTdXRFFXdEV1?= =?utf-8?B?dmpxUnRrTWxQd21rcEtpZkFRTzFVZExMYitPWENhVXdWcFZXK1h3NmJzUjdE?= =?utf-8?B?MkRLZG5CZkdVbGlxUVU4bG5Cb3lPR0J5akp6K1FzMWpqQi9CdXVybUJYVVpZ?= =?utf-8?B?N0NCbitFZEtsa2I3QjBxUGFuQkFEQXdERjhyNnBEdUVhQlhIN053MHVyR25o?= =?utf-8?B?WWR4anNkTW9tMzRsSDM2M1JvMG5lVkhIOStEQmVtazNrc1gwRXMyTEhMYng0?= =?utf-8?B?b1YzZWdwcVYycVg0OEMrK21WMVl2Q1dxZmZ2SGhaWFZyMnl1SW03Qjc5NUw2?= =?utf-8?B?cVRFY0F6ZlJsd3Q4Q0hzTjFmbUVSamtJQWhiZ1RkMDhyYlA2bHI2RW1FbHNQ?= =?utf-8?B?TVk2cW1HK1QwLzZSSmd3MjVmRnI4N0tmQnNkRkhLT09NeVYxRUNWLzkraE5Y?= =?utf-8?B?aStkaS9xcEEwVk1qVytUdmc3M0pHWTlrL3FwZ09iQ24rSmtmd1ZwSUlJVVNn?= =?utf-8?B?aTNSL09YTkhzSVVrOGtzNkhCZkIzK3pvMEVaT3lSSHh0T1loRm94bWl3Rkwz?= =?utf-8?B?eWl2YlBEU1BLT3VZc3E4Zll2UXYvSlE3K0U4bGtCcVRHdXVXd1BHK1VoLzE1?= =?utf-8?B?ZzM5c3JTcWprdyswVnVGYkRuYWRHWkNlQVVJaEpPNVlDZmVsMWdXSm1MMDN5?= =?utf-8?B?VTU3Q0JTZmp6WUFxc3BnWDV0VFhkallDN0QzYXZGbEhxRys1Z2JBbzdiSVNo?= =?utf-8?B?TVVWNWsrKzJwc1VqQWt6OTdGMVV1ekl1cGRiTUJtcTk5SmwxcXRFL0lBTVIx?= =?utf-8?B?ZHVHeXNKVkJmRUZGcjZLcFVoZW5JSStVelpmUXBjUkRDRUN0K3ZxVzNvSXN3?= =?utf-8?B?ZXpHZ0Jabkl5L1dUbnFLRDl6K3l2ZHZtU0hPK01CWVFyS2hBMlJOdkZvUDQ2?= =?utf-8?B?NHVNK0pKWXVkZ2gybGhsb3FUTDJXSzI0SHNaaXJ3SDZTeEduMmROK3hzOTJv?= =?utf-8?B?dFgvcHowWXNxam5RTDRDUmpaTG5nN2xZV2F1TTViU1lBNDBySFMxR3p0cmlR?= =?utf-8?B?Mm81NTdvVTJIYUVHNUswNy9MUjRjNWdaaEtjNHU1d3FycmpjN1JWb1RzYnF6?= =?utf-8?B?TmVmQjUwMS8rSWhwaW54dGFucWsxNGsvMkRkazhMUVk4b0p6T0I4aGFrR0xw?= =?utf-8?B?TXVldWlidzNiUk4rNS9NVUVlTDhQUk5kOUcvNitOMzFMNzczQzlkN3BEQ0dK?= =?utf-8?B?dWppNE4yOGY1THJjRitFcVd2UzdFOWVxMHBRQUZoWXdoK1lSalQ5V2VwWm1k?= =?utf-8?B?dWxwd1NFMFh3SHAwSUlkNjJjN0krUEZjWDFSRzVoUkVoWWUvdUcvYzhEajll?= =?utf-8?B?ZDMrQlE3NlZEV3o3bnB2TGJuOFRubkw0dEwrVXQ3OEJ1QTUrWkdnN0ZoODE4?= =?utf-8?Q?TmOBH2M9J7Lm3oxb4ttKcUuKDZWhP1kT3Pgv30Livqi9k?= X-MS-Exchange-AntiSpam-MessageData-1: HlNt8c5PgKb8OQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: a502bda3-fbc8-49fd-45b4-08de88cc7a37 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2026 11:08:13.9433 (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: ymBpcVvZKD778iIhxRoPaEli5AmxIKwIOTpqp1ouzgqu6p/iKcvJDOjc0pfyLyG41ga7vIhB7fRzTpq/JoGrmw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB9458 Introduce a powered-up version of our ad-hoc `impl_from_enum_to_u8` macro that allows the definition of an enum type associated to a `Bounded` of a given width, and provides the `From` and `TryFrom` implementations required to use that enum as a register field member. The next patch will make use of it to convert all falcon registers to the kernel register macro. The macro is unused in this patch: it is introduced ahead-of-time to avoid diff mingling in the next patch that would make it difficult to review. Reviewed-by: Gary Guo Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 82 +++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 82 insertions(+) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 5a4f7fc85160..5221e4476f90 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -54,6 +54,88 @@ fn from(value: $enum_type) -> Self { }; } =20 +/// Creates an enum type associated to a `Bounded`, with a `From` conversi= on to the associated +/// `Bounded` and either a `TryFrom` or `From` converting from the associa= ted `Bounded`. +// TODO[FPRI]: This is a temporary solution to be replaced with the corres= ponding derive macros +// once they land. +#[expect(unused)] +macro_rules! bounded_enum { + ( + $(#[doc =3D $enum_doc:expr])* + enum $enum_type:ident with $from_impl:ident> { + $( $(#[doc =3D $variant_doc:expr])* $variant:ident =3D $value:= expr),* $(,)* + } + ) =3D> { + $(#[doc =3D $enum_doc])* + #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] + pub(crate) enum $enum_type { + $( + $(#[doc =3D $variant_doc])* + $variant =3D $value + ),* + } + + impl From<$enum_type> for Bounded<$width, $length> { + fn from(value: $enum_type) -> Self { + match value { + $($enum_type::$variant =3D> Bounded::<$width, _>::new:= :<$value>()),* + } + } + } + + bounded_enum!(@impl_from $enum_type with $from_impl> { + $($variant =3D $value),* + }); + }; + + // `TryFrom` implementation from associated `Bounded` to enum type. + (@impl_from $enum_type:ident with TryFrom> { + $($variant:ident =3D $value:expr),* $(,)* + }) =3D> { + impl TryFrom> for $enum_type { + type Error =3D Error; + + fn try_from(value: Bounded<$width, $length>) -> Result { + match value.get() { + $( + $value =3D> Ok($enum_type::$variant), + )* + _ =3D> Err(EINVAL), + } + } + } + }; + + // `From` implementation from associated `Bounded` to enum type. Trigg= ers a `build_error` if + // all possible values of the `Bounded` are not covered by the enum ty= pe. + (@impl_from $enum_type:ident with From> { + $($variant:ident =3D $value:expr),* $(,)* + }) =3D> { + impl From> for $enum_type { + fn from(value: Bounded<$width, $length>) -> Self { + $( + // Ensure all enum values fit into the `Bounded` type. + const { assert!( + $value < (1 << $length), + "Enum variant doesn't fit into assigned `Bounded` = type." + ); } + )* + + // Makes the compiler optimizer aware of the possible rang= e of values. + let value =3D value.get() & ((1 << $length) - 1); + match value { + $( + $value =3D> $enum_type::$variant, + )* + // We land here if the match didn't cover all possible= values for the + // `Bounded`. + _ =3D> build_error!("Enum doesn't cover all values of = the `Bounded` type."), + } + } + } + } +} + /// Revision number of a falcon core, used in the [`crate::regs::NV_PFALCO= N_FALCON_HWCFG1`] /// register. #[repr(u8)] --=20 2.53.0