From patchwork Tue Mar 4 13:53:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14000768 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 4BD17C021B8 for ; Tue, 4 Mar 2025 13:55:08 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9764810E36C; Tue, 4 Mar 2025 13:55:03 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="IiBh6+Qf"; dkim-atps=neutral Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2055.outbound.protection.outlook.com [40.107.244.55]) by gabe.freedesktop.org (Postfix) with ESMTPS id 53E1D10E319; Tue, 4 Mar 2025 13:55:02 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=m/wE2YAiHI8fosmzOdOuZKij+ksURgaVE3PX+gHv8gPCx3zbzLbbnMefzzq29VUZxHo2LXVhOLuKwyiT/ter+o0oQHTknlmTblPECaxH0Mh9yUSp8010MlZQ/G8tdbQwRzQGrC1W1foNKjo1vF+tcUozJ+b9nzESBhMH0HJB9gDt6JzWh9sl9pmtgLTQIkOEvgYjudE34MaCBulzR6CdKMupnBTit6ryVXhq9K84euU3EpXase9QTtMJm1YiBF80hQ3JXuulMH0yAZtuiuNwo7dn6Z1iNPTkRUFg8EhRW252iSZYKaflubJKhagcigM9tlGY+wnQEb6IMGEes143vg== 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=L137rMd0Rw1ndCyur9Cq3zz8gr3aJMXQRaK6fobdNvU=; b=P1Sj7LSK6JrOJ/3pdZBLF3Auo+UaSKQ9xjduApKbSeRVROEBdinz3V9MoEk4gV84HhniqvOcRLzaAPuXT38WfpHhWq/WEPD2m+Jxv1FlQ3tEDogb+Va01K6HYiuZxqUK1XToNER+Yen2fekbSjW08jFj62SrnMAxtV44N6a/8wLEY2CZkUuMNv8IgqRsXtR/ECHavlnSvQu6/tcTPErd9nkr2Ch0WtxvgQwLU6vIwfiRbFOcnrFZ//X2ulPY/91pfgAjG1j5mGhgeoN6wtKZ0TRuVeImJB4OW6JwiZ5ODTUGidvMcuLN25ScHls9GPrZBZ05g/QKJ9RP0Z9bOcTevg== 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=L137rMd0Rw1ndCyur9Cq3zz8gr3aJMXQRaK6fobdNvU=; b=IiBh6+Qf3hgPGJvvDTxAZaFFWYWAPgXr4ZcMVtYUbWeK21pLkUBMw7ZpxEeBZHbZthJhVxxSrvoxmajVe14d3dJCB8meGekyBqJiZGWcvGBt3kxHUhHbD3oKH8BxgtkrWHZL1/9R6+0qh6oSWV9bzCyErifE3GDADYVJvcSjrMgBkR15rWpfT2fPgGEW9D68RoxvjAGBfWXYTe4zi7tWpZ+s1jJWGZEliMbRcxk8QQoou300ONYvhp+nlsg5N0PzuQuDEZi4uqtiERLu1K9g4hHym1k6aCaI/NfztWb/i5S82FFNq5EmkBiB+hPHUWTH03/WFNSoa830yKZGLk692w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) by DS0PR12MB7874.namprd12.prod.outlook.com (2603:10b6:8:141::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.25; Tue, 4 Mar 2025 13:54:54 +0000 Received: from MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316]) by MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316%6]) with mapi id 15.20.8489.025; Tue, 4 Mar 2025 13:54:54 +0000 From: Alexandre Courbot Date: Tue, 04 Mar 2025 22:53:57 +0900 Subject: [PATCH RFC v2 1/5] rust: add useful ops for u64 Message-Id: <20250304-nova_timer-v2-1-8fb13f3f8cff@nvidia.com> References: <20250304-nova_timer-v2-0-8fb13f3f8cff@nvidia.com> In-Reply-To: <20250304-nova_timer-v2-0-8fb13f3f8cff@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: TYCP286CA0189.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:382::15) To MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB3997:EE_|DS0PR12MB7874:EE_ X-MS-Office365-Filtering-Correlation-Id: 1383bec0-331a-482c-cc5a-08dd5b24248f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|10070799003|366016|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?IgoLfbbAV3++mzFidV7r2zpGb1/b1Mz?= =?utf-8?q?HntHIznMpe55GW05+FKywe/d9ONcEqH3DvQRBeEjg3Cpi6d9yEfEcZMRNWkt71XIN?= =?utf-8?q?MXUCFjYjefoYZNoXAmce8VCeqSEI4MpXVMdYlP5rGNLOh7LOYp25OaXT60zs9EdS7?= =?utf-8?q?0qLPQInbIPFvPxHTYg1bWs263ADcGds972v6WBY6SOwnXatb9lLszoYR9V9X5mY74?= =?utf-8?q?tLUHFfbqvnIAdv4hfjW82Av2j/p+JKYEVWTu2ZvPe/7rR0laTy30DCWG5682aI/o/?= =?utf-8?q?pYH/3tQepzrDD/tI1P6FVEKqOqMkYYq3pkcFboz1ni3wVCfIwYdbLC9Ytua5HM2xF?= =?utf-8?q?dpXKrRnHCJOR8FSWfH+SNcHOhUYh4+R7A5gKX2wx4FUVWBTI6jQ8u7tM9BCY+288V?= =?utf-8?q?V6r22ImZ+gsKqcR3mN+qosW0EvsRj+h/KhRjiZ/4Pr8wXeInwEmzorP7unPsqO3ls?= =?utf-8?q?x9vvWlq5BKSQxuy/DZ+zrnSJFjq1HcpuBKjy9SvPh0n1GdI/Tuui5hHll9+fTO11z?= =?utf-8?q?FPVMcsjIpwIKbGybEH0oucPvraA1AGiog0No4cLuOnizdH+yVv/szi7fQd7X+VDcL?= =?utf-8?q?r0CnT/jdKUOCvNCIRh5qWVShTBOk8beMLxyKcKFqMKwoiYnhALNj47TBho6imqvN3?= =?utf-8?q?khAMUVWs4Hw40iq+KgEJjSP7l5UZyJwmynxCSUHf1wsTVEh6pJCBva2vnQYVQDIgc?= =?utf-8?q?KQzB+ekf9w7jWydETnP3k78B1R+9ZHs0+qHu2iMBq4th/FrPOaDdqhGl4/QGEbjMu?= =?utf-8?q?JgtkQ9Q0GrZdiAkNvLAR37+mV55khGW+GoaATptH2pws4OHisFkSlWpt2J/1dlpKv?= =?utf-8?q?dHtfUdtB5uXCU68Ge/jfiDMfpgnsnAjIcGXuAcCu/jLQ8lmy+stqeSfmAlggYqWz0?= =?utf-8?q?lumYPqAYXazBXxXj+LpyXhU+GZbuP26GflLija5lSlgEPQ1+K+T0yPN8rhwXwROck?= =?utf-8?q?dKULNjxKmHJNfR6Ia9suX2sHB8PI+bHr04iYTu0idBQaBbnBz/CLvwg9mo/75dXHh?= =?utf-8?q?5cpZRnI050mcgfmwgntQvDysakD2OzO/PfnWi3cqD2hSo1ATafzAUt1IuSk/I/ygv?= =?utf-8?q?u9h1hg5v1XJgevTYsoXoEBRau9NqEyyONxKhlieO87xBM8BRGlr607oJKDpOr3IwC?= =?utf-8?q?fI8Qq5aqQCLhW7UEWZkelq2i+aSFB7aGZfP7ioTR75da4qH61OL0BrWoQwEkktPzN?= =?utf-8?q?Ia5UC5orrZQ9YxtOfr7JIvrR8IJuNr1ruZx7ciiT5/52lmjkfa+584VxX7CRr9bAg?= =?utf-8?q?onTdEeZTecdLf3NCbqvha6tLLBnNTpqfD1pDuNVVcRJIuWLF4bkiVK/sNmvDg250t?= =?utf-8?q?UYHEb4XUQkAJTdtnIxDNMoRROC+5lQWQy6vLcE4s2usdC1Lks8DQPnU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3997.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(10070799003)(366016)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?m8w2VdpQQRPQ7wxd8mDduPVn4K29?= =?utf-8?q?h6k3qs6cEcObNDhA1cgrYHm4WWrzGUxKtXuFhlmyBybAoVnZhC8mlLUJADXOiJCad?= =?utf-8?q?EvUjHw3evTfWSbLwHCZC2/x0WGTXB9JoUAP3vqT5JErmB8gWKmoDrQNGh/QLhn8pr?= =?utf-8?q?w/VMyFpZbZPSvvWOGUsJpO7pg6O3lyjOp4raEqYOu4ohxuMB4gPhspdiwGmQRdSjs?= =?utf-8?q?m9rsVKHsiH5mmlhm0Cv2xM6uGHsJ5R9MXWy6zDRT8/GBWAo04VnfAIQjl0En+VbL+?= =?utf-8?q?ZmRqvqdGELe4aMnPFbOpc/2ObW6LeG9ZfFaChnOtaRbO6r3/eP6sXyuj5a+BOqtxy?= =?utf-8?q?3B/aAUN6G91JwDito4vgEoQYxXdsBNCXgbdHrpO1fnN0CB/em7j0k/sg1IXvY5HQw?= =?utf-8?q?Oj/GYIB6+ts00Eml2dmWDahqNdhPW6od6GShnQR/jbpzP3CLweldRr6m1fHzwZuaK?= =?utf-8?q?5H4D2itDMAZny2y8bNbR41sQulroRMeSX1+rlJTHct7Wfb++Or1xAgkamPauhlzW7?= =?utf-8?q?RYBCua41tZjllxFJ5zgJPvZaUZGb6p/UQFC/78fzhpnnUnoOM74IZbQO/Z4RL82c4?= =?utf-8?q?DYFX6UaykZBcMhxCUU8wd9Elo/cSCI5GzMg6gvVjRiiB64WjKG00avWFcDH97PZPF?= =?utf-8?q?2dOsAsIkJT5PUqDgiMLF93NlYlKocmZ46/IJlU84/8K6fthScLQk1ELgOT3xBDDZn?= =?utf-8?q?WFIehcLURJogXDtlMPG2osLDA/WoaGUkw7FaKk4APl8JcpRPnCzLAzwivb72OTMUt?= =?utf-8?q?ai6SVolWsj679L2hKaDZO6LXihM8oNvP2I1tNpS1dLtCY8iKTpS+3tGoZk0+BBaZi?= =?utf-8?q?hyPtiDp8a27mD6faZntiIHeKw/2/8jHHi/t6Ozz47eQYAdofiV0JHtxO8T2iZIFD6?= =?utf-8?q?cKBEvtbtM0JTgcEC9ZKW1NeW0n8RVkGS5jZ7233iAud1f7rCOCQd91qpg6h+NtAdu?= =?utf-8?q?1+dFjt6HANcwmTcAkwmJPYfmqvqaMpN8y9kK3AaMYWUS0BJwY5CnxhQDBzjdaiSAG?= =?utf-8?q?9QBrVWwVk0Qrec4Jx1d6moOKn4qvww63HkdgNnMqyRGpXdj6jn+KOKnmKDQv9CeVI?= =?utf-8?q?I/qkfixJS/3IAiKooZhhorg1a1sFK4CKHUThw8VsXBtRF6kbcW9HFKx0W9BjfiE4A?= =?utf-8?q?fyIGnBkxTwpWxSKaX+XwVyxQ/7f1bUHRdgMJ0+4AMdSrPCB8jCY/vd2x00KQtwS0l?= =?utf-8?q?Ba2n/26Ke9YJ6Ddxpt0/eNgfYN4tCURdxZRSVIp0OELhhnLpk0UAdrmYd0qx5TT7K?= =?utf-8?q?/W5h7aCOEyYE/Ofv2ub16tOBLrTwp0Dud8sqL8GOYLmrCLgByzmCbREN/UIBo8L35?= =?utf-8?q?/azAe7kk9AWQ67quuBtSizmmy/vv6ZYEZEDwDFXNG3KBGAr0z94cEYDA3s6RiH1kY?= =?utf-8?q?C4Gk0lVmBuBCQKlghWAHs1m8eP1zUHoi4BwdZoLAbTHP6/HIxG+41BxSUBwvEhnu+?= =?utf-8?q?7ECHugrvx97xiMk1YqGyrjpwLQgOoFbafJ9sjSYpzFE++lOPm3q+H606W4dSm0pcQ?= =?utf-8?q?pMXM2EUG7hWjJ8J4bHgC6kPRl2UkW9Q7tC94O30dsMpbS5uPgCeaX+ppTMiX3aW3q?= =?utf-8?q?lH//O8s3ajE?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1383bec0-331a-482c-cc5a-08dd5b24248f X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Mar 2025 13:54:54.7834 (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: XIJsaxQjErijzorULWw876fiRkBnfMxS62YjazOw6Gr+b+CHkiLXRafFIr5ToNYZsgH64KcfISC7V7QZIiwsbg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7874 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. Signed-off-by: Alexandre Courbot --- rust/kernel/lib.rs | 1 + rust/kernel/num.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 8e76ef9b4346956009a936b1317f7474a83c8dbd..caee059249cf56993d5db698a876f040eda33dd5 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -61,6 +61,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..f03c82f13643412cc13b0b841dfdf3b06490926d --- /dev/null +++ b/rust/kernel/num.rs @@ -0,0 +1,43 @@ +// 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; + + fn upper_32_bits(self) -> u32; + 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 + } +} + +pub const fn upper_32_bits(v: u64) -> u32 { + (v >> u32::BITS) as u32 +} + +pub const fn lower_32_bits(v: u64) -> u32 { + v as u32 +} + +pub const fn u32s_to_u64(high: u32, low: u32) -> u64 { + ((high as u64) << u32::BITS) | low as u64 +} From patchwork Tue Mar 4 13:53:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14000767 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 76E5DC282D2 for ; Tue, 4 Mar 2025 13:55:05 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7B33910E319; Tue, 4 Mar 2025 13:55:03 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="dWevrl3A"; dkim-atps=neutral Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2055.outbound.protection.outlook.com [40.107.244.55]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7199B10E0FA; Tue, 4 Mar 2025 13:55:02 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cZQLy0JDGjuBC0kw+HC8TygpLfCNolZZNm7yIBHxayC8apQjAGauKLWmJ6/pDC4bsDBRudmiQ2zJc6bdOlYeQfMveswG0fegfFtBlZNRkgf++Tsuq5miYUNk7OWZpmlAfXD4ysehguz5WLWiepKyKsLQ2FVggKr8fCesSX+TPiWD95WioTKcElU6bHbrDfs3Pn9RkU5F7siNku33840ze5M0gmYqm890Sl16Ih5KH+RESnlrwRQBu61F7b9zlWs1dtDVLh18QqTWcXqbTX1cq4BDfJAE4/xth7UEOSsoDgkoisTutjbL0Udb5TLp7jyfTH3oN4HmXd2vpdx3kNR7YA== 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=ePKeVAfIgsxC/Qkmr1dN+3loyWzjcTy09jj2eHT1gPb4vff1i2c2CdAjh5DSuUxD5ywj3PAhJTMY4dSMo8Ln3Jryz6AemukAtA3IjtWGcBGjOAZ5b74g2OiQ1mxysjVNfxBv+NZtZHcRfCtGVSrhExJTE69avzsTKhP22tBxlvRZS6JXEbj8QkInLjU/GKqK/d4err/PtF46s5brzlqhCqntLoofS7/cQWV6BUH58076LcnmvUY++M9CL3Eb2szYGKDYa1mNA+A6y+3yexcrxPgn+SScBhDuU7gFo9rMQgQEABmkIWeweLS3CPzv2fH5DmwrBBKq/jv54N0EDeYluQ== 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=dWevrl3AywRy+jvSb+DLSUdK9ibdC0eV0n2H4I7JpuPYwYjyydi62uXOYJlGA6o1N8O7XmZ/x2XSCb8fG8iowahFmMVbgNlerliuO4Mpm6jLStGAlD+9WUyjzft+K7znPknMgTynHx3/BBUinuQC0/EWuU3hCDC0y6Sw1dsqYZIiUZzD4G2nXNqcQdEwcojDcYXmlEg3SDATF8dz9nnSzY+CiK0r3ScEwhxl+q8E3YRi1lzNp9NCbb+VEmIQcmXku1j58WnTkcQH9nYFXOkxOPkHxcjL8rjFsS1JsyTvi1Elj4DBsSMDJOmZyrmXD4aPBtWrlaIcV12trWfKFRgSNQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) by DS0PR12MB7874.namprd12.prod.outlook.com (2603:10b6:8:141::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.25; Tue, 4 Mar 2025 13:54:58 +0000 Received: from MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316]) by MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316%6]) with mapi id 15.20.8489.025; Tue, 4 Mar 2025 13:54:58 +0000 From: Alexandre Courbot Date: Tue, 04 Mar 2025 22:53:58 +0900 Subject: [PATCH RFC v2 2/5] rust: make ETIMEDOUT error available Message-Id: <20250304-nova_timer-v2-2-8fb13f3f8cff@nvidia.com> References: <20250304-nova_timer-v2-0-8fb13f3f8cff@nvidia.com> In-Reply-To: <20250304-nova_timer-v2-0-8fb13f3f8cff@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: TYCP286CA0256.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:455::14) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB3997:EE_|DS0PR12MB7874:EE_ X-MS-Office365-Filtering-Correlation-Id: 49bb5603-dacd-4495-2d1d-08dd5b24264d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|10070799003|366016|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?S0dJhCi2KED1w8WPrCysdsqeWqbFZI9?= =?utf-8?q?NegHZO4q/nDUNCuNOhV2zgI6JijxQUdQNsJH7cEiY0uxVmCuvyQ7OJoCku4u5/0BV?= =?utf-8?q?UdiTk5DkljT7EXyLkUYbFIXYkIhuAxfikchfk0lyppnrPxscfDppi0iDlSGDb+ysy?= =?utf-8?q?btIumrvtfFHa5qThBxPBCwjC4PYGul97JN7XjIP0cKoAlBkKAQ836nFfmmcvegVg5?= =?utf-8?q?KcZWtofGjl3c08IDHE1y6G0cRzuyRj2bufS5CRyyeWrkP6bGWneEPfEtwVdlZWXJY?= =?utf-8?q?cARsWstSNC8kT9+Nw/8QfnVgaRydGgU2fKVbBgvA5oNHnJuYkGwYDZpqfOG2EDF6r?= =?utf-8?q?xhcBgbH7vv+uU1UOxkfoz5hFjyqxX0K+rtj2DTIRbTyD/y0JmaX5de/Oy93g7bxLJ?= =?utf-8?q?BDFH8xmAk5Z4IiknMlny76h+sQRQuSjB52dxCptrVNAuYb5qxGjnM8XAbsIZHbXZ1?= =?utf-8?q?HmBoTUzSAwhz/FXqPTQAChLFXkD1nw6ONIGIR/KXxPa8uiugJfn5R/lkYw9Yu1Or+?= =?utf-8?q?5Xhd1Q+YSEgD0DFClLT7DBG5t4nips14dcc6einnfxGjDYXr29w5BhNWaA0owhHHa?= =?utf-8?q?x4JbE0d+RbLMctCwXC2tteRUPE3l3WNPFiShRxII1cTGIADfmb+L8m1sua/jD5ck1?= =?utf-8?q?daskm0Ecz63pMrrTVL/SY03ImzceJat1ykMFCuXzaX4lTf6gl5nphqzy1JxI3pL2/?= =?utf-8?q?pT9xp0mPdxwv3t/vKoMOO4bhZ8QSh3XL1SudwuWk7g7j7yk6HZDbqDHlEjl7ck7QO?= =?utf-8?q?glePC2IcoLKI5N4F1m0Gzwwq9MiLbrRhWyhPHiAYkQyz8DIKUsskmz+PS3XQs1zWn?= =?utf-8?q?HwQA/vXyCcgEOVVDSRG8jrAahg7Gnsj/rHroYqRLU8On0WpWuZwZaW5kwsyKaokhQ?= =?utf-8?q?xvLwjAtG9sWy3xaHNA/tdvV2SgXwW41aAUyISPYF1pXGsYThRBcOMa3j4Cu38Gm8z?= =?utf-8?q?KAhaYeNFbZPYHN8FQOArRNKX2gNXLivHm+I7CiN2yAXx32k4LwalTG77pLJWeIXtL?= =?utf-8?q?EQyxzXhKrLJMjsYrqcy6hpKP7H2FcO3AoRtGpv1h4Z42bSOxYGxpDWkSotr97D3N7?= =?utf-8?q?VoP8/PAue6Ri0nA7MshGS3Ay1iSvF+mGd3oAwz4J0kdJoTVPtqtElFJiHu5hDAXPA?= =?utf-8?q?UiBEs6nd1oNq6H6M9sXtK6xMG65MH+pzJny4NjUnv5uq0hec0IXcOWUcTJ7WkKUZJ?= =?utf-8?q?bm01MMirMFdRr5ut74jZVcb5DD5bqznWgEdBu9aYXJc8wNvrntfBi4cJmHY1A9KAh?= =?utf-8?q?kKFmgsMyxBLY3AQ+Ywi94EW9ZM8jDGxnlDga+G/ExzTHtUxvYkKGF/cQzmK3SR6W9?= =?utf-8?q?ZFserDyBrJqV5hKgiflW3C0Sn8mgjvRSL9BW6nT34+a+91HgGjlAjAM=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3997.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(10070799003)(366016)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?FT7udVW0yD1dhpPBUDKx8Hec5H3s?= =?utf-8?q?PcaSk0tWnNyn9XNmuhD7KpR296j92oDt8Un13tiyTAY28TLq613d5D2qYIyNgIgBd?= =?utf-8?q?59Pnc90Yt0FXIeQHyK4tC7ea4wE+9nY1E5eZvjRfNlmZuI2ZC0hEbMvfbQ034RN8M?= =?utf-8?q?x4emxdoLECQO2IYe2ejhKyfZDopAIuFXk8jG3GE23GK66Yi120d4T08+W6FX2JDKS?= =?utf-8?q?QU6y/vnrn2C2523SgufwlvioPNK7oV/AXy194zB2JOpEo/fqhC7nMlm8dkXspGurW?= =?utf-8?q?MTeqVad5SCKxXuRxN3IjckvpLrH6HuwEdpPSp0lSHbqo4MtbDgM5uwP91Sfr/Mx6j?= =?utf-8?q?2/1eLuzPqs/qKEtiL4QDURiRJ70iuPzFmStE9fN2KeCKUq28FcT3MSdKddcCVJMGG?= =?utf-8?q?W8xIvTh8rH5GESF1LvO41Fxu5+/FwTajY8X5hl8aa36lrwoSkTP9phGZT6K1vEf5f?= =?utf-8?q?c6VOPU8IWUbZqIf6IqNqeyfleAhI8DYOhSc/6XS79mEGN2uCrTRUmoiE12ANaP+++?= =?utf-8?q?gxTijlNeCO0plN832DhpdF6NQ3m0MHHVsmHiEtZZoHKX3UNlV6rpbkR7AgOVD/Fqm?= =?utf-8?q?eSd45BBr3oR6YAHy7dorGAOGYUk6QCPy6LyFIDFuiTr6JoVllz+t0Gk84Tq/+Ht/r?= =?utf-8?q?g6J7bWsjn4Ahu/K24HYuCcXLKpUbr2cLB4atlqmlOBwlKGHibxY1V91mwcB87pea8?= =?utf-8?q?7/3nMiPxSSFfWocwlcTOGtsTl0qYdxRf8gmLzZiVc0OziJI0j3TfPAM3t2+IEmxBi?= =?utf-8?q?1R/L30KSjzWxsJvkADkeXS4byGUkp0Uyt+bYmum7KrYkm+gJNEn8DivlSNMiLaIuO?= =?utf-8?q?BPUOHzpAOnppdji0di8PH0wyBoxKqi6J11v8l+mAuvFFyrNTRq9vBBaK+E4rahZ7O?= =?utf-8?q?s7rFvp2wZpmdm3thDaLiL5PYBcM1ieKCwiYo9yRpjly9DXWWoqiU/CDqhRRGHfKSb?= =?utf-8?q?B2HeBj71XwyzK151uVMXNsGKuwwHyPhO2U775t9C85ZtDPdu2wZ19mPlE2wkB/jQD?= =?utf-8?q?36afNunAyD9a8icrrDTcIDN1gr7jC8UAaRFJbYi1CKjqpbzXlG+0HDWGprpklDAaJ?= =?utf-8?q?3L4DhcuZBEVM/6L5FTgV9WxrK26FCEFpxHEIad0DnqdzFwwaPFnE+9fe/OhP8I4Fi?= =?utf-8?q?r6sG2LOvxHwXyl+n1qkkAIi8XGh4UoPDBdr5hkfBB0H5B5ozDvN9yMbY4yexBNOeH?= =?utf-8?q?qLZ5/HQEJ9tpJw6Iny0y6aveUnBCJRTPGTNfGxuzfOTIuAKhuD6s9FQkVuzaZo1BD?= =?utf-8?q?J6YdJGHaglU6D4SirNGVOwe3OQ2rCT0c6JRRfQ5hgFeeBfSyyCy3dEAEbqRhjEnrY?= =?utf-8?q?/oICgtG3tLV38qbV41cPDkca5FVED4J+exUZG7Crz/FWGzfKwlYvLbI6zGSUy3KQs?= =?utf-8?q?IGuW3CbKktJZnjQytFPzDJwc9ANFkTNkv+6dBN34qSnW3xZtS4fAEt/soH7nuiu1h?= =?utf-8?q?vFHnORbrudzWnmtOWD3n46Lmv8Ue3VoG9mbRrZ+f450yVJkxqeLTMwRm7fA3iqkph?= =?utf-8?q?R5pkk3zBj3r0BwOLngntQg1+3y1xY+jDbmJ37ySRNHNxKcwEXpGL0ysei8MfDO/L4?= =?utf-8?q?apfv6KLD6Nc?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 49bb5603-dacd-4495-2d1d-08dd5b24264d X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Mar 2025 13:54:58.1406 (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: Jp2RLjaAD1JdMVFF29evY+uEDKvv8dvJSK/uYDlrUQwpg8ZqGkoOvwTbdure2mHX3AJRA16e/ZisTTFvcpV5iw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7874 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 Tue Mar 4 13:53:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14000771 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 2CE57C282D2 for ; Tue, 4 Mar 2025 13:55:14 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4CC0E10E5D2; Tue, 4 Mar 2025 13:55:08 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="ezMSoVjg"; dkim-atps=neutral Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2080.outbound.protection.outlook.com [40.107.243.80]) by gabe.freedesktop.org (Postfix) with ESMTPS id EFA7910E5BC; Tue, 4 Mar 2025 13:55:05 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bo+SHqn9Tws/HU4dU1w6Vpa+TDVhisauiN31Vd0UBFUDHVrL5jfsYoZXgyHpW4DwuU8UoZUM8Aewm2RbT7R2RQJohE8CtVN76fKPZWYmr3ZKngp44fou3AaiH4fcmN6UhloxCsrC3900OTGy4D0KxHfz/VYL2PKd7MTJlsT23eyhM6UOyVGHl/5qdOTIlD3ypQKMXkaG8m27/IOLQeQyglgDmLWLY3ELomqp7laEq5M82vY5elN8AMy4V33gmqLFggHcbIOHAurih4gEkpVV6JyqOcO37iNInBd/EDfh0DO7Kqm+rbbwGXrcxJDZszEk/G7AjA78vppPJeEqGat08A== 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=XgW2OlT414OYt9eoVnnxSyIHem8CaSZ9N6r8fJ5Rwy4=; b=foGCrWF+9R9/MmHBMBZ234od4/MzpWCQQ7mKgMDIkXTN056+9w8fdWsM4PJzes6XxyY4C3f2rVgMoTBY/Jv+Ul8BsH+lcnhj+tG1IgfjHbXN2XUsI+bLw5b8e902zzp1Ax+sAziPgCgybVbI0FbSZg5qfdF65RgwiKZ+aDl6a3B6bVu3GOIJTNdT7gB5t2FNhgyolIwbe+WHrHhNrXkQO1oE5CY4EsGD1msqo0v9r5VGZ3x916PKOCOMsliSgWDDtLJ2N3R6u67OA3r19nuaMDAJfg6119lgh/9JbHwz7rwjlhTxOEq8TsQ1h4/Bv8jJSBiQMJ9BzuDTZPgWHy8DXg== 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=XgW2OlT414OYt9eoVnnxSyIHem8CaSZ9N6r8fJ5Rwy4=; b=ezMSoVjgLerTG2ovicXG+5viiU4foITxMa+koRzyGbFHL4uwrhVncuyFhyha/Ocm7L5pBf+To6/2P81jjjRRb3cvsnEkyfg6Ww1KBaDyE08oA7pPGFRznEWfOveOB9QHPLMJFDpLi8NmEYBJ8Kb9Tu9EoRtFmFuV64qD7UrXXC2XNKClFjcit/Q39k1/Cd+nnYdJiTwvbFnmjMqPTKd11B7W43pjJP/du1LDO0BBdmlGrSWO1EO/HO3aEaSU16Ebm7tHf9iPkOvkLges3R4/vPjqnla3V/0fA90RROXRMBUeteMdxGZLE5wBeDzN4NJhJ9Qm1XXAJIvHYD3th7g6jQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) by DS0PR12MB7874.namprd12.prod.outlook.com (2603:10b6:8:141::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.25; Tue, 4 Mar 2025 13:55:02 +0000 Received: from MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316]) by MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316%6]) with mapi id 15.20.8489.025; Tue, 4 Mar 2025 13:55:02 +0000 From: Alexandre Courbot Date: Tue, 04 Mar 2025 22:53:59 +0900 Subject: [PATCH RFC v2 3/5] gpu: nova-core: add register definition macro Message-Id: <20250304-nova_timer-v2-3-8fb13f3f8cff@nvidia.com> References: <20250304-nova_timer-v2-0-8fb13f3f8cff@nvidia.com> In-Reply-To: <20250304-nova_timer-v2-0-8fb13f3f8cff@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: TY2PR02CA0014.apcprd02.prod.outlook.com (2603:1096:404:56::26) To MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB3997:EE_|DS0PR12MB7874:EE_ X-MS-Office365-Filtering-Correlation-Id: ca6a5628-8c05-423a-944a-08dd5b2428f5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|10070799003|366016|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?h7P6nKmDl+AHDl6454O+UExjMxkZN75?= =?utf-8?q?2+o3T9j415BKHlg29y+rjpuI8CTUlU3TrMissmq4FfJbw5bdbqjkqeeQCuYT4thNj?= =?utf-8?q?/4sGIF8WUHkhPbmaLcafyn67Pn/2hSSREk8e2A/q939UKC0w65V4JQq9ucK7aGllA?= =?utf-8?q?rssjzGrlWb3ZH81h3NOXTh3a240y0pfLUDKdCMoaMCO8ts87MZw7Az4edaFu2ZQzY?= =?utf-8?q?6xBTYzWkJBZ70Sr/3WFBPhU8URbDgJyoZD9x7/QgIqx5mfCmaunKpdr+tD2qhpAJs?= =?utf-8?q?f6jqdkandkfR5TJhABZrl+1fCBJm5if0KqN+RSre2/ckKrcilpT+j/MV/XP5qdJze?= =?utf-8?q?Ns0uwoWjFn3Un5a2Hfc1TT9dmbVpOeEKVNy9oW2ow7uMSI64t089gQeqNgs/ZRmln?= =?utf-8?q?PkURc1Qx49nJFNHrCrmC7gZP7nLdiJTZoa+zkaX3QUPG+rTRC48rcN71uQinflnZx?= =?utf-8?q?50VECfhv4k88Nu1jbQfORf4jroFS5EBdfdrQ2UanwbUWMrO5SVqCscG6LWCT8ytUB?= =?utf-8?q?pgi+DniBZmecvNzwQaA60rwepww9YURrMXCF2gAUJIBmO2Vk0PZjGTBPOgu3o4rs8?= =?utf-8?q?iRuhmZVC1dVC83y3+NGD8H1q08/IctEXV4aZDxDDObJcW0vQkCVluwcIg/WS2hqmk?= =?utf-8?q?gas5tkT5WoSMqG4yEWD82wsViYr/YFRwNttuG+W5U9Jezp52AJbP5A4G9J7Qbrj9t?= =?utf-8?q?KJ7V0B+hy/oaa8L04mUnZJoJ9o4rdlbT0bZz1sQhYdiHS1mMhS23SZIU8SoYr73Wp?= =?utf-8?q?XFk19wCaMPkaeivFigQZwspCwjL/Bcz3LF28smVAEFdqBFiZiPAcA4IyYSNs17/Jk?= =?utf-8?q?eqW9LOkhkVL7+zxNzDRZElC1kXNP3IdkbW5vr5rR95SPCBTLuPj4g6t3ld/6gQ59Y?= =?utf-8?q?Y0ZVWYnMEx9caO5w8ZhKWDwCeKyhSxYvUYpuHSEz6qeinxewm9XWpa0bylmlfTs15?= =?utf-8?q?kunpqUX0Xa1tDGq9gpWh/5KM68g8ZVdAwXzY/HrSbrR95p45SApMoD3Fqj6TgjcOI?= =?utf-8?q?5GaTzyrJMyMgpQ04PW+EXXOz2f4MOny3HRoWcuD6V0HSgX3QGSWN1tOGDCF3Njurg?= =?utf-8?q?bjYdtYorjEfRKATqdARYBruo2geVxMzVX+4tvHNAzLoZoleCe8LDUFFskieUn81UE?= =?utf-8?q?hDpE14yG4Kq1KhFyHHMuH8bNtANHK04eOUD0XYi2rGnq13EQFQwrEShfVxPzoY1tp?= =?utf-8?q?nLxcjtQuQvP887jiJwYLiJW6rNtIidKCCExvv2GhRZ+5lz+q3f/ON3VROSJzrW+gW?= =?utf-8?q?2kQ5dIeiy7vUZYCBUC9UHCBlr67xzIM4N8PyMfydSceSYtKjGHA89n8EyOmxub3qG?= =?utf-8?q?hiFMMFiZfKYCT0gtbkjwwkNGqgBHmst5D7qzaY6b1oeNciBdX6OGy3M=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3997.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(10070799003)(366016)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?qzyh+yyVPz/PH+BlnZhLIxG/uBCc?= =?utf-8?q?MZIb4TnO9UlQLZyVCWXYP92CYbuKJYeigRce7yEwbE4RvP9uf2OmQgQbttTdbsS82?= =?utf-8?q?KPg4g3iAqh8h/oT+1fObdft1Ch8fuelwsf/I4ZAGxZiyiGvmcTS7DsQ7+OA+TCpcQ?= =?utf-8?q?cl153DBCaMyRm0yV2Q2brBlq8wZ+5Niz6I/qUTk0LGDVEqKdMn1f3f2mWVd0t+wyX?= =?utf-8?q?HNdvVpkdpArUlBIAdanKKGylcSeQltbCD8NWutY81rKa44UAxxuxfBsHzH4BDZwam?= =?utf-8?q?r0atr1FHrVamUtnFcsITyroXPyG7lymlrZbIU3dzhykMOtUJ8nNOhQfL+Yh8juUlT?= =?utf-8?q?MJcuPG/w2y0b7IXv2DBkGLhn2YBfvquEKPF/3/skuvOGgx02V+VaPUwu8AIMPp6je?= =?utf-8?q?8Rkh7hm7M0CT6HRLnEGNCPCldpkNEGVMwrpJ6xZ8pWceawNUrUw4hxxykwsW23ksP?= =?utf-8?q?sH/mbi34s8O7f55J92dRZ8wvsWqR9g23pXfFMusjn545DLzw+CpmFghvFyzDUoSuW?= =?utf-8?q?lJQSLpkKT2mmlJpLwvKdl3uQKgzKzw9UzAcCpr21CwDOUpnM8efgSf6EF4prMakM5?= =?utf-8?q?j66Xtbx2Xfchfqq4bgl0fvBvkBfWOpoqNLkcxGQwZCkccmP74A9b7Jy97HFkcmS2r?= =?utf-8?q?b6l969e0DGMWVJrJwp0RqZkztdwFjte19GUhaCKSA/U8jnxuoB+YhoZSTM3IM8FYC?= =?utf-8?q?2Cv2+rVqBQHLIGzZN9dbjs8xsmAl82FmOenGGpehY4FHh1StlQ2FTLKEQxiTogfCz?= =?utf-8?q?dK7eFhSighsNGwOiqhJ9S122HC7RhxVvY5bhb0YaMiQi92iDML0V79mUDh439yrQg?= =?utf-8?q?QieNWLcd5LMSqkJ2jyHTnm3guRPkMWMxZQt0YBfmMEh9omDmkrN7McG8NHOUtNCLv?= =?utf-8?q?snQP0F6QhNXTJo47Y7TFGtPnc4M1kIgLqMD9IPlz2MA9vI5FQF5eu00OT+FW0TTMo?= =?utf-8?q?N0RA39DAPOQXFdOymBvbh+GyHfaAU75UXzTB5dxOHkq9HATotvNQkVflld9QFK8pH?= =?utf-8?q?CrN0We5fu+9/NPkDO5slnrSohsBno0Snf3c9xFJ9Sl/K99wlmzABZU9VnHb1A2R6u?= =?utf-8?q?ywUoKt8sDeOdytIEpfSsK/69VjFgsmwtsXGVa8nvVBx0tpOVNg3OExtvKz6J/f8K9?= =?utf-8?q?spskj1tybZEeNrn5Je9rzw2sZ16jdCdKLWMWOfF53QneAnrNnS81WBS+FuAM6TTKW?= =?utf-8?q?TnHgPMwfOvAtBe5UGPwojLC44c/OreX5ulbgplZDpYNh/n2AUdvyQz3Px/ttr6qhm?= =?utf-8?q?eK83HXDlMbwX9me97yZKeHRID09n8JyOHgLExaQBm8xkSl9YWt7MPSzm+9P7iqrDf?= =?utf-8?q?6Gt3mHpSbUJ9hDSJTzYmGDrGsE/BHav6cCG/OKL4bl+5XSspMuqkqoAuihpK2C4RN?= =?utf-8?q?2ydp7Yeg78AWeoGhfvd4/PryDj6+YY4522Wy3roO5ErXCdGv27J7bygZuJctAb+0t?= =?utf-8?q?2DbcEmOpHBUGGE3OJkSLummjNBruV6sn7Lpvxdq5n8Wp1xzEwTO0CGrbt+xuYERHt?= =?utf-8?q?Tibh0i5/DfcbwtZ3h5zXpnQGn9KMQkkU2mbMCb4ZFISoUrnTtpB5HjHEtXEFS5xwt?= =?utf-8?q?o6d+RNQh9oc?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ca6a5628-8c05-423a-944a-08dd5b2428f5 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Mar 2025 13:55:02.1724 (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: k3P2nmZm+dZ1a98Ha/GzW3nCTzWYFw+l2nP74asoZHufV1GoNl334t/8yGNs94OVAg/uwSXnI5ax/NtmQ4tWRw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7874 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" Register data manipulation is one of the error-prone areas of a kernel driver. It is particularly easy to mix addresses of registers, masks and shifts of fields, and to proceed with invalid values. This patch introduces the nv_reg!() macro, which creates a safe type definition for a given register, along with field accessors and value builder. The macro is designed to type the same field ranges as the NVIDIA OpenRM project, to facilitate porting its register definitions to Nova. Here is for instance the definition of the Boot0 register: nv_reg!(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"; 25:20 chipset try_into (Chipset), "chipset model" ); This definition creates a Boot0 type that includes read() and write() methods that will automatically use the correct register offset (0x0 in this case). Creating a type for each register lets us leverage the type system to make sure register values don't get mix up. It also allows us to create register-specific field extractor methods (here minor_rev(), major_rev(), and chipset()) that present each field in a convenient way and validate its data if relevant. The chipset() accessor, in particular, uses the TryFrom implementation of Chipset to build a Chipset instance and returns its associated error type if the conversion has failed because of an invalid value. The ending string at the end of each line is optional, and expands to doc comments for the type itself, or each of the field accessors. Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/gpu.rs | 2 +- drivers/gpu/nova-core/regs.rs | 195 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 158 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 7693a5df0dc11f208513dc043d8c99f85c902119..58b97c7f0b2ab1edacada8346b139f6336b68272 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -164,7 +164,7 @@ fn new(bar: &Devres) -> Result { let boot0 = regs::Boot0::read(&bar); Ok(Self { - chipset: boot0.chipset().try_into()?, + chipset: boot0.chipset()?, revision: Revision::from_boot0(boot0), }) } diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 50aefb150b0b1c9b73f07fca3b7a070885785485..a874cb2fa5bedee258a60e5c3b471f52e5f82469 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -1,55 +1,174 @@ // SPDX-License-Identifier: GPL-2.0 +use core::{fmt::Debug, marker::PhantomData, ops::Deref}; + use crate::driver::Bar0; +use crate::gpu::Chipset; -// TODO -// -// Create register definitions via generic macros. See task "Generic register -// abstraction" in Documentation/gpu/nova/core/todo.rst. +pub(crate) struct Builder(T, PhantomData); -const BOOT0_OFFSET: usize = 0x00000000; +impl From for Builder { + fn from(value: T) -> Self { + Builder(value, PhantomData) + } +} -// 3:0 - chipset minor revision -const BOOT0_MINOR_REV_SHIFT: u8 = 0; -const BOOT0_MINOR_REV_MASK: u32 = 0x0000000f; +impl Default for Builder { + fn default() -> Self { + Self(Default::default(), PhantomData) + } +} -// 7:4 - chipset major revision -const BOOT0_MAJOR_REV_SHIFT: u8 = 4; -const BOOT0_MAJOR_REV_MASK: u32 = 0x000000f0; +impl Deref for Builder { + type Target = T; -// 23:20 - chipset implementation Identifier (depends on architecture) -const BOOT0_IMPL_SHIFT: u8 = 20; -const BOOT0_IMPL_MASK: u32 = 0x00f00000; + fn deref(&self) -> &Self::Target { + &self.0 + } +} -// 28:24 - chipset architecture identifier -const BOOT0_ARCH_MASK: u32 = 0x1f000000; +macro_rules! nv_reg_common { + ($name:ident $(, $type_comment:expr)?) => { + $( + #[doc=concat!($type_comment)] + )? + #[derive(Clone, Copy, Default)] + pub(crate) struct $name(u32); -// 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; + // TODO: should we display the raw hex value, then the value of all its fields? + impl Debug for $name { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_tuple(stringify!($name)) + .field(&format_args!("0x{0:x}", &self.0)) + .finish() + } + } -#[derive(Copy, Clone)] -pub(crate) struct Boot0(u32); + impl core::ops::BitOr for $name { + type Output = Self; -impl Boot0 { - #[inline] - pub(crate) fn read(bar: &Bar0) -> Self { - Self(bar.readl(BOOT0_OFFSET)) - } + fn bitor(self, rhs: Self) -> Self::Output { + Self(self.0 | rhs.0) + } + } - #[inline] - pub(crate) fn chipset(&self) -> u32 { - (self.0 & BOOT0_CHIPSET_MASK) >> BOOT0_CHIPSET_SHIFT - } + #[allow(dead_code)] + impl $name { + /// Returns a new builder for the register. Individual fields can be set by the methods + /// of the builder, and the current value obtained by dereferencing it. + #[inline] + pub(crate) fn new() -> Builder { + Default::default() + } + } + }; +} - #[inline] - pub(crate) fn minor_rev(&self) -> u8 { - ((self.0 & BOOT0_MINOR_REV_MASK) >> BOOT0_MINOR_REV_SHIFT) as u8 - } +macro_rules! nv_reg_field_accessor { + ($hi:tt:$lo:tt $field:ident $(as ($as_type:ty))? $(as_bit ($bit_type:ty))? $(into ($type:ty))? $(try_into ($try_type:ty))? $(, $comment:expr)?) => { + $( + #[doc=concat!("Returns the ", $comment)] + )? + #[inline] + pub(crate) fn $field(self) -> $( $as_type )? $( $bit_type )? $( $type )? $( core::result::Result<$try_type, <$try_type as TryFrom>::Error> )? { + const MASK: u32 = ((((1 << $hi) - 1) << 1) + 1) - ((1 << $lo) - 1); + const SHIFT: u32 = MASK.trailing_zeros(); + let field = (self.0 & MASK) >> SHIFT; - #[inline] - pub(crate) fn major_rev(&self) -> u8 { - ((self.0 & BOOT0_MAJOR_REV_MASK) >> BOOT0_MAJOR_REV_SHIFT) as u8 + $( field as $as_type )? + $( + // TODO: it would be nice to throw a compile-time error if $hi != $lo as this means we + // are considering more than one bit but returning a bool... + (if field != 0 { true } else { false }) as $bit_type + )? + $( <$type>::from(field) )? + $( <$try_type>::try_from(field) )? + } } } + +macro_rules! nv_reg_field_builder { + ($hi:tt:$lo:tt $field:ident $(as ($as_type:ty))? $(as_bit ($bit_type:ty))? $(into ($type:ty))? $(try_into ($try_type:ty))? $(, $comment:expr)?) => { + $( + #[doc=concat!("Sets the ", $comment)] + )? + #[inline] + pub(crate) fn $field(mut self, value: $( $as_type)? $( $bit_type )? $( $type )? $( $try_type)? ) -> Self { + const MASK: u32 = ((((1 << $hi) - 1) << 1) + 1) - ((1 << $lo) - 1); + const SHIFT: u32 = MASK.trailing_zeros(); + + let value = ((value as u32) << SHIFT) & MASK; + self.0.0 = self.0.0 | value; + self + } + }; +} + +macro_rules! nv_reg { + ( + $name:ident@$offset:expr $(, $type_comment:expr)?; + $($hi:tt:$lo:tt $field:ident $(as ($as_type:ty))? $(as_bit ($bit_type:ty))? $(into ($type:ty))? $(try_into ($try_type:ty))? $(, $field_comment:expr)?);* $(;)? + ) => { + nv_reg_common!($name); + + #[allow(dead_code)] + impl $name { + #[inline] + pub(crate) fn read(bar: &Bar0) -> Self { + Self(bar.readl($offset)) + } + + #[inline] + pub(crate) fn write(self, bar: &Bar0) { + bar.writel(self.0, $offset) + } + + $( + nv_reg_field_accessor!($hi:$lo $field $(as ($as_type))? $(as_bit ($bit_type))? $(into ($type))? $(try_into ($try_type))? $(, $field_comment)?); + )* + } + + #[allow(dead_code)] + impl Builder<$name> { + $( + nv_reg_field_builder!($hi:$lo $field $(as ($as_type))? $(as_bit ($bit_type))? $(into ($type))? $(try_into ($try_type))? $(, $field_comment)?); + )* + } + }; + ( + $name:ident@+$offset:expr $(, $type_comment:expr)?; + $($hi:tt:$lo:tt $field:ident $(as ($as_type:ty))? $(as_bit ($bit_type:ty))? $(into ($type:ty))? $(try_into ($try_type:ty))? $(, $field_comment:expr)?);* $(;)? + ) => { + nv_reg_common!($name); + + #[allow(dead_code)] + impl $name { + #[inline] + pub(crate) fn read(bar: &Bar0, base: usize) -> Self { + Self(bar.readl(base + $offset)) + } + + #[inline] + pub(crate) fn write(self, bar: &Bar0, base: usize) { + bar.writel(self.0, base + $offset) + } + + $( + nv_reg_field_accessor!($hi:$lo $field $(as ($as_type))? $(as_bit ($bit_type))? $(into ($type))? $(try_into ($try_type))? $(, $field_comment)?); + )* + } + + #[allow(dead_code)] + impl Builder<$name> { + $( + nv_reg_field_builder!($hi:$lo $field $(as ($as_type))? $(as_bit ($bit_type))? $(into ($type))? $(try_into ($try_type))? $(, $field_comment)?); + )* + } + }; +} + +nv_reg!(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"; + 25:20 chipset try_into (Chipset), "chipset model" +); From patchwork Tue Mar 4 13:54:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14000772 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 078ECC282C6 for ; Tue, 4 Mar 2025 13:55:16 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 24FD010E5D0; Tue, 4 Mar 2025 13:55:10 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="d4o0IT06"; 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 B399E10E5D7; Tue, 4 Mar 2025 13:55:08 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DISAcKVtGr/m6HMx00YtVSLik9XLXf61ui/mbrvEG+KfdxxNU/z1XX0eK0ACjkj27rwFfoVywQOmuJZYtKxm298i8d92BjIWzguK/9F/PhYBdQDKjtsJakZc6oH/Bb51+qj/8I26mU+6n1LnDY21SLewlrH+BE724CIekVUivd0c5cT6SmOiBjBeFDd/TalF2QT68urU/cFiBRgg8igsXt4SBGU1q1hz8q5XB0jGcsposkxiage81FW0vI4khOeqnk1N33zbvBOSnqDdgmarpXyu3StQEswIuOodm+H7WchhhvhAQxrIVlCASBtx611Hk47arKysEpY4fVJaesaTbw== 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=wrk9cVRDcIB3ketMyLZPufB/GYlGfdXAsIYEsarYDHc=; b=JekWVmWIk5cDfhKO/w3hTyEJFkRAlAw0w2wRQejMooS6nMeWB92zS42jk1EbW0HmGoOvDaQljfAhSW/Ck+GUXq57RcG5MF/LVwsO5vvKMlsA6r3aOFNPIlzIQ7ua7gjeyLw/3dvChbwMTN2Ib7JlmtRTgiFuGY3W5Ul1a77ULP5j1APHFU7CwD5a3gEKyUft0xwRHvM3oWGrcUSqfjUpxJzboXfVHhYzPQEQxM7v+Nx4PK+bw6wYJQ2FpjTiqE7Pb3Vo2WrtTHHcrbEo2wnH4UZIgPhjc2hXZsd+d3QdqLk+NccQ3idDrzcAImtqbIVlqZdyOT6EjoPQ0p4+ctRrkw== 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=wrk9cVRDcIB3ketMyLZPufB/GYlGfdXAsIYEsarYDHc=; b=d4o0IT06ySKWfSWlz0qNkapHIwo21xqNBQ4gBA8zCnzxdcct6vJ9Tq3U2EcLZqIT4WVOyt76qO2g9eqsoInAA566WT02R3cSXkGnbkl8sIDALgth2311Z8PZKRSRoxGshUuVgDJ2IcMaigUB/3hnsEPLtZp8Z99kyvbDP1lSFTDu8NE4/oysjkwez49selSz3mBpHkgRcDzQYfiLDwDSaT7KW5PRu4CH65m+N3azb9TlYnR10MrF2nme3jlEYDBCgUFFn+7yBP3fUdkeltH/JyIA5kR/YX6OfdMfMOVrl8Z2JKGSVZ65V7NyCUaj+SjGisBuOFvPi1NDcYKykNGUTQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) by DS0PR12MB7874.namprd12.prod.outlook.com (2603:10b6:8:141::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.25; Tue, 4 Mar 2025 13:55:05 +0000 Received: from MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316]) by MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316%6]) with mapi id 15.20.8489.025; Tue, 4 Mar 2025 13:55:05 +0000 From: Alexandre Courbot Date: Tue, 04 Mar 2025 22:54:00 +0900 Subject: [PATCH RFC v2 4/5] gpu: nova-core: add basic timer device Message-Id: <20250304-nova_timer-v2-4-8fb13f3f8cff@nvidia.com> References: <20250304-nova_timer-v2-0-8fb13f3f8cff@nvidia.com> In-Reply-To: <20250304-nova_timer-v2-0-8fb13f3f8cff@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: TYXPR01CA0050.jpnprd01.prod.outlook.com (2603:1096:403:a::20) To MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB3997:EE_|DS0PR12MB7874:EE_ X-MS-Office365-Filtering-Correlation-Id: 1a2917b3-ae80-43ca-540e-08dd5b242afe X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|10070799003|366016|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?o4xCvZbYF3oLU819LoncwLNPyyt3/yB?= =?utf-8?q?U+W2bnwuMm54hyg75M23naY2RBTArdnnEdb+wlkBU680/NXwYzbOBcU0sgYcyR9wt?= =?utf-8?q?GNRk3gyhXjzh8SyL0MxN8FvadM+IFs/j0esxHx/AbzrLT8tLhwgLrKi7iuMegKkfV?= =?utf-8?q?5D7yVBgZh8rwHLod36mn5WwjiJCyLEMsd4Xi/PfEbNrIMJy0xtmXeooVFKkmuJam2?= =?utf-8?q?2EEnmZFfD19V3vEo2ARPl9Kfo7xNpShXotd1mvff+asfE9+9nzZGKuWPOqSYJoY4T?= =?utf-8?q?Dyhq/PRvt5WKI7t94U3fgnxqvqUThl9vZmdHFG3KfVwo0EE+9aSD0aJFlGDMBDuij?= =?utf-8?q?U0QQkvyRQJkRsW2350pXCcbarYzZ7cxRHw2MNfXg17bQgAoWeeX9Wy0N007Jsh4h2?= =?utf-8?q?iRRr4DHld7qzGeyrxpN+OGW76m8OWz7ysK19Of8nz/fEQUzuRGkWeHyJSEq5eDf54?= =?utf-8?q?RjvQLuXu8hgxC5qnUGCyv1MBpYoFakMaBBuAJBu1264QXXG1+YIoBCjeX3r2izybz?= =?utf-8?q?z+SCQsCgLcXF8TaFbrJ9+yHaI5bpOpoTNk+kPdlhhTgIxu3F5mgIigXAF1/qeGa3e?= =?utf-8?q?EJIDGmUQAG9P6gqGicdsrotD/ogJIfUBt4WOa2N+kp+ugR6NCiyRovoE73ckiCI/L?= =?utf-8?q?Q3cDe2IaGtdHYaPk+kGr0PinHJEcNymO2UL8P/3wWTnkJkr2CosVRZAYdSwjVfwC5?= =?utf-8?q?16wTK4VNT7FPhtzUWD2pMtIApGeR0WaPnETnBu71/fuQ07sr9GvxgyxKBj0KjlIj2?= =?utf-8?q?F+5ehMtcDV4nlVb7zfso61/oUZuSTCEtbw/Dl/LY3GvCjwHYSg5//uORbY1eA4qzl?= =?utf-8?q?zsZVMH8jca8rDFl6LEzS2SJncNuP2jnHr2BRDupadlBiW5LsvFtYofWTrxC+FEC4u?= =?utf-8?q?DhRlG6HPHRzMh6AU0dhGUmpP0m2X1R8bP3UEptznnu4OVJ7ImtMxV4dr+XK73tAuk?= =?utf-8?q?jByokPEO3Od1g3yiKwLVsJM9Swau3IpuXZaZrI37ZIQZsSNywXFey7Z3uCv3baQY5?= =?utf-8?q?Cd6w+z+zdkMbfygtae0gT2IOcRV5/38pOh8uODlw3eHFOI+S+P+nxZLRYwoZDXdoJ?= =?utf-8?q?9vIfZr7nuqxqj31fy92sxFccLIiyLaJ6paqOFI01lqcZaAZxAbulx1PvnLDj6SXhU?= =?utf-8?q?wpHz/UzE9w/KAp1L/ZclFmeRPVqm16RW5CoCev1elQ1EHQ5aYTZjAxlNZ/4lujX+K?= =?utf-8?q?tpiDwJNzRCC4B/Dh+0zouev6WZUWJbV4GkIQlYl/JSfAk6E7CrIVDnyx3HtzXdeT/?= =?utf-8?q?cKgjQ6Ac1lPf+jLNTM3bRTN0R+M+4CcHuapbRAuOMmiYh0W53wNrqyCa23Q2OAOvg?= =?utf-8?q?MzkHoGPrt0+yscU4f/vPDERjsNtqsLE9kxTx1CjWeIincwl3nx+1xVw=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3997.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(10070799003)(366016)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?U8DHHlXclhrFtUf3M1J66mW9tuAr?= =?utf-8?q?N9hIcBtTkvdDIx4SsXRnteoVamgFhmWwtdrOulcH2Wb5lfhU3ll7sHFBFft/TAy4T?= =?utf-8?q?STqShxuTpT/NOuH+Y3LuKkcnPuga23WylwRr34vVPiTWt41TeXRXPpJSyNXmZyjiY?= =?utf-8?q?nD/9QcUShqJDZSzORfYZqryQ0a79Ir+EqawXJ0WXECGhfxyfI4f58yGYRte29ouNQ?= =?utf-8?q?B8cw5JxECJlbFC9fcQ8BziBKE/9lTTV6BquZczj2tnRHOlTxxov4pztoSVpf8ZK0B?= =?utf-8?q?xb4wiJQ+pMco8otkUjYVa9AzeeokQ9ZXZYoha7i73J630aGs+ylFjzxN1JBfyHLlV?= =?utf-8?q?f71kK2lsK0cCe9aaX1LljcZtZO8/WqHsiBnBphjLqZKKxaHVLh73zGrmKcgOWyhjv?= =?utf-8?q?ms80VorZvis3PRJzTyj9IZqNFym1xNS1428Y70xhJtj3r/gEC5GYNVmJl8zJ80pRY?= =?utf-8?q?FvylCIaLtKVonbmreh6wm5ra1mZI4rVH3ryLCiurmYdIxF9U2GkoLdZZ7w0NCiTFn?= =?utf-8?q?pOJ7v27Vojr2KZqeog8eeOUwnOu86QoeU71NT8VLWR+55og+hrZxmZOxIpKpJXSFM?= =?utf-8?q?QbIAyF0yC1+/7/Rk6RPl+285irKjb3zPQNTDyFQHjv/NICD9u6hL/LpHuy19xln9U?= =?utf-8?q?NQCpz+FPuhz13HeNqkpZLP7nNNo8axRqoD8sIsJCtRBMTlfnORCJon4mfLNLOUQKA?= =?utf-8?q?a+YpEdWq6VFhnJ2Ilt6TA9QSpR/Xhv5FAXSsOF0elltbwL8PLyizC2TiMrz9DEScx?= =?utf-8?q?96rEUyMrukmKxsuMpru2cPDtB7ppYb99b+7m11bejl09k/1WE/JgljK3fRnxT9894?= =?utf-8?q?GpVfC99NNePSNkvX5hG1SfmeXdySzWwJi+EfCRXcFydnMR11zF3ecOkvdsr2ttomw?= =?utf-8?q?/W4J+QhegLHt+yHIAMSH9fNWCK7PDkY6J7ltGdKoWIzGrndNzosNzO1QnG7nw/0kG?= =?utf-8?q?wlEm39HxJUJafisHUe9DPYUhXKGgpYqYsw9f0MpNOj2j+6faAjhEcIm06AOWVjKEp?= =?utf-8?q?VV8ylsmpPcfmZclLpX1nkjnPLgrfFwH3ka3/KUP/GgYcRnggu5okFRz1Gp/d0/KWE?= =?utf-8?q?Nf4N0KxJnjfCtEkoUzynHxr0G5P5UiTq+Mzsmc42hDEW6nqqLB1w5rY6jEaaaoVIM?= =?utf-8?q?AtyhQt0LkRuJEDDIvYMoWLDR7upjcwg8XMa2oJgJkzh7JUpdkqSDXD2Wk7tiULcvi?= =?utf-8?q?TC5bLrmzBMpXvq2CeORq+wzipNwl8ZihVo+Z7ujAEsdNApPSHI5qwEu/ZCe6oHjFN?= =?utf-8?q?hx+ysie+qILrHdi+HcJxtcvUfD8cPViuGzaBMDGvzaKmaDvj9cwGTkcKKKRNZbNMT?= =?utf-8?q?+0TBsGa5awydXVEsxhJb6qZCOevsm04ZyAWK8OsbuBHq234k6YEAqbjtgzr6fjtuX?= =?utf-8?q?L+g6OFwb22glomb5XmxVJgLqxAQMmQHFWJ7TiMQLONHWIQcBXt393q/Q6+dM43LVC?= =?utf-8?q?YdaAq8u3YoFti4nE3W4k/Pb+p1YmWpvkGZ6grSa+l0/NKdimq39QzopIsBYMpCacI?= =?utf-8?q?uV4x7hOc5zVjOVvkFW+wcc5mmsstMb8PjY11FE/wVU/xPY0Qa5OIgFL3m1soCxEN5?= =?utf-8?q?xqSYux7XjSc?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1a2917b3-ae80-43ca-540e-08dd5b242afe X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Mar 2025 13:55:05.7285 (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: 6lLeteIk9bhzelM/Q5G+5UrAs4BvLUC7IaNn8SPzOAZtGDhXYSFJhFps9/pCpUr2xhJqZkmgVFOJxSFAb/3wKw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7874 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 | 58 ++++++++++++++++- drivers/gpu/nova-core/nova_core.rs | 1 + drivers/gpu/nova-core/regs.rs | 8 +++ drivers/gpu/nova-core/timer.rs | 124 +++++++++++++++++++++++++++++++++++++ 5 files changed, 193 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 58b97c7f0b2ab1edacada8346b139f6336b68272..8fa8616c0deccc7297b090fcbe74f3cda5cc9741 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-2.0 +use kernel::device::Device; +use kernel::types::ARef; use kernel::{ device, devres::Devres, error::code::*, firmware, fmt, pci, prelude::*, str::BStr, str::CString, }; use crate::driver::Bar0; use crate::regs; +use crate::timer::Timer; use core::fmt; +use core::time::Duration; const fn to_lowercase_bytes(s: &str) -> [u8; N] { let src = s.as_bytes(); @@ -201,10 +205,12 @@ fn new(dev: &device::Device, spec: &Spec, ver: &str) -> Result { /// Structure holding the resources required to operate the GPU. #[pin_data] pub(crate) struct Gpu { + dev: ARef, spec: Spec, /// MMIO mapping of PCI BAR 0 bar: Devres, fw: Firmware, + timer: Timer, } impl Gpu { @@ -220,6 +226,56 @@ pub(crate) fn new(pdev: &pci::Device, bar: Devres) -> Result Result<()> { + let bar = self.bar.try_access().ok_or(ENXIO)?; + dev_info!(&self.dev, "testing timer subdev\n"); + dev_info!(&self.dev, "current timestamp: {}\n", self.timer.read(&bar)); + drop(bar); + + assert!(matches!( + self.timer + .wait_on(&self.bar, Duration::from_millis(10), || Some(())), + Ok(()) + )); + + let bar = self.bar.try_access().ok_or(ENXIO)?; + dev_info!( + &self.dev, + "timestamp after immediate exit: {}\n", + self.timer.read(&bar) + ); + let t1 = self.timer.read(&bar); + drop(bar); + + assert_eq!( + self.timer + .wait_on(&self.bar, Duration::from_millis(10), || Option::<()>::None), + Err(ETIMEDOUT) + ); + + let bar = self.bar.try_access().ok_or(ENXIO)?; + let t2 = self.timer.read(&bar); + assert!(t2 - t1 >= Duration::from_millis(10)); + dev_info!( + &self.dev, + "timestamp after timeout: {} ({:?})\n", + self.timer.read(&bar), + t2 - t1 + ); + drop(bar); + + Ok(()) } } diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nova_core.rs index 8479be2a3f31798e887228863f223d42a63bd8ca..891a93ba7656d2aa5e1fa4357d1d84ee3a054942 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -6,6 +6,7 @@ mod firmware; mod gpu; mod regs; +mod timer; kernel::module_pci_driver! { type: driver::NovaCore, diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index a874cb2fa5bedee258a60e5c3b471f52e5f82469..35bbd3c0b58972de3a2478ef20f93f31c69940e7 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -172,3 +172,11 @@ impl Builder<$name> { 7:4 major_rev as (u8), "major revision of the chip"; 25:20 chipset try_into (Chipset), "chipset model" ); + +nv_reg!(PtimerTime0@0x00009400; + 31:0 lo as (u32), "low 32-bits of the timer" +); + +nv_reg!(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..919995bf32141c568206fda165dcac6f4d4ce8b8 --- /dev/null +++ b/drivers/gpu/nova-core/timer.rs @@ -0,0 +1,124 @@ +// 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(self, rhs: u64) -> Self::Output { + Timestamp(self.0.wrapping_add(rhs)) + } +} + +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::new().hi(time.upper_32_bits()).write(bar); + regs::PtimerTime0::new().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, + dev_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 bar = dev_bar.try_access().ok_or(ENXIO)?; + let cur_time = self.read(&bar); + let deadline = cur_time + u64::try_from(timeout.as_nanos()).unwrap_or(u64::MAX); + + (cur_time, cur_time, deadline) + }; + let mut num_reads = 0; + + loop { + if let Some(ret) = cond() { + return Ok(ret); + } + + (|| { + let bar = dev_bar.try_access().ok_or(ENXIO)?; + cur_time = self.read(&bar); + + /* 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 Tue Mar 4 13:54:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Courbot X-Patchwork-Id: 14000773 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 04057C282D9 for ; Tue, 4 Mar 2025 13:55:17 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CC25A10E5D7; Tue, 4 Mar 2025 13:55:13 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.b="ue5cOFcG"; dkim-atps=neutral Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2072.outbound.protection.outlook.com [40.107.244.72]) by gabe.freedesktop.org (Postfix) with ESMTPS id E54C910E5D9; Tue, 4 Mar 2025 13:55:12 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kJ5btTZXpySgwlAx29aD6AeL6cX/EBv92KIeVCn1WEP2wIP7sqCYNlta3gjFM5TGHxCBW10rI/crBbXVL5+VN9rT+Fq+Ykk4/gnJIkNQyIwQq1aJmVKmr2p/+Q+CMHPE5iePpZi1SQ0mRPAQc0RN7ZmIigzOUa0tasGEvt5jOF0mZwVNpa8DG8n5ZJlU4UjIlMUVTg/b5cyPOpg7IU9MhEYkf7n58VZ4O4KbMitC+frGCiSzwCRjPgcYey1KT5aWIv/sWCtn6SrNzEpn3iZf/L0hFibmMeKxaS6X08/cpj5AZbLS8Nfq344Zhta54EasXqM5FT+p6oe3cDVONvJwbQ== 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=6OWm3eef5vUe9pRRl4SXsEdGWAsnBzfcclzxfP+UhyY=; b=jBVHo3mO/LC0IZPui0IPvPrjUlWqL4aNga0PRh7w6AnCSgervhlwMbq6ppcn3JIltvdqKf9+yBJfoG37BwDWUe7bjPPhIBI9/tBCczNfKJ1tYKWqLpjRc/8Aqrz072vNbNdwAHCN95jEkheKPe3BR7U/CUG8eU/Ru+3Q8gWN84MDt2AiNcBi1phLDr0bbtwJBnXulXGDQIBumdS10qyTdMt7X74NEIqu9RvEhCDOIzyQCUP/e8Fyo1DP59W05UaMTwNYLszN/1Q1NCCHh4wK4vYjp0lp2w0RgCKIajH6JlV2r4WSn02p994fWqvBCkzLcQbmjduKzp1r0a0+06xkYg== 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=6OWm3eef5vUe9pRRl4SXsEdGWAsnBzfcclzxfP+UhyY=; b=ue5cOFcGGKMZYMDd3msfkbm/w5AQI8WTACVkvLKCkxV5d+XnOZKEbNNFcmBg5/v1vS7YSGWBUG69g/dKqZX52W5oihLkgWswkM0nWpxQ2QDpr+OLkB/R6MLNDUTJmFALdHAdYb2L3x+VMz0aWJE3OCg2+oxFgq9VxkOftlTa43KfiGK5nhhj60GyPY6Ml6cAjtJJY3pSX0HpBhEOMpzJ/5TUEXg2kxFD+4NUsjL8VWgNdfYvgwKvlhEmJsXF1KJR8OZUhi6isSmMvYtlR/aAIb+jtJA/P6EU9OOsV/1DEW1YBXZww0Jnn4EHqOgQT0H1PbMb/wojeubJn8jyWZZ45A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) by DS0PR12MB7874.namprd12.prod.outlook.com (2603:10b6:8:141::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.25; Tue, 4 Mar 2025 13:55:09 +0000 Received: from MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316]) by MN2PR12MB3997.namprd12.prod.outlook.com ([fe80::d161:329:fdd3:e316%6]) with mapi id 15.20.8489.025; Tue, 4 Mar 2025 13:55:09 +0000 From: Alexandre Courbot Date: Tue, 04 Mar 2025 22:54:01 +0900 Subject: [PATCH RFC v2 5/5] gpu: nova-core: add falcon register definitions and probe code Message-Id: <20250304-nova_timer-v2-5-8fb13f3f8cff@nvidia.com> References: <20250304-nova_timer-v2-0-8fb13f3f8cff@nvidia.com> In-Reply-To: <20250304-nova_timer-v2-0-8fb13f3f8cff@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 MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR12MB3997:EE_|DS0PR12MB7874:EE_ X-MS-Office365-Filtering-Correlation-Id: bd5130d3-ae04-4072-576d-08dd5b242d3a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|10070799003|366016|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?iy/P3kpWzWspxs0qcfyqhJSuIqjZWdX?= =?utf-8?q?RY7HqLMF1j7k41IYaXT+Ok6GPFP1rPdllRrxSvjYpAR9XYFyYtI3O1+SUKsH9s4+e?= =?utf-8?q?o8PrB2TtrJgTsPyZJ4mebNrZsAqPGvgPPplWdCwBkTab5pKbFJGvFdLpM3ZCqQuWf?= =?utf-8?q?c38qoVzVNnl0exkR1JZDuDFkwy/y58GaFO6HySh0xSL61kzalQGCZvKBKLELwQqWZ?= =?utf-8?q?Ua0e9dMSZhRgvEs42LuqsXizP+KTb32jvmqvY0SIcT0vQCQPl/JTj+MxIbjgF02wH?= =?utf-8?q?m3JLaZBYeSJVQienkGB/Cta50c4foj+jVFY7zOcZOXxTDge6AjarVIlqzN4l8tDtJ?= =?utf-8?q?E6yhfW1d8OXTiG5+YmW/VdinRlCeA/POwStX0GLMPejk9iepbdfDLc6uUQuSL+82U?= =?utf-8?q?PtMJ+N7GvdUjsJHFWONWl2KkPq3X2ac4oO9mFwcM31wAJrRbZbWEXpL/DY74mgork?= =?utf-8?q?w6iqKgJF1PvopynZUqNrj7FakZTqNUkzEyY3qHUWLk/bYQCsOG+/YAVRKuknpe6Y3?= =?utf-8?q?BGFaVh1p7NQpR59cynjDy6nFxoMg+inWmg8z5zIhEVYajTZhfL/4FaPVYuBVXi4Vw?= =?utf-8?q?qQh1JVB9+ZrNhfj91XOyyB7m8FnId7Sw9SPVBs/R1VPRZlOsr/DxdLNHpQtsLr0XS?= =?utf-8?q?FRo2uJWIjLbQYg5QK5CxQbTsGpFc5dGTsutlUt7YNXvcs0SjszTdHwUBGhegiUOG3?= =?utf-8?q?ZKCX7tlkM3yyfZik+dfJaXw/sX4aLaOVtxEl9nxxTXTJqAl2avLl6mNB0JjdGTEHk?= =?utf-8?q?HdfJVN2GLxukPu90pn3Lj0sFSwxfoo9jiorSSCKe512jgo+rJ9BzqofUiEfNg1BNB?= =?utf-8?q?ivvyPNAu2omdBZtRcVvkX0wPdwe8U/kHuZ3mVkeLgMNr1n68T8OlrMgLqkfSyycuT?= =?utf-8?q?hNufwjTonKiC0D+MumpUJOyr9ROpHBQaBjAg6VOV344HZ7n4DFIP+szb+yRA+/T38?= =?utf-8?q?z5qSjcpThBf55VE7Gmg0kpvjygdy+sd/LX8t8/WHzpsYiCuUyhD41DVVpLcJXHtNt?= =?utf-8?q?9jVk1ctSPkMU7NAjZDjpOFh0OAxCCH3HHPeXmmtPo0lHbDkcohmhlVJRm7Yhn0LN1?= =?utf-8?q?9DYEQ0HN7U70zZzN9wNdcI/Pbcq98swZVrBFMWyG35KzWlSuUhfyQ3BmlUgUAOQSQ?= =?utf-8?q?haLEHpLYu4yjsM4MourAObraIrSd+ylp+Mo9Gt6RHTxD4/uO+DZBKKzV8SzjYuUz/?= =?utf-8?q?Q3b54aYRDSQo+K6OgnEJ75rL0FQILR+0ekAqiEpM+Q5Vsn6xWoi6Y/mjLRCCrqff4?= =?utf-8?q?yJWLW9LZBkOeyZHhYI9an07coBzqWc/aO78nMR2IelT35Ae+RdQ9YSwrPPGmmAzC/?= =?utf-8?q?K9lMCv6X1KHpk8u8ykD5X+suOzKBkCfUJWFZJFF6mNSG/CpEqM30YUE=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MN2PR12MB3997.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(10070799003)(366016)(7416014)(376014)(921020); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?lPcdAt7MMzGc5DpIFrvGlkBmUj71?= =?utf-8?q?rW/f9Kdoy3F5w4NZK7JIpTKEhERF0ufbzAAwjcvmXMZAXTiJsNQwa8cwhMxvURkz6?= =?utf-8?q?mdrSeYfxoAq2Y4PBAyTdisHnxOl+Dr1440penSOhJAcl95TwCD0Y6OivlA6ge/JTv?= =?utf-8?q?yEnE40Oq10T8G/Cke/loV8xpIEjDTsgQZx7M+1xbuuHZvlhVOyOu2FiJH637g5X38?= =?utf-8?q?HGov605h9f2TfaEsCun8iA69ExNAiMJ2OBhW/8SRq2FrhOMK0OQ24qZ4MsG1vDEoc?= =?utf-8?q?F3jSUcCPUn0/cMSqmcbCy1ZTkeAR3ZoQhKZNqsEzbEtFgX+/fgrSRQ3Q/hx0IKmMd?= =?utf-8?q?Cw9Z/mzeAWSNBKeGR89WHqvkSqDbpCA3lOuSO6AzDuCxi4svhxu2fTLCF2ecofSBM?= =?utf-8?q?MAGiSIpDv/qMcVzrJssPWtpqjOgn3IrECsNWD4BpWxu6pBmr/FQT3q6dSTDZmE/Fj?= =?utf-8?q?VZ/pkyaPwEkIzzzTGL8gPblaS4uMoSXzP6eJgt4CKDCOBGJ/LE348upQ526aXT1Da?= =?utf-8?q?2hzTbcpLcIjL3YKrZOKdNs0hyjT38K/xIu86AUza0D8n8hFvB8stQxr8uzWtpnMrP?= =?utf-8?q?3A8mL27sgEhSmrsHlHuCjlj+kUX0VCSqk0BpAFnYS88p6iYIB37M5HdgP0bDabZLl?= =?utf-8?q?sZFQlVnEifEhDUTAzXSZDouycG3IDykJB5XZTnOS9vhTCZKzYt5QFMb+gvAPYRuhW?= =?utf-8?q?ZMSHY8mqsZ2OBHnsxOpPPHbAnwjMK1Xah7jgbnNj0uah4XMM2cYYKjPK+0wp1gyK6?= =?utf-8?q?OQeTbhV3Nuw/U9szJqxIXgJDUNpzgjDXIkou84/kmFIpYEVn6s3dm/fJvnoryqb6e?= =?utf-8?q?GWSLDva4xuYpbGd3r3NSxSGSisoiSwQze7QDBBvcxg+5PI17Dr8w4epXUHYhi/zaQ?= =?utf-8?q?QcXZhGb14NX6+yNhzHBzZdGvMSd3KclSLFs6DL/tPpQNEAlwlYa+whGQA3rzs8Nuz?= =?utf-8?q?fOWO+kf8DR62YrL+at4uFOC6xNXq8XxaIWEZtZS6jgvRYle77X3AxX+zHnU+Vqy1v?= =?utf-8?q?tPGvhm+MfmDoPes6PhQXERBffk+atW1tb0WDDHXv8X3ZK2eIGJZ3S7twSozwOuB3m?= =?utf-8?q?JfzbdkXQJX5p+cGJtGZu1+JHwm3S9VrqJKnj2HbOkfcGn+bRllIVtz0sk9EM93Bgc?= =?utf-8?q?y6RgwADD/9Bc3usF1/Ys24qEWKCpahrIixRchXRgXGdchsXmEfSHQCi7MgXThNkyR?= =?utf-8?q?6jpcB6VHwQ7FdCKYEYbyei46R7/dKgj3Mz3hN0XZrZ5qpilYU94PTb1pIlKySOUA6?= =?utf-8?q?zI+cmh9D/bzQAYe+LQ5+NRnivNn3GtlWOyyvNcwkyIO1D9hn98kde7u0lUtp1Tn80?= =?utf-8?q?eyTqIGnDBAvlO1mADDLnmQi0WubYKSUB4fDYpfBb+9Mm+svA/EHhWUF+UVzkopx9J?= =?utf-8?q?PcCnCjhXnQoAy3bAwh8F/a6zwUhKuOmVnSosP9VanpepU0BgeWpJhLi9TKIeraLhE?= =?utf-8?q?v0DQAA9ovhAGcV4K2BzawuxXch9jLAgnDskc8/KmF9Msd8l8LVi6cQ/dIw9kuOgMG?= =?utf-8?q?ZXrASQRXqSBXNNOKKmg7hkPB5Pbjhmfu5C1vMostG2YNUyFhZjHcz/CYJ7887FDRI?= =?utf-8?q?h/U/zfvVXVK?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: bd5130d3-ae04-4072-576d-08dd5b242d3a X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Mar 2025 13:55:09.4769 (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: f9SmvCR1e7BgBjk7puK0G90l+ag4TBrXaeNFvoiTrBXyZwqMVyaKi8j+OITn1jIYVWmp2XhzEyWv7f+sA4wyRQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB7874 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 | 124 +++++++++++++++++++++++++++++++++++++ drivers/gpu/nova-core/gpu.rs | 10 +++ drivers/gpu/nova-core/nova_core.rs | 1 + drivers/gpu/nova-core/regs.rs | 108 ++++++++++++++++++++++++++++++++ 5 files changed, 244 insertions(+), 1 deletion(-) 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..5f8496ed1f91ccd19c0c7716440cbc795a7a025f --- /dev/null +++ b/drivers/gpu/nova-core/falcon.rs @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Falcon microprocessor base support + +use core::hint::unreachable_unchecked; +use kernel::devres::Devres; +use kernel::{pci, prelude::*}; + +use crate::driver::Bar0; +use crate::regs::{FalconCpuCtl, FalconHwCfg1}; + +#[repr(u8)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub(crate) enum FalconCoreRev { + 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, Copy, Clone)] +pub(crate) enum FalconSecurityModel { + 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, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub(crate) enum FalconCoreRevSubversion { + 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() }, + } + } +} + +/// Contains the base parameters common to all Falcon instances. +#[derive(Debug)] +pub(crate) struct Falcon { + /// Base IO address. + base: usize, +} + +impl Falcon { + pub(crate) fn new(pdev: &pci::Device, bar: &Devres, base: usize) -> Result { + let b = bar.try_access().ok_or(ENXIO)?; + + let hwcfg1 = FalconHwCfg1::read(&b, base); + let rev = hwcfg1.core_rev()?; + let subver = hwcfg1.core_rev_subversion(); + let sec_model = hwcfg1.security_model()?; + + dev_info!( + pdev.as_ref(), + "new falcon: {:?} {:?} {:?}", + rev, + subver, + sec_model + ); + + Ok(Self { base }) + } + + pub(crate) fn cpu_ctl(&self, bar: &Bar0) -> FalconCpuCtl { + FalconCpuCtl::read(bar, self.base) + } +} diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 8fa8616c0deccc7297b090fcbe74f3cda5cc9741..8d8b5ee5c9444c4722d1025d4008fc5a8841a247 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -7,6 +7,7 @@ }; use crate::driver::Bar0; +use crate::falcon::Falcon; use crate::regs; use crate::timer::Timer; use core::fmt; @@ -228,6 +229,15 @@ pub(crate) fn new(pdev: &pci::Device, bar: Devres) -> Result(T, PhantomData); @@ -180,3 +181,110 @@ impl Builder<$name> { nv_reg!(PtimerTime1@0x00009410; 31:0 hi as (u32), "high 32 bits of the timer" ); + +pub(crate) const FALCON_GSP_BASE: usize = 0x00110000; +pub(crate) const FALCON_SEC2_BASE: usize = 0x00840000; + +nv_reg!(FalconIrqsClr@+0x00000004; + 4:4 halt as_bit (bool); + 6:6 swgen0 as_bit (bool); +); + +nv_reg!(FalconMailbox0@+0x00000040; + 31:0 mailbox0 as (u32) +); +nv_reg!(FalconMailbox1@+0x00000044; + 31:0 mailbox1 as (u32) +); + +nv_reg!(FalconCpuCtl@+0x00000100; + 1:1 start_cpu as_bit (bool); + 4:4 halted as_bit (bool); + 6:6 alias_en as_bit (bool); +); +nv_reg!(FalconBootVec@+0x00000104; + 31:0 boot_vec as (u32) +); + +nv_reg!(FalconHwCfg@+0x00000108; + 8:0 imem_size as (u32); + 17:9 dmem_size as (u32); +); + +nv_reg!(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); +); + +nv_reg!(FalconDmaTrfBase@+0x00000110; + 31:0 base as (u32); +); + +nv_reg!(FalconDmaTrfMOffs@+0x00000114; + 23:0 offs as (u32); +); + +nv_reg!(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); +); + +nv_reg!(FalconDmaTrfBOffs@+0x0000011c; + 31:0 offs as (u32); +); + +nv_reg!(FalconDmaTrfBase1@+0x00000128; + 8:0 base as (u16); +); + +nv_reg!(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. +nv_reg!(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); +); + +nv_reg!(FalconImemD@+0x00000184; + 31:0 data as (u32); +); + +nv_reg!(FalconImemT@+0x00000188; + 15:0 data as (u16); +); + +nv_reg!(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); +); + +nv_reg!(FalconDmemD@+0x000001c4; + 31:0 data as (u32); +);