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 +} From patchwork Thu Mar 20 13:39:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14023998 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 36569C35FFF for ; Thu, 20 Mar 2025 13:39:56 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 79F7210E616; Thu, 20 Mar 2025 13:39:53 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="fXUz5Ugp"; 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 EABE710E60E; Thu, 20 Mar 2025 13:39:48 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=L/gkjpEkZ5+M9nCJl/KAmsB70ZD4zNqFVHb6eOSQz3YWeTnuEsfiaa2qQml35aLKIWLPYnZqv7MJ6UhYzNNAl/iNxDAWtVcikLREhQx76OENJhIW05rpQUwleTbDIF08W1XjK35TgGTYGg+36nsUSOo/utqvhKvY1HKi3CUnNCf//852ypwMSdDc3nmUltOUPdaMRmDMG0ZbeJ0CguFpifW1/inMvoGJMGwb3J7ZB5JbOzT6SKDxcSsULLIBHLRdxdrQb32K+1qF5nGVcpfWNmzEumf4iD0WKztCdMK/IU8pw/N26Miwac4CBAhZstmQ4UmIdsouK8Ni501MCakDjg== 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=IPnytbVLNMZtSinX202w86hfBqCuS+JmTfUgM1yUgGA=; b=IvvVE0voEwsAwPh6R0CNS6A1x9gy4HY7IVcwUeDBJ6Kbk9HoModO2ycMl1P3zC3iXnlsSCBoDNs/UczduK9aYk9Jb5Bo4CB/QUuowPcptbLMQVoYjtEjODdtDil0+5W6ekpqHchfSd0qmdwe632WG4srJTTYJ9c9lZxeBn5KcenO707xVZ3oT1i+83QcCxA2q7e6QyzUAkyyLfbuxp8U243/zNyXm7hmGETzVO9sSLC2BdGa48QEVyNUi/LCesf1kPMjA4IHIJyS3xj70QjZRHARLxtAnfCKsxWbRKvCGcRDqwc0T3ijVvNKkQTvSVcj0oalWd+25pssV0lYW/weHA== 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=IPnytbVLNMZtSinX202w86hfBqCuS+JmTfUgM1yUgGA=; b=fXUz5UgpglqJe+DYC9uQcIjPqihxWra2ug197FjTtt1TLw8ztDALDs1hjAa23ioO02YaruBoqNSsPkZ8/QQipMc8CacmfkHo5pHmSf0rerBFp8o/3gYVbrIuJ7uSfHOpqMwcbXQDywAGSHmxqjcKHKGI6UGMfiCAsVc08bahGQiBsWNVH4uJg3IuZ78qM9ISeCIyt9qbM5xk3sMmLLx19wHPySHzNu1/z7r+z6AqpbOFbCdEbwd+tobAR1Yis7UB50/hQrHb7Ci7UeBXwkiRb2DSpdTH4u+mFLEwGFIYhuPXVefd1yB31GGF3ZvG4Hw+oF/naOd5XA/AHRX21I7KaA== 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:39 +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:39 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:10 +0900 Subject: [PATCH RFC v3 2/7] rust: make ETIMEDOUT error available Message-Id: <20250320-nova_timer-v3-2-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 X-Mailer: b4 0.14.2 X-ClientProxiedBy: TYCP286CA0299.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3c8::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: f79c5bd3-bc96-426c-9db2-08dd67b4a94e 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?3FdMFpNXzhEJ5JEucBGS6MeTlWBZVQB?= =?utf-8?q?AhJKLAmkKy/1Lqd7n+xm5LCOkKlV8w1FzpEeGnQBLb6dx4nnV34feVN2l0s7a+7Uu?= =?utf-8?q?T8j0ggPVQTe/RDi36J2I0yHDDYXVW2JBIM7sYQP8vFamXC1AStaSBSciklltIO+ly?= =?utf-8?q?E3eX1mJzFjU576fpyOqBsaWkhwh4j/TxhGkxxR387rIxnr9IcqXa8eSRFZ5kT6OfB?= =?utf-8?q?XGfOKsLazSYYjcsKzpJu3VcUiG2Jvlj6aRibVWYmuVog4G5XffhMC6EGeQqPDAFYa?= =?utf-8?q?3SCVXraaDaZ7mipDTQ6NSoaxykr9lIU46FyXZBiWb8NBZTav6u93TfyLzQnAGWInt?= =?utf-8?q?BYag1cyPRU3CmRXLVSpHcBJ3C5PgGtXcLabCOjOdaII/sy8hzgwCiVhxs8znOO+2Z?= =?utf-8?q?GHpFVsl/ASvlXo6uALi2L4sKQQ6FvEmGsmFTjITwIpjjIj/Ej9+cb4bUdddyTxZra?= =?utf-8?q?JqDUhor/36C6Vx8HwphSo2PDbgoDpt9j4xy47Y9aeHrqR0MRBj/T7nRUJHdBmSF/R?= =?utf-8?q?cTfTUrH/M/RkDtsKCqoChCE1XsQ30PGWzUyNpEl6XHIlCisSA/ucF9u/suUz0mPQd?= =?utf-8?q?Uc2RfjFyU0FxNberYUezB9x6/Ar8KpSiHbAHjsrd8klLj8FaMXM07KtjzUK2VC1Sh?= =?utf-8?q?MMcwjeYdrKCtxv9/P3g/gxedF1VFlue+fLu08kKuTxYTpPEK1CwXm7baVBux36nWv?= =?utf-8?q?O+rzJ5dtYM6I1bvdWRpmB4WNZzBw32M8L8ycLtdZyiZZiFQhTvjdwqTVE6xHIHjmf?= =?utf-8?q?LwBVmYDBrjNTxoidgFO5SznTURybEpEVdHQTIUX/MB/g0Y7cj3llesotTiLI1bk4J?= =?utf-8?q?FDWx4CNLHUYactX2Yfh2qTjTvu5ggPGZWY1jkmuADPBN41s8gVdsvSnVM4T/V70Ns?= =?utf-8?q?earA+aFH+rv3j/U9sAAT9D4jKF5Saoor0gnYYGil8Slj7F4xOvAZBl2mek7LqGgaV?= =?utf-8?q?SLFxME7q1bGzK+hbf5Akrjl/SJhPQp/u0/It6wZc968gD0aEoj1RDZwEx5d9M09I6?= =?utf-8?q?Bu9h/FOIc+IdAG4hek232Y21qUggdZ32iP2iTbzUvEENLKxvo/kou7huN1L4gSr+m?= =?utf-8?q?ZuNB32RHVs7wdt7ZxximN4oVVcgiDK5lrwxOW9FvP2I0eI/SmM2wqw9NX9FC0BVZ/?= =?utf-8?q?lm2Ew9nnK5H8ZuPmZUJlwGqChFa0KCdYxb8OZE67HvYoXJRwi6xmV0JD1hCHpN1M/?= =?utf-8?q?p8hNpDy+RynnI9SgJ0nbfYjrDCYgoprG6uhdzF4iXVgTAWoAd6VFUZXZdqea4i4dY?= =?utf-8?q?UvzccooxahN2HfwV5PAAhUSYxFpxG5K0MTi4SzRkO7+0vcCoBjz/it/dlHq1HRo5q?= =?utf-8?q?rSewq0GY+PMo3z9ak/NKy0gfubDcA+nzp6tY0xbBq7u2GuJ0FmOb9M4=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?lGz8jbrghZLX58O1iIW8v6MBJyDo?= =?utf-8?q?RJ30AgEUIyOy3vuh9QA4+M7sBDgpTwluHicoWqrNnYMuhJlUe2GssdIhAh2Z08L2f?= =?utf-8?q?xBRH2bkxWjy/dzqzsE7PaodCRL1UBEShunDC9+E35XH2XZUF1FaSBYX+iHAOBShnr?= =?utf-8?q?4VhCaOxrvA57xs5ntNlaI3qo9Bdk35FbWBs8hFC+7FZB8v8W0Qp1fM79AfWfL+gJw?= =?utf-8?q?YDIovwXqCGKJqM2teJy35MVHBmzOTf/6f6EzHHcgum+o4rQ8AfBrgHstnFlJroXv6?= =?utf-8?q?spMBe7jbILzJN9f4jzB70e0SLqpos0nJ0a1p749TXJd8LpPYH+ZDwge/9xgcRgSAO?= =?utf-8?q?bX5JYfizwL9tjwul5pUM03TkS9x9VrAjXskFIS/kt0zemV/ejnVpvg4bf0MhXkzyZ?= =?utf-8?q?oz+qZq+PMJW5WVV24HXLXjSNXZ9Rn1EsHUn6GoOJuxHRPV32QUe3B+d2Nqziiiryr?= =?utf-8?q?u2yAHOqLku12KlEbj9rvog3fKzPWVdOklgNaltLIm8xW4zPcN3f66nqYsaFd0pWdi?= =?utf-8?q?unomPJX4kzR7rbp26BOI3NaZG+x1IITwdLRV4sMAdV/qL26eMsSW6uKWdcMlEAV2u?= =?utf-8?q?tMJGwC92R5eQ6+nS+SV3yBb98Uy3vh7fL6QomXbY1HGrfOlmqUVfJ8WTtRsXFuwD7?= =?utf-8?q?bEh0AFXXT3+CgKYS3OQI1ueI2MtU7Xzb5tWxi5HUMF+D4T3WiYlKcATPUczHy4F0+?= =?utf-8?q?8uLxHBvW+Q/QC0NvxZ0mkRHVS2CQPJ9s7YeH0xnhu23N0f+BCjVk1GJyauEp6IbyI?= =?utf-8?q?JqH4W9Y4f5EjugMuZevYRzDmopALjmCY597/3hMRat4XkEVvKNGLju7VU3NSZVFcE?= =?utf-8?q?qtElESidZIA1J/DvIyceNPIz8VEhQuiLmK9swwafjKGzcjVucdEVJlhPvw8DRu7YF?= =?utf-8?q?1sWcT4xsBsCkMutisFY9YDugPHKBBadu17n4tNOxan+4g6ES3RvHFslasROg0XNcP?= =?utf-8?q?9naXj9/s8VzjsZGFccef4CvKFhdUKckdB0lZggneen8pdluKAwS0Keop6ITIQY/KU?= =?utf-8?q?HCPo+kMXUP/S/FLCVuGvSGYDqyM94GTGGGoP5mdtOarwInwgxuYVlmLwYxA9vrCbq?= =?utf-8?q?t/FFwutOcYFvXsKhTJtH1ouofQK6nknoC/SgSRn0eu2iodSdCd3wi3WWkHSocOZof?= =?utf-8?q?Qlj5T1ZKMJWRK2TsIngOr04aBbuxfD+BDsEiNheCUlxS3eHfo6QeRMtO15Tvm1FbN?= =?utf-8?q?WKcDqxwnLMf9UQh/Ra7CJSTYf2oqvISd1ja7jqEXHViiwPwvXY4sA6aRePTBXKIug?= =?utf-8?q?fDWFbtMfQ72/RCKbFq+TvgYuVbcl/k3HMiCwP+inwyewvfBBHVkF2BxBoMC4L9WYQ?= =?utf-8?q?kFBny/9jiP7iwPVQn4kaSQolOUKNV7ur7sDL88XrKhOoX/gRyEzm/kqCrYrrKc6Ib?= =?utf-8?q?YWVXbJuwP/PhWfYLEznGvin2OJPSWHk/dDmdA/V6zONBUBOOZKMOlcdBidG72q9ZU?= =?utf-8?q?+TEdxAD/7bpr0XIoLP36lymdfoyiy1x2SnywYVEh+Kg51c5RfbVK8RZmLAIlyBi+c?= =?utf-8?q?29r0/BdWhrIjrsLerSvgmGF47vXnJTbh4NczGu1sd7+1OnbDbE2IVWItJsgWm5Rx4?= =?utf-8?q?4GDxfU9Yj5J?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f79c5bd3-bc96-426c-9db2-08dd67b4a94e 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:38.9948 (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: CP2kqRJl+9+ajDjGqGqlZWN2ChO/PMeO6IES+oPmtTuz97nC3FcsxoOxQyGggFmlwHtsaJATYQqBEt5a8EHb0A== 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" Signed-off-by: Alexandre Courbot --- rust/kernel/error.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/kernel/error.rs b/rust/kernel/error.rs index 1e510181432cceae46219f7ed3597a88b85ebe0a..475d14a4830774aa7717d3b5e70c7ff9de203dc2 100644 --- a/rust/kernel/error.rs +++ b/rust/kernel/error.rs @@ -65,6 +65,7 @@ macro_rules! declare_err { declare_err!(EDOM, "Math argument out of domain of func."); declare_err!(ERANGE, "Math result not representable."); declare_err!(EOVERFLOW, "Value too large for defined data type."); + declare_err!(ETIMEDOUT, "Connection timed out."); declare_err!(ERESTARTSYS, "Restart the system call."); declare_err!(ERESTARTNOINTR, "System call was interrupted by a signal and will be restarted."); declare_err!(ERESTARTNOHAND, "Restart if no handler."); From patchwork Thu Mar 20 13:39:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14023999 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 305B3C28B30 for ; Thu, 20 Mar 2025 13:39:59 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0D5C410E61A; Thu, 20 Mar 2025 13:39:56 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="I+FdNdQM"; 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 20AB910E610; Thu, 20 Mar 2025 13:39:49 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SAZ66ZRvUeLVWv7HSnVAeIvEQZCq8nh2bHBWGtlJeIf3UmreGiQyb5mkI+hfdDgEOKEqCbkqFBRKqhMqUUCwT2mwnI4XzUlnNLN2/rvsPN1T+IG/teT9MzmyYetd0I9QppPDGpMSzx41xLafcne6zMQd1xDhsnNfUQ+FnrFF0ybAkI+Twq34n7oV8yIaRf2zOVO3MqVSCnf/TuXIT2n0tGqut4lcMR33h1guXMTDVC9gRnZjx+JnbyljGvx+QT2P5qPoFMKSh/cRXgSvyRFF5L+wpBqTQ97XpHaQXH0O/L2msvtI3QNygLOJkMJKhcSkmPFppP/XHm0vgSf1NUDk2A== 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=uCQBLx8WT836KTNFDDoP+a0DEM1d07JXH6GXg0wps/s=; b=e+knSdZJ6CPe4DVEqxCM0OQ3+O/o2pDiiH++ga2x3JG90A4L0IWuWVU46Cguu5It1nkxx5zGTt+2q7H+yxN/d9stSQCb9Esx1fX9aGZfbNa2FNXcv2iY9tBob+1NK3xTfwZm6c7aRppcAvXUJxDUzBDfnGVWJCsyJN6vQVCotlX32WP0zfofa3lwO97HjE/Kki2wlXlFT8mOhsW72Ihr2TUcR+W7rAzVrFDEWxd/MVumCRDFRhEX/P9STsv2R9Td8xTichyWf79OKt/BDxyKNgzHRE6ttiAj1hexBicFDjlygAb4IOn6J8u+8Xk4fmcvJ5XLKwjGfCMc24qyy9wC4w== 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=uCQBLx8WT836KTNFDDoP+a0DEM1d07JXH6GXg0wps/s=; b=I+FdNdQMDdjcrPa4OKYDpnUpeWKaY9Aznyerj2Jiakb0qUE/aJfUNghXbGeK/Dj2neU54R2Tq+snWsFKD5pDQwbmVqfnzBZWcgEhnSbqGUeq9vaquak1DcaJ9pqs91be3Ty7/lRifPJuO39FUDHaR6vpCiXAXxtJ1+JImV8MLza64OrnnWCYYGBk7HEjzj6Mt5jG7BinnkZAwkEVM+N2ddkfBfeVGOM4Lez2ZVIO3lku/RuX9PO0NnAceH5KTFtKpl0iBFqMq+EbsP0mkib77LrJTVSHTPAx4VV1hoIdy2C6pS1lUUR/sD0U6d4UEbEtqbkPJwj3vOscG622zRWaVQ== 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:42 +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:42 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:11 +0900 Subject: [PATCH RFC v3 3/7] gpu: nova-core: derive useful traits for Chipset Message-Id: <20250320-nova_timer-v3-3-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 X-Mailer: b4 0.14.2 X-ClientProxiedBy: TYCP286CA0320.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3b7::16) 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: 464a6e35-d37e-4f13-8251-08dd67b4ab22 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?pG/Bx1oPurx8gok2E8BZEivOyv3pFWG?= =?utf-8?q?iz9A9ChhsxRPeRySxFWrOEJfnwrldXcH8atHU7lTwKgs74BBTyc7mWkCYEOlpxDmu?= =?utf-8?q?Xe6jaDWDskRXtdK9ZUFgcih2UXY+BAxMzYY+yXUFVgL6MjrOF9WS92UJIveVK/5M3?= =?utf-8?q?yAW+fQY95GhJgq0cRfbG+pOYkn0ADbLnSI96doDUk8B7ADEv+xm4LccMFTIf4hhMo?= =?utf-8?q?W3N3p0yVS5H94nCu5pL0kGSUjxUSElSQe7BwLlbpWLbYUadlCInuAHqrSm/fYZB1n?= =?utf-8?q?XOfTZziJNEX+tDtQ/1S4ENCudszYRaD/e5r/Urs9NXXQ7pQpYEq/5CcYi8r3pq0yM?= =?utf-8?q?fCS5z2hfsMIdLJd2NxUTpBjbX3SO7A8IJP7F15s/ufhZGr/N29vNqcoyNBk9V8lqd?= =?utf-8?q?cRLc67DGjM5I1NxSyf0u4wYt+unWWOnwmaY5N0gxy/siaca4FnCTw8+NE3ViB9ri7?= =?utf-8?q?GUEqy/E+5tPj1VWqebfUxazvYKKzuak748msrqqUBTMJxGLb7kNFGuxck7WQINo6J?= =?utf-8?q?vwmZjY7Xe3rS6z7QsZoPfs2mXec/D7shPpcgle1rebWkIG/MPJF3BBMyvNqFC4w1c?= =?utf-8?q?d0PuQ1PAQqdPL5SLk9bnO73j4peYfhD8G8gI1D8Pap/f+3fgcihwFSTKQJUOjCZf6?= =?utf-8?q?SG1FuJkHSMXJ8qRCmYOFxIZc3E9a3kjT+C5kFSsSb+AaYAwdxJCvUmsK7JXB+B3Hk?= =?utf-8?q?XXHzSsyIiqmtAdFPreTMztAty+BD4TY53gG7D/z9PXKzYZmNNzW3bVaCHsCCdA/EF?= =?utf-8?q?mRiwd2NxCGUQYgA36L6W/T86Xgnj6371jVLaX0k3VA0+2xYLewp5D3c2S92nwWhet?= =?utf-8?q?tGUGmr2MMvvWA8DTcuwqFUHIMUECnSh+jfjXRo1juRNr01eLVTu9Ovo4HasQqwRzP?= =?utf-8?q?3WrLRg2x+/EJ/MtOkwQB72MLR+PuNgVnGMkoeCy5l6qojh392/HhbQ9v+uuM0y0wM?= =?utf-8?q?ctls5mhZWiZkWGo3JCUusYETNVd60ZWXQu2wyZvlZz+MvJzVsoaNa8E4C0BbH77AP?= =?utf-8?q?bkV/dDYOtqCw9xmBp4s2n94RVMZIyV8wmfgNaE6wNutJUinF6cRj3dhpmk51JMgN9?= =?utf-8?q?4+FqoluztAKqrHbtrPh3BBBpt98Km9j/nZpr+NTqTFUZUIi11D1AF6u1WMvnryb46?= =?utf-8?q?8A/sgxIyZYB2/m6eHSwr5q9GKp+QYePerE5TLyaHvPb9gN+C9bhof82OSLP3FbjnG?= =?utf-8?q?LWes5B7toc3QAR+uIrosCoLUGBI339qpPFLSfBd+XOv9E24Mi6xo6BBN8fhbc9BK4?= =?utf-8?q?9+LIrqq5zagn23FNOFPTzfUgmlxQDuSOfWB7d1+gqwhywKjr11zSqrg61GlFDeK+r?= =?utf-8?q?ATr3/Ah4mF8aYk79LVhPZj3SwB+fAQMABd2KSgQYpVokELpdHB3i8Zc=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?8fGAK8gXe6VrhVtNQxlenU7nK3lG?= =?utf-8?q?gSo8O1djtfQJsm47U3FWiXOClQEAZmfDj4tdc3XyIma8XXYlL6Kjt9vXxvmfXxsq1?= =?utf-8?q?FNz43d8/KkPpNPu7TzSXiGQtC7APpBShZnv8c+WGaPp7XKwKHbGN6p98U9Zs28hb1?= =?utf-8?q?E28VwOijQOZEmlK4O5s617JW8P6qSAChiJ++7MzjNymtjGkTz0tUsTPzdKUBqijgK?= =?utf-8?q?8P906lN3VtiWpP0JTcsIFNyaoj3FfkMgOMXRucCs26YDPEm5+W5wBEbwgX1XqGHAP?= =?utf-8?q?xr3X/3MlpKMYYwmliTH//3pg3EhlKJFOWlVdUNFWq5t+Hehsx5QQjGHyUsAkrNNCS?= =?utf-8?q?0xkHaueuD4FZ4xQ3erGnCIDxBM9bo3Xh1x9KWCRlnGphN/DOo9UVcUfkPQiEqwY3U?= =?utf-8?q?2Xt8opAMg5I35YhQ19w4zd5oeuBgZjGODx/vQatcmkWwq9GKu/hDVHNlnpQiNGKhN?= =?utf-8?q?i+dSZmXMPgORHUq9dtqnNx/eSrrjmp9G/966gSmeXari6nC5QkjBRXWEEb0L50wFM?= =?utf-8?q?AgQNPSqa5q421sRd8z+aRP6bc5XXDKAfeJb5dv4N47YuRgmJzZ8LQ3w/u4yixceSh?= =?utf-8?q?WwZGmaKVOfpIF04J77QDZdi0xtu2gfr4cNjZ+GqfMeZbGA0ZkQ4ybNwhtaT0qSpon?= =?utf-8?q?qM+ZBovL+YetED73S2MMsKsXE/p7AP+c0sRCBQd9DGantYWj/4DinmFBTXWjpH2JR?= =?utf-8?q?wp+kXRzKVC3YnLyq2klnPTrXznM3OdfkwBvKP/WsKEHq9ppc3p0eAe+qisJSPAqzS?= =?utf-8?q?HAKHNl0t1NBiXExzsq+aZ9VnEnjP1pJPpZl205vAJjyVqRNNhwY6Youpsz+N01m7s?= =?utf-8?q?lJE/2PsZnXWwAoYMhdvNiWftxRFpn721l8sTKxKVWNb/EOzP55aZnC/qrzYHRWzO9?= =?utf-8?q?Z6EtCIuz1u4Yu4iZ33orc1xmRs86nNc/ZHsskUB7nO9Jbz+ipPwNFyFRyxRhE0N8l?= =?utf-8?q?1dq7XPyL54oXEhclrrwa13A+z9egziKmRRaRcNBmqTWZaYbjehLdk4Yuy+rCxP1eW?= =?utf-8?q?BG1X4hCQs3jMq4s/vFCE3JsPfjIjsshRNzw18iROFUAQRd+JzguOKC9Jq4CJ3M81B?= =?utf-8?q?QHAlAcsY8MZfDGfqtKGGfFJLF5QZAt/votZXsVvIWrgZEM5oeII4Nldi93YZvqI6I?= =?utf-8?q?iwjlp74L1O5ENGcRLp3m/BZJxW0y36kZPJW0346n1Ssbdh063rjJJiYQoOEPsH5Rm?= =?utf-8?q?uVjd+g8NzT/Jpfw2ibiQ6jCYr2d3UoCr23PKKoFgmUY3KEXD5gRiYKLf2jW0r7AG0?= =?utf-8?q?4HXuaPaWpmLjYUdKPxtmOXWaZZcpzWixa7L1PwXxgZ4jMLBZ9WnUFTNleHLjfRA8n?= =?utf-8?q?DPBxyIUA5k6fY3ydNnN9Jz0R3kJmMoUz3oqpcnZ6bQks1zEmP06vnnqYREDXlWQ40?= =?utf-8?q?CavI3cPa1lp039kg+4Mk1DvAL/BFCe3xsMGG3w7S/TPE6WG1mJJvZhJUckh2Xlhs5?= =?utf-8?q?Ag1G5Y/keSfE5GMDECCDaKbDkSZrTOtikQqASLEmLROqHLX2YxbYUO82p9zvtAUzg?= =?utf-8?q?zfxXRHskK1h/9XT+Rwc1AQCnXwO3NbG7L1uDMxeGhSLnkqxe6sSNTzbhd8at/2FP+?= =?utf-8?q?zZjIgHncmrX?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 464a6e35-d37e-4f13-8251-08dd67b4ab22 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:42.0599 (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: RavFzI6PpXfbfcbZyYMp13jtlxiY/M5neqL4TdpMxTYavxbeRieyQkQWuIS9cYV15Zjxwwfbn+SdzHy3/yeEZA== 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" We will commonly need to compare chipset versions, so derive the ordering traits to make that possible. Also derive Copy and Clone since Chipsets are as cheap as an integer. Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/gpu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 17c9660da45034762edaa78e372d8821144cdeb7..4de67a2dc16302c00530026156d7264cbc7e5b32 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -13,7 +13,7 @@ macro_rules! define_chipset { ({ $($variant:ident = $value:expr),* $(,)* }) => { /// Enum representation of the GPU chipset. - #[derive(fmt::Debug)] + #[derive(fmt::Debug, Copy, Clone, PartialOrd, Ord, PartialEq, Eq)] pub(crate) enum Chipset { $($variant = $value),*, } From patchwork Thu Mar 20 13:39:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14024001 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 4FA7EC36005 for ; Thu, 20 Mar 2025 13:40:02 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5094A10E61E; Thu, 20 Mar 2025 13:40:01 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="Etlzwl4m"; 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 4A4DA10E60E; Thu, 20 Mar 2025 13:39:49 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oHipzJYtl22yr7il1HF9GNV7sFoWdupVAaeSQpbmbSsf5qa6kN5+2qR1fw9/dx1Do3Jhf6mtIq2psP51ZI4r1hVmCU66/vbQseG0lsaC8im84kX+gE3wbxURy/PuPwnX1gkC+Jg+3LpCG9Cdne625nFOt4mvNPZHaEkVklOi8llGuniNzx2SuKib0RaD1eS3Er0kLBFZMSlC8p67dTL538jtw5BPGRetl9EC6OuT71n6fiCfWfOPIq2wmf2VBTcGTOF5R100EoS9E17SKlyO2/9c3BThxT8aw5ihFyuUHaZxsD0og3qKXzMSZkBQ+jO1bdfeXC/Lzt/tHAjQxMfgmw== 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=7jM7eInqwyqwd3lwvGhTayJyjwZi/AO8HeJSbkEZnBg=; b=AoNYnWjfenNiyZ1FizU0CaoXtcmO6GbTSxehSwcHXp6MyaQ4Ece2RMH5oqgTJVHUng+QNIsthQEsiD7zNJAgNuIeDtXnVkA1+poTcnsh2h2SLeIxOy6xZ6pqYXS1Fdyjtx4mSAoyFYi6x8fnc0JvTOz47Aex9y15cB2USya8uAkkClE3MG4d69J3936KXyC8Y56ZX6L/zzU0ckPTc78tzvGhGu3yN72PObQ7pA0DMpNhG3jTcnaxXo4Q/hY0aYjHIwK/6oKkAL26GxZuQxAfOK54dXxpyuqsmJ4x94QKyKOWPM04QMZRxNHlh1zOOnYDUBCxXK9H/RD97K7x1NN5NQ== 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=7jM7eInqwyqwd3lwvGhTayJyjwZi/AO8HeJSbkEZnBg=; b=Etlzwl4mHO52fRf4WjpZwjTWfqy1NvooLrDz7U6H6z4ynH0lhyZtdU/GX2DkQxKcDZKyMoZ7oQUkVurrlBMmB1RebWOnvQaW2wNgC4Vm0ajbXceP6SX4isZ1EuCj/JwcbfKxY2mJsdu3jrjnJXrleV8w71aGA9p7IwkMroeXEwd+ZQrB6edvPsrDWTHm2KQ1fzFIS/4NW2t2/+YUtFl28KlWvSsKflNvOiTUNxHtjjpHKlzZEp6WHfWA63II3Uty1k+3S4iKiAu+IA7P7gYyd2n48thH0lElYBGYDcyuyB2k2BDzttfLIpzCDjnBfmHZoM/pix559x5wz731pKTqTg== 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:45 +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:45 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:12 +0900 Subject: [PATCH RFC v3 4/7] gpu: nova-core: add missing GA100 definition Message-Id: <20250320-nova_timer-v3-4-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 X-Mailer: b4 0.14.2 X-ClientProxiedBy: TY4P286CA0006.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:26d::7) 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: 4f654dda-a2c1-4dc1-eb9d-08dd67b4acf7 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?H8AXasFE6lHhI8AaOR5MrB3ah2dPXN4?= =?utf-8?q?RUT0iEndTD/fo24L6YpoCvVHHCB9+3o0bX1riNkDh+x+mOO5sEcypbznT37HUzL+N?= =?utf-8?q?FlkE9eoWi+61G5nGVYXX/troArTTE7jDcYkJUAGlzQ89Fy6QLgxjZ+j5aUGdWsN++?= =?utf-8?q?9PSRPecPFu/D1g0K1ISWBIIRCCVGeEwtOhsSaiW3H/F6I5Yi+B9QI4Edp23XtBzYx?= =?utf-8?q?EYmJwPaAJAXZuJBoVNtpdaa4bcNvWf+fQ8QwbPis+4vBILMUqlM/F9+uR5xAEfFu8?= =?utf-8?q?+a05/TSIBfsz+87jInMAY8xYRtGeAeGCQPs+Lnh+NbcOXCJng72xER76lVX7PuIYy?= =?utf-8?q?ONnd29XuIkYKe+ffUWUGCX76NcdqCXUWfApBy1ld6eLsFBEadoXqhTkQnWS8yMlW6?= =?utf-8?q?NMb20EMmPVJsE0kAhXtGNPJ0zb9nCRYdeTNDPqT1amss0wMtYHCItn3fcTn/jnaJ6?= =?utf-8?q?nxRUzwp62/KacljeNioHBK29dKxGiPE/BTqz9Myrv7QPmAKa+fVFuTDR+bqnWuiaz?= =?utf-8?q?EXHeWm7S9CWH1+cbGtIWfN4oLpnUc4iOBuMYlaZHyHdSzJmR0b5uVvr8AnYrUyIb2?= =?utf-8?q?rhTJU1nf5jY2OtDOkM9rT5nHK1TZF3ni8n6atg4wiipr1mEWBtf3Ucn1seEjognQo?= =?utf-8?q?X4QAfFmQEejF6QzfwQq1ow7ccrxM3Vc8g0On+hydhyjmbfh9v6p4DOFch2+6SK7pR?= =?utf-8?q?3yqoQftYHbZmFyZzn12s9pPCE8AHNQkWl3A5P3s8e8CQHa+5Anh1P5bys1crY5QBy?= =?utf-8?q?Q6fTs/Z2Yq8Kxov6mpOZ4HOnQcwCyHzRMt5yLsurfBLZ/m3HD5i1oV0GZHvCVLcvS?= =?utf-8?q?PfTs8j/6zQ66fbeWKnN8MAqw6WZWdfZPEHQzkBQs7oPQQXyT6SAa+DQu701EBQjYJ?= =?utf-8?q?hcYesMCopY18YZM6AxV2pXP6/VaCAIJjuHvrNJjm+ivfXmQhzF6fWC1dl4F2Kqxo5?= =?utf-8?q?NhT/v1pcIoyZfz/xvrc7R8ZkW81Ce21YCmh+HGvgU5iDMXQ74+E45Fguql/LGqENT?= =?utf-8?q?hDwxHI1SSxB+Q0QITeQkDGsbr6oZOGHSOGwYNmG6o98jOx3kSVFswnAVpXMktjp4C?= =?utf-8?q?VoTLT2FGT415CmoS+KZyfHfnCIKdQjHyRgVGl3Xf58aJOHbpoGXPVlUDGokOnckiI?= =?utf-8?q?/qvEUGD+j0XQL3lFpnXlpvVPtGkulr6JSuvUhpwVcUDoc5oZlIsdKSln89RUnkq2F?= =?utf-8?q?CBE9XD5X/6jtzF/A511rHY+Tf7T8EcRkCACJ2Ds5QdSdEgnKTiZaS9aWbTBmks8Rz?= =?utf-8?q?1eHTb2OcoH3pXrl+H+r4AX3piWDdI3lDpnFSlQ+1GQruQsbyS/grP87xXbu6lGlup?= =?utf-8?q?C5QxNamk+AxCJ4zaLdJnzfV21V1k7xs5rE+xt0nPfK2XiVlYHLV9GW4=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?llXFZg1T7pQeo247UoV8LZnMYRw6?= =?utf-8?q?VICmvJKvxP7D7qizomDu3NLqAbuLqdo6PcfyaNeUMHaSSemnpNtcngS0hrwsWr3+C?= =?utf-8?q?yH3ClwXdjy87vvq9rknxKEmjVenFUWVG6x0CiTVrjydPBtZQu24Tkjaz4Tz7dkndp?= =?utf-8?q?RldmdS6NQnINDXItg6aSU4wBlOWlWlENoT3BFOjYcfBeFa8tT8fgKbAhlRdh9tfad?= =?utf-8?q?ZBVPsweLc1H1xtI59w0PZxveIPMNWOVmbg1NwkXU3EVIgEFPLotfFDHAQzhHpHWen?= =?utf-8?q?fL44U6q/xyM1Og3HC+pLNxjicNsvHS/pV72fQpADfbxDYEaP74T9JyK1rE++1dzLd?= =?utf-8?q?UIR75x85LJgYD84x0gFcGzIzyht9PMKKmCXw2sRwoNQB5BaAC1XA9LbEA15FxYqs1?= =?utf-8?q?SnABqxVlKP/yc2bFwMGfMfjRMz5fANUmLYZ05I4f8QIVCj+l5XbB+Wij4Rt05jyzN?= =?utf-8?q?9TVsCEjZIS8yRp3G9HK7Ssl3F2I+3/sEpGIzdTvb73OfxX/rb54u7Cx2f3SqaCpQE?= =?utf-8?q?hx7G3Sh8iuu4hNxZIy2+sFkhv9TgBS17iIT06q31AoRHVVPpuep4g21LE5NRVFg9S?= =?utf-8?q?5gWDRFhCrQojqlile6FL//cfhKrkLYEc/UNxqxTfufAy3VsjMbdRHxLzc59QTcxW/?= =?utf-8?q?amr+ocKiVwx7IK3Hl7Xi3kQbqS+osb+OySmuRcNl17238MZYjWag+n6RCuFrsZXxA?= =?utf-8?q?brUxWAzpPDU+az86yynrec+/4A1gjW4yoS/wFTv4Po4pE9C2ViirhvVDh5hJToE7m?= =?utf-8?q?o458SFuqpmReBhRlqiCjI4S5vYM0Mh4LUQUFGJxN9zZSZ/SAPU9QhK76RyK9/0ffu?= =?utf-8?q?KWO9nkqYip7LLNsRHkccOACoSlVkPv7K9REx+p1kuzNw/PqCja4Jb1N3F/ZISUIbE?= =?utf-8?q?YqUWMEfQUSxwVtkLL0pI63CdxDvdm4sBQyKMTpXsdIVtFuJ9JTb7TtAWljGu/wURU?= =?utf-8?q?KtMwgvHNmZVXiebqac/hEPqA87TWMJCTsnlL7nFrIbsQJzbfSWVyyuCe9E1kqKiTu?= =?utf-8?q?NHsfN6EIivt2ZQ72AzDyDCI0hzi2KZNDuqrkmmynSpuQXP3J3mV0Gsf7kOQAbtcRj?= =?utf-8?q?yskgimiybisB7UhgDlU6yVnsDvhOdSIAwO41jNrSc8GP4L8wwOKn7vAzzooY7QFh9?= =?utf-8?q?bpIMHZRfJBoY0dMoXbfcMEe9GxlkI5ext4mO1ZGnNuI6IIUyn29qU6C4iX/3AfbjL?= =?utf-8?q?6SgBX28R2bKXjFZL1tSEc3Fe42iSkcjSNqvcRNCEDaoLTV/9ZqFsAoSP0lXE7mYV5?= =?utf-8?q?VCdvBf5sd5SceKYo4CMbYWhkqQk45QmKmzxwYYj/xRynYkiF2mRGL+ORSNsrJiLKy?= =?utf-8?q?L0yY2CEmJCLfJcHWF5kjhbHxXddo3L1ZnVQQh987YjQ2jJ6uOi8WFGXer7ErBBQT/?= =?utf-8?q?DSxJFwpt2ISERKypQeJtwTLmJfj/O7FUxCC1hAlzl2xayb7vUNxtZJcjMKfdM4eRA?= =?utf-8?q?v6cj/lVPbGJoiuOXSkuK/IeCKZ0SvdDuIxaEddKicAuia+O+9fMNDp4Cs8x2GamuB?= =?utf-8?q?41oWiTNyWaYxALsSf62/cgcaZIO083DROa7tkDdWcoFoDwj2Rh5LeTyskmmhj1i21?= =?utf-8?q?5AHqWvi6PhY?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4f654dda-a2c1-4dc1-eb9d-08dd67b4acf7 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:45.2754 (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: OnYr+LoNzUr7IoYYd80GeNxRx1WDtG+BjXiHlRzlfKOaNQw93bEcwcH7gLCkD4Ug3Lf/7fQ1WEy3MtRd1Twc5g== 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" linux-firmware contains a directory for GA100, and it is a defined chipset in Nouveau. Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/gpu.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 4de67a2dc16302c00530026156d7264cbc7e5b32..9fe6aedaa9563799c2624d461d4e37ee9b094909 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -54,6 +54,7 @@ fn try_from(value: u32) -> Result { TU117 = 0x167, TU116 = 0x168, // Ampere + GA100 = 0x170, GA102 = 0x172, GA103 = 0x173, GA104 = 0x174, @@ -73,7 +74,7 @@ pub(crate) fn arch(&self) -> Architecture { Self::TU102 | Self::TU104 | Self::TU106 | Self::TU117 | Self::TU116 => { Architecture::Turing } - Self::GA102 | Self::GA103 | Self::GA104 | Self::GA106 | Self::GA107 => { + Self::GA100 | Self::GA102 | Self::GA103 | Self::GA104 | Self::GA106 | Self::GA107 => { Architecture::Ampere } Self::AD102 | Self::AD103 | Self::AD104 | Self::AD106 | Self::AD107 => { From patchwork Thu Mar 20 13:39:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14024004 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 1A79BC28B30 for ; Thu, 20 Mar 2025 13:40:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6301C10E612; Thu, 20 Mar 2025 13:40:12 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="bT3Rv5bm"; dkim-atps=neutral Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2080.outbound.protection.outlook.com [40.107.237.80]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6E84910E615; Thu, 20 Mar 2025 13:39:53 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pBxJi9+W2sukfHRTNquhMRNCEXwXmJXpqFzh4mQlLu/yiYxIMuhSLwVPN04j8V38HtNa4DSsjm2TuDh0cp+GESb0uYsJ5S9KDwyuNYTEyHvRkxqgvnKitpewLcgJ34QDB0NfYchLsgnDu/XYcnxXox0xpqWXEyIxyS+4TZAZqrl48JjEmgtbYRTwpmX5ymZZ9GhL9Q0QXCeV9uE1jyf51Fp72sMm9LerVwQiA+v7qEfHUEGO2FIGvqGqDCK08t1zrr2U7NP7xY/HEbFs05Zn+UJFT6L08AyStbhk7rTbxKLONU2jfFI1ytY8SAGKBF2/7rby1Q6PVY0Q3fivVCyJwg== 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=RkDX3TDS0XklbkcH2iPRbaS9Dg2KD039wFANALj3KfY=; b=WXYSmCrKQlI1nqM6DIv/xLtc4YgYlfUVp6x/HBQzzV16qGff3eRdWQuGi9nSl5a1H55EtdGal/JzFlo7UtygmpQSoQSgJhJXWJyS0BmrXHpKRV63es/pkLSqws5n99r5pqlpuICfPFemyaGPcuEssW5J2/5gVrU//svaxfqy7ctqvYO/JHgCmFAtM08+7rTiDdehGuJwIUSu+zSsVgGvq3MlTzrF9qylZqRJR4lHj2GyZK0W9PsY2XxBR7rNcJQVqnKKma9P8zVSgyXPU5wG4jisIwBK4w5IZGNKp2lssaqA8qnxK/pDBXn0xNLYTK5JelCaPx6LLCpoFeMxHOotzQ== 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=RkDX3TDS0XklbkcH2iPRbaS9Dg2KD039wFANALj3KfY=; b=bT3Rv5bmpP7JHG+cOJ962J31T61w59ZxzsAKea0XzdCDTV7e1GtoZzttQ9vE9DJXD120OIxkfgWWs21FL4SDwObV4HcJeOq2WMNX5sqpSsZZxkFVOqyHSyY8HSJosXOLcMxsfBusti3OAEoRR6QgWBGrurCyr+JD5qSn/ZAwlzRRTUvW8a2yKLUAvPDB0Wh+ptwIEmKNopbt4vwjsZe4SGSKACcm0YMRKeK6DcsjMB3mT0y6RUXQRTS2SnetmFMiMMGfKCel7Ya8qq9CrHoj+tfgUfgSTuaOiLDF+/j2RyYpMb9lwdrcD9562A+GApCZxzUZ/zslqmH39QaR3YTdTg== 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:48 +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:48 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:13 +0900 Subject: [PATCH RFC v3 5/7] gpu: nova-core: use register!() to define register layout Message-Id: <20250320-nova_timer-v3-5-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 X-Mailer: b4 0.14.2 X-ClientProxiedBy: TYCP286CA0326.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3b7::10) 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: 482406bd-198d-4ff6-8e01-08dd67b4af01 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?opd6PIIveIkRKOpXoGTtTotOMvTeaHV?= =?utf-8?q?4JcxvUsFQzGfXPGBpVFUmTEawcfno3sc37uQzBp/R0vd5xBCdMXIK/TNHQGCiAGBL?= =?utf-8?q?LWP1lEspoTogeohBVxih+vdhRmNh0Na7xO0WpGiCVlk7hg6rMmG9zSz5oXKjQWILg?= =?utf-8?q?gpGvOsIDnvgppd6x9rqGZsEvuEqR4bEUTVsiakLCrRmEH9K1L1yKCvpcht2RKL/xm?= =?utf-8?q?YsBRHm9JXVkAKDuOM/py+0ckU/8K7my92PMWww9bAne7OP1LbqkSRw1U0ChgVxuEq?= =?utf-8?q?NSlICEAkNl4PIyoP+dd+h6swiRYSzCgxs5571Fb9Mubfkt7kKl2C1FPnAl9bxJz3m?= =?utf-8?q?35xyVG+xyty/5PV4Dl0jhO3x3E0OU/9whM4Dmgn6ciSrf8P1S/HORkMV6B76s0c3N?= =?utf-8?q?SSglHt4cRCRLMt6pNV+01qwRVezGU+wUxpYCqs9/3YkydZHO/MVcFbW0VyRK1nrpw?= =?utf-8?q?C2j+v8z1sf+Z+iMGEcW7/AEPp2RVns0Jc2gEOJZq+oMHK369Vc4LnUybUNyWsgJuo?= =?utf-8?q?COfkkVpbnyWe2qO0qOyg1+NsGxM+T3mlOsFxJyQaCL0W8ef3iDQMq2ZxAsKxye/lN?= =?utf-8?q?XKN71DwmYkRvleqv0TKoPXjPzj4vEn7liY0+uj9B2dGFC1RCXzi4JTAtfksY2uKh0?= =?utf-8?q?9GXzL64M4msQSdDoyUs+Njgsz1IZkY7L/1q/NAVDQUES/9vGN8DBhS1VDCiZVb3UP?= =?utf-8?q?jKm6ndUgWvSwwE9j7emlQD8fqTTnv22Tru1rczZmVx57heJCSiNsio5IBj0TJCeyH?= =?utf-8?q?nVc90Y+ThjGWkTqHYY6u5MiDKEiS5afzznfMAuH/IinSyP68WAE2+n9t/5vUOY9Om?= =?utf-8?q?sk3TlJGF9mcYkPa1hz3y/Ys6R/osflQhmFdGJbchmPYAuxcB8AxsUgz8OrutgauVB?= =?utf-8?q?xJn4yrXZk3Qo6JbteBG23e5QVn62NS+6ewoU0rFpQhfdvKLnjL9jG9feg4P51QBWI?= =?utf-8?q?9FW+PwwT9Lh4haROSQNeiEaqTgA1kczxbq/T+HuXiuV4IJ47O/fJ+rtNyQpCt5x2T?= =?utf-8?q?H7+UpIgOiqfqqbl0IKIl4PT16M01jtD0V0bk5iKQcAdGwtezpgNF/mPMh7zEt195y?= =?utf-8?q?uF+ENtVUNJaOsjHjsuc9MsBl+7NFqydU2+ozvW7+l4C7VV2HrMjjnm2qiD7kFhZr8?= =?utf-8?q?1PghBh9Qwg/BQg0o/LMzufsGlY7snAix6v6nOXlpTcdJHnRm6KcxYr6LJkgGTLVES?= =?utf-8?q?uLFgydysRTEqWd3HPIGEOd0lpyfc986hU0iWRNnUlwB/YhuSPqa0+vez9KbZvvULE?= =?utf-8?q?dAo3nMAtdTweS4XuUUcDJhDJPaFsy5c7pWSX3N1rMJKNHHccTv3xo6ZXXh371jkXm?= =?utf-8?q?RbNtO9i1a2w0oiR/kjpJhqXC8RWl1rUJWwl/qgMB3sncrWeXB2BGuD4=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?r4J7LpeyEjgc/7CVlMKRZTGuSr0m?= =?utf-8?q?xAMKdWctZRv8iLIaQs0AKn4vUWUPx5OWO6EdC1weIHBvv3ybIGRU1kQnKCoN9XM7K?= =?utf-8?q?uCYwdEQqvro+PCxJyNx8GN2Go2tuM9aMFCwMGewaQDWlo6JO4zXY7ox3/hSu6mCyY?= =?utf-8?q?leTBhltLi5qLZ4Zu0sB+3yOaiGqROgF2tNCIDrrq04UthbXpiDU1Ix4BjQXIN9F2h?= =?utf-8?q?fW5cwGfWg8icWGT2zMNNyxla9UcFUO06NfUVykGCb4ZULMcpbeqqGvcjBVqEKTdwA?= =?utf-8?q?zYMvIQyOHL04nzF1FkqlB/jh0dZssq4M9VVu/+meJ16vA7xU5PVkCYxaJoJDdt1FO?= =?utf-8?q?J+bx0pU16YhTScVUpa5H4MooGrLc6hf8OeC9uNAu7b05Sgep9seQ5o2J52GM5PNQw?= =?utf-8?q?dCHVCx+pulf0e/xSDwVTcycJ2cLS+Tcy9xPu8WMbxaLc2fP1OycBD/yl5se64BD7K?= =?utf-8?q?1ZPMkYtUrEs4/GnKgqyyNVhcdZRiNKF+eMMdCzyaky8gDo355QcVIeB4iTgSGItWz?= =?utf-8?q?2L/edLO2XBzWJC/32b6jOxcYbE+edELJ+VNRPj/m+DOdqyAgvEowVsjRj7Z3Sb8Df?= =?utf-8?q?QVEr6+RnfWqygYrwzAqANsw849LZ4UEN0af4Iq8GcF/RvJU1m/KJYNa3Qvb7aHZ6s?= =?utf-8?q?o0GbOswe0F3mHXJ0ilGey1rx5UhMjOnfzFp0Kv64SHuBuRyFuhwgJiaTXQq5rF84T?= =?utf-8?q?DXdVN6TTMYk5ta6PjFHaYfWavyaueY0dno9D3D44nYExfIyaV2dhnCKTU62U0UcFi?= =?utf-8?q?sdoWgNxHFZbLa0rdwh+7wvrq19sg1DylwG/gjXsjZ0eZoaZ/70BHxCH5Ifak/LoE8?= =?utf-8?q?Zhkpcj2lSuIH/VLQ3c4L4IaEJapKvGLioNiVMob62u5PALxTCYOJFRMD9vTcy9qX8?= =?utf-8?q?9OC7GpSQobEzKpKC94KJONEDuowtp3MhRTUJprZlc85aeghMADhCImRkZ4m8NcNzQ?= =?utf-8?q?u250Rl7nctRy1J4Ng1ZAC2W7cQtrlrH20zAdjBblA2KKLmmpqEZoRkdySrJIeBZP7?= =?utf-8?q?q+UYSy/4qlOGhJU4nYl0nS3Sn8FsVJkNqfWt2+9S7P9He8BAHpm5+g2yWXaSb/Ori?= =?utf-8?q?XVnRj+/cSWfdO/F8mFaEIEfwagFaS92+PesEPePMdhQVfVbOF/DC420OC1+Q5z+gg?= =?utf-8?q?QlVezZdQFiq1YTlaROLdKB+HFbtiqMVUPhT3chlRlgTFb6XaYhRqS2IbtaesEEirt?= =?utf-8?q?5I1WZs5SFelL17M07CDVvqcSLrFP+dRlx2JXXY/kTg0SWfHc6gfS7oB0r4yQSPV9A?= =?utf-8?q?BFl7l+s5hP3/pcbpN9hDYG7nE0jxfqb6dz0wn20IVQtRkAZ6+s8zvDz49lnRch/5j?= =?utf-8?q?32vzCl4/s6+fJQbdOs5RKeRPFe11wT1xIwYpNGQZS+xB2fD8L9ABqjaD9hGcBx876?= =?utf-8?q?y3l6zBSxuctPk6ujQJdkgmL4bwLY13SREDV6gRh9FvKskjS+JVyNVcO99/kdaSP+M?= =?utf-8?q?1D8tUWloHm3FE7+8A+aKuOG8avYinrajkCvGGFrypUlhyCWcTKRJpW5XO1lkIm0xU?= =?utf-8?q?A1FEjH97qd3zi5JI52oBOWImT3LdqUYcpYRi4mHfanru0XRKx2HrjjXKSzIGfyYhC?= =?utf-8?q?zm9RouNa7TD?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 482406bd-198d-4ff6-8e01-08dd67b4af01 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:48.5895 (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: BxtzrSd/SCycHiBWNX3hdtuwkioensFXbcxxU8tD+b03KaS7cSB2igKmRttUqe0YgCZ1G1XXpRe7i96kypH9dA== 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" Use the register!() macro to define the layout for the Boot0 register and use its accessors through the use of the convenience with_bar!() macro, which uses Revocable::try_access() and converts its returned Option into the proper error as needed. Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/gpu.rs | 5 ++-- drivers/gpu/nova-core/nova_core.rs | 12 ++++++++ drivers/gpu/nova-core/regs.rs | 60 ++++++-------------------------------- 3 files changed, 23 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 9fe6aedaa9563799c2624d461d4e37ee9b094909..d96901e5c8eace1e7c57c77da7def209e8149cd3 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -135,11 +135,10 @@ pub(crate) struct Spec { impl Spec { fn new(bar: &Devres) -> Result { - let bar = bar.try_access().ok_or(ENXIO)?; - let boot0 = regs::Boot0::read(&bar); + let boot0 = with_bar!(bar, |b| regs::Boot0::read(b))?; Ok(Self { - chipset: boot0.chipset().try_into()?, + chipset: boot0.chipset()?, revision: Revision::from_boot0(boot0), }) } diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs index a91cd924054b49966937a8db6aab9cd0614f10de..94f4778c16f6a4d046c2f799129ed0cc68df6fd4 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -2,6 +2,18 @@ //! Nova Core GPU Driver +#[macro_use] +mod macros { + /// Convenience macro to run a closure while holding [`crate::driver::Bar0`]. + /// + /// If the bar cannot be acquired, then `ENXIO` is returned. + macro_rules! with_bar { + ($bar:expr, $closure:expr) => { + $bar.try_access_with($closure).ok_or(ENXIO) + }; + } +} + mod driver; mod firmware; mod gpu; diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 50aefb150b0b1c9b73f07fca3b7a070885785485..7bfd2b575fe2184565d495012e55cd0829b0b1ad 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -1,55 +1,13 @@ // SPDX-License-Identifier: GPL-2.0 -use crate::driver::Bar0; +use core::ops::Deref; +use kernel::io::Io; +use kernel::register; -// TODO -// -// Create register definitions via generic macros. See task "Generic register -// abstraction" in Documentation/gpu/nova/core/todo.rst. +use crate::gpu::Chipset; -const BOOT0_OFFSET: usize = 0x00000000; - -// 3:0 - chipset minor revision -const BOOT0_MINOR_REV_SHIFT: u8 = 0; -const BOOT0_MINOR_REV_MASK: u32 = 0x0000000f; - -// 7:4 - chipset major revision -const BOOT0_MAJOR_REV_SHIFT: u8 = 4; -const BOOT0_MAJOR_REV_MASK: u32 = 0x000000f0; - -// 23:20 - chipset implementation Identifier (depends on architecture) -const BOOT0_IMPL_SHIFT: u8 = 20; -const BOOT0_IMPL_MASK: u32 = 0x00f00000; - -// 28:24 - chipset architecture identifier -const BOOT0_ARCH_MASK: u32 = 0x1f000000; - -// 28:20 - chipset identifier (virtual register field combining BOOT0_IMPL and -// BOOT0_ARCH) -const BOOT0_CHIPSET_SHIFT: u8 = BOOT0_IMPL_SHIFT; -const BOOT0_CHIPSET_MASK: u32 = BOOT0_IMPL_MASK | BOOT0_ARCH_MASK; - -#[derive(Copy, Clone)] -pub(crate) struct Boot0(u32); - -impl Boot0 { - #[inline] - pub(crate) fn read(bar: &Bar0) -> Self { - Self(bar.readl(BOOT0_OFFSET)) - } - - #[inline] - pub(crate) fn chipset(&self) -> u32 { - (self.0 & BOOT0_CHIPSET_MASK) >> BOOT0_CHIPSET_SHIFT - } - - #[inline] - pub(crate) fn minor_rev(&self) -> u8 { - ((self.0 & BOOT0_MINOR_REV_MASK) >> BOOT0_MINOR_REV_SHIFT) as u8 - } - - #[inline] - pub(crate) fn major_rev(&self) -> u8 { - ((self.0 & BOOT0_MAJOR_REV_MASK) >> BOOT0_MAJOR_REV_SHIFT) as u8 - } -} +register!(Boot0@0x00000000, "Basic revision information about the GPU"; + 3:0 minor_rev => as u8, "minor revision of the chip"; + 7:4 major_rev => as u8, "major revision of the chip"; + 28:20 chipset => try_into Chipset, "chipset model" +); From patchwork Thu Mar 20 13:39:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14024002 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 5DD30C28B30 for ; Thu, 20 Mar 2025 13:40:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 98FD810E627; Thu, 20 Mar 2025 13:40:04 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="a/dlY2qp"; dkim-atps=neutral Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2048.outbound.protection.outlook.com [40.107.244.48]) by gabe.freedesktop.org (Postfix) with ESMTPS id C2D4C10E61B; Thu, 20 Mar 2025 13:39:56 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CYQZ+KHxGR1ehdNDwLUvkhH1rIQuueHL3ZXmAUBkTF1qAMSWFlgI0n3+XwYDvhx0pS6+LgVZ/zBymbLyYUYlSP6uLlc2/5kAWdvpdAW5mOrU5zozs8L2Al4GoEiZ5dF7EqQQ0GCDYC7NsuDe918AkL7il0aAytgViLRJZ9zyQsPtOwgPcDFN8V6SxVui+SFFUkTmcyBfKwDco6Cm6ZWXiXQ9sClr+rZPDFwztp4pHj8pNMrQvFeJxGOIMswU2yFX/MsoJ7REQakx99t/qWUW+G07S1IQj0DNBxEAIyNWWxaNnAY94KXyjA6dw1rUykRwsrRtolJdgKLT8LuJiZXNXw== 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=UGVZG1xRBatSmCFEwlJEeNReMyfGhf7QLcPFnC3KbB0=; b=gy+DsZAFgoIecz4bolxxN8dSJhpO4f6d3gNaZt7P5bOkTOFvErqRnYzTvuamNxc/b/egCHQEL0BpdV1gd7RtF+p1Vs26PKcg/t74lz+KfhKg7GO/k+suPcgepDEvRU/1ojIUgkBo1M8X+UJVQBBM+Tsr7hPRZhKwknzD4T5LAtdsTMgz1tQvSrhy0zJfKjpP7MIkjyLiqRo18uVTE3+guMnruPcMAiDpemJw73k3RwIYtWWxtWFWmHpdBwibOV3uVz+9NMxfx2lLfnCOkvB5+E1PHOlQk4MqT0uCpyHYN9pfzPymIDo/OtQhmA3xuEkCoUZyyUQ8z9eulc0WPJkCVw== 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=UGVZG1xRBatSmCFEwlJEeNReMyfGhf7QLcPFnC3KbB0=; b=a/dlY2qp4jYS4i9L4IyCQZtdhZOVkhM3hpFDFjXKAD08bJzvQ4lZ6kOgU2QQ8ScuiJB3iFkdPScVU+TfiA5qzW9aX8PQgy6v7Gz8E0quxIniNbOAW1puq4yHvu+CFGEC4xANZfqjShZOpDE1Eqk8gmA5tN0dOJNctvUGJFZ6hDem6gPo8+uv7/Mk77jZiz/xCGy6IOoh5efpRRMt07KZnMXFgJpfKZs/gL6m8UJxT15wo/E4GqinYmeqUQA0sNsNHO5LVjVvLjZgfyvGj2RILW9e7iZUoF7JGvodH2mz8gEcSpp0LIk7Lzp58A1xUUfALCuZ+cqalM+iqbdUzDQrew== 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:52 +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:52 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:14 +0900 Subject: [PATCH RFC v3 6/7] gpu: nova-core: add basic timer device Message-Id: <20250320-nova_timer-v3-6-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 X-Mailer: b4 0.14.2 X-ClientProxiedBy: TYCP286CA0271.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3c9::16) 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: 8d33a1b5-adbc-4f94-153a-08dd67b4b0ef 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?VI1eEsiSl9GvkHnGgl0qqzEahg6I2ul?= =?utf-8?q?n+Ze/yfvED4+m/NbJGz4ych+ybz6gfU2Con7jdOefq2FuVtVeJpxA8YOOspPqfZ0D?= =?utf-8?q?0xLz4Pypja4/x6Kf/WhTdrHTVv5xRzitSiqsEhWhiYpEQCstkYBinFQd4NAM5S1LA?= =?utf-8?q?HJQCTOacHGx/KA1xBwf2lAMn1nUVKERZf4Fv6u31Qv4dL7gkyxqK33UYt5gE1x0DV?= =?utf-8?q?b10WPFV9n0sN9MV9ftjLZbbeb4XgGbM8PGAcIA/MC/+9P1GxVt0ZnZgK4/k3pZVsj?= =?utf-8?q?d+0OwWxxWQzUTXJNFQKj1O7d1x4s9DfFGPMWQu5zgCiPPmrISyhpt5xpkSjEKFfTp?= =?utf-8?q?Jb27SgDDuOdG53mpTUa/a13DhIoMPpv5ViQSaIaxj7QHq9r3OezR4ANxvxE/tBJsq?= =?utf-8?q?BzCDjv13Pd9z7Y6pwJ29eaJIIbub7w2dvBd9tH7IEq5nAN9CauLAquBDAlLVGY90W?= =?utf-8?q?rQ5y+JCrDAtbghiv3CxmweD51wwx3ZWnmSFPIlIkWk5plpHMF8zqWpZwcu0r4rqnt?= =?utf-8?q?zaQ1XJ3GlCCr/cV9FglxFKxbM3yvT6Em7/nIggi/qVwhQb3mHIs3MQV7I8JZ26k5l?= =?utf-8?q?UQtx/6GndjMNnhEXUtVUYy7C3cabINRXgi/YvqIrY9z6DJYPW7ce/QhWEQnzpljgM?= =?utf-8?q?VQvdkLZ//QlIhJ8up5N27kQntZJbVIdKEWuCIKZJ2+57Pf/gTQXTc/zNxciKtkgwl?= =?utf-8?q?3TcCAzj460ky48ZXaQm1Q6hIx1ZYha7NlUIE9fUpj+x/HHDijxBGsjg6cxQfokoC9?= =?utf-8?q?s34vtPllbQttbOGkttfPTFJD8cJJIcvE/5iDGF0RLL+UBLL6hPvwTWs0cwud/q/1g?= =?utf-8?q?N9nSWTV15q0mk04HR9Wg/EE7dL1YFEIToYwSKc7d+azz6Zhh526H9E7809E7CiYAi?= =?utf-8?q?cQ4YJ/4TGhTQwszZ4NLPr2M6NwYsopZFpfdFJARKBbHq3uBAoRY2AirrBc7s1iwJk?= =?utf-8?q?i7tDX7Hsatp5sP/A+gCRNUr0lBiN36BBVRHtsHOWU1jkbcIhqUGZStDeqXJsWP/2Y?= =?utf-8?q?0hfmbcAMHLMF/9KwU2DNt4MjSPxyaEK547jyDwkwKmPaSqDUlqVjT24SHO7eA9o+N?= =?utf-8?q?9XgkmAbmaBE9Kpejp/YHmv10ed8f8zZoihOc4dddoedl9GEvjXO/erN5m3JFrGwr4?= =?utf-8?q?+hm2gDPUZhvZoNSCvlbPblMWC294bgha2vcBZgn4qHDowmOu7Dg/AzXx25I18Jtk6?= =?utf-8?q?1tUeMuvR6BOkU+xWJrnuPI03XvGVgC3iMr1qRURzOd7ePKw9leM8oZvzY7ilSIQj6?= =?utf-8?q?nWYB+YizMcIDWFFQchyats8KioYlCU39f/5gb9cEA3ROtfDE1oPYNxWHo1qqgCBQ8?= =?utf-8?q?hB0P0yNhwUqjN7qLUmUQ6kLL+z/821cu1n91VPVWRUqUzYjTD2wq4+M=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?OWx5LBThEnzYJ6ovxrR2wDNK3Xuw?= =?utf-8?q?Vr6Ifej+NYIY98mn4Ee54W20V5vCf7/FvN1N/Xsk+LPy5wgpEwjyG4stIfl5TI+Ie?= =?utf-8?q?Vp1j7z+QLq4pAucKfqbSjMuTJX2edqKII9/75AGN98i9PbHdZz/Xtt84sNR4RkyeW?= =?utf-8?q?9ZciyISIF1wa9DgMi1MZMd88W1coR7oRKWK6H48OSAWoxR/DzVXCzkTjIDu78iK+q?= =?utf-8?q?/CF0/8LQZ2WjHS7y11/6IakAQ2PMgdKTb2/EjZmbpWTkKHiArwttvBTIpl6A8ycEn?= =?utf-8?q?SvdpkHzzwmz4CjIaTAZc/6rCbF0ZNLgPUVFLmytTYHD8Mer4rzmh9jaMrVOlJfYZU?= =?utf-8?q?U9S38iX0ehakuPodTcIa0m90N/ATTtyHUNAkM0faOjPvfXVPxMv29JxhGbN6iV/OB?= =?utf-8?q?EjUlkpMI+yk+PcVuC93RiKRlPvPi6m/RXZDUkd7ilPneI2+CfgpUQ40G/x6c1+6qX?= =?utf-8?q?BRjq/ArRt1lm987h8QS2UbkouZ4x9o5l0tn8DRNy4F8zK9Dc+k8HJDcUoUug2Lq1n?= =?utf-8?q?FIQMQ6agiLz+8KeEhRBhIo/Mpq3loVI5vzrDcQOKAm20JhxzoN/8hQXEcmQF6k1Zp?= =?utf-8?q?LHxHGAArfetVIlbG0pjNwYwwopvbu4Kk1D631XTjNaOWgBV0N5qAr2RXnICcHGZwI?= =?utf-8?q?cawkK/D6Wk7/63JXqTR5xZcAXBQCBp/WXJf1Od05mGJQsaDykUyQei6pVDuSKDdMi?= =?utf-8?q?bF2EBZg4J1R4RqvLJSxr6gzVWuTQGnS6SL0oNK8eWSeEUzASs22LBtEo9LHV8arNG?= =?utf-8?q?DNsdOHpI8tXCA/Qskl9j64kQPph2/FD8BJ6a0XioWQrkf48zU81bKu+gyRkRoZr3w?= =?utf-8?q?gtFeqJq0sxTYA1CQq1yzex0cSiqovxWly6JHwb9El+cleNOLrVdPwZiriIcqAc/jG?= =?utf-8?q?PFV9MSZhNT+ASTj63WaSckdlWt76OYZFIEvFjgOYh02eRMPgKH/AaPxfsYfh98oDS?= =?utf-8?q?7wydRSUqS/c0/fRMAvf2rIip/TeujZ/igJ/PFfgNWGUyvL/dggbM+yeaqul+P0qfG?= =?utf-8?q?uDZMSwQlGcjatv6xJop5aCyqZWqhdjnnNdkrjajnnjwoVWiabGsNJi7v+FfG0Etb8?= =?utf-8?q?ys4QnXc+8DlqJ0DcfnthzfQKxHoRcRn1TYHPeSwT8swPpCSlQZkiknNsXRFLmOoLd?= =?utf-8?q?UHQzltOqehJfsuBCqas8AaDV+Z80lhw279Yp2RpeYaJRFKVOS+sOP+3wSdXUFyDfI?= =?utf-8?q?zcuQuQAuy+TiO265KXI/G8CRKCu8bs14jZDVYF09Mq/44ebx2v10Xd90Fm+XOw9S+?= =?utf-8?q?TzQ4cfAeCeQP2JygJMKFxNodzL2S/1x97GhR+oOnRpelTxUD4LLX+RsUkTrofUv44?= =?utf-8?q?36pkVv+8pQkADLBtQopchf7IabD7UCs0V200pB/UQro9ljND0hS38towooDHMxzDw?= =?utf-8?q?l1RXHcCxkVJueYkjF684mELWOEnGYLaxt5TzHPfxteJ+gB1HWGOkfkTwfqOwGtA/3?= =?utf-8?q?6eynAmUZwJaPVfKVrTSZe3kAywZ4ufBYQRX/Ye4tzlB+yEhgtYFajhdQJmwNYhw0C?= =?utf-8?q?2xfzjum+J2GIQc7Gyykk1tgjwnKue+IMbl5LrnrSBbF/WspasAWcpmqVJIfVpRz2O?= =?utf-8?q?xDUaSsFOpdi?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8d33a1b5-adbc-4f94-153a-08dd67b4b0ef 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:51.9529 (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: EyuGXeowYvf5rRJF0zetCvd/lFmSV9jpqFS2v6dcc8LZg26/Qx91SaPUhci1DkMlkhpvJwHY8OUWcsplLvC8Mg== 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" Add a basic timer device and exercise it during device probing. This first draft is probably very questionable. One point in particular which should IMHO receive attention: the generic wait_on() method aims at providing similar functionality to Nouveau's nvkm_[num]sec() macros. Since this method will be heavily used with different conditions to test, I'd like to avoid monomorphizing it entirely with each instance ; that's something that is achieved in nvkm_xsec() using functions that the macros invoke. I have tried achieving the same result in Rust using closures (kept as-is in the current code), but they seem to be monomorphized as well. Calling extra functions could work better, but looks also less elegant to me, so I am really open to suggestions here. Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/driver.rs | 4 +- drivers/gpu/nova-core/gpu.rs | 55 +++++++++++++++- drivers/gpu/nova-core/nova_core.rs | 1 + drivers/gpu/nova-core/regs.rs | 11 ++++ drivers/gpu/nova-core/timer.rs | 132 +++++++++++++++++++++++++++++++++++++ 5 files changed, 201 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs index 63c19f140fbdd65d8fccf81669ac590807cc120f..0cd23aa306e4082405f480afc0530a41131485e7 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -10,7 +10,7 @@ pub(crate) struct NovaCore { pub(crate) gpu: Gpu, } -const BAR0_SIZE: usize = 8; +const BAR0_SIZE: usize = 0x9500; pub(crate) type Bar0 = pci::Bar; kernel::pci_device_table!( @@ -42,6 +42,8 @@ fn probe(pdev: &mut pci::Device, _info: &Self::IdInfo) -> Result> GFP_KERNEL, )?; + let _ = this.gpu.test_timer(); + Ok(this) } } diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index d96901e5c8eace1e7c57c77da7def209e8149cd3..f010d3152530b1cec032ca620e59de51a2fc1a13 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -6,8 +6,10 @@ use crate::driver::Bar0; use crate::regs; +use crate::timer::Timer; use crate::util; use core::fmt; +use core::time::Duration; macro_rules! define_chipset { ({ $($variant:ident = $value:expr),* $(,)* }) => @@ -179,6 +181,7 @@ pub(crate) struct Gpu { /// MMIO mapping of PCI BAR 0 bar: Devres, fw: Firmware, + timer: Timer, } impl Gpu { @@ -194,6 +197,56 @@ pub(crate) fn new(pdev: &pci::Device, bar: Devres) -> Result Result<()> { + pr_info!("testing timer subdev\n"); + with_bar!(self.bar, |b| { + pr_info!("current timestamp: {}\n", self.timer.read(b)) + })?; + + if !matches!( + self.timer + .wait_on(&self.bar, Duration::from_millis(10), || Some(())), + Ok(()) + ) { + pr_crit!("timer test failure\n"); + } + + let t1 = with_bar!(self.bar, |b| { + pr_info!("timestamp after immediate exit: {}\n", self.timer.read(b)); + self.timer.read(b) + })?; + + if self + .timer + .wait_on(&self.bar, Duration::from_millis(10), || Option::<()>::None) + != Err(ETIMEDOUT) + { + pr_crit!("timer test 2 failure\n"); + } + + let t2 = with_bar!(self.bar, |b| self.timer.read(b))?; + if t2 - t1 < Duration::from_millis(10) { + pr_crit!("timer test 3 failure\n"); + } + + with_bar!(self.bar, |b| { + pr_info!( + "timestamp after timeout: {} ({:?})\n", + self.timer.read(b), + t2 - t1 + ); + })?; + + Ok(()) } } diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs index 94f4778c16f6a4d046c2f799129ed0cc68df6fd4..f54dcfc66490cb6b10090ef944ac14feca9f6972 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -18,6 +18,7 @@ macro_rules! with_bar { mod firmware; mod gpu; mod regs; +mod timer; mod util; kernel::module_pci_driver! { diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 7bfd2b575fe2184565d495012e55cd0829b0b1ad..0d06e09b1ba62d55688c633500f37d3fe1aeb30e 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -11,3 +11,14 @@ 7:4 major_rev => as u8, "major revision of the chip"; 28:20 chipset => try_into Chipset, "chipset model" ); + +/* PTIMER */ + +register!(PtimerTime0@0x00009400; + 31:0 lo => as u32, "low 32-bits of the timer" +); + +register!(PtimerTime1@0x00009410; + 31:0 hi => as u32, "high 32 bits of the timer" +); + diff --git a/drivers/gpu/nova-core/timer.rs b/drivers/gpu/nova-core/timer.rs new file mode 100644 index 0000000000000000000000000000000000000000..1361e4ad10d923ce114972889cdfcfa6e58a691b --- /dev/null +++ b/drivers/gpu/nova-core/timer.rs @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Nova Core Timer subdevice + +use core::fmt::Display; +use core::ops::{Add, Sub}; +use core::time::Duration; + +use kernel::devres::Devres; +use kernel::num::U64Ext; +use kernel::prelude::*; + +use crate::driver::Bar0; +use crate::regs; + +/// A timestamp with nanosecond granularity obtained from the GPU timer. +/// +/// A timestamp can also be substracted to another in order to obtain a [`Duration`]. +/// +/// TODO: add Kunit tests! +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub(crate) struct Timestamp(u64); + +impl Display for Timestamp { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl Add for Timestamp { + type Output = Self; + + fn add(mut self, rhs: Duration) -> Self::Output { + let mut nanos = rhs.as_nanos(); + while nanos > u64::MAX as u128 { + self.0 = self.0.wrapping_add(nanos as u64); + nanos -= u64::MAX as u128; + } + + Timestamp(self.0.wrapping_add(nanos as u64)) + } +} + +impl Sub for Timestamp { + type Output = Duration; + + fn sub(self, rhs: Self) -> Self::Output { + Duration::from_nanos(self.0.wrapping_sub(rhs.0)) + } +} + +pub(crate) struct Timer {} + +impl Timer { + pub(crate) fn new() -> Self { + Self {} + } + + /// Read the current timer timestamp. + pub(crate) fn read(&self, bar: &Bar0) -> Timestamp { + loop { + let hi = regs::PtimerTime1::read(bar); + let lo = regs::PtimerTime0::read(bar); + + if hi.hi() == regs::PtimerTime1::read(bar).hi() { + return Timestamp(u64::from_u32s(hi.hi(), lo.lo())); + } + } + } + + #[allow(dead_code)] + pub(crate) fn time(bar: &Bar0, time: u64) { + regs::PtimerTime1::default() + .set_hi(time.upper_32_bits()) + .write(bar); + regs::PtimerTime0::default() + .set_lo(time.lower_32_bits()) + .write(bar); + } + + /// Wait until `cond` is true or `timeout` elapsed, based on GPU time. + /// + /// When `cond` evaluates to `Some`, its return value is returned. + /// + /// `Err(ETIMEDOUT)` is returned if `timeout` has been reached without `cond` evaluating to + /// `Some`, or if the timer device is stuck for some reason. + pub(crate) fn wait_on Option>( + &self, + bar: &Devres, + timeout: Duration, + cond: F, + ) -> Result { + // Number of consecutive time reads after which we consider the timer frozen if it hasn't + // moved forward. + const MAX_STALLED_READS: usize = 16; + + let (mut cur_time, mut prev_time, deadline) = { + let cur_time = with_bar!(bar, |b| self.read(b))?; + let deadline = cur_time + timeout; + + (cur_time, cur_time, deadline) + }; + let mut num_reads = 0; + + loop { + if let Some(ret) = cond() { + return Ok(ret); + } + + (|| { + cur_time = with_bar!(bar, |b| self.read(b))?; + + /* Check if the timer is frozen for some reason. */ + if cur_time == prev_time { + if num_reads >= MAX_STALLED_READS { + return Err(ETIMEDOUT); + } + num_reads += 1; + } else { + if cur_time >= deadline { + return Err(ETIMEDOUT); + } + + num_reads = 0; + prev_time = cur_time; + } + + Ok(()) + })()?; + } + } +} From patchwork Thu Mar 20 13:39:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14024003 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 D9D9BC36000 for ; Thu, 20 Mar 2025 13:40:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C7D6A10E628; Thu, 20 Mar 2025 13:40:04 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="he1IvUXN"; dkim-atps=neutral Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2060.outbound.protection.outlook.com [40.107.244.60]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0C29910E620; Thu, 20 Mar 2025 13:40:03 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PoAEooKP0tnu8/5RFiPk7TMVTigkcOMJiSxEC/taWnN2RyRPF4nf+u/lhQ4z3dJM6N0eWieInxm0mNsHUtWBZw37Ix5ziRXHb4VX5Rhf3xga1t8W4JUA7e9VYp+v/c+voaCwM1cDsPDLWL8EXNYvarCKD5+pnwJHaSoH4VyILMM7vCKsdBRirJxh2xQ5AScobBqOhW997jCiShcIUuWyRmi8qwBRD9mF2fe8sJFVI/cfnltybiENKzXsgaPx61u/TC0F5TRgDOt9liCAlexaKJSA2skAjksIgVH/ybXwXPVLHOjBjbSOGuolfyCWDQowMsjTQqYqCckTQKF22uRpqg== 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=OffwsY/+VwoJMXY1hbuN+yAmEqDYy9rT93dxYRIKGGU=; b=iYCykiLlu8vxB4a8GdDYJ/f8JzcYz6GwQYWrq6jdwhh+p+LB5s/Qoi3uz+PLDcObNgm4QkSRhL+fiRj059r/ESvPp+P52XvFiduvnYAsdNX5l0V3T+NtU0/YvSasV2fh/OeBiYHw6Z/El8/nRPEzxZNwtzz/jqv2ZJ7g1t2a3a70KacdpsCXNOSqGi0MH5lAAjER2fFazVJc/4cA5VgQlliaJ18+Jed/2btnj7ezCcmoeXgWrQDZ6wif/vz2pDM5IEj+eoOcEtFCYDlHkPUM8wmX/e6T6jm9/6x3i3XBN6/PWUz2weQW6Qm7B3h0HhCZhJ9IatkrSITsq255ipi0PA== 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=OffwsY/+VwoJMXY1hbuN+yAmEqDYy9rT93dxYRIKGGU=; b=he1IvUXN5bDH1zQ3cBrmPLpqk9MISaSqsF8+JShEf4Yma3bji0rDMowab6Vh5bDD3zZMVK8G04DQsgESmLST8WmJMsw26wuuzB5PKcqat3RDTKej7kZeTJFn8RnfQGoM8rMIiYcZjerOxxaFitTBEIB33YE4CJcKq/GCEdaqIiL4O5m5WkRQiChUVtHdEllAzwXcExiCKeUpzqFCnExEjgapfkcepS6ROD77YHDLI4JQEf1btP1FGF4lDWpelwcezemLN6Gzve6QTamf6jHF5hb2vIDemO0UDw+dkHuJWDBWefLKEGclbScghhnaNUsSpWc+fmlOze0T3czyzRNuyw== 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:55 +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:55 +0000 From: Alexandre Courbot Date: Thu, 20 Mar 2025 22:39:15 +0900 Subject: [PATCH RFC v3 7/7] gpu: nova-core: add falcon register definitions and probe code Message-Id: <20250320-nova_timer-v3-7-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 X-Mailer: b4 0.14.2 X-ClientProxiedBy: TYCPR01CA0065.jpnprd01.prod.outlook.com (2603:1096:405:2::29) 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: da629228-f227-45c9-08d2-08dd67b4b328 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?qkuC8QiH7dTIrOxL5tpaoFWXuDPkTtZ?= =?utf-8?q?lPyF9+8z9mbHmbANXWSad8q2RP6i3X9iBU1tDKpJEhXbTLHe6nwHjsp1PfiKVL2hv?= =?utf-8?q?0IJTSX9xTsWQh3w/zPtcl9pk6Q85PrM36+5WJXWbTiafWbcqUfuZjpfqMwod7sZjq?= =?utf-8?q?oHvvrrwmzvhXVC5d+E6wgTQg5HX2z2V0gDDe3UZ1sQNcu9CQVy2qEdXAW+OepF+ab?= =?utf-8?q?WpR8nttcgOxh/8OhANK5mSTz2YN9LJtj4EYShbHHO1QkEgzrWwQXZkcr7gM+NUJrs?= =?utf-8?q?SeBno6NKo8LAbAwiYnAPNuf/INt8nH7ENzmiM353eBThN42VjnyEZUX4PStispvr/?= =?utf-8?q?o7UFOi0rtRRB/GaheWp7p3nFwDHcvqqsDQu6ZgfXUX7lRyPGp5lH7u9TpUfb8ETnJ?= =?utf-8?q?GoeXAf4VlnssuWAMz1GVAOWGWgb/8xLQwbQ7r0br06VZKzugeXBsTGeY159bp9GSg?= =?utf-8?q?kWvBeFDWLkgWW0YpNUmg3SvVApQ3PlX3iFpmyoMEncGqLYh/iARqMhybCmBld56kd?= =?utf-8?q?JZY4YSWC/KCIETSj6NfDNGokBIg0OXLZsLvLbiRBA90HKWsZfR43Psz5ZJuUFV+Ti?= =?utf-8?q?B1DogLSp8MIj0fSAp+4guihoIXwsUzRuW6W4NmUotNwhWpktoQoZbe45U3Rx9m6ei?= =?utf-8?q?IMFXVOL7rqT/EXqSQI3aoY0HRQpKEDKvaczviAia66DiWH8fVpo6kkXEEqXdV/z2K?= =?utf-8?q?cq9cw92ZxyxvkaesxCuW43x/Y1IAw2gjApWD+28QDlpg/eIrMb4KchcnVp8yzNhle?= =?utf-8?q?/AcRb2vBcHCaGqUfoeSm4oOPDOmviyEFI1m0GYbVc+WOZA7CwIi7tkqIjw4b632OR?= =?utf-8?q?hug5UVvndcyfVZyKwu+fqrZ17NyOPBnT9c32WB+RKzR/znKS0QjMIq+IXe1E8yQD5?= =?utf-8?q?A6oAQLvPYG2yh+WFl4+i0GFTCb3Anw4+bjI9gNJMJi1Rqkk0sDT2etNpxG81Rqexy?= =?utf-8?q?8cLK5Q5ufEiE4Use6eNZ1de3+tAU08sA4Do+vHKn9OAhN3xxBhQ9AeTdTUWc9Ugeb?= =?utf-8?q?b6v+zQ53q6EPZ7pKKP6hxskbPghMxpibUZ9EMuh8nKvKSoi8cNZKCEh26IXowKdSx?= =?utf-8?q?YUKw76xOdAWxmDG+w6KJMqJYHMvkuuNoJQXPw4KyD8Em1IXSfljtT7KO8wlMA0bJC?= =?utf-8?q?G1FeMcj/xui1UPjtFns03g8a8UikNxzQZwoCPYWaTnbRSDezUcoL+l6rO53wxsniC?= =?utf-8?q?JvCyPWl90N/MttI/G6rIAUwSo8D02GjyT4MLDnOXoTNwSbuAE6Oltr0hpxpLCX4PJ?= =?utf-8?q?4Y9Tc1Vw/eoeefkiDgnEI8BLqV4Ohs3JtUHrFm/Q7h+ysCrKEOUSEhIdvkIh69F8y?= =?utf-8?q?fv9s5tT+6+L/W46rjqIjZfZty8i0UNaLbMqainhjX+Qcx/OuUPnGRLc=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?LoP794E+aJJrSzcaU/0TWdWJaY9W?= =?utf-8?q?D4nGZ4vi0Q20ig8FOuiUDzXIjS17FhGCl99eoc+FeYqFxPbLwE1yigha5vLNExv/K?= =?utf-8?q?IxEJaNszGWrSxhtTj3R3j33Mw4b04NLTRX6IoAXb3CD5DIE0xNdM92NE0H08RY5OO?= =?utf-8?q?BO89cZLaC4GyxrJRTckUhe3So7C8QbJlRbAqLSyT1I3jD7W7R1r8PqDPE8ih0gdzB?= =?utf-8?q?UscSSpf2Pd6QBB8As+uSUW/R43RfXyzrSUxx0QIS0nz0id+N/1TBcEmt5xcLlwDL3?= =?utf-8?q?S0SXqBik8JZLeKHrj4OJCIhej3NozITi+FqTYVTR21PiDexXGhIPElYGw5N8cJN9J?= =?utf-8?q?iPnpuKGYXrIoFL8r+LHzebo7/uvaR0XMNwIZoavbKc4OdXnbC6ahG9N4xP3yYTiXr?= =?utf-8?q?fFm1pMNuC1rXBRt4SZ8wMT1TFwA9LnHD+S+mgb1I8oMSRuEIPuMccATrMh/u7mgQ1?= =?utf-8?q?S0572ReegoKkvvYaWaAmtWlaUyHDwR4uan7jGktbPrgyrMQlUMqdclDMlxlPOo2C9?= =?utf-8?q?hobp/DJmsrQDOihvrmCM0lchhr9e3Q2cXkmdvZTcXWwcmY/cwcz1xl5wksa1XGJaB?= =?utf-8?q?dHyTCsI+v5xaZPKJ/qOsXAdzk+OrdgljvTwqd7h4SAlCB/aBiSuw+8KdhC+UJVKvI?= =?utf-8?q?JbNoCF0V2tx0lUWK11DapB6DKRVi3fpz1KGHl1R7JG7YqP34CghjRPYSFxYMYet2m?= =?utf-8?q?I1+RbP+iylAS5MK2jB3t26owV34MqscSfUciyXSCvPdxiH7J7rL/snFQdv6C96gfp?= =?utf-8?q?pAtfksByHo5G5hOB+TG5WBk3KysBV1OrU96+8upvRQxpSE32ZJunuPXAS1lzlNYa1?= =?utf-8?q?kU9fhD/4KosgQ+DXy2qK9DxJTajMTFIMzoefcuZd6uMnOT5XiGsW7F3EsaV0xS+bF?= =?utf-8?q?rb/Fyx3eGklj2bn4U5DaZI2d9kh9DC4+IVXJG0tielEeT1ssGpRSCHpzRbVvdpssk?= =?utf-8?q?D4ncMrq7+Gi2YWFddWu0m9v5Xnq5S+UEVQ8ZhJbB9iXpr2gV6Gsrac5120gIRIB/P?= =?utf-8?q?dMxOUTzjOCC2VFC6ZbzhifWx13weUgMBK+z5SmoRIqmcdMurHP7QPMR0kKyha/FaF?= =?utf-8?q?nGAJzSG8hws8Z4v0OAqQsoI++wtdqkadpGBscjWtw14jgBbjuexiE6jWMSiyVsSvm?= =?utf-8?q?22mRWyQz9hWi0woidD+CKDGjHOOGsGktkF21v/dMqKUeqyCXkuqpY6ycI2pt9l5Sg?= =?utf-8?q?KCDhhvreKCBOtKSWMNR7HtX2unoc/e5ucvSvMdFi+YSv9OZjlTnTK+uXCFx4pjjMI?= =?utf-8?q?LAd61k16ldKgPRm7KJn5dwgMUByL5yPLjTJA+JSLfKJND1EUVoDLx26herohL1MJC?= =?utf-8?q?ORYIiGR8xwQf8Gh4fa+xz0nwDpFfk4rf7M7YUWk7qK67XnufIA6q58BTZ4TkHZFye?= =?utf-8?q?+vrjgGuQXVdnisZREUWiMGfXV2hlilEFiCGv43tSUpl/WqdgNvjIIKtB36ZUDhPHQ?= =?utf-8?q?dsHzNsWEr1f59MN6Ks2niTQHoXt7GTeiq9Lcst36VKvoVNqlRv/A/ryFDJ9dLTYdu?= =?utf-8?q?xtH9Go1T7ZIaG3qhPCh/67x5quJ93oPGMKVgT8I+oRO+azIo2YGr9kRtxkZTBru7A?= =?utf-8?q?4cSRqW+GRgg?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: da629228-f227-45c9-08d2-08dd67b4b328 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:55.7385 (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: z6pIvbBBXC7EqO2Vr8BkmsMKvPQaztbarcA/QB9A8wNDf10IeBxzwN5PUAoCT/LqjIqyVNgJcjkxbiynzdN/JA== 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" This is still very preliminary work, and is mostly designed to show how register fields can be turned into safe types that force us to handle invalid values. Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/driver.rs | 2 +- drivers/gpu/nova-core/falcon.rs | 618 +++++++++++++++++++++++++++++++++++++ drivers/gpu/nova-core/gpu.rs | 13 + drivers/gpu/nova-core/nova_core.rs | 1 + drivers/gpu/nova-core/regs.rs | 188 ++++++++++- 5 files changed, 820 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs index 0cd23aa306e4082405f480afc0530a41131485e7..dee5fd22eecb2ce1f4ea765338b0c1b68853b2d3 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -10,7 +10,7 @@ pub(crate) struct NovaCore { pub(crate) gpu: Gpu, } -const BAR0_SIZE: usize = 0x9500; +const BAR0_SIZE: usize = 0x1000000; pub(crate) type Bar0 = pci::Bar; kernel::pci_device_table!( diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon.rs new file mode 100644 index 0000000000000000000000000000000000000000..0dd4b45abbe0a62238efe24d899c55d5db348586 --- /dev/null +++ b/drivers/gpu/nova-core/falcon.rs @@ -0,0 +1,618 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Falcon microprocessor base support + +// TODO: remove this once this module is actively used. +#![allow(dead_code)] + +use core::hint::unreachable_unchecked; +use core::marker::PhantomData; +use core::time::Duration; +use kernel::bindings; +use kernel::devres::Devres; +use kernel::{pci, prelude::*}; + +use crate::driver::Bar0; +use crate::gpu::Chipset; +use crate::regs; +use crate::timer::Timer; + +#[repr(u8)] +#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub(crate) enum FalconCoreRev { + #[default] + Rev1 = 1, + Rev2 = 2, + Rev3 = 3, + Rev4 = 4, + Rev5 = 5, + Rev6 = 6, + Rev7 = 7, +} + +impl TryFrom for FalconCoreRev { + type Error = Error; + + fn try_from(value: u32) -> core::result::Result { + use FalconCoreRev::*; + + let rev = match value { + 1 => Rev1, + 2 => Rev2, + 3 => Rev3, + 4 => Rev4, + 5 => Rev5, + 6 => Rev6, + 7 => Rev7, + _ => return Err(EINVAL), + }; + + Ok(rev) + } +} + +#[repr(u8)] +#[derive(Debug, Default, Copy, Clone)] +pub(crate) enum FalconSecurityModel { + #[default] + None = 0, + Light = 2, + Heavy = 3, +} + +impl TryFrom for FalconSecurityModel { + type Error = Error; + + fn try_from(value: u32) -> core::result::Result { + use FalconSecurityModel::*; + + let sec_model = match value { + 0 => None, + 2 => Light, + 3 => Heavy, + _ => return Err(EINVAL), + }; + + Ok(sec_model) + } +} + +#[repr(u8)] +#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub(crate) enum FalconCoreRevSubversion { + #[default] + Subversion0 = 0, + Subversion1 = 1, + Subversion2 = 2, + Subversion3 = 3, +} + +impl From for FalconCoreRevSubversion { + fn from(value: u32) -> Self { + use FalconCoreRevSubversion::*; + + match value & 0b11 { + 0 => Subversion0, + 1 => Subversion1, + 2 => Subversion2, + 3 => Subversion3, + // SAFETY: the `0b11` mask limits the possible values to `0..=3`. + 4..=u32::MAX => unsafe { unreachable_unchecked() }, + } + } +} + +#[repr(u8)] +#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)] +pub(crate) enum FalconModSelAlgo { + #[default] + Rsa3k = 1, +} + +impl TryFrom for FalconModSelAlgo { + type Error = Error; + + fn try_from(value: u32) -> core::result::Result { + match value { + 1 => Ok(FalconModSelAlgo::Rsa3k), + _ => Err(EINVAL), + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum RiscvCoreSelect { + Falcon = 0, + Riscv = 1, +} + +impl From for RiscvCoreSelect { + fn from(value: bool) -> Self { + match value { + false => RiscvCoreSelect::Falcon, + true => RiscvCoreSelect::Riscv, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum FalconMem { + Imem, + Dmem, +} + +#[repr(C)] +#[derive(Debug, Clone, Copy)] +pub(crate) struct FalconUCodeDescV3 { + pub(crate) hdr: u32, + pub(crate) stored_size: u32, + pub(crate) pkc_data_offset: u32, + pub(crate) interface_offset: u32, + pub(crate) imem_phys_base: u32, + pub(crate) imem_load_size: u32, + pub(crate) imem_virt_base: u32, + pub(crate) dmem_phys_base: u32, + pub(crate) dmem_load_size: u32, + pub(crate) engine_id_mask: u16, + pub(crate) ucode_id: u8, + pub(crate) signature_count: u8, + pub(crate) signature_versions: u16, + _reserved: u16, +} + +impl FalconUCodeDescV3 { + pub(crate) fn ver(&self) -> u8 { + ((self.hdr & 0xff00) >> 8) as u8 + } + + pub(crate) fn size(&self) -> usize { + ((self.hdr & 0xffff0000) >> 16) as usize + } +} + +/// Trait defining the parameters of a given Falcon instance. +pub(crate) trait FalconInstance { + /// Base I/O address for the falcon, relative from which its registers are accessed. + const BASE: usize; +} + +pub(crate) struct Gsp; +impl FalconInstance for Gsp { + const BASE: usize = 0x00110000; +} +pub(crate) type GspFalcon = Falcon; + +pub(crate) struct Sec2; +impl FalconInstance for Sec2 { + const BASE: usize = 0x00840000; +} +pub(crate) type Sec2Falcon = Falcon; + +/// Contains the base parameters common to all Falcon instances. +#[derive(Debug)] +pub(crate) struct Falcon { + /// Chipset this falcon belongs to. + chipset: Chipset, + /// Whether this falcon is part of a dual falcon/riscv engine. + has_riscv: bool, + _instance: PhantomData, +} + +impl Falcon { + pub(crate) fn new( + pdev: &pci::Device, + chipset: Chipset, + bar: &Devres, + need_riscv: bool, + ) -> Result { + let hwcfg1 = with_bar!(bar, |b| regs::FalconHwcfg1::read(b, I::BASE))?; + let rev = hwcfg1.core_rev()?; + let subver = hwcfg1.core_rev_subversion(); + let sec_model = hwcfg1.security_model()?; + + if need_riscv { + let hwcfg2 = with_bar!(bar, |b| regs::FalconHwcfg2::read(b, I::BASE))?; + if !hwcfg2.riscv() { + dev_err!( + pdev.as_ref(), + "riscv support requested on falcon that does not support it\n" + ); + return Err(EINVAL); + } + } + + dev_info!( + pdev.as_ref(), + "new falcon: {:?} {:?} {:?}", + rev, + subver, + sec_model + ); + + Ok(Self { + chipset, + has_riscv: need_riscv, + _instance: PhantomData, + }) + } + + fn select_falcon_core(&self, bar: &Devres, timer: &Timer) -> Result<()> { + if self.has_riscv { + let bcr_ctrl = with_bar!(bar, |b| regs::RiscvBcrCtrl::read(b, I::BASE))?; + if bcr_ctrl.core_select() != RiscvCoreSelect::Falcon { + with_bar!(bar, |b| regs::RiscvBcrCtrl::default() + .set_core_select(RiscvCoreSelect::Falcon) + .write(b, I::BASE))?; + + timer.wait_on(bar, Duration::from_millis(10), || { + bar.try_access_with(|b| regs::RiscvBcrCtrl::read(b, I::BASE)) + .and_then(|v| if v.valid() { Some(()) } else { None }) + })?; + } + } + + Ok(()) + } + + fn reset_wait_mem_scrubbing(&self, bar: &Devres, timer: &Timer) -> Result<()> { + /* TODO: is this needed? */ + with_bar!(bar, |b| regs::FalconMailbox0::alter(b, I::BASE, |v| v))?; + + timer.wait_on(bar, Duration::from_millis(20), || { + bar.try_access_with(|b| regs::FalconHwcfg2::read(b, I::BASE)) + .and_then(|r| if r.mem_scrubbing() { Some(()) } else { None }) + }) + } + + fn reset_prep(&self, bar: &Devres, timer: &Timer) -> Result<()> { + let _ = with_bar!(bar, |b| regs::FalconHwcfg2::read(b, I::BASE))?; + + // Expected to timeout apparently? + // TODO: check why with OpenRM. + let _ = timer.wait_on(bar, Duration::from_micros(150), || { + bar.try_access_with(|b| regs::FalconHwcfg2::read(b, I::BASE)) + .and_then(|r| if r.unk_31() { Some(()) } else { None }) + }); + + Ok(()) + } + + fn reset_eng(&self, bar: &Devres, timer: &Timer) -> Result<()> { + self.reset_prep(bar, timer)?; + + with_bar!(bar, |b| regs::RiscvUnk3c0::alter(b, I::BASE, |v| v + .set_unk0(true)))?; + + let _: Result<()> = timer.wait_on(bar, Duration::from_micros(10), || None); + + with_bar!(bar, |b| regs::RiscvUnk3c0::alter(b, I::BASE, |v| v + .set_unk0(false)))?; + + self.reset_wait_mem_scrubbing(bar, timer)?; + + Ok(()) + } + + fn disable(&self, bar: &Devres, timer: &Timer) -> Result<()> { + self.select_falcon_core(bar, timer)?; + + with_bar!(bar, |b| { + regs::FalconUnk0048::alter(b, I::BASE, |r| r.set_val0(0)); + + regs::FalconIrqmclr::default() + .set_val(u32::MAX) + .write(b, I::BASE) + })?; + + self.reset_eng(bar, timer) + } + + fn enable(&self, bar: &Devres, timer: &Timer) -> Result<()> { + self.reset_eng(bar, timer)?; + self.select_falcon_core(bar, timer)?; + self.reset_wait_mem_scrubbing(bar, timer)?; + + with_bar!(bar, |b| { + // We write Boot0 into FalconRm, for some reason... + regs::FalconRm::default() + .set_val(regs::Boot0::read(b).into()) + .write(b, I::BASE) + }) + } + + pub(crate) fn reset(&self, bar: &Devres, timer: &Timer) -> Result<()> { + self.disable(bar, timer)?; + self.enable(bar, timer) + } + + fn dma_init( + &self, + bar: &Devres, + dma_handle: bindings::dma_addr_t, + mem: FalconMem, + xfer_len: u32, + sec: bool, + ) -> Result { + with_bar!(bar, |b| { + regs::FalconDmaTrfBase::default() + .set_base((dma_handle >> 8) as u32) + .write(b, I::BASE); + regs::FalconDmaTrfBase1::default() + .set_base((dma_handle >> 40) as u16) + .write(b, I::BASE) + })?; + + Ok(regs::FalconDmaTrfCmd::default() + .set_size((xfer_len.ilog2() - 2) as u8) + .set_imem(mem == FalconMem::Imem) + .set_sec(if sec { 1 } else { 0 })) + } + + fn dma_xfer( + &self, + bar: &Devres, + mem_base: u32, + dma_base: u32, + cmd: regs::FalconDmaTrfCmd, + ) -> Result<()> { + with_bar!(bar, |b| { + regs::FalconDmaTrfMOffs::default() + .set_offs(mem_base) + .write(b, I::BASE); + regs::FalconDmaTrfBOffs::default() + .set_offs(dma_base) + .write(b, I::BASE); + + cmd.write(b, I::BASE) + }) + } + + fn dma_done(&self, bar: &Devres, timer: &Timer) -> Result<()> { + timer.wait_on(bar, Duration::from_millis(2000), || { + bar.try_access_with(|b| regs::FalconDmaTrfCmd::read(b, I::BASE)) + .and_then(|v| if v.idle() { Some(()) } else { None }) + }) + } + + fn dma_wr( + &self, + bar: &Devres, + timer: &Timer, + dma_handle: bindings::dma_addr_t, + dma_base: u32, + mem: FalconMem, + mem_base: u32, + len: u32, + sec: bool, + ) -> Result<()> { + const DMA_LEN: u32 = 256; + + let (dma_start, dma_addr) = match mem { + FalconMem::Imem => (0, dma_handle), + FalconMem::Dmem => (dma_base, dma_handle + dma_base as bindings::dma_addr_t), + }; + + pr_info!( + "dma write {:?}: dma_handle {:x} dma_start {:x} dma_addr {:x} len {:x}\n", + mem, + dma_handle, + dma_start, + dma_addr, + len + ); + + let cmd = self.dma_init(bar, dma_addr, mem, DMA_LEN, sec)?; + + let mut dst = mem_base; + let mut src = dma_base; + let mut remain = len; + + while remain >= DMA_LEN { + self.dma_xfer(bar, dst, src - dma_start, cmd)?; + self.dma_done(bar, timer)?; + + src += DMA_LEN; + dst += DMA_LEN; + remain -= DMA_LEN; + } + + pr_info!("dma write remain: {} bytes\n", remain); + + Ok(()) + } + + pub(crate) fn dma_load( + &self, + bar: &Devres, + timer: &Timer, + dma_handle: bindings::dma_addr_t, + imem_params: (u32, u32, u32), + dmem_params: (u32, u32, u32), + ) -> Result<()> { + pr_info!("dma_load: {:?} {:?}\n", imem_params, dmem_params); + + with_bar!(bar, |b| { + regs::FalconUnk624::alter(b, I::BASE, |v| v.set_unk7(true)); + regs::FalconDmaCtl::default().write(b, I::BASE); + regs::FalconUnk600::alter(b, I::BASE, |v| v.set_unk16(false).set_unk2((1 << 2) | 1)); + })?; + + self.dma_wr( + bar, + timer, + dma_handle, + imem_params.0, + FalconMem::Imem, + imem_params.1, + imem_params.2, + true, + )?; + self.dma_wr( + bar, + timer, + dma_handle, + dmem_params.0, + FalconMem::Dmem, + dmem_params.1, + dmem_params.2, + true, + )?; + + Ok(()) + } + + pub(crate) fn boot( + &self, + bar: &Devres, + timer: &Timer, + v3_desc: &FalconUCodeDescV3, + mbox0: Option, + mbox1: Option, + ) -> Result<(u32, u32)> { + pr_info!("boot 0\n"); + + // Program BROM registers for PKC signature validation. + if self.chipset >= Chipset::GA102 { + let pkc_data_offset = v3_desc.pkc_data_offset; + let engine_id_mask = v3_desc.engine_id_mask; + let ucode_id = v3_desc.ucode_id; + + pr_info!( + "dmem_sign: {:#x}, engine_id: {:#x}, ucode_id: {:#x}", + pkc_data_offset, + engine_id_mask, + ucode_id + ); + + with_bar!(bar, |b| { + regs::FalconBromParaaddr0::default() + .set_addr(pkc_data_offset) + .write(b, I::BASE); + regs::FalconBromEngidmask::default() + .set_mask(engine_id_mask as u32) + .write(b, I::BASE); + regs::FalconBromCurrUcodeId::default() + .set_ucode_id(ucode_id as u32) + .write(b, I::BASE); + regs::FalconModSel::default() + .set_algo(FalconModSelAlgo::Rsa3k) + .write(b, I::BASE); + })?; + } + + pr_info!("boot 1\n"); + + with_bar!(bar, |b| { + if let Some(mbox0) = mbox0 { + regs::FalconMailbox0::default() + .set_mailbox0(mbox0) + .write(b, I::BASE); + } + + if let Some(mbox1) = mbox1 { + regs::FalconMailbox1::default() + .set_mailbox1(mbox1) + .write(b, I::BASE); + } + + // Set `BootVec` to start of non-secure code. + // TODO: use boot vector variable - apparently this is 0 on v3 hdr? + regs::FalconBootVec::default() + .set_boot_vec(0) + .write(b, I::BASE); + + regs::FalconCpuCtl::default() + .set_start_cpu(true) + .write(b, I::BASE); + })?; + + pr_info!("booted!\n"); + timer.wait_on(bar, Duration::from_secs(2), || { + bar.try_access() + .map(|b| regs::FalconCpuCtl::read(&*b, I::BASE)) + .and_then(|v| if v.halted() { Some(()) } else { None }) + })?; + + let (mbox0, mbox1) = with_bar!(bar, |b| { + let mbox0 = regs::FalconMailbox0::read(b, I::BASE).mailbox0(); + let mbox1 = regs::FalconMailbox1::read(b, I::BASE).mailbox1(); + + (mbox0, mbox1) + })?; + + pr_info!("successfully returned {} {}\n", mbox0, mbox1); + + Ok((mbox0, mbox1)) + } +} + +#[repr(C)] +#[derive(Debug)] +struct FalconAppifHdrV1 { + ver: u8, + hdr: u8, + len: u8, + cnt: u8, +} + +#[repr(C)] +#[derive(Debug)] +struct FalconAppifV1 { + id: u32, + dmem_base: u32, +} + +const NVFW_FALCON_APPIF_ID_DMEMMAPPER: u32 = 0x4; + +#[repr(C)] +#[derive(Debug)] +struct FalconAppifDmemmapperV3 { + signature: u32, + version: u16, + size: u16, + cmd_in_buffer_offset: u32, + cmd_in_buffer_size: u32, + cmd_out_buffer_offset: u32, + cmd_out_buffer_size: u32, + nvf_img_data_buffer_offset: u32, + nvf_img_data_buffer_size: u32, + printf_buffer_hdr: u32, + ucode_build_time_stamp: u32, + ucode_signature: u32, + init_cmd: u32, + ucode_feature: u32, + ucode_cmd_mask0: u32, + ucode_cmd_mask1: u32, + multi_tgt_tbl: u32, +} + +pub(crate) const NVFW_FALCON_APPIF_DMEMMAPPER_CMD_FRTS: u32 = 0x15; + +#[derive(Debug)] +#[repr(C)] +struct ReadVbios { + ver: u32, + hdr: u32, + addr: u64, + size: u32, + flags: u32, +} + +#[derive(Debug)] +#[repr(C)] +struct FrtsRegion { + ver: u32, + hdr: u32, + addr: u32, + size: u32, + ftype: u32, +} + +const NVFW_FRTS_CMD_REGION_TYPE_FB: u32 = 2; + +#[derive(Debug)] +#[repr(C)] +struct FrtsCmd { + read_vbios: ReadVbios, + frts_region: FrtsRegion, +} diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index f010d3152530b1cec032ca620e59de51a2fc1a13..ec745dd8175bd3164ed1b865293a526b09c59ab3 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -5,6 +5,7 @@ }; use crate::driver::Bar0; +use crate::falcon::{GspFalcon, Sec2Falcon}; use crate::regs; use crate::timer::Timer; use crate::util; @@ -198,6 +199,18 @@ pub(crate) fn new(pdev: &pci::Device, bar: Devres) -> Result Chipset::GA100 { + true + } else { + false + }, + )?; + + let _sec2_falcon = Sec2Falcon::new(pdev, spec.chipset, &bar, false)?; Ok(pin_init!(Self { spec, diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs index f54dcfc66490cb6b10090ef944ac14feca9f6972..35c030485532633a5dd59a8a4a1f6d385cb46c98 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -15,6 +15,7 @@ macro_rules! with_bar { } mod driver; +mod falcon; mod firmware; mod gpu; mod regs; diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 0d06e09b1ba62d55688c633500f37d3fe1aeb30e..2952fa7f84c274f122bc12e5506b0b2ac0fbb82d 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -2,8 +2,11 @@ use core::ops::Deref; use kernel::io::Io; -use kernel::register; +use kernel::{register, register_rel}; +use crate::falcon::{ + FalconCoreRev, FalconCoreRevSubversion, FalconModSelAlgo, FalconSecurityModel, RiscvCoreSelect, +}; use crate::gpu::Chipset; register!(Boot0@0x00000000, "Basic revision information about the GPU"; @@ -22,3 +25,186 @@ 31:0 hi => as u32, "high 32 bits of the timer" ); +/* PFALCON */ + +register_rel!(FalconIrqsclr@0x00000004; + 4:4 halt => as_bit bool; + 6:6 swgen0 => as_bit bool; +); + +register_rel!(FalconIrqstat@0x00000008; + 4:4 halt => as_bit bool; + 6:6 swgen0 => as_bit bool; +); + +register_rel!(FalconIrqmclr@0x00000014; + 31:0 val => as u32 +); + +register_rel!(FalconIrqmask@0x00000018; + 31:0 val => as u32 +); + +register_rel!(FalconRm@0x00000084; + 31:0 val => as u32 +); + +register_rel!(FalconIrqdest@0x0000001c; + 31:0 val => as u32 +); + +register_rel!(FalconMailbox0@0x00000040; + 31:0 mailbox0 => as u32 +); +register_rel!(FalconMailbox1@0x00000044; + 31:0 mailbox1 => as u32 +); + +register_rel!(FalconUnk0048@0x00000048; + 1:0 val0 => as u32 +); + +register_rel!(FalconHwcfg2@0x000000f4; + 10:10 riscv => as_bit bool; + 12:12 mem_scrubbing => as_bit bool; + 31:31 unk_31 => as_bit bool; +); + +register_rel!(FalconCpuCtl@0x00000100; + 1:1 start_cpu => as_bit bool; + 4:4 halted => as_bit bool; + 6:6 alias_en => as_bit bool; +); +register_rel!(FalconBootVec@0x00000104; + 31:0 boot_vec => as u32 +); + +register_rel!(FalconHwCfg@0x00000108; + 8:0 imem_size => as u32; + 17:9 dmem_size => as u32; +); + +register_rel!(FalconDmaCtl@0x0000010c; + 0:0 require_ctx => as_bit bool; + 1:1 dmem_scrubbing => as_bit bool; + 2:2 imem_scrubbing => as_bit bool; + 6:3 dmaq_num => as_bit u8; + 7:7 secure_stat => as_bit bool; +); + +register_rel!(FalconDmaTrfBase@0x00000110; + 31:0 base => as u32; +); + +register_rel!(FalconDmaTrfMOffs@0x00000114; + 23:0 offs => as u32; +); + +register_rel!(FalconDmaTrfCmd@0x00000118; + 0:0 full => as_bit bool; + 1:1 idle => as_bit bool; + 3:2 sec => as_bit u8; + 4:4 imem => as_bit bool; + 5:5 is_write => as_bit bool; + 10:8 size => as u8; + 14:12 ctxdma => as u8; + 16:16 set_dmtag => as u8; +); + +register_rel!(FalconDmaTrfBOffs@0x0000011c; + 31:0 offs => as u32; +); + +register_rel!(FalconDmaTrfBase1@0x00000128; + 8:0 base => as u16; +); + +register_rel!(FalconHwcfg1@0x0000012c; + 3:0 core_rev => try_into FalconCoreRev, "core revision of the falcon"; + 5:4 security_model => try_into FalconSecurityModel, "security model of the falcon"; + 7:6 core_rev_subversion => into FalconCoreRevSubversion; + 11:8 imem_ports => as u8; + 15:12 dmem_ports => as u8; +); + +// TODO: This should be able to take an index, like +0x180[16; 8]? Then the constructor or read +// method take the port we want to address as argument. +register_rel!(FalconImemC@0x00000180; + 7:2 offs => as u8; + 23:8 blk => as u8; + 24:24 aincw => as_bit bool; + 25:25 aincr => as_bit bool; + 28:28 secure => as_bit bool; + 29:29 sec_atomic => as_bit bool; +); + +register_rel!(FalconImemD@0x00000184; + 31:0 data => as u32; +); + +register_rel!(FalconImemT@0x00000188; + 15:0 data => as u16; +); + +register_rel!(FalconDmemC@0x000001c0; + 23:0 addr => as u32; + 7:2 offs => as u8; + 23:8 blk => as u8; + 24:24 aincw => as_bit bool; + 25:25 aincr => as_bit bool; + 26:26 settag => as_bit bool; + 27:27 setlvl => as_bit bool; + 28:28 va => as_bit bool; + 29:29 miss => as_bit bool; +); + +register_rel!(FalconDmemD@0x000001c4; + 31:0 data => as u32; +); + +register_rel!(FalconModSel@0x00001180; + 7:0 algo => try_into FalconModSelAlgo; +); +register_rel!(FalconBromCurrUcodeId@0x00001198; + 31:0 ucode_id => as u32; +); +register_rel!(FalconBromEngidmask@0x0000119c; + 31:0 mask => as u32; +); +register_rel!(FalconBromParaaddr0@0x00001210; + 31:0 addr => as u32; +); + +register_rel!(RiscvCpuCtl@0x00000388; + 0:0 startcpu => as_bit bool; + 4:4 halted => as_bit bool; + 5:5 stopped => as_bit bool; + 7:7 active_stat => as_bit bool; +); + +register_rel!(RiscvUnk3c0@0x000003c0; + 0:0 unk0 => as_bit bool; +); + +register_rel!(RiscvIrqmask@0x00000528; + 31:0 mask => as u32; +); + +register_rel!(RiscvIrqdest@0x0000052c; + 31:0 dest => as u32; +); + +register_rel!(FalconUnk600@0x00000600; + 16:16 unk16 => as_bit bool; + 2:0 unk2 => as u8; +); + +register_rel!(FalconUnk624@0x00000624; + 7:7 unk7 => as_bit bool; +); + +register_rel!(RiscvBcrCtrl@0x00001668; + 0:0 valid => as_bit bool; + 4:4 core_select => as_bit RiscvCoreSelect; + 8:8 br_fetch => as_bit bool; +);