From patchwork Thu Mar 20 13:39:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14023997 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1D9D3C35FFF for ; Thu, 20 Mar 2025 13:39:50 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 730BF10E610; Thu, 20 Mar 2025 13:39:49 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="IVWoCsAK"; dkim-atps=neutral Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2082.outbound.protection.outlook.com [40.107.243.82]) by gabe.freedesktop.org (Postfix) with ESMTPS id C06E710E610; Thu, 20 Mar 2025 13:39:48 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aIy2cMGEg7YNacjhbrLZRYB+Y0p/fVfEO6gyDIrOzPywRiZed5dlJQqjjYT/q1YwkuBPs0SXpi61EvhzoYkGWYFgWiWEvGAMuaU9IaI9rKuNHKQfS82VheSy1MyPi7DDE7prgJ37QQpWVQ2WhEl7ikmKIaYaC5tB8ZLldJQ1Ud1E4xZQckYdvs9PCNZH4e6Jy/sIXIR0beC/YPY7mKOpU/YCcS2MXd+NAy+5FRNyri8tZBgQK0fY5Ln9KkXMxtPXJQ4mF51xsw2xlMBiJofGkRgrckvmz82GlpOo7q/N6qSayHGm4/ItWI3PiyYw992FGPHcS6T3ZqVAwQlLXI+xqA== 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=uNKljv7IAulyzuCI5l6SulKqrSN+En25SZ/NLxLZec4=; b=OJaj7q6I14qC7vrQf/tKOQ5HklqSqH6XlYYhhOTjQt9Low9rO5zNwfq6qGKaxqfMcBAg9/Gj7GgEFdW8jRPOSL/+dxuwEqqTz0dk+IzxpoWQ3+jVe7Lb6g5WJPI14UJVKnkntIMDm4E1K2qVDzrvx+3mbAeMg7EufwAAavHdLdTiUdgnx1elE+YnpOV0FAg+bYRZVGq3SGY6CO/f3CAYTsWT9xjzc35OaGRJMqxCGdJiFQrciDYGzlf99TlVZS/T9KLWfs1EIiU016Z5x+8+UhcsuFD6arfaC41ewcL63eAGqsZ21dgN99N/wjq+DtjMhfiBBJ5dCE+qbeQaEuPr9A== 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=uNKljv7IAulyzuCI5l6SulKqrSN+En25SZ/NLxLZec4=; b=IVWoCsAKV+ejHsYmQ+IfShlIAcKLDlDcnnjeqvsYtwclqw0ghglEYZrcDZNJWXhxvmtpTtJ3Ks1ydZTRHlphavtjCZ2sqteZTbhH3Wf2FIbxWuQn2sXGEVYKh/DsqP0jFEe2PMF7+AHj5nqCRoG5WHMFycc3DJRfs39R1SYBd1UyM8byMTVQ5R7PrIvBwtRTxss4NErxy5b/Znh1csRRFa6R89iVPurhfCOA7OThXuLbEKdQAoYKnCHlXjH9p3rGKE2Qcfmj2jqh/lMeGIhS3OpvZC50BX2LI8z9JKKGLRRHkDPeIHInjT6TF+9n/OpQA5gIPN/upUxJ0kVzp37ngA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by IA1PR12MB6409.namprd12.prod.outlook.com (2603:10b6:208:38b::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.35; Thu, 20 Mar 2025 13:39:35 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::6e37:569f:82ee:3f99]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::6e37:569f:82ee:3f99%6]) with mapi id 15.20.8534.034; Thu, 20 Mar 2025 13:39:35 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:09 +0900 Subject: [PATCH RFC v3 1/7] rust: add useful ops for u64 Message-Id: <20250320-nova_timer-v3-1-79aa2ad25a79@nvidia.com> References: <20250320-nova_timer-v3-0-79aa2ad25a79@nvidia.com> In-Reply-To: <20250320-nova_timer-v3-0-79aa2ad25a79@nvidia.com> To: Danilo Krummrich , David Airlie , John Hubbard , Ben Skeggs , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Simona Vetter Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Alexandre Courbot , =?utf-8?q?Sergio_Gonz=C3=A1lez_Co?= =?utf-8?q?llado?= X-Mailer: b4 0.14.2 X-ClientProxiedBy: TYCP286CA0181.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:382::19) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PR12MB3990:EE_|IA1PR12MB6409:EE_ X-MS-Office365-Filtering-Correlation-Id: 739001d7-7892-4597-49b2-08dd67b4a75f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|366016|10070799003|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?h42GmdMPuvpJ9nC4vwj8RVgysHdzRoT?= =?utf-8?q?rZU0vJxgZ4K9locZaToVpWoiCg3+sRGfhsKK012lmlYCIbR4q17Q1O+6DAgQuNnIn?= =?utf-8?q?j7bTQ1v7LQ6WJvqxTCbR9QFJHq9E1VMjG3XSRt/Aj9k+uOf2oAaFuy6r3r2kcHGRE?= =?utf-8?q?ZPPWJbABk6IZmW3M7xz1dj+4bFSAyYpLFIqyt8VmPG/s8rEYA5oo4WrYcf2/Kp6xx?= =?utf-8?q?Xod0fz4BUVzDGOmQ/2UImxXGdbr6cslJgo7ee22V+ucj29N0uj24+vTX2TvCrJqQT?= =?utf-8?q?zxvThVYRX4AJO7reZSl9lG4mCCuKWoHhTYmmZYX5qsGSuKsjyJ8XqKeNoWf4UTifl?= =?utf-8?q?DfqoVVpPRFI0nd2lofjelF8ptZCgMNEwYsG/UjSprPPW7zFo6wAhEdQjvrGrUCgXN?= =?utf-8?q?UKjypvA1RQAGg6ZUXyzEI1mFzmmbo+lOJrFi2yOwbedtdF0z+0oS/B5flNMGwye5p?= =?utf-8?q?hItqvgTJLJFzu6L5dxVlHbUgQBPBHwTLU5SA/OQ2FqcpveAR7KLvBAtW0pm6PE7St?= =?utf-8?q?oZNXhOhA5WKmzP4eW2XMpUQYK0GeiftKjvmDUVN+xXIBW3OckYGlsy5RXSHyrOuIh?= =?utf-8?q?VTKY+l1ucvlDo0n9r8yrcgxhKYtYoBXvxqIXqQhloaAZhU2oZpvpu61KdJIBJwtko?= =?utf-8?q?hT3N8xjDhauj+I4J0WUNGSMHBkq5MvTosjCZy3Vhx7iqo3AgKb5BsmQcJl719Fc67?= =?utf-8?q?uBpARt/BvBn7Nqqiis/Gng6AroKNJgb231/8/s7tT42sJQIQosABJdMe9Ofip17FU?= =?utf-8?q?vjDNTTqwAeOqBfboRCVGc/ZqoX79iLq6vNWklz+XR1g4XnPxDJfV+evXA8T1edUdH?= =?utf-8?q?4OdJ6p4q3fokYz9Uv72K8lySQM1r8ULnh88FR/UUxzN09w8rvmjNIFnsAsAh3SPi8?= =?utf-8?q?X2Z6b3BziD4QJYFASaCsZgcy4A2zFhHKUyUvjk1FeK4/PQstq5uUMp1EP/wqhC32x?= =?utf-8?q?W1qO+W/RF/iN3XfbAxeaq0ot4O7ApgGwGOFPiEz+rX+X7lj0aDa1f1QDATjO4naj2?= =?utf-8?q?S1zlWyuaZYJ5+VLcS4BPTavAA6tZfC2SH3fsrhA7aEjMANBl50DmED5DUJD9GjyLS?= =?utf-8?q?wwVDLNNUMbFpg7+0E/Dq5iir2eIks5w16sJZHHOYdvd45O6oA9vM6KtROaSRRSGsJ?= =?utf-8?q?eQT7l9qvyUmQ5h9p96SGGhRKt7aZuS0RHpd93y4rTZgwZ6KERu0AkPboSyr6laStl?= =?utf-8?q?/GPB6cJDy5mI6Ts9KUJLDTBUzBqVO8j3Oeki4cdM2xsGCouj71wbMwBB23+BtuI1Q?= =?utf-8?q?QOqwRjSKlSsEZ/HF40qIi8bVR3ldpPCyk31K/PUavu4AaceMRcSdmZWpRudKMB8NC?= =?utf-8?q?w1tsFKss45OZ+f/7OsxNYbqt4NL9HcDdRJALhK7X44yK6hrajCjrveA=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CH2PR12MB3990.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(366016)(10070799003)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?iuOnDDL1BWaBQmYhCvnUs7FB8JoY?= =?utf-8?q?CJjDGP/bgQGzzcP9/IYCtHS517jHBXLO4xine37GyM0+1834C09qN+e3wzW2NzGxU?= =?utf-8?q?QDMVtaZdfGnnM8DGLT84erbjwNChHzVQ5yTAvrKaenoeVwNgruJXqt6cTQg/ivUJk?= =?utf-8?q?Ww3cbpRVymdhSN9/eiTTHj+9ZrFmwQobREXf1TRdFEwamq4t30xictRK8e78Ymd+N?= =?utf-8?q?IqTM5eBOCCIR6IpCssGxOkukn7O7S/yAEePCwQcGAyYl/jXe/JwQyefCM18Wn9Ppw?= =?utf-8?q?2zaoqDttMEk2pLDEtpwq4siPRPyNlkDXbFfK9KL4ptAi9a7J4j4E9lxtkI6fhg36v?= =?utf-8?q?/KOYLHT1UBe3uQiztHT2pIQ4EsZi8OBoRwigCE7gPh0M4fI/+LZmkKoLzJlztAmHG?= =?utf-8?q?ArrXYsGcUAXqXVGUV0rj0uG4AMyEYSoGWZvM1WgQClMnYSgYyiK9MGS1RShYuWNaw?= =?utf-8?q?UOhtEWwJ9qvpvL2ZqHZD6jt2vpS/FO3yR9TRwY9q9/Gkck8uJnqG+lwRJ0+eYx/9G?= =?utf-8?q?yzkbptTkjb68gW/SdrKoerGgP5sxn4lP18YJlNJb5RBdoOdFXLPb7u/cBqvbN1lI5?= =?utf-8?q?2KBfQ8d+IT0zEGr2/fVeZHZdIOA3S597GSAtvLApB/EZ5/8AS5gVad/x4/ieQ7QOA?= =?utf-8?q?ZlAWgn+gQ053eZ6vFyiR4Hmijqn0B6XnO85Snbux4ZRJPK+1Nrfx4aJ0b4SQyjlqY?= =?utf-8?q?noPnZpGZ795RHUdBIQM31BN4+sBNX9wfxeIlhpCMQtCk1Py1lFFxB0LtKsTsrdiqF?= =?utf-8?q?UKs1FBZdOiHgKOHB3xz79Lcp6MO2hdq+qaIGfFo187rPhDsgsKc6dRK1nHa/1oKAN?= =?utf-8?q?hwXIaa/ZmAUlU6rT9SJD+AxaSErWAOdA2ilfvt9f/t47unECDNaWnwfLcKDCLVYVG?= =?utf-8?q?8mS86w1Lb2ThWcH/v6GSWrxiDalisD4dwPJ1X6Is1MAvZy5WwKY/gTEmKK3MdoJ2b?= =?utf-8?q?BozEkndCa+A2Tfn6kWKEtAyQJBGTtH28SMEmsFOML4rkCJfXmpGJmbl3DEurMS6NI?= =?utf-8?q?g+tC5Pc6c4lr9J6wMubWBdgBEYEu3sxfNKotJLLn+mplGgr4PxfrFML3dZc4NtzJI?= =?utf-8?q?gPJadtIZPl6PImLOnc9cR7Pk7gMKVj6aAdMm7HbY9SmEAw4ANHZz24a976gn+KgK5?= =?utf-8?q?0JjiClBv7Ymgv0DLdhYAQPjuV8gH6tSatydPWoH6fdMF4yvTJIOibFN3ouGdPspJd?= =?utf-8?q?A21EZfvdgjuA9m3uF7l+VUYM4sFxI/lgvTLWAzjVnJyCdkN5lEnbM/hqGp5OUaKlO?= =?utf-8?q?ta0eIhaayyhiZxgg5FfIscHNx0wmYFLqJwr/JxH//j2xZM07R3BYXsVLB4t9XKiyW?= =?utf-8?q?ZIL8+EeeGUP8kz0bU7PAzfOYwGlswVK1Y7hAViuCIsERveNkDo7Yz2rg7KQZwJmh7?= =?utf-8?q?kQjvq3RFIJtqxPZAZAS0WD3+5MUs1dnxKMksaxaye4TMoF97gvzAWczgxBzTvbBqE?= =?utf-8?q?ornzzgRAyJ1v2BK7p+AB0TZ8Rf0NXpVaPh/CaOTO4EB/LFA6XsK5WNY4NROio/YUr?= =?utf-8?q?4nWxOTAqyO6FGeZapvshcLB2oVsqNvKW8mAJnbxJF3gDWz4VOTQfDkEObhSSQ//dB?= =?utf-8?q?loONvlyGSas?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 739001d7-7892-4597-49b2-08dd67b4a75f X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Mar 2025 13:39:35.7527 (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: 5QdC8gMcrVHZzvn4osWM2mG+MAAGJUmo7w+4fnLr2u5EE/w3bLh0v14hTEF2El4rMHenHolk92uy/jv9FOIutg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6409 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" It is common to build a u64 from its high and low parts obtained from two 32-bit registers. Conversely, it is also common to split a u64 into two u32s to write them into registers. Add an extension trait for u64 that implement these methods in a new `num` module. It is expected that this trait will be extended with other useful operations, and similar extension traits implemented for other types. Reviewed-by: Sergio González Collado Signed-off-by: Alexandre Courbot --- rust/kernel/lib.rs | 1 + rust/kernel/num.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 2fe10df9a45ccd5fa24330f927abdf9dfb874d44..a9499597ed9650f8fae9b2f53fa9abeea05071f4 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -62,6 +62,7 @@ pub mod miscdevice; #[cfg(CONFIG_NET)] pub mod net; +pub mod num; pub mod of; pub mod page; #[cfg(CONFIG_PCI)] diff --git a/rust/kernel/num.rs b/rust/kernel/num.rs new file mode 100644 index 0000000000000000000000000000000000000000..9b93db6528eef131fb74c1289f1e152cc2a13168 --- /dev/null +++ b/rust/kernel/num.rs @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Numerical and binary utilities for primitive types. + +/// Useful operations for `u64`. +pub trait U64Ext { + /// Build a `u64` by combining its `high` and `low` parts. + /// + /// ``` + /// use kernel::num::U64Ext; + /// assert_eq!(u64::from_u32s(0x01234567, 0x89abcdef), 0x01234567_89abcdef); + /// ``` + fn from_u32s(high: u32, low: u32) -> Self; + + /// Returns the upper 32 bits of `self`. + fn upper_32_bits(self) -> u32; + + /// Returns the lower 32 bits of `self`. + fn lower_32_bits(self) -> u32; +} + +impl U64Ext for u64 { + fn from_u32s(high: u32, low: u32) -> Self { + ((high as u64) << u32::BITS) | low as u64 + } + + fn upper_32_bits(self) -> u32 { + (self >> u32::BITS) as u32 + } + + fn lower_32_bits(self) -> u32 { + self as u32 + } +} + +/// Same as [`U64Ext::upper_32_bits`], but defined outside of the trait so it can be used in a +/// `const` context. +pub const fn upper_32_bits(v: u64) -> u32 { + (v >> u32::BITS) as u32 +} + +/// Same as [`U64Ext::lower_32_bits`], but defined outside of the trait so it can be used in a +/// `const` context. +pub const fn lower_32_bits(v: u64) -> u32 { + v as u32 +} + +/// Same as [`U64Ext::from_u32s`], but defined outside of the trait so it can be used in a `const` +/// context. +pub const fn u64_from_u32s(high: u32, low: u32) -> u64 { + ((high as u64) << u32::BITS) | low as u64 +}