From nobody Fri Oct 3 07:40:42 2025 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2085.outbound.protection.outlook.com [40.107.93.85]) (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 C95802ED165; Wed, 3 Sep 2025 21:54:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.85 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936484; cv=fail; b=OltMPDFLD493K2LTWCrg7mulvQoVrN5duPwqj+QwImZO/vui7frmfP4uDc5xyJeDqQo/qrnvsuerLGlCPBbkIDzpqpEij30PTPXWYYd5C+MDD8wBcLiZIYaLX/vdDjrRP7jd1+a92VQnbuC7GY5OET3gNskvh7t1SfyIFaEeazo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936484; c=relaxed/simple; bh=gvk8YOHK/n0bSlbJuaOOOTCxgupD7yLvoFWBAWDpi4U=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=DdENebkzhN7uORY4lqd+y5SzMnJuJO6WgKvSSEXF8VO/SiE3a1kOcrBVTMiyeZSPkFIiVD5o6DEh2sOf78BlqcurUBcZ8uEcihF4zWOkoADLik63aFyu+iuEdX2+G5ULP8kkSgG154h6RTdLX52ObyVL7j832dDxNf6y5JjHcL8= 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=q4bZ72Ng; arc=fail smtp.client-ip=40.107.93.85 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="q4bZ72Ng" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MtIqaTHX25DJZZdfvpW3Re5lwDZ4aqOtBibYGjnPEn+mlLltfftJwvHrXp5oa3RC29od1VKUu4o85GUcXzmyG36tZitWZmVe+wAvjEEDk+uIVMbEo4weCThVp0ih/9JHmIW8BGVTlIdvAS+G0Y+/mYyLgXxQaJQQcuaYmiMuiJGheRmKiIdfo/tixWHIu8aJenYdwuYrgCnkYVlPCEm/aN+150qs5EaoVBBdBnoTwvkIQc/XQbPK3ISnPiR7UuetA30mYVRq/p2xOpHcNDVNz37xAmTfr4dT9YS3d5ze9yezJyAZJAwYyY1sqC6wHO/BbZe4eolSgFk4GDeTmQAauw== 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=ujqsT1stkNblxBlqNSEykeWg5s/J18ac+XSE+h4VxWA=; b=Hq7PYbfnZliL542YiWfobul3tmhCv70aClhLzRkmBngLgyVTGABUI+8QrCIGh1gP6oSOXnxmeE/hoBYn82/RYZbDTibifgNeiUyKl0xiUEJ/fivx2iDG5EtTEsXUJtrA0lT8/GxXLG5YUzfnlD2wG0n4dDXB1tGxVI2yMOlQbrlnQiL8WjXjQU+JEmmk6MTwq0sv8NFlierRIu2PaaX16C1PVxc1VBpGBPBmlkzQzf60Zn9BkDT3s3xMQ/Ch/TkC6vbjyK0fmxR5XXzgDwv2FOrTHHf2Cta3WNvpFkHsFtCSzxxb6L069TcmCYoV5ZDpq6xyloDBWXYyIx3ISqlGVw== 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=ujqsT1stkNblxBlqNSEykeWg5s/J18ac+XSE+h4VxWA=; b=q4bZ72NgsQlnxmv+K/q+Mg1rCY6iioHakKl4hmRiQviOmR1fTs//5EpZ/X07WHgQ/F3a3jE/wjlASIIVOTY33l+Y57WeihhFOuXdSSFQSZV7xdWhy5+lW367LoPCpsvAJhxT14xzUySsWsbNx97VEKEGEcmi3yei0c7ZKoG33IEbFHxxEAKLEgFFrvqe6RPkYFLpLAKUjSLSF5bfT2j0V+2Rc4wkkaljtq49ND7g7lGPrckjEo5JLZfqmA3qEd9r9jxOrAmHlSYBO21NpELZ+aq8ZS3x7raL4+/MFW8w0AlTv6CLtz6fV2SKsX5awBKkHxsApEsH8mf3lRDT2n+C9A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) by DS2PR12MB9589.namprd12.prod.outlook.com (2603:10b6:8:279::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9073.27; Wed, 3 Sep 2025 21:54:35 +0000 Received: from SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91]) by SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91%3]) with mapi id 15.20.9073.021; Wed, 3 Sep 2025 21:54:35 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, dakr@kernel.org, acourbot@nvidia.com Cc: Alistair Popple , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , bjorn3_gh@protonmail.com, Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , John Hubbard , Joel Fernandes , Timur Tabi , joel@joelfernandes.org, Elle Rhumsaa , Daniel Almeida , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org Subject: [PATCH v2 1/4] nova-core: bitstruct: Move bitfield-specific code from register! into new macro Date: Wed, 3 Sep 2025 17:54:25 -0400 Message-Id: <20250903215428.1296517-2-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250903215428.1296517-1-joelagnelf@nvidia.com> References: <20250903215428.1296517-1-joelagnelf@nvidia.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR22CA0003.namprd22.prod.outlook.com (2603:10b6:208:238::8) To SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) 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: SN7PR12MB8059:EE_|DS2PR12MB9589:EE_ X-MS-Office365-Filtering-Correlation-Id: 31589b79-f828-4eb1-ebed-08ddeb347850 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?bDUrd1UvM1JtL3hZb1ZPT1MrK1V5U09YK2xXdFd6VHk4TnkzdGRaOTVjMHJt?= =?utf-8?B?ZGZyVFlaYVZJOHQzSjhtelZKMElkclFpZWE2M2JQYlYrUUhqY3pxMDhlNUlD?= =?utf-8?B?WXRLTnZFWUtoQUlaTUZKZksvaTZNSjdXS0lSa3NacVo5dzQvR2RCVFpFZ0hx?= =?utf-8?B?RXVZVmo4OEd6cFpva1M5bStMaTErOTQ3U3FRUTFSQkRXMnNSN3l0UFNtVjY2?= =?utf-8?B?cmN4b3A5aEpuelBHdG0rcTY1VXJ1cFMwMnJiTHQwbG10eHg5b2FXWm54Lzlj?= =?utf-8?B?R3owblgveVlyK1RnQW9IQUk0ZTlGSzhKOGZaczNmQ2VNSUxIVXhiWVFHREsy?= =?utf-8?B?WDVoTkIxTDI5ejgzNHdtZWp6QmNmMGR6Z1NiT0RTVUZJY0treDR3Z0lNWFVF?= =?utf-8?B?VjBCdXhDYlJZVGR4ZjlHenphaWo1RkdpcXlVZWlIbFlIMUNPQ0FuQSt5QTBL?= =?utf-8?B?VTBLUzlTbXJqbWJkWGtlWktNYUNtYVdFOXk3WUN6REVXbGIvVUJoNEtZR29L?= =?utf-8?B?VndtcFRLNzN2c0Zua0FmRTFKOWMyYlRCc1lZTHRGMmhXM2liSTZEQnBPRTRK?= =?utf-8?B?eWo0OERXaXR2NlFqTmtpRC91N1hpVmVIbURkemZVb3ZZVmxqL1dIdjB1dU1J?= =?utf-8?B?NHlpVU1RdjJlbnIrRjhkdC9aeCtTZEd6ZlV3TVZpQlZJTmJjZzNJT1E2QWp3?= =?utf-8?B?N0VFdUlySnFtcUd6aGNyWVFyOUhWcjZGSjVoejNWQ3V0UHdLaC96RFB0Rm1y?= =?utf-8?B?aG1HYzZHTWhiUTFtYVBNeHI4eVBLNmJWa042ZXJVYW5vaGh1STZZZ0cxVytR?= =?utf-8?B?cHliTUVHQWthbXdCM0JveVpUR0MzTVlzVjV3KytjWXFJSVlwS1l4MFI1bzJ0?= =?utf-8?B?REFkbnI2UDRzWXN2L05Wek1MRlBOK25UU3oxRUkvajR2czJWWktaT1JUaFlU?= =?utf-8?B?SnJ6REMycG5Jc1ZIN2IxbFdzeHk2TGxzQ1daUHNKRXZ6YjdFcS96bmlISHRZ?= =?utf-8?B?bGJ4cHRTOG9KaGNnWk9GemhJbEx6QnpkUEdqSEczUWp5UmpyaG41WkErdFU3?= =?utf-8?B?bDFHZnhodU5kQmx5VVVmZzlnTmpMbDRwUkpXdG1aV3B6clpnbE1JZjY0VGV3?= =?utf-8?B?U08zRldjU1QwU0hyZnJoU1d6SWVhUi9YblBIUWJpYno5SmFjRjRuQW84SGZY?= =?utf-8?B?VEwxVVpCR2tPUHpvaEFjNEZyT0JtRjFDdE9POWZ0MnNaTUxNU3NCZXVRM25j?= =?utf-8?B?eVEvejNBNS91aWM1Qzc4b0tmOEJWQlNmdlRsWkt6ZE5HeG1GZzlybk9mbFFa?= =?utf-8?B?ZnJUTjhCUk9VWjZoZDlVMDF1dVlTdklzSFhHTXhwS3duam1ET1BSR09yVXJj?= =?utf-8?B?YUxMRjVHRUg3S0NpTWJJbDdqeGpkcFRYWm1BRWFrZmtKcG50QWcvS0tPenhL?= =?utf-8?B?Z3R0MFk0QkhzMjhnTjhPcE1JaldGRkpFRzd2TDlYKzRMdXlMK3FSdnBGaHhp?= =?utf-8?B?R1ZmY21ob3dKc2Vzak9aR3d4bGVNV0NQVnpNQUZzSmtVUXlsS0M1MitaRGhR?= =?utf-8?B?clVDUDBYSTE0bElTR0pJdm5VbnRaTmVlQTlOTW5OSkZ5Wnc0RlRtVjl1K1N1?= =?utf-8?B?Z0wrakNkQ1hjZnJzRElGbkI3L0F4T2NhYXRNdjU2dVBCWGp2ZklEK2ZMWkw5?= =?utf-8?B?VzhkOTBtVmx4dXY0Zk8yMVpTZ1dxVlgzMk93UWNXc204QmtzRUJrUThMdG0y?= =?utf-8?B?OXdYWnkxK3pMU3VDWVVxK1dvM21jLzZQd2V6T3JJcjIvOXpTZjF1aytWZVE2?= =?utf-8?B?dzJvRTVDUnhZSFVtTzNQMVE5K2hnUXpPWnM1bDluS0JoR2s1NHZEV0JETmNr?= =?utf-8?B?M1c1NzUyWEpkQW13bWVhSGNSbWJGUGFxMzM2ZjZ3MVp1a0E9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB8059.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?aGJaNjl2WTU3cmJ0TUlMWjRlUkFSZzhBV1BKTGx0YUs0S01xdkZ4V3VqWS8z?= =?utf-8?B?TWNPU2hHZ2xaT2xPclB4N29WMHk1QWs0M3BpdlM3NGl0NlBMZ3BxVW9Nd1FR?= =?utf-8?B?Ykg1enFNeUhPdVMvNWducm44cTRBZjh3WGM2VzFTTUlGL09pWjcwUjlyRnhq?= =?utf-8?B?S0MrOTJKcDU4V21FZVRRRGJrNjJFWHQ1S2o0Ly80V3VUeHlSTEFLN1ZKNVU0?= =?utf-8?B?K0dnNmYxdy9DTDE1SCtVWW1xWHNOS0docmVhdW16Z2kzbko1NHF2TGVwWGpO?= =?utf-8?B?ZEZyazZCcGI0cjIvaUlzUUh2U09JWTlZQThxUlI5aXNEWWVCWmZMaVgzVjdl?= =?utf-8?B?eUVrYmwwRCtJaEJENEduSHg1YnVSU0JWbi9XY1NQSEprMlpLT2tHUnhld0hN?= =?utf-8?B?NUtxL1dkZEFqVDBaM1Z2Vnd2Z041Wm80a3ZYdEZtWG4xcDhxTTFoS0VVb254?= =?utf-8?B?a0I0YU5uVlMwb0xERmFpZFFWSHpsVHNLQWppNnNqU1JWM0djd2VFOG1PTmtH?= =?utf-8?B?d0JSK1VONG5oaWlLbFZpUWFRRS9sVVl4K2ZERUtTbFNrU0ZGOWVuUzdReGRP?= =?utf-8?B?SU5SRCs5aUU2OVA0SkFUMnZrMUV0YWpoeXJXSEsvV3U2bWgzRnVkZDRYK1pw?= =?utf-8?B?eUU2dmViUFp3VTlSclNqb0NwSFlMazRjck8wcU1CWHcybjdWQ3ZqdzdiQ1Nu?= =?utf-8?B?QVBvTy85YjBsNHcrYnFreCtlS2NuOXlsSWVTZmppZ2NYU29IaXZtMTM1VHhv?= =?utf-8?B?YWNJWCtCQ0lwcm9nd2hEUTBjWDE5c3FjMld2Z2xrVmdYR3dPMWx0dUNIa0J6?= =?utf-8?B?Y0lKdTlkbzc5ZThWaTFZTWFrUUFIRHZISFlWZGxZS3d2UnFSd2xnWDVsUm4x?= =?utf-8?B?OXlTaC8yd2tqK0lSUHdiZWlWZnBXeFRVTU9Ra2daZDREREJsRUFYQWs4V0NZ?= =?utf-8?B?ZmhoVFp5S2RWTFhiaTlWQkY3aUUrdG5maXhDMEw0aW16aWFXaUFlK0w2MlRt?= =?utf-8?B?aHROYWhzLzhDQThjeS9tbWVLc1RtRmJjWjQ0QSt0WHY2WlI0Z3A2V0ZaakEr?= =?utf-8?B?YzNvRXNhYjludGZnbU5FYndxck5qVmptWmVNbmVQdHhaQXJlcU5PRDNnTFpY?= =?utf-8?B?dWRMakg1K09MZW53NitxNVJJZmh1OW9md3dJNTZFT2dLZFRYMjcrK08vMlZz?= =?utf-8?B?QWJFVytZZm9OWTh0R0EwakJBVzFYUVJ2WlY3TzFGSHBjdTIyekhTMENuQjJ2?= =?utf-8?B?UWc1UTJEZml4R3E0TWhuUGczckdYeWtnNks2MWJTekZrR24yWXYrMW91cW50?= =?utf-8?B?NEMrZThKdkI1bC8zY2Y5RVNtNzgzWk1UL0lTMzNid01acmNmbmdsR3V2R1k3?= =?utf-8?B?akoxNlI0algraXlrS3ZzUHQxV01MVWxWZDd0WjljUkJza05YZHlDYUE4citS?= =?utf-8?B?R3MyVnk5ODNJSFdOSjBFOVNVVFZpdkxKK3dRa1l5c3o2bmJHZ1B3NFkwNVdI?= =?utf-8?B?M1FyemRQWURWUU9acWM2RjFlRExUOHpHNVcrUS9uOUpUWmk0QS9ZcWJxNG9Z?= =?utf-8?B?a0FQbm02MjdUL1huYnJsQ0NqQnpsS1FxdXg3UWh5aEVYZEZ3L1FGckJwL01o?= =?utf-8?B?cnBsaU9COXJjMmVPZ0VGYU1rM0MwY2EzYlNVS3pEYVdBeWpRa2krVlRib3V5?= =?utf-8?B?MTlkdGJtV0tPK1NjVzFJcThJOW82V3Q3b0x3Z1hEU1hXRTZyUmREQ2NJZTJp?= =?utf-8?B?NWNiVDFmT2hkYWF5NFFKZTVGNGVhVi9ONFlxaGJ3N0JKam91NnJrbDFKTmFQ?= =?utf-8?B?T2FXaWRWVjF6b1A0TDBVa3FJakZjck1BaTY1UDlqd1JBRktRclhVS1c5Snlz?= =?utf-8?B?WHl5bzQyODE0dDdtY2lnMzVobURoc0dsSm01OVE4TnprM3c3YjhxdWY3TWow?= =?utf-8?B?N2VHWHVJU1BwQ25mUzhUQ3ZBWjJlMFIzSDJVR2s0bTF3aGZQcGJoT1p1ZjFQ?= =?utf-8?B?VXVWSi9TRG5QUWNOaFcyOTFiL0pkdHpIc1VKQzQ1ZmpOT0RXMENHQmRpN2Nq?= =?utf-8?B?Tjk1dXNCWHNnMHQ4VVA2ZzNpUkpOT1ZaUDJEU3hLaE5Sa0JlckpXbXo3OWJH?= =?utf-8?Q?bdTUGIpjd6eZHY83RJp9w0EL6?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 31589b79-f828-4eb1-ebed-08ddeb347850 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB8059.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2025 21:54:34.7392 (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: TC7aEDvVmysKMuyRcRq5CedaW5vXQ0LwOjUe9VOX6zWqSsNDmGSYHRoOGQDnl9T+kWhdn0RaE2prwx7OY9E3Ug== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS2PR12MB9589 The bitfield-specific into new macro. This will be used to define structs with bitfields, similar to C language. Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/bitstruct.rs | 271 +++++++++++++++++++++++++++ drivers/gpu/nova-core/nova_core.rs | 3 + drivers/gpu/nova-core/regs/macros.rs | 247 +----------------------- 3 files changed, 282 insertions(+), 239 deletions(-) create mode 100644 drivers/gpu/nova-core/bitstruct.rs diff --git a/drivers/gpu/nova-core/bitstruct.rs b/drivers/gpu/nova-core/bit= struct.rs new file mode 100644 index 000000000000..1dd9edab7d07 --- /dev/null +++ b/drivers/gpu/nova-core/bitstruct.rs @@ -0,0 +1,271 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// bitstruct.rs =E2=80=94 Bitfield library for Rust structures +// +// A library that provides support for defining bit fields in Rust +// structures. Also used from things that need bitfields like register mac= ro. +/// +/// # Syntax +/// +/// ```rust +/// bitstruct! { +/// struct ControlReg { +/// 3:0 mode as u8 ?=3D> Mode; +/// 7:4 state as u8 =3D> State; +/// } +/// } +/// ``` +/// +/// This generates a struct with: +/// - Field accessors: `mode()`, `state()`, etc. +/// - Field setters: `set_mode()`, `set_state()`, etc. (supports builder p= attern). +/// - Debug and Default implementations +/// +/// The field setters can be used with the builder pattern, example: +/// ControlReg::default().set_mode(mode).set_state(state); +/// +/// 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! bitstruct { + // Main entry point - defines the bitfield struct with fields + (struct $name:ident $(, $comment:literal)? { $($fields:tt)* }) =3D> { + bitstruct!(@core $name $(, $comment)? { $($fields)* }); + }; + + // All rules below are helpers. + + // Defines the wrapper `$name` type, as well as its relevant implement= ations (`Debug`, + // `Default`, `BitOr`, and conversion to the value type) and field acc= essor methods. + (@core $name:ident $(, $comment:literal)? { $($fields:tt)* }) =3D> { + $( + #[doc=3D$comment] + )? + #[repr(transparent)] + #[derive(Clone, Copy)] + pub(crate) struct $name(u32); + + impl ::core::ops::BitOr for $name { + type Output =3D Self; + + fn bitor(self, rhs: Self) -> Self::Output { + Self(self.0 | rhs.0) + } + } + + impl ::core::convert::From<$name> for u32 { + fn from(val: $name) -> u32 { + val.0 + } + } + + bitstruct!(@fields_dispatcher $name { $($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 $name:ident { + $($hi:tt:$lo:tt $field:ident as $type:tt + $(?=3D> $try_into_type:ty)? + $(=3D> $into_type:ty)? + $(, $comment:literal)? + ; + )* + } + ) =3D> { + bitstruct!(@field_accessors $name { + $( + $hi:$lo $field as $type + $(?=3D> $try_into_type)? + $(=3D> $into_type)? + $(, $comment)? + ; + )* + }); + bitstruct!(@debug $name { $($field;)* }); + bitstruct!(@default $name { $($field;)* }); + }; + + // Defines all the field getter/setter methods for `$name`. + ( + @field_accessors $name:ident { + $($hi:tt:$lo:tt $field:ident as $type:tt + $(?=3D> $try_into_type:ty)? + $(=3D> $into_type:ty)? + $(, $comment:literal)? + ; + )* + } + ) =3D> { + $( + bitstruct!(@check_field_bounds $hi:$lo $field as $type); + )* + + #[allow(dead_code)] + impl $name { + $( + bitstruct!(@field_accessor $name $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 $name:ident $hi:tt:$lo:tt $field:ident as bool =3D= > $into_type:ty + $(, $comment:literal)?; + ) =3D> { + bitstruct!( + @leaf_accessor $name $hi:$lo $field + { |f| <$into_type>::from(if f !=3D 0 { true } else { false }) } + $into_type =3D> $into_type $(, $comment)?; + ); + }; + + // Shortcut for fields defined as `bool` without the `=3D>` syntax. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as bool $(,= $comment:literal)?; + ) =3D> { + bitstruct!(@field_accessor $name $hi:$lo $field as bool =3D> bool = $(, $comment)?;); + }; + + // Catches the `?=3D>` syntax for non-boolean fields. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt= ?=3D> $try_into_type:ty + $(, $comment:literal)?; + ) =3D> { + bitstruct!(@leaf_accessor $name $hi:$lo $field + { |f| <$try_into_type>::try_from(f as $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 $name:ident $hi:tt:$lo:tt $field:ident as $type:tt= =3D> $into_type:ty + $(, $comment:literal)?; + ) =3D> { + bitstruct!(@leaf_accessor $name $hi:$lo $field + { |f| <$into_type>::from(f as $type) } $into_type =3D> $into_t= ype $(, $comment)?;); + }; + + // Shortcut for non-boolean fields defined without the `=3D>` or `?=3D= >` syntax. + ( + @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt + $(, $comment:literal)?; + ) =3D> { + bitstruct!(@field_accessor $name $hi:$lo $field as $type =3D> $typ= e $(, $comment)?;); + }; + + // Generates the accessor methods for a single field. + ( + @leaf_accessor $name:ident $hi:tt:$lo:tt $field:ident + { $process:expr } $to_type:ty =3D> $res_type:ty $(, $comment:l= iteral)?; + ) =3D> { + ::kernel::macros::paste!( + const [<$field:upper _RANGE>]: ::core::ops::RangeInclusive =3D= $lo..=3D$hi; + const [<$field:upper _MASK>]: u32 =3D ((((1 << $hi) - 1) << 1) + 1= ) - ((1 << $lo) - 1); + const [<$field:upper _SHIFT>]: u32 =3D Self::[<$field:upper _MASK>= ].trailing_zeros(); + ); + + $( + #[doc=3D"Returns the value of this field:"] + #[doc=3D$comment] + )? + #[inline(always)] + pub(crate) fn $field(self) -> $res_type { + ::kernel::macros::paste!( + const MASK: u32 =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)] + pub(crate) fn [](mut self, value: $to_type) -> Self { + const MASK: u32 =3D $name::[<$field:upper _MASK>]; + const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; + let value =3D (u32::from(value) << SHIFT) & MASK; + self.0 =3D (self.0 & !MASK) | value; + + self + } + ); + }; + + // Generates the `Debug` implementation for `$name`. + (@debug $name:ident { $($field:ident;)* }) =3D> { + impl ::core::fmt::Debug for $name { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::f= mt::Result { + f.debug_struct(stringify!($name)) + .field("", &format_args!("{:#x}", &self.0)) + $( + .field(stringify!($field), &self.$field()) + )* + .finish() + } + } + }; + + // Generates the `Default` implementation for `$name`. + (@default $name:ident { $($field:ident;)* }) =3D> { + /// Returns a value for the bitstruct where all fields are set to = their default value. + impl ::core::default::Default for $name { + fn default() -> Self { + #[allow(unused_mut)] + let mut value =3D Self(Default::default()); + + ::kernel::macros::paste!( + $( + value.[](Default::default()); + )* + ); + + value + } + } + }; +} diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index cb2bbb30cba1..b218a2d42573 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -2,6 +2,9 @@ =20 //! Nova Core GPU Driver =20 +#[macro_use] +mod bitstruct; + mod dma; mod driver; mod falcon; diff --git a/drivers/gpu/nova-core/regs/macros.rs b/drivers/gpu/nova-core/r= egs/macros.rs index 754c14ee7f40..3fb6852dff04 100644 --- a/drivers/gpu/nova-core/regs/macros.rs +++ b/drivers/gpu/nova-core/regs/macros.rs @@ -284,25 +284,25 @@ pub(crate) trait RegisterBase { macro_rules! register { // Creates a register at a fixed offset of the MMIO space. ($name:ident @ $offset:literal $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_fixed $name @ $offset); }; =20 // Creates an alias register of fixed offset register `alias` with its= own fields. ($name:ident =3D> $alias:ident $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_fixed $name @ $alias::OFFSET); }; =20 // Creates a register at a relative offset from a base address provide= r. ($name:ident @ $base:ty [ $offset:literal ] $(, $comment:literal)? { $= ($fields:tt)* } ) =3D> { - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_relative $name @ $base [ $offset ]); }; =20 // Creates an alias register of relative offset register `alias` with = its own fields. ($name:ident =3D> $base:ty [ $alias:ident ] $(, $comment:literal)? { $= ($fields:tt)* }) =3D> { - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_relative $name @ $base [ $alias::OFFSET ]); }; =20 @@ -313,7 +313,7 @@ macro_rules! register { } ) =3D> { static_assert!(::core::mem::size_of::() <=3D $stride); - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_array $name @ $offset [ $size ; $stride ]); }; =20 @@ -334,7 +334,7 @@ macro_rules! register { $(, $comment:literal)? { $($fields:tt)* } ) =3D> { static_assert!(::core::mem::size_of::() <=3D $stride); - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_relative_array $name @ $base [ $offset [ $size ; $st= ride ] ]); }; =20 @@ -356,7 +356,7 @@ macro_rules! register { } ) =3D> { static_assert!($idx < $alias::SIZE); - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_relative $name @ $base [ $alias::OFFSET + $idx * $al= ias::STRIDE ] ); }; =20 @@ -365,241 +365,10 @@ macro_rules! register { // to avoid it being interpreted in place of the relative register arr= ay alias rule. ($name:ident =3D> $alias:ident [ $idx:expr ] $(, $comment:literal)? { = $($fields:tt)* }) =3D> { static_assert!($idx < $alias::SIZE); - register!(@core $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name $(, $comment)? { $($fields)* } ); register!(@io_fixed $name @ $alias::OFFSET + $idx * $alias::STRIDE= ); }; =20 - // All rules below are helpers. - - // Defines the wrapper `$name` type, as well as its relevant implement= ations (`Debug`, - // `Default`, `BitOr`, and conversion to the value type) and field acc= essor methods. - (@core $name:ident $(, $comment:literal)? { $($fields:tt)* }) =3D> { - $( - #[doc=3D$comment] - )? - #[repr(transparent)] - #[derive(Clone, Copy)] - pub(crate) struct $name(u32); - - impl ::core::ops::BitOr for $name { - type Output =3D Self; - - fn bitor(self, rhs: Self) -> Self::Output { - Self(self.0 | rhs.0) - } - } - - impl ::core::convert::From<$name> for u32 { - fn from(reg: $name) -> u32 { - reg.0 - } - } - - register!(@fields_dispatcher $name { $($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 $name:ident { - $($hi:tt:$lo:tt $field:ident as $type:tt - $(?=3D> $try_into_type:ty)? - $(=3D> $into_type:ty)? - $(, $comment:literal)? - ; - )* - } - ) =3D> { - register!(@field_accessors $name { - $( - $hi:$lo $field as $type - $(?=3D> $try_into_type)? - $(=3D> $into_type)? - $(, $comment)? - ; - )* - }); - register!(@debug $name { $($field;)* }); - register!(@default $name { $($field;)* }); - }; - - // Defines all the field getter/methods methods for `$name`. - ( - @field_accessors $name:ident { - $($hi:tt:$lo:tt $field:ident as $type:tt - $(?=3D> $try_into_type:ty)? - $(=3D> $into_type:ty)? - $(, $comment:literal)? - ; - )* - } - ) =3D> { - $( - register!(@check_field_bounds $hi:$lo $field as $type); - )* - - #[allow(dead_code)] - impl $name { - $( - register!(@field_accessor $name $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 $name:ident $hi:tt:$lo:tt $field:ident as bool =3D= > $into_type:ty - $(, $comment:literal)?; - ) =3D> { - register!( - @leaf_accessor $name $hi:$lo $field - { |f| <$into_type>::from(if f !=3D 0 { true } else { false }) } - $into_type =3D> $into_type $(, $comment)?; - ); - }; - - // Shortcut for fields defined as `bool` without the `=3D>` syntax. - ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as bool $(,= $comment:literal)?; - ) =3D> { - register!(@field_accessor $name $hi:$lo $field as bool =3D> bool $= (, $comment)?;); - }; - - // Catches the `?=3D>` syntax for non-boolean fields. - ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt= ?=3D> $try_into_type:ty - $(, $comment:literal)?; - ) =3D> { - register!(@leaf_accessor $name $hi:$lo $field - { |f| <$try_into_type>::try_from(f as $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 $name:ident $hi:tt:$lo:tt $field:ident as $type:tt= =3D> $into_type:ty - $(, $comment:literal)?; - ) =3D> { - register!(@leaf_accessor $name $hi:$lo $field - { |f| <$into_type>::from(f as $type) } $into_type =3D> $into_t= ype $(, $comment)?;); - }; - - // Shortcut for non-boolean fields defined without the `=3D>` or `?=3D= >` syntax. - ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt - $(, $comment:literal)?; - ) =3D> { - register!(@field_accessor $name $hi:$lo $field as $type =3D> $type= $(, $comment)?;); - }; - - // Generates the accessor methods for a single field. - ( - @leaf_accessor $name:ident $hi:tt:$lo:tt $field:ident - { $process:expr } $to_type:ty =3D> $res_type:ty $(, $comment:l= iteral)?; - ) =3D> { - ::kernel::macros::paste!( - const [<$field:upper _RANGE>]: ::core::ops::RangeInclusive =3D= $lo..=3D$hi; - const [<$field:upper _MASK>]: u32 =3D ((((1 << $hi) - 1) << 1) + 1= ) - ((1 << $lo) - 1); - const [<$field:upper _SHIFT>]: u32 =3D Self::[<$field:upper _MASK>= ].trailing_zeros(); - ); - - $( - #[doc=3D"Returns the value of this field:"] - #[doc=3D$comment] - )? - #[inline(always)] - pub(crate) fn $field(self) -> $res_type { - ::kernel::macros::paste!( - const MASK: u32 =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)] - pub(crate) fn [](mut self, value: $to_type) -> Self { - const MASK: u32 =3D $name::[<$field:upper _MASK>]; - const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; - let value =3D (u32::from(value) << SHIFT) & MASK; - self.0 =3D (self.0 & !MASK) | value; - - self - } - ); - }; - - // Generates the `Debug` implementation for `$name`. - (@debug $name:ident { $($field:ident;)* }) =3D> { - impl ::core::fmt::Debug for $name { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::f= mt::Result { - f.debug_struct(stringify!($name)) - .field("", &format_args!("{:#x}", &self.0)) - $( - .field(stringify!($field), &self.$field()) - )* - .finish() - } - } - }; - - // Generates the `Default` implementation for `$name`. - (@default $name:ident { $($field:ident;)* }) =3D> { - /// Returns a value for the register where all fields are set to t= heir default value. - impl ::core::default::Default for $name { - fn default() -> Self { - #[allow(unused_mut)] - let mut value =3D Self(Default::default()); - - ::kernel::macros::paste!( - $( - value.[](Default::default()); - )* - ); - - value - } - } - }; - // Generates the IO accessors for a fixed offset register. (@io_fixed $name:ident @ $offset:expr) =3D> { #[allow(dead_code)] --=20 2.34.1 From nobody Fri Oct 3 07:40:42 2025 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2085.outbound.protection.outlook.com [40.107.93.85]) (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 519412EE5E8; Wed, 3 Sep 2025 21:54:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.85 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936486; cv=fail; b=W7unhVvqUh84h04fdpTyL5k2iqzTXaQdYLSxNPxKgr2RB4vUE+ecpUD+94W1GFQD1N0iJUqvl62GAMcMgwZxEu5NhwoId23cMi9ijfzF9PSgOScDD2GsQz29SFOK3iPD+YSftg4L9UByY87t1CcYzBIoI3HvFiIcERmHkWxiCnE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936486; c=relaxed/simple; bh=7LepTQzu4s58xS9x1VslV3acGOJUrPwzbEoRmeKt8HU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=czVOfHuIUztQmtkHquOgBJz9ZoBFG/QM9Jzc8RVWixMoR52YQ6Ts0oVD7OaN0iR7IYM4cj83PL9plbY5zD1Ok6EN/ALZlbQzpPJ+GhrA4yFNQ5XFUi3wGXZ03lQzjKl34aU9XPl2f+T8oP/iN6ugX/PepzkIOicuaTe3smHe0nk= 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=gJ514iPf; arc=fail smtp.client-ip=40.107.93.85 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="gJ514iPf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YVtJSGcD1joXeJGoMajd8/sAb6Z3uJPS3Dckukp5NEfTWlP7teZFFyqr9+/cJ8FTlvknNxVfMc2dsd1An/w1imf874bbZNZvexRzNr0S2wwyEVP8tNjCz39G7R8mabjToGJtk6+MnKFF4cbl6sZZlxQDwa/qp1oYCtFDG0hIWHXzB4Y0NfiEVjEtOdgH6Jodm+tIjsBg9W47/OPG+SLpypSGO6HubSeLXV6Je813+Yj8FZWljpqqYQ2UOOBf2GEfnnciYg4a/J3Zp+W0UKhotTG9UvkRm2OW+XuD43LVzSp7es9+fYMLhwR18FpCS2720v6ZrSZ6zj9JHnx+r+C/iw== 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=4I0EQuwH5KD8V5AIwIblg1MQvx9Ui+sW5NgHhpdyrKI=; b=CqwWTIL1srvUxKrwEStsToNo2VMMbXT2G4HIaUdLQ/5ntPhCWSzYypn14Lj8DLf4XuK7Ww9kEq+XZBaW5RU6CmcDPkEsSioh+0VoCStSGAgdCJK0lqwR4Rbr2dT7F+QgshMghGH0/rZeXnrbCjpDWZqzsPzLkKPgoZHsLd3oEISnMD33GDkpNtp3JbAKIqQ6b3QUPqrSH7fCGKWH9NBfuIfuGl6OsBMtoA88E3I1WXd+f6j0GP1FYhcQx2UKWK8vePT3yxQR+kU9tRjJy2tBhvhTQTY7dU4+Hlx/bnH3RyrIrQSHvpHCLU6UwksjxOnyeKBDdYK9fhec0ExDPu+5iw== 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=4I0EQuwH5KD8V5AIwIblg1MQvx9Ui+sW5NgHhpdyrKI=; b=gJ514iPflutYhb6bIZXcpxPWYNj7/7hNI2NeTTwI6Dedv3kfUkvmHKwIaAnNF9vfOX7vPo9JXtHmJ3ZNsImg0zGZ5u+PJFI8Mf5gOpmSytXD5rlUsIi1vPaGgYdIxOylb1Xu5lb0OJdrSnGvM0jBOxVRIjODm5hTh32oFVYEiHvSdEUdrRTqhYXGXa61asGMGmXz7a1k9h+xALWB4B350Mfx2fRLPzvBUr9kFy7QQsX+FgyPdBEvY5rRfGT+WgqxcBL9E0ej2bLJT23taWw61yAEZ2rh/SIDV0popobeW8KYl/pF9NHw53K1UQGQREs79PfSy2f0Scqf8BlojwUarA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) by DS2PR12MB9589.namprd12.prod.outlook.com (2603:10b6:8:279::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9073.27; Wed, 3 Sep 2025 21:54:36 +0000 Received: from SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91]) by SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91%3]) with mapi id 15.20.9073.021; Wed, 3 Sep 2025 21:54:36 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, dakr@kernel.org, acourbot@nvidia.com Cc: Alistair Popple , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , bjorn3_gh@protonmail.com, Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , John Hubbard , Joel Fernandes , Timur Tabi , joel@joelfernandes.org, Elle Rhumsaa , Daniel Almeida , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org Subject: [PATCH v2 2/4] nova-core: bitstruct: Add support for different storage widths Date: Wed, 3 Sep 2025 17:54:26 -0400 Message-Id: <20250903215428.1296517-3-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250903215428.1296517-1-joelagnelf@nvidia.com> References: <20250903215428.1296517-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR01CA0065.prod.exchangelabs.com (2603:10b6:208:23f::34) To SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) 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: SN7PR12MB8059:EE_|DS2PR12MB9589:EE_ X-MS-Office365-Filtering-Correlation-Id: 7fe46601-4452-491e-db4b-08ddeb347952 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?AXi8NfSBSJ/8fS7ic8J0XWUin83uPSKqlNFjUuraym/4t/GBasXLz5vrRkmG?= =?us-ascii?Q?+/P4ABNR7bU8mDRKjYo7p1IlbEbl5D0ogYE6nLDJLkgndWNorUJRZSfPqzss?= =?us-ascii?Q?3YFJZocBf5gDtWt2xnRyZ13Z6UVlUpzYPsY3znbZDSnCHds4ajaj/FeWBb5l?= =?us-ascii?Q?whFutO3hMQZAo6iZCbpssw2CSEm1V0TO85Pj5s3iAi/bLy3RWp7eX+h/nIHP?= =?us-ascii?Q?nhZBcxPsMy4gCdHkbr0diENYyKeRjTBlPRr34e2fLdtNqRNZdq5EN6lKOSXG?= =?us-ascii?Q?pLAsFukAp6PUfBk++YVmxVYJ2TfvNa47qA/u+fGt5lKyaqTQmVaE3eaJTQ63?= =?us-ascii?Q?deaEm5GOvRExuxaXemiTBGxf9cWyUqejF8fl5X9j5Jz2GYYvQIsP7eA/l3CC?= =?us-ascii?Q?Mn/QsBKKgIiuwbl7vBW4+YiGtHTN6RbpM7ImBSFtHYSB7jzpWdWXw3VNOBeG?= =?us-ascii?Q?y391FwcPUJQ3zg15Pl+05JUSRi303k1glCRWJdsYshe/vItkIlrrFMBq3HmV?= =?us-ascii?Q?kl7DUJXwxwe7ClzIDE1P4zK5eEWXOVpW7/4v0sG7leYgSU7gt9jW2UuSZUVc?= =?us-ascii?Q?GIeBL7C0mRM6d0tkYvIkIwr532+466fY0sVmr+RXRlGjBylT22jKDcWTw018?= =?us-ascii?Q?VLyqULPTW/uRMQ3Jrnv7S7o08O59G5nRg83ZkIdgsmjwMbABOzO1e3t3qkmT?= =?us-ascii?Q?EtEItNXQU1GAPJElgHNDItxfJhrGiXIrs/4fj+u8JikE34/dfHOBBYRERLqd?= =?us-ascii?Q?k2oxjVC6DEN0Fu3alZK0w5GEa8ZAN+1bJ+Bom/9W+3Mh1J5hUHNwX/eD08D3?= =?us-ascii?Q?NKS0dJMixDGM/UiNDLhcs28Qi98BwzQeDpEAza13ZbeonQbO60V2h48SClw4?= =?us-ascii?Q?vGzWnk3uebLY9WPNQOzTpM+5wNZfh5eK6FPLZF0kS7rT21MMbUM5ciA80Mam?= =?us-ascii?Q?SjLN/hWTmhNPpSqe6LrvYXo1v1m2kaqb2uddA488N8uvRA76fYaroiy8SCRJ?= =?us-ascii?Q?Wqt4TrwRaC/DUfGpnxa/eOZH8yYwwJNT54sceZwrccD2vchRxptMrucAF9Gl?= =?us-ascii?Q?d6wuaInzilRHqWOBo39PFRbTJoCnvxdYLhVXMfuO2cV/9QSnMZCJfTwVl6QW?= =?us-ascii?Q?gozKRfW9qLSMBUc3aKoQ9xisYb3rlofCJ60KwOlSuGJHwA7s4oMge2U7HLQ3?= =?us-ascii?Q?EATmU3ivR3qlIO0/KblOgEVA4MB0adTjKwDW7OJWH5iLUwimKD6sifO8maFj?= =?us-ascii?Q?sjReMVhXqe4SSQej4TPvZPMqj6XCqu+/0BGyWSxlJw1rylVjLX/wK0I5u5XS?= =?us-ascii?Q?9SyGPYavjI6QjhN6lCMno1kONy0VjSl7b+rxS6schYb8haaKJhhkdZxVKmqY?= =?us-ascii?Q?EKN2EnaKcRjSCi+EeSMRvbQtbQun8evaH7iWWFr1rFl7TG1HbttT4cHc9NgY?= =?us-ascii?Q?iKkWfdXMRAE=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB8059.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Ivn24oLe7/bvZy/JGTdimY8KPDPjU34XiANVDJSbAyJZVXL9QIi9vTl6r5CD?= =?us-ascii?Q?aOnyL5eHAx6SSE5S2GSXha+cPWpihrTwMpatz6nh+vIT0YgChbvE4YlnE+9x?= =?us-ascii?Q?KKsaemkxRXCDMG5PyBVbGJL4i6N30R4xcQLwT9qHKUEfv78AXXaX6nxpPewo?= =?us-ascii?Q?rjY3M3A2VoGvvO6pZtC3rcBCC94ZqWmFXgk2oDWOFmW0B5Ax2En+nOZKboR8?= =?us-ascii?Q?bV8k8AodQ+sHJqm3Fx3N/UhXz7qJflksmdro+HysI2axxAA6etxxPhXqPFSJ?= =?us-ascii?Q?1jrKISoigyE3dnFuj6nssVi/dxy7HNrzUWjHtVXMS/cyGgFUF3SMOh7yMwya?= =?us-ascii?Q?lzrm14v5OOapNh6DhU8hS9J/cH5cw8exGWIQhOnjf0sT7XbPP0hf98IHduau?= =?us-ascii?Q?JUR8Tpf+Zh4REhs3o/5Ybcivu/+GnKCizFN4NfTKCMby/O2bGATPPZy0iKIc?= =?us-ascii?Q?IaaJoT0nkkWA+m1pJlA+gitj5FY6qD7/1ttHZNpvN+mGfbVUVrZ0lMwZwZAG?= =?us-ascii?Q?o2T6+pUqKkoqllNzqPyWBZ5AxX6UqZPzrAome0W4vXEfhI9EYgo1G197SKif?= =?us-ascii?Q?YEvofdl/b6hQj1CEECD+Tm9NCNuwDfND5srDnzyqyZy3x9N/DpmaneM17qT+?= =?us-ascii?Q?3ozNwbyORl7cbFCd0ClvbguHqTSj0EUz76SnhrvpO5P1EkPfyaazrP2bNhQL?= =?us-ascii?Q?SvGE7yroNb+oOehlOBqTBhbtXC7MSUlJQ8xnB7UxlAL3lzQ4HtgCREatC6G2?= =?us-ascii?Q?paOqBuSITNBrO5P7p7VL2eg0LtEUJWt2laGOUfkq7b16/yaVOCz5QNVtzeK4?= =?us-ascii?Q?DfkltVTQFwloJtQReSrVqo4Lm74B6MEOGIdLERtjINXrRBdKPuWz/yZOuMH6?= =?us-ascii?Q?BGetptVYEr1myt27GIgEeaL0Uw8PEX4tfkeguxdGzt5SAPYDQlEln2G0N4Xo?= =?us-ascii?Q?zDTCHHyTbFfY2foSZQR1SPv39/Yk09D07xJ6O8NGPyFhVHYul5orRu1H1Hno?= =?us-ascii?Q?mlBeTOD1RFRBBEJigShAwIx1S2Dxo1cgLAPvNtLmI2n1jwqSiC80CD/16c5t?= =?us-ascii?Q?alQkayH6EvTfYZk/nSq+tBH2kBIvZWYSBL1i598zqMxoEz3XVUIGZLfYNG4m?= =?us-ascii?Q?5TDaQUQqEGNpwVmvVBdgQ/V9KUiBqNntRwVnJ2iy0HbtOzoIwNgzm+smR0w0?= =?us-ascii?Q?1ADtMk4QWO1CHqpcR3UOsOqhvMr1z8TtKr0TXGfCex8xwqmPoFT8QKP/bh3U?= =?us-ascii?Q?N5leIduWzr/TeRdGzk2+CKLdICcMdKPE4D2V0I6IRgK4C7zAueYHed6WeEWD?= =?us-ascii?Q?McF5MXvP03KE18VWBa8RODJnasopXgyhGC+rfXS8Vh+iStiaMRKFE8Pu5IEe?= =?us-ascii?Q?R+osP6k0L1s6j+VkFgF/8BpScNhSpfu+TWY0cvSyObLPeSrp9blwxrl85ksD?= =?us-ascii?Q?5mLEmLoLhEviT6GnL8LlkV9gNWd5955LAiDHj+Jv3H1fRPwFciCszxlzuFWS?= =?us-ascii?Q?VKGGl3yGLbHPaPtv7gveE/PjW8zUGqUGbfexi/ghEiW2K0p3SK481lpVavCZ?= =?us-ascii?Q?vZyjP+ejs5SGAxKBlbgm+ghQw5dIhLof02jj/CSN?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7fe46601-4452-491e-db4b-08ddeb347952 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB8059.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2025 21:54:36.4413 (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: bprcUb2y4b+gHH6Lrg/nv39Ec1mgwVlr/bPjsFZuIyQOXMUVqr991SqE/EP3uD5Fh6XD81/fS2wx5pEJouEGlw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS2PR12MB9589 Content-Type: text/plain; charset="utf-8" Previously, bitstructs were hardcoded to use u32 as the underlying storage type. Add support for different storage types (u8, u16, u32, u64) to the bitstruct macro. New syntax is: struct Name: { ... } Signed-off-by: Joel Fernandes Reviewed-by: Elle Rhumsaa --- drivers/gpu/nova-core/bitstruct.rs | 71 ++++++++++++++++------------ drivers/gpu/nova-core/regs/macros.rs | 16 +++---- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/nova-core/bitstruct.rs b/drivers/gpu/nova-core/bit= struct.rs index 1dd9edab7d07..068334c86981 100644 --- a/drivers/gpu/nova-core/bitstruct.rs +++ b/drivers/gpu/nova-core/bitstruct.rs @@ -9,7 +9,7 @@ /// /// ```rust /// bitstruct! { -/// struct ControlReg { +/// struct ControlReg: u32 { /// 3:0 mode as u8 ?=3D> Mode; /// 7:4 state as u8 =3D> State; /// } @@ -34,21 +34,21 @@ /// and returns the result. This is useful with fields for which not all= values are valid. macro_rules! bitstruct { // Main entry point - defines the bitfield struct with fields - (struct $name:ident $(, $comment:literal)? { $($fields:tt)* }) =3D> { - bitstruct!(@core $name $(, $comment)? { $($fields)* }); + (struct $name:ident : $storage:ty $(, $comment:literal)? { $($fields:t= t)* }) =3D> { + bitstruct!(@core $name $storage $(, $comment)? { $($fields)* }); }; =20 // All rules below are helpers. =20 // Defines the wrapper `$name` type, as well as its relevant implement= ations (`Debug`, // `Default`, `BitOr`, and conversion to the value type) and field acc= essor methods. - (@core $name:ident $(, $comment:literal)? { $($fields:tt)* }) =3D> { + (@core $name:ident $storage:ty $(, $comment:literal)? { $($fields:tt)*= }) =3D> { $( #[doc=3D$comment] )? #[repr(transparent)] #[derive(Clone, Copy)] - pub(crate) struct $name(u32); + pub(crate) struct $name($storage); =20 impl ::core::ops::BitOr for $name { type Output =3D Self; @@ -58,20 +58,20 @@ fn bitor(self, rhs: Self) -> Self::Output { } } =20 - impl ::core::convert::From<$name> for u32 { - fn from(val: $name) -> u32 { + impl ::core::convert::From<$name> for $storage { + fn from(val: $name) -> $storage { val.0 } } =20 - bitstruct!(@fields_dispatcher $name { $($fields)* }); + bitstruct!(@fields_dispatcher $name $storage { $($fields)* }); }; =20 // 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 $name:ident { + (@fields_dispatcher $name:ident $storage:ty { $($hi:tt:$lo:tt $field:ident as $type:tt $(?=3D> $try_into_type:ty)? $(=3D> $into_type:ty)? @@ -80,7 +80,7 @@ fn from(val: $name) -> u32 { )* } ) =3D> { - bitstruct!(@field_accessors $name { + bitstruct!(@field_accessors $name $storage { $( $hi:$lo $field as $type $(?=3D> $try_into_type)? @@ -89,13 +89,13 @@ fn from(val: $name) -> u32 { ; )* }); - bitstruct!(@debug $name { $($field;)* }); - bitstruct!(@default $name { $($field;)* }); + bitstruct!(@debug $name $storage { $($field;)* }); + bitstruct!(@default $name $storage { $($field;)* }); }; =20 // Defines all the field getter/setter methods for `$name`. ( - @field_accessors $name:ident { + @field_accessors $name:ident $storage:ty { $($hi:tt:$lo:tt $field:ident as $type:tt $(?=3D> $try_into_type:ty)? $(=3D> $into_type:ty)? @@ -111,7 +111,7 @@ fn from(val: $name) -> u32 { #[allow(dead_code)] impl $name { $( - bitstruct!(@field_accessor $name $hi:$lo $field as $type + bitstruct!(@field_accessor $name $storage, $hi:$lo $field as $= type $(?=3D> $try_into_type)? $(=3D> $into_type)? $(, $comment)? @@ -145,11 +145,11 @@ impl $name { =20 // Catches fields defined as `bool` and convert them into a boolean va= lue. ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as bool =3D= > $into_type:ty + @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as bool =3D> $into_type:ty $(, $comment:literal)?; ) =3D> { bitstruct!( - @leaf_accessor $name $hi:$lo $field + @leaf_accessor $name $storage, $hi:$lo $field { |f| <$into_type>::from(if f !=3D 0 { true } else { false }) } $into_type =3D> $into_type $(, $comment)?; ); @@ -157,17 +157,17 @@ impl $name { =20 // Shortcut for fields defined as `bool` without the `=3D>` syntax. ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as bool $(,= $comment:literal)?; + @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as bool $(, $comment:literal)?; ) =3D> { - bitstruct!(@field_accessor $name $hi:$lo $field as bool =3D> bool = $(, $comment)?;); + bitstruct!(@field_accessor $name $storage, $hi:$lo $field as bool = =3D> bool $(, $comment)?;); }; =20 // Catches the `?=3D>` syntax for non-boolean fields. ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt= ?=3D> $try_into_type:ty + @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as $type:tt ?=3D> $try_into_type:ty $(, $comment:literal)?; ) =3D> { - bitstruct!(@leaf_accessor $name $hi:$lo $field + bitstruct!(@leaf_accessor $name $storage, $hi:$lo $field { |f| <$try_into_type>::try_from(f as $type) } $try_into_type = =3D> ::core::result::Result< $try_into_type, @@ -178,29 +178,38 @@ impl $name { =20 // Catches the `=3D>` syntax for non-boolean fields. ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt= =3D> $into_type:ty + @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as $type:tt =3D> $into_type:ty $(, $comment:literal)?; ) =3D> { - bitstruct!(@leaf_accessor $name $hi:$lo $field + bitstruct!(@leaf_accessor $name $storage, $hi:$lo $field { |f| <$into_type>::from(f as $type) } $into_type =3D> $into_t= ype $(, $comment)?;); }; =20 // Shortcut for non-boolean fields defined without the `=3D>` or `?=3D= >` syntax. ( - @field_accessor $name:ident $hi:tt:$lo:tt $field:ident as $type:tt + @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as $type:tt $(, $comment:literal)?; ) =3D> { - bitstruct!(@field_accessor $name $hi:$lo $field as $type =3D> $typ= e $(, $comment)?;); + bitstruct!(@field_accessor $name $storage, $hi:$lo $field as $type= =3D> $type $(, $comment)?;); }; =20 // Generates the accessor methods for a single field. ( - @leaf_accessor $name:ident $hi:tt:$lo:tt $field:ident + @leaf_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:ident { $process:expr } $to_type:ty =3D> $res_type:ty $(, $comment:l= iteral)?; ) =3D> { ::kernel::macros::paste!( const [<$field:upper _RANGE>]: ::core::ops::RangeInclusive =3D= $lo..=3D$hi; - const [<$field:upper _MASK>]: u32 =3D ((((1 << $hi) - 1) << 1) + 1= ) - ((1 << $lo) - 1); + 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> <$storage>::MAX + } + }; const [<$field:upper _SHIFT>]: u32 =3D Self::[<$field:upper _MASK>= ].trailing_zeros(); ); =20 @@ -211,7 +220,7 @@ impl $name { #[inline(always)] pub(crate) fn $field(self) -> $res_type { ::kernel::macros::paste!( - const MASK: u32 =3D $name::[<$field:upper _MASK>]; + const MASK: $storage =3D $name::[<$field:upper _MASK>]; const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; ); let field =3D ((self.0 & MASK) >> SHIFT); @@ -226,9 +235,9 @@ pub(crate) fn $field(self) -> $res_type { )? #[inline(always)] pub(crate) fn [](mut self, value: $to_type) -> Self { - const MASK: u32 =3D $name::[<$field:upper _MASK>]; + const MASK: $storage =3D $name::[<$field:upper _MASK>]; const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; - let value =3D (u32::from(value) << SHIFT) & MASK; + let value =3D (<$storage>::from(value) << SHIFT) & MASK; self.0 =3D (self.0 & !MASK) | value; =20 self @@ -237,7 +246,7 @@ pub(crate) fn [](mut self, value: $to_type= ) -> Self { }; =20 // Generates the `Debug` implementation for `$name`. - (@debug $name:ident { $($field:ident;)* }) =3D> { + (@debug $name:ident $storage:ty { $($field:ident;)* }) =3D> { impl ::core::fmt::Debug for $name { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::f= mt::Result { f.debug_struct(stringify!($name)) @@ -251,7 +260,7 @@ fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::= core::fmt::Result { }; =20 // Generates the `Default` implementation for `$name`. - (@default $name:ident { $($field:ident;)* }) =3D> { + (@default $name:ident $storage:ty { $($field:ident;)* }) =3D> { /// Returns a value for the bitstruct where all fields are set to = their default value. impl ::core::default::Default for $name { fn default() -> Self { diff --git a/drivers/gpu/nova-core/regs/macros.rs b/drivers/gpu/nova-core/r= egs/macros.rs index 3fb6852dff04..bbfeab147c9f 100644 --- a/drivers/gpu/nova-core/regs/macros.rs +++ b/drivers/gpu/nova-core/regs/macros.rs @@ -284,25 +284,25 @@ pub(crate) trait RegisterBase { macro_rules! register { // Creates a register at a fixed offset of the MMIO space. ($name:ident @ $offset:literal $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_fixed $name @ $offset); }; =20 // Creates an alias register of fixed offset register `alias` with its= own fields. ($name:ident =3D> $alias:ident $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_fixed $name @ $alias::OFFSET); }; =20 // Creates a register at a relative offset from a base address provide= r. ($name:ident @ $base:ty [ $offset:literal ] $(, $comment:literal)? { $= ($fields:tt)* } ) =3D> { - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_relative $name @ $base [ $offset ]); }; =20 // Creates an alias register of relative offset register `alias` with = its own fields. ($name:ident =3D> $base:ty [ $alias:ident ] $(, $comment:literal)? { $= ($fields:tt)* }) =3D> { - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_relative $name @ $base [ $alias::OFFSET ]); }; =20 @@ -313,7 +313,7 @@ macro_rules! register { } ) =3D> { static_assert!(::core::mem::size_of::() <=3D $stride); - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_array $name @ $offset [ $size ; $stride ]); }; =20 @@ -334,7 +334,7 @@ macro_rules! register { $(, $comment:literal)? { $($fields:tt)* } ) =3D> { static_assert!(::core::mem::size_of::() <=3D $stride); - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_relative_array $name @ $base [ $offset [ $size ; $st= ride ] ]); }; =20 @@ -356,7 +356,7 @@ macro_rules! register { } ) =3D> { static_assert!($idx < $alias::SIZE); - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_relative $name @ $base [ $alias::OFFSET + $idx * $al= ias::STRIDE ] ); }; =20 @@ -365,7 +365,7 @@ macro_rules! register { // to avoid it being interpreted in place of the relative register arr= ay alias rule. ($name:ident =3D> $alias:ident [ $idx:expr ] $(, $comment:literal)? { = $($fields:tt)* }) =3D> { static_assert!($idx < $alias::SIZE); - bitstruct!(struct $name $(, $comment)? { $($fields)* } ); + bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); register!(@io_fixed $name @ $alias::OFFSET + $idx * $alias::STRIDE= ); }; =20 --=20 2.34.1 From nobody Fri Oct 3 07:40:42 2025 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2085.outbound.protection.outlook.com [40.107.93.85]) (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 DBC8F2EE5F0; Wed, 3 Sep 2025 21:54:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.85 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936489; cv=fail; b=dJSpTEitmBFJX6+mU/mHkX+J6EQcQ/5Wsit1a3jLVMJJHb9/z9gxLPf4z+71rA1NFOeNAJuACiuRmz2uSXNhfMzwyfLAFO9gT+2IolOLB/VtGX3uwbxOePFf7M3Sg0NVkYVpn5pTHRdhJP0d4vUey9BbwuzMQ1INl7uDKNaKt0Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936489; c=relaxed/simple; bh=3MYVIZiipK8jVtMbJKoKK4G24H4103f+g+GmGs51HGA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=fpHSosODEIvahTGNnQiA2S3W0tt4J+YH02HiFQtOytw42EVCCnD7NSW3ygXICp3Z0CuClFxBPGpIfCY7KkZ+Dd3R/oHx1sHxkETCW4jE0O6WiPt85Knb0HhjNETyb/zOX5Tbe1Kk/Jc23oqq9FNFrwozWUPVHE9wSO24uEr50OI= 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=h8pcFQF/; arc=fail smtp.client-ip=40.107.93.85 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="h8pcFQF/" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YfXTSp2Kv8WkkPCJhhx0CEEilgXWx8iVZ1/NEt+lYn1IIqJsrP1s1KrUkaxOBoLk4NQeDNVcz3G9X9UHSgzpqt4fJ/KOO5LZxrDfda/wqew7SOihA8tqzmdVxFNWebch+Fu5cdj9dJtbCw2G6KOqm0ZXURjTecELCbxUmsMxfyT2hkn8SBjTsBkzc6zemFhYKeUjqWQen00VcfJmQd+KWRblya3clAeJOuardzareJfyHef6ZGaHRciW93Au24zJLT5Lrt/Gb72KtlCTX660HOC0W1OudZMO/Dg6YoANs6xwqGa1frt/8Dl7KYZKAymfNYWwdULvhCwVT/MWfg9IJQ== 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=mNqVMI3dCkNEhp/x5pJyhEVtxtutIwF7FKIT5r03P8s=; b=ZkzF87qc9VmOC3KuGks84zp+g7dhdEwtXhMpZQZVfCz2M7R4iDR0ApPXpXlm4tAS5BS0K2J2uH+2ezZ6rl2+hemmBiugVl3n0nY91g2hTMgoxFZzLVW/0R53fNVHLKG78IKAArSHpW11CQx4tIKiKvYeWtYprnIYTywBoti/RJyozTlEjJ6uimxHsgbtolbpPcsNl5Arq9JBaQiryFB+C5/MR1QaWvMkF4YNTTSj9gH1ehE/5fNGwnrvL9xEJ2YvrFC+ruoMpODNUpAZRT4OphR8ePqvKZ5YA/QJvlShMe8O+192a3NZ6qm4cSxHXRVBqWR8Spb1FaPa9uLqksULAQ== 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=mNqVMI3dCkNEhp/x5pJyhEVtxtutIwF7FKIT5r03P8s=; b=h8pcFQF/wthbxyYnP70qR8jS0QQaSDlq7DuL+9rGGXQSCaaAFjy2F7djW6Gfhq5Hbg0WM+7n/QHkKDzVB6cnHNrZK8MUpbfv7oLsrUSlgGIL2zvNxjzodybSuz//1zrgt+7DPlzQ+JL1OVkSam9k/AW84KyeTj3HI91pyYjUOj1tEpCF3lx+fVH+qQoL4og8OUtMLv0C83EzeRUAp/1asstis40VHbMZUwZ3OIoIqx+YwvTmlIlWkIgzIE+YHO2GCCPxgo8Uk7+5O2GK8K2AbuuoeZHN/gJaFnzUruihGHZlPUVcD09v09IxsFwMksydPeKp+k8pph1TQFMJNfgXeQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) by DS2PR12MB9589.namprd12.prod.outlook.com (2603:10b6:8:279::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9073.27; Wed, 3 Sep 2025 21:54:38 +0000 Received: from SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91]) by SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91%3]) with mapi id 15.20.9073.021; Wed, 3 Sep 2025 21:54:38 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, dakr@kernel.org, acourbot@nvidia.com Cc: Alistair Popple , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , bjorn3_gh@protonmail.com, Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , John Hubbard , Joel Fernandes , Timur Tabi , joel@joelfernandes.org, Elle Rhumsaa , Daniel Almeida , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org Subject: [PATCH v2 3/4] nova-core: bitstruct: Add support for custom visiblity Date: Wed, 3 Sep 2025 17:54:27 -0400 Message-Id: <20250903215428.1296517-4-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250903215428.1296517-1-joelagnelf@nvidia.com> References: <20250903215428.1296517-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR01CA0038.prod.exchangelabs.com (2603:10b6:208:23f::7) To SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) 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: SN7PR12MB8059:EE_|DS2PR12MB9589:EE_ X-MS-Office365-Filtering-Correlation-Id: d8c5a2b7-74d8-4169-22e7-08ddeb347a57 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?HbzXuo+//DJQcp7rasYksci1Pht/oqrCh0YHs4tgo0/1D8q8NNHyEYj4hG2v?= =?us-ascii?Q?uXFS3x9gnJdO1hDv3KnLK150NXYNRRCElEU5wBoBPb+eyRGkS9JJ7pLDJeXv?= =?us-ascii?Q?JDcLKPzxA/sDLloPmc7pCAdot9ELbg19ELkszl87AODMWoKpdMBksCz1xQRL?= =?us-ascii?Q?0Xrhpw4u2o+vh93HzlRSo8hxzeFO9/GxkbBvxAmUiKbmBu6W+D0Oh5Mn/v2I?= =?us-ascii?Q?PJgayyB4Iltpt3vPCODH/VOzaRqFM3jY4vqnEIdOKaeSerPdF/o0kFhxdD3o?= =?us-ascii?Q?3Br21YWAoXOhkHrzLr10YIa4I5o4PEhtRr+m94uvfyY9bAMJJ2JHuLxeSO7T?= =?us-ascii?Q?QPVBf/Wje6criR1YCYTXnQPJWLeZKj5AtO8uejWmHMAxZbKghLIdnZgTKcnj?= =?us-ascii?Q?Dd0+wFxsHS/P23aauzwia5cEAUA1dPtEmRot4hBmZWnfDL4rbE48+6YVOaWt?= =?us-ascii?Q?4ZQSueFCavc3HBVdqZiQTS2K/Olzg9FZCAMmXpfJey2PMo6SAAzBmrzx2qsr?= =?us-ascii?Q?HOodJjUoICmDeAZqdRBiQfeY1u67mqzZta/+ZldSKpQgjVXAZslUbD2hlGuL?= =?us-ascii?Q?SgIjBi/bUXnCsRgOqla6rBDRBHUuojqUG17Zh6R6k/o1hFZRLHH3DMLa7Y/w?= =?us-ascii?Q?IBrY/FPZ4VLBUg6jeD+o+HYLeU0ctuRxkcwuGJiLEVQPAAg+LquNcMUKwhO4?= =?us-ascii?Q?MfUZMUJIWG9YyOTef7ntgL30F4UiB5ajZWZQrj8nMSQpbSzm91TOWfUNrcSX?= =?us-ascii?Q?IfEsf/6Pk1gujcZ0b/qtJG4yAmM3yl07iMy6jCj1HKKoZ99xzC8QfbXWdNA/?= =?us-ascii?Q?mKvDHLgS2vzQMYvoAJN56HYeW16ogQnSIfyGNYCD68B/aQ36nhiC7ZXPu8Cd?= =?us-ascii?Q?fGS5+idRb+O5GOQiG0/jImIit0cp8crxowoLiOZrpoJ04IQHJsy1SJSv+PZ9?= =?us-ascii?Q?V4e5VroOTNOx93yDPCKG0/00FENKaiGH6mR9Q73KXXqLWKopYq/dDHmN/VxT?= =?us-ascii?Q?i9RV8RRxkOYuiM8yZZEFu9o8yO9UR8/8HjIDQweLKWBkAf2tcaY0jtu792UU?= =?us-ascii?Q?NphVGc7bVOhJHh5RT8uIQz7tDmyu2+/Bnt9Em0EgUS70SsHByJGvIEAv41VP?= =?us-ascii?Q?Kspjshsx7yeYyUfCsFEpL3W623oXLzlx/yYhVVP0ugL2lxyad7BnYM/FuJP2?= =?us-ascii?Q?4LRDPRRH4xn6oXmR+JYeKHLVadrABeJ5i9MGGtol0NUUqDmHUSSmI/JqMD5u?= =?us-ascii?Q?kRusEjOh2i2xmiQoyKWYsWiFqrSbvx8QRzjbPWgwyd/89wffCR8h1JJwhAZS?= =?us-ascii?Q?XROkH5vK1qZA4xWJsmH8HSTaOfpE/NsJV1E8cID2XOzs1xERdg604NBB+ZRy?= =?us-ascii?Q?p+rRguKzh7/45ZiL59arkVxBSjmfPADhDro4dOzbzymjbTXqgQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB8059.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?tC0LLSTREHTKM5HArnWVG2AbN9jWmrjEv+pYlACcfSlFcm6icdhS65tdREo+?= =?us-ascii?Q?Kmv52hFYsGAfzwjDe7p1hFdIOL2Z6HWTQyaOveH8gqaf1eYb4eR74X3KLE/z?= =?us-ascii?Q?vsR0vV54I38Fe120bldEqravOQ/7hv78FRYgqtlaBN2/KRzgHoNFQy1w3CVw?= =?us-ascii?Q?06SE77ac8yZoapNWavNQ9ARgdCxtHvMFJzCjgSDeL/H98R0nC0O9xEUyeX75?= =?us-ascii?Q?zYc+/al5Ho9eN3YmyKBRb7imeWgm5kMb1SO8USUPx+dNyexhYxF4wcuOODCW?= =?us-ascii?Q?HFDtDwcR4R5Xt0Fg+JhO40ftG3dGF6WAdGZhHZurustVwFOk+7J9ZX1r8u9V?= =?us-ascii?Q?MX2/rW7wDwL3aEmtbmpNb18/l/IZjxNC4gtSoFRkBcxb0ZrHwAaZj0/zvpHG?= =?us-ascii?Q?hRfJhSK8fbYuEoVMy3Ng+h1+HSWt092x24CnmY8GSmoUooSO2IhIiSwGBVY7?= =?us-ascii?Q?JQiJrAhHojrjEzk5renurrUZwDcJGA4mGel6gAwicqjobJPM3iHCICf4yeV+?= =?us-ascii?Q?1jN0Hxwo8qoDe4o9fDJ7ttRgOsD4QTxYpWUj/idQbRWrB8/Wwqsp7OsftHv+?= =?us-ascii?Q?OETJQiCr+IMTFl8VMOwgmlYrVB2Tmmlm1dpIDqBb/gUgExL/acPrOMg6ZnQ6?= =?us-ascii?Q?HMRuFscZuH96QGLBAK1gac13/RjOH3talOEbzG90xX5fRWGqgxCw2MAxJ9pu?= =?us-ascii?Q?jqsN576AEOeDeF1W4SyBpXCenlkywxPSagKdjA1D3Mg6kHJI/CnG/dNZhreT?= =?us-ascii?Q?h3PuLnq/hgoym4wlzI3sPDDxo8mFeDY8Cr9wA7nY5HCeZxBvTSpBRJ5UGTjP?= =?us-ascii?Q?z967NPtoQy4e/XDzUSrgsmSKxeTTgCLT1rlQFAv8zP8VpvUdcubOJXQ4W+vw?= =?us-ascii?Q?Rdv7j1cXgMSsgGrWup3Sf8BEbZNuaYR2yD/msj+A583bS4TKdBB3fkJl+2lj?= =?us-ascii?Q?rJB2MAdhdVJ82mB52AFAUyxc5CcfqOyYhA3+v1+vnI3DAQMtw4Bu4T7XsvZY?= =?us-ascii?Q?x3lSZ02KplH1qg6GGv7bdstn6E6OqBHX2z49EE9SOFWPU8XqJBwlJM95MFeX?= =?us-ascii?Q?eSsGAPIZ8breRBlcFtigMYDikOEvFuE83tvSgEboSEFLtCpseh2BGw9nFyCo?= =?us-ascii?Q?74KDskdNdj/am8XZQE7sSiEwYm7k8YZhuuUPJrfKfB7zoUNsRbybGmCOwuSD?= =?us-ascii?Q?7cgCVHIQeJJPAEDavL9jG7m6pmg0i82RPoZxGCCICoLb2VcDXJmz/ZweGVqT?= =?us-ascii?Q?vaY9N1WMuRUWpOTQhv3Qy7a6E7u5EtLd2BDoka3zoMGxwRfEYUErueeW3hMQ?= =?us-ascii?Q?lRvFjYdJSi8SaicUsO+4WjDlBTiySvz6N452gp2k+2CF14Vw+SmCjtlXcBCx?= =?us-ascii?Q?WiB+meNsQVHjJ46UFbqjjSdZStdGVl5TfTDFbHKRDM9Y8n18v30XUVNATjy0?= =?us-ascii?Q?zkDsbDEWDQAMaoAQCgoEIZl14g/aw7a6xpC6AZJZzfl7NRbnPBU2OgdqVdY3?= =?us-ascii?Q?13D4U5OXUZ9/WEbTGyhURx5gbb5tcPwxtzkpkn/82ph4yQa13N5SonIK8GmV?= =?us-ascii?Q?RGzrv8Zv0rf1GKj8QAl/+SVFGHovY+4pF0Wvz3Qw?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d8c5a2b7-74d8-4169-22e7-08ddeb347a57 X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB8059.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2025 21:54:38.1510 (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: GrwMvbMfBKV6l5VLiZa+FLj80Y7tUa/3pG/MAYVVS0xmTBV4svFSMd5qy8XjUqVHZcUOAFtVNZN5q3ALy9Wzbw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS2PR12MB9589 Content-Type: text/plain; charset="utf-8" Add support for custom visiblity to allow for users to control visibility of the structure and helpers. Signed-off-by: Joel Fernandes Reviewed-by: Elle Rhumsaa --- drivers/gpu/nova-core/bitstruct.rs | 46 ++++++++++++++-------------- drivers/gpu/nova-core/regs/macros.rs | 16 +++++----- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/nova-core/bitstruct.rs b/drivers/gpu/nova-core/bit= struct.rs index 068334c86981..1047c5c17e2d 100644 --- a/drivers/gpu/nova-core/bitstruct.rs +++ b/drivers/gpu/nova-core/bitstruct.rs @@ -9,7 +9,7 @@ /// /// ```rust /// bitstruct! { -/// struct ControlReg: u32 { +/// pub struct ControlReg: u32 { /// 3:0 mode as u8 ?=3D> Mode; /// 7:4 state as u8 =3D> State; /// } @@ -34,21 +34,21 @@ /// and returns the result. This is useful with fields for which not all= values are valid. macro_rules! bitstruct { // Main entry point - defines the bitfield struct with fields - (struct $name:ident : $storage:ty $(, $comment:literal)? { $($fields:t= t)* }) =3D> { - bitstruct!(@core $name $storage $(, $comment)? { $($fields)* }); + ($vis:vis struct $name:ident : $storage:ty $(, $comment:literal)? { $(= $fields:tt)* }) =3D> { + bitstruct!(@core $name $vis $storage $(, $comment)? { $($fields)* = }); }; =20 // All rules below are helpers. =20 // Defines the wrapper `$name` type, as well as its relevant implement= ations (`Debug`, // `Default`, `BitOr`, and conversion to the value type) and field acc= essor methods. - (@core $name:ident $storage:ty $(, $comment:literal)? { $($fields:tt)*= }) =3D> { + (@core $name:ident $vis:vis $storage:ty $(, $comment:literal)? { $($fi= elds:tt)* }) =3D> { $( #[doc=3D$comment] )? #[repr(transparent)] #[derive(Clone, Copy)] - pub(crate) struct $name($storage); + $vis struct $name($vis $storage); =20 impl ::core::ops::BitOr for $name { type Output =3D Self; @@ -64,14 +64,14 @@ fn from(val: $name) -> $storage { } } =20 - bitstruct!(@fields_dispatcher $name $storage { $($fields)* }); + bitstruct!(@fields_dispatcher $name $vis $storage { $($fields)* }); }; =20 // 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 $name:ident $storage:ty { + (@fields_dispatcher $name:ident $vis:vis $storage:ty { $($hi:tt:$lo:tt $field:ident as $type:tt $(?=3D> $try_into_type:ty)? $(=3D> $into_type:ty)? @@ -80,7 +80,7 @@ fn from(val: $name) -> $storage { )* } ) =3D> { - bitstruct!(@field_accessors $name $storage { + bitstruct!(@field_accessors $name $vis $storage { $( $hi:$lo $field as $type $(?=3D> $try_into_type)? @@ -95,7 +95,7 @@ fn from(val: $name) -> $storage { =20 // Defines all the field getter/setter methods for `$name`. ( - @field_accessors $name:ident $storage:ty { + @field_accessors $name:ident $vis:vis $storage:ty { $($hi:tt:$lo:tt $field:ident as $type:tt $(?=3D> $try_into_type:ty)? $(=3D> $into_type:ty)? @@ -111,7 +111,7 @@ fn from(val: $name) -> $storage { #[allow(dead_code)] impl $name { $( - bitstruct!(@field_accessor $name $storage, $hi:$lo $field as $= type + bitstruct!(@field_accessor $name $vis $storage, $hi:$lo $field= as $type $(?=3D> $try_into_type)? $(=3D> $into_type)? $(, $comment)? @@ -145,11 +145,11 @@ impl $name { =20 // Catches fields defined as `bool` and convert them into a boolean va= lue. ( - @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as bool =3D> $into_type:ty + @field_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $f= ield:ident as bool =3D> $into_type:ty $(, $comment:literal)?; ) =3D> { bitstruct!( - @leaf_accessor $name $storage, $hi:$lo $field + @leaf_accessor $name $vis $storage, $hi:$lo $field { |f| <$into_type>::from(if f !=3D 0 { true } else { false }) } $into_type =3D> $into_type $(, $comment)?; ); @@ -157,17 +157,17 @@ impl $name { =20 // Shortcut for fields defined as `bool` without the `=3D>` syntax. ( - @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as bool $(, $comment:literal)?; + @field_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $f= ield:ident as bool $(, $comment:literal)?; ) =3D> { - bitstruct!(@field_accessor $name $storage, $hi:$lo $field as bool = =3D> bool $(, $comment)?;); + bitstruct!(@field_accessor $name $vis $storage, $hi:$lo $field as = bool =3D> bool $(, $comment)?;); }; =20 // Catches the `?=3D>` syntax for non-boolean fields. ( - @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as $type:tt ?=3D> $try_into_type:ty + @field_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $f= ield:ident as $type:tt ?=3D> $try_into_type:ty $(, $comment:literal)?; ) =3D> { - bitstruct!(@leaf_accessor $name $storage, $hi:$lo $field + bitstruct!(@leaf_accessor $name $vis $storage, $hi:$lo $field { |f| <$try_into_type>::try_from(f as $type) } $try_into_type = =3D> ::core::result::Result< $try_into_type, @@ -178,24 +178,24 @@ impl $name { =20 // Catches the `=3D>` syntax for non-boolean fields. ( - @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as $type:tt =3D> $into_type:ty + @field_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $f= ield:ident as $type:tt =3D> $into_type:ty $(, $comment:literal)?; ) =3D> { - bitstruct!(@leaf_accessor $name $storage, $hi:$lo $field + bitstruct!(@leaf_accessor $name $vis $storage, $hi:$lo $field { |f| <$into_type>::from(f as $type) } $into_type =3D> $into_t= ype $(, $comment)?;); }; =20 // Shortcut for non-boolean fields defined without the `=3D>` or `?=3D= >` syntax. ( - @field_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:iden= t as $type:tt + @field_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $f= ield:ident as $type:tt $(, $comment:literal)?; ) =3D> { - bitstruct!(@field_accessor $name $storage, $hi:$lo $field as $type= =3D> $type $(, $comment)?;); + bitstruct!(@field_accessor $name $vis $storage, $hi:$lo $field as = $type =3D> $type $(, $comment)?;); }; =20 // Generates the accessor methods for a single field. ( - @leaf_accessor $name:ident $storage:ty, $hi:tt:$lo:tt $field:ident + @leaf_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $fi= eld:ident { $process:expr } $to_type:ty =3D> $res_type:ty $(, $comment:l= iteral)?; ) =3D> { ::kernel::macros::paste!( @@ -218,7 +218,7 @@ impl $name { #[doc=3D$comment] )? #[inline(always)] - pub(crate) fn $field(self) -> $res_type { + $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>]; @@ -234,7 +234,7 @@ pub(crate) fn $field(self) -> $res_type { #[doc=3D$comment] )? #[inline(always)] - pub(crate) fn [](mut self, value: $to_type) -> Self { + $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(value) << SHIFT) & MASK; diff --git a/drivers/gpu/nova-core/regs/macros.rs b/drivers/gpu/nova-core/r= egs/macros.rs index bbfeab147c9f..22a53a73b765 100644 --- a/drivers/gpu/nova-core/regs/macros.rs +++ b/drivers/gpu/nova-core/regs/macros.rs @@ -284,25 +284,25 @@ pub(crate) trait RegisterBase { macro_rules! register { // Creates a register at a fixed offset of the MMIO space. ($name:ident @ $offset:literal $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_fixed $name @ $offset); }; =20 // Creates an alias register of fixed offset register `alias` with its= own fields. ($name:ident =3D> $alias:ident $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_fixed $name @ $alias::OFFSET); }; =20 // Creates a register at a relative offset from a base address provide= r. ($name:ident @ $base:ty [ $offset:literal ] $(, $comment:literal)? { $= ($fields:tt)* } ) =3D> { - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_relative $name @ $base [ $offset ]); }; =20 // Creates an alias register of relative offset register `alias` with = its own fields. ($name:ident =3D> $base:ty [ $alias:ident ] $(, $comment:literal)? { $= ($fields:tt)* }) =3D> { - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_relative $name @ $base [ $alias::OFFSET ]); }; =20 @@ -313,7 +313,7 @@ macro_rules! register { } ) =3D> { static_assert!(::core::mem::size_of::() <=3D $stride); - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_array $name @ $offset [ $size ; $stride ]); }; =20 @@ -334,7 +334,7 @@ macro_rules! register { $(, $comment:literal)? { $($fields:tt)* } ) =3D> { static_assert!(::core::mem::size_of::() <=3D $stride); - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_relative_array $name @ $base [ $offset [ $size ; $st= ride ] ]); }; =20 @@ -356,7 +356,7 @@ macro_rules! register { } ) =3D> { static_assert!($idx < $alias::SIZE); - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_relative $name @ $base [ $alias::OFFSET + $idx * $al= ias::STRIDE ] ); }; =20 @@ -365,7 +365,7 @@ macro_rules! register { // to avoid it being interpreted in place of the relative register arr= ay alias rule. ($name:ident =3D> $alias:ident [ $idx:expr ] $(, $comment:literal)? { = $($fields:tt)* }) =3D> { static_assert!($idx < $alias::SIZE); - bitstruct!(struct $name: u32 $(, $comment)? { $($fields)* } ); + bitstruct!(pub(crate) struct $name: u32 $(, $comment)? { $($fields= )* } ); register!(@io_fixed $name @ $alias::OFFSET + $idx * $alias::STRIDE= ); }; =20 --=20 2.34.1 From nobody Fri Oct 3 07:40:42 2025 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2085.outbound.protection.outlook.com [40.107.93.85]) (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 28DDC2EF643; Wed, 3 Sep 2025 21:54:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.85 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936491; cv=fail; b=gy8bBD3Vqk10vA36MIHgjiD8EJnKedX1NB1g03HgWJuwIkGpPBNP9jvH7z0R4bih7bp1Fmj2ikMXraEBGCxggSYPHmqqZQneFSg5LW5oNn00Zxubg9DA4irKk0kJ7obIe3521D3wYKaKemkstE8g6jNG4TYaOpf98ez+UG2a/Bo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756936491; c=relaxed/simple; bh=Gye13P3zk7+LO9DNmJgGE4vIZmX3ZXw/4IroQF8EC2g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=f3Gvp3CvgaSu5OJiF2rg/svYRHq5YHrQX/a0KCzpKOQb5Wsvb/ipUkDfDBFsfVmi8iLKHN/nJLaAvHkLU5lA+Mwr+QgqVx6v7Dk3IwEVhhOOoJb2XJZxgh1Mgxk2yMs/3WsH+GegfbATJF9Ufz6H2h93IsXwFyqOpfjDsbwnr2s= 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=fTWPIec9; arc=fail smtp.client-ip=40.107.93.85 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="fTWPIec9" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WoN6V9hwNz/x11/StOiz6LxRG5EqGa+jX6DTs80UvPLg5v3Hrqoh/6uVavv+5kM96PxWOFm7Qb0tdWxwf0WXDLZrj0oVVBUtEjhzPA5Jx+Xvw8/LXuzO3IwPQoWfWv67VMH6oR2gOHldc8QG3R60PU+ggtG2y4HfAuxFPv7yoakXbe7M0t3GVlDPiM6haPSJzevcWVhf65ySeXP0vL5/FgNn/LaeLkRutPQRC2iWBBHRMoNWEhE9CZNews7NcYzym5sKDYFJ2M8XeKm3OKW5wpNe173Sy7U1TcobviEA4GYiu6ZoF6aVY6OV/1i9/q1fh7S513EHeH5IxAWTc3nm0A== 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=uUiRfnXjrPPjrATyci2Okjd34Esox/LB6hUaRyWJrBo=; b=Tz0DvtY71pWlfQNPa09uQ6jEGqFwYcCrm1GJc8RtwJSagJ2sjmpMvhbdD4qxPNg0QEna7zHfaaYl030fFASimpE88yPPJq9aCXxpPs0e0wrlzME9oD/AWsg2xB+iNlsBnZPTkD9VlkyDzfYeNv8o4/QKciVArYFz8/JMXJ7Lwq/nrDrPBkF0clGY61YLwbf/4zoaD06qAAlOUvP3PJEoXFy+prjkXT+Bx9wz/7A57WAnhcTBBP1WBVnOUgr7AT1o8jjCY2cpHE9d7UdyM1XN8VWLUsQNo3ehV3yy+BJmMCNJMxVsDEthYiRxO1EO6CLltJe+vMAapKeNz/8I6lc6Cg== 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=uUiRfnXjrPPjrATyci2Okjd34Esox/LB6hUaRyWJrBo=; b=fTWPIec9ZnRFsRGR26kRztzG4htwZM33VntmnKXzREYyg+mgaT5qXQvPo0TJ77bPXjJglBgrJ2IyHlZQrDleSIF7GLTxg/9XpQ0Y0t19nXFtzyFeAt2qRZ0srawHPF6m5QOawsHofyLmth8/PhHBF9D6cFi5ItOavkinswRzaZ2AX6dpTnwBYeKsQX6ca4IH31NemmpUFj4WE4hXWODGYbcMpjULnvU1JIEoFtRFlTQ4ARpehjiFi3UXLPRn6+/7La+rC293QDz5oIEuI1er5hqoV0z+90MQKvNSp1TL5zhaHZg6muTHoOOlBWG65az8FJWJePPTa3BO2I3OWbOUOg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) by DS2PR12MB9589.namprd12.prod.outlook.com (2603:10b6:8:279::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9073.27; Wed, 3 Sep 2025 21:54:40 +0000 Received: from SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91]) by SN7PR12MB8059.namprd12.prod.outlook.com ([fe80::4ee2:654e:1fe8:4b91%3]) with mapi id 15.20.9073.021; Wed, 3 Sep 2025 21:54:39 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, dakr@kernel.org, acourbot@nvidia.com Cc: Alistair Popple , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , bjorn3_gh@protonmail.com, Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , John Hubbard , Joel Fernandes , Timur Tabi , joel@joelfernandes.org, Elle Rhumsaa , Daniel Almeida , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org Subject: [PATCH v2 4/4] rust: Move register and bitstruct macros out of Nova Date: Wed, 3 Sep 2025 17:54:28 -0400 Message-Id: <20250903215428.1296517-5-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250903215428.1296517-1-joelagnelf@nvidia.com> References: <20250903215428.1296517-1-joelagnelf@nvidia.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR05CA0026.namprd05.prod.outlook.com (2603:10b6:208:91::36) To SN7PR12MB8059.namprd12.prod.outlook.com (2603:10b6:806:32b::7) 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: SN7PR12MB8059:EE_|DS2PR12MB9589:EE_ X-MS-Office365-Filtering-Correlation-Id: 49a859a0-0bad-4993-5253-08ddeb347b5b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?UlkvRFp2U3hoYWVUTXpVL09sUmZtTHpZb3lzYTRFWDhXcHFzQUJRUDkzWkpu?= =?utf-8?B?V2prYmhxYUw0N2RDQU53UHIrR1VNdjE2cGg3TTE3V0dPNWpPVFlPRldqcmtX?= =?utf-8?B?VVFyWjc3SHJYcVlEa0lhNU14bEFkcnFib3FsZDdSOWZXa2UwRG9sWnhGTTdq?= =?utf-8?B?UjBxd1VVNlFaWEpESUx5MVlYdStJdXRCT1dpR3puY0ljckR1Yzh6Wk1PNlJ6?= =?utf-8?B?YzcrcytpeDVJd2Y0YkhhMnJ0OWhJUE9RdHdvK1QvZ3hBSXNGbnczbXpmM2FN?= =?utf-8?B?cUU4Z2Y0VTRkTjhCcHg3RGpRQTNsOSsxZHpkSUFYdWtYRmdVMVJiMHFtRHhG?= =?utf-8?B?cFQ1UTlLbDh0RE5sVlNrQ1g0TzcreGlQMXI1bm9vcWNVWkNNOXJjbzVncEkz?= =?utf-8?B?cTFZV3BnQWpvWm9hZlRFM3JsWFRzaTE3MWc3R1hUcEJ3dU42enNsV2ZWT05X?= =?utf-8?B?Tkx0Z0E3UTRJUGEwZHRqTWIydkdxaEVpeDNveGI2Y1FBQUVrdkdIQlUvczV0?= =?utf-8?B?T3hhSFVMM3hpWXhzelpKdXJVYXdDdTlibmhuZmhBM2ExeFJEeUN6OGdjYURw?= =?utf-8?B?aU9sOFdKMW1NaWhOaUJzcEpNcnNJcUZzUGlUZG0zVFkyVFkwS0YzUEZRbDdo?= =?utf-8?B?MlNLaW9jRTNVdmdaTENkbCtIMHVIM0xFVEd6U2lkbzJyZVJubEdsaWYvZldG?= =?utf-8?B?WFYrcTBsUVVUQytyUFZML2N1ejlIVlFVcy9CYm80OWhKMjIxK1ovY2Z0d0N0?= =?utf-8?B?YlpFRFdZUnptMWswL3JWQjBRNW83U1BRcEpWNXJWU0FHeDZqTElwaFY3Y21S?= =?utf-8?B?MU5ZanJmVUlsRWhwOHl4YXpiT1J5M1B2WFErSEU0eDhHeHppN3lNVkxtNElJ?= =?utf-8?B?QTlVTmRVaWJuZWFIR1k1MDdESkZKQ1B3Mno0eVh6blAycEFaTlQzQ0ZiMnlJ?= =?utf-8?B?ZTl3bzFPamMrbXdHMld0aWh1RFMwL3hXRThhZjFvVytUSDZUM2xrN1FxQ1dW?= =?utf-8?B?dmpaK05mbHY3YW9KOVFxY3h0TDk5NHM3enRxZXhmbExEOUZrbVZZTmpaRy9P?= =?utf-8?B?bXhzcllzckZQVUhrbXlPU1lncTAvbnplV0EyVVIrSjdFamdNYzhjblBmTHRo?= =?utf-8?B?c1c4VHlhZlpudk9mWlg4dy9jTGdMYjBjK0JiZWIveEM3SlM1MWVxbSt4L0JW?= =?utf-8?B?Q3haamVlQlJhQ0llejYzck5yR1hRS1N1RXB6aVNUZTZkQTV6TEZsdjRhWXVS?= =?utf-8?B?NVVHb0hPZUxkZU9Jc2F5SVMxaVFWWGRpMEt1alJkeUhJRVpENUZTTFhxUEdN?= =?utf-8?B?a1lPQmtRNWYyVnpDYmZCQzlORWZSbW1tTEVBT2l6bkl1NUJRR1hjSEdxMi9t?= =?utf-8?B?c08velh3UUM0Mi95eENZSEJXdlFPUDByUWk2Tkxmb3I0a0Y2NjRUbmdhZkNJ?= =?utf-8?B?NFluUTVlMVArRzFHS1JXaVhGMExYWm1vVHB0OW54MWJjd3B4RzFsVzhYaFBF?= =?utf-8?B?UEFVNThRZTBYcmUvNTh1aXhPZjhFbUIyMjNwZVd2VWtUejhhZWFSOG5nNXha?= =?utf-8?B?MXFCVlRqaDlQaXNyOHlDSUxLZlQzRy9TZFcrbndmUDQrR0RTUlJwbU5BR29a?= =?utf-8?B?N093ek9pQ2J2ZDJzV2J3QTAyS0JRYmZ5eG95R1E0K1Ztb1VqWkkzSDRzczJL?= =?utf-8?B?WjZTbDM2bjVsWmhRZ2lJa2JKSS9ocmNmWHRSY0Znd1NvRDB1TVc4UkR2b0lp?= =?utf-8?B?UFZpemVhTFpBdFNhT0ZkWldXeDNYZ0JJMFdiNHhZMjNoSDh2UCtwNHV6SWNO?= =?utf-8?B?WUxjWld3WjdsbVdlTVJrUGgzek95TEtnSmdWWm5uM01yR2ZObHhHQ21YL0FK?= =?utf-8?B?VFA0bFp5YUdWRjBxb2JWN3dTUlIwcWJjVW1rOG5WajNRYWVFWC9iUERMcGxQ?= =?utf-8?Q?HeGmDvZLVcw=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB8059.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QitTcXdkSVEwa2ZBUlBaVmEvemxwYnpBRmtJRzVVTWo2WmtPbjlDaU9abjdh?= =?utf-8?B?Z0JMQ0RxRDlobzZocWQ4NGluemJSWUJBdTdUc3pERkdULzVZaFFsRE9rYWR6?= =?utf-8?B?RWQxQ0ZXZE54WStrOXFtOGwzR1daTTQ5Q1lZMG5LdkRSdVZBU3Q2Z2p0cVgr?= =?utf-8?B?WThlcWFNd0QyN1lNWnVHY2ZCVVRWRFI5Yi9rU1RvYzRMWVBEUmR0YzZtYlg0?= =?utf-8?B?MTlJdWI0YzdHc3dYVGw2Y3NEckI1d3lnL0dJMVpQYUtRaHExTXRDNlk5eTQ2?= =?utf-8?B?Z2dvdmozVHRRUkxlc1hhQVRxUzl0dXJzQTFrby8rMVAyclhNNVJ0ZGF5WTJ5?= =?utf-8?B?YjkvaTEzc3A5MGNRM0k4OGxaa0JnOUNLb2FnS25ibG51THN5V2RleEs5WE1Q?= =?utf-8?B?NTBlaUh3dm9WLys1RkpndkNxNkg4TldxVlVrQVZsdWpubC95blR0WHcvZndI?= =?utf-8?B?MnFSejBJSXlNSUUrTGhSN3ZKV3B6Zi94ZlQzTHlPNUhkZEpsblU4V0hDN0pj?= =?utf-8?B?dTRSQkNXOEdNZFNiY3ptelZpS0pCRjZtWm1KKy9XMSsvRkdRVUdjRVBCYi9C?= =?utf-8?B?M2xoamYwTnY4a2g4Q0tFT1lvSVk4WnFCU0c2aHQzdlI5anNqVUhKbnBkYVFo?= =?utf-8?B?elprM1hHeTVMU3Y2cFM3WHg2ZlZsOWlYNUtWNU1KQlQ5QUVVelZnbkd1Zm1X?= =?utf-8?B?YjhIb0M1bHdqUXhUV0VSdVh2eUYxWjg5M0E0STZzS1o0aE1ZaStGeDlKNTlv?= =?utf-8?B?eTFSVW14NjhjVFlqRUkxaVZQaCtNYlZNR0JxVXZSeDVkMFo3THpqUHVielNx?= =?utf-8?B?Mm8rM3oxM1JJdkdRSTdhdTBORndKTkdjTGMvV1BmQmNrTkMwcUFmQUtGeU9n?= =?utf-8?B?a3pDNFI0cXNZcWVkaFUxZlVvSE41R1ZhY3F4NkJYYVNEdThkM1c2Q0J3VEo1?= =?utf-8?B?bHVXTDI1aFFDcU1lOFh6TEd5YkxPU1QwMjBmY0pjNG5wQ0ZYVU9XTU9YSFl5?= =?utf-8?B?bDVQNUxjTkZ0Z3ZqRUpvRXRLUDQ1QVg3NUpaYk53VithZkdvSVBpUHBBeUc4?= =?utf-8?B?dVV1Y01KUUYzeGowR3ZWbTlVNmFMVTFyMzdmT0RhQVUvV1pPQ1ZiTHVocDc1?= =?utf-8?B?K0FBNEtUYmdrT2xIOHhQdytvc1hiZ3hSMlo3Q0tlU3d5elAraXZhdHdVRFlD?= =?utf-8?B?a2pzNjk3Y1p1WVVxTm1ERnMzVWhZN0RPaTV3Q2VzaW9vOTUxS010ajdXaVNv?= =?utf-8?B?SURvallnN09ETVFvT2NIbWcxdVB4WVcva0plaVNnVFQvNkZRQW9NNmRxNzR1?= =?utf-8?B?Q3g1R2lnalFocDdKdzVNblVyS0RmZU5JWVlmaFMranhlTER4WHR1Ym5laHZG?= =?utf-8?B?RlBQbjlBVGM4ZDJ3OHlVcGtGV3BxOVhpaWJBQTVPcTVrWEhhNmVRN3RNZkZv?= =?utf-8?B?b2pKRWpNWm5KcHNpaVgxeXlISWNPLy9meWNuTjNRQUp2by9keURRWFVwcjJW?= =?utf-8?B?Z2YraHNiYVJZWTlIVnBGSkJkU3FWeFNJQjRPS2dYR3psMlorV2hQUjJ5UWhP?= =?utf-8?B?WDVXN2hPeWQ5dnI3dVJHbkttV0xsME8wNWMrL3lISCttbXlWd1VJMlA5d1VK?= =?utf-8?B?U3JCSGtLZUtabVFGc1Z4ODJCNnVJZGRTYVlUd3ZteGZ3bmhBeWtrSU1pUDQy?= =?utf-8?B?cUVGSmtwc3E5OWpDYUhrWXR5c0NHNHhtTVJVRHhXTUNnRWVRV0U3VUVxRTBt?= =?utf-8?B?cXVGMVNrVCs5bFNlbmo0d2hsY0RsTFgzNlFLeVNIUDlSbHl2blpMWmNNTDNR?= =?utf-8?B?SlA1U25JanYzVmI2M09HbGZRUnM1NGNidTJQd1ZMUTZ5M2krVlRVL1dWa0Nh?= =?utf-8?B?UXprMk5pdDNjN1lncmMxQm1SVFhpMFduNDVobG5SU0VvRmk1MlBnMVNzWFMz?= =?utf-8?B?Q1lVQjkwVCtZK1lYbzRUK2JxYWtKbGpDcTdTa3VtczdLQkVWSGJFMTd2eGFW?= =?utf-8?B?UExTSFpKOENIaFl5b2l6bkx5YjgxamxZWktURHN4YnhQMmNBUEgzZlU1SExx?= =?utf-8?B?a0VWTzhrSFBJZ2poblYvTE1jVkVDZmNwWUdZMTE2Z2duUUFSSHlwUHpaaXB2?= =?utf-8?Q?l59nvcuclQNYD9M3fbgPVOkWW?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 49a859a0-0bad-4993-5253-08ddeb347b5b X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB8059.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2025 21:54:39.8745 (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: ZchvlpQi10Rt3RoAT6OFv3yPhgue97/jw/29y3yFxT+lvZYznxgEXmwkiqmesEhJkSMh9UErVdFKtSf1E0sb0w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS2PR12MB9589 Out of broad need for these macros in Rust, move them out. Several folks have shown interest (Nova, Tyr GPU drivers). bitstruct - defines bitfields in Rust structs similar to C. register - support for defining hardware registers and accessors. Signed-off-by: Joel Fernandes Reviewed-by: Elle Rhumsaa --- drivers/gpu/nova-core/falcon.rs | 2 +- drivers/gpu/nova-core/falcon/gsp.rs | 3 +- drivers/gpu/nova-core/falcon/sec2.rs | 2 +- drivers/gpu/nova-core/nova_core.rs | 3 - drivers/gpu/nova-core/regs.rs | 5 +- .../nova-core =3D> rust/kernel}/bitstruct.rs | 31 ++++--- rust/kernel/lib.rs | 2 + rust/kernel/prelude.rs | 2 + .../regs/macros.rs =3D> rust/kernel/register.rs | 92 ++++++++++--------- 9 files changed, 74 insertions(+), 68 deletions(-) rename {drivers/gpu/nova-core =3D> rust/kernel}/bitstruct.rs (92%) rename drivers/gpu/nova-core/regs/macros.rs =3D> rust/kernel/register.rs (= 90%) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index be91aac6976a..06da6ce24482 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -7,6 +7,7 @@ use kernel::bindings; use kernel::device; use kernel::prelude::*; +use kernel::register::RegisterBase; use kernel::sync::aref::ARef; use kernel::time::Delta; =20 @@ -14,7 +15,6 @@ use crate::driver::Bar0; use crate::gpu::Chipset; use crate::regs; -use crate::regs::macros::RegisterBase; use crate::util; =20 pub(crate) mod gsp; diff --git a/drivers/gpu/nova-core/falcon/gsp.rs b/drivers/gpu/nova-core/fa= lcon/gsp.rs index f17599cb49fa..9287ab148da8 100644 --- a/drivers/gpu/nova-core/falcon/gsp.rs +++ b/drivers/gpu/nova-core/falcon/gsp.rs @@ -3,8 +3,9 @@ use crate::{ driver::Bar0, falcon::{Falcon, FalconEngine, PFalcon2Base, PFalconBase}, - regs::{self, macros::RegisterBase}, + regs, }; +use kernel::register::RegisterBase; =20 /// Type specifying the `Gsp` falcon engine. Cannot be instantiated. pub(crate) struct Gsp(()); diff --git a/drivers/gpu/nova-core/falcon/sec2.rs b/drivers/gpu/nova-core/f= alcon/sec2.rs index 815786c8480d..8f7b63b6c2b2 100644 --- a/drivers/gpu/nova-core/falcon/sec2.rs +++ b/drivers/gpu/nova-core/falcon/sec2.rs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 =20 use crate::falcon::{FalconEngine, PFalcon2Base, PFalconBase}; -use crate::regs::macros::RegisterBase; +use kernel::register::RegisterBase; =20 /// Type specifying the `Sec2` falcon engine. Cannot be instantiated. pub(crate) struct Sec2(()); diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index b218a2d42573..cb2bbb30cba1 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -2,9 +2,6 @@ =20 //! Nova Core GPU Driver =20 -#[macro_use] -mod bitstruct; - mod dma; mod driver; mod falcon; diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 206dab2e1335..6d2f20623259 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -4,9 +4,6 @@ // but are mapped to types. #![allow(non_camel_case_types)] =20 -#[macro_use] -pub(crate) mod macros; - use crate::falcon::{ DmaTrfCmdSize, FalconCoreRev, FalconCoreRevSubversion, FalconFbifMemTy= pe, FalconFbifTarget, FalconModSelAlgo, FalconSecurityModel, PFalcon2Base, PFalconBase, Pere= grineCoreSelect, @@ -331,6 +328,7 @@ pub(crate) fn mem_scrubbing_done(self) -> bool { =20 pub(crate) mod gm107 { // FUSE + use kernel::prelude::*; =20 register!(NV_FUSE_STATUS_OPT_DISPLAY @ 0x00021c04 { 0:0 display_disabled as bool; @@ -339,6 +337,7 @@ pub(crate) mod gm107 { =20 pub(crate) mod ga100 { // FUSE + use kernel::prelude::*; =20 register!(NV_FUSE_STATUS_OPT_DISPLAY @ 0x00820c04 { 0:0 display_disabled as bool; diff --git a/drivers/gpu/nova-core/bitstruct.rs b/rust/kernel/bitstruct.rs similarity index 92% rename from drivers/gpu/nova-core/bitstruct.rs rename to rust/kernel/bitstruct.rs index 1047c5c17e2d..06e5435df383 100644 --- a/drivers/gpu/nova-core/bitstruct.rs +++ b/rust/kernel/bitstruct.rs @@ -1,9 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 -// -// bitstruct.rs =E2=80=94 Bitfield library for Rust structures -// -// A library that provides support for defining bit fields in Rust -// structures. Also used from things that need bitfields like register mac= ro. + +//! Bitfield library for Rust structures +//! +//! A library that provides support for defining bit fields in Rust +//! structures. Also used from things that need bitfields like register ma= cro. /// /// # Syntax /// @@ -32,6 +32,7 @@ /// 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_export] macro_rules! bitstruct { // Main entry point - defines the bitfield struct with fields ($vis:vis struct $name:ident : $storage:ty $(, $comment:literal)? { $(= $fields:tt)* }) =3D> { @@ -125,7 +126,7 @@ impl $name { (@check_field_bounds $hi:tt:$lo:tt $field:ident as bool) =3D> { #[allow(clippy::eq_op)] const _: () =3D { - ::kernel::build_assert!( + build_assert!( $hi =3D=3D $lo, concat!("boolean field `", stringify!($field), "` covers m= ore than one bit") ); @@ -136,7 +137,7 @@ impl $name { (@check_field_bounds $hi:tt:$lo:tt $field:ident as $type:tt) =3D> { #[allow(clippy::eq_op)] const _: () =3D { - ::kernel::build_assert!( + build_assert!( $hi >=3D $lo, concat!("field `", stringify!($field), "`'s MSB is smaller= than its LSB") ); @@ -198,15 +199,15 @@ impl $name { @leaf_accessor $name:ident $vis:vis $storage:ty, $hi:tt:$lo:tt $fi= eld:ident { $process:expr } $to_type:ty =3D> $res_type:ty $(, $comment:l= iteral)?; ) =3D> { - ::kernel::macros::paste!( + $crate::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, + 1 =3D> $crate::bits::genmask_u8($lo..=3D$hi) as $storage, + 2 =3D> $crate::bits::genmask_u16($lo..=3D$hi) as $storage, + 4 =3D> $crate::bits::genmask_u32($lo..=3D$hi) as $storage, + 8 =3D> $crate::bits::genmask_u64($lo..=3D$hi) as $storage, _ =3D> <$storage>::MAX } }; @@ -219,7 +220,7 @@ impl $name { )? #[inline(always)] $vis fn $field(self) -> $res_type { - ::kernel::macros::paste!( + $crate::macros::paste!( const MASK: $storage =3D $name::[<$field:upper _MASK>]; const SHIFT: u32 =3D $name::[<$field:upper _SHIFT>]; ); @@ -228,7 +229,7 @@ impl $name { $process(field) } =20 - ::kernel::macros::paste!( + $crate::macros::paste!( $( #[doc=3D"Sets the value of this field:"] #[doc=3D$comment] @@ -267,7 +268,7 @@ fn default() -> Self { #[allow(unused_mut)] let mut value =3D Self(Default::default()); =20 - ::kernel::macros::paste!( + $crate::macros::paste!( $( value.[](Default::default()); )* diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index c859a8984bae..9c492fa10967 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -64,6 +64,7 @@ #[cfg(CONFIG_AUXILIARY_BUS)] pub mod auxiliary; pub mod bits; +pub mod bitstruct; #[cfg(CONFIG_BLOCK)] pub mod block; pub mod bug; @@ -112,6 +113,7 @@ pub mod prelude; pub mod print; pub mod rbtree; +pub mod register; pub mod regulator; pub mod revocable; pub mod security; diff --git a/rust/kernel/prelude.rs b/rust/kernel/prelude.rs index 25fe97aafd02..a98c7b7ab6af 100644 --- a/rust/kernel/prelude.rs +++ b/rust/kernel/prelude.rs @@ -39,6 +39,8 @@ =20 pub use super::static_assert; =20 +pub use super::{bitstruct, register}; + pub use super::error::{code::*, Error, Result}; =20 pub use super::{str::CStr, ThisModule}; diff --git a/drivers/gpu/nova-core/regs/macros.rs b/rust/kernel/register.rs similarity index 90% rename from drivers/gpu/nova-core/regs/macros.rs rename to rust/kernel/register.rs index 22a53a73b765..1f48c5335e70 100644 --- a/drivers/gpu/nova-core/regs/macros.rs +++ b/rust/kernel/register.rs @@ -16,7 +16,8 @@ /// The `T` generic argument is used to distinguish which base to use, in = case a type provides /// several bases. It is given to the `register!` macro to restrict the us= e of the register to /// implementors of this particular variant. -pub(crate) trait RegisterBase { +pub trait RegisterBase { + /// The base address for the register. const BASE: usize; } =20 @@ -281,6 +282,7 @@ pub(crate) trait RegisterBase { /// # Ok(()) /// # } /// ``` +#[macro_export] macro_rules! register { // Creates a register at a fixed offset of the MMIO space. ($name:ident @ $offset:literal $(, $comment:literal)? { $($fields:tt)*= } ) =3D> { @@ -378,7 +380,7 @@ impl $name { /// Read the register from its address in `io`. #[inline(always)] pub(crate) fn read(io: &T) -> Self where - T: ::core::ops::Deref>, + T: ::core::ops::Deref>, { Self(io.read32($offset)) } @@ -386,7 +388,7 @@ pub(crate) fn read(io: &T) -> Sel= f where /// Write the value contained in `self` to the register addres= s in `io`. #[inline(always)] pub(crate) fn write(self, io: &T) where - T: ::core::ops::Deref>, + T: ::core::ops::Deref>, { io.write32(self.0, $offset) } @@ -398,7 +400,7 @@ pub(crate) fn alter( io: &T, f: F, ) where - T: ::core::ops::Deref>, + T: ::core::ops::Deref>, F: ::core::ops::FnOnce(Self) -> Self, { let reg =3D f(Self::read(io)); @@ -421,13 +423,13 @@ pub(crate) fn read( #[allow(unused_variables)] base: &B, ) -> Self where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, { const OFFSET: usize =3D $name::OFFSET; =20 let value =3D io.read32( - >::BASE = + OFFSET + >::BASE + O= FFSET ); =20 Self(value) @@ -442,14 +444,14 @@ pub(crate) fn write( #[allow(unused_variables)] base: &B, ) where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, { const OFFSET: usize =3D $name::OFFSET; =20 io.write32( self.0, - >::BASE = + OFFSET + >::BASE + O= FFSET ); } =20 @@ -462,8 +464,8 @@ pub(crate) fn alter( base: &B, f: F, ) where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, F: ::core::ops::FnOnce(Self) -> Self, { let reg =3D f(Self::read(io, base)); @@ -486,7 +488,7 @@ pub(crate) fn read( io: &T, idx: usize, ) -> Self where - T: ::core::ops::Deref>, + T: ::core::ops::Deref>, { build_assert!(idx < Self::SIZE); =20 @@ -503,7 +505,7 @@ pub(crate) fn write( io: &T, idx: usize ) where - T: ::core::ops::Deref>, + T: ::core::ops::Deref>, { build_assert!(idx < Self::SIZE); =20 @@ -520,7 +522,7 @@ pub(crate) fn alter( idx: usize, f: F, ) where - T: ::core::ops::Deref>, + T: ::core::ops::Deref>, F: ::core::ops::FnOnce(Self) -> Self, { let reg =3D f(Self::read(io, idx)); @@ -535,13 +537,13 @@ pub(crate) fn alter( pub(crate) fn try_read( io: &T, idx: usize, - ) -> ::kernel::error::Result where - T: ::core::ops::Deref>, + ) -> $crate::error::Result where + T: ::core::ops::Deref>, { if idx < Self::SIZE { Ok(Self::read(io, idx)) } else { - Err(EINVAL) + Err($crate::error::code::EINVAL) } } =20 @@ -554,13 +556,13 @@ pub(crate) fn try_write( self, io: &T, idx: usize, - ) -> ::kernel::error::Result where - T: ::core::ops::Deref>, + ) -> $crate::error::Result where + T: ::core::ops::Deref>, { if idx < Self::SIZE { Ok(self.write(io, idx)) } else { - Err(EINVAL) + Err($crate::error::code::EINVAL) } } =20 @@ -574,14 +576,14 @@ pub(crate) fn try_alter( io: &T, idx: usize, f: F, - ) -> ::kernel::error::Result where - T: ::core::ops::Deref>, + ) -> $crate::error::Result where + T: ::core::ops::Deref>, F: ::core::ops::FnOnce(Self) -> Self, { if idx < Self::SIZE { Ok(Self::alter(io, idx, f)) } else { - Err(EINVAL) + Err($crate::error::code::EINVAL) } } } @@ -607,12 +609,12 @@ pub(crate) fn read( base: &B, idx: usize, ) -> Self where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, { build_assert!(idx < Self::SIZE); =20 - let offset =3D >::BASE + + let offset =3D = >::BASE + Self::OFFSET + (idx * Self::STRIDE); let value =3D io.read32(offset); =20 @@ -629,12 +631,12 @@ pub(crate) fn write( base: &B, idx: usize ) where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, { build_assert!(idx < Self::SIZE); =20 - let offset =3D >::BASE + + let offset =3D = >::BASE + Self::OFFSET + (idx * Self::STRIDE); =20 io.write32(self.0, offset); @@ -650,8 +652,8 @@ pub(crate) fn alter( idx: usize, f: F, ) where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, F: ::core::ops::FnOnce(Self) -> Self, { let reg =3D f(Self::read(io, base, idx)); @@ -668,14 +670,14 @@ pub(crate) fn try_read( io: &T, base: &B, idx: usize, - ) -> ::kernel::error::Result where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + ) -> $crate::error::Result where + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, { if idx < Self::SIZE { Ok(Self::read(io, base, idx)) } else { - Err(EINVAL) + Err($crate::error::code::EINVAL) } } =20 @@ -690,14 +692,14 @@ pub(crate) fn try_write( io: &T, base: &B, idx: usize, - ) -> ::kernel::error::Result where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + ) -> $crate::error::Result where + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, { if idx < Self::SIZE { Ok(self.write(io, base, idx)) } else { - Err(EINVAL) + Err($crate::error::code::EINVAL) } } =20 @@ -713,17 +715,19 @@ pub(crate) fn try_alter( base: &B, idx: usize, f: F, - ) -> ::kernel::error::Result where - T: ::core::ops::Deref>, - B: crate::regs::macros::RegisterBase<$base>, + ) -> $crate::error::Result where + T: ::core::ops::Deref>, + B: $crate::register::RegisterBase<$base>, F: ::core::ops::FnOnce(Self) -> Self, { if idx < Self::SIZE { Ok(Self::alter(io, base, idx, f)) } else { - Err(EINVAL) + Err($crate::error::code::EINVAL) } } } }; } + +pub use register; --=20 2.34.1