From nobody Mon Jun 8 18:55:22 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011054.outbound.protection.outlook.com [40.107.208.54]) (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 03F9123F431; Wed, 27 May 2026 12:52:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.54 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886338; cv=fail; b=cRmu010PUymoFFITzhsoTzAtJwQkWkrXvH1ZmHGbycBUpUyeHoW5nEudAw/BX89m0NSlHSbnltVyCdnAOeTcy2pjSkjvaldoZv9VLxiyJ9Wthta3xnuc44mnsrYYaGRJ2mShjgJ45Bpev7I+4/0j9sHMD0WbGwq/x9YafaWtOxA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886338; c=relaxed/simple; bh=oojxiCCfm502lvUIqGCEIxu5OgAVa/UCBZtWaL8PHI0=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=UQPfCTI93bV6uNRzFTVpHzQqjGmtmOlZCYPjmleuvpYfUKByZmnzSCIQjxqj7/I7mTDIMPjek1B/Yfaime57NgUHq9P+Bqvs4JKcS/cArga2rwnMo6XBtm2i2saBLcEPYQlP5ODrwT7F/OaLC0+EbXjx/qFLt+UQnhku5zrNJg8= 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=DQLyNrKI; arc=fail smtp.client-ip=40.107.208.54 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="DQLyNrKI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xMa9nGF0X44wyW/e65hfwqSzzIDhFkQVJuPf5Nl1jByIpWiVvhb/spEBKMkDybbqArzzqFOqI+HzqiKZu6R1u/ua1B6aNLuWPekdMTEfAZEUbz+x9iJkcQlZzAtwxeZEudMp58SpT9fZLhcW9NTDYeHbdWeMqkesf8Ee7VpCcPLZ8vpmU5HNgmMUWEuEpH47iWnshUoAV1gunX6ERAVGo/lQXiQRpmzUsgXaFAh6E92y7TSI3ltaJCnHbg3ybvRh+Ts5y+ON1iZa19IBlvA2cOTJatlplxzk6ZcbleEwJwr9CMKjFyf7B6z0hrfCmwZG2LjbqxJv60reuRHpXGBUTg== 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=7Pi6FMwv3xPdY3Z7Hognb23EzXbhALeANerdXj72mV8=; b=qZ4BxtJ4QK90mxzt0/3KTAwtNIMzv1XpZNYy8ji4iqHm3NSqHf2LODaU7FeDHAoKaCK/hq+3UYfSpPZBy9MR+CLHOEsK/Sl7bjM+cUjA4I0GitDcRcavV5LhfrZU/YEgsDNC67GJPZZZJitMhQtIHd89Llqz3qOuxzeiQUZ7+pHSfuVf/9DWHBvKE6YMZvA5q4uP62m+11dRziVT4i8vnFaoNJWbMFAkopjHn+ZaWc/HraaVGtZ0fqoGlBKoar0Bs/bMV7jIjORJpYmBqdxHIrzOHhssk7bNhv4HqGUOQ33BP+J7wPr/K0Mi3jBP/CmcaphwRIMHqdWrcaisKn+WFQ== 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=7Pi6FMwv3xPdY3Z7Hognb23EzXbhALeANerdXj72mV8=; b=DQLyNrKIwGc4I0nOCBQ1w9vkMWEYZLitskIavjnsj2LRm9zeCVOYuG3+VVivYU6MjUUZaltWcvy3LjtAPISooSi4THKPb+CZ0xGI0Q3YL8fOrawTkQrdAhdfDXcdjlsUZ4DEJRu1V+aRy2NDeTcg7pKlHOp7VBlwKytVy69FwqezKsxr9uDaXSU6ICyZmn9v6VfUjHmlXgjDk+ze1qig2OhpB0D7dR8oq/PIlSE5rZodKL201cgNAVzxxk7y4h7GLUEuwmFXIXyorrg6MrXMTdwfVh1xI7kMSQuHqEuCj7vNXFo1ZzfQ2YE1kOE/ei2+THX4WugiGhE+KoCA9xfG1Q== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52:10 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:10 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:51:55 +0900 Subject: [PATCH v4 1/7] rust: extract `bitfield!` macro from `register!` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-1-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot , Yury Norov X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4PR01CA0036.jpnprd01.prod.outlook.com (2603:1096:405:2bd::6) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: 4545efa8-55f0-4bd4-c0f4-08debbeec34b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|5023799004|11063799006|56012099006|6133799003|22082099003|18002099003|3023799007|921020; X-Microsoft-Antispam-Message-Info: pJxkzUUisKbXhFZyuGnTcBiL8rQ8UlL3JQIWfyf8ACzeajZUaDFvVhDNRfNGEbjBNvK4szdfghb8SRq7FMPt5BW4obL5dqVz6NldDr0etdjaK8TLf/sm2fUQ326RVXtAYwUwboeOohSSt/yBZTbyhUs5CmBLCrQLvAEOqWpf3nilNE0d5+uGBuTdf7aIVvTatk5vcYeH7yKW4jdjd2bKxoiRChKPzzFFO5s17muw8KhDstrRNw36DubUtEju8s+NqOcAXt1qTDLEE4uzyDHnEFWiVOKMJmjqMIfkifZ+rE2FP6ytRwEGCeyubL5LEiC0h7LbmyEPfe2UwDQkCqAXZYXYLGoFbaXR3dMB6J9RDccnf+pjA+ukg92vEw/C9ZExr3KJbA3SBYxIufkXtyjyL4Wa8NGMd4kEiDro6DdIohoHxToNGVfdsmwBP2dji9/3d0j9IJy4pnzV2TJ57wHWkJ3VMLFjSlKNz6JADoYNPpCuUCw2iOyaKhFKPe7oGpCL4YCOyJEZGZtnJC3DkFnOQQabuz39pm+vfZAekV9IaSlW9Aroj63SrbXujgqqCaPe/FazedGpmThfluvgaqUpBPIguUuZRSZwTsx4HA5ARcTRWAglDEM6F6FYRSAIpJpOYADJNOkor/Keg/AHwb/UJ1I+RLR2BVsmXNsl3a69cVg7dybr+NNIJEGz27P2YD1mu/gHUEAkpA5I63/OqzAtWO99/ITnEpua0rZ544oaMMuH47mjp3pl+NKNd1rQ19QJ 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)(366016)(376014)(7416014)(1800799024)(10070799003)(5023799004)(11063799006)(56012099006)(6133799003)(22082099003)(18002099003)(3023799007)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZEJvMXBtVndBNHMwR2U5Tzc5RmRBaG5jNktDUW5DY0JXRThRZ1NDc0FEZy9k?= =?utf-8?B?cFZzbDYxNDJzMGlJa2I3OGVOUERUTzJMMEV0bmpUZHRsZC80bEVmRmZMSnkv?= =?utf-8?B?bG1PNHNJS0Z0UXJicjZIZHN4M0tnR0hIS0w2d28veGtDQWk5eXJ3OFRhc2JS?= =?utf-8?B?WnNTZWpoSi90NDRPL2VTbE5weStaWjdINUpTZHFSdmp2ZGxNWmtDMjV4Y3NY?= =?utf-8?B?b2lxOXhqdjZ4ME9xVElVT3pPMU9HOHoyMmpyUk9XNjUvNjdsM0VQY2FxTlFa?= =?utf-8?B?OGxmb0ozTGlFRlNNbit2ek5zNHlnRVZ1L1EzNnIwVXcvaUpFRS9CcDJEOTRL?= =?utf-8?B?Q2s5RjdUREp4Nmg5bVA1MldhWDdXZXFhNENDQmNEZk5kNlFvaVp1dTFHZVFk?= =?utf-8?B?WlM4MWxPRmNBRHhWQWxKSmRSMkxoSHNiWVkyUkdWSGlPc0E2YllWbUpCTzFs?= =?utf-8?B?OVRPbzFyY3IrRndJbWtIU1luMzFraDBWOEJGNWhINTFXd2UxRzR6N0pYZnlN?= =?utf-8?B?cFJKTUdod2ZpTWpLOU5abWlRSnNJd1J4S2VPQWNxRGtSRCs2MmpnNFJ3bDIr?= =?utf-8?B?UXUvOVNweVVoUXZoazcyVTNQcEcvSHI2R3k0NE1hZ0pLeGQ1VVRQUDFUWnVH?= =?utf-8?B?NU8wTlBLcG9XOFlaTDFzYkFrM3NIL1p5OVFFU1hUUlk5enUyNHlyL2NaY0xz?= =?utf-8?B?VTVpaS9sR2JIZmY1YzVKekR4SXk0VmRMaHNvNGJHT2RDVi9FWk5keWl4QlhU?= =?utf-8?B?MVo1WFJtelFKaWJOZU1maTZVUDBYdHp6OFRUQkZzNndOWEdvQmViWnZEaHlW?= =?utf-8?B?Ui9vQU4weTlDK3NUaGFqK3lIZnBteTFPZ1d4YndjT0RGTmlBNTVzWXRqTnho?= =?utf-8?B?Q1R6MFJxcXpab0s3VXpJRkZrY3dqRXphK0NwMFpXOWxhVFRROHJHZXNxYnJI?= =?utf-8?B?cmxWZ3cwRnpVa05FWVIxMCszeGRNNWc4UDJwR1dOME1QQW5tamJFYXQ4UUR0?= =?utf-8?B?MUh1allOVnVuaXhRMmREUnJEcmFsM0tpWkkyQllSS0VNTUs3ZU1KU043NS9w?= =?utf-8?B?czRFYjFRTlVNMnRETGdyRCtXdUpEQ2xWK2lnc1R5QnBaaTdRTnpXU2RHZEJh?= =?utf-8?B?U1pFdlpGejA2OTFycEVvV3gwL0dXT0pZK2E0bGRadDhqb0RGcjh6aFp4NktI?= =?utf-8?B?eDRwSWQvWk83WHBIWnpybjdINHdDNVFHUGxvVVhNQmFZQlpQWnRkREE0WkVW?= =?utf-8?B?TnBLcGlEWUFzZGJjN1hWNjk1MVJhYUVSODZ6K1ZIdU9jUUt3RzNwcnArb1I2?= =?utf-8?B?YkZmdGlIUmVJR282OHdZNWZjSDBRd3Q3MmZHa3M0Tm5Hb2wzTUlhTUh3VFQ4?= =?utf-8?B?S0F4OG5HV0xaQlJFeDh2TmxOUVo1SFBiVUY2Vi9EWkkzRVRwTERjLzBoaFFu?= =?utf-8?B?bUxUdUtnL05LR0xwcytGdG9YVXlheStiNVd3NkVSbkg4dVVRQ1RERWVwVktG?= =?utf-8?B?ZlBYTFV3bTJZYXMxSXBLTDVNSXByTWhueFBvc0V4UUpHWnVhVnhFaGJrb01U?= =?utf-8?B?R1p5Wm1pMk54K1RlVTFKa2E2TWZSOXBicFE4bVNUMTVtVFdZWkwxRmNuRUtx?= =?utf-8?B?MFRvODZPMjFkMWVqQXNRMTZoM0FQNFZna2owUnJBMzFZZ2FzdEwwRUxtaEpZ?= =?utf-8?B?QzlVTkJjS2dWZFFtRjIyY1FobXpiV2FqNnltYjZUb0hEQTNSUUFJVnRFdjVl?= =?utf-8?B?ZWZIUUczVDR0REpkT0dBc3FlcEdWcGQ3Q01hdkszYXYwMmRvTi9GR3FZMkF3?= =?utf-8?B?Z2RKS2tlMWduQnN0R1Z0dHQ5TGcwTE5kTjVkMkFkbjd6SXZ5TE1VRWxVUm52?= =?utf-8?B?SGg4aEMwZmtXdUVRYytMRG5yM1BSeElqWkJ3cjhPcDF0R0pDWXR6aVY0OGJN?= =?utf-8?B?OXh6MnNSZ2VHNGNsdHZFRDhrU2VnVjVHZGFuSUtNOW1zQWZlaUNXR3Jsa3pP?= =?utf-8?B?cDE1Sk9SUllVR0lmSFZMRWczMmQyaVZEQnlacnhncGJibTE0MHRxcjRKN0RO?= =?utf-8?B?OGpzWk91NzdMQWR1Y0svODkrWkpYeGc3cDF2T1M0R2lScXRHaW83TlZpZnQy?= =?utf-8?B?TXZjT1R6Z085YWlFZXF0cUdZUGM2ZGt1VzJCNndiZlk2MFpyOTVFS1V3VDlh?= =?utf-8?B?U3NOWjVOdUJqSVZsRng3eDFiUTk5OVViQkNqSjdHN1c1VENLM29vUTdwUE9X?= =?utf-8?B?UGZKV25UUURtRTlKQmhQeFRTaC9ja0xkWTYvZkpCM2tjZ3lINVhZSDEvN1Bl?= =?utf-8?B?MVZmZ083V0RpdUFXT1J0RlFiRGdDZHhLQU1OTlVrS1Z5UHJsenpzSnFHS2pL?= =?utf-8?Q?r8bOj6JNym/HCPcuOmqOIkrBVS+Yd/4SOp+YP5l7/6bF7?= X-MS-Exchange-AntiSpam-MessageData-1: nV0TrjKCtwBIrA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4545efa8-55f0-4bd4-c0f4-08debbeec34b X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:09.4833 (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: /sla6VOC0YnMrSone2twfslf0We6ichM/5mKhvmNNLY9Czu1UeWomPl6MOP+tdhEnSEx+dZIW8cgSvIJdACWmw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 Extract the bitfield-defining part of the `register!` macro into an independent macro used to define bitfield types with bounds-checked accessors. Each field is represented as a `Bounded` of the appropriate bit width, ensuring field values are never silently truncated. Fields can optionally be converted to/from custom types, either fallibly or infallibly. Appropriate documentation is also added, and a MAINTAINERS entry created for the new module. Signed-off-by: Alexandre Courbot Acked-by: Yury Norov Acked-by: Danilo Krummrich --- MAINTAINERS | 7 + rust/kernel/bitfield.rs | 546 ++++++++++++++++++++++++++++++++++++++++++++= ++++ rust/kernel/lib.rs | 1 + 3 files changed, 554 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index c2c6d79275c6..d40e0c606893 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23422,6 +23422,13 @@ T: git https://github.com/Rust-for-Linux/linux.git= alloc-next F: rust/kernel/alloc.rs F: rust/kernel/alloc/ =20 +RUST [BITFIELD] +M: Alexandre Courbot +R: Yury Norov +L: rust-for-linux@vger.kernel.org +S: Maintained +F: rust/kernel/bitfield.rs + RUST [INTEROP] M: Joel Fernandes M: Alexandre Courbot diff --git a/rust/kernel/bitfield.rs b/rust/kernel/bitfield.rs new file mode 100644 index 000000000000..4083e7b7a307 --- /dev/null +++ b/rust/kernel/bitfield.rs @@ -0,0 +1,546 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Support for defining bitfields as Rust structures. +//! +//! The [`bitfield!`](kernel::bitfield!) macro declares integer types that= are split into distinct +//! bit fields of arbitrary length. Each field is typed using [`Bounded`](= kernel::num::Bounded) to +//! ensure values are properly validated and to avoid implicit data loss. +//! +//! # Example +//! +//! ```rust +//! use kernel::bitfield; +//! use kernel::num::Bounded; +//! +//! bitfield! { +//! pub struct Rgb(u16) { +//! 15:11 blue; +//! 10:5 green; +//! 4:0 red; +//! } +//! } +//! +//! // Valid value for the `blue` field. +//! let blue =3D Bounded::::new::<0x18>(); +//! +//! // Setters can be chained. Values ranges are checked at compile-time. +//! let color =3D Rgb::zeroed() +//! // Compile-time bounds check of constant value. +//! .with_const_red::<0x10>() +//! .with_const_green::<0x1f>() +//! // A `Bounded` can also be passed. +//! .with_blue(blue); +//! +//! assert_eq!(color.red(), 0x10); +//! assert_eq!(color.green(), 0x1f); +//! assert_eq!(color.blue(), 0x18); +//! assert_eq!( +//! color.into_raw(), +//! (0x18 << Rgb::BLUE_SHIFT) + (0x1f << Rgb::GREEN_SHIFT) + 0x10, +//! ); +//! +//! // Convert to/from the backing storage type. +//! let raw: u16 =3D color.into(); +//! assert_eq!(Rgb::from(raw), color); +//! ``` +//! +//! # Syntax +//! +//! ```text +//! bitfield! { +//! #[attributes] +//! // Documentation for `Name`. +//! pub struct Name(storage_type) { +//! // `field_1` documentation. +//! hi:lo field_1; +//! // `field_2` documentation. +//! hi:lo field_2 =3D> ConvertedType; +//! // `field_3` documentation. +//! hi:lo field_3 ?=3D> ConvertedType; +//! ... +//! } +//! } +//! ``` +//! +//! - `storage_type`: The underlying unsigned integer type (`u8`, `u16`, `= u32`, `u64`). +//! Signed integer storage types are not supported. +//! - `hi:lo`: Bit range (inclusive), where `hi >=3D lo`. +//! - `=3D> Type`: Optional infallible conversion (see [below](#infallible= -conversion-)). +//! - `?=3D> Type`: Optional fallible conversion (see [below](#fallible-co= nversion-)). +//! - Documentation strings and attributes are optional. +//! +//! # Generated code +//! +//! Each field is internally represented as a [`Bounded`] parameterized by= its bit width. Field +//! values can either be set/retrieved directly, or converted from/to anot= her type. +//! +//! The use of `Bounded` for each field enforces bounds-checking (at build= time or runtime) of every +//! value assigned to a field. This ensures that data is never accidentall= y truncated. +//! +//! The macro generates the bitfield type, [`From`] and [`Into`] implement= ations for its storage +//! type, as well as [`Debug`] and [`Zeroable`](pin_init::Zeroable) implem= entations. +//! +//! For each field, it also generates: +//! +//! - `field()`: Getter method for the field value. +//! - `with_field(value)`: Infallible setter; the argument type must fit w= ithin the field's width. +//! - `with_const_field::()`: `const` setter; the value is validate= d at compile time. +//! Usually shorter to use than `with_field` for constant values as it d= oesn't require +//! constructing a [`Bounded`]. +//! - `try_with_field(value)`: Fallible setter. Returns an error if the va= lue is out of range. +//! - `FIELD_MASK`, `FIELD_SHIFT`, `FIELD_RANGE`: Constants for manual bit= manipulation. +//! +//! # Reserved names for field identifiers +//! +//! Field identifiers are used to generate methods and associated constant= s on the bitfield type. +//! For a field named `field`, the macro may generate methods named `field= `, `with_field`, +//! `with_const_field`, `try_with_field`, `__field` and `__with_field`, as= well as constants named +//! `FIELD_MASK`, `FIELD_SHIFT` and `FIELD_RANGE`. +//! +//! Therefore, field identifiers must not use names that would collide wit= h generated items for +//! any field in the same bitfield. The following prefixes are thus reserv= ed for field identifiers: +//! +//! - `with_` +//! - `const_` +//! - `try_with_` +//! - `__` +//! +//! The field identifiers `from_raw`, `into_raw`, and `into` are also rese= rved. +//! +//! In addition, field identifiers should follow Rust `snake_case` convent= ions, since the associated +//! constants are generated by uppercasing the field name. +//! +//! # Implicit conversions +//! +//! Types that fit entirely within a field's bit width can be used directl= y with setters. For +//! example, `bool` works with single-bit fields, and `u8` works with 8-bi= t fields: +//! +//! ```rust +//! use kernel::bitfield; +//! +//! bitfield! { +//! pub struct Flags(u32) { +//! 15:8 byte_field; +//! 0:0 flag; +//! } +//! } +//! +//! let flags =3D Flags::zeroed() +//! .with_byte_field(0x42_u8) +//! .with_flag(true); +//! +//! assert_eq!(flags.into_raw(), (0x42 << Flags::BYTE_FIELD_SHIFT) | 1); +//! ``` +//! +//! # Runtime bounds checking +//! +//! When a value is not known at compile time, use `try_with_field()` to c= heck bounds at runtime: +//! +//! ```rust +//! use kernel::bitfield; +//! +//! bitfield! { +//! pub struct Config(u8) { +//! 3:0 nibble; +//! } +//! } +//! +//! fn set_nibble(config: Config, value: u8) -> Result { +//! // Returns `EOVERFLOW` if `value > 0xf`. +//! config.try_with_nibble(value) +//! } +//! # Ok::<(), Error>(()) +//! ``` +//! +//! # Type conversion +//! +//! Fields can be automatically converted to/from a custom type using `=3D= >` (infallible) or `?=3D>` +//! (fallible). The custom type must implement the appropriate `From` or `= TryFrom` traits with +//! `Bounded`. +//! +//! ## Infallible conversion (`=3D>`) +//! +//! Use this when all possible bit patterns of a field map to valid values: +//! +//! ```rust +//! use kernel::bitfield; +//! use kernel::num::Bounded; +//! +//! #[derive(Debug, Clone, Copy, PartialEq)] +//! enum Power { +//! Off, +//! On, +//! } +//! +//! impl From> for Power { +//! fn from(v: Bounded) -> Self { +//! match *v { +//! 0 =3D> Power::Off, +//! _ =3D> Power::On, +//! } +//! } +//! } +//! +//! impl From for Bounded { +//! fn from(p: Power) -> Self { +//! (p as u32 !=3D 0).into() +//! } +//! } +//! +//! bitfield! { +//! pub struct Control(u32) { +//! 0:0 power =3D> Power; +//! } +//! } +//! +//! let ctrl =3D Control::zeroed().with_power(Power::On); +//! assert_eq!(ctrl.power(), Power::On); +//! ``` +//! +//! ## Fallible conversion (`?=3D>`) +//! +//! Use this when some bit patterns of a field are invalid. The getter ret= urns a [`Result`]: +//! +//! ```rust +//! use kernel::bitfield; +//! use kernel::num::Bounded; +//! +//! #[derive(Debug, Clone, Copy, PartialEq)] +//! enum Mode { +//! Low =3D 0, +//! High =3D 1, +//! Auto =3D 2, +//! // 3 is invalid +//! } +//! +//! impl TryFrom> for Mode { +//! type Error =3D u32; +//! +//! fn try_from(v: Bounded) -> Result { +//! match *v { +//! 0 =3D> Ok(Mode::Low), +//! 1 =3D> Ok(Mode::High), +//! 2 =3D> Ok(Mode::Auto), +//! n =3D> Err(n), +//! } +//! } +//! } +//! +//! impl From for Bounded { +//! fn from(m: Mode) -> Self { +//! match m { +//! Mode::Low =3D> Bounded::::new::<0>(), +//! Mode::High =3D> Bounded::::new::<1>(), +//! Mode::Auto =3D> Bounded::::new::<2>(), +//! } +//! } +//! } +//! +//! bitfield! { +//! pub struct Config(u32) { +//! 1:0 mode ?=3D> Mode; +//! } +//! } +//! +//! let cfg =3D Config::zeroed().with_mode(Mode::Auto); +//! assert_eq!(cfg.mode(), Ok(Mode::Auto)); +//! +//! // Invalid bit pattern returns an error. +//! assert_eq!(Config::from(0b11).mode(), Err(3)); +//! ``` +//! +//! # Bits outside of declared fields +//! +//! Bits of the storage type that are not part of any declared field are p= reserved by the setter +//! methods, and can only be modified through `from_raw` or the [`From`] i= mplementation from the +//! storage type. +//! +//! ```rust +//! use kernel::bitfield; +//! +//! bitfield! { +//! pub struct Sparse(u8) { +//! 7:6 high; +//! // Bits 5:1 are not covered by any field. +//! 0:0 low; +//! } +//! } +//! +//! // Set the gap bits via `from_raw`, then mutate the declared fields. +//! let val =3D Sparse::from_raw(0b0010_1010) +//! .with_const_high::<0b11>() +//! .with_low(true); +//! +//! // Bits 5:1 are unchanged. +//! assert_eq!(val.into_raw(), 0b1110_1011); +//! ``` +//! +//! # Signed field values +//! +//! Bitfield storage types are unsigned. Since field getter methods return= a [`Bounded`] of the +//! storage type, fields are also unsigned by default. +//! +//! If a field needs to encode a signed value, use a custom conversion typ= e with `=3D>` or `?=3D>` to +//! perform the sign interpretation explicitly. +//! +//! [`Bounded`]: kernel::num::Bounded + +/// Defines a bitfield struct with bounds-checked accessors for individual= bit ranges. +/// +/// See the [`mod@kernel::bitfield`] module for full documentation and exa= mples. +#[macro_export] +macro_rules! bitfield { + // Entry point defining the bitfield struct, its implementations and i= ts field accessors. + ( + $(#[$attr:meta])* $vis:vis struct $name:ident($storage:ty) { $($fi= elds:tt)* } + ) =3D> { + $crate::bitfield!(@core + #[allow(non_camel_case_types)] + $(#[$attr])* $vis $name $storage + ); + $crate::bitfield!(@fields $vis $name $storage { $($fields)* }); + }; + + // All rules below are helpers. + + // Defines the wrapper `$name` type and its conversions from/to the st= orage type. + (@core $(#[$attr:meta])* $vis:vis $name:ident $storage:ty) =3D> { + $(#[$attr])* + #[repr(transparent)] + #[derive(Clone, Copy, PartialEq, Eq)] + $vis struct $name { + inner: $storage, + } + + #[allow(dead_code)] + impl $name { + /// Creates a bitfield from a raw value. + #[inline(always)] + $vis const fn from_raw(value: $storage) -> Self { + Self{ inner: value } + } + + /// Turns this bitfield into its raw value. + /// + /// This is similar to the [`From`] implementation, but is sho= rter to invoke in + /// most cases. + #[inline(always)] + $vis const fn into_raw(self) -> $storage { + self.inner + } + } + + // SAFETY: `$storage` is `Zeroable` and `$name` is transparent. + unsafe impl ::pin_init::Zeroable for $name {} + + impl ::core::convert::From<$name> for $storage { + #[inline(always)] + fn from(val: $name) -> $storage { + val.into_raw() + } + } + + impl ::core::convert::From<$storage> for $name { + #[inline(always)] + fn from(val: $storage) -> $name { + Self::from_raw(val) + } + } + }; + + // Definitions requiring knowledge of individual fields: private and p= ublic field accessors, + // and `Debug` implementation. + (@fields $vis:vis $name:ident $storage:ty { + $($(#[doc =3D $doc:expr])* $hi:literal:$lo:literal $field:ident + $(?=3D> $try_into_type:ty)? + $(=3D> $into_type:ty)? + ; + )* + } + ) =3D> { + #[allow(dead_code)] + impl $name { + $( + $crate::bitfield!(@private_field_accessors $vis $name $storage : $= hi:$lo $field); + $crate::bitfield!( + @public_field_accessors $(#[doc =3D $doc])* $vis $name $storag= e : $hi:$lo $field + $(?=3D> $try_into_type)? + $(=3D> $into_type)? + ); + )* + } + + $crate::bitfield!(@debug $name { $($field;)* }); + }; + + // Private field accessors working with the exact `Bounded` type for t= he field. + ( + @private_field_accessors $vis:vis $name:ident $storage:ty : $hi:tt= :$lo:tt $field:ident + ) =3D> { + ::kernel::macros::paste!( + $vis const [<$field:upper _RANGE>]: ::core::ops::RangeInclusive =3D $lo..=3D$hi; + $vis const [<$field:upper _MASK>]: $storage =3D + ((((1 << $hi) - 1) << 1) + 1) - ((1 << $lo) - 1); + $vis const [<$field:upper _SHIFT>]: u32 =3D $lo; + ); + + ::kernel::macros::paste!( + fn [<__ $field>](self) -> + ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> { + // Left shift to align the field's MSB with the storage MSB. + const ALIGN_TOP: u32 =3D $storage::BITS - ($hi + 1); + // Right shift to move the top-aligned field to bit 0 of the s= torage. + const ALIGN_BOTTOM: u32 =3D ALIGN_TOP + $lo; + + // Extract the field using two shifts. `Bounded::shr` produces= the correctly-sized + // output type. + let val =3D ::kernel::num::Bounded::<$storage, { $storage::BIT= S }>::from( + self.inner << ALIGN_TOP + ); + val.shr::() + } + + const fn [<__with_ $field>]( + mut self, + value: ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }>, + ) -> Self + { + const MASK: $storage =3D <$name>::[<$field:upper _MASK>]; + const SHIFT: u32 =3D <$name>::[<$field:upper _SHIFT>]; + + let value =3D value.get() << SHIFT; + self.inner =3D (self.inner & !MASK) | value; + + self + } + ); + }; + + // Public accessors for fields infallibly (`=3D>`) converted to a type. + ( + @public_field_accessors $(#[doc =3D $doc:expr])* $vis:vis $name:id= ent $storage:ty : + $hi:literal:$lo:literal $field:ident =3D> $into_type:ty + ) =3D> { + ::kernel::macros::paste!( + + $(#[doc =3D $doc])* + #[doc =3D "Returns the value of this field."] + #[inline(always)] + $vis fn $field(self) -> $into_type + { + self.[<__ $field>]().into() + } + + $(#[doc =3D $doc])* + #[doc =3D "Sets this field to the given `value`."] + #[inline(always)] + $vis fn [](self, value: $into_type) -> Self + { + self.[<__with_ $field>](value.into()) + } + + ); + }; + + // Public accessors for fields fallibly (`?=3D>`) converted to a type. + ( + @public_field_accessors $(#[doc =3D $doc:expr])* $vis:vis $name:id= ent $storage:ty : + $hi:tt:$lo:tt $field:ident ?=3D> $try_into_type:ty + ) =3D> { + ::kernel::macros::paste!( + + $(#[doc =3D $doc])* + #[doc =3D "Returns the value of this field."] + #[inline(always)] + $vis fn $field(self) -> + Result< + $try_into_type, + <$try_into_type as ::core::convert::TryFrom< + ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> + >>::Error + > + { + self.[<__ $field>]().try_into() + } + + $(#[doc =3D $doc])* + #[doc =3D "Sets this field to the given `value`."] + #[inline(always)] + $vis fn [](self, value: $try_into_type) -> Self + { + self.[<__with_ $field>](value.into()) + } + + ); + }; + + // Public accessors for fields not converted to a type. + ( + @public_field_accessors $(#[doc =3D $doc:expr])* $vis:vis $name:id= ent $storage:ty : + $hi:tt:$lo:tt $field:ident + ) =3D> { + ::kernel::macros::paste!( + + $(#[doc =3D $doc])* + #[doc =3D "Returns the value of this field."] + #[inline(always)] + $vis fn $field(self) -> + ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> + { + self.[<__ $field>]() + } + + $(#[doc =3D $doc])* + #[doc =3D "Sets this field to the compile-time constant `VALUE`."] + #[inline(always)] + $vis const fn [](self) = -> Self { + self.[<__with_ $field>]( + ::kernel::num::Bounded::<$storage, { $hi + 1 - $lo }>::new= ::() + ) + } + + $(#[doc =3D $doc])* + #[doc =3D "Sets this field to the given `value`."] + #[inline(always)] + $vis fn []( + self, + value: T, + ) -> Self + where T: Into<::kernel::num::Bounded<$storage, { $hi + 1 - $lo= }>>, + { + self.[<__with_ $field>](value.into()) + } + + $(#[doc =3D $doc])* + #[doc =3D "Tries to set this field to `value`, returning an error = if it is out of range."] + #[inline(always)] + $vis fn []( + self, + value: T, + ) -> ::kernel::error::Result + where T: ::kernel::num::TryIntoBounded<$storage, { $hi + 1 - $= lo }>, + { + Ok( + self.[<__with_ $field>]( + value.try_into_bounded().ok_or(::kernel::error::code::= EOVERFLOW)? + ) + ) + } + + ); + }; + + // `Debug` implementation. + (@debug $name:ident { $($field:ident;)* }) =3D> { + impl ::kernel::fmt::Debug for $name { + fn fmt(&self, f: &mut ::kernel::fmt::Formatter<'_>) -> ::kerne= l::fmt::Result { + f.debug_struct(stringify!($name)) + .field("", &::kernel::prelude::fmt!("{:#x}", self= .inner)) + $( + .field(stringify!($field), &self.$field()) + )* + .finish() + } + } + }; +} diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index b72b2fbe046d..9512af7156df 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -44,6 +44,7 @@ pub mod alloc; #[cfg(CONFIG_AUXILIARY_BUS)] pub mod auxiliary; +pub mod bitfield; pub mod bitmap; pub mod bits; #[cfg(CONFIG_BLOCK)] --=20 2.54.0 From nobody Mon Jun 8 18:55:22 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011054.outbound.protection.outlook.com [40.107.208.54]) (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 B2B77403E98; Wed, 27 May 2026 12:52:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.54 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886340; cv=fail; b=sCsn3LKBDBvv64obbQ3FXZrK9L9MPkkJDAUfSb0nwb8evRHU3funJrQmnChHOs4ciAlMHQ0nFmb4GNhzf2ZHfRLHa0EEERJMdPP2TaaPKJZXvtxIgptO03PbF+hDnAuJcIdtsnYDMqRuIDeRgNZgx/NobVmxi8pe5uCnYvUMTi4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886340; c=relaxed/simple; bh=Vpp6KwTE6ElBsTtAHNwNvm2tozvVtI6jDMkeJsytC30=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=rlfkQEGRIkuNRwZj5Uwf+5KdSt4ALZMKmu0hWbANINaGp0rmCXz1rZIG86hGcFr4HAxqaVoC32oR8m2yUKpHAM+irwHwUSpimI22+2WUwTDSXP44NvieBACcydTCljp4D76QOk1BFesat5Sz3IgD4q+S2Mij6wa3/3cVYSw2Gq8= 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=VtftvHV3; arc=fail smtp.client-ip=40.107.208.54 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="VtftvHV3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZmDyP0q2HMq9CDomaswLM4Ou3OP8mCiDSWl7YAoXJmcADjmF2cms+skKx9/e8oCZaLevE0PNQKm+KsPScgYTtmfgjSYCNgfdni6YvtvjPHgmnDZIAjvEYEbix3kAHid9zBCXDCMLN4WlbG8QT/ol3ZuFwqYvOjwFFclSu0YuUMPdlyhUQsdsBtIQT0lLTB4XJlJ5ysdw1IvKzzdjHmNInjdDY9kLR7bx3/vG4x30+4mIk7c3MRk81Tz/udO5WqFIZ/TaPFCm5SBRASW3TZoy2+jEFQ9WIvLcuYM7TUR1Kmpe/+sufPegJPKPiEXcl+V3Yes0Q+p2TFto9SUZSjm/Fw== 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=1g8t0NX1jpXPWoVuBsE6i8k1uacAw4ctoYC6K5+ClT8=; b=ZJQWQ4gyUUOCsijs/fRjqZgEMwiFJwEsucf1Bn1xRiXheBjMd0bA4yJ2jlzIJxLyHY2r+aW5YGtnCQSPxmHpK+NmebcGJh4ON89XAIqiW0faCoZAD39ljlHGzTDZemclIOnoEV+8AqhrSxlwntlDNc3VsEoqpOsxFHr7IYqa/KLhvc9IZMwHy7UMZ7ZVi4s3QUxSUSW3iVVqzmFmWZOWT4I7nOnaGVuThgtliX97q+ekdc0VM4+LxDIXmh2l2KxyLy0AjiAODMJbVoFQfAy725vzq5olaUC8/kvNcEAaWasbIoTeUpnEcUO0qeZtzrowhijhj2U8KffX641z6T0rVg== 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=1g8t0NX1jpXPWoVuBsE6i8k1uacAw4ctoYC6K5+ClT8=; b=VtftvHV36mYoyqih7MElyHs0Y03J8EvtCGT/3d0RdzS5LsnJPT/azP4fpD2T/id7q8gd6eG2TcxoumIorVBcGPAqX6klLV9jBlHnXvP7Fg2/0n1cjdcq6us+q7UYtsroSYePWJRz1D1SojYsgFYhu8AB1ELeKEJNtzvzzv+6HUdY0B7xF4myeEdm9M1DSsbngaimaPRoSt4TVTeEdjlP0YMRCgxCd6Is5iYkGU5jwaqtq60zq52jfpQqqVwcrzu7oUACq7yXuyDTf3TL/P5GinYzd5toZeiNjj+bqIq16PGOO34KlQIdIRay8WuhgeE4/UU2otDgcchVA+d7tGadtw== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52: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%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:14 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:51:56 +0900 Subject: [PATCH v4 2/7] rust: bitfield: inline private accessors Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-2-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4P301CA0116.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:37e::19) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: feaaee51-c7a6-479e-3113-08debbeec64d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|11063799006|56012099006|22082099003|18002099003|921020; X-Microsoft-Antispam-Message-Info: kxP7De5s3Lta0DvRlgBov3DJKfzu7KezE6fQGADVgiEcsp1iPy9MiHiDW0zI69SkbebgSlctcv40QCZHqyId89T8f+HrbzRQkm2uZJZlYZKqY2VNE3P4jL7780f1PyDcKV7AImG5eIYSswYAskAJZIKsP2RVI/aRQYCD9DpXXhH4WN5ZzHL4XWw8tDiZkQ94IMdrHyFMpdbVXxvZBWlDjyExvwsJhFPR9YAvVilNOvP5dRUwD6bcmtaCSvK9KgDRstP39+Azx5Pt7vVwhHm9Ol7rB6l8E1Wj1a9zYzxTQ7k5rVRMZBkda6IrDg37ylobHYu/3hgGybGdjNLg49t3iKIBlDGeldVpG/Z1MvUx4J7BxVUNPNlE/Nvr7WUdIy31VDsULYARCUHcyJlVczLKGJZk4Vk+ch80QZPXPpyWBsRX1pGgVpK97dQ/cGCnzUksg2/fxpEcxYDJDXMpj75FgUc18GGIivZZAs/CaXGZwg+sUfqKwKoIDJCc5I75FgCXRtKCdoNLn4+rMhG28s0979QdKAPvZw7n9jIf42v3ulDhy2OCdDTl2YskbUWp0uEB/OAx49ZXA72onChURSa6D0cU8xbLA1VOjM7D2ICncupbl+DVOCDbTur3YkfQD93gJzIxpxOzEernQzEEtdA7obNSlpl1HVq/ZIro5UYCqC/o+Trq1kLFXt3ZX8a9YGvMibn4dx4XynkmCEV8/dR+GHnJe40QXMVltxvIeqrekkwP5Bfr0KlWU+KmeJomt7iv 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)(366016)(376014)(7416014)(1800799024)(10070799003)(11063799006)(56012099006)(22082099003)(18002099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bjVjeTVTOGRiK3VOM08zWktiVUUwWWE3YWx6V1pHTjZsV3YvaWVCMUV2SlBw?= =?utf-8?B?NXdpaHRoMXM2SkwyYmcyT2xLQmE2SllRZ2NwVDVNeUdvOFNkYUtFKzZXNG9K?= =?utf-8?B?M0pHKzRzMHdyeFNCaWVEalpQTUpTSGxqdTdKVUZhZzRIaW9WZklya2duelYr?= =?utf-8?B?MllsdEQ3YW56T2NvMk1kMzQ3N2psRzlFQm5uMitpbno0YVdRVUUxVFptalNi?= =?utf-8?B?a1gzOXlNS1FKaDlpeXJuQmhSS3p0RDJyZjI5azhSYlpEZERkanFFcTNuaThI?= =?utf-8?B?bllBM0lsclUray9GR3BHd2RNM3V1ZFhNQytUV0ZhVnF3MHVZMWtrUXJCVHRP?= =?utf-8?B?bmd6MlFGSnVvN0JLdVFKbW81YmpzVTFFNllrSlQ4LzZ3aHBLejhPdUxIdU4x?= =?utf-8?B?SGdob0FkMzRyc21wN0gzRTVjZDk2eXgxNlhkOStEN3N6U2VlWmhDQzU3bjVj?= =?utf-8?B?bnF5UGc1SmgvOFcrbTZybzllZjUyZnZOK1RHU3p4ZWUxdUF4K3VtTm5KdjRD?= =?utf-8?B?em8wZXZ3aTkvNEt6OXRJK2JiQTRBR2NJQy93bkJVbE9rcUZXN1l6elNQcEJ6?= =?utf-8?B?TmtXWFdlSTE2WnpIRHRTOENoeG94VEtTczhBT3JDMG56bEtxQnh6UXpkWkR1?= =?utf-8?B?V1lhemtjVm5qZzF0aE8yNURnZjZKbTBUWHRJcjFlbGs4c2ZYOXBHdk9Ucy9r?= =?utf-8?B?TTNHZXJPdjJXU2I0a2R0OVBkZmM3b3pBekNZa3VwWGxvYzN5Zmw1amFoTE4w?= =?utf-8?B?S1pQZmd3VzcwWGI2WmhaK2VPQlhOekp2QUkyRzB2RkpBYkt2VnBjRSsrdW9j?= =?utf-8?B?TzZDcjI1UkZ4MXBCUExyelFwNnhJNExWdytsSjlTWWEvMzUxTWtGaUdnY1BP?= =?utf-8?B?UHQ4dVVUbzRrSitYTlRKak1oZUxoQnBPU3JoNGp5Ylp0aDV1L29LaytSRXZ5?= =?utf-8?B?ZlFoSXgrRzZOSDNOUkJVUGJmRGZEc090U3dBMEtsMUNHVkRMS3BrdFBkclhI?= =?utf-8?B?bkZtdk16ZTNORDVIYVZ6WmdxUFMvaTdxNUZUNVZYWUxtMkZnTmdaUFRjbVNi?= =?utf-8?B?andOOUErbWtBSGpTR3EyNS9YUnh1MDFYZlhQSlBNQTFudFFpNE8wRUYrQjNN?= =?utf-8?B?TytpZDlmRVZXUFlpRE5OWndSOW9peHFmalFvOTgwOGNIaXpKQ2xPZDZaUWdP?= =?utf-8?B?VHAzcmhOTzZwNlRTYjZUclg5SE5TVUJrQ3paZEwrTUtzdlBVWEdISlh2NFh2?= =?utf-8?B?WU82Z2Q5MHNRYk1CVFVIU2RFSXpqczQ1NERyMy9ySGdoSmxhQkVadG51SlNW?= =?utf-8?B?dnlVQkp3Qi9rd1Y0eWZoRjhmcjh5SlZQa002dkFES1NaM0RlU0xONXZHR1Fs?= =?utf-8?B?amFVenovY0Y3ZmFKUUZSRzhIc2k3ZDVJRkVJcEVPemZ1K21wQ2MyNFRETk1Y?= =?utf-8?B?ZjZOenBOckhoSnZUay9INTlIcFpxbC9wdnFRVU8xYnNML3Y3SU9CRXdVdllN?= =?utf-8?B?dERjbjQwRXZYVklVY3ZZeVNtajVXOXNDN2pqVmg0MGVPa2FNdnlkZU9DRm1V?= =?utf-8?B?c1lnOWNwWmp2L3l0RmJLU3NnT09WNnFUZ05MN3d5eHJ3WUZZNmRwZ2tseFJa?= =?utf-8?B?Q1NKQ0VqZFJKdzR5TU5yamZIeGx4YkRDeXRTMDNhN3QwZ280VUg0cllnSTlh?= =?utf-8?B?N2o0YjNyYTZpaW1NM1RJdXRhRmxEMzRnQ0lNRjRyWEJTNkJ3Z3RTRkdpSVQx?= =?utf-8?B?M21OVDhXQmdUdFRkckFwQUQ3aWpMV25hazBGM2pvVE9YaEIxdld2SkVaTStw?= =?utf-8?B?RmRUQ1VKUS91bkZQcnR3RC80QkpsOTYvT042bmJiN1JYVHpHNjV2V05OcnR1?= =?utf-8?B?dTNOMGh4U0Z3UWZaZ21qSm5vTmk3YW1ySUgySjYwblhWWVZ2L2s0V3plSWlV?= =?utf-8?B?L2ZKakVMUHFpeFZlaE8xM1pWQlFDS1gyVXRubXFxdFgrUDBBNkpLU0h6T0F6?= =?utf-8?B?WkpSZG9lVFA1R3FLbEZtZDdaVHFwOFNFeERuQUY0RFo4MEh0blhYTkNUOVZw?= =?utf-8?B?cDZzRGxMd1hVUlVFdzlZUjBRbzB1djBCVWRyWTZ4NGhoeW85b1dudmVZUm9N?= =?utf-8?B?VXgyWnpqTGIvNkxMRExkOVpGWmZjcmowRlBNOFJneHRiMHUvLzY4Ujd4SThp?= =?utf-8?B?VUtORUZiZjNMeFdKUXE1bHJUTkdKeDRIVGFwZzJFSlNGSnRUY0pwL29PblB3?= =?utf-8?B?Qytlams1dU1yODZQcFY0NEFWdlpQY205L0ZxUmhOSnVSbktPZC9hMnFkV05j?= =?utf-8?B?U3JVNVU0a2EzYXowcEdvaVJLbkEzR0lrckFNM2w4a01kNk02SkxvT0VjakFq?= =?utf-8?Q?ErAhKtq+ASvrsaC1XwY2iMC+J7AuQO9CsQ0ZCnvt3ovna?= X-MS-Exchange-AntiSpam-MessageData-1: nKGEvSOw0ckQPg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: feaaee51-c7a6-479e-3113-08debbeec64d X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:14.1570 (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: zfh6B24giNwq8qpHmixTnXx7YfAfNyM7nLmzOh/JFwQrzh3xev/YR6CBbq/1vl1GKSqbuqericnGdsvP+RDfug== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 All bitfield methods are inline, except these two ones. This is an oversight, so inline them. Reported-by: Gary Guo Closes: https://lore.kernel.org/all/DIFZRBF3LYHN.19Z6RBMECXDVM@garyguo.net/ Signed-off-by: Alexandre Courbot Acked-by: Danilo Krummrich --- rust/kernel/bitfield.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rust/kernel/bitfield.rs b/rust/kernel/bitfield.rs index 4083e7b7a307..b3ad5fdbfb23 100644 --- a/rust/kernel/bitfield.rs +++ b/rust/kernel/bitfield.rs @@ -385,6 +385,7 @@ impl $name { ); =20 ::kernel::macros::paste!( + #[inline(always)] fn [<__ $field>](self) -> ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> { // Left shift to align the field's MSB with the storage MSB. @@ -400,6 +401,7 @@ fn [<__ $field>](self) -> val.shr::() } =20 + #[inline(always)] const fn [<__with_ $field>]( mut self, value: ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }>, --=20 2.54.0 From nobody Mon Jun 8 18:55:22 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.37]) (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 6B1CF4048A7; Wed, 27 May 2026 12:52:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886346; cv=fail; b=js8dmziptyKqCGTb+uaRTpgBjU3R2x2qjAYaDDuwjurxFMAaIHWPxCdHmx8lYAu/+Yal2LmXfvupt+VMl+nmELh779jvd8KfIZCjP1eDgejowLU25p9h3ItM8wvUA1C0I1uCMcjjMcgIbjkpqzRXa6PS/pbxTLbLUDTN+a6PXxE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886346; c=relaxed/simple; bh=BYSz6PK/WtLF5Nxhs1/Kjv7MZmSmpaipGBucRTHC2EY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=ZxCt5rYvADEWFzJsiy9BRebkuSs5twj7mRl69nOlc6tczWlYDaAH7tH1kIKSuH7L1sj620uXlqol9Ww3VXt6zhvyaOZDZ5Q9zgYc2/MA180/xP2R2j2qQ0o5dxWI3XdvUyfuH4+0koaVLTZOshwyRFjVbAt0LMWEzL8hTutGI9I= 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=Nnopslpq; arc=fail smtp.client-ip=40.93.196.37 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="Nnopslpq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=riu+qWaSo8kyAaC7mkewm7uYDTjVtaEOSXXxWmUnX6R2PZyD24YCTvPtLZJk1BL8udLbtA6mbVJOGdSeeuTErB9WNKBFv0jwgJel7/hJNCyGdCol2CFjRk3VHc5Vh62QbD3LQvq0B88K6TgbU9ajpTkLB4FgrfmbLmt74UQyCOeVjKFE2KVTqItw07FMh4GRhwcIhJaKhmu+MiXZQr/STdISukIowGTC5WndB6jH0MsK1GK8o21cjyiovQ5kPwOcOkvCFL6ItIYP+Kkb5Uynsz6tHBsB5zDxjVS8QL1XWTA4K5lfLwXXas5n7OYfLqLULZuEGyR76cYDhcdDOgdKBQ== 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=QONApSvRuIUE6+OYVViTmpj2A00BUVh/xSHPRZ3a8Vw=; b=Gg9VGXmWZK25q9to37u73czx/rjHTqsuqCqnfGv/d7ENGLdNyzHpfLpGZNIkXlmvFrhqkvLGOcfNvLgnigxe0USZOQQKrgAdfbMOxEDpumup4X7clpfG97ALzP26JSM1eJr4kYw61AIL54tUqCEdMevMQL5LkEREos08kcg2jAwiPBtIkP/GNuKFh2CKi5ukiCbl47h2oW4QvfqrQ7f5/9amTUkxTtzROglRPJQ1bQFl/sAzOg95rsg/nIHu/XdUxm/NM21qh+/JxSgYkONzu0w5DJNYkdwMfkEFK5He0PPUDHqfAB/BW1/A2MDOKSlrS+AjyIlyQzidO9dHWc+h/w== 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=QONApSvRuIUE6+OYVViTmpj2A00BUVh/xSHPRZ3a8Vw=; b=Nnopslpq8oz4i3fPucHPaM1yJ77eXYEsuzZUc7C/BZwAuR2wrDcoIdZN3TNr0QdhhVMqE3OcAWc8OYzRjbK32gqEB3VdjMIB2QCvPnPGP15D6mKYYQn+0f6xDzo/dRL0dY7TWTN6SZt0HEUV9j4IRkuu0blNz/faemGdnk3xvD1L3XCRwS9ZCeeZj+Ku16JlDDS4MQ4DN+iKqeIYBK1HIwv8TWEw2yccYQe/TarMORx18p1sW0XX1dKzp1h11oZxDSjNCkm4hQX19V0PJISuSu9NWubue2wvW1RB2Y2ijQy1L4aI+2vbLqp6oy6rPGBwG1y22L1e0O+z6om9GK0NJQ== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52:18 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:18 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:51:57 +0900 Subject: [PATCH v4 3/7] rust: bitfield: fully qualify types in macro Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-3-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY6P286CA0017.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:3b9::15) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: 27c395b0-962f-4d21-2ab6-08debbeec905 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|11063799006|56012099006|22082099003|18002099003|921020; X-Microsoft-Antispam-Message-Info: WMKJ5sxVCM705IhM63rtK8Lc2L0sqcgj/mvfW0TTBoY82p9apiWu+P+nhny83ShMS86977LbKbGMCXfkc7Cc8cotjCjq7zG1LbQ/gsm/xRj9E+90/v9nF/IfNh9cazHQhMBqJSDm2bwpHSHClty2Sxrn58fLd0Vnh0JuqReHE2d0xo5fsEU+D8cua2ENXp7aAaIgmHFEuMbufdSZue59gjiESknPo5MryNkfb6Evypyl33xAMit1Fjx3Bdlm1KpNk/HGNbpbBXBUDM33As7RJxiKIsDPrg+Nz+AfbdDj9cbAQm6N6rLmJqmsLC4QOAEkSkFqb8ZJGnkWDYVRQn+QAO28gqmdFbm1ETgUQjU9kxBGGtlpse9vkmU+VNp3ddPvtRNyvGMdWUoZhHsqjM1l2Ceg6RWG9OTNHj6wJq0HxIO+nruiVj3AiE11hgE4P3VIRD+Gnpj4NVumNpD+q5PURsBQ9osl6YGJankxfp7kkeU6FgMVTKcyklwsW1YFTeYF4oIy6Ex0J92dM0jDgqT+0VI4dJjOd1eNVfEJ3gHUAI3VB12QZQqSB0XN/4+ajmTxuIhnVBIhiYTuhVSRGb7D+a++9JUcsOAASWTayumLJzMb0uXcFVad0uP2EyRWreYcboi2he2oPk0mUcMI+fkL1X8Iulr+gxbbK8pGNZV2K6wKBYApU6nq3t4nM8uodFyM1y5q2YnCH9vjNPdSlxUax9VGC1I1Ogf8Yn/AurvclWw= 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)(366016)(376014)(7416014)(1800799024)(10070799003)(11063799006)(56012099006)(22082099003)(18002099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?S3djRnlGV255REdlc2l3SWZyUnQ2UzB6aFlVaEVhWTI5MGdna3hnOEV4dzBL?= =?utf-8?B?UVhVeWhlSTNUSzNqWDlPVlZEK3VyaitsQi94V25oSlNaZW9kNTdCSnpDUWV6?= =?utf-8?B?MDdVN0tEZG5VdUZQMlBlaVNIVStycVBGRnpGdXpGczh0bmYySTZOLzZkbnNu?= =?utf-8?B?aTkyTkpybGVHd0d4azBuQnFiWmN4bjZ0bklVOXlpaVlvQm92U0M4YzRZR1VO?= =?utf-8?B?amY3a3RSbWlOZXlueFkyUU1VdHNRZmVEbXZ4dzVJZm1PaDNJcHl5SjBHNW80?= =?utf-8?B?S3Axd3NZTjUzaWpXUkFhOWZYbzNyd1Y5d0dMOUVPNTdMVHVqblpHaTBYemFm?= =?utf-8?B?UE5UUEwrZmRZRmxGV0pkVmFrT0srVFZXL1lDMlVYZVVtbG5kNEhUSmJOait2?= =?utf-8?B?dCtwbHE2Wnh1WkJXbEVMc1A2MG50RExheVFOdmpPTGM4aklnS1JjamgxUWVi?= =?utf-8?B?ZEVFczhVRVNZS0R5Ujk1NFl6cU44MHl1bFdLZTUxTTB1RmFKL04yMm1zSnlS?= =?utf-8?B?dXVrV1pGVGR6NmtYS1pPNHk2elkyeE95bXYzTWpVc25ZS290UE5QRXB3bGtG?= =?utf-8?B?c3pKYmlhVGZObFF0a2ZQWmZ6cU5sQ2l4Vkh3OTRDV2ZWK0R0dkI2SFZIQXBW?= =?utf-8?B?UjVGdFN6QXpoNVl1aitaVmJXd0dMZ05rbWU1OGlMeW8xcDZiL2tjQ0tBYkJq?= =?utf-8?B?LzNkcldSd0NxUUU1SElwSjRIWHBuY2xPYzl3THkvUVVrVVR3REFFS2ZxMnht?= =?utf-8?B?WFZJYk51SXYvL000T3U4T0dUanVxTjFhdDQ2THIwNkFzOG51MkNPeFFIUU5z?= =?utf-8?B?dGxwNytSSEYzZ1ozRzl4Vkp4UElaMENhYzFjbS9Jam5wN2RaZnFVdzYvd3JW?= =?utf-8?B?RHluTktSQUF2ZkFGYlRDRWhJSUtZTURaVStIdUVQaXVlR0xXMTRLbnlnaERr?= =?utf-8?B?eU9qczY5dWlVdW4wQklFSmdCZXlBS1lmci9iYnlwRmZ6bWFnUXVueEN6azlU?= =?utf-8?B?NVVFYUc3bzRDZ2owYTFQNGJBZnRuTTVGQTkwS3Q5cVVlcTlPV1JYVTFYTm1P?= =?utf-8?B?SDB5V1E3NDkvMjBnT3BhL0JtTUlzaXROU21RR21rRHlhaHRkcUp2OXd1WEdz?= =?utf-8?B?UGtIcThNcDQ4dDhKSE1vU2UxdmRlVmF6dm5LaGhwWXhUekM5aE1qMWJOa2J5?= =?utf-8?B?VkpZSU9rRGZ3QTJ1SUdjRnJhc0F2ZEI3SVFia1VoNGFvbmlhUUJqd2lQZ0V0?= =?utf-8?B?cUNIN29OUTh5SlRTNTBQWVdSb1pWeVFMVnVlK0ZJc0JEQ1hYbHZGVVpXQ21x?= =?utf-8?B?WEdmOFNtcDdqQTVwM1RlbW8veEZhNks4Zy9qRmZReFJwVTk3YTdDNWQzS29n?= =?utf-8?B?UXJvYzdYOUtGQkdkdFlCaUoySHJ0Wm1vOXNpeWJpZ1RVK2FDYjZyQVBZQXBx?= =?utf-8?B?MVAvcGRSeXQ4cTNQZ3YySE8wNm1nQ3Q5TzdKMWxHRE1mTFJsSUFJeU40Nndr?= =?utf-8?B?ZVBEV0hQR3htMDRMbnFDR0tQaEtSNzNTQ0ExNEVRRTFCVm9mQ2JUeUpMeE9j?= =?utf-8?B?Y0d6SlZkMWpPaDVMYi9nZlBlaWVkRHlsTUVPRmZySmdGWHZsOVFsY3dJM3p1?= =?utf-8?B?bjd0U2xyVXFUUWZVUktwUE04eW9XbFoxSHkzaXdFTFJIWitWamJZaEZmdWNv?= =?utf-8?B?Y3lBVU0zMWpuaGtzR3ZCOUw4bFJCQm4vRWtFQlQ5WkRCS0hnYm56aDNyczB0?= =?utf-8?B?ZGhzRnl1WlRWUHNuemQyS0o1Und0R1YrOTA4MjVNaGtkU3BSMnk5U3FUdGlu?= =?utf-8?B?Q1VJTXd1VFFzMjBSaXRNM0N5UDZNMmNEOHBTdHoyWkVXbGd3VWxqU1MvM3Vy?= =?utf-8?B?TEJZdXJMVWJ5MmtQQ2JVMjd0cG9FZ3dWWlRjKzVkbFkrMWoxckIyZnhJazlM?= =?utf-8?B?K1p5eDVJSEwvTE1VbmdjVEJnZkFkYzVIM2x6NmMyQVUzd20wMExoWURxZ0ZC?= =?utf-8?B?S3NKbkUxVnBxRHl6QVBMeC80RVZ3Y3JlQmxsR2pGbWZTRkF6Z1NsMGlxMU9t?= =?utf-8?B?a0g2azJCeU1TaDRIcVRxVS9kZHZEQzNNSTBtZU1kdGZKV3M1KzUvcWg3Z1du?= =?utf-8?B?OHlaSHNKbFpFTjhJbmkyZG9VckFmN1RNN0k1bVZVMkFTTlkwdmU1M2VnWmxJ?= =?utf-8?B?Y0VOMTZ2cXFoZXdFRCtESy9MMTI1OWREbDZ2Z1FxLzdELzlEV0tocXJUTU1t?= =?utf-8?B?ajlKZXFOTHQwZVBPdWM3c0FGOVZid25pMDE1VCt0TFRnZytXMDVMVlBZKzFm?= =?utf-8?B?ZUpETmZTMGwrbExzNWw2UW41djlFUWlVbDBUZWg2L1ltZXhsZ1Z6VysrZU9z?= =?utf-8?Q?3cSzDyfXyJMdA9DPhvfcIsQAZb8wwR38Q++TvDCkN5Aua?= X-MS-Exchange-AntiSpam-MessageData-1: yWTRQmIoPIcK5g== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 27c395b0-962f-4d21-2ab6-08debbeec905 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:18.4989 (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: 6yhk0l8QwAaRj4Ato5wxyPPVswDLyvvNlprDAoVn3RLx6hI+mXo72vsNuEYy/WMCtRMZbrVVF0fdGpf7K/Rryw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 These types were not fully qualified, which could cause issues if the local module shadows them. Signed-off-by: Alexandre Courbot Acked-by: Danilo Krummrich Acked-by: Yury Norov --- rust/kernel/bitfield.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/kernel/bitfield.rs b/rust/kernel/bitfield.rs index b3ad5fdbfb23..2498107979dc 100644 --- a/rust/kernel/bitfield.rs +++ b/rust/kernel/bitfield.rs @@ -455,7 +455,7 @@ const fn [<__with_ $field>]( #[doc =3D "Returns the value of this field."] #[inline(always)] $vis fn $field(self) -> - Result< + ::core::result::Result< $try_into_type, <$try_into_type as ::core::convert::TryFrom< ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> @@ -508,7 +508,7 @@ const fn [<__with_ $field>]( self, value: T, ) -> Self - where T: Into<::kernel::num::Bounded<$storage, { $hi + 1 - $lo= }>>, + where T: ::core::convert::Into<::kernel::num::Bounded<$storage= , { $hi + 1 - $lo }>>, { self.[<__with_ $field>](value.into()) } --=20 2.54.0 From nobody Mon Jun 8 18:55:22 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013016.outbound.protection.outlook.com [40.107.201.16]) (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 E8586405874; Wed, 27 May 2026 12:52:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886353; cv=fail; b=SbZm+YXvVO3/dJ8ICGvvsUtLvGJZhCdH1zw6Om3kERKS7xw8qtPLXEMzFAc9UPY9SFFWT/4sQXtmyXomYlqwhHtcOu/WeAOFTrwEdMnJ2zR3GMf0Ys3C5jTmoKnz4yIo1heRy9N2K9cbnwwY0OKNHCeHcvvhftWNqmiVZ5EpIsY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886353; c=relaxed/simple; bh=GZQC9BijEtkhfFeoAU+yGeWWze+MavUSuyNwJCYl4rE=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=t+gACW+GSjMwd44UWemrEIFCA0Hjq+BD+TslDBgmPUBoOdw9lmnbhoumFOAvNfqz3YV9pnpoNCCMYWB3jC+skQymMvCe7RO1xbdIlEdLhs7flIR9E29xcxSi4Pm7A+3+7OwtxMRVwZbz3gVch+VohvO21QLRE/isgsfosv6Kqbs= 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=IkOlCqDR; arc=fail smtp.client-ip=40.107.201.16 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="IkOlCqDR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=y79XZxXBrORj73/TutzusAjpw2t+HHBgL95UmjBvzoXzygY8QyNzf1CLCm117hgdyNm2A0VA9Blc5BAfuuhTEpgU4Si1MXx4Rq6M/Kq2palUrMgnTmM1Nl27owzowlvt+Bq0aeeat8i5DusYWqY0QZXJpForEHqfv6fE3qzIK5L9eE7aDz0prmNxG+/khkl51ij0xN1zAbohBDHmcU2GN/v8vWRb/zDwwZ8eYGEM6VJrEB6KIyDK+GnNoPCgYgOoso8EunOVItNCG6o04SmXeZw8G3+G3HbOCkUeTtQNZ8gpOKkbRKU4gmwFhlp/GSSKBO0fpoSftaK9NYL65+ojCw== 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=amEDLuwKtFZOk/fHmbcfIN49kJ+5yadhZytH2Bm9Oak=; b=ClyFjL+8+fvjV/DIOKJs8lrMzZto2hegcbl/ZU0Dh6v+viRAqw2d8FsxdnnLmHfiRgQzzBBkTfKMIhWqxvMtvFV9/4vRwgH+yH9uKjgxOwXBXz66gt8jmZ0U0t4cKOmuRLBKO3RbTYHNCekUt1mdy9Y2MwK7iURivyGzs8NcshevqADzjAsit4QBa4I1Ec8FFDssEUgJfyXlTHEwyj8pcrX71gx+qBy058PdehUfdQWnPvyIIwElrgMJvyzGeFCINAr5bHDmoAtVdHsH/kSNl/MBQU7epQ2KE1tYI7+nx7mOGW2W2DpAr5moLNr1EI9Jv8gsYb4RqslU50viITLC5Q== 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=amEDLuwKtFZOk/fHmbcfIN49kJ+5yadhZytH2Bm9Oak=; b=IkOlCqDRycXQywsPdSTBFTyfHnyzKPZ7gaNOcvbLBeGcXUWIOMRJfU8QwZZLioGMbb/XBOZzWOetv3PPoXQ2XUwGO/VaKhvMUXjKvPO4oayCuxUPpBchp5FZKDnxwplmgZ59+rwD/Z7nKKcQ/m3mpDECSaVZjP8RHcbdq8w3v6egLMHCzuCNa0o07DyP15SDmItPha9Mcvv5iqyL9wHAY1QlqFAzVmu3soHIdcVP8SZTL6M73QUzfc1XOsq8gLSB/6j/T63yKq5vpKJ//4qoqvIAbx5oWZiPHdyxq+2PX1N3xgCtPB62of+pIfhGj8n7gpRdonQl9RTBIZVcT2fM0g== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52:22 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:22 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:51:58 +0900 Subject: [PATCH v4 4/7] rust: io: use the `bitfield!` macro in `register!` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-4-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP286CA0229.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3c7::8) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: 8ddf564f-8f3e-412b-8d19-08debbeecb53 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|5023799004|11063799006|56012099006|6133799003|22082099003|18002099003|3023799007|921020; X-Microsoft-Antispam-Message-Info: DZ2I7kB5UnpZXn36wwP8hHh3HCJkfg/RUaWYSK2eQUenYJBRpOXKT6cBzfyXYoCMshQYzBe7CuzFLOz81DDpnTOEZpKq9+852u2q+SYRwlWlFr5cFGJAEhFcWjCurmcZUkN/o84iLRzk3TTuoR6ozktOF+QnJpekpUmacZdqb28ldcqd01643AOFA1HM6+OlYKnp9HRqVCB/oCfupMJwbTt3MR/aTfJZwZ7CxEBbMXNMxIPHS9ekKsFCA7LkLWvDypFYQnyDwonAK7OtPXwGItvE/R55QOqO+Nye0t0njmo3y9j+PPVwkqtJoovRZb1ld0SR2/4PUabQ9PKl4pJYO6o34Oc9WQnb4sguGOumjjkveKPFz4YAM6r2/eClVGe+i+6loN5S3k8YFv8pyJxOUSUXQtPxWx8vk7tE7//fxQDhzIUVJvrR2488Tlyc0FCvmXoVHqTUlVi8macfG0fK9M/+bghPjEPWTHpbcvhpTKj3Hbu+R3jghmjA8JS3WOlmo+HOY6Zgq2kFCQSS13i9l0aLcTbbFtPNpao5ErIHzJGvxFGfX453f8vXNQdYpxtPyN8qYZsFw1626P5kA6yDa0CW240Wi9ag5+AYuYrM9b0gQgwaDff+SDe1mD5SJvhyZzynx2Dhjcoj2QSVQ4oBeMOWiZaBujsnOi4YEdJvZ+YAVEoQPOKDUpzH94qcy+yUoU9P2Jfcoe33jcZmE3q5aEAqOWdx+ueb0WUsz5CxkD8= 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)(366016)(376014)(7416014)(1800799024)(10070799003)(5023799004)(11063799006)(56012099006)(6133799003)(22082099003)(18002099003)(3023799007)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RnJsdEkyU3JvWmNhd29Ed0xLZ0F6VXFWbEQ1UzdSUFEwWUxmYmxuMC84cXYy?= =?utf-8?B?OGNobzQyN2ozVHZIYk9xZ2owYTh3R1lEUEVRNS9tNW9HNW5DSGlJK2Q4Zmlh?= =?utf-8?B?bHNYMnZQd3JpZlFSaktlRDR3ZFo5Sk9Uamd2NzRzdXJkU0JuNVk4K0NVVzFN?= =?utf-8?B?TGl0cmtmQ2F5UUdxOWhjUSt3ekxNL2YvMUFNaldtR3FSdTc4MDlob3FZVmVs?= =?utf-8?B?QWwzbis5WWF5ZG9POVRoS0wvTnk1ZWhhVS9GbDg2RXFEdkR5RVRvSlREZDY4?= =?utf-8?B?SGZtRVJDYWRuMUFMNWpOaXVMNGZKTnJmYU9FTytDVXp5V1dTS3NERzgwci9E?= =?utf-8?B?NTBHQVJlRk5IWXlQVkJHY0NkWlF1eXlTQ1lvQXo1bWtodWhaRXlxWC8vMExa?= =?utf-8?B?eGVvRHNXWU9LQmF0NGlPUjBVL3RYdmpTbytoWC8wRmQrS1JnS3NSWkN0c096?= =?utf-8?B?SFBRdHA1REVNSTM4c2wvaTRWeGd4S0ZKalRJdzJSajVPaUFqVlphRE5XT3l6?= =?utf-8?B?VkwrdDY1TU1rdVNTaCtHWHZmZTJLRFVkVXovSUl6VkQ3MnFWZDJMNVFETXRp?= =?utf-8?B?NnRqYTJXWUZqSjJWdFYzc1I5VWExNGl5UWZhT0VmcUF3TExVcHRBemVWRWsz?= =?utf-8?B?ZUdzVXZ2ZlE3QkplSTdTV2hTbFViWmsvS0FSTFJ6bW9NbkMzMDFCODkrVVFZ?= =?utf-8?B?NVdZbzUxeG9IeE1XMjhZTlF4eHFzY2xsTHpVQzF0YzdPcjJ4bGJ6SVg5cDly?= =?utf-8?B?aDNyb2NNaVJNTmpwU1pvcGhzL0tuOStMWEhERGJpL0FucjJGSDQ2cjFQOXM4?= =?utf-8?B?Rk41NzdZVzJPbGM5MEp2RmY2UnJGVmRsampqM21DVDN1eXZiWkJWdjJpaGZo?= =?utf-8?B?ZVhKUGJXN3IxZUJtZWs5TVU1WjcvdWpjWFBCRTFCemI1eGhRZnR6cTNZK3pJ?= =?utf-8?B?NUhrZkVoUFJaQTFiY3drNUZ5cW5JNHppb3lVTFhwYVYzWTgzV0h5WkVlN2lw?= =?utf-8?B?TkZ3S1ZtYlFvMnJocXlMbElaVnBNUzdQYTNmUW5vSHNCdHRMdUVLMEdqQVJi?= =?utf-8?B?czRtMzdjVTFTUmhUbWJNRVkrQlBDLzRqV1dzQTF1anRWbEFETnZpdk1zVXlU?= =?utf-8?B?NFdlSWJ4VnZQdzlGZ0lENE9tZkl3UjZWNGpacldtR1k3NEZRdVpOaGpvd1Fn?= =?utf-8?B?bjg1bjg3T0NZaGZCU25jQTRmSXB4cGRycG1wT2w2dmVlMVNZVmFuVkloREV6?= =?utf-8?B?TG1ObTR2U2cyVGNvVTZHN2VlVFlNaXA0ZG5xa01hZWYxVmsxN2dORnV4U0Ur?= =?utf-8?B?VWNDbURtL01KNHoxUG0rUDJISXIvTE5PbUJNYmpIWmd1TkJkQlpNV1I2c1VL?= =?utf-8?B?Y25wUVlDMW5Dck9xeHdNc3NpYUhDSDEyeTZCWHJGam9lSURlcmZvZjd3UzAw?= =?utf-8?B?Sm9yR2RnTVNiR2xZczQzREp6Z3J5ODBkY01BTXBMOTNBVUR3cGhrRlBQbkFC?= =?utf-8?B?cEJPbkFrM2RSTlVMNkExNmNuTlM3YjhvMWxnQ2Zxa0xsaDlub0w0M2VQVVZa?= =?utf-8?B?WFJrcjVWLzhIejFFMGVUWlpQRnB3L1d2Z05XR3Z1UDdpREtCbFAyVnA0eFM1?= =?utf-8?B?aXBuRmJzTVE4c1h0b0I5blFhZkhyVDdMQ0hVTFRpaHV5eWc1dzE4VE5XUklr?= =?utf-8?B?aUpwdEQvcjJnY2p5amxibVJJOFBqQWpjYnE1RTZCYlRqWXpNZUwyKzhYS0Vo?= =?utf-8?B?SmpIVUpZT1pXOVAydTRlamtHWkoySGlSQ1ZKRGJRdWcySzhZVW1iYzhJV3Ru?= =?utf-8?B?Vy9yZWo3VFUzQ3lFUWIrblhhSGgzTzF0dDJiMWxWN29aL3FGb2VUT1hBcEZ5?= =?utf-8?B?dktnTW1YRTZFME9YMlhHMjdWbVFMMmtlUHJ1K05oVzd3WjUzMDIxZWNBV2M4?= =?utf-8?B?TkxqajRvVWYrVlNEV3RzK3JBZGxSSzJqWEIzeUJvY2tLanNkMDY2MnJoT1Bt?= =?utf-8?B?eHpiRURCVVBEcWdPN09JK1F6RDZNVHdQMDQ0cThwVW5tZE44S2VqbzdpNHMx?= =?utf-8?B?czFqeHB4N3dCRzRPL25xVklPWEJ0bW9rd25xZlVlTm9KMWsvejhuNnF4Qk1l?= =?utf-8?B?TDFLamdvL21sdlVLanF4SGozTGUxcW53c1JlaGtnUk1HOW8veEQyaHMybjZK?= =?utf-8?B?TWQ0aXRjMWsrRldxd1NHYjRiRXljc0tWT3FwSzhnYVdMSnU5WjJMTThzbEZs?= =?utf-8?B?U2ZsOU5FYUV0WWl1a3R0My9PRlRpTk1aNUxOOWZmajE2U3J6dm1mYkU0QXN4?= =?utf-8?B?VG50UHppbUMyWGI3RTFpcGZBTFByWnVPaWdzMGRoTkxNa2Q4d3RlY05ETzJY?= =?utf-8?Q?HTzAKZyl+fHF7UkZ4breDtIP/eTGV+VE8K1FCEcKkiDuP?= X-MS-Exchange-AntiSpam-MessageData-1: Y4EUJDhQlZ3idQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8ddf564f-8f3e-412b-8d19-08debbeecb53 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:22.3328 (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: mjPilqFfRBzrDk0x7irTgiFZlhuD1aiLcRrmx8MMFg6Fkp9DnpZ4UgCtGydQ/0xeZjgLbWuQrxffXMStRFFC+A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 Replace the local bitfield rules by the equivalent invocation of the `bitfield!` macro. No functional change should be introduced as the `bitfield!` macro has been extracted from the rules of `register!`. Signed-off-by: Alexandre Courbot Acked-by: Yury Norov Acked-by: Danilo Krummrich --- rust/kernel/io/register.rs | 246 +----------------------------------------= ---- 1 file changed, 2 insertions(+), 244 deletions(-) diff --git a/rust/kernel/io/register.rs b/rust/kernel/io/register.rs index abc49926abfe..388647f28292 100644 --- a/rust/kernel/io/register.rs +++ b/rust/kernel/io/register.rs @@ -956,11 +956,10 @@ macro_rules! register { ( @bitfield $(#[$attr:meta])* $vis:vis struct $name:ident($storage:t= y) { $($fields:tt)* } ) =3D> { - $crate::register!(@bitfield_core + $crate::bitfield!( #[allow(non_camel_case_types)] - $(#[$attr])* $vis $name $storage + $(#[$attr])* $vis struct $name($storage) { $($fields)* } ); - $crate::register!(@bitfield_fields $vis $name $storage { $($fields= )* }); }; =20 // Implementations shared by all registers types. @@ -1016,245 +1015,4 @@ impl $crate::io::register::RegisterArray for $name { =20 impl $crate::io::register::RelativeRegisterArray for $name {} }; - - // Defines the wrapper `$name` type and its conversions from/to the st= orage type. - (@bitfield_core $(#[$attr:meta])* $vis:vis $name:ident $storage:ty) = =3D> { - $(#[$attr])* - #[repr(transparent)] - #[derive(Clone, Copy, PartialEq, Eq)] - $vis struct $name { - inner: $storage, - } - - #[allow(dead_code)] - impl $name { - /// Creates a bitfield from a raw value. - #[inline(always)] - $vis const fn from_raw(value: $storage) -> Self { - Self{ inner: value } - } - - /// Turns this bitfield into its raw value. - /// - /// This is similar to the [`From`] implementation, but is sho= rter to invoke in - /// most cases. - #[inline(always)] - $vis const fn into_raw(self) -> $storage { - self.inner - } - } - - // SAFETY: `$storage` is `Zeroable` and `$name` is transparent. - unsafe impl ::pin_init::Zeroable for $name {} - - impl ::core::convert::From<$name> for $storage { - #[inline(always)] - fn from(val: $name) -> $storage { - val.into_raw() - } - } - - impl ::core::convert::From<$storage> for $name { - #[inline(always)] - fn from(val: $storage) -> $name { - Self::from_raw(val) - } - } - }; - - // Definitions requiring knowledge of individual fields: private and p= ublic field accessors, - // and `Debug` implementation. - (@bitfield_fields $vis:vis $name:ident $storage:ty { - $($(#[doc =3D $doc:expr])* $hi:literal:$lo:literal $field:ident - $(?=3D> $try_into_type:ty)? - $(=3D> $into_type:ty)? - ; - )* - } - ) =3D> { - #[allow(dead_code)] - impl $name { - $( - $crate::register!(@private_field_accessors $vis $name $storage : $= hi:$lo $field); - $crate::register!( - @public_field_accessors $(#[doc =3D $doc])* $vis $name $storag= e : $hi:$lo $field - $(?=3D> $try_into_type)? - $(=3D> $into_type)? - ); - )* - } - - $crate::register!(@debug $name { $($field;)* }); - }; - - // Private field accessors working with the exact `Bounded` type for t= he field. - ( - @private_field_accessors $vis:vis $name:ident $storage:ty : $hi:tt= :$lo:tt $field:ident - ) =3D> { - ::kernel::macros::paste!( - $vis const [<$field:upper _RANGE>]: ::core::ops::RangeInclusive =3D $lo..=3D$hi; - $vis const [<$field:upper _MASK>]: $storage =3D - ((((1 << $hi) - 1) << 1) + 1) - ((1 << $lo) - 1); - $vis const [<$field:upper _SHIFT>]: u32 =3D $lo; - ); - - ::kernel::macros::paste!( - fn [<__ $field>](self) -> - ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> { - // Left shift to align the field's MSB with the storage MSB. - const ALIGN_TOP: u32 =3D $storage::BITS - ($hi + 1); - // Right shift to move the top-aligned field to bit 0 of the s= torage. - const ALIGN_BOTTOM: u32 =3D ALIGN_TOP + $lo; - - // Extract the field using two shifts. `Bounded::shr` produces= the correctly-sized - // output type. - let val =3D ::kernel::num::Bounded::<$storage, { $storage::BIT= S }>::from( - self.inner << ALIGN_TOP - ); - val.shr::() - } - - const fn [<__with_ $field>]( - mut self, - value: ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }>, - ) -> Self - { - const MASK: $storage =3D <$name>::[<$field:upper _MASK>]; - const SHIFT: u32 =3D <$name>::[<$field:upper _SHIFT>]; - - let value =3D value.get() << SHIFT; - self.inner =3D (self.inner & !MASK) | value; - - self - } - ); - }; - - // Public accessors for fields infallibly (`=3D>`) converted to a type. - ( - @public_field_accessors $(#[doc =3D $doc:expr])* $vis:vis $name:id= ent $storage:ty : - $hi:literal:$lo:literal $field:ident =3D> $into_type:ty - ) =3D> { - ::kernel::macros::paste!( - - $(#[doc =3D $doc])* - #[doc =3D "Returns the value of this field."] - #[inline(always)] - $vis fn $field(self) -> $into_type - { - self.[<__ $field>]().into() - } - - $(#[doc =3D $doc])* - #[doc =3D "Sets this field to the given `value`."] - #[inline(always)] - $vis fn [](self, value: $into_type) -> Self - { - self.[<__with_ $field>](value.into()) - } - - ); - }; - - // Public accessors for fields fallibly (`?=3D>`) converted to a type. - ( - @public_field_accessors $(#[doc =3D $doc:expr])* $vis:vis $name:id= ent $storage:ty : - $hi:tt:$lo:tt $field:ident ?=3D> $try_into_type:ty - ) =3D> { - ::kernel::macros::paste!( - - $(#[doc =3D $doc])* - #[doc =3D "Returns the value of this field."] - #[inline(always)] - $vis fn $field(self) -> - Result< - $try_into_type, - <$try_into_type as ::core::convert::TryFrom< - ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> - >>::Error - > - { - self.[<__ $field>]().try_into() - } - - $(#[doc =3D $doc])* - #[doc =3D "Sets this field to the given `value`."] - #[inline(always)] - $vis fn [](self, value: $try_into_type) -> Self - { - self.[<__with_ $field>](value.into()) - } - - ); - }; - - // Public accessors for fields not converted to a type. - ( - @public_field_accessors $(#[doc =3D $doc:expr])* $vis:vis $name:id= ent $storage:ty : - $hi:tt:$lo:tt $field:ident - ) =3D> { - ::kernel::macros::paste!( - - $(#[doc =3D $doc])* - #[doc =3D "Returns the value of this field."] - #[inline(always)] - $vis fn $field(self) -> - ::kernel::num::Bounded<$storage, { $hi + 1 - $lo }> - { - self.[<__ $field>]() - } - - $(#[doc =3D $doc])* - #[doc =3D "Sets this field to the compile-time constant `VALUE`."] - #[inline(always)] - $vis const fn [](self) = -> Self { - self.[<__with_ $field>]( - ::kernel::num::Bounded::<$storage, { $hi + 1 - $lo }>::new= ::() - ) - } - - $(#[doc =3D $doc])* - #[doc =3D "Sets this field to the given `value`."] - #[inline(always)] - $vis fn []( - self, - value: T, - ) -> Self - where T: Into<::kernel::num::Bounded<$storage, { $hi + 1 - $lo= }>>, - { - self.[<__with_ $field>](value.into()) - } - - $(#[doc =3D $doc])* - #[doc =3D "Tries to set this field to `value`, returning an error = if it is out of range."] - #[inline(always)] - $vis fn []( - self, - value: T, - ) -> ::kernel::error::Result - where T: ::kernel::num::TryIntoBounded<$storage, { $hi + 1 - $= lo }>, - { - Ok( - self.[<__with_ $field>]( - value.try_into_bounded().ok_or(::kernel::error::code::= EOVERFLOW)? - ) - ) - } - - ); - }; - - // `Debug` implementation. - (@debug $name:ident { $($field:ident;)* }) =3D> { - impl ::kernel::fmt::Debug for $name { - fn fmt(&self, f: &mut ::kernel::fmt::Formatter<'_>) -> ::kerne= l::fmt::Result { - f.debug_struct(stringify!($name)) - .field("", &::kernel::prelude::fmt!("{:#x}", self= .inner)) - $( - .field(stringify!($field), &self.$field()) - )* - .finish() - } - } - }; } --=20 2.54.0 From nobody Mon Jun 8 18:55:22 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013033.outbound.protection.outlook.com [40.107.201.33]) (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 479FC403EB7; Wed, 27 May 2026 12:52:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.33 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886356; cv=fail; b=TwH/UZdWlPvSVunsSSiKWCXeuxKw07YnYwfRDIOdxyK2zmABTPNPsb3EEDN/BXUOknEW13XM+orlS6RhYrQxOIHXSGsVXmJOq06dKzHDaK8xGKq3Rs36gNFsH2BDJ7W0dVI+YiOKL6zLW5NC6BzDb3AO1+fHyzIe9uag5SWxJYE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886356; c=relaxed/simple; bh=8x9okYaVHopE+Wjy3M752aOu3+fAsudWFYy2V8YGIJs=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Y+5tLTmuht/NuiyvEegcmtiYBVQEdo9+0uzsT/rc4bE8ZDYsS+rAc31FTZDZ/wUgKEAsl4AdOe6F29E/EE646uN/eQLv5cry+Y7fD6TdF4lLiGPMz46Mwuf2HJ5MEFNNBXOtZ2BfNqdfL5J9zVOuwNd8lMIJRFhSFaQplFtfob4= 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=Len0bq03; arc=fail smtp.client-ip=40.107.201.33 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="Len0bq03" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dnDa1VQbgaAMiv19th8AjrRMEUS3UcE/UknZdIgLJEsHXdNmttjLuZm6HMOxFCZXXDPvrJs1QwvoIM+SRKQCrPOMUh5n6u/2cF1o2c6UQ8FByge9lArr1sQrM8ExUPmiIbZ62e/sUSG2eEjsilnSzzElYtLtqbVqfheRtII2127hQljOd+x0lo1WHVEENHCWu/7XamUW5DMX+2hXnxGO1cxKcpMmOgVny1mJtVaWG9p/SaBO22BXBdJmyHjXuZDmfy1nHkWxkZsCuFfXa8rSm9HMz7bGXg9m87cK44zhCaIkY7AgM7BSBJnYfyXekNv7vQcCPf5tJG0suKXEF0SjTg== 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=tYiYsK5tHRDNs6gpnUFafZw04n3r0z4GvEPFr0uhMbY=; b=tXa/ksl6LGBGIe0fHCabdinjW+sONVz1jL0oYp457kxSSDKexV1YAyRLPrT3WMIf/XIR0TspToKPnSJyvYRg/1udd8YImEXzjkHFprhW9h5Fv9Juu8picJJsX4M5MWmVqj4DIpoNJFiha6/8pzkxem1FVzlr2btdHqhiKri7HPHgzPabJe4BleDAqeCkfSQLiZ2CQU5xK/LyTckPgLSRI2kO7C0sxhrXo9F7RwMpR1+yaTe9NPhVhZ6OEmMW5khT8NZ5wB4CeU3qrmMuQbzxYCB0NKPiD/3L7ElaYHFxRj0TitObN7f5VlvPZYidFFoDzvMBkPE209q6gxdd3eXuwA== 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=tYiYsK5tHRDNs6gpnUFafZw04n3r0z4GvEPFr0uhMbY=; b=Len0bq032ID46LU+5bynCPNC9h8NJWjD0YFZcmO2Qpyazxkx7bpU85STiyG1s1rKbJdzvM2dzUUlX7KyUDFF1ISQEUBzakFi5lSZUEbMZAHS4DwdmepxsN8jvwv3kxI/JIeDAaa4eKpr7Zm+YVeRsRwYZaF9WhQR8WAMfSx/Z0E662+AcM/OH0pRaHYhTc1Y2GB2gM9r0Fzk28uiQr22AOR5x2frc2lSJOAEGrRO+LmJ2tOPHocAHKNOdZ+2VxgXGHfooAnLR7W6axWqrgDvhwPL8Xzura5UCNzbigwM4l5P2ynL5QUtlvwOFLu1M83nCzRvxZVI+KzUz0taA0Nc4Q== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52:27 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:27 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:51:59 +0900 Subject: [PATCH v4 5/7] gpu: nova-core: switch to kernel bitfield macro Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-5-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot X-Mailer: b4 0.15.2 X-ClientProxiedBy: OS7P286CA0029.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:26d::19) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: 1ccd2cf8-9d06-4dac-377c-08debbeece09 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|11063799006|56012099006|22082099003|18002099003|921020; X-Microsoft-Antispam-Message-Info: dqBQ1mOo+/IpR547KNZXFd1N3jR2dZ7yS99nthhM4M6P/2eLmc8X/kN4v5FWaBS3PryjsrnMEpphBycbhHdE/06sFEP5l7VNHl/0RyblFpl81QFFvu7EHy9SA6hywQOJkcU+IFDTzYInTwrv3yXH/IOud9ayEKhxYh9iIHhCI2wFmqIc5BnZpgj71WDL/Kr5WHEvK4Zo52Cc4JpKY19UvvaB9yL/x0Ibf9H2B7EpD5ROF5XJvxf50buJdhEYCqjk/Chx/ubZXXIzQVBBzhSwVapK+V9XSmQ7BBaloSD7Wy0wTYQ+XTTY4SZeuEhTsdj1nGiPrx2zZn4JQUQbAm9BE8dexq1S2Vztno5dtFRTbINPzc25QDL/EjuBE2MTaRUj2y5MhIapO5YQ2I3BnhRVyYxZIV1F01GMiqfuFR2xR2sO0sCBsdFwmUfbChNL/fuSmuwlYtLLN70VSp9YD480CCPgqcx/uU8noN1sKajfGfb+WMkwuL9yVi3aZ81bK018YLCkhtYQ0FJDk1yQ5618QdOS75271+BP+IETMosEd/MR7HVimCVfB91OrTkKASyaeTijdoCHzZ1dGsE6yUIEmA7SWxIK2XngPj9RnrHUIC2HxV9wbcQAMkvRBgFi4WnNqAhnNngxSLWmuqRdIjrGYx66CcAYOhM7tIzOBDqYHDyG7uHrX0rC/COykQOOCpnn9D2zlfgpy+b+Bts57DugoPrUCUIXh1pyPOcHl2s6/3U= 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)(366016)(376014)(7416014)(1800799024)(10070799003)(11063799006)(56012099006)(22082099003)(18002099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cjE3U3BnOFlhbGhNQ2Q0aHhWTEg1ZU90VHlqY3hXTElXSTFvODdjdFp4b08y?= =?utf-8?B?dXcvbGdjN2dqWExpWmkxWCtIelhOdWZnN0draUxlUW01UEVwcDhHam8rdGIr?= =?utf-8?B?aURkbkxvZWozVDVGUWJ6T1hVdFdIek5FdEdGbElnYXlXNXNSb281Tm5tTWlw?= =?utf-8?B?ZHZnc0ZUa21OTFU4TDZSRFBhQWI1eHlTd0krZUUyNXZyN3hMOTlyS3h6TzFO?= =?utf-8?B?N2VTQmJ1NEhxTUlwNjllT3pOaWd2QlRtamFYalVhT3BCZzZyeklSMU1tdExa?= =?utf-8?B?QnNIYU80U0U5SnBrQkM3V014VTVBWkdsZHEvMVBKTTN2WEFMRDBMQzZFK0VK?= =?utf-8?B?Ukdxcmp5c3ZmU2d0ZW96YU5GSEthZk03SzMxSkpSdGQrd1ArRlhnUHI1cm9O?= =?utf-8?B?WDZMQUhxRGhjOHdQUUs4aVFuY3RacDNKa0tZYkR4YkVKQVNUd1pTUXlBd0FZ?= =?utf-8?B?czVJWE0ybFdwL3BqMHg4WmpPN3VZR29JbXhpNjFmN3FNZWk0N3hoTEFpbnNo?= =?utf-8?B?MFArVU5QeU9kemc3Rlk5VTFFTS8xN0o5RUUwRkZjaGIrS3pjK1FHY0RIWUZ2?= =?utf-8?B?eDk4eEsrcnN5U2FxdlFNMFNKZ0RHajNHWjFvemlSWHc4dWNhNVdDUG1UUm9D?= =?utf-8?B?cmVHbzd6dlFwakZNbzlBZVQyZy9Wb0l5SE5McHBWNnJVU1l2d2tNZEJBcHFv?= =?utf-8?B?dGxOSnQ4UWhldzdsNjRmTi81NHZZS3BzZldHdG9zeG5DOTQ3Y2xDVnlmRnZI?= =?utf-8?B?enhUMkxuUmVQUFV6NzdEMzBEaWp0Q29LOXRkQUE2aU1HTW5NaFp6L0R2RWlS?= =?utf-8?B?SEdJdTBQRms2SVZTQjNZdnoxcnJSM3BQL2VHRTNuWTZVRkxRdHpqT3A4Z0Q3?= =?utf-8?B?enRoYWdxaHNoT2QzL2JiRHcwS2RxM3JqOE03Z1lBVkxBZzZRTW45WjRRTDRI?= =?utf-8?B?djQzMWZQZld2SWs0ek1VbHJXaU1wTnJha0hvZHlFN2N4MXVnUEhXVVRHL091?= =?utf-8?B?dmtYNldaRU1mN3BaYUxRa0ZxdEJBNUkvTm5SellUeUF4YVlzckRjOGxiZEVt?= =?utf-8?B?WW9RNnhobm5ISWY0WVVEMVRQa1NnYmY5U3VZRmZZZjBFRVZ3TUhZSEg1N2Ux?= =?utf-8?B?MjczMzZYQkFScERDOUxqU0pVZ00yUmNvQ1czSDVSbUQ2dmRDZHhEaGt2c3Ro?= =?utf-8?B?MXdqRkR5Y2QwZDYwdmNza0t3eldvM3JvZk1qcGJxdlJ2OEordHFSbVQxVUJk?= =?utf-8?B?eXVrQ2tkcmNtN1l0b3lLOVNIWUhJYVcxSDhwZTdnelE1SkUwRmE3b0x6QnA1?= =?utf-8?B?U2dQSEVrZTR4RXBJbHlkSjZJcmNYSVJ4dTdDSG51Z3dMQitINWNETy9GNUFC?= =?utf-8?B?WkRzeDY3OVZLQk1CQWl3Vmc3MXdCZmFIbUhwYzVydnlqL0I5TUN2WjJ1NGZO?= =?utf-8?B?eUFoT1JQclY4dmgxN0tTZFBheFlOcWh0bDBTS3l1RVg0amNXYkR6RUtLWHJO?= =?utf-8?B?T3prZlNBMmJLS1VEYnQ4VXp0OS9pVmloYysvZmYxSUVKNzZBZ3RJditpZ3dk?= =?utf-8?B?VS9LOUR6eHFybFM4UFFsNFA2UU8rN3B3ZzZrQ1lRdUxNdi9OaVNOM2hJUHdK?= =?utf-8?B?ejM4UVFWVW1XQnJVUW55TWQ2cEhWVCs0N1U2UU1YelUzeHoySHJxMkNjZWYw?= =?utf-8?B?YjJvOG1maFpMYUovbisrUFBZamRKclp2b1VubC9tZS9HUUUraGEvWUFPMTh1?= =?utf-8?B?cmhEWmpxV0xmV3ZNcUEySDFWNUdZM0Z6Qy9VczNBbFBqSERNeVd1SElHNURm?= =?utf-8?B?Qk5ZcWRkdlVIcVlSVDBmWXRxenlRN1FVL1FNSE5zcU1RczBJV1YxRmJ4bTh1?= =?utf-8?B?aTVoYnBsdHRzZ2R0R0o5L3JHZDJNdWtmNXVtRkZMZmRlNzJuWmhOQU9NUGFn?= =?utf-8?B?YW9SMDJmK0NWZFdEWHZQMXpvK3kwTWphREpOWm14OFZSeTlRb3NkK3UzbVB0?= =?utf-8?B?Y1FHZm1HWmp1bWpkclFvVXo2UVM0M05CZnc3Q2Z0UlUwbnJCSncwR3JuSjgr?= =?utf-8?B?YStOS0JzNGdVWVh1T0N2Tmd6N2U4NWdla1BMS3pHV2QwZ2VoTGlFWmpSYlVl?= =?utf-8?B?cnBOZEdMUnB2SzFkWHF5SkdkNit4eXN5SnpXbEM0ZFE2WEQzcGRRYWp3cCt2?= =?utf-8?B?M0hCYlZLVFgwcXBnQ0cxNzZmKy92WjVkQUxMQzNRY0NkUUFIK0R4aVl3SVRK?= =?utf-8?B?QjNrRlMrcWtpR0VWZGZtN256TVphUUUwdUVjVlFEck8zQ2pIN2FSSldhQXRG?= =?utf-8?B?RDF3U25jdWFZb1c1cXZudE0xS1ZlSFJJdkhGK3NQK1BFbzVUOUZNL1NVU2Er?= =?utf-8?Q?1X2BlRoNlowYl7QeXn2FPe6tRvIvuEX7l/8uDhcBVr8nh?= X-MS-Exchange-AntiSpam-MessageData-1: yLxXN7HVoYMxpw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1ccd2cf8-9d06-4dac-377c-08debbeece09 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:26.9811 (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: oa7CeQ6hhhCT0WjQsPrBbf/Nuvi0+Mh0PnjKvlZbDYI7cvfRLUwpQ3m1lIZBbNAKG9F70rf4CKvRY+ucjFPw4Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 Replace uses of the Nova-internal `bitfield!` macro with the kernel one. Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/gsp/fw.rs | 11 ++++++----- drivers/gpu/nova-core/nova_core.rs | 3 --- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 0c8a74f0e8ac..d54688904740 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -9,6 +9,7 @@ use core::ops::Range; =20 use kernel::{ + bitfield, dma::Coherent, prelude::*, ptr::{ @@ -728,8 +729,8 @@ unsafe impl AsBytes for MsgqRxHeader {} =20 bitfield! { struct MsgHeaderVersion(u32) { - 31:24 major as u8; - 23:16 minor as u8; + 31:24 major; + 23:16 minor; } } =20 @@ -738,9 +739,9 @@ impl MsgHeaderVersion { const MINOR_TOT: u8 =3D 0; =20 fn new() -> Self { - Self::default() - .set_major(Self::MAJOR_TOT) - .set_minor(Self::MINOR_TOT) + Self::zeroed() + .with_major(Self::MAJOR_TOT) + .with_minor(Self::MINOR_TOT) } } =20 diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index 04a1fa6b25f8..3a0c45481a92 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -10,9 +10,6 @@ InPlaceModule, // }; =20 -#[macro_use] -mod bitfield; - mod driver; mod falcon; mod fb; --=20 2.54.0 From nobody Mon Jun 8 18:55:22 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011000.outbound.protection.outlook.com [40.107.208.0]) (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 C846C40628B; Wed, 27 May 2026 12:52:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.0 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886359; cv=fail; b=PVg2SCdmMR7q8BevmG6AuUuGounlrIbQf++HHIMgfiC/7ECR9H2JsMYGwFI3JLbZfgQAOn+i8V3PUYHM/ds4JqEXndetG/Ukm7ULCs4JXPwm708Et2yKiZiXQeAEomf+oGsXnkOWVTxQDjI6sK5nfeojo3MefUFTh0d2Y3C19xM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886359; c=relaxed/simple; bh=fjSJYEPYULh8RvSPD67pmBCbnp0blXYr8tR0yugCaWU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=eaJGDZkuI8BKp234PB5/7IR7f1lnVE0MkEHY68NTxohLnvvW68sDWeBvUGEi/RGH5639tf2nv3lx9cjJKsIGoe6CAHuWTQjseBvrJjXK+nebblrFuU26vDAq1RyiDzKayTemXCHa5zD+eGH0+GtvmF5cbPMGc2XuDdM+s+x9iJk= 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=YnJZ+dSK; arc=fail smtp.client-ip=40.107.208.0 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="YnJZ+dSK" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vlhtQ3rCy+YzjEfpr0N5uZeCmrtzs9jRAPB8TFj5Evno1Ahf7HytTQNO3TgXM/xgZdoJpO+uw654uZP4epIVlJpzE+CAV/4MBxkvQ5KbMjABCeXrRAEbrE47xojb8Bvkk1B2YSB/0coJe8pEWJ9vWso0EiVRvxMphzsAa1EuJGVt58ZZNNyJ+/9WTG21x19oZyv1v15K/3DBKExY0uZ+CYEj29Gz/OkmN5ruU9U/q1FNO1TuAJLv+HiSdVPEFxawncgCZwf8GlxhRvUsMsV8oEsaNwLi1PMwwLRQTlrjNDDeYA/pFDg6vLCwXkBZz5WEcyRLqbNtrZm+lDMEMq2Wfw== 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=kaUwfN8D+p4cTRgcYePzP3koNrYATKjVPot5EVr+kaw=; b=rSdwAutqFSyZmCYD5SIVngvK/2FJQ4QcG+6nOLT8Zd/4cRzPkBsLRnutDRABGMmXilia3BPedpxQBU0sPEh4drTKUuM54tTnyv0ZOxOGdDRI9seNqwJtUv6P+JiyO2AUaG2DvObV6xSUy6OxrSKge524c1Znsm9jEh0P4pf9jI8kZpWt9+0s9ELAIaau4B1kX9gAnoq2EEWEu1kLOTUOPHHgtzZw7MC4ZqE+cxnXfTD2kL+1EmtPMlYBY52jX3OBwPQMD3D/xhno6xPLx/rnEzwWIUXjxi+y1gkCXr6gHUvELvAnspwdGMbER3YHH8hULGy7E+iwbPC4ci/qfIsDJQ== 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=kaUwfN8D+p4cTRgcYePzP3koNrYATKjVPot5EVr+kaw=; b=YnJZ+dSKqHCniLdrBACr6qgDaCQ8itVnEYJjMWiQh66y4K2BUC82Jy7+wOhOIQb+ydEirQAB9FvHWzEcFGwcopnTmU2/3vOv8XWIda/aFZXNfoHAnCNlQ3t/6k0AdVJr+byBIItH9DjgfEZERhEQFQSWIv5XN9QKFleAXpoaRW03PfSKNk5ix9jimcLfDQsX80avtzil1YrY4xhydKhs9bxd+gZ+u7d1M9FonEEKXOrL1Oow7c2xuf1Avi2Wb/xOxGEMbnrHedguaI+dL3QHGcKbr04prwcoyslRDBiGH9wZCiseRdHFWV+L+b5XbIWLAtFuSzKqZcqJbIVhv7Fzmw== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52:31 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:31 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:52:00 +0900 Subject: [PATCH v4 6/7] gpu: nova-core: remove the driver-local `bitfield!` macro Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-6-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCPR01CA0163.jpnprd01.prod.outlook.com (2603:1096:400:2b1::8) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: 6cbf58ee-ebd8-43fa-1391-08debbeed099 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|11063799006|56012099006|22082099003|18002099003|921020; X-Microsoft-Antispam-Message-Info: GDjygMeKQQFB72UuH5omo2lGUOBXZB9/h0/eVsEW+8lQB600KcCWxfSAnLpKOdWQrNva81uqYPiaQo4zg/2e8ZOzwFJzUduMYDgnXD0Hm71R3BzXz+dyIVFUlnb+3d34TnSTdszLs+44rfr/koKIqtnNhdv5zE8uAX53FK+LqEIjNsda8wUBfm14lsh4hgFdmZaqs6ucmkWfKD9EgwE+EjnTE7SpyBXvplaQkW4L2sGo9qJ6LN65rmxas0AWDG6x/ZMf0QioSZs9Co2P0CARQM260Bu0SVa0+Vcz4LlSfaZn7DazZ2tse0R+KOXg/ZJB5KvB53REEbCaosXcQtOhx9MepPJgjtvZhIYGqLOnMDFlv8Aq5n1vKuhtkLODtTq73XwUJavit1pSTTjHm92nMccp7hf+z/ZnMssF1HLAOIoYU90i1PMYwVJSM15GVEjQGA3GLgTRvgDKilst6xIOmf4ZBdC2D4JrGWVYscp36qZt3yhVxqxBCt+xJys9T4eJmLf3l64Q+CLfFcDOrMU6lnRwdw9ki4VLUueR/l/Fyh72BRbG1HlBJOOz7PAGSO8/+DR/McYvWNYCET4Nqe9+uwt/L2nuWcycDZ5khv5x7j5ii9bo+3Bx2Z6M18h7po4hcyyt9hDvt7HciexNTiP3bWqDDQnp15NLSj7dS2u1BFI7GVCIPqfvZI/BSaLX9WLRiTQMDsXwxMNCGTxCPKmoGLpOi+PrRM1B8+hPJFDd8O8= 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)(366016)(376014)(7416014)(1800799024)(10070799003)(11063799006)(56012099006)(22082099003)(18002099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?K3hKQ1M2N2dhY2hzcUNjNjZaMXc2NENlZjVwT0lONUdnVHY5NVJvSkVHblB0?= =?utf-8?B?MGlnbWlmamhKZ1NDQzNGNDMzN21BUzVYaXlYRmRSUWtuY21weHFjNk93OFM5?= =?utf-8?B?SFVHc1RmRkhKMmVwbUM2VEdjRFJhMmNDcklpSjVjOXFVYXFFc0hIU2RhOXlB?= =?utf-8?B?dGdQbjNMbHJZQjBURVVDWnRiQktZQlRkaE0rYUNTN2VzbVhLUTZ2N0dwdWNP?= =?utf-8?B?WlJFSlpZMUtubnI4TjNTaUh2RnExbUdSQzJLYW5GUGhhUXRHdDVKZnczcU5x?= =?utf-8?B?aDNuTjVqV2lMMkRtR1hyYW81UmhDYmFXMFhQN1J0ckJ3OElEb2FGRStmdmtM?= =?utf-8?B?QmNraFpBUlcxd1d4ZCtYL0w1eXlGdEQ5cFd2SUtMdDlSR1VyMlVENjBOUFVY?= =?utf-8?B?UmgzRmZKTndLWTk0c3h3VGdGTUdUS2N4UFJOaS82djZlRU1aenlUVnkxQ1ZQ?= =?utf-8?B?VlR3RFdmUVdoUW1OdlF4MkNzbERydkh0ZkFoTWw3b1pJd2kyZ3hPRFFSTFE5?= =?utf-8?B?Myt5TjM4RE9abkRQYUtxcGdXTzFJWUZ4QnlMY3lUVm93MmpwZ01CTUQycGxV?= =?utf-8?B?NVRrcmQyOEoyaHNtcDhWYTlrWjRFR2crNVF3eDNQcExYNWwrbXRoS3VwNFJ6?= =?utf-8?B?dGh6emFKMVk5TDQ5ajBvcmRxd2RWM2VxVWNQbjRmQ3ZmRktmWFFMNmhqY2ND?= =?utf-8?B?bWJwR0FFOWFFZnJxajhLcHZvMWRVakUzejZBZmM2YWpwRUlzd1JrdllrOUlO?= =?utf-8?B?VnpYa1hzdWxrTUhLRldsclhFRWw5VzJ6V1EwN1F5dTVZRDBmNC9SaFYzVVRX?= =?utf-8?B?bzY2SkxXZFBJNWRUanVJNWRQWlB5VEl6NW9UU3Jua1lUTVdKM2E2UW54MjFW?= =?utf-8?B?QVMyWmd4VlBxVTNVNUcveThOaHRvNURtN1RZK1V1VnJ5aUdYWHFKUmcrak1I?= =?utf-8?B?bEcvL0x2UzB1V3RHNFltWVprUUxRK0x2MnRiMGw2RyswTno4dWlVb0FxWHl6?= =?utf-8?B?anAzQkdzS3drb3F4VEx3SzZHYmlPNWtwKzlGeE5mRmMvR0ZaYzMwait6amlH?= =?utf-8?B?aHJ0OUJoSmZ5cTNIM2FyQXhScUZPWUxVU1kwTTVyOGUvUFl2TUpFNzhheDZw?= =?utf-8?B?cUVXQ2k0Ny9uQVVXVlRTcHRQYUc2WENPc2pFUThZSEpxdDFjMUJYUTAyUHYr?= =?utf-8?B?U3JxSUlZam5kaFhSelUxcS94WDNOYm1WMk0xNkJFYlFWWWZqQkZIV1lGcjdS?= =?utf-8?B?SlMwZ1U5clR2eXhXMGJtRXVNbVdLRWplSU5Sa3RZcjVJS0xyeEVNUlI3dEdm?= =?utf-8?B?aUU0MnV1WGNzMHUreTVmbFhGdTNGamdXWUJ5aVpNSTZjY2NIVFp4OFd3OGdT?= =?utf-8?B?bm5WQVduY1BFNGR4TEd0RHpwQmhMOFY4NGROV3dETGFmRVQ5K05WSGhqUmVG?= =?utf-8?B?TUJjU0QyT0NtNjl1dExoNkNrYUZJY1lSamR5M0FkYUJaeXZwYzAyN2g4eVNR?= =?utf-8?B?S3hsNVcwUmZjaVY4V0xnYWtrTm1XcnRLOExlVnZhMmwzMFRwYWxzQkpzUVo4?= =?utf-8?B?dTVGYnVoNE5abUZXa0NWTW9yb2NHVzdDMzJsSmRnVFZJMjNtMWF0MlVXeml5?= =?utf-8?B?QTR1bkd3b3FoN2h6OWRyWEFLVHdtWHJRcCtmZ2VYemxNVHU2MFlza20yYnpE?= =?utf-8?B?ZzZMRHBqQ0JmYjJDOERXNjV1Y2Q4ZVlRTkRyWGN2cExtK2V2QisyL2lXd1NX?= =?utf-8?B?SVphYVZQbnVhdHhKdUhydHdxUXpjZkJzVlhZUVNVY29JTjdtcmVSUjhOWXBy?= =?utf-8?B?aUIvQWpNVjJJQUNQcHMxOUxRU0J1d0ZRd1hNdkk4WUh1RlBabVE3NXc1T0RC?= =?utf-8?B?MlpWdDViNzdHcWNhSzRwRElSNDRuNDJuUmxmZWc4MFJBRzdsbW9pcXZjS2I0?= =?utf-8?B?amoyc0IzQ2g5WFUwUXhWUEtkMVpRZzl3SHpvTkxaQlUzZFN5TG1ESk94ZUFq?= =?utf-8?B?YmkvbmJwRE9uOXNsbzBDTC9CTDdsQ0FMNmRiMitvb3doVnJ1VHJ1aGRzTG12?= =?utf-8?B?LzRRY2xNVHR4UENUYUlRVWFoNzNXYnZiVVJ0WktGdFV5ZmNMY0xyN1NFOGlh?= =?utf-8?B?VmtpMGJmWkUzOXBycWkwajM1K0ZsWEVPMWl4Uiswa0RZSEdleFlVU1czS3lK?= =?utf-8?B?eHhhWDVWZzZFT3pHbFk0ZUZpNE1rbklnZ2NVcnh3Yjd2Um1xRitmWkZNVVg3?= =?utf-8?B?NzJ2aGFvMWNIODJXSTl4dWJnK2c5Ui8rL1plelVEVUVlN3MzSVFWTkgwcDRz?= =?utf-8?B?SzhqS3BwWTdwc2x3TWpPTTM3eXJpZy9QUmp6OTQvYjlXUDVaMEJwcnpTV2FG?= =?utf-8?Q?x049ZfREM82CkPFJ29+AX2MQfPx1bOZsDODW5WE8tltqY?= X-MS-Exchange-AntiSpam-MessageData-1: ladFG7Qz3cu7FQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6cbf58ee-ebd8-43fa-1391-08debbeed099 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:31.5755 (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: pWNlmF7DHqcFKnkb48ygOc92tjS1Xn3Jg3hATOsyPtvst+PMoB1ZEVJwXg+sspD6YH6c+hvRVm6/1Io1cazNag== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 This module is now orphaned code replaced by a kernel-global implementation, so remove it. Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/bitfield.rs | 329 ----------------------------------= ---- 1 file changed, 329 deletions(-) diff --git a/drivers/gpu/nova-core/bitfield.rs b/drivers/gpu/nova-core/bitf= ield.rs deleted file mode 100644 index 02efdcf78d89..000000000000 --- a/drivers/gpu/nova-core/bitfield.rs +++ /dev/null @@ -1,329 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 - -//! Bitfield library for Rust structures -//! -//! Support for defining bitfields in Rust structures. Also used by the [`= register!`] macro. - -/// Defines a struct with accessors to access bits within an inner unsigne= d integer. -/// -/// # Syntax -/// -/// ```rust -/// use nova_core::bitfield; -/// -/// #[derive(Debug, Clone, Copy, Default)] -/// enum Mode { -/// #[default] -/// Low =3D 0, -/// High =3D 1, -/// Auto =3D 2, -/// } -/// -/// impl TryFrom for Mode { -/// type Error =3D u8; -/// fn try_from(value: u8) -> Result { -/// match value { -/// 0 =3D> Ok(Mode::Low), -/// 1 =3D> Ok(Mode::High), -/// 2 =3D> Ok(Mode::Auto), -/// _ =3D> Err(value), -/// } -/// } -/// } -/// -/// impl From for u8 { -/// fn from(mode: Mode) -> u8 { -/// mode as u8 -/// } -/// } -/// -/// #[derive(Debug, Clone, Copy, Default)] -/// enum State { -/// #[default] -/// Inactive =3D 0, -/// Active =3D 1, -/// } -/// -/// impl From for State { -/// fn from(value: bool) -> Self { -/// if value { State::Active } else { State::Inactive } -/// } -/// } -/// -/// impl From for bool { -/// fn from(state: State) -> bool { -/// match state { -/// State::Inactive =3D> false, -/// State::Active =3D> true, -/// } -/// } -/// } -/// -/// bitfield! { -/// pub struct ControlReg(u32) { -/// 7:7 state as bool =3D> State; -/// 3:0 mode as u8 ?=3D> Mode; -/// } -/// } -/// ``` -/// -/// This generates a struct with: -/// - Field accessors: `mode()`, `state()`, etc. -/// - Field setters: `set_mode()`, `set_state()`, etc. (supports chaining = with builder pattern). -/// Note that the compiler will error out if the size of the setter's ar= g exceeds the -/// struct's storage size. -/// - Debug and Default implementations. -/// -/// Note: Field accessors and setters inherit the same visibility as the s= truct itself. -/// In the example above, both `mode()` and `set_mode()` methods will be `= pub`. -/// -/// Fields are defined as follows: -/// -/// - `as ` simply returns the field value casted to , typical= ly `u32`, `u16`, `u8` or -/// `bool`. Note that `bool` fields must have a range of 1 bit. -/// - `as =3D> ` calls ``'s `From::<>` = implementation and returns -/// the result. -/// - `as ?=3D> ` calls ``'s `TryFrom= ::<>` implementation -/// and returns the result. This is useful with fields for which not all= values are valid. -macro_rules! bitfield { - // Main entry point - defines the bitfield struct with fields - ($vis:vis struct $name:ident($storage:ty) $(, $comment:literal)? { $($= fields:tt)* }) =3D> { - bitfield!(@core $vis $name $storage $(, $comment)? { $($fields)* }= ); - }; - - // All rules below are helpers. - - // Defines the wrapper `$name` type, as well as its relevant implement= ations (`Debug`, - // `Default`, and conversion to the value type) and field accessor met= hods. - (@core $vis:vis $name:ident $storage:ty $(, $comment:literal)? { $($fi= elds:tt)* }) =3D> { - $( - #[doc=3D$comment] - )? - #[repr(transparent)] - #[derive(Clone, Copy)] - $vis struct $name($storage); - - impl ::core::convert::From<$name> for $storage { - fn from(val: $name) -> $storage { - val.0 - } - } - - bitfield!(@fields_dispatcher $vis $name $storage { $($fields)* }); - }; - - // Captures the fields and passes them to all the implementers that re= quire field information. - // - // Used to simplify the matching rules for implementers, so they don't= need to match the entire - // complex fields rule even though they only make use of part of it. - (@fields_dispatcher $vis:vis $name:ident $storage:ty { - $($hi:tt:$lo:tt $field:ident as $type:tt - $(?=3D> $try_into_type:ty)? - $(=3D> $into_type:ty)? - $(, $comment:literal)? - ; - )* - } - ) =3D> { - bitfield!(@field_accessors $vis $name $storage { - $( - $hi:$lo $field as $type - $(?=3D> $try_into_type)? - $(=3D> $into_type)? - $(, $comment)? - ; - )* - }); - bitfield!(@debug $name { $($field;)* }); - bitfield!(@default $name { $($field;)* }); - }; - - // Defines all the field getter/setter methods for `$name`. - ( - @field_accessors $vis:vis $name:ident $storage:ty { - $($hi:tt:$lo:tt $field:ident as $type:tt - $(?=3D> $try_into_type:ty)? - $(=3D> $into_type:ty)? - $(, $comment:literal)? - ; - )* - } - ) =3D> { - $( - bitfield!(@check_field_bounds $hi:$lo $field as $type); - )* - - #[allow(dead_code)] - impl $name { - $( - bitfield!(@field_accessor $vis $name $storage, $hi:$lo $field = as $type - $(?=3D> $try_into_type)? - $(=3D> $into_type)? - $(, $comment)? - ; - ); - )* - } - }; - - // Boolean fields must have `$hi =3D=3D $lo`. - (@check_field_bounds $hi:tt:$lo:tt $field:ident as bool) =3D> { - #[allow(clippy::eq_op)] - const _: () =3D { - ::kernel::build_assert!( - $hi =3D=3D $lo, - concat!("boolean field `", stringify!($field), "` covers m= ore than one bit") - ); - }; - }; - - // Non-boolean fields must have `$hi >=3D $lo`. - (@check_field_bounds $hi:tt:$lo:tt $field:ident as $type:tt) =3D> { - #[allow(clippy::eq_op)] - const _: () =3D { - ::kernel::build_assert!( - $hi >=3D $lo, - concat!("field `", stringify!($field), "`'s MSB is smaller= than its LSB") - ); - }; - }; - - // Catches fields defined as `bool` and convert them into a boolean va= lue. - ( - @field_accessor $vis:vis $name:ident $storage:ty, $hi:tt:$lo:tt $f= ield:ident as bool - =3D> $into_type:ty $(, $comment:literal)?; - ) =3D> { - bitfield!( - @leaf_accessor $vis $name $storage, $hi:$lo $field - { |f| <$into_type>::from(f !=3D 0) } - bool $into_type =3D> $into_type $(, $comment)?; - ); - }; - - // Shortcut for fields defined as `bool` without the `=3D>` syntax. - ( - @field_accessor $vis:vis $name:ident $storage:ty, $hi:tt:$lo:tt $f= ield:ident as bool - $(, $comment:literal)?; - ) =3D> { - bitfield!( - @field_accessor $vis $name $storage, $hi:$lo $field as bool = =3D> bool $(, $comment)?; - ); - }; - - // Catches the `?=3D>` syntax for non-boolean fields. - ( - @field_accessor $vis:vis $name:ident $storage:ty, $hi:tt:$lo:tt $f= ield:ident as $type:tt - ?=3D> $try_into_type:ty $(, $comment:literal)?; - ) =3D> { - bitfield!(@leaf_accessor $vis $name $storage, $hi:$lo $field - { |f| <$try_into_type>::try_from(f as $type) } $type $try_into= _type =3D> - ::core::result::Result< - $try_into_type, - <$try_into_type as ::core::convert::TryFrom<$type>>::Error - > - $(, $comment)?;); - }; - - // Catches the `=3D>` syntax for non-boolean fields. - ( - @field_accessor $vis:vis $name:ident $storage:ty, $hi:tt:$lo:tt $f= ield:ident as $type:tt - =3D> $into_type:ty $(, $comment:literal)?; - ) =3D> { - bitfield!(@leaf_accessor $vis $name $storage, $hi:$lo $field - { |f| <$into_type>::from(f as $type) } $type $into_type =3D> $= into_type $(, $comment)?;); - }; - - // Shortcut for non-boolean fields defined without the `=3D>` or `?=3D= >` syntax. - ( - @field_accessor $vis:vis $name:ident $storage:ty, $hi:tt:$lo:tt $f= ield:ident as $type:tt - $(, $comment:literal)?; - ) =3D> { - bitfield!( - @field_accessor $vis $name $storage, $hi:$lo $field as $type = =3D> $type $(, $comment)?; - ); - }; - - // Generates the accessor methods for a single field. - ( - @leaf_accessor $vis:vis $name:ident $storage:ty, $hi:tt:$lo:tt $fi= eld:ident - { $process:expr } $prim_type:tt $to_type:ty =3D> $res_type:ty = $(, $comment:literal)?; - ) =3D> { - ::kernel::macros::paste!( - const [<$field:upper _RANGE>]: ::core::ops::RangeInclusive =3D= $lo..=3D$hi; - const [<$field:upper _MASK>]: $storage =3D { - // Generate mask for shifting - match ::core::mem::size_of::<$storage>() { - 1 =3D> ::kernel::bits::genmask_u8($lo..=3D$hi) as $storage, - 2 =3D> ::kernel::bits::genmask_u16($lo..=3D$hi) as $storag= e, - 4 =3D> ::kernel::bits::genmask_u32($lo..=3D$hi) as $storag= e, - 8 =3D> ::kernel::bits::genmask_u64($lo..=3D$hi) as $storag= e, - _ =3D> ::kernel::build_error!("Unsupported storage type si= ze") - } - }; - const [<$field:upper _SHIFT>]: u32 =3D $lo; - ); - - $( - #[doc=3D"Returns the value of this field:"] - #[doc=3D$comment] - )? - #[inline(always)] - $vis fn $field(self) -> $res_type { - ::kernel::macros::paste!( - const MASK: $storage =3D $name::[<$field:upper _MASK>]; - const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; - ); - let field =3D ((self.0 & MASK) >> SHIFT); - - $process(field) - } - - ::kernel::macros::paste!( - $( - #[doc=3D"Sets the value of this field:"] - #[doc=3D$comment] - )? - #[inline(always)] - $vis fn [](mut self, value: $to_type) -> Self { - const MASK: $storage =3D $name::[<$field:upper _MASK>]; - const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; - let value =3D ($storage::from($prim_type::from(value)) << SHIF= T) & MASK; - self.0 =3D (self.0 & !MASK) | value; - - self - } - ); - }; - - // Generates the `Debug` implementation for `$name`. - (@debug $name:ident { $($field:ident;)* }) =3D> { - impl ::kernel::fmt::Debug for $name { - fn fmt(&self, f: &mut ::kernel::fmt::Formatter<'_>) -> ::kerne= l::fmt::Result { - f.debug_struct(stringify!($name)) - .field("", &::kernel::prelude::fmt!("{:#x}", &sel= f.0)) - $( - .field(stringify!($field), &self.$field()) - )* - .finish() - } - } - }; - - // Generates the `Default` implementation for `$name`. - (@default $name:ident { $($field:ident;)* }) =3D> { - /// Returns a value for the bitfield where all fields are set to t= heir default value. - impl ::core::default::Default for $name { - fn default() -> Self { - let value =3D Self(Default::default()); - - ::kernel::macros::paste!( - $( - let value =3D value.[](Default::default()); - )* - ); - - value - } - } - }; -} --=20 2.54.0 From nobody Mon Jun 8 18:55:22 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010049.outbound.protection.outlook.com [52.101.193.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 BDDB940488E; Wed, 27 May 2026 12:52:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886363; cv=fail; b=EWtcqvlaY/VrP2eaPv2weKiqgrilh5EdkuSh7gLXZjvMOj+ttbKcxymDNsppEya7njHk49gwzmt+MAE0G/qcxGvYDuRnh6xwIPAs7uFtA4IkMQ5jpIG1VkqmoitvOd6VVJhxu3kbqBM5jP04btF2kedDBTlvLYlzCHwkniPG03s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779886363; c=relaxed/simple; bh=mMB2ve461seUycEC5kXHuwYoekL87W3s7G6Q1Fzyk28=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=cNYD9J8FctGUoMNeKRWS4EBqidRu3UZ83hZD7jXxGFPgZdSeg45WnzlVYghThbHKMAGdNTWQhjavJ7KJU42mLFolrXXa99Oa3Xw0ww0EYw1DGajqif7LiHMBWY58H5LIIG95C2pFNVou+IKlXN00tzUFY3l+AfndeY6DQUbBxU8= 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=ByBWt+ZQ; arc=fail smtp.client-ip=52.101.193.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="ByBWt+ZQ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=n2wQtd0Irqp1n+9wOP1K37vI8wTRhW/2Q0S1Xs+dDi6W9pWjN8ohlU4XAj0eASWLY4iCDT9FswW8rx1aaq9Bz5lBuUTX7r0HOg/Jm5PFJM9J++ReBj2TUv+mk35QRqR+6kId/Gqd2i0lDrVqirfpK2WB1I0KpJ3DeNBBOC68N/e8Ar+MWPJ6RjphVbS0FmAuzkxbfg1NtxKMPvfgLyuzr/ocMjSHZ9nz/wTgX6BdvrsEQy/UMeHke0rP0dTB1Yt/m5jZisHKdmSykabBhoJC+VZXovR+Hs0QRe52MbfSWKeB/+DFF98qxUYDJMBtr5YrE/iGcEduJ5Ec5vD55Ud/aw== 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=It7irXMQ5P5EKW3MVIvgslFnt1nfia97y8Rt/q1c7f4=; b=PdbpM64BeZImv0WteLtg7fupihHZKtRBLFLPOPkEmE7AM5z7PX+LxCOCaE+HBZPoT2l1vD6lbveJXQfUPtQdW72kHazRsaWRNfatZIUe1Gn3s2j0C64rVfwUNwF/PvepdWvCaLJNQipH+rtT0mdim+rc2M49wEoYWXa86ue17FXp5PUpzgMhjCVa4XOw8jKtpq6RVXlho/8d7IGfizQamEkrqZtoI1DaI91gt98D+ae7bCCWb7t3MH7UnYSpsuo56Pl7qmGcH9XqacIuKuMlLDk0vDJa1jH6WOIZGYgv8AUn2K+BzcdVynFk3xYVuEcEsx6QoQjaekdWAr6iJok8YQ== 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=It7irXMQ5P5EKW3MVIvgslFnt1nfia97y8Rt/q1c7f4=; b=ByBWt+ZQ8NV0z9i+sqiqhoClj8Wk+AYhJ0gvPfRtyIHykYb5dhgtDHnkyibNZhYxaRvABYxU17EIy7XMC38NxmQOkbPM2qG/Siy4K6KDKd3xgVbp5kqRkUE/nagXCbgF4gqUD42NlNl8l6ZtLq2+cvJrm/R42qoJrEbU5NkPm9gfwE8Jd7+xhh8Qp6yLtn3fE96womnSq5BswQDP2qus7wovWwQmGBjwfOkROj/DVtt5npIcbRp4Z/K4bT7k52HNe2T3ZP15DZLvbq8DvFl4YjxshbNvkmImMCOALOMtwE8uqe6S3sG3GY0d6f6l6vNXbL22T6yCGTloMmaHWTtGaw== 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 PH7PR12MB7841.namprd12.prod.outlook.com (2603:10b6:510:273::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.12; Wed, 27 May 2026 12:52:35 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%4]) with mapi id 15.21.0071.010; Wed, 27 May 2026 12:52:35 +0000 From: Alexandre Courbot Date: Wed, 27 May 2026 21:52:01 +0900 Subject: [PATCH v4 7/7] rust: bitfield: Add KUnit tests for bitfield Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260527-bitfield-v4-7-e8821d4efbde@nvidia.com> References: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> In-Reply-To: <20260527-bitfield-v4-0-e8821d4efbde@nvidia.com> To: 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 , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , Eliot Courtney , linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nova-gpu@lists.linux.dev, driver-core@lists.linux.dev, Alexandre Courbot , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4P301CA0062.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:36a::13) 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_|PH7PR12MB7841:EE_ X-MS-Office365-Filtering-Correlation-Id: a0099583-f649-480e-eef8-08debbeed351 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|10070799003|11063799006|56012099006|22082099003|18002099003|921020; X-Microsoft-Antispam-Message-Info: Bp+k0218amEjsH1tOnBZJQ0eojIlXCJiC/wqmdxmUhzdZcOceIJue8D7I+D20cmrJyHn10IfWjXBDM8KzWSLUm01y41DdHjw85ekOzAy8qGKytBiCmu9xswJBoa9K8FKhFoGN/a+QvraQNocMUUSIcWwPh6B+hoOlechv+eFhFATgiZQZX2aXpE1m7FzOPyj0wOpJL5Aw/Oz30uW/6lfrMH8V54siztCbHj8BQa7ftzlHNy5suUzeyFDYoMv6pvnnIQQVaIGLdYPB7PQMviCe7D9ryXAL11EBL0dS9fN5/BjM+oMN9ysqGFzTX+aJEmDgG2ThMykwyqO4EluXSDUMSLoJiYDnUdMOOvXObePxd/awzDpAPcbnq1TP48xWn8IhvtIwvftR0BUkOgRZCJcG6jYu2Ub3XAJ0ZRG6Gb8qsNM5Lfm+YNiJ1KgGsWNu5oN7pd4wvuBjkBHhXyQOqtPHA62zoxxPANB9IJlob4c6P3Hn7lQW3gCTfdnjZeCXDoejHMe4j5xd//9xG7+nmJAHzadcWfwtjD8rif+t0fx0+72jNVsaqbr3JeEizExyBgLoC6v9jtx24npe4KIzQmQStTak3nGbwWc1RMdaPzrO3zkoU+R/p97I2PAh9q+i4yEwUWQ59szWQaXkQo6ccoQAiz66ufjF6xCeEVWbFT1EWGSX3AXF66EDuBkMLlyjIsNKKLznXXCFWPYHO/ZBg4iPoWsP4Cuul538T7OBr9JniU= 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)(366016)(376014)(7416014)(1800799024)(10070799003)(11063799006)(56012099006)(22082099003)(18002099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZjVQYWpmVUVUZ1ZwMjlNbllXaHRlS093NG16dU84REFmbGhnVGVibytQYkth?= =?utf-8?B?TkQzempod3BIeUsvOUpjeWR1bVdkemU0TzNxT0xJa2VwREpTR25pUXp6dnBz?= =?utf-8?B?ZzdpV0hESmYyNkkyZnY0NG1RNzR3WWtEYituRk9NZE1KbFRIN1JkcGFMYlEv?= =?utf-8?B?Mzc3SU9CdHoya3Z2bXU0SGwra0k1U0lqNVJoZEpkTXhocERTYXBJZ0xlQXhp?= =?utf-8?B?RTJRbzJPM1hibFRLdVVxNjRNWnBCeEtybGxHU1dra25Rc3lBV2tNRXpEbWxK?= =?utf-8?B?Zk15dWRrYzBzdFduWTluSmc4ZWpPdEZxd2tnUStMdENZQU8yUHJLb2kxWGdJ?= =?utf-8?B?ejhXWVpKT0FTemFUWU5Hem01cVZmWm5NUG1XQnBGVC8vUXBsQTAvS01BdG45?= =?utf-8?B?MTY3dU5XUTR0RExEL0kxc2ZjRGZ0MmphcFRHc2tuVFpJL1dsT1NaczNpS1JG?= =?utf-8?B?TjBPSmtTcExONy9JVkxXNS9EOWd0c1hwaWtSTGwvUS8rT1dla2llY3kvNHBy?= =?utf-8?B?ZktBd3huT3VHQTEwTzZ4NU9WRjdRbEltcDNnQVl4QWRsQSt4OThXM2FUVEx1?= =?utf-8?B?NnloMFQySlNJUDM4cHB3Z2tpU3NFVThZRFdHWUg0NFprTzFvRXk5Tm0wZDZ4?= =?utf-8?B?TDV0WFRRWmJhdmwzanN1VXQ5TXpWTDMyRlNoUTRRUDlFVHNISTE5REliWEtJ?= =?utf-8?B?a3JSOGZKenpiS2xWLzZwOG1MY0VhWnNlVFlKTnlXWi9YZGJDMXIxNm5FbGY2?= =?utf-8?B?SEkvdTFQUzBvamN4QVBZaVE4bEg5NWQxcXFxNTZ4TktjTzlsYXh2MXNWb1cw?= =?utf-8?B?R1JGK0dIWnNEWUZJT3pFR0h0TzJ4TThZaktFUkVwMDlFR21CUTFlS2VobXFX?= =?utf-8?B?WHg4Z1VJRmxnMnQyN0VSWWFWaFBjeUcwMmh2Y0gzcmdlZmVrLytSYlBIRFJq?= =?utf-8?B?eDN2L1A1MlkvSjh0SWFkREVGQWRnK210Mko0UzhXYjArYW1XVzFDTVJzcnd2?= =?utf-8?B?THhoZG9uaWZTREZmMVY3cjU0bzdjWHVEVU1JUEcySm95ejNtaXlCWlFlZEJa?= =?utf-8?B?YkxwWHFjdzNhL2JMVkpjL3lCbjJ5UGtmQzVjbEFkUVhrUzhkdlVBSXU5Qi8x?= =?utf-8?B?MTg0eXlDanpjalhINDNhdlhqR3RFMmNGMzZEVWdBVEc4TWhYelZWNTR6OXg1?= =?utf-8?B?eC8ybHlzV0VodzRzVUdoSWxTRWQ3MjdsaHhSSjVSaDBLTG5WTER5QklvM3Jw?= =?utf-8?B?Y0NQQmF4WmpWamVNcm5mOUhMYkhnaGhTWDNxY3BlMUdOcHNWK1J5UkV4YTFN?= =?utf-8?B?M2U2QXB3ZHNDNVBUY0xBTk82VDAwY0I5R3lTY3d4ZHppSmJRTGFENkRYLzVn?= =?utf-8?B?aStkWGs2cFlwdGNIdlJ3R1ZRY2IwNVdBSlBYc2JlUmpxOEhsVlJzcEJtVkc0?= =?utf-8?B?WVJNdnMyU3ZvUzZLQXdsMTFZQ0RubFZrbUMvRDhScUdBSWM5eldQUXU1eXJt?= =?utf-8?B?VFpVY25HeVFuWTUrM1gzYWdobmFwanRacFNVTDBrWFg3T3EydXNCRUEyQUpx?= =?utf-8?B?ejk2bk1jSWltKzgrd1hmQUEyVUg5ZFRMQUdWQXQrbkFCaGZEQUdRTktFeGhG?= =?utf-8?B?NlpBQ2xIclVSSjIvdXFJSWJDanF5VzhCU2NDdVkreXp4a3l0aVlPaDQwOWRY?= =?utf-8?B?VUNzeFhYQWN0SmFUNkxYckNpcDhISUlBL093L1Z4ZVZPSFFrbEpac042QlRj?= =?utf-8?B?dXNaaXZmcUpsaitzck1kc3hsMzh2aXhmOVRqUXZVVWJyZkUyeXdORzgzQXZC?= =?utf-8?B?TXZ0VWQycm1lRGlHREt5Q0VHZG5DSWwwbElWNEVzQ3NKMElXTFRqWkg2VFY5?= =?utf-8?B?dDY1Ri9EbW1aRmg3a25QT2cyTjVNZ1dVSTBpNldpOEthU3BIYzVQRERTMElS?= =?utf-8?B?cWE0NWZDeTYxUWYzbGphU3E5ZzVqaERBWDBmbzRZWU1qdFNFcGszUXNwTkRu?= =?utf-8?B?ODZJdlNwc1ZJL3RPQUxGdWJ3Y3c1ZTFBaTRGdDdsSXdna3djQVUzOWNhaHl4?= =?utf-8?B?N25vTHFFSjZvQ29pdVNSY21VbGl3dlR5cnJhdHdlcGxyN2llUk1MbE5hd0VP?= =?utf-8?B?WDN1bVRObmpHVFE5TjdOVXBsd2N5bW1ZVWV2OG5sRXVrV1o0SUljUEN4aHUv?= =?utf-8?B?V1NoOU9oTkxmZEJ5QU52clhQWm0vaks3S3hjVTY1VmFPMVlEUW9KWW1UekFw?= =?utf-8?B?c3NPZTFOZWxJVkFUK3ZjV0o2c0FINWlGVDhaZXhFem14ZTNLdy9haTZ3RFFM?= =?utf-8?B?eG1iNmx2R1pNcnNqZ0FEa2swdkRqTFpmeXlXdERLeUtJOSs5Ukd3UWx0WUMr?= =?utf-8?Q?XpEEenRTeGJiO5xpemkjtew11KZ21M6UiSIxa25G3mNbg?= X-MS-Exchange-AntiSpam-MessageData-1: M7ha2k/91CRiug== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: a0099583-f649-480e-eef8-08debbeed351 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2026 12:52:35.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: ae/Fr6cR1uH5LRsiGfb9FfeN0rsvSHFEbtcHO2a013xyGTGHqI5jZiPKxBI6mEEmVqLmc3pGK3RUg845M4GAYA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7841 From: Joel Fernandes Add KUNIT tests to make sure the macro is working correctly. The unit tests are put behind the new `RUST_BITFIELD_KUNIT_TEST` Kconfig option. Signed-off-by: Joel Fernandes Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney Acked-by: Danilo Krummrich --- rust/kernel/Kconfig.test | 10 ++ rust/kernel/bitfield.rs | 315 +++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 325 insertions(+) diff --git a/rust/kernel/Kconfig.test b/rust/kernel/Kconfig.test index fc47614e6ec9..4fc6dc978101 100644 --- a/rust/kernel/Kconfig.test +++ b/rust/kernel/Kconfig.test @@ -73,4 +73,14 @@ config RUST_ATOMICS_KUNIT_TEST =20 If unsure, say N. =20 +config RUST_BITFIELD_KUNIT_TEST + bool "KUnit tests for the Rust `bitfield!` macro" if !KUNIT_ALL_TESTS + default KUNIT_ALL_TESTS + help + This option enables KUnit tests for the Rust `bitfield!` macro. + These are only for development and testing, not for regular + kernel use cases. + + If unsure, say N. + endif diff --git a/rust/kernel/bitfield.rs b/rust/kernel/bitfield.rs index 2498107979dc..4720cdd23c74 100644 --- a/rust/kernel/bitfield.rs +++ b/rust/kernel/bitfield.rs @@ -546,3 +546,318 @@ fn fmt(&self, f: &mut ::kernel::fmt::Formatter<'_>) -= > ::kernel::fmt::Result { } }; } + +#[cfg(CONFIG_RUST_BITFIELD_KUNIT_TEST)] +#[::kernel::macros::kunit_tests(kernel_bitfield)] +mod tests { + use core::convert::TryFrom; + + use pin_init::Zeroable; + + use kernel::num::Bounded; + + // Enum types for testing =3D> and ?=3D> conversions + #[derive(Debug, Clone, Copy, PartialEq)] + enum MemoryType { + Unmapped =3D 0, + Normal =3D 1, + Device =3D 2, + Reserved =3D 3, + } + + impl TryFrom> for MemoryType { + type Error =3D u64; + fn try_from(value: Bounded) -> Result { + match value.get() { + 0 =3D> Ok(MemoryType::Unmapped), + 1 =3D> Ok(MemoryType::Normal), + 2 =3D> Ok(MemoryType::Device), + 3 =3D> Ok(MemoryType::Reserved), + _ =3D> Err(value.get()), + } + } + } + + impl From for Bounded { + fn from(mt: MemoryType) -> Bounded { + Bounded::from_expr(mt as u64) + } + } + + #[derive(Debug, Clone, Copy, PartialEq)] + enum Priority { + Low =3D 0, + Medium =3D 1, + High =3D 2, + Critical =3D 3, + } + + impl From> for Priority { + fn from(value: Bounded) -> Self { + match value & 0x3 { + 0 =3D> Priority::Low, + 1 =3D> Priority::Medium, + 2 =3D> Priority::High, + _ =3D> Priority::Critical, + } + } + } + + impl From for Bounded { + fn from(p: Priority) -> Bounded { + Bounded::from_expr(p as u16) + } + } + + bitfield! { + struct TestPageTableEntry(u64) { + 61:52 available2; + 51:16 pfn; + 15:12 mem_type ?=3D> MemoryType; + 11:9 available; + 1:1 writable; + 0:0 present; + } + } + + bitfield! { + struct TestControlRegister(u16) { + 15:8 channel; + 7:4 priority_nibble; + 5:4 priority =3D> Priority; + 3:1 mode; + 0:0 enable; + } + } + + bitfield! { + struct TestStatusRegister(u8) { + 7:0 full_byte; // For entire register + 7:4 reserved; + 3:2 state; + 1:1 error; + 0:0 ready; + } + } + + #[test] + fn test_single_bits() { + let mut pte =3D TestPageTableEntry::zeroed(); + + assert!(!pte.present().into_bool()); + assert!(!pte.writable().into_bool()); + assert_eq!(u64::from(pte), 0x0); + + pte =3D pte.with_present(true); + assert!(pte.present().into_bool()); + assert_eq!(u64::from(pte), 0x1); + + pte =3D pte.with_writable(true); + assert!(pte.writable().into_bool()); + assert_eq!(u64::from(pte), 0x3); + + pte =3D pte.with_writable(false); + assert!(!pte.writable().into_bool()); + assert_eq!(u64::from(pte), 0x1); + + assert_eq!(pte.available(), 0); + pte =3D pte.with_const_available::<0x5>(); + assert_eq!(pte.available(), 0x5); + assert_eq!(u64::from(pte), 0xA01); + } + + #[test] + fn test_range_fields() { + let mut pte =3D TestPageTableEntry::zeroed(); + assert_eq!(u64::from(pte), 0x0); + + pte =3D pte.with_const_pfn::<0x123456>(); + assert_eq!(pte.pfn(), 0x123456); + assert_eq!(u64::from(pte), 0x1234560000); + + pte =3D pte.with_const_available::<0x7>(); + assert_eq!(pte.available(), 0x7); + assert_eq!(u64::from(pte), 0x1234560E00); + + pte =3D pte.with_const_available2::<0x3FF>(); + assert_eq!(pte.available2(), 0x3FF); + assert_eq!(u64::from(pte), 0x3FF0_0012_3456_0E00u64); + + // Test TryFrom with ?=3D> for MemoryType + pte =3D pte.with_mem_type(MemoryType::Device); + assert_eq!(pte.mem_type(), Ok(MemoryType::Device)); + assert_eq!(u64::from(pte), 0x3FF0_0012_3456_2E00u64); + + pte =3D pte.with_mem_type(MemoryType::Normal); + assert_eq!(pte.mem_type(), Ok(MemoryType::Normal)); + assert_eq!(u64::from(pte), 0x3FF0_0012_3456_1E00u64); + + // Test all valid values for mem_type + pte =3D pte.with_mem_type(MemoryType::Reserved); + assert_eq!(pte.mem_type(), Ok(MemoryType::Reserved)); + assert_eq!(u64::from(pte), 0x3FF0_0012_3456_3E00u64); + + // Test failure case using mem_type field which has 4 bits (0-15) + // MemoryType only handles 0-3, so values 4-15 should return Err + let mut raw =3D pte.into_raw(); + // Set bits 15:12 to 7 (invalid for MemoryType) + raw =3D (raw & !::kernel::bits::genmask_u64(12..=3D15)) | (0x7 << = 12); + let invalid_pte =3D TestPageTableEntry::from_raw(raw); + // Should return Err with the invalid value + assert_eq!(invalid_pte.mem_type(), Err(0x7)); + + // Test a valid value after testing invalid to ensure both cases w= ork + // Set bits 15:12 to 2 (valid: Device) + raw =3D (raw & !::kernel::bits::genmask_u64(12..=3D15)) | (0x2 << = 12); + let valid_pte =3D TestPageTableEntry::from_raw(raw); + assert_eq!(valid_pte.mem_type(), Ok(MemoryType::Device)); + + const MAX_PFN: u64 =3D ::kernel::bits::genmask_u64(0..=3D35); + pte =3D pte.with_const_pfn::<{ MAX_PFN }>(); + assert_eq!(pte.pfn(), MAX_PFN); + } + + #[test] + fn test_builder_pattern() { + let pte =3D TestPageTableEntry::zeroed() + .with_present(true) + .with_writable(true) + .with_const_available::<0x7>() + .with_const_pfn::<0xABCDEF>() + .with_mem_type(MemoryType::Reserved) + .with_const_available2::<0x3FF>(); + + assert!(pte.present().into_bool()); + assert!(pte.writable().into_bool()); + assert_eq!(pte.available(), 0x7); + assert_eq!(pte.pfn(), 0xABCDEF); + assert_eq!(pte.mem_type(), Ok(MemoryType::Reserved)); + assert_eq!(pte.available2(), 0x3FF); + } + + #[test] + fn test_raw_operations() { + let raw_value =3D 0x3FF0000031233E03u64; + + let pte =3D TestPageTableEntry::from_raw(raw_value); + assert_eq!(u64::from(pte), raw_value); + + assert!(pte.present().into_bool()); + assert!(pte.writable().into_bool()); + assert_eq!(pte.available(), 0x7); + assert_eq!(pte.pfn(), 0x3123); + assert_eq!(pte.mem_type(), Ok(MemoryType::Reserved)); + assert_eq!(pte.available2(), 0x3FF); + } + + #[test] + fn test_u16_bitfield() { + let mut ctrl =3D TestControlRegister::zeroed(); + + assert!(!ctrl.enable().into_bool()); + assert_eq!(ctrl.mode(), 0); + assert_eq!(ctrl.priority(), Priority::Low); + assert_eq!(ctrl.priority_nibble(), 0); + assert_eq!(ctrl.channel(), 0); + + ctrl =3D ctrl.with_enable(true); + assert!(ctrl.enable().into_bool()); + + ctrl =3D ctrl.with_const_mode::<0x5>(); + assert_eq!(ctrl.mode(), 0x5); + + // Test From conversion with =3D> + ctrl =3D ctrl.with_priority(Priority::High); + assert_eq!(ctrl.priority(), Priority::High); + assert_eq!(ctrl.priority_nibble(), 0x2); // High =3D 2 in bits 5:4 + + ctrl =3D ctrl.with_channel(0xAB); + assert_eq!(ctrl.channel(), 0xAB); + + // Test overlapping fields + ctrl =3D ctrl.with_const_priority_nibble::<0xF>(); + assert_eq!(ctrl.priority_nibble(), 0xF); + assert_eq!(ctrl.priority(), Priority::Critical); // bits 5:4 =3D 0= x3 + + let ctrl2 =3D TestControlRegister::zeroed() + .with_enable(true) + .with_const_mode::<0x3>() + .with_priority(Priority::Medium) + .with_channel(0x42); + + assert!(ctrl2.enable().into_bool()); + assert_eq!(ctrl2.mode(), 0x3); + assert_eq!(ctrl2.priority(), Priority::Medium); + assert_eq!(ctrl2.channel(), 0x42); + + let raw_value: u16 =3D 0x4217; + let ctrl3 =3D TestControlRegister::from_raw(raw_value); + assert_eq!(u16::from(ctrl3), raw_value); + assert!(ctrl3.enable().into_bool()); + assert_eq!(ctrl3.priority(), Priority::Medium); + assert_eq!(ctrl3.priority_nibble(), 0x1); + assert_eq!(ctrl3.channel(), 0x42); + } + + #[test] + fn test_u8_bitfield() { + let mut status =3D TestStatusRegister::zeroed(); + + assert!(!status.ready().into_bool()); + assert!(!status.error().into_bool()); + assert_eq!(status.state(), 0); + assert_eq!(status.reserved(), 0); + assert_eq!(status.full_byte(), 0); + + status =3D status.with_ready(true); + assert!(status.ready().into_bool()); + assert_eq!(status.full_byte(), 0x01); + + status =3D status.with_error(true); + assert!(status.error().into_bool()); + assert_eq!(status.full_byte(), 0x03); + + status =3D status.with_const_state::<0x3>(); + assert_eq!(status.state(), 0x3); + assert_eq!(status.full_byte(), 0x0F); + + status =3D status.with_const_reserved::<0xA>(); + assert_eq!(status.reserved(), 0xA); + assert_eq!(status.full_byte(), 0xAF); + + // Test overlapping field + status =3D status.with_full_byte(0x55); + assert_eq!(status.full_byte(), 0x55); + assert!(status.ready().into_bool()); + assert!(!status.error().into_bool()); + assert_eq!(status.state(), 0x1); + assert_eq!(status.reserved(), 0x5); + + let status2 =3D TestStatusRegister::zeroed() + .with_ready(true) + .with_const_state::<0x2>() + .with_const_reserved::<0x5>(); + + assert!(status2.ready().into_bool()); + assert!(!status2.error().into_bool()); + assert_eq!(status2.state(), 0x2); + assert_eq!(status2.reserved(), 0x5); + assert_eq!(status2.full_byte(), 0x59); + + let raw_value: u8 =3D 0x59; + let status3 =3D TestStatusRegister::from_raw(raw_value); + assert_eq!(u8::from(status3), raw_value); + assert!(status3.ready().into_bool()); + assert!(!status3.error().into_bool()); + assert_eq!(status3.state(), 0x2); + assert_eq!(status3.reserved(), 0x5); + assert_eq!(status3.full_byte(), 0x59); + + let status4 =3D TestStatusRegister::from_raw(0xFF); + assert!(status4.ready().into_bool()); + assert!(status4.error().into_bool()); + assert_eq!(status4.state(), 0x3); + assert_eq!(status4.reserved(), 0xF); + assert_eq!(status4.full_byte(), 0xFF); + } +} --=20 2.54.0