From nobody Mon Sep 28 03:41:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD9671B87C0; Thu, 27 Aug 2026 08:52:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820739; cv=fail; b=FYReZqtwuwdA2RInqFZP8hipWvqk75hCk8VENEn1PqszATvHfhrUpZBREv4NxcRegBHgDZobSSSKzbxooShD7I2ZqeuYyiDdJCH35l5WcL2pSlMIxj3BJDONVzd4jS/5o8Y8q9AVS4Z0NFX9VXmFEpyLputBevB4dP9otxH2j5s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820739; c=relaxed/simple; bh=YCRJDu5iHxwYT0KT31JK+MlN2A8i4YhQg/7qCvaJE7w=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=HdzUHzhxXsAlD5fh6fJyezk9+pmEtYzqsdVdFnc5OkAIGVkPBTqn6c8zSc7dzJR7rEyunnmVW3nc2fFSLTVzaX9IsOTGQE3ndzu6XmsBPkJL+aWPg3AZl39gVyuLE188WITq5kmisbk7m14tg/GGpAYD6V+/hCYkm5aj04wQHks= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=RxXx1JAM; arc=fail smtp.client-ip=40.93.196.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="RxXx1JAM" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pCcn4gOSk1milM0rvTV8GUN2Xp+UudaNWhJd5L3zfs74OpRjZIYzFQyBCeTICKb3JFLflPJTohY9w6vMpCXM9/f3SdaVMJWm5O6qLF/KywvH548wPZU9S39spNmeE3ZG0d/ML6LoD5nTvOpvlmr4yWz7IONju/GrbacHRuLtHCcVGvbMRxNWH32+QNFrb+KLU6tbUukPL3BRQuak+SVJYZgwNLZK0R7iBhRtXe13HddNB4BOCPELId1Tmzo5C6xkUfFhcKQaVJc2M1ArvtpLBfut9JvGOgrOnKCwHi75viXIiYMd3p7w90F+jowyxU8Vfh8slAqcT1dj3yvpdqC3jg== 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=ySLHY1auqKK2L0EotcEpJEtnXPUV7Lv3gQcIpvXHnXc=; b=JvxaGJ0PxVikvFiT/Ab+05JKQ6ciZdOkQFVZf8Ribip8J0S3Zo9vynX6RSMMhe4wp/ayY4GS7Iich8PA81z1RrULiCHxSJ5KkOf+xLa9dAlYoc3j1VIg6Do2wc1GZWALi+XHRY/YNVbCNi5vQLXhh/q10MvVKsfkRY89UtphgUwXqrK8oW+o1nHvLj9LVRn31bvvPhfLdLeBA9LeoSXgumfBCs3CvYv2Oar3UAjhnPER7/r30priwfgzceL+ENELCuHa5jEGqX6ajl9sD4ARhDlt83kjJpCKnXqJPjEpawq8TGEc50Opwp2FeeVFdQEOZdcwrTPQyeqfKWjUsKfP/A== 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=ySLHY1auqKK2L0EotcEpJEtnXPUV7Lv3gQcIpvXHnXc=; b=RxXx1JAM47M9aOwtPx9fhdRCQVsxsDcnIl4sq0qP70EqyYBcVHgnXyFLZhZ9xBIxbJdBBoUA8bfSsXqc2AFnWqNVgfQP3cqnhbRqpvzJBmkubjRIh+buLpCDep6fS8818m+pJp+GRSNSkTy71lp4+3dOiKHw7n0BzQXy1I+bjac7tOGQ5q5WluExA2oqEw0U7I89t5YnN9tzkb3N/CjlZzNZKghBg/KgsCJvR8EHFVXWcQ6MmiXO1AoFCUYcFS/n4fhlak8WJJFf2YAKufTsPj8hmt4SGotkelnG9aLo/Kn9ykI41wwVpe9acKTtZWQvpwXjjYtyzbJu+qKWKFMSgQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:10 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:10 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:42 +0900 Subject: [PATCH v3 01/10] gpu: nova-core: mm: Add VramAddress type Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-1-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP286CA0367.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:79::14) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: 84a414b7-7b35-48f4-387a-08df04187b3d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|10067099003|11063799006|56012099006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: 7H2cwEEr8mVGf/QqEymYubX/NzZEuM5so1v4lqyXAXUBecVhaPnpnPL/dEaLu9XFf76ccKV654BuSqGu7h7tbZ/+30BFYHaTEpDy346H8zSSGAsjdh/iAhjI1EUwLAns4xEHnfa/SABWaEPl1X7k3CQdRJ/IIKMLdUk9f/UDO81SZOQVSLcZ7ydd+/NloFoyDSDbWN4h0Ls7yD3jDdxpX1j83Zpic2GQkgOB2Cc8bD2buj2Kj67xMfErIieafI7ZpxPg/ngxksQzOPTWgFPWU83K+rpAwu1G2xaq7uJHzq96VBowOTBSN4CbA+R5D0wgYwDCSq5zo+pGGxSmkwJ4X3WcMdF0HmLb6cb3LfMFjGiP5H4nviCCrm1gcC5gkTKGu0pxKP4xErB3R72bg6BCEh5kmUHUPBhx1LwDvQ4S84nUR08zr55p13lGWPAWmpEaATYEyxVngbYr1pM/i4yUSZ+m/o+sEd8LVMX38BfN+JWEqI2vfEjp8WjhGsHH+gigqbFS/klZwE4SWNt2XEYu3zuvhXWhyQFCrlnBH6c2CbEwtcu1H6zrc+v/nLylqLyrnNPxyoQ4qWzjOVFL9tvHl41VwOQysFaPZN8FfZHJphoV9aay9o7p4HmF1h07R1yvyl7O71/xkQWlCuizxW+NuCjS0ys4fDMlhBgKAZJm0Natl7yvsZ4TIaal+X3n0uTTdSTDDtyWjITt+sGZXmyhsw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SE83VEVqa05PMmZVR3VJTVB2dnZMYTYyTzVDUTFtNDM4YUdBYTNYQ3RQemtC?= =?utf-8?B?S3htaUJOcUg2anRGVkNpNlJUQXliT2RSelBXVjhXc3BzYmkxU1RjbDNjQ2VV?= =?utf-8?B?cTlTaHFCbmtzZUQ0M1hSR0wzWGxQMmNNT0xySEhjN3czdGthY1FsWmNkbGtS?= =?utf-8?B?U2hiQURKc1h5MnprS01SbnEwTUx3eHJ2L2tEeG1MeXY5cURvNi8zTlV4Z2M5?= =?utf-8?B?QzNQcUNlT3I1VVJSTXV6MjJSOGtuQUFtcXhDRm1LQTJLYUx3cXhXRnpkU1JI?= =?utf-8?B?cjlGbC82UWJ2K0ZKcWV4dTkyRnR3NzlhamVFUGJJOHp0MjlDeVBqcGJaTUVs?= =?utf-8?B?THpkV1haVFpsdzhRdVp3VWpuY09BU2FMMERxNUlhdGlTVVI5MXBhQktYc0lR?= =?utf-8?B?Q05IcFg0aDFIL2UxMFpRM0wrUVdoSm1WOEtHK3dMb2twcFVmaVN4aGdQbHBw?= =?utf-8?B?REVqdlhhZkpza0lXR01lVXE3QytjTXZIZC90VUtseWVKNmlKdmthbUR5SjFZ?= =?utf-8?B?MytLQ1BoeUs3TzdiUFljOXJDN1BkUUFBUjZwV2l2ZStYQXJiKzlqM05pQmZG?= =?utf-8?B?bzNTOTZvVEp1REJBVE4yWDhPNWFkZEtoZTV3czZOaFFMTDdSTjBDOTZiZGNI?= =?utf-8?B?eTNTemsybkpja0RHekROV2tCRU45L1hPY3JnVTI4aTNWUzdkd0k5S3c3Q212?= =?utf-8?B?RUVpUEgyYUxHUlVvdTZ1OGwwT0hxNEd2b3drUWJQRW45Rk1uNHZSbzhGMjR5?= =?utf-8?B?aDc4VUtTMWZ2QWdaR3M5aUZMUVhuY1Z4TmFVcEFxdnl1cG1LSmhsMjRQdURr?= =?utf-8?B?cndZR1E5MkFza0FjMkpqM1EzS2ROWWZtaUw5TDhzWVNObUJzeVBsUURadmJl?= =?utf-8?B?aXhveEhlRDAyMzNRemJEZitCV05jWTJDb3ZSZmV4aTQwejN6elJMalA2UnUr?= =?utf-8?B?NGtPenk1eFJhU3dRYzVGdDZObnZ1YStrN2hKRndIV1E0UW1NY3RSYXlJTk55?= =?utf-8?B?QjVzbTRSM2xkRzFpMEY0LzV2OGErNnRQczhQQjA4ZmMwdmxUcFZlYml5NGQy?= =?utf-8?B?ZHRicGpWWFlDSzN3Vy95VVZjQmR3MDgyTXpGLzUvbTQ0SkZ1TGRWbFlpN1Nz?= =?utf-8?B?c1IxS0E3cGN0M2RWcjNwYkExeFhLaUNFdmhRdUYzeWRjbk9uKzUrKzRoOE9m?= =?utf-8?B?SHZHd0JhWnZCR25KeW0wenkrL1VGaWRETU9FNXVNVS81YTgveW5TazBqdFVY?= =?utf-8?B?THZub2RUWVhFTUEvTGwybG5EU0I3RmNoZGZCblJQaGVWWHpXZXNaUGF6M3NB?= =?utf-8?B?WmE3RVFPRDNzU3JZMmlSSWJzUlhsRkRZRENVeDU3U2xOY29IVGUwWDhnUzNw?= =?utf-8?B?ZXZNZ0pRR0hzWi9hUUk4QWdZeTQ3Y3RaVHBCSDBCSGFGcE5CcEZXc0Y2L2hm?= =?utf-8?B?bG5qTS9TYjdtZ2dJL3RHZVczbVBKUTNqYWowUFY2K2xNQW00T3krRVZVVk10?= =?utf-8?B?NmxUUmVxcGdTTi9wZW1QNFpPTThWSk9TMldlS25lRWwxNzlvTnVYeUc2NWZ6?= =?utf-8?B?bS9yVUdOb2l4bnN3ODhnMW1lb0VWckZCeit1cmhZNWp6TnZuYzFWbTFodG5Q?= =?utf-8?B?VElvQVNmYWxZL2dnQStXUGljNTVzVlRjVWxPNWZXT09PZFgrb0lMR01jODN1?= =?utf-8?B?RXNzblhpdlBBSXRFcnQwSy85N3JwZlVQOFNQZ2czT3VXbThUVGRQV3JXM2Vk?= =?utf-8?B?eUYxQUNLbHAxakRoV09PcC9BdmltUUQvYUM1T0NFKzdtTVNjd3JsS1dhQlpV?= =?utf-8?B?T0JLazE4WVNuL2t4ZmpFYXFSS1duZG1GcFNUd3RQaHRDZjlTY2hYZHdNN3RR?= =?utf-8?B?dS95dWM5SVE1WkJXNWtkTURlakR5M0FBb1lZOERLZEoxbmEzLys0aFFNSXlm?= =?utf-8?B?bDlRaHpxdUtEODFiTTNJci9ObTRxUTJUM09mMXFldG9YOHlKbTNENDhmUWdn?= =?utf-8?B?U3Rmb0JBWXF2ZElUOGduMEo2OEJCRVJWLzhyNVh4MEoyWEJweTR0UkRDWUEw?= =?utf-8?B?NVVxMlk4SkgrN1UvaHRGaWNsbHNpUFVhTklnYXEyZlBLcXhDV2hPU2NUWjRM?= =?utf-8?B?TkN5OTJoNDRpRUVrSENlL25QMUVEZkQ1Sm96K2kxWW14aitJUEJSd1EzRERN?= =?utf-8?B?ZXNHcnBSNlAwbjBFbjJ1UVRQVnVSdEdOdENrV0VFL0tTc1BlQXlGU01yS2JP?= =?utf-8?B?STJyTVowdkNsREwwTGJrZFR2cDNGdzVOOXAvNC8wemxTdjdpaU5GeldGME44?= =?utf-8?B?eDRGSnYwUVAvT0F3RUJNUUpxZ2tNZUl3QUx6SXkrM1ZxOXpHSXFmZHhwWjR6?= =?utf-8?Q?hlaLiH9e6zoiSJKskGE/jfxTfPyMXTFMTrssOZX84R3cV?= X-MS-Exchange-AntiSpam-MessageData-1: uTz5s4sdtJvRBw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 84a414b7-7b35-48f4-387a-08df04187b3d X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:10.5547 (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: aj1s9+rlYS2QLSt6mRqvACxeltuDhrMOdwP0taBGwUKGY0qmoY98coSTrvagJq2dft16a7lE+un+TTvbQ5aoRw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 From: Joel Fernandes Add the `VramAddress` type representing a physical address in VRAM. Also add an arithmetic helper, comparison, and operator overloads which are required in later patches for address arithmetic. Signed-off-by: Joel Fernandes [ecourtney: create mm.rs here, squashing in the arithmetic patch] [ecourtney: splice the two commit bodies] [ecourtney: drop the Pfn fields, open-coding what bitfield! generated] [ecourtney: drop align_down and the IntoVramOffset/IntoVramRange traits] [ecourtney: make checked_add() const over a plain u64, derive the ordering] [ecourtney: doc wording, header, import, and signature cleanups] Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/mm.rs | 60 ++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/nova-core/nova_core.rs | 1 + 2 files changed, 61 insertions(+) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs new file mode 100644 index 000000000000..dcd5e5e919bf --- /dev/null +++ b/drivers/gpu/nova-core/mm.rs @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Memory management subsystems. + +#![expect(dead_code)] + +use core::{ + fmt::LowerHex, + ops, // +}; + +use kernel::fmt; + +/// Physical VRAM address in GPU video memory. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[repr(transparent)] +pub(crate) struct VramAddress(u64); + +impl VramAddress { + /// Creates an address from a raw value. + pub(crate) const fn from_raw(addr: u64) -> Self { + Self(addr) + } + + /// Returns the address as a raw value. + pub(crate) const fn into_raw(self) -> u64 { + self.0 + } + + /// Adds `rhs` to this address, returning [`None`] on overflow. + pub(crate) const fn checked_add(self, rhs: u64) -> Option { + match self.into_raw().checked_add(rhs) { + Some(addr) =3D> Some(Self::from_raw(addr)), + None =3D> None, + } + } +} + +impl LowerHex for VramAddress { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + LowerHex::fmt(&self.into_raw(), f) + } +} + +impl ops::Add for VramAddress { + type Output =3D Self; + + fn add(self, rhs: u64) -> Self::Output { + Self::from_raw(self.into_raw() + rhs) + } +} + +impl ops::Sub for VramAddress { + type Output =3D u64; + + fn sub(self, rhs: Self) -> Self::Output { + self.into_raw() - rhs.into_raw() + } +} diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index 35a8b1214b0e..8f59cfa97017 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -18,6 +18,7 @@ mod gpu; mod gsp; mod mctp; +mod mm; #[macro_use] mod num; mod regs; --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DED9B3FBB5E; Thu, 27 Aug 2026 08:52:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820742; cv=fail; b=dBi0TKHPSg4TJvZBCKvZf19sXC+JpR3H1ZITB+xb2JGk72SJ7G7KscAPYYlCI+uAwEdTK26Z4jaGBM3US4ju3O8NXUv9tAioJWWTjFXV64bof0VCFF09T4lhQOlOq/gwbt/ysRAgDFS/9ohOp6vT2pJCdZ8EbIQiuKfxK96Jahg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820742; c=relaxed/simple; bh=B0SoJDAPkHUJdXL7r4Q58vnagRW0BzbIzIO0yrqCY3A=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=r5Jqmlj8xdckT+CPNkU4P4Re3feLPmP9AsIPOOd3pHOBDZhnOJIijxHqd3FhXvqLQ7jmkHhDhqG3msxjIpGEnQYFJkqmw6anJaQI6NURPL8Ugn6e5i2pd/QP1buebpDbWPpvwh2y7Z6CJ/rUkFr+1f9okxXwX3Un4gXK20oE7GQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=H8L1LG5O; arc=fail smtp.client-ip=40.93.196.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="H8L1LG5O" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dZ8XHp8WRoFGrdoC2OhEs4wt/uWkc1Kk7B10LxY1al0mEkPKhZGSmi5ByngAgVpdIOu+IRkTvCwx8YDZMspssikOCf4sNAROOPKilil9G28hUkWqvMfWqOkUzqo6FeYK4QK1/PAxL6byaCdGvW5e/gklpWuRX21s0UjWFFVTZdaYe2kDt59K27X5+bGYO4xLGDXu7H/B5PpbbYfGd1hFXEOA/EW6icRnK+FtpljXpVzh75e41fnGr7KCgjVsPkcDOBeC5qM4BgTc/lvdOmK0ha6xj+9fmnRr4CHPxwsrG456VCzWoM+m7F+mPU06qipL2pGjafKctRJLiL353fXpwA== 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=YGOBl5a/xNWCXmOTaWTF7DxH9KJC5yYDPccNRx+MRTQ=; b=evUZRPEylUqOG50CNf6YahpFFqJIkVSfCNQQ8Izx1xWI00XDRkD1aHujqiJUIGwFOc+voMJpxlbr47xz0fPPT8KZhjuurn5Est+o0uZACcZY0mwHIN8w6Pf/YjSV+28L7IU88+FfiQWr5CqBrIN3uCpdaLOGpxMdSZME/sN+U+32sXONjn5zD5rWOnmdVpKinR8hPQgsXnXq0DWFrU7yShZaGKCppNwbiU4pB8qV2BDwrVs3bxvKsKtiEQLbsdgn/6d+rYXckMI+7eAxJn6kmCZM65c/5H4jsDsvRDhZF7FduWxytwPALRRh+IvwrnP935OkKs4bb/BzvP0TrpYV9Q== 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=YGOBl5a/xNWCXmOTaWTF7DxH9KJC5yYDPccNRx+MRTQ=; b=H8L1LG5OgDoTDuRpBL3HdcnJ785O1BIVLMz6EtSMUM8wbS0ivQSCWFye0iNLBmqaCD11mJvVcAvcNikBz27DZeW7HwKKXHChAF4GPtWeiphwrAkhVpJ0k+XIHTn9b/xq3db+TJahzL31gu0HMeUzLWxpI8KU8qnoksILZOUukxDBasgy+wbAmwC1PvXlsJ+fwLn6R+qN2s+OS53bIF3VLvBnk5fURJcPgUPklTYZFv6hwQV8igu5aF4VqHdMGi0R5p14AGOHPaNoUS8rZG02xNI3SfD01dlw5QI6tWvWgVfDrIFgRGpK9VqAhEENwUwLm+eLJonyPDiiaR+njd9v4Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:15 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:14 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:43 +0900 Subject: [PATCH v3 02/10] gpu: nova-core: mm: Implement Alignable and Debug for VramAddress Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-2-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP286CA0164.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:383::16) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: b8edc9ec-8ae4-4969-1235-08df04187d53 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|10067099003|11063799006|56012099006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: bN0VPluATqLzskMX7BpqTKlVDSwGGu28wZrXkMXgxqThQgC2cwrwmNr4Dp9MNUqEMe4hn2lJmczFpM1FslcRvdJfG+EUyeekB6x38Ffabc/LydqzGHEHOMNY8xpNL/GNrrTkCR/Le8pibpS9LaOMPQ6C19l0vmoybxx56WcC9LRtNqtF/K9+UENmzIHXeGW7ArQMch+cepbRseJtNnWKSAuMo5gtLfVmLoC6cE2BddQgoICmM05qhprJFv1NGgubV95L+p8cehEPnmhyZGeRo9tE+9rvE7RSH+Q62QuyTabgLHJ9KywQyyn2Q7yI5mOsLSQslaS4SAbHjZlYugqkGKs63u4YedZ0ABMZeEqZgDS0JXtteyh7rmAW/oLQzGTV2jrJPcaEui2Q+kwkc4Biqlo4aPVC8ZKEWsbt8j1lleuyk7KyaWeUq4+LUcpTjOyBcdIdR8NvZrxL/uU+DYfktbyqjbLeNWEDQ9MFPopqoZNCKbcP95vZsVxfE3nboYV2fuCWCTKqI5zfNxEXaFI2/ytrzoNmYzIQArBJ/BOT+qW3frMDnwoawegp1KvbEoa/aESn+psEYOLK9T01a+ezr3frUsGhjOHsctTIjt2B364xpq1LEw+BPooyeDes50CT6Xj1f9PvcNs2hNdJ7Zc9c8waUg68toRHsUpFtwSQk1VPGDQqk6YSgmr3LcOZgd68zi5Fv9fCOrYoqsMzqliwqw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MWh6WHdRZEhoRU8zOEdSaW5pU1cvVDlFcW5JNWJIVUVETWpSbUdCdEJrRVUv?= =?utf-8?B?VzFlcEdTa29LM3VET1hrK0xrb2xQWWE4QXYwd0lxcktDUVpabVNUeG1WQXpB?= =?utf-8?B?UWJDcFd4TzhDQ2E0RHRScWQ1cGJheGMvajRSVkMvc255RW9vNGpnODZlVnhk?= =?utf-8?B?ekV4bnQwRTFmWVZmWHdockRoWDMyY2VaSFliVEw3UEtsK25jb0sxbHNGdER1?= =?utf-8?B?Q3NBdjRSSU5UczBCWG5neHUrd2FScFJpYlF0SUN1TEpsSTVXMFl2UWNINUM1?= =?utf-8?B?a1M4d1NjNmNQVHRPdVhQb0ZPY3NRbjdkR08xZlM4clZCYW96eEh4MGxGb0tC?= =?utf-8?B?cFlhbDU4dTlYTWp1MHpuU2tKNXlLcXhYZmE1dWpGQUt3Y0hWSUYxM3B4azAw?= =?utf-8?B?cFV4TDFpQ0t3VGxnV1lvd0ZicHc0SkZESkJPbmVLK25XSHIxWXdoVE9HY2Zz?= =?utf-8?B?ZnR2L285Y2Vsd0lVL3ZGSHNFRlg3ejJvWWxYMllKcmNmVVZnVmxRR1FuekZW?= =?utf-8?B?S3dObS9sSDVmeGxCb2I0b0cycUR5QzE0Q0I0L1E0dS9IeGxVb0tXZ2pudWNB?= =?utf-8?B?aG03TWZNbkNFLzZhNS83M3dkY3MvZkl6clhaaFNYakhoQm11d1RoYUp2OTY2?= =?utf-8?B?NytpUzU4TmRZUWoyaEdVczV2c01FK3E1Ylk1c0FadXV2S3BDdUx2NzQ1dGJz?= =?utf-8?B?S0tuSGN2WnZlMUtqb1lnbTBVY2FZaW5wTm9mSkQwWDc3Z2Y3QXcwQ21BaVFq?= =?utf-8?B?Z3Z6Z0dLNENubmFyNUgwcUltVm9nekJUa3pJTEFaWFQzSVVhbGN5aU0xenBH?= =?utf-8?B?bVY5Ly9EUk9ydWNYbUpGbENVWUUyVGtxb21Vd3BGaFptTXJXellMYytNcGJ3?= =?utf-8?B?R0JJc3Z0V1ArYWZMR09CZHNmTVpkNUpqSjN1L2NXR2E1MHozMmlYM0FydHdE?= =?utf-8?B?a2dKcWdMVnJFTC9FdTRQSjdldUs4Ui85WDJkRDNjQjE3RUdxK290M3p6MGl5?= =?utf-8?B?WG1Vdm9MWGsvOEhuL1J4U3ZjUWFlcTg4WXNSeFJTblBrRGRMeE9PaU5kSVJP?= =?utf-8?B?YW50Rk9QSzYwSFpWbEVlcTlGQjgrQjBJRzd6b0J1bjRPcTNOQjY5K3UwQTFZ?= =?utf-8?B?NFFJTFdzYW5RSkV3Q1dBWjhabGs5akZydG1ZTWF6VEU5V05XalJvOE9vcUkx?= =?utf-8?B?U3owSjMvNFFWQjZUb2F5QjVWOUdyZkhuSnE1ZTFkNkl0Ynp5ajU0R0dMVGZy?= =?utf-8?B?MGRMWDBUT3Z4TjlpN0E2M2E0a0NKa1luWCt3Zmw5dmN0RmF2ZU9VTVU2cG1Z?= =?utf-8?B?amJnNFJ4VUl5V0V5R1h5QlpXSmRyT3krbzRpcDduYUo1Y2o0NVJFNVZqVXBj?= =?utf-8?B?dlUyVU9uNW95OGZ4czdYZUJnbFp4RlpVZEFDWitPSzZFbFJCR090TmsxQWZN?= =?utf-8?B?dE9UQTY0MjNqOEVnektoT2daUTJwdHNxbmpYOFpDNCtrTnZzaDY0b3FuSm9y?= =?utf-8?B?djAvUWRrVWZvc0VmcnZKN2N6V3BZNDVUMlJWQmMydncwOW9WWVJQbEJrQ0tC?= =?utf-8?B?SWwxNFFqRWF4WlRoU3dNbzdLU3NxUzZjaHhWbFVGa2xzVHpUNzBxY3B4OWFu?= =?utf-8?B?cDltNGZaWHBtaGJsS0ttV0VxZ3VFYWowRDl0cnMrZnZnVytnY3NXZS9BUzky?= =?utf-8?B?TFAxWGR2cmd6U0VYcVNqK3d2c1ZwbW94Yk5DanFhdmxPRFNjbUZ6Tnd2Zkhp?= =?utf-8?B?a0thRXFGL3NWdnJSMGZCcVROMmtyZTB6R3JxdkVGcjFiUUlGblA3ek1XcU5Y?= =?utf-8?B?R0NndzJnY3hSRnVUQkRiWHJTRitsWWlFMktLbzNjVVZhSGJJYm9YdDF3ZXI4?= =?utf-8?B?UXZsL1ZOcHI5RXAvRlpYVzlta2JzYkpYZ09jWXRjSUc0MGpsNDk1ZExoQjlo?= =?utf-8?B?S2hBTE9NQVJRZkFoL2l6NnFXYzJ5TWVzZTdCbEpQaVRrbkR5Z1VQTXIvTkdN?= =?utf-8?B?WDFoSG5IbEp6OGFINk9LdEh5ZGhHbDhuQm5HL0QyejZzeUNFN0ZueDVJbjhY?= =?utf-8?B?czQxUkxicjlFQjBMRzhZOW5iK0NnTHgyQjlKazY5WHMwV2F1RDBoeVl3Z0gv?= =?utf-8?B?YTNYWDFLb0RJOUlaZFhFVHFvUWlGTW1GOWFGVW1yK0UwY2VWeDMzcDVwOElv?= =?utf-8?B?eU5zRzYvQWdKdDRBOGlkVXRIL25WVmcrZGNsekoyWk5IOTl2VU5GVFlOakUx?= =?utf-8?B?REFkbGx2ekQ5cExsdjI0aHNibnd3blA1L05WMmVhZDVWQkgrOUlHUnhycjdX?= =?utf-8?B?S3pxNHZ4S2VPNUxHOTZiZnpvQmlVZ3RORTJWMEZRZ3d6cno3Y1p5dFEySkJC?= =?utf-8?Q?f1BT03Esxa6TQcf+I0Jzl4DPuUkfvN4sbKOJ2T38y6CbJ?= X-MS-Exchange-AntiSpam-MessageData-1: mJudOW7ccvN5vA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: b8edc9ec-8ae4-4969-1235-08df04187d53 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:13.9593 (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: bVEfea83R6mk3LYI8FZeEDPVonHfZPRhu4nd/pTRILKFQ+aykMHDQkGYpVhnrJlTBJUXsA+gPaOuHbwrBD+1hw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 Later patches align VRAM addresses down to the PRAMIN window. Implement `Alignable` trait for `VramAddress` and plus add a `ZERO` constant. Also print the address in hex under `{:?}`, so it reads well in debug output. Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/mm.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index dcd5e5e919bf..f9d80ffbe01d 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -10,7 +10,14 @@ ops, // }; =20 -use kernel::fmt; +use kernel::{ + fmt, + prelude::*, + ptr::{ + Alignable, + Alignment, // + }, +}; =20 /// Physical VRAM address in GPU video memory. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] @@ -18,6 +25,9 @@ pub(crate) struct VramAddress(u64); =20 impl VramAddress { + /// The zero address. + pub(crate) const ZERO: Self =3D Self::from_raw(0); + /// Creates an address from a raw value. pub(crate) const fn from_raw(addr: u64) -> Self { Self(addr) @@ -37,12 +47,28 @@ pub(crate) const fn checked_add(self, rhs: u64) -> Opti= on { } } =20 +impl Alignable for VramAddress { + fn align_down(self, alignment: Alignment) -> Self { + Self::from_raw(self.into_raw().align_down(alignment)) + } + + fn align_up(self, alignment: Alignment) -> Option { + self.into_raw().align_up(alignment).map(Self::from_raw) + } +} + impl LowerHex for VramAddress { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { LowerHex::fmt(&self.into_raw(), f) } } =20 +impl fmt::Debug for VramAddress { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(fmt!("{:#x}", self)) + } +} + impl ops::Add for VramAddress { type Output =3D Self; =20 --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C068C3FB7E7; Thu, 27 Aug 2026 08:52:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820745; cv=fail; b=Y7icjkad/q+ZTve9k4cvk4BryaUkQJWJC3Rq/F9IMj44FpPQmlPO+gWqR1R9GUtPLwB+OQ60fUMGH+MAYcK8jjIw6VdG0DRrlTOH8O8O8qL1dPbJd8FGQH/5KM7f3Xn4sdaAqr8d9/EkXVtiXp7goTzlrW8bSND8SNIKjxTVPD8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820745; c=relaxed/simple; bh=cfH2S3MHK4wLQ7e3oEL7VTjXEkrMiUhWjlUaeCaQuFQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=OXiy4BTEW+U/R0qt7XCl/snMS98UF4hJp5vS8RzZNygRq/Y0OT0hBGUPPQCiFwx3qJaoHQNJC+xI7/hBsb8ysSwBUSt7jM8FWROL1/eWPDhXgtKAZMD/KIDpfn9Eb/x3R2jVExVNdO9MbM3jTbhXUy+F4F74CrWzJqZWtYl7yOs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=NHpEn3YZ; arc=fail smtp.client-ip=40.93.196.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="NHpEn3YZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vlB5nylS/w2A4umIPrT+Lcqk8WOoN9LDjJaDxG2nrXH29Ma4t2TM9eyoGjh3M3HiOON7Ub9bIF0dlXTZ2hxu/W8IdVcFHan/Qi34LiJInz5f26Mr8nZu5k/8+uSk5YWnYVC0TxYEX/4YoW6GxDrSxQbo/89sTxeA+ZUniTjz1mC7shiq/givTw1BuNT3eyoYiuVu9ZJuC57nG4dYonbnIqdiULaX4jUglWf51jRhe2PVRro2BQ0J9WNKvAkrSNbJtvZCeAt4t9MlEl3eOdPXmraQU9xTuvMx/32UB8EeKU5bUZm6toD7022SiMCRSojdxdwpda8saziWCsZlvcCZWw== 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=xjFn8WncNZcNiijYDQqDtx8Sb1nRpzpUXQEdStempho=; b=sTYIE9b9u56efIOVq+zNJLIoJUtPw21U0UWZY+XWHtUsV96MTWUXulqLSh8tpIvfsLCXBG0DDWcHZS+39BeIcchQY/RgMB5n3akp1C66JkmQMBw/cHeSpQ8qiJtiBF07K22DH533uFSTpPEYS09SqDElML8qt9yoCx/0Joiu2zSFFJAhUGGEKA7Y5GuJ4F9eG8sRSyFQfXhofnEev75SybmTekULkof6ThFigMLU1gcJs39Tp2GLkflglGCmu6y1STOox13wSCLmxUIGoHxb9NPSuIbSMWU5R9QEKNRYPjHAgAH8PoRaEXWEsXcqOLeZHP72f+wRcJha/z1OS/QBOg== 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=xjFn8WncNZcNiijYDQqDtx8Sb1nRpzpUXQEdStempho=; b=NHpEn3YZrKc1KkqVpdbgWMuqoQjkXwZyuWHKMw78/Asvk61h37SMwFf18UzUbAddPsIb8Oa8MFUCTHLSNnjqPjcxUzLvn6I0TR+NrorvU7ak/AvLFKuhquDmkXwnENbO/W7F9wBBNc+U0L2nZlzPmKx1gfuCfgZkRqGMr0uh0LyWayvcC4HyNaHfqfAy+m6YIIdtIXu/o2rl6pJcMua9ma5qqgc3vhbEvGoyluSy4Wk9Rbf0B4y5sBCjfq20kta4pVkrl8NekWF1WhA7nC/QuABsmkiyUo9CU9Bhbfy7dGNOZZTA3txc0A4W0ZL5ouRTul8UUaM44A6LPBPVwwbUPA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:17 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:17 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:44 +0900 Subject: [PATCH v3 03/10] gpu: nova-core: mm: Add PRAMIN window registers Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-3-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4P286CA0006.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:26d::7) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: 475daea9-f71b-4b75-073a-08df04187f8d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|10067099003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: nZY9IyMK31ndnwL4b4DTIAPUnY7zTkw5aZrvF0bWCb1dBmovUJV4TqjxOfd1Vn4JejvH5oD84nUV8AIMcWftTtS5XdHHDB+4vsCkwdQn3V3UtBkYjc8mL51Logtuw6lmytgzhNdlf0ckDybJlb4Dvtms8Pu2K2HvODbtnKPEihJxaV5sd0jxgxHvoLt40FE7k/CjvvCpwjxcAmtcdJEHGEE5t5Lyc9+7TMWQr+iN3SZ5SntCI76oIWBAZ6IM6m1Yng+Ryp7NrO/AQycmKtotNKmQIV3esEw3iQg4+Ou6RhZZF+jtN8ISpNoKRXuAo9pnrLPQF05KLf21xuHS3XJps05OkRaGaW507LCU6lB3nn3SajUlZETaI62YYyHJZexDevC7oULF6vnk2ecJVjpmWz50nwov/WCd2odJiPvJjs9SSxMW1c8sQ9bX524VFbM89Xl4CzfgG4NawBm9eu7lGPHn9Yw4s5Q3u0cSgTvB1ocuZ2Yl1n9Jbe8JBF10W0t4jHmJpFJnS8I1PcCeCPluSKbYa22nR7xp9zvpqMMOHJFOlAGvh5jrmUTKMYC9Q+U6II8z6xZXilmbK3XIvhrMKpMvqJ3PDY3lCxQ+8gex4K9eFciwgMUsUZRhFaIGxEjKw+rXYrh14zWXN0ZFlNX8avT55wqzu/cqA96wQnCF/jgC1W19uXIZYJao58bEAMziJcUiK7jFa/6b699lOJhpFw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Mnk1Z1FqZWFpNlRUSXl5cnBJM0pSdml0d0xMTFljSmZhNzVhYlc5TjNYMkNS?= =?utf-8?B?YjdtSUtWWCtTcnUxMFp5S0lKa3BqZzhrSWxPbklCdlNNc011N0U3dzI2a1ds?= =?utf-8?B?bnpVWFNoZkg1ZjlZc1dSRk90cjdpNk9XZzF6RUlkb1lPSmhoYnNWRXVYeFUx?= =?utf-8?B?dlhFYXBqd0dkSkxQbEhOMGxielhkMjNpM29IdTdVbTdISDg1b2NrYTdGR2Rq?= =?utf-8?B?UjIxU1Y1UnFZejlraHQ3NkUwUlo5VFdWVCtZVytTRUFSZTlEVmpYZ3BXdlVC?= =?utf-8?B?T0Fmd25aMkRmc2NCN09qTWpOVGxOc292K1NDYk4wbk94ZDBmUHBIR1Y3OTVI?= =?utf-8?B?NlM3dWc0ZnZkOGZCaldZdVNJc2ZycW9yd2ZyTStyWjhXMVhSRTg5eUZQQjMx?= =?utf-8?B?NitmNDZMQ1VkdlZmTENaMUwwblRQOWhER1h2SE0xN2l4NUpsUTM3cXdLN3hO?= =?utf-8?B?WlVTZjJGcmNiemJSV0gvZTY3clRpcmVkbTVYVXNISVRRS1V5ZGV4c2Y0ekRp?= =?utf-8?B?Nm1jTXpKSEJZekF6RmtWYkN0YUNzZXd3VzJ6OVdRZ1Q0SjN0ZFB3Q252L1Br?= =?utf-8?B?bXVPa1BSblJGaFdXaHhNMU9OYXpwc0tncGNjZlF3RGVwVnNoWk1YM0hPeCtB?= =?utf-8?B?c08ycnNJb2JzeXBwbXVRT1BWRFU5cUtTVmVaRC9NWFNGZzlmaGhtdHRZQTgv?= =?utf-8?B?bktDWXlNc2IyUDVoLzRVb1ZvbXF4L01mTjNGb0RDd0tQU2QwaEFTK1MvSWtZ?= =?utf-8?B?UHpTR0MzOU9yMzJveUJ6WTA2YzRKNWRmeVNyY2tBekN1ZllwN1NjY3FyaFdo?= =?utf-8?B?RXBwbmFMaXd2YjhBSVRIbjdsQ3RyNTRNY2RuTU0xbmxtWGI1RWVsWDY1cTZS?= =?utf-8?B?NTVXYXMzQVNFUFR1TnNuVVhhcTBGWGpwTFZmU3dJTWwxWFVUVlVESzl6V1R6?= =?utf-8?B?b01XU3F5V1ZKWW16d0dBN0NWNXFOdzFaRE83bGtwVis5VGRteUdCL2R6RE9P?= =?utf-8?B?aHBYbERYN2RkZDk4a3JLQXpGaGdGeHlQY2VBY3JkT3V6RVRKbXJyUGV6TXFU?= =?utf-8?B?M292WUZlVGRiRDhIeUFQK3ExZ3RTZDFvUDhCOFhBM2xhYjF3blhuVEN6Q2dy?= =?utf-8?B?aC9seUEySmpVRStMTXlJL2NaTFBmbzVDSkVmVkkvN2R2aGdHWWxkMk42U1VD?= =?utf-8?B?b0Ezemt5aThtZHJpalZyNDl4bkZGb3dzU20wTktJSVFPbkZ2NE5NUUcwM0JY?= =?utf-8?B?bW1YWHpNemhUenlBdmJzTGd5NEw0ZUhndU5TbnZobWh4MXc0bVZOVkpxSnp5?= =?utf-8?B?SnZwY0daRStGaGUzckpaSjdmWC80dmQ0SmpZdWJuRjlwWEVwdDlwTnIybWJi?= =?utf-8?B?Mlp3clhseDhTU3JoMkFNenhhRWowUEpXRnBVTGpTbWI3TjRHT1UxYUkyN0ta?= =?utf-8?B?UjIrSnpJRVdTQXFucjNPR1ljWWhrRFozZnM0ZHVFdEtTWlRZTndYVEFiWWg2?= =?utf-8?B?Wm9ld1MxZkxTSVNuY0l6bDNndDNxKzdZV3k5dko2TVdPSXcxakovN0QzVnFq?= =?utf-8?B?V3lMRjRWUVFNaFdwNHdyYzZMYmF0RXdUMzVRakN3Wml4R1B3M3A1ZnE5OXEw?= =?utf-8?B?TXRNRjlqRVVtOVowU0VmMy9ocmJRaWtIQTFSK1hMTXh1Y2ZyV3E1eEdDRTZB?= =?utf-8?B?QXJEcUwyYWEwaGs2M3FJY2ZIVTlvL1pJaFZ4ZWYrWFZtb1E1UGFHUzYvR1pB?= =?utf-8?B?VzZucXZIc1lwSHhydDZ3MW1oemw4MWNkVWh2M3NkZmJiZDVJbW9UT3J5aTBk?= =?utf-8?B?UjNvZ2tUTS96Y3VIOXQzWTNkUFk5TDFuQ0N3bHdoejJONDVHbDZxYkwweFBT?= =?utf-8?B?R0FtZCtmQithaTk1Y0M1alFvOElpL3FGc3pnck1RYjFUbnpKY3dNdk53bEdI?= =?utf-8?B?THlJVnNSL2g0cFY2Qm9vUDZLSmhPVUk3L0RMZmt3TnF3MDU1UUhYanNIUjJy?= =?utf-8?B?UWw1Mm5WSDREc0FqME9jN091QXBNNlo1MENXSEhEN3kzSnp6YmU3RDRoWUYr?= =?utf-8?B?NkdkSm9nUG9abHgrR2twclpVcm9BYy93Y1dZRGp5RXVlZ1MwS0pVRGxTWFBr?= =?utf-8?B?MVhaelFGV1h1REptQVpqTXUxTitUSlRsNHc2dVNiaHRBUjRBdEVZNjY5UEdV?= =?utf-8?B?QXdyQjcxOXJCRzh6VWVmTFh0YnFjZ2JISnI1bXAwcytIZjEybjRVdVcwb3Yy?= =?utf-8?B?ZHRabjcySzR0UXVoMk8yVEVTWHl5Z2E5TXRNcHY2d0R1K1VGaWhFcGtkeXR2?= =?utf-8?B?SnRMbFdMOHdLaEEwTGNNVDVxNDNHaFN1cXVVTDJHcEZaL2hINjZzUXlnNWMr?= =?utf-8?Q?FLvZl6Xfsdd6oJf4gLbP66vHQvRtdGuSfa/PtfQ0MX7oM?= X-MS-Exchange-AntiSpam-MessageData-1: KcOF59+b1Swozg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 475daea9-f71b-4b75-073a-08df04187f8d X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:17.6692 (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: gKammCErGDSHTcxkT8WhLRNqu8dZV10m7YtjRceogLCgv88hQddN3nhI13xumMkpvX0E7Z63rkCwIgzjr4ccLg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 From: Joel Fernandes PRAMIN apertures are a crucial mechanism for direct CPU read/write to VRAM. Add the BAR0 window registers that position the PRAMIN aperture on all supported GPU architectures: Turing, Ampere, Ada (via `NV_PBUS_BAR0_WINDOW`), Hopper (via `gh100::NV_XAL_EP_BAR0_WINDOW`), and Blackwell (via `gb100::NV_XAL_EP_BAR0_WINDOW`). Hopper/Blackwell window-base registers are based on Eliot Courtney's offlist reference patch. Signed-off-by: Joel Fernandes [ecourtney: split the registers out of the PRAMIN patch into mm/regs.rs] [ecourtney: drop the register read path] [ecourtney: reword the message for the split, narrow visibility to mm] [ecourtney: plain base fields, as the bitfield cast+shift patch is dropped] [ecourtney: rename the target to VidMem, fix derives, redo the target docs] [ecourtney: annotate the register base types] Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/mm.rs | 2 ++ drivers/gpu/nova-core/mm/regs.rs | 70 ++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 72 insertions(+) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index f9d80ffbe01d..7d24ad790310 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -19,6 +19,8 @@ }, }; =20 +mod regs; + /// Physical VRAM address in GPU video memory. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] diff --git a/drivers/gpu/nova-core/mm/regs.rs b/drivers/gpu/nova-core/mm/re= gs.rs new file mode 100644 index 000000000000..82de6dfa4e8b --- /dev/null +++ b/drivers/gpu/nova-core/mm/regs.rs @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Registers used by the memory management subsystems: the BAR0 PRAMIN wi= ndow. + +use kernel::io::register; + +use crate::{ + bounded_enum, + driver::NovaRegisters, // +}; + +// PRAMIN window + +bounded_enum! { + /// Target memory type for the BAR0 window register. + /// + /// Only VRAM is needed by the driver. Pre-Hopper window registers als= o define + /// system-memory targets that are unused here; Hopper+ uses a separat= e register + /// without a target field. + #[derive(Debug, Copy, Clone)] + pub(super) enum Bar0WindowTarget with TryFrom> { + /// Video memory (GPU framebuffer memory). + VidMem =3D 0, + } +} + +register! { + base: NovaRegisters; + + /// BAR0 window control for PRAMIN access. + pub(super) NV_PBUS_BAR0_WINDOW(u32) @ 0x00001700 { + /// Target memory aperture for the window. + 25:24 target ?=3D> Bar0WindowTarget; + /// PRAMIN window base bits 39:16. + 23:0 base; + } +} + +pub(super) mod gh100 { + use kernel::io::register; + + use crate::driver::NovaRegisters; + + register! { + base: NovaRegisters; + + /// Hopper register for PRAMIN window. + pub(crate) NV_XAL_EP_BAR0_WINDOW(u32) @ 0x0010fd40 { + /// PRAMIN window base bits 37:16. + 21:0 base; + } + } +} + +pub(super) mod gb100 { + use kernel::io::register; + + use crate::driver::NovaRegisters; + + register! { + base: NovaRegisters; + + /// Blackwell GB10x/GB20x register for PRAMIN window. + pub(crate) NV_XAL_EP_BAR0_WINDOW(u32) @ 0x0010fd40 { + /// PRAMIN window base bits 38:16. + 22:0 base; + } + } +} --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DAE13FAE14; Thu, 27 Aug 2026 08:52:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820747; cv=fail; b=T6v6/wuBlKHBNWZUe6leAjwIs5iP3b1AzTMKtLA9ksahWeiMVS5WNCrDSQi4hprRNJgVyG3J+0YRKCNBkHN43//kJBPV2NvWYAGxLGLPZBo9vDDFv8eLqAIr3HQxNvlQuPeyMntvU9NtvlOdDcVWTXYAXJLptzesJZJ1evsJzBM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820747; c=relaxed/simple; bh=O+5BKyShuOHGZSxb+RhHTzppO/9MNpVfMsD6dneaNuw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=H2opdao2fH5Tqn1R0XlkER2vYAMUz///ASe1IJ+d7uBC55OlwSbRr5/giFwQERHs1eKDQ1UXVpeftFxIE/8P5KgivA9AX2/2LtqR96AAKFTFu6Tl6JivsZQuBw6w5fSxEdaB7k5aPAE1pCDVIN2hYBq5Frw/OklklEZHUNeuYAA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=MdM83CEf; arc=fail smtp.client-ip=40.93.196.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="MdM83CEf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CIlRe2rHem+0rozjgjsWdhy7sBjwei+8vsujfyPEYU9cScv7D1fjaCpUyGSVcVSmt+/nE9oEzYqnGkUR/4syNOHWBhxbSsVxT5/bTSUxdQFMjxZC+KdNpO4jPkIQWQZKlfX977sBsXabh6eaQtYmY+l02X7HiwG4JmurkSZjpSs4nBdEUmgS0rmNrPR4WJa0rxKxA83U3aTnKP2XLPI8L3DebU7GMWLk2nZKSIk+58/fwHceukuxubhq4COZP+Z491gLygqIxF5iT/xHcD6dtQ4ty9LslrBZ0UQTPClLDzwcxXhNQ9bO1/ELFW9QFnpBcm4X5JiFpvHgxyf3zRvRPA== 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=GqfgYyU/GpaAmC3423pZOAtihrlCVfpnwE+RCGpNNVA=; b=xyIvJxZQQTE6+ftOukZgoTRtZpicPWxUeUZ/DD1Nk0yx6vZOA9lZV2UqCKyAE/wm5KTteGYVQRugrjzRggU/ZNlBKZj6D00NzCul18Mw4go0h0f5IbinQ4R2V28ZOKP+zsJ2Gu/+b0w3NQCGnc7A2cZdBKRYSO3fayIoHdwLagr1HHpXnEnOdLSP2db9jnEg5vuvmyAhQg/sT/q27FfoT6TrrLPnzutBYxFCBvx75XZ0+dHXStnR9CzlL3n4g4OICEackdlSxH7hhTl+DzARxtLhtwiJ1juLN5/UTX/AP6WRz+IzncEIFLPm3s8XBJRg8lqM37uEACb1jy0KQ4jHxA== 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=GqfgYyU/GpaAmC3423pZOAtihrlCVfpnwE+RCGpNNVA=; b=MdM83CEfZogrKwygDcHwxsAqCw3td6TmUjdyBO7TlZ6WUuqHii9V0yrHBg8xuJgt1MYUrMttHFQXWVSEhRmD0SAhWX+TYhwwbJ1O6kjILYoXNDiqKPUpShF8gQtDeZFkCsvsvEU4wCjtbgp3X0ubFS5TcbbyCFM5KPdm1hTbwY1L87pUipFuoIfW85IZXgCbvm56wnfJWdKgb1h/cLxwXKFyZ8TBR66Us4+tnAO5CD6G3Ve2qoky28xn8rxXWLXfanFcs2w3g8Jv36k6mt0IE0OAfCCi3bIFyUVv26xR3VRuDQcWF0iJeTXIBOsxPy2rvt/kXAyFQghloou+Bor1wg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:20 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:20 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:45 +0900 Subject: [PATCH v3 04/10] gpu: nova-core: mm: Add the memory management HAL Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-4-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY6P286CA0020.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:3b9::11) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: c2a6d0ff-b1bb-4500-120b-08df04188138 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|10067099003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: F/X9znbX27h4Q/7SPUfHeZLSDES8/K0MNtMz+/Yxu51iOcDoct+brsLOUVdxV4Wezw0vu3BhLAej0ISksQ7Z0xaf1t8dPAgWazL1PnbnSoJ/+nETv3VvKxbvSOoOGOn2L6MhVOOe+sYDPgL3elXOP8lDXwWpp2PAX6usVZEQeDn4ht5KepysWg0BfzL18y7YE6VxzhuyvG+S7KVZKz0+dfjYAD2J7LnJCt/KqfOcAm9VLxwX+Voe7oxe8yaddh9rflViW4ziJFpBMP+HfmYG9tc1/i0MfMgb1B3kNPKBOE0K0wqtvdGPNl5FTgYYaCnVC9KwdZgixfZSDQoD+QYi/HrtLiqrcxD/Y7+ckuWda0dpj4i/Zj0q0hFsfxOOJvR89NIrawtIrxokP6StYRp6oZfaD2qt2QBam0/HKaspaGNxAl2LIic9z1M3mTRJoDwocRuU9QoJjFZTpQ6LxL/Fht0/H3j1+OJIFw6qxKV9crCoLVK1NJfA6bGxqFg/6BZL01JdxgxtFAY0sCgGhBI7oKDwH0adrsEo1E2GArEns7wge5voSMth7JSDypkKPDaFlzoqlUk4Vm1/XNv8yNmKUI2Gv4XXgVJEuNYJm94xGHm9RddWuinFrlB/3azdFCEaEZCoRnC+95his47u1jS1tsz5HiROyEXHDJLfnLAOhdIJUWeac7Pg+mexwHIAOCVbw7xAAinAyIzFTcwHBCP2rw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Ulc0WW9oRVV5a1Z0Zlo0RUI1U20rY0plTVpTaklkTm5jVnJlNEthNnZJTmtv?= =?utf-8?B?Z2pVMW1jcHlyUE5vRGtmcmFaOExXRUFydnpDSzBtT2REOWpkY2k1QndPVnFR?= =?utf-8?B?SUpKZFJBQXFLU3VRTGluUjIxNnpiajUxUTFTaWs5WEZkRmpqQWM2M1QxRE11?= =?utf-8?B?cHYxN2Z0RDRKcElwQS9rOXlIQUg4VENMYXp0dHVqN2ZWUG80MHhmd0I4T0ZJ?= =?utf-8?B?N0c5eEdUUGtTdmUzd0VTajNwdmoreXU1b3NnbnpVOTZtZy91NUpsRWlmWm8z?= =?utf-8?B?cDZjNzIvU1FBSzlRL2RaYURhQjJPSzkwOG5ZdWlLRzBmQ0hEMHMySCtsK3NY?= =?utf-8?B?ZUhXbC9NTERJNjRVcXp2U3Z3bUtMOUhnSHc5WHdqbXNCdHpIZExlUEJNNExN?= =?utf-8?B?YVk2NWhBUmJCVnp6NkZ0TXg4RWtTMnN2NkRkSkhRNXY5d3VMcnQ4QkVsMWNw?= =?utf-8?B?dEx0NFVza0l0Uk5MdU4vYjVDdVNadnNmT001bmRwSmEwbzRCRlkzQVZSL3Rr?= =?utf-8?B?Rkx5czdhdnZZVXkvcjRycnUzRTMxaEtIamsvSklMSTg5a3loODB2UHJ6RkYz?= =?utf-8?B?Ym1aOUJoZStyalFqRzk2aFFzcTVZeERhQ2FpY1NzYVd2MGFFSnNnM2xEcVBl?= =?utf-8?B?YzlCVVJuMHR6cWFoRmozek9uazNINlU0UmdOTCsyOTIvVDc0NHg1TUQzZXJM?= =?utf-8?B?RzY0RDNreWNlb3RWMDhIUEJucVkvdnI5SWdmNzk3QmtUY3JNRDczb2R1djM2?= =?utf-8?B?SGJBU2JCR2RVN0Z4Ymk5d2VHRG5PTkdBNDFpUmR6R1pHWFUxOEorV1QrdEZY?= =?utf-8?B?U1JvR0RVelZVZEpCbGxpL3J4bXlWaFErTGEvQUE1VzZrN1U4QkJZK1NsV3Bo?= =?utf-8?B?QVJjUU8xYlJ6UC9rSnBhZmZHQ0RNWDcrT0RiRFh2cnJpTHpKdGNDd29oeWNa?= =?utf-8?B?VzBKdEVpZWR5ZHJMd0l2cjRxQXcwTXE2blY3K2s2YlB4TmM2VGRBSzU4a29u?= =?utf-8?B?OUw2MC9UNzVrUElwSFY0WWFuM0tsaHkvdTRqY2daa3FvSU1iWDIwWktodmMx?= =?utf-8?B?QjhhL2dod3Q1Ly91Mno0T1AyWEhqRHRlTHVrOW9xMkpCcEYxVnpSU2dKR1My?= =?utf-8?B?TUl5OUR4c0d0OG1tRVlYbXJsb1NJcElaTEN5MmFpYzRZMFRsd284elRvYjkx?= =?utf-8?B?YUo4RFVMdTh5ZmJmbHVqOTVxK2FrMzhKSEpoWEhlc1c1V2gvWGZQeTFBZjBp?= =?utf-8?B?eHZBd0VLMlRDSFNhOUozZDdjS1hKdGVxZjBycDgxbHpDNzh2VGRobmtPZDVw?= =?utf-8?B?dW40SnZYZXJ3blpwS1MrSlVmMDZmVU9HdlJsNVFyV1BKSXlaV3BWM2YvZzdK?= =?utf-8?B?NWNLdGVyK3NvdXVBNlZ2Q2xhS1dGRmF1NG10akNiQllBWm9mb0NwbmRmazE4?= =?utf-8?B?OGdhU2tjM09YTG10ZGFlMHVvTDRvYzBkRXVIQmdxRVg1QXA2YzFCYW9MUnJy?= =?utf-8?B?aGlyTWo0V2ZEeEtNYjBWdjVIazdOVG95WlY3aEZZbTBkQkk0eE5oZjZkSjMv?= =?utf-8?B?MHVCdHp6UWxpMU5VKzBjLzQ2VmZWRjg3VER0enliR2Zza3NlT2JBMXlkNk5t?= =?utf-8?B?REJHcFAxQko5R0tyZEE5eFBWZWg1ejRNUHJTNXp6TTdTRmJvVWRrL0YwZTFY?= =?utf-8?B?RzNZOTVoUGFEZUQrTy9LcXVkYXo2bC9zdURJYkhQZkJacG1TNHVWTlQ0eTJ1?= =?utf-8?B?YW5HNzYzZVdsN0NZR1NpdUtEcEtkZWRLZkx3OWo4M0lrN3h6MzJYaXJGNG5O?= =?utf-8?B?SjljaFptRFJJUElEVGM1cHVqd2hKQ0cwR0o1QmZySWh2SVJkNk5oNU11Q2xI?= =?utf-8?B?c3M5dmcvbm1MK2ZjTmdISmdPNVd6OUhkVnI3NjAzQkF4bkdyU21wclQxNVk2?= =?utf-8?B?NUdNeStTUW9wSURIcExFR2lQWFBlVW8xMFVMenllR3cvSDdNbWlrK1dNY1kr?= =?utf-8?B?VlBMQ2w3ZGxONnBjT3Q3bUlDaFgyaDFTOVIrZ1ArV3VRU2V0NnNzUEQ3S3ht?= =?utf-8?B?N0ZOYWZFcjVVQUl5WEhVdG1CRGpma2g0VHdyRy9HalFIZDhzMG5UYURaQ3hY?= =?utf-8?B?dXYwODdLOTBwdDlhYm9xNWo2dTN3SHhUbXZ0QzhqZzhyNGU1ejBrNnlaMmZ0?= =?utf-8?B?R0RMR010bkNtQittYy9kVlhaOXlTcjM3aWt1RzMxcmpUWXJ2cFhvbVRFU3RZ?= =?utf-8?B?WnlCOE1tWGFMRGxNQUFmK2IzSHd1VGtLV0ZoSnViQWkrbmNlZ0NVRlp4WmNX?= =?utf-8?B?WEdBUklZR0dJMnlFRDJBTjdKUmEyWWR1TGtWNk85UG1jaW5TR0t1cFRkbkFw?= =?utf-8?Q?UpN3BXht2+6UMjjNhTNVPdFKMr668SfZ1AVCvCd0ArXQ5?= X-MS-Exchange-AntiSpam-MessageData-1: wef4Ua1yDCHWog== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c2a6d0ff-b1bb-4500-120b-08df04188138 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:20.4503 (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: 3HSO9mvdVZLGNqnDEvh/L0fbTrIRWlHzXnnxD2xBOLSSw1wL/ZusRd0Es6gcJ5iRCKKMZ2tP4PuAUpfSS3lPXg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 Positioning the PRAMIN window requires writing an architecture-specific register: `NV_PBUS_BAR0_WINDOW` on Turing, Ampere and Ada, and `NV_XAL_EP_BAR0_WINDOW` with a different field width on Hopper and on Blackwell. A `MmHal` trait with one implementation per hardware family hides the register choice from the rest of the mm code, matching the layout of the driver's other HALs. Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/mm.rs | 1 + drivers/gpu/nova-core/mm/hal.rs | 56 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/nova-core/mm/hal/gb100.rs | 35 ++++++++++++++++++++++ drivers/gpu/nova-core/mm/hal/gh100.rs | 35 ++++++++++++++++++++++ drivers/gpu/nova-core/mm/hal/tu102.rs | 37 +++++++++++++++++++++++ 5 files changed, 164 insertions(+) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 7d24ad790310..07dce4ce2473 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -19,6 +19,7 @@ }, }; =20 +mod hal; mod regs; =20 /// Physical VRAM address in GPU video memory. diff --git a/drivers/gpu/nova-core/mm/hal.rs b/drivers/gpu/nova-core/mm/hal= .rs new file mode 100644 index 000000000000..e7fd1e38bd38 --- /dev/null +++ b/drivers/gpu/nova-core/mm/hal.rs @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Memory management HAL. + +use kernel::{ + num::Bounded, + prelude::*, // +}; + +use crate::{ + driver::Bar0, + gpu::{ + Architecture, + Chipset, // + }, + mm::VramAddress, // +}; + +mod gb100; +mod gh100; +mod tu102; + +/// Trait implemented by per-architecture MM HALs. +/// +/// `Sync` is required so that the `&'static dyn MmHal` references can be = stored in `Send` +/// structures. +pub(super) trait MmHal: Sync { + /// Positions the PRAMIN window at `base`. + /// + /// This fails if `base` is not aligned to the 64 KiB window alignment= or is too large for + /// the receiving register. + fn write_pramin_window_base(&self, bar: Bar0<'_>, base: VramAddress) -= > Result; +} + +/// Returns the HAL corresponding to `chipset`. +pub(super) fn mm_hal(chipset: Chipset) -> &'static dyn MmHal { + match chipset.arch() { + Architecture::Turing | Architecture::Ampere | Architecture::Ada = =3D> tu102::TU102_HAL, + Architecture::Hopper =3D> gh100::GH100_HAL, + Architecture::BlackwellGB10x | Architecture::BlackwellGB20x =3D> g= b100::GB100_HAL, + } +} + +/// Converts `base` into the value of the window-base register field. +/// +/// Fails with [`EINVAL`] if `base` is not aligned to the window alignment= required by the register +/// field's shift, or if the shifted value does not fit within `RES` bits. +fn window_base(base: VramAddress) -> Result> { + const WINDOW_BASE_SHIFT: u32 =3D 16; + + Bounded::::from(base.into_raw()) + .shr_exact::() + .and_then(Bounded::try_shrink) + .ok_or(EINVAL) +} diff --git a/drivers/gpu/nova-core/mm/hal/gb100.rs b/drivers/gpu/nova-core/= mm/hal/gb100.rs new file mode 100644 index 000000000000..3781e143dea7 --- /dev/null +++ b/drivers/gpu/nova-core/mm/hal/gb100.rs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Blackwell GB10x/GB20x memory management HAL. + +use kernel::{ + io::Io, + prelude::*, // +}; + +use crate::{ + driver::Bar0, + mm::{ + hal::{ + window_base, + MmHal, // + }, + regs, + VramAddress, // + }, +}; + +struct Gb100; + +impl MmHal for Gb100 { + fn write_pramin_window_base(&self, bar: Bar0<'_>, base: VramAddress) -= > Result { + bar.write_reg( + regs::gb100::NV_XAL_EP_BAR0_WINDOW::zeroed().with_base(window_= base(base)?.cast()), + ); + Ok(()) + } +} + +const GB100: Gb100 =3D Gb100; +pub(super) const GB100_HAL: &dyn MmHal =3D &GB100; diff --git a/drivers/gpu/nova-core/mm/hal/gh100.rs b/drivers/gpu/nova-core/= mm/hal/gh100.rs new file mode 100644 index 000000000000..8af384db2921 --- /dev/null +++ b/drivers/gpu/nova-core/mm/hal/gh100.rs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Hopper memory management HAL. + +use kernel::{ + io::Io, + prelude::*, // +}; + +use crate::{ + driver::Bar0, + mm::{ + hal::{ + window_base, + MmHal, // + }, + regs, + VramAddress, // + }, +}; + +struct Gh100; + +impl MmHal for Gh100 { + fn write_pramin_window_base(&self, bar: Bar0<'_>, base: VramAddress) -= > Result { + bar.write_reg( + regs::gh100::NV_XAL_EP_BAR0_WINDOW::zeroed().with_base(window_= base(base)?.cast()), + ); + Ok(()) + } +} + +const GH100: Gh100 =3D Gh100; +pub(super) const GH100_HAL: &dyn MmHal =3D &GH100; diff --git a/drivers/gpu/nova-core/mm/hal/tu102.rs b/drivers/gpu/nova-core/= mm/hal/tu102.rs new file mode 100644 index 000000000000..e4fe7561223c --- /dev/null +++ b/drivers/gpu/nova-core/mm/hal/tu102.rs @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Turing, Ampere and Ada memory management HAL. + +use kernel::{ + io::Io, + prelude::*, // +}; + +use crate::{ + driver::Bar0, + mm::{ + hal::{ + window_base, + MmHal, // + }, + regs, + VramAddress, // + }, +}; + +struct Tu102; + +impl MmHal for Tu102 { + fn write_pramin_window_base(&self, bar: Bar0<'_>, base: VramAddress) -= > Result { + bar.write_reg( + regs::NV_PBUS_BAR0_WINDOW::zeroed() + .with_target(regs::Bar0WindowTarget::VidMem) + .with_base(window_base(base)?.cast()), + ); + Ok(()) + } +} + +const TU102: Tu102 =3D Tu102; +pub(super) const TU102_HAL: &dyn MmHal =3D &TU102; --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010053.outbound.protection.outlook.com [52.101.56.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A17C40587A; Thu, 27 Aug 2026 08:52:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.53 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820750; cv=fail; b=Z43/TZQvKvoV3V8Qx1Sl/o9FVKIt6tPnrSe0ZXTjQ3QKtOe/ZGVVFrIgogw245S0+/L+2YI49Cd/t9rA+nwahy/vtpgZFDRotzgs3SVN6RipUKNQ5LRGq9MnIlF6HHHxuzggIo98yrTl0lZLxM9hufLbM1veUoQOEAqdEb4FTuo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820750; c=relaxed/simple; bh=jpRtHeA8kNLSQCpQsw/yfBFsg0gKZQGVJhbQavM7770=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=sbJ0RShENf/S1SiZQ+JlvbCy6HUVmVLn40r5jYG90amG6wYVE1P4f4X9hR6f4AT09dHFGvYrPmxtFXXziAsNgDN9rprAmEmV1syFV1wNqMpd7lGxwc0egu1JyedW6x4jHqMjBrkuIUoFuLjPtEZ3Tqzdj7CZ4Hi6M1oluxGaAwc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=cee4hXD0; arc=fail smtp.client-ip=52.101.56.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="cee4hXD0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=apdz7yyP68RsCB9FEPDOxyP1k7/6V24AQ7FIvyry9eOsdIfPQlNo6H0BLMDRWOubLwbtSaFiz5WRijZFEzyejGDb9b9RCa4sImwYVpMEDGr1NQg3H1GTJ0cpmgcBKQO0l1mW+be2XjJMjV6AUbbGmfqHFIA9pMhIPI+Pq1UgmV8xMx/ZiJ8yIhezubivKFODJWQQ1maU1YxTSZ3ZpCI70qCUb3ndsDcVAOkwxu1xzNYurKr5t1gkNRwXBX+Nz8XujiIvBM7KvB9/hkqZ/Nsuly4Sz1czCXvK4TIMrl0+eIPs/qLEK47ljCNUn03SZBZTMzi/fQOjQ0tj80NeNFxlmA== 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=IYAUQ4Ly3AZGT9BmkfCu5w1yYBWLwzZ1p0beHwt85hY=; b=rxENwbeeePlF5z2V7inRAYktt0Ynvd3p9pnmUnUldK+XBuV2eybZZ4lms9ZQdX3GrfgiK0sdMe2pXP2lUTIuJV/821g1PDeOB6mwW1O0lQdbYQPBenjbOe2NMTYHiPlDlfOsGWc5E+YKaN5HsS+lz+aHWMKNuUxzETlrAXiKiu2rvZ3FztaY1U2zVMzkXPmasamoMNkwkKSq0QhL5na8FZ8GGVtuGpIHrIU3y8je/wkWX0r2VT0qIbIakDhQMIKdb487vAPGYKXEOfypMoIii1XwN1HlUyzRGgJEX7nbx0mMwGKPZENfEq7VNFUFDS4/BJdwuMK/rdK0tegmq+4sVQ== 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=IYAUQ4Ly3AZGT9BmkfCu5w1yYBWLwzZ1p0beHwt85hY=; b=cee4hXD0pLFxOz+Pt8ZStKbhI4rsr0IvMjaimzBC/eKK1mp5vXx3saur3AVRq9ZYmSt79tI3r+E25xScl1aLv4Cr/rGuxyckZzSzLrJz+Let/PKSd8mCxEJ0khk4div8L2WJkdlwWp12LCInamuCIEGjskkgYDGfJ+gEGjvhcg0p9k9vf+B6WpGocBr9CY6Po1A9ZJqa8k0H/HI4IUnGDy+3zzjrVx5SI7VF3Zi/WthGTW6wzxRjykVtjOPM+JVlqTUrq0n+8sD1DX0btQ4vB+zGbtGkMYMzG6KQGr9kLHLfm6YinsJNfyJE2QxjSIcNrjDNOCsHjsf7PKYBlJpBpg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:24 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:24 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:46 +0900 Subject: [PATCH v3 05/10] rust: io: add static `cast()` method for views Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-5-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4P301CA0067.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:36a::11) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: 5482039b-954c-4431-f17b-08df0418834e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|6133799003|10067099003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: icuIvAS6nXzRr56700G14dBBfoR4zIXTYTJLCb42G3VL9dY7gWEZhbIEFwfLjU8/ihJCy2V6dn5zcLUT72Cbd1f5Pd9oc7/HsBeWN/Pz/Yz0egmhUMQBaq20roDAakB37edRxxPlfyf0+B9FAOV1GgcoVu94E8G2HigPvLCmOyHUOMFmX9szmkbyzbxlB9UJFtPjuK+b+VyWLz5dhvVZz2qSdJOti1RswIpjWAHJhL51pK/tNN2CNrSiIEwgjUf4xqauLEhRlSi62FhlAZDuQe+dMpMPbVZ6VZwyajIXV1maPTNxXfhEKfllAHzS4ucssA5QnS6Ei17L0Dd1i/ZNShzWMh5aVm1+Z06mt09Ro1j6yPtB7Gz9PzoRlfwPBPrbBc2J7bJU4I7Wi6EbR9uLSDf6gtroSkyHRCY3wF9bBl3sAZbI3cimZvatVA33j8ewKjB0ouP2IzmXJMQLhanVxz6GGN2hst39LsjL4X+Nxe+dPDqVtoPYIxW6gK6jXePaSc03X6vftaPZayfgr8tre8cHwFAwW6XoYlBTkIK+ODjCM3KknHiSsFZ5dIjdgeeG+Q0afsd6mlJjgcFEwS62ktWxs9GN9PvpHPr952Oi+Ap4zW7gUl0av5+R6T66HVWLY4s2R2JTB56xpASfO+ze3yj8UQNc9Xs55LW1ADpvxD4LNmgybPeWTRI9EkelopEAmJTYcXnq/TzIMwIlqP0e5w== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(6133799003)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?elYvNFJKV014T3IrWHhuSzBLMTViREFrVTZUSmlyYkx6cjZFUFNGaEp6QWVV?= =?utf-8?B?cXN0eXdMR2s3TnNJZENsUzVFWUFjcVZJaVB4TGE4eDA4OWkyUHJ3dm5yWUls?= =?utf-8?B?a0pCQ1IzWUVnbkxzWjZSTWFBVHh2UEY1Z3l2OG4zVHhPTzhrZTlHczBhNFVE?= =?utf-8?B?M3I3RjN6Vk5mN2d2T1k0TzZocnZlMzRBajJjV01zVGphR0lRVjlBRGNiSjFB?= =?utf-8?B?OGJJRkFmSmo5RXZpL240WTJwQllDSUlnU0pWU081Y3dWSDJoNllPYXVBOW96?= =?utf-8?B?TmttdElkcTBXeGNXYUN3dEp4UG5NVUxmWDRXS0loZG5lYllHcitGRGI1U0hy?= =?utf-8?B?QnhQR1pWcUFienRGU2h5a0plWUFPcUllWUlGa1dXZUgwZC8wbVBvNGNJVjRS?= =?utf-8?B?elQ5cTJQNmFBSzhYcUtPQTJ0WXBpN3lXSHVEZTNuOHpsaWZ6NWlCZjBrNzFE?= =?utf-8?B?dXBEK0tYc2ZQbE9DblRkc0ROS2o3cXg3MS9xRUYxTGtCREJYTXdhNGdkamZN?= =?utf-8?B?dE5NNHJZSnZlSC9ncmlXbmdWZU5iWXhleGNFVWp3TVpEV0dWOFp3UUhESmJa?= =?utf-8?B?aEY0djAzWjhUd1FJelUySzltT0pwbm9lV3dvUUNJckpGRmpLTFVNMHg2N2JM?= =?utf-8?B?RHN3WHkvNmVLVXh3WDFLbU53bUwvaEVZdEFSZ3pma0F1L2U5aDFrdU0rQXNN?= =?utf-8?B?TTNkZkFOVzNqQ3htY1hPTVdGcFM4OXlsTHFrc091dDZiM3lQb3EvdmNTN3dX?= =?utf-8?B?YmJjUWJoL0hlTHF2QWNGOUN4aFc5MEE5NkVHKzkzL0cwZHhmYXFVcXJlU2gy?= =?utf-8?B?eGhBT3hzZk16ZDN5eitLV29vZU5DNXF6Z2tleXRZMDEyRUhaUldyWUlOQ3ZK?= =?utf-8?B?ck1PYmFhcEVsM212L3ZNdUtGWWxuekJJaTMrSTAvR1FpS3ErOTlsMExndUgv?= =?utf-8?B?R3ovU01LQTNaanhudWY5M3Nud3FOdFZIcmJTWEpEaCt6bUgrc3VaMGRXN3Rm?= =?utf-8?B?R2Q0V0xpK0tlVS9NZm56dHJIb3FxalpBbTJJOHJxQWhSWk94V05xZXBOMnd0?= =?utf-8?B?MTg2aEROQ1RHTEc2ZWo1aFR4OGlOVkwySmRaRVBjVTE5ekFYWWNrYitrWVcy?= =?utf-8?B?bGVzOTNER3lWY0xSY2g5cFBHQjYweGpaTktGMTRhUnlHdkFnc2o0ek96czQ4?= =?utf-8?B?Q1JoTXJnNVRDcVcyVS93bFZlVTdnTHk4RFdWalFXN25zSU54VStlQzhpTDh4?= =?utf-8?B?Vm1pb2Z5VndQN3FRQ3pJU3NPOXY1NC9KWHhUS2QwRzlOUG5udHc3WmlDRFAx?= =?utf-8?B?R0RlZHBaVmRVMmF1QUVkUlZVQ2Y3WWJLbXh0cmFoUTYvZGtoT0dUS3Y1WGc4?= =?utf-8?B?eHJMUFJaZko5c3hNU3g5WHNDT0dvaS8vbUFuZlhnVzlRREhOQW1Ldlprc0c3?= =?utf-8?B?TkJlanVsNFBWd25yUVBuK283Wlo1U1FqL1FkSFpSOFJJM1BnalBGTkFpaUR4?= =?utf-8?B?d0ZaNy9YWTcxSFhtTVhPVGVBM0EvSGdKR0lsWUEyN1pPVnlqb3psMlNhb1Nx?= =?utf-8?B?VHV1S2FKaDNONndFbGtXQitGRXVNd1c5Y1RTNUNYK2RmOUpwbWtoUjdOT0tY?= =?utf-8?B?VndNdmdDM0UvMnM5eFdiOTNNNmIxK2JxdEY0K0toK1lwcmlvbTVCdGZFVStX?= =?utf-8?B?MUNHUmZCWlpUV0NMWTNSNGlQZjJxemN3bnF4eHBrQ1p3djdCSjg1Yng1aHJF?= =?utf-8?B?eHZlMDFDV2lkRlhLK28rd1RRb01nek9BQkovZlJFSVJHY1hHcEpiUjRaNUNs?= =?utf-8?B?WGtSZFBLSFFtMy9lakJSdjFmOStPVDJJWkxhcjlBUzFzWEltdnJTRlltTTlx?= =?utf-8?B?b1ZTaVFoZjBwQXc4VStrbmFITklYTlpLc2FNRGVBWDE4RGY1R05sZm5pdWhK?= =?utf-8?B?M0NxZDBkbnNydmd3eXBOY0JQR2gvajBBQU96SmZCQkhQY1VmamZtL2VaZWFX?= =?utf-8?B?cGlMb0lTbjVZeFcyY0hML1NabzEzODhHUUlzbTBuU1JHUDZxbm5vbXlkdU93?= =?utf-8?B?YndDNFZ0ZVVWejFBeXFpbjdjYWw1V2htTTlkUGpLZ3FJbmpYd3Q1SGdVcm82?= =?utf-8?B?RC9qN3hOb0ErUS8vOVpzblVFNWJvRGlxVjdwdmUvMDRBVVJHLzkzM2gwZkI0?= =?utf-8?B?Smw1b2lkSDhmNnlWbTNUVjVCQngyRENnZnhBQy9JV3pEc0oyWUJ5WUpWc0w0?= =?utf-8?B?elZwTUo4MjhUNHZSVm40ditsWlo1NGttbDFoKzBRWkEwUjg1cEd4RytXN3cy?= =?utf-8?B?VjdieTR2S1BHU1NRR0hXSUdUZVgvREhjWjZpWENoMEpLdjl5Y0NYOEFOcWl2?= =?utf-8?Q?w9tpCoFDr8C3421xeRwGAPE3vMyNl9ImRY/c3rM0ACtID?= X-MS-Exchange-AntiSpam-MessageData-1: xT7SqnwE6U/Fow== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5482039b-954c-4431-f17b-08df0418834e X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:23.9995 (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: SgvASbgQ9n6VNJ4MZjQCHDZNBLuvBSoodgHJ+eASbvXSE4Iy8oHYQbZlrYpOD+d+aBn3KD2HXmTLUFajXNvIQA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 From: Gary Guo Add a compile-time checked variant of `try_cast()` using the minimum size and alignment information. Signed-off-by: Gary Guo Link: https://patch.msgid.link/20260805-typed_register-v2-1-c3ca142220a0@ga= ryguo.net [ecourtney: fix the doc example type and doc grammar per v2 review] Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- rust/kernel/io.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/rust/kernel/io.rs b/rust/kernel/io.rs index 4542187d6b91..5f1be3b31acd 100644 --- a/rust/kernel/io.rs +++ b/rust/kernel/io.rs @@ -436,6 +436,45 @@ fn is_empty(self) -> bool self.len() =3D=3D 0 } =20 + /// Convert into a different typed I/O view. + /// + /// The target type must be known (statically) to be of the same or sm= aller size to current + /// type, and the current view must be properly aligned for the target= type. + /// + /// # Examples + /// + /// ```no_run + /// use kernel::io::{ + /// io_project, + /// Mmio, + /// Io, + /// Region, + /// }; + /// #[derive(FromBytes, IntoBytes)] + /// #[repr(C)] + /// struct MyStruct { field: u32, } + /// + /// # fn test(mmio: &Mmio<'_, Region<0x1000>>) { + /// // let mmio: Mmio<'_, Region<0x1000>>; + /// let whole: Mmio<'_, MyStruct> =3D mmio.cast(); + /// # } + /// ``` + #[inline] + fn cast(self) -> ::View<'a, U> + where + Self::Target: FromBytes + IntoBytes, + U: FromBytes + IntoBytes, + { + let view =3D self.as_view(); + let ptr =3D Self::Backend::as_ptr(view); + + const_assert!(size_of::() <=3D Self::Target::MIN_SIZE); + const_assert!(align_of::() <=3D Self::Target::MIN_ALIGN.as_usiz= e()); + + // SAFETY: We have checked bounds and alignment, so this is a vali= d projection. + unsafe { Self::Backend::project_view(view, ptr.cast()) } + } + /// Try to convert into a different typed I/O view. /// /// A runtime check is performed to ensure that the target type is of = same or smaller size to --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013068.outbound.protection.outlook.com [40.93.196.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF2954071E5; Thu, 27 Aug 2026 08:52:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820755; cv=fail; b=ssbjrLQABaQWfAVlvaK/IERMKZWf3ryT/7Q51M/bR9iOQu8H/nxNV+58PfyM696Q4nqHgth93dG8o/uJv+ro8M1WpekSA9XLYCQv8dhSdfI97tYIpTO5THt9N3TwjNgvcI3S9jlHacfPJlCbxi2SS8IsuD6YWhpiMCFpKfX3u4A= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820755; c=relaxed/simple; bh=ZcakkqAf+dxyphqHPPJb0r/MGC9TS4nk0J6L+LGWPz4=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=RxNVW1ZJ/YFEej73OzAaGn7LihOXsc6ocQg0hkliae9x0FBF1w79Ge2jcu58AX27C1VshwEX1op+KYJpCIK6svZqAMDPUWMRSqsPphRAh4cD/jRZtc9E5LHX3DC83TDlx969H5Kx78SS+VypVSLtZE2bBoDT+7Hy/uitTgDqmxM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=XLyKfxOY; arc=fail smtp.client-ip=40.93.196.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="XLyKfxOY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NVle2ANurgKgqfHprrIKnhqqu3GJ8IlgeY8gixSdImbbjA+864+K1YGIqILo75JehQFMSFjWk5QZLNufjX5mEbbuHpd+bNOzoIf3YmTYUnkd+wS6ZmkLsGYf+GYnMVb3M461aG0J+0M1UyV9gG21kESPwUjRsnnlNZYShxE4EzBLxyXqC4M7igpXr0KpxyzWRbKxjYkhkzubx/aqBJ/8OLhkF/U8m/h3+Jp/6Tf02vNoNwzslRdA7vzmm4f1lOn2PU8QODPrk5OGSH1p7oqMrGybuh9Rvo89c3/dcobQbvkJDrNNd81YoBSTF7k/98D36vEma/7Oi2sJt0HQt9f9rw== 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=aXZzEB1H83FqJAgguKXFF78FGyNwpUhRjgkG9hjDGx8=; b=L8nMS0NXAVcEIUr36JueSOr7+59yleUO4FpfJvTDAIiNzbjuM9wyGFhS5LWKGsyr0LPj2ChYAg2RJ3F7DsHBqBs/45/GN2YJa76zNd8qXoB3wS9R/goywXxr1l8MQtQQULmHeLB7GJ0CIf0IiVtNAF5oysLbsQm3H8UYIdBgKfCzmj1GJOPg3ztgaP3dCSKd2enZ6uOy5FeoryXyb1pAOSLcxSrCjGmki2HVVXQXlCnwBUOsv/K+cmBj5YKvpQRonORtlECyxJTDWan0wwhXtr9C/ZytzQA8qHq0kQiAxgeSLYVCjr4RQ0Xob+ET0Bq6Khcj1leTQSej1lIRZmdsBg== 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=aXZzEB1H83FqJAgguKXFF78FGyNwpUhRjgkG9hjDGx8=; b=XLyKfxOYxP71WKnjI1SIQjGhzXAv/YxRYw7xDCrvYUJQnRQAA3DcqHx4JTQvPFm5eHtbD2qdoH+RzLWWmZqqZRMULnilHD8FVuZpiewsYkruY4+kJeR+TK+CwlQ9yho4cKj6Hazm4++eFf0jg5qmdZC/e7Bs+7J+8oKw/1nQQGWrZb5oHCHOKow7Bub8e2/FhHVF39qAkEVTRoPJPmlWZJnjnor6zT7HWmrszb2WN+JAvBXdsExIV72XKAgNhYXnSHQd4xprhpJhW5qfs7/43WM1KbemAwaTDpMhvruN5CshACVFQgES9qI9/xh8dOXaIgUEVjcW8L8TITzLAekz5A== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:27 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:27 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:47 +0900 Subject: [PATCH v3 06/10] gpu: nova-core: mm: Add support to use PRAMIN windows to write to VRAM Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-6-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCPR01CA0201.jpnprd01.prod.outlook.com (2603:1096:405:7a::18) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: 1e215a75-1d1b-4517-f35c-08df04188577 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|6133799003|10067099003|11063799006|56012099006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: P/oeMRgrN5sJM2jaqPAZoGDL7WAzg2EQLnWR8wTVfcJuTmPnEZVu0xvSVEeqHqDPpEJOn4Gh6T+j57MqXKwH4EEE9IpEwnA4eLXZy6PCCVnLl1oK+kKP2NwkqaBo3sDpadRHUGC6bcNfMFGA4qTDDQFCmQcKMWZWxQpLqfPwCN0WjiQWG2uhrR8RQF/g4nOzyQ5NV5z0jP6XSTNXgiU66UNkcoGbqLN7B6ch77ZKHBpUyDkbaKCd1lVMEcWbdbZWW6XIxOn2FC+rkuHVKIccwDrDBBa/JgdajOfJcsp3gK0ch7vDFAumXH7pK1Y2XsWqakfqwkshxREqa4BbyRFSGIKlQa9geTxmOP2RaSmH+jH1GZdh6Aw1njCWCbdFpUaq/Y1Furdx1ICvG9lgls82yYwbFXJ+cbXaUEke41qIcvKhlF3vw/x1QkbvfffO9noHylEikc31N8MB3K3depSceSHB4Dlma4tcwEqL/LhYm11C9TxC12tGRDtv8mL9qSVqYHE9QWQLv4gIODz6wiUtKVfeOoKXvFo9L3Nypn7FAabiafCx8wrjqaf4Laosf+lMpPtzqvF9RiJ25WWwbl+N95ej615HDerHqyzoNc5TgrRpYqiwIDqXjZAcp8KKg6LVjrkDFDlDMVtKehbCx+egawwsMMlTRbPVZWQn//dDIAQQuSwaR8QeUSdY2qscEd1cNZSmlCQUAQP3wan6vD9D6Q== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(6133799003)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VEkwMWdPY25nR1p1K3pNS2x2MCtBNk1udGN3R2tTSDRaL0M3MUE3UHZhaHlz?= =?utf-8?B?ZnhLamRJODRVR2x5QitVWVZUL1NUWXMwN1Zmc2pxUzhUN29CbkpocCtWcGVs?= =?utf-8?B?dTBNQ2pDR3NZK2pMN25sUVZ3Nzg0NkVTNUhXTE9tWHRqNlFEb2ZjYmhTYzBw?= =?utf-8?B?MkhHMUk3S0R3S2p4WW1PalB6UlYxd1ZXRkN3ZGViWGMxQkxqTy8vRFVZZnRL?= =?utf-8?B?azNmS29hdjhYZUxJQXlZaEY2c01zN0gvTEZkeG4zZlV6dmQ3cVNCRllsRWtq?= =?utf-8?B?clBPMUZwdTBQUmdGWWNtQ0ptNmdkL28velcyVFc2emQ2aVhuUitTd3hDYVpw?= =?utf-8?B?cVc4M3AzKzdoNEYvbFAwUVUyNGt6cVVQOFZCUTQyUldnNy9NL285Q29nUnRV?= =?utf-8?B?OENJRWJacnlKd2tweEI4Q2p0NmNGNjBhR0VIdnhOZVM3TnZ6QVVVZHZFWkRn?= =?utf-8?B?UDM0eE5Td2RRQ0VCSXBFSlNFZnVjRENtQWp3Y01LYWozREZLSUpxeUM3QW9Y?= =?utf-8?B?czZOZlRKQkZGYkhQTHdOdVJGSk5ETithWTBDZ2JscE94R0FSWlltdEl4ZTZo?= =?utf-8?B?a3NFd1lxUWhrSlBKQWpzZmVVeEplSWhDTmYvREJhbG4weEN2b2MrN2JkRWN2?= =?utf-8?B?eUFFV3BZTWhXL0hTa2EzTW9YRmgvejZrejg4aXFlVFpOZFdOZmxYRVRKK0k3?= =?utf-8?B?cWwvSlprZEVRa05aTkJ6STlHVEsyMnYzbVN0VXluOHdmVmlHTktFdFNEU2RB?= =?utf-8?B?bFd5eUZMWUJlUWtyT1VxWlBITGNQTmFaUHJRa3NEeW9mcGh6SjE1ZU90UERJ?= =?utf-8?B?aSt6aXhod3BjelNQR1FiYWUwTWEvays2YUVDQ2VFNFl5amlvUDNUQVM0ODF1?= =?utf-8?B?bmdCTUlDUmh4SnZwei81cjhLOFpsOWw5NUlSYWxRUTgwLzhiSWI0dmdwQlZY?= =?utf-8?B?bGtWT3hNU1VubFk3OG9CVmdCZHVFMEdCUHpDT3RTSHFNcnpnMVFZdFd6WVVq?= =?utf-8?B?eTN5QmVqRjhYT1RtQVlsdUZDZHRxV05tOWQwQ2o2dkU0N2lRaDUxMk9wT3c0?= =?utf-8?B?MXhoM2pGMDluSjVacVlyVmxpSDNXbHFHVnNZTmNkWk45Nyt6U3VUeFhHdTdx?= =?utf-8?B?ZWtHVjZ2WVNpUk15UUc4cThOQUpJSlRIZXE2aWQ2Mk1rL05PRHh4QWRlNGpU?= =?utf-8?B?MnNPTGJqNkY1bStkdDR0QUtvZzRveUhCWGhnd2V1WkNOTUZNK1ppa1lqUU45?= =?utf-8?B?U2lhTkxvM2ZjZENndXdxSm5LYk9iMDR5ME52L29ORG9ldXdKY2oxeFJwNGsw?= =?utf-8?B?dXp6UlhyM2JGNjZHVEt5MmpjUUE2MDhCTlNJU3FwODFVS1IzNWd1dGVaR0h0?= =?utf-8?B?c2JkK203UDJkYlV6Ym9Dd3BUVjdxcEwyRVRNcEptYUFjdzFrVWMwWThabFNE?= =?utf-8?B?a2hPWHNlMlltWXBlQlgwNEV0S2hpVS9MTUdiSlUySXc4WnhEaDdnbEtmYita?= =?utf-8?B?cTlVdnRkeERmRmJ3dHZWR1UwWFRORU9XQjN6VFdRUWh4bjlsMitXdHZod2tZ?= =?utf-8?B?cFp5eCtuelFNZm5tWStoME13RVk5MW1BNmFVZExMeGlGYVhtcjRpN2dRZGFt?= =?utf-8?B?OW52VUNtU3pHZVQwZTdEVnB3djk1bUxnYzVYRmZUcWN5bHVGU3kxWkdWMTRt?= =?utf-8?B?dnVQREpwcm1ybWt0R1FnWk5DdkJETkVKME41TktBMXdKcjM4a0s0OFVqMDdL?= =?utf-8?B?Mm1xcGVYQlBlU2Z0MHNTTk9jbWxFelY4d1lzYTRYV3ZTT0JpMDRXQ2dQQURC?= =?utf-8?B?MmM2RDU2cGV6clN4MmFZcDZmUEVxSDhqLzVlN0pxVk03d01FZDErZE1UMEsx?= =?utf-8?B?aGd6MkZKYk83cTNORXd3K0RyOGF5Sm1BWm96VFJpSms0UG5RRE42Tyt4SFpv?= =?utf-8?B?MGNqQkltUjhJSW9Oa2V6OHZXQUNrK2Qwd2tPdnVyREdqWGdZWlh4UVdrWldQ?= =?utf-8?B?enJQZG9WazdScGRkK2lYUXIzNkc2SE9hcW9rMlk1c2lGRUhXWFEwS0c1aStQ?= =?utf-8?B?ZXN3V3NXWHA1MkxCOXNiU2QxZks0V1N4WnY1VFdISS9pVXptMkVqcjJ5N3BT?= =?utf-8?B?S0dEOVBJdk1FMXZuQzB0UCtBcFU0QnR6cXcrTHdrWXNIeVJyOG9HeS9FSGI2?= =?utf-8?B?UHN5OE1RRjB3SkJ2eHEwSVE3Q0hneFd3c0xOelVydklQMFU0cTd3RGowKzFQ?= =?utf-8?B?anQrYkZXNjE3aDhPM3hNbHJjeVBpTXNoazNOOWtrcHI1MzZQTFVhUzdYZEFi?= =?utf-8?B?emtLZzZKVXVpRUx3ak55SGUrYUxCZnY3NGV4ZkMvNkt6dWhpVXhjR2JRd2Iw?= =?utf-8?Q?7ESHDzSZAxUbOmK9UxMfZHLAYVhSDm/40h0nEuWgtu7oE?= X-MS-Exchange-AntiSpam-MessageData-1: uKUzy1GXl5QbyA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e215a75-1d1b-4517-f35c-08df04188577 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:27.5867 (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: sShZ7ieuCWybK/5xuNrHBodO+LLKBs3rTz7sihjpXeoexo+0Lyj0JBYuoXTnGKXQa9q6zd7+lz9mTDuhdQZvKw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 From: Joel Fernandes PRAMIN apertures are a crucial mechanism for direct CPU read/write to VRAM. Add a `Pramin` manager whose `window_at()` returns a typed MMIO view of VRAM through the 1 MiB PRAMIN aperture in BAR0, validating the view against the VRAM region and repositioning the window as needed for the accessed address. A view borrows `Pramin` mutably, so the window cannot move while the view is in use, and it inserts an ordering point on Drop. Signed-off-by: Joel Fernandes [ecourtney: split the registers and HAL into the two preceding patches] [ecourtney: rebase w.r.t. Bar0 lifetime changes and register projections] [ecourtney: drop the window guard and mutex, use &mut self] [ecourtney: position at init to avoid reads, reposition in window_offset] [ecourtney: return typed MMIO views instead of read/write accessors] [ecourtney: insert an ordering read when a view drops] [ecourtney: declare the window location, drop the doc examples] [ecourtney: add the copyright header, doc and naming cleanups] [ecourtney: the pramin module is mm-internal] Co-developed-by: Eliot Courtney Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/mm.rs | 1 + drivers/gpu/nova-core/mm/pramin.rs | 178 +++++++++++++++++++++++++++++++++= ++++ 2 files changed, 179 insertions(+) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 07dce4ce2473..ef5b1cad56c3 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -20,6 +20,7 @@ }; =20 mod hal; +mod pramin; mod regs; =20 /// Physical VRAM address in GPU video memory. diff --git a/drivers/gpu/nova-core/mm/pramin.rs b/drivers/gpu/nova-core/mm/= pramin.rs new file mode 100644 index 000000000000..20be3fc471ba --- /dev/null +++ b/drivers/gpu/nova-core/mm/pramin.rs @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Utilities for accessing VRAM through the PRAMIN window. + +use core::ops::Range; + +use kernel::{ + io::{ + io_project, + register, + register::OffsetLoc, + Io, + Mmio, // + }, + prelude::*, + ptr::{ + Alignable, + Alignment, // + }, + sizes::{ + SZ_1M, + SZ_64K, // + }, +}; + +use crate::{ + driver::{ + Bar0, + NovaRegisters, // + }, + gpu::Chipset, + mm::{ + hal::{ + self, + MmHal, // + }, + VramAddress, // + }, + num::IntoSafeCast, // +}; + +/// Size of the PRAMIN window (1 MiB). +const WINDOW_SIZE: usize =3D SZ_1M; + +/// The PRAMIN window, which is a 1 MiB window into VRAM at a fixed BAR0 o= ffset. +#[derive(FromBytes, IntoBytes)] +struct PraminWindow([u8; WINDOW_SIZE]); + +register! { + base: NovaRegisters; + + /// Location of the window inside BAR0. + PRAMIN: PraminWindow @ 0x700000; +} + +/// Owner of the PRAMIN window state. +/// +/// [`Pramin::window_at()`] repositions the window as needed and returns a= typed MMIO view into +/// it, holding the manager borrowed for the lifetime of the view. +pub(super) struct Pramin<'gpu> { + bar: Bar0<'gpu>, + hal: &'static dyn MmHal, + /// MMIO view of the PRAMIN window in BAR0. + window: Mmio<'gpu, PraminWindow>, + /// VRAM range to keep the PRAMIN window inside. + vram_range: Range, + /// Cached window position. + window_range: Range, +} + +/// Typed view of VRAM through the PRAMIN window. +/// +/// Inserts an ordering point after previous writes through the window on = drop. Views returned +/// by [`PraminAccess::view()`] cannot outlive this access, so the orderin= g point covers every +/// write made through them. +pub(super) struct PraminAccess<'a, T> +where + T: FromBytes + IntoBytes, +{ + view: Mmio<'a, T>, +} + +impl PraminAccess<'_, T> +where + T: FromBytes + IntoBytes, +{ + /// Returns the MMIO view of the accessed location. + pub(super) fn view(&self) -> Mmio<'_, T> { + self.view + } +} + +impl Drop for PraminAccess<'_, T> +where + T: FromBytes + IntoBytes, +{ + fn drop(&mut self) { + // Insert an ordering point after previous writes through this win= dow. + self.view.cast::().read_val(); + } +} + +impl<'gpu> Pramin<'gpu> { + /// Alignment required by the PRAMIN window. + const BASE_ALIGN: Alignment =3D Alignment::new::(); + + /// Creates the window manager for the given VRAM region. + pub(super) fn new( + bar: Bar0<'gpu>, + chipset: Chipset, + vram_range: Range, + ) -> Result { + let hal =3D hal::mm_hal(chipset); + let window =3D io_project!(bar, build: PRAMIN); + let base =3D vram_range.start.align_down(Self::BASE_ALIGN); + let window_range =3D Self::window_range(base)?; + hal.write_pramin_window_base(bar, base)?; + + Ok(Self { + bar, + hal, + window, + vram_range, + window_range, + }) + } + + /// Returns the VRAM range a window based at `base` exposes. + fn window_range(base: VramAddress) -> Result> { + let end =3D base + .checked_add(WINDOW_SIZE.into_safe_cast()) + .ok_or(EINVAL)?; + Ok(base..end) + } + + /// Check the window covers `len` bytes at `addr`, moving it if needed. + /// + /// Returns the window offset at which to perform the access. + fn window_offset(&mut self, addr: VramAddress, len: usize) -> Result { + let end =3D addr.checked_add(len.into_safe_cast()).ok_or(EINVAL)?; + + let inside =3D |r: &Range| r.contains(&addr) && end <= =3D r.end; + if !inside(&self.vram_range) { + return Err(EINVAL); + } + + // Reposition the window if the access falls outside it. + if !inside(&self.window_range) { + let base =3D addr.align_down(Self::BASE_ALIGN); + let window_range =3D Self::window_range(base)?; + if !inside(&window_range) { + return Err(EINVAL); + } + self.hal.write_pramin_window_base(self.bar, base)?; + self.window_range =3D window_range; + } + + Ok((addr - self.window_range.start).into_safe_cast()) + } + + /// Return a typed MMIO view of a `T` at `vram_addr`. + /// + /// Returns an error if `vram_addr` is not aligned to `T`'s alignment,= or if + /// a `T` at `vram_addr` does not fit within the VRAM region. + pub(super) fn window_at<'a, T>( + &'a mut self, + vram_addr: VramAddress, + ) -> Result> + where + T: FromBytes + IntoBytes, + { + let offset =3D self.window_offset(vram_addr, size_of::())?; + let view =3D io_project!(self.window, try: OffsetLoc::new(offset)); + + Ok(PraminAccess { view }) + } +} --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013068.outbound.protection.outlook.com [40.93.196.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D57E0403B02; Thu, 27 Aug 2026 08:52:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820757; cv=fail; b=BHxkfUhDj8dIN/fvIW3avBHbRbEXGffTSCwW2tvBLBgKpMCLYXoMiKsrGMQOFCMb3saZKfPwrYKYLWOkY6OHKS0+xXfjS9PCoVAFfvw7KDEHX31YPb7TXo0FkQJ5dNuTBR42yASJRcogYV0t/ArDD+oVk660FQAnjHJ/2el2JIc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820757; c=relaxed/simple; bh=qDe+bBnryJ8LX/jtt9JP6PFqolHDEim10Py/YwvznVU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=kgGScFcPjm0qSMBvN99VzhTJJS+9IH1jC9SBq2nTh04j4QUUGK6wGaPIg2YLEPt0f4G79j55KCXCkQpFVzMCc4UqR3sUlTt7desHoGJWLWk5XdED4C9kpeO1hIGy6q4dwpE3wtIWZigxuooIf/KPxrdDoSgMWNTwMkkTiWjZWy0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=JcocZZK5; arc=fail smtp.client-ip=40.93.196.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="JcocZZK5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=goRclbBSczFP4ELWxljMAPWRRJpa1ls2uvh8k3YInfdrbUh+m4ang5tO9ANtGejAgkSGpv2mkHdWmKhNcJ6bHgHzp106+T+Sd7sgHzfgQflAynh1j5TG7HTxN5ZH6AMylxJqkhqPzkPGvmTWFTxmAKsrCr2a/h0s/lHUSPBZ+5Pi3X37PbBq1rvUSfs5gcvl9vyz2ZRtRsyyRSgc4sSMkVmByx+yrqjsD9zVkembjdW+qAQEb7PYCYRW5uz4s3/rBqsRC6K6FbnaL9fIdfBWYrNdvmMTDSTBx55l2rvCm06MNuOWKIsYRanV/hiXoZR5j8UB8RHodH0kFv2Fi6IjzA== 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=QrhQCq9TfB6+BQJFSUUUFXtQ5C7LOiyKKboARNboz4I=; b=sm8Dl37UGpaLdeYqc+8ZuVIopRIQ74Tr/c5VveJaGfWy/+tMGRiEJwi2forjAUnHE3S+OwpuTS87eYPQHzcwT0fWchVGcrzuV0OuVlNTKo/gBm3513fEiIZmWhLLeACiwap9ev2ZRl+vVtHIbB2ty8AcZLB3/BKo3pd+h9x6TgWYS7zAcHZxSTGXLjGHFc+BqrEUq+il45yl4zLc8aQ4pgnhu+6PgfTZS/lwdDoAMHXNqyHVXycwsTILdvb6/FJ7Sg5/MP97ALJ3SE2+sg0CO/ggXtONHf0RJ98sp8cLggnq7IJX/2RmPfh0hLeU+TLWHJgp7812QYttZOWdNr+HCQ== 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=QrhQCq9TfB6+BQJFSUUUFXtQ5C7LOiyKKboARNboz4I=; b=JcocZZK5FRAPvYzEbYoKqha9sZfxO7vpb/lXtU/yWJKlHU7sVCeRBvDJ6bPFn//NgWiDlR/LcCD+X0jGub7/SbufnFyZv1/AK3fFmAFiveszJiudAp13Cqy8A+dLxOfril8FonE//sv0P61PdPO4MfQTmXrEE24jwC+VNA6MqQpbjhbRg7m1BXve3Afn3WN1bdTuancXgRvAgQ9NzFdHA1gdui8oPtKOCR+Nxd6DNOewXhR4h9qV6oF9FPTc8HpB/tlH/aDVyXW8fUd7qWcF6Kk3XfvYWhWE01h0w3vxpPpjZl+y2NdreuHP851z95/Kr33oiZr5hHvcnq8XxMLAFA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:31 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:31 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:48 +0900 Subject: [PATCH v3 07/10] docs: gpu: nova-core: Document the PRAMIN aperture mechanism Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-7-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP286CA0316.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3b7::9) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: 2f62721e-144d-47f9-25a9-08df04188782 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|6133799003|10067099003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: MK/9n9EbvbEIneLbp3ehrbN4Ga42IupfChZpa29n8rzNmqzs0QQxlmbTyI2MgcbIzXJU13Nx/lQNjKnbvv7htZwlbDtURNIbQUFNjs7XHEYtQVnIYbbMD2ecG1u9Wz5SjGq5qL4CeW/pN10fAmiUuyndwYwmG3OWMx4vGGARmB/B8+2u2KESP95LAlE2QxSMBawDSxueNcFOw1bozoIRFkxZfNNWXCeIVbWD88y1eVdf9cVRfJ3SVldcoRE2468G3uducrxb41dTd46p481JfX/h9+PJuFJ6sLMa8c7s3p4503Oobxc0Js1qPWbXBEGRTEC/ZtQe7D55Vi9nIBc3Wy9fKtmqINRjRtejzTzD3HfobMIMD3xhFxcGk9ZhiLzRazPZKXSYD/jupR/EVfLQuiFEVHfG3rIWnNuW4aluC2po2LiA/qHAh+19ThmwSh+pXDX0nyFXvEXSE6u7Aqb6AxqkJApu4VFAhwl1CaDWtjQz+H89xEeUx5oEZ1VhT/dxrDB/sMByMALPcwem/4k088mMlR8QYer8JtP7BpJREkAuRNv0uBz452BM6sggnwegRBiLWhrfHhaVz3jaggwj9804rJZSoELHW3YIYQ5ItG1CLkN498xZE35FKJUpQaacrHmHXB8AMsUkeNjuYQV2po2DLnrmlBeXYgLjCVuycs7cA43iZwBDFIjREm6aamE9cria3DxYSGGpYFsPui+S2A== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(6133799003)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?c3lUTFJWZGhzY1pMYzIwVnpBL25IYUpCcXdGaWEvTUR2aTFuL2lOQk50R0lC?= =?utf-8?B?azh6d1JVYlB0aFp3RklObTBlY0VCYzgwNXpoMTVKdldmanRiZlA2VDRIenpP?= =?utf-8?B?ZGlFMmx3UjhublZMUzlDMFdkYm9hbitDQmNjOVkzWmg0NEFrZFpIeXZmdGhq?= =?utf-8?B?a2JTS0hMM3craW82Tjl3eVVtRVlWQlhXM3dQdm9nUGJvR01qeGJMaDlPUXNJ?= =?utf-8?B?bGR1dnoweXA5TW1XSkFnMHVDZ1ZWQ1NyeWV1d3FRSlNoVW9HZ0F2aDRmbUtm?= =?utf-8?B?anM2SjZlNmppdElNUU04aWphMTBhTjNEcGtzWXYwZHhYaGFLa2lscGVtcFNK?= =?utf-8?B?NUNCZno0YTN3Q3hVTFlRVGtRODJ0TUV2cHlONC9NbUZnOXdZd3lTUEtOY3FJ?= =?utf-8?B?OTJ3d2tFZUdPYzhkaDhhRXZSaWFISWswOE9PcXVpT1NBYWM2YTZKQ1VIWmg3?= =?utf-8?B?V21RM2lQZlVhNE52SWlGLzA4eTJQYXdHK2VSaDlMeFhJYld3ZUQ1cE1mejNI?= =?utf-8?B?ZEdmS3BvZ0NlLzRFT29BZnF1Zklua3hwVHdSYzNYMXUxdmliQmdoOUt0Sjln?= =?utf-8?B?bDJJV1p2OVJhR25lYTNrMURlYiswc0tZU2pqd2c0eEV6YWdTVjc5aWJhSlU1?= =?utf-8?B?L0xUWGtBOHhKdUlmMzIwT1R5Nm1LTkJwd0VBbGZOOW0vaHUvNjBMZGRuclpz?= =?utf-8?B?andQd1YvVlIyQlZyemYrZHVzRlpVU1ZrSW9ycmNRMEdnaFRCSHZ1R0Z5ZnlU?= =?utf-8?B?UC9CNUVmdUUzVUhGWS9PRHhGTUh2NDAvMXJkUm9SbXF3NkN1RE5PWHVUaGpX?= =?utf-8?B?c0U2NmJHZ3VzbDNrdXJzZSt2RUxsSGZuQ0tnKzAxaDF4cjFkaHVuQ1AzMXlj?= =?utf-8?B?RjFNQVlxUytRc1kyR2pKU2R0SDErbG9lNU1JWXdCL2hjeWUvUkV0NGlQWjZC?= =?utf-8?B?c3BjeHcrU1BHNUdtSENDRmtOYlJwYkY1M1dyV3Z4RTlOd1ZtSVVUTlJwaU94?= =?utf-8?B?V2h0STlwMk54U2c0cmZrcVlaNHNzK0VvRVdHR1dyeEJERGwyNHU1UjdJbW5v?= =?utf-8?B?dENOb0pVU2swRllhZ3p3VjBaM1dGM3llMkN0aGU1blAxN1JHN2kzbEFSdFF2?= =?utf-8?B?a2dwc1JVUmgvOERCalkrWVRJaEEwZXIvZ1haTDd2OW45YWNLbUFtUWl3dENy?= =?utf-8?B?UkJCN1lLZURNRVZ1a0oySld3azNzeURIMnFSNyt6eTNEMnM0RmJXWWJsRHhZ?= =?utf-8?B?OTNEcjR2U0QxQ3JJbDVvUFgvNmFVdFBCWXFLOExEUHN2bThmK1EzRllkUUYz?= =?utf-8?B?cnBZeGhLRXFOeUt5VEhoWjc2SnJobmJ3UitZYU5ORVVsRzBRcTVTSWlXRGpk?= =?utf-8?B?OG1ESXdhbjQ5SHpxNm4vUWxCczIvc2ZMQkM1NnJTUkpYbDNFYnVjam9oVGpL?= =?utf-8?B?QS9MN2NNeWVCNElYaHpiejh1bkJDblNYWllOMUlwTGJsempZTVBnZEhQSVB1?= =?utf-8?B?UDhGdXNOZWNZaGRxdkg3dGkwc2I3OVAxUFc4RHo1N3Yva005ZDhaRkMzczdM?= =?utf-8?B?dVJWN0h0Uno5T2cwQ3hXTFlpMWNRZHNPWTFPRnNoMjdIaERrdldiZ0R2UVE4?= =?utf-8?B?Zkd2eTJzZmNTdU12UDE5bnNKR0hjOENrUHU1cmlxeFFlVW9BVXg5Q1dJdUNl?= =?utf-8?B?OStEaGdXcGtvc2JDYlV5SkdlYUhYRmFMYjMzUS9jOXAxSEwwbit5TTJTemJn?= =?utf-8?B?dE5SWWR0K1gwSGlzTnI2QVFQQnZNY3AxVktTbmdUQmUxM0xOYmZMbDBYaFBV?= =?utf-8?B?emdtb3VnZG1xMXhtZkQ0RUZDeWtFVVRxaFdoY0xsdEJoMlBDdkFqY05jblJV?= =?utf-8?B?c1NZVXN1a0l4dVRTUTJueEN6TUo0QUNqQlMrZExlRVdGMDZMOUZnVFJQWTQr?= =?utf-8?B?RmlHb1g1bFpNM0Z5b0N0dFlTRS9ZeW9WRWY0aGNDK3JBY20xMEZYa0dQa2da?= =?utf-8?B?T2pOMFYwN0JDOWorbzRORlJRRTJrN2FsdHNQZ2dKanByNm13MWY4Zll5UHRa?= =?utf-8?B?UUsxTHhOUk1qd0ZyV0pZZFY5MjRheStEd2Vxait1c3VuOU9sNU5FTnc3WDZT?= =?utf-8?B?cGpWTE54NkttaFRZQXBVaWlLcWlKSDlGT2VBQjBUV1NzNW9MUndqODFUNFZG?= =?utf-8?B?b3hQMWlOYmpSaHB2TXVtUFViQWJRUm5NajMvUFZKZUVsZEQ0R0I1di94WU11?= =?utf-8?B?SS84NzhpQ09GL3VqeUFIc0E4eXBReG1xRnRYanBnWmlvR2JDT0dJYWhEbEd3?= =?utf-8?B?amczSHpXWmVTQjVIS0NpYnRNQUlQS0tIK1V0U1JRL1ZEM2xSTGlvU250ZHFn?= =?utf-8?Q?6dCWr5jw5F4PNZpqNh3gJvxD3SAmH7x+2tHXCWoCJraib?= X-MS-Exchange-AntiSpam-MessageData-1: axpu2ODQBwBvVg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2f62721e-144d-47f9-25a9-08df04188782 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:30.9979 (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: /et0SaZcwdcMM0ETfoSy7ubKSWIqZ3SaLUywHvDGmVzAivQUATtlusIVIFzzgmDfy5YvrU98ppQJGIIILHxB5g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 From: Joel Fernandes Add documentation for the PRAMIN aperture mechanism used by nova-core for direct VRAM access. Nova only uses TARGET=3DVRAM for VRAM access. The SYS_MEM target values are documented for completeness but not used by the driver. Signed-off-by: Joel Fernandes [ecourtney: fix the TARGET encodings, KiB/MiB units, wording nits] [ecourtney: wrap at 80 columns] Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- Documentation/gpu/nova/core/pramin.rst | 128 +++++++++++++++++++++++++++++= ++++ Documentation/gpu/nova/index.rst | 1 + 2 files changed, 129 insertions(+) diff --git a/Documentation/gpu/nova/core/pramin.rst b/Documentation/gpu/nov= a/core/pramin.rst new file mode 100644 index 000000000000..f50b052d73ba --- /dev/null +++ b/Documentation/gpu/nova/core/pramin.rst @@ -0,0 +1,128 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D +PRAMIN aperture mechanism +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +.. note:: + The following description is approximate and current as of the Ampere + family. It may change for future generations and is intended to assist = in + understanding the driver code. + +Introduction +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +PRAMIN is a hardware aperture mechanism that provides CPU access to GPU Vi= deo +RAM (VRAM) before the GPU's Memory Management Unit (MMU) and page tables a= re +initialized. This 1 MiB sliding window, located at a fixed offset within B= AR0, +is essential for setting up page tables and other critical GPU data struct= ures +without relying on the GPU's MMU. + +Architecture Overview +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The PRAMIN aperture mechanism is logically implemented by the GPU's PBUS (= PCIe +Bus Controller Unit) and provides a CPU-accessible window into VRAM throug= h the +PCIe interface:: + + +-----------------+ PCIe +------------------------------+ + | CPU |<----------->| GPU | + +-----------------+ | | + | +----------------------+ | + | | PBUS | | + | | (Bus Controller) | | + | | | | + | | +--------------+ <------------ [= 1] + | | | PRAMIN | | | + | | | Window | | | + | | | (1 MiB) | | | + | | +--------------+ | | + | | | | | + | +---------|------------+ | + | | | + | v | + | +----------------------+ <------- [= 2] + | | VRAM | | + | | (Several GiB) | | + | | | | + | | FB[0x0000000000] | | + | | ... | | + | | FB[0xFFFFFFFFFF] | | + | +----------------------+ | + +------------------------------+ + + [1] Window starts at BAR0 + 0x700000. + [2] Program PRAMIN to any 64 KiB-aligned VRAM boundary. + +PBUS is responsible for, among other things, handling MMIO +accesses to the BAR registers. + +PRAMIN Window Operation +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The PRAMIN window provides a 1 MiB sliding aperture that can be reposition= ed +over the entire VRAM address space using the ``NV_PBUS_BAR0_WINDOW`` regis= ter. + +Window Control Mechanism +------------------------- + +:: + + NV_PBUS_BAR0_WINDOW Register (0x1700): + +-------+--------+--------------------------------------+ + | 31:26 | 25:24 | 23:0 | + | RSVD | TARGET | BASE_ADDR | + | | | (bits 39:16 of VRAM address) | + +-------+--------+--------------------------------------+ + + The 24-bit BASE_ADDR field encodes bits [39:16] of the target VRAM add= ress, + providing 40-bit (1 TiB) address space coverage with 64 KiB alignment. + + TARGET field (bits 25:24): + - 0x0: VRAM (Video Memory) + - 0x1: Reserved (unused) + - 0x2: SYS_MEM_COH (Coherent System Memory) + - 0x3: SYS_MEM_NONCOH (Non-coherent System Memory) + +.. note:: + Nova only uses TARGET=3DVRAM (0x0) for video memory access. The SYS_MEM + target values are documented here for hardware completeness but are + not used by the driver. + +64 KiB Alignment Requirement +---------------------------- + +The PRAMIN window must be aligned to 64 KiB boundaries in VRAM. This is en= forced +by the ``BASE_ADDR`` field representing bits [39:16] of the target address= :: + + VRAM Address Calculation: + actual_vram_addr =3D (BASE_ADDR << 16) + pramin_offset + Where: + - BASE_ADDR: 24-bit value from NV_PBUS_BAR0_WINDOW[23:0] + - pramin_offset: 20-bit offset within the PRAMIN window [0x00000-0xFFF= FF] + + Example Window Positioning: + +---------------------------------------------------------+ + | VRAM Space | + | | + | 0x0000000000 +-----------------+ <-- 64 KiB aligned | + | | PRAMIN Window | | + | | (1 MiB) | | + | 0x00000FFFFF +-----------------+ | + | | + | | ^ | + | | | Window can slide | + | v | to any 64 KiB-aligned boundary | + | | + | 0x0123400000 +-----------------+ <-- 64 KiB aligned | + | | PRAMIN Window | | + | | (1 MiB) | | + | 0x01234FFFFF +-----------------+ | + | | + | ... | + | | + | 0xFFFFF00000 +-----------------+ <-- 64 KiB aligned | + | | PRAMIN Window | | + | | (1 MiB) | | + | 0xFFFFFFFFFF +-----------------+ | + +---------------------------------------------------------+ diff --git a/Documentation/gpu/nova/index.rst b/Documentation/gpu/nova/inde= x.rst index 2afa58e8f08d..59b206238498 100644 --- a/Documentation/gpu/nova/index.rst +++ b/Documentation/gpu/nova/index.rst @@ -34,3 +34,4 @@ vGPU manager VFIO driver and the nova-drm driver. core/fwsec core/falcon core/tlv + core/pramin --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012021.outbound.protection.outlook.com [52.101.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BAF1401484; Thu, 27 Aug 2026 08:52:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820761; cv=fail; b=XIUbjVyZ9WacRsd4HkUu5DUZiGNZqp+aEBCNZS8OSeKW9R2s253hWmE9BVzmPCgkKHXOQ8YCjwH61podWt7KxVQWd1qkbIBnpinDWufpee1cEuuHnn561K8eOrfSXS1Y7ho63ekq74rZnW4eLVlfrAqYBsPPs+Mm0ccqA9DcidY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820761; c=relaxed/simple; bh=jYf90+GFoSFDiW09qhDGWxymFNGPVeQmPeHCpWIna/4=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=MBGJ1GtvP2ti+A/qjIMbdeis8baXtDyDGGDeBSPZ0mmi5RVzp5WbIrAJjBjOfIUqFgIVbSA+PZIjIl3gDlKdC8mpwPkpl4VP5DFoHNBD4tgweniFFPoS8qwUtjOBIqOwFF8D9szsDul8XA1XKcd4d0IiyxaDA555Oh2lpqhwBEs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=qAV4CflL; arc=fail smtp.client-ip=52.101.53.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="qAV4CflL" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HBY1oktNIZro+RKo75kmOSDr8CL2EgMxPa0SX6XYT5j04ZyIJJI7x6Z6cMnwCkHP82udJvQ5AlefdA3NuiNSBD0u+QkdS75/f1d2Tjz9t6shfs38hw3lbCrWIzrxcOrfSuTf5Wukz3NrafnktD5ATaI+eDqLmw9u6M6u6gUu8QOmFlNgRyiGMqgBz5dDCwNlhcjxLDT3lQXJk5PSH3sUH5UWSlXw3U6aLYROOyeYZMg7nGQtw04Lbc+dOWU+5RlodI1IR/+YnRnUHChcugns6fCny43KfcBCVefDmIcviKsMgX/BsDeU5F2uESCXuL6qDvxiTjVR6y0VE76004PI/g== 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=fXcWjPk28ZH4wMJrhygUDgBwyZ1KH0RkEBIsQESJoSI=; b=g/Exc2mwJWSzfQBMrpWR2OdewqI6eWoKT5e/lwmq3CJSK8mbBQP+PPJYjS7P1dJ1A4Avm7/V5hPdsk/wbpnfSv8vba6+GXTl8av21hZB0Q3LVlckKyCGQ54mKt5hEOiwpDimX7b6T2nR2TjhD/WQFO+V/C4K7hkIYUnaDPvWRDO1Q4AL/8Qdh0rSVeJU8HYBNDWGdcwcEVyaRNjP6Pr6StTMEOtBZaPFX1kobH2WCZxNgzHnXF8LOyWkLJECh56KAqqV46hTu/hZ0TmVF/8RZ8C8BlIR3n3A8jr1l+4NW/g0VlEjwBb1STOPLAjTkJ2O57bV+cdck3wIVR5FcExu+w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fXcWjPk28ZH4wMJrhygUDgBwyZ1KH0RkEBIsQESJoSI=; b=qAV4CflLurzZ4HtkdYLz94zTE1j9VLbj5hjrVg548e0yC+ssmGyinbLjMnklgNYldXgRemMLqXWKCUG9TE0wU0/NovBEUhTHX9A5thznnOiU4Q6w5ILdFbKTeWJ91ZqQpNTffjgoQwXroNQKAuWdhWXlQWckEHiofoPfJI5l3JWjNatIpFFAEk+q2dEGLN+AgqFxCEHcQ8JtLN3i6bRl+5Rj5y7oeyELwCu1aaEegeCl4I02IyyK7sxaxR0YyX/Xdvn/vTzg1rTnjs3Daq9t0gHnky2g9he62uMETMT+crASg2cXWKDrEA+eo/7Khqdvv4RYmZgKqsGReDH8QfPufg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by BL1PR12MB5729.namprd12.prod.outlook.com (2603:10b6:208:384::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.6; Thu, 27 Aug 2026 08:52:34 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:34 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:49 +0900 Subject: [PATCH v3 08/10] gpu: nova-core: mm: Add GpuMm centralized memory manager Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-8-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCPR01CA0210.jpnprd01.prod.outlook.com (2603:1096:405:7a::9) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|BL1PR12MB5729:EE_ X-MS-Office365-Filtering-Correlation-Id: 0a12c9d7-7ec7-4ad8-0766-08df04188979 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|23010399003|1800799024|366016|921020|6133799003|10067099003|11063799006|56012099006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: 2YS8KaKXQNOxXr0NuOlio563q1KQj+Tk41cGyRLGZmaZs2m9mNCGqrwI6TnrS2wh88nhL42tLrP5J9W9elXPRrdOz5jUnYuBhPMauLtQ5YjNcUNhrvEjED3RIqei5Emp+dhw7p+Jphk37eQj8o+CMRfSIqnKQN9fI4hlxUVCYgg2sNpBMhJ7+gfkoodjryV0GYLSDA2P+BjU8hhUSkaBd5cRsuLcVvXRMCfY3YLPEIv6ILON45S+m1XwqoSzZhl7X98zouN4YFZfo9KAKXLMEuqmWDBP9aOK4vzndQcldaDT4vCKdn5kiHuisiv+6JmQCIPsjhYDtPXon/2A6wPTo8bFF8QDMnuE7WH4QDaKfngPue27i953lOJXcK1pld1rWS6TtAF8LuqsiFwpegSI1p00ND+3wTWNYemrGF1OvlzWfs/wOdrYytfKn1rEt8S43Gf+RmJRl+weGNjVmK8UO0ABAqzcb4gyuqCyUysxDvG0otb001SC5YBRrUDsEkXhGstzyG/awIt2nZc+nmZcyi3wIJh/+375yfRTeXLg6jggbSrBjCGzUDrffS6C8Dcpfq+MX+sB1tpri2IhYiAOuaKVmjCPlZcuH8miDAqjHyZeYgIxqwSJrSxrf3bdgZAo6ClvY1RWMTvJruMs0/fkeTTymXNhufWMQ6MC3bE2oJL61+nQ9HB89GXWZar2L2M0w+1gFPZ7e3tXgFeq88a/kw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(23010399003)(1800799024)(366016)(921020)(6133799003)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WWYyZVh1KzMwZ29GaXNSV25BSXpRNTh5a3NDbDRISmZ5YXBwN2U3aisxTXpD?= =?utf-8?B?dWljTlVPdEE5eStKRzZYdHJ2RDJpdTRZcFJMNklia05JN1B0Uyt3S1RYSjZV?= =?utf-8?B?MVE1ZS9DbmR0TSt4bVhaRVMvMEFObmExUFFyRm1uc09ZbWgwTWxzdGducUkw?= =?utf-8?B?N2gyM2hkVzNQallzeUR0WmFML01icUdidS9QSEVkSFJ0S0hNWHBxQTlnRnVL?= =?utf-8?B?VFE0a3l3MkwwNkhNRjhjMnQzcWNDMitVNVFIQmRLdjdVU0NpanljK0lrbGtt?= =?utf-8?B?Q3FZZU82MndKQjlzbXdGSXNBOW5QQVpYOFZIbUJiL0czbFN4YURmVGlIUjZs?= =?utf-8?B?MGxnNGltcVJuWVlRMjVSbVdYN3FGRS9kb0hpalVsNmM4bzI5VmxPR3BZcFRR?= =?utf-8?B?TXBPVGM2b2JEVCtGNlAwL0NNdUhLMXd6bDBna1VtT0I0QkdxSktNR2pUdUdQ?= =?utf-8?B?Um5QeEl2OElWaUFXOFVzZkhjVUtOLzR5K0Mxa0lYWk9nd0dLdm5zbjlvWUoy?= =?utf-8?B?RVpXQ2I4YXVWSWVKTzFUVFo5cXJINlloRmZ4cUVGN0E4TFA1SEdXMlRXNXNW?= =?utf-8?B?c0NLNTdZMnBwMzI4QlBUeTh1OWhvTStxcElZUUNJZEwyaXFZL0NxeS84OTBF?= =?utf-8?B?TStQRllWbHArVkwrN0FmZmNubkt5Y1FMU21QOWlXQlNoSExobzIxSXpsSEtq?= =?utf-8?B?dXloZTdPd1lZRzlMWDAzNk5OelB2ZFh5QU5UQmUrZFU1d0J3M3U1djlTS20v?= =?utf-8?B?TFdZZnNMTjY2ZXFFSU1EaGdwRG03eVdLRnQrSXpnUGptVllSSkx6akI4dm9K?= =?utf-8?B?NmJINXBSNUNSbkYzZU90Y0IrRVFhNGVDWVRrR2VZM25XSFE4b0hBRG56N2ZY?= =?utf-8?B?VFZhUjEwK05qaTJIN1VNUkU5Wmo2aFJ2Wm9YMi82YU44c29kSEl2dlNCRWZu?= =?utf-8?B?cFVLeWd0OHpDSmdwZHJvL1BNMEgxc1VHSm9SQ1p5d2taRDIvWXFVZ1A5NWxt?= =?utf-8?B?K2taYldMZTI5RXRXZ2xJdHBOWXFjL1RxV0RnMXo5MlZGTkc3cmQ1Ymdkb0Mr?= =?utf-8?B?by9UbFVuSW1KZ1pZU3ZaVFJOSTZiaWMyemtGUElCa1dxaHdVdVlCK3F4Nzkv?= =?utf-8?B?ZFZHY05MaUQxaExKY1R2R2p1WGRpM0F5MW5aT3ZUb2VVV0VndGhoc0UvTDIx?= =?utf-8?B?WDNuMU1DQ01SaW9LYkgzaDJVcks4b0lRVVFKWGNodDdEbkVDTEZ4RDlLaW5Y?= =?utf-8?B?b05EdThDcWI2a0djTE5hMXVsM2JWdE5LSEhhMTlaZmtTY3k3aDVPYjNQa00y?= =?utf-8?B?NHNZakdiSWkzd2hVY0VvdDdRUFU2d1IxRTdvcHdNMTRUTHBvK2IwZ2ZRTlp4?= =?utf-8?B?dXdQa0dMQXdNVVlMZkNNUWF4WCtXOFdnVTEwN09ZR296WXV2VDlGbVIyTHJ0?= =?utf-8?B?aFpsSHdibStTRnFQWC9EaFNCaGlYeWpYVGdIcXNBU21kKzNUaTBSTjNqeFk0?= =?utf-8?B?L0pjUXNpWUFXOVJab1pJVVAybHVjVUFRdlBLa1FPNkdGamR5dk1ENERJcnNG?= =?utf-8?B?WmhQRklnRE9jeXQzU0czT3JuNGhPQ2syTjQyODdRbVdXWWo4UFNmSEZjeDl1?= =?utf-8?B?cTNmWjRndU44L3JBMEpnRHdMb0NENWNTYUtBbkExd09ZNGdTbzhTQXZiNC90?= =?utf-8?B?NVo0M3lYNm5sWDVXd05Nc2pycTVXSmQwcEx1Vkl5TWRvR2YzaTdvYzVPSlRh?= =?utf-8?B?ekZQTDFkSzBGbmJ3aUtNUzJ6TEE2RnVlVzA4ejViNUZMeVNlZmhVbGFpVndo?= =?utf-8?B?anovSnBMditySGRzSFpoTXF0ZEc4OGZaR1dDRUNrQ01CS2NRMVN4cWZjeXFr?= =?utf-8?B?U1VCbUNQQ1JPcTRDb1BqczRFMWJPdmNsUHd1TENyMVowTGhqdU4yc3VjamEw?= =?utf-8?B?U1dxOHdrOVdhZDZZT3VOTmgweGhPdUMydUZDN2lHeDBXQjd0ZkRIV2w5VmRy?= =?utf-8?B?ZERBQXB6MmlHTTlhd0NiSTZuYWh4NzFDMitTWlFKL2d5RzBEWkVFZGdNQlYr?= =?utf-8?B?cWwzSXh5SnJKZ2pUL1EwUDN5MnZwK0tpem5rOFpXWU5pMkowdEd1UEMza3Z0?= =?utf-8?B?cURiTWVzK0l3S09NY1k1YnN5UTBRNjM5a3hWb1ZEaGhYdVdtWEhRRXRBdE1l?= =?utf-8?B?YVM0bTFCR3VDeEJOd3cwaDJmUnNON0hmekw2RkVmVTA4N0s5Tzk2ZzBNcXpX?= =?utf-8?B?VUdDT09jY2piS0hzRm8ycGFGdEI3VHhoWEcxemdwNTdBcFhFMzYrcFhRS3hM?= =?utf-8?B?bzBPdndhaDd4Z2I1cXRwUFRnRTNwL0c3eTFjT3ViYUlJU2R5ME82Vml0bzJw?= =?utf-8?Q?Ia6tpHR9a8OApQeoxfvFfgWvc6gR0lH0Wot+LID8T4V3J?= X-MS-Exchange-AntiSpam-MessageData-1: HISmndGbUAKNrA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0a12c9d7-7ec7-4ad8-0766-08df04188979 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:34.5511 (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: vimHb+XVh4Bivm9B7WOG0UCl3Zxa0ZezstqFAcHqO+viORDXQfIUaQGzb0DALE0WtKFHjJ4kF4c44qCir51+Ug== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5729 From: Joel Fernandes Introduce GpuMm as the centralized GPU memory manager. At this point in the series, GpuMm only owns the PRAMIN window for direct VRAM access; the buddy allocator and TLB manager are added later when those backing types become available. This provides a clean ownership model where GpuMm provides accessor methods for its components that can be used for memory management operations, and lets follow-on patches (such as the PRAMIN aperture self-tests) reference `pramin_mut()` cleanly. Signed-off-by: Joel Fernandes [ecourtney: squash the total VRAM end patch, drop its dev_info print] [ecourtney: take the maximum FB limit before adding one, fail with EINVAL] [ecourtney: rebase for the Bar0 lifetime and ownership changes, drop Arcs] [ecourtney: source the chipset through gsp_resources] [ecourtney: build the VRAM region in new(), pramin() becomes pramin_mut()] [ecourtney: declare mm before gsp_resources, doc wording cleanups] Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/gpu.rs | 18 +++++++++++++++- drivers/gpu/nova-core/gsp/commands.rs | 4 ++++ drivers/gpu/nova-core/gsp/fw/commands.rs | 5 +++++ drivers/gpu/nova-core/mm.rs | 35 ++++++++++++++++++++++++++++= ++++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index fd1414004dd0..7b3e378c429b 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -29,6 +29,10 @@ Gsp, GspBootContext, // }, + mm::{ + GpuMm, + VramAddress, // + }, regs, vgpu::VgpuManager, // }; @@ -283,6 +287,11 @@ pub(crate) struct Gpu<'gpu> { spec: Spec, /// Static GPU information as provided by the GSP. gsp_static_info: GetGspStaticInfoReply, + /// GPU memory manager owning memory management resources. + /// + /// Must be kept declared *before* `gsp_resources`, so that its compon= ents are dropped while + /// the GSP is still operational. + mm: GpuMm<'gpu>, /// GSP and its resources. #[pin] gsp_resources: GspResources<'gpu>, @@ -410,7 +419,14 @@ pub(crate) fn new<'a>( } =20 info - } + }, + + // Create GPU memory manager owning memory management resource= s. + mm: GpuMm::new( + bar, + gsp_resources.spec.chipset, + VramAddress::from_raw(gsp_static_info.total_fb_end), + )?, }) } } diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index ffc25fd8c47b..eea1c9ed4684 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -216,6 +216,8 @@ pub(crate) struct GetGspStaticInfoReply { gpu_name: [u8; 64], /// Usable FB (VRAM) regions for driver memory allocation. pub(crate) usable_fb_regions: KVec>, + /// Exclusive end of the FB physical address space. + pub(crate) total_fb_end: u64, } =20 impl MessageFromGsp for GetGspStaticInfoReply { @@ -231,10 +233,12 @@ fn read( for region in msg.usable_fb_regions() { usable_fb_regions.push(region, GFP_KERNEL)?; } + let total_fb_end =3D msg.total_fb_end().ok_or(EINVAL)?; =20 Ok(GetGspStaticInfoReply { gpu_name: msg.gpu_name_str(), usable_fb_regions, + total_fb_end, }) } } diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index 6dc31d1bf5ae..6e85442a4b13 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -165,6 +165,11 @@ pub(crate) fn usable_fb_regions(&self) -> impl Iterato= r> + '_ } }) } + + /// Computes the exclusive end of the FB physical address space. + pub(crate) fn total_fb_end(&self) -> Option { + self.fb_regions().map(|reg| reg.limit).max()?.checked_add(1) + } } =20 // SAFETY: Padding is explicit and will not contain uninitialized data. diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index ef5b1cad56c3..58dce211a337 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -19,10 +19,45 @@ }, }; =20 +use crate::{ + driver::Bar0, + gpu::Chipset, // +}; + mod hal; mod pramin; mod regs; =20 +/// GPU Memory Manager - owns all core MM components. +/// +/// Provides centralized ownership of memory management resources: +/// - [`pramin::Pramin`] for direct VRAM access. +pub(crate) struct GpuMm<'gpu> { + pramin: pramin::Pramin<'gpu>, +} + +impl<'gpu> GpuMm<'gpu> { + /// Creates the GPU memory manager. + pub(crate) fn new( + bar: Bar0<'gpu>, + chipset: Chipset, + total_fb_end: VramAddress, + ) -> Result { + // PRAMIN covers all physical VRAM (including GSP-reserved areas + // above the usable region, e.g. the BAR1 page directory). + let vram_region =3D VramAddress::ZERO..total_fb_end; + + Ok(Self { + pramin: pramin::Pramin::new(bar, chipset, vram_region)?, + }) + } + + /// Access the [`pramin::Pramin`]. + fn pramin_mut(&mut self) -> &mut pramin::Pramin<'gpu> { + &mut self.pramin + } +} + /// Physical VRAM address in GPU video memory. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[repr(transparent)] --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010037.outbound.protection.outlook.com [52.101.193.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C9BA401A01; Thu, 27 Aug 2026 08:52:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820770; cv=fail; b=IaO/eed4Dvp9UGQ6F7nw/W5j30AoxpaeVTvuzRpAEeGmLvAnvvqCgrdcSbVN7gjojNKyox64MKpdqApqPKU/NUdllFOS3IR8PqWwIMyr6m3OHpPAeLqIlA6/IKwxujzZaakFB9+njZcJdmR1bDsn50qFHWQk2u3iROg3D64KqM4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820770; c=relaxed/simple; bh=wHBEAaJuh+iwpnS3RC3VpHn5/V0n0LNNiAeW0RbtL4M=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=WVaDOz1RGK54haOTvzaKrBcj0V8O+KPp/tp4BAVeYiqKVbQllAHpaGXpE3k2+JIr8qcPBHJGAazxfoh44wigzX1lrkEDT7rUGw639Gxkr0legeW0Uzaui5HdCiK1joD4Q0KmE1qMOy2qytI0Lr0vmS1dS82F9kxkrXrf7qOilQs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=rNe7ePsn; arc=fail smtp.client-ip=52.101.193.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="rNe7ePsn" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QjPTJZj9Z0Ef63yQyGjz76AX49RxPIri4ZbrDSHqEiQ0dAhXxOPSfRMtzYEoEZKmxZTUpRzK5aPunwS/U1QG6ACoWSGuPWh+FTsPqoaKILFfvecykH5ZG0NXf/aW7Lft0rUqnFTcy9zjcbwrzZKNMbEcFaTERh+gfQT0sSayA63VkOzs26wzTfowAGrx7f8ysfElaKBd0/UuqFMjMtYfUDowsaOM9sBcZD4Ry8Hu2jl60iI/1mEhGBDmGDGHBS7r6R87H/KYfsZfRNfEt7VOQ4eNCz/3M7r+zIHOj2hezlY/hJTo0ssRj1nB+A6cEGHIlbsokFKnSYQZwr49+ykxMw== 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=gigmGCIOVqvxs2914t+WF719FvdRl53yUroWkDzyx70=; b=SfKHjwxDfkPqF7b+ItjJGBnXaTQr9WYkOhOUjKpc5H/jgQJDxsyfAHdn1COmPkBuisah1KkjhLq52YuCT3Mk4iWTqRRt3nNC2RSLuRdaJJUJfP33COl507IrQYtzATDORzQGJ3I26Tx1LE6SuN4uh3XDouyjUKzOrdjiiJDhjzuT/qFJX2OgbOOS143JV5eQI2A01XM9TAG9SAhWBdw5NmWHMiGXk/0T51LxALV4imexhlmVIn0Jlm1sfpGHrQSqwUuLWSej9SEGgTc2F+9/BuuiqZ4ei+WSluV8ztLnXEaDNYaf3trgsyNeJwqNGitnB4a1U34hFLWeWo2ocj29Ng== 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=gigmGCIOVqvxs2914t+WF719FvdRl53yUroWkDzyx70=; b=rNe7ePsnp+A9vgafVRev9aN3hCBcK3dLKA6thTNW4USDvFqkWU+LeGyb5xyBxdGCnSFfHi2OddWYDonTo1bhpcSKQ+QxtLyJcIFN8+24WOPmsUIdkkN6Zhgw336wTTL+ZxjENChwDrIB29lsOId1skInl/7vNrnHZ/vevQ+/2w5jcEEAR48eUUU2FCrcf+uKyW0ecHWTOMOpQHC4fTOlwAMZOdwDsFJG6yVTgZFXvyc1MFJ6IOp+H3qYOmL+BvO7VRSw5k53L6I8T5h/ipbCLL9BEst0oY4Zdzdqnw8cZsT9I497AGzOSjJG4kX5iR/NgNHDSywOxya8pqcyu/xxVg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by IA1PR12MB7663.namprd12.prod.outlook.com (2603:10b6:208:424::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.10; Thu, 27 Aug 2026 08:52:41 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:41 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:50 +0900 Subject: [PATCH v3 09/10] gpu: nova-core: Add self-test assertion macros and config option Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-9-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: DU2PR04CA0030.eurprd04.prod.outlook.com (2603:10a6:10:3b::35) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|IA1PR12MB7663:EE_ X-MS-Office365-Filtering-Correlation-Id: d78f838e-20b4-48dd-dc6b-08df04188d3e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|366016|23010399003|10070799003|10067099003|56012099006|11063799006|18002099003|22082099003|921020; X-Microsoft-Antispam-Message-Info: hWEBwvVrEBgQl5nPYM5iK0PPJgX9UF7LuQVDyz0I6mMcd40gNSv8Y7xmjB+aYAzu/LrOREJxL03jAfOu0PhgRAH+NI1migPqxtWjPx72zjB9+kmY63bW8ewA6+kVHtg12WA3JY45cctAhBA7ba5NLXTYFspZkjpL/Wqih8c4cdE//w3TLBWlWHDlPYhryx0wj8/r3DZDndSV0k8B1LWmNi6LK6MyKyjNLFV2x2zxCUALmniz+ZacM3t2Z0PZChS4qEpjZl9J05/MTccjTEOhRB466Vczjql8ciQ331MxzxX4Xl/3D0kpQsxfADcrT7D8GcVufIIczAby7YFNkuK8rQiK0j6c2RX00lqM2g+09VIZnITyUHSw2xWNXYAyyNZv9c/q823Bu4q0igzCdKGfTFc1nfKPEaXVXaziPj5LzPr4/cR7vOd7c1Z+VJEtVYlr+tnpd37/Ha2hRk9QJvQTXpqcxo0jl461U8Xdn9JyZ/3JxqCQMQ1Xp2eFiGIExY/tvstuj6vKguRgiCr/nV7WH5poUXSGehRY8pN3InYvD9p5YDc6XNwsig/uTY9a2TsJvm693bCxvI1yi5Y3BF2DyOjIJZDxWM+iS3eiHsC9utI3MZCgIikWEwD+mKv7AbFA1V8Bej/O6CaqdpezYSwI4uatbj1FTmcc1Z+Iy5jvhykN6O9FFMzrfS9ekQ/yVskjdNvfuy7Zeqf3ts4LJorGLw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(366016)(23010399003)(10070799003)(10067099003)(56012099006)(11063799006)(18002099003)(22082099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?clNGbkNCNkI2WDhGOGt4OWFObTZtbFBYZHlYNFQ0TWJUNnFnY1lrNnJ5TzU5?= =?utf-8?B?SmtseWpOajY0ZEg0VElMOGRwWmNEU3VDalhWbWF5N20zZlRTb0U0dXZBNllV?= =?utf-8?B?a3pMWnNOT3dSekRLRTc5VFlyajdiNzFZa2NTVzRHZEZBdmczTm5Lb0owSlhp?= =?utf-8?B?eEljaGJkczlaN0xDcENQckhTYWtmeTRWRzBVWTBvclJwK1lsMnJCTlhUOTZo?= =?utf-8?B?enk0elp5NEJKeXNnZ2gvSVlrWi8vQ0dWNVJmTHprL3JQRGZFSlJUSjlJNUdm?= =?utf-8?B?UTUraWRwTGxoY2g0UzBNM2JZOHUxZVlBODNYSGtKdURlZjRLVS9IVXB4WS9N?= =?utf-8?B?SmJGQUhUekhFRXZIamorS3NqcGFxTVF5a0FpS0NwbUlIaCtSblJiSUJjb21Z?= =?utf-8?B?Sk11OE5WRzJjdXA4U09qclp2UFkxZHRNaFgyelE1NmhKeTJHZFY1dzBxblpM?= =?utf-8?B?dldNcnExRFB3MjZZQzdNcHAzNDlHOWZTZ2pPZXBsbGk5RVloaG9CYzZCREtI?= =?utf-8?B?Q2JLaktrTE5FSVlka3B1WkovWk9uYlN4dGJKVmtRNS8zSkcyK0k0NVlpUk9K?= =?utf-8?B?TEx3Y01EWklDU1lOZUx2RkttZWY1ZWo4Q3JWMUd1QjVaSlFNUFFPQWJxL3oz?= =?utf-8?B?d2gzZmtSZDhYUDZxWnVtNHVNTnJaRjJrV0p5cytGZTlnTklrZVlETzBxNi9r?= =?utf-8?B?TlJiYW1VdmdvVERFeEZXbUVxS2NwbU8zZHFHTTJic1M5Y290UXdtQm9xa1hK?= =?utf-8?B?M3pSaUVRSXdOblhRL1B2c2pORFUveGkvQXNsMTFmZTE1TlVvemNEODM0emg5?= =?utf-8?B?emxnWStWeXRtOVhvb25QcHBieTd0UVR1WG1wWlRZY0Nmbi8yWW44dG9Sb1ZP?= =?utf-8?B?WFZNbU1xU2RwZkJiNXFoQmpFQWtnTG5IS0tlSTZtQ2wyMlhQVXkxRUV0dG9V?= =?utf-8?B?c0ZtbWF6T0d3elBqVnd1cGhuQ09XbkdrUU9hdVQ0ZEVDWEFnNk9LTDdKSDhQ?= =?utf-8?B?bmkrL0FJQU9qdHM3ZG5KOEdDZi9WRVpHK0V0d2w1Rnl3QzRBRlQ5WTBFTnAy?= =?utf-8?B?aFord2g4d096YmN1SVJoRUJCeTFqbGt5OHIvL1IvakFmN3VlcFpmdWVFRGt6?= =?utf-8?B?cVJaY3JGUXZOMzdVMmJlMmJjRnJQV3N3WlQ3NXZNNlF4bTBPS3dwUUJFVDdR?= =?utf-8?B?bmhPZFUzRUlzL1FmMmkvYW5lZVJBOGNGd0lqcXQ1VTB4dWZRZG1vWWhGV3pn?= =?utf-8?B?bVc0SmpHNUNacHZSQlRRTnZsT21mSktXYXBmZXoyN1c3V2txd1k3OVNuZGk1?= =?utf-8?B?RFp2eE5RZ0NCR0x2TFpYSWJZa0V6RVZZNUNoZ0NDNmlDWFJWdzJCdWRiRDcr?= =?utf-8?B?S1RseWx5U0lycUx2V3lyZzcxaDkwMENNODl4ZkJFdWpvc01NSklsRmtidExY?= =?utf-8?B?V1FOU1lvZ1Q1Y25QV0I2dUlkM1laUWh2RHhvcjdBcVAzK0hlcnJWMHRKaE56?= =?utf-8?B?a2pzV0hKU1ZLdHNTWFVjWDV1NFlMdFVmNVR2RGE3RzQwYjZuOFhJc1BacFZ0?= =?utf-8?B?ZUkrTjlPdjNZYXZXQllXZ0U5K3FsTkJJRi85TnFRdTE0V2tmZU9qa044Nmsr?= =?utf-8?B?bkVCR3RhWTNrb09zM212bWxWVHc1QkczVTc0MHNtbDk2aGNld203ZkZwSXF5?= =?utf-8?B?Rml4NWZFaFdxQ0lzclAyelBZQVdaT21LN21XOHM1bnJ2RjRSK1BzQnBybW1x?= =?utf-8?B?QlFkVHBQUXExOURRNjQ2bGQva0J4UVErWTUyeWFsVWczRnQzTTREKzdlQXZ3?= =?utf-8?B?U2tYcFpTbjNWcDJIVVc2OXlTU3pYMG1kc3E1MHJHdytqSG5LWExSQXBoVEY4?= =?utf-8?B?YmhVUHMyaWZVWTMvbFdCai9qbDdJRm51YnJYa0pPTStZZURFTFE4VSszR0Fl?= =?utf-8?B?Q0t1NEFyNVhhWlpZb0FzTmYzNy9zcklUdFpWMExGUVhJTzlsQmZ3NjZMYjJN?= =?utf-8?B?N1FIN2dKVkhZaTRvTTArcWNiVkVmNzd1akkzbG9wWms3U3FUM1VqMGEzYTVY?= =?utf-8?B?MjZpTm5UcFZMMDdyak9xMnlWR0lUSkV3VzBJelNqS0dIUUdTZld4NGc4RGZa?= =?utf-8?B?U1IxL0Rqd2d4UE8raTVXOHRHMW9CcWR6VElaQkw1cGFEajUvd2xzem5aR2Ni?= =?utf-8?B?K2h5UXA4UncxcW1xVTJKYy8vS0U1VU9ZaHJPQTRPb2NNclFJb3F4ZGN1UFJ1?= =?utf-8?B?bGk3eE02VUFhVFg2Si9ndEFGTTRLSHJCSTQySTZpNFJ0dFRLY3F0QlNvL0R1?= =?utf-8?B?ZERJY3ZlZDI0Y1ZGUFFjUUZoU1lKSS85QnpENXJVNUdFZ0lFRUxKb0ZpM05j?= =?utf-8?Q?giedprs+lgCGMqVN48w0JKvm6StebKs6cXP3U7iuOsDJL?= X-MS-Exchange-AntiSpam-MessageData-1: errjycldW8Q5xQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d78f838e-20b4-48dd-dc6b-08df04188d3e X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:40.6303 (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: cIOIMD8pM6QW5o+x4/W7mdomvZsYrR2RRGBR8WVPBq962WCd3r7GRPkk58YwRbhhVB0R1lfoF+W/LdNVzaUrxQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB7663 The existing assert! and assert_eq! macros cause a panic. For self tests in nova-core, it's inconvenient to cause a panic since these need to be run on actual hardware. Instead, define similar macros that log an error then return an Err. Also add the NOVA_CORE_SELFTESTS Kconfig option that gates the driver self-tests. Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/Kconfig | 9 ++++++ drivers/gpu/nova-core/nova_core.rs | 2 ++ drivers/gpu/nova-core/selftest.rs | 64 ++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 75 insertions(+) diff --git a/drivers/gpu/nova-core/Kconfig b/drivers/gpu/nova-core/Kconfig index f918f69e0599..cb7f0b00f796 100644 --- a/drivers/gpu/nova-core/Kconfig +++ b/drivers/gpu/nova-core/Kconfig @@ -15,3 +15,12 @@ config NOVA_CORE This driver is work in progress and may not be functional. =20 If M is selected, the module will be called nova-core. + +config NOVA_CORE_SELFTESTS + bool "Nova Core driver self-tests" + depends on NOVA_CORE + default n + help + Build the driver self-tests and run them when the GPU is probed. + + If unsure, say N. diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index 8f59cfa97017..1133c6ce5c55 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -23,6 +23,8 @@ mod num; mod regs; mod sbuffer; +#[cfg(CONFIG_NOVA_CORE_SELFTESTS)] +mod selftest; mod vbios; mod vgpu; =20 diff --git a/drivers/gpu/nova-core/selftest.rs b/drivers/gpu/nova-core/self= test.rs new file mode 100644 index 000000000000..f5b5965b7e6a --- /dev/null +++ b/drivers/gpu/nova-core/selftest.rs @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Assertion macros for driver self-tests. +//! +//! Self-tests run against live hardware during probe, so a failed asserti= on should not panic. These +//! macros log the failure on the device and fail the enclosing test by re= turning +//! [`EIO`](kernel::error::code::EIO) instead. + +/// Like [`assert!`], but logs the failure via `dev` and fails the enclosi= ng test instead of +/// panicking. +/// +/// As with [`assert!`], a custom message with format arguments can follow= the condition. +#[macro_export] +macro_rules! selftest_assert { + ($dev:expr, $cond:expr $(,)?) =3D> { + $crate::selftest_assert!($dev, $cond, "assertion failed: {}", ::co= re::stringify!($cond)) + }; + ($dev:expr, $cond:expr, $($arg:tt)+) =3D> {{ + if !$cond { + ::kernel::dev_err!( + $dev, + "Selftest: {}:{}: {}\n", + ::core::file!(), + ::core::line!(), + ::kernel::prelude::fmt!($($arg)+) + ); + return Err(::kernel::error::code::EIO); + } + }}; +} + +/// Like [`assert_eq!`], but logs the failure via `dev` and fails the encl= osing test instead of +/// panicking. +/// +/// As with [`assert_eq!`], a custom message with format arguments can fol= low the compared values. +#[macro_export] +macro_rules! selftest_assert_eq { + ($dev:expr, $left:expr, $right:expr $(,)?) =3D> { + match (&$left, &$right) { + (left, right) =3D> $crate::selftest_assert!( + $dev, + left =3D=3D right, + "assertion `{} =3D=3D {}` failed: left {:?}, right {:?}", + ::core::stringify!($left), + ::core::stringify!($right), + left, + right + ), + } + }; + ($dev:expr, $left:expr, $right:expr, $($arg:tt)+) =3D> { + match (&$left, &$right) { + (left, right) =3D> $crate::selftest_assert!( + $dev, + left =3D=3D right, + "assertion `left =3D=3D right` failed: {}: left {:?}, righ= t {:?}", + ::kernel::prelude::fmt!($($arg)+), + left, + right + ), + } + }; +} --=20 2.55.0 From nobody Mon Sep 28 03:41:49 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010037.outbound.protection.outlook.com [52.101.193.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B17B14028E2; Thu, 27 Aug 2026 08:52:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820774; cv=fail; b=rxggEL/Ps5LxP/+sIdjGe8DePOV+/UbRBy8NcEk3h71rQU6JSTZjz7xj4KrbUTJ2e24AYZSXEjZyLWbvlwjialRn8vjORRAtJg0Acss1Ant5lqP5hoV5YvlsUXXoDt9lJ8hRVdqKkNk+n/fXZlwecQD+IHjSdA+cSx0W70Fe098= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787820774; c=relaxed/simple; bh=0uDalz8ZiIgy1j2QnZQWAdpg07VDomPLgbeTaw8Ayhg=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=YSAF3UDIjn2pXO+ApHjExT5tWQydSGFbEaVnty/X15FJAeum840/2TaU6SjWnp3ZNjxFmPpnwsZQOlxKEu+2wwnteahgPmJZ69TYNikaG66kHLaxm+FHqP2Cm0FYZXjO+1ULEY73T25cWv/UYURY1JphDUsidj6NDsCk5TLaYWU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=IDYy+XHZ; arc=fail smtp.client-ip=52.101.193.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="IDYy+XHZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=a2nGwOPSQxyo2yuv9TYvgr8XMih5EpmlA2EkYTJSJV3AYzU/ua4BQFWx+p66apQrVFcdzw/UrEsJKTDuzBHDd2zEEMt38logqoZwiMuCzKNu6iaJONZI5gv8eXIqcEa8dPx7F00xzFTCIaxbXjOeMGQEQejzVkNbTKayYLAcSdJjSz8K1lGz0RJNGAp+OWHeetIusRZk3XsBV0HSxvi9OH4JLNR6F9EXJbx5aO2CKibApVRpgPIvUyTe58I5ntUwH/9inJ2kLk2G7J3t1TKJLC2rKQsYeFQDjf3dmIDRPXWMo3WQzj7dvewl3xG0h0dfXcE3HdvQSIhS4vs6kXDSAA== 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=IL+LGpDdvxkKwbZVEkuTAPSyjHwl52og9hVVu37XUpY=; b=ylEsS1JNS7K5KS6Zu6pGuOXI8DT/RA5U6KHBtyrlEuu4KIKdatpqqteAM7KdpbE5Azw0GuEOy/XO43KW5XviWpAvVLg9OCmZbJAinyrU5dhmmqTLNHRMPMctj/U/OK+9gb9SS+SsIJT84SLnbTaXYOXSR5No+N8LNWiaSGDC8CRBuesV/qSW20xgWifoB0Sc3F3Sj2X2moI3KtDjI4R8AwmJuy51otG0WlZPV+JL7uxmzQqiZ49/mA1bUj6my4e7Q67v3BnU095fNwloHhPgh+NQYTeaUyS9NYD7/a7WIMbvVONRRmHQIsPDcGk3jIXqCI2Ar+Oq2i9V3+RlUAfIaQ== 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=IL+LGpDdvxkKwbZVEkuTAPSyjHwl52og9hVVu37XUpY=; b=IDYy+XHZIH15J7ZbppnjrPyoZ2WR5GYSK89Pf0IMqDQHMoJFHw2mnQv6ou4qvndWyI4VKE6JkRwokFDPOYOVRFPX2mHbPjFQXfSCLWXzQ4YrvgLCZPMVkFocckoT4G1vtFkAzIhUpZygS5RoVYQCC/qE/1CMDlT+sT1W3SOH6jwESoxCzp3MbMVKXahqPzmYfiT3YoYt0aDg0OANwzrU6eaEi+NYuBaYgI1sAJvP5ykW8WJUHy7LkDNIWtNnljk4NlCAfrZialYGqfAQ1+QcPp42bGkQU+MetbyyYVA4jrfaRvl/QXnIANzului1B/P8l+QM1gVDFPepvEEeGHeKRw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) by IA1PR12MB7663.namprd12.prod.outlook.com (2603:10b6:208:424::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.10; Thu, 27 Aug 2026 08:52:46 +0000 Received: from DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa]) by DS0PR12MB6413.namprd12.prod.outlook.com ([fe80::e82a:6673:4142:37fa%5]) with mapi id 15.21.0360.008; Thu, 27 Aug 2026 08:52:46 +0000 From: Eliot Courtney Date: Thu, 27 Aug 2026 17:51:51 +0900 Subject: [PATCH v3 10/10] gpu: nova-core: mm: Add PRAMIN aperture self-tests Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260827-pramin-split-v3-10-24b24d7afc52@nvidia.com> References: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> In-Reply-To: <20260827-pramin-split-v3-0-24b24d7afc52@nvidia.com> To: Alexandre Courbot , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Jonathan Corbet , Shuah Khan Cc: John Hubbard , Alistair Popple , Timur Tabi , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org, Eliot Courtney , Joel Fernandes X-Mailer: b4 0.15.2 X-ClientProxiedBy: DU2PR04CA0030.eurprd04.prod.outlook.com (2603:10a6:10:3b::35) To DS0PR12MB6413.namprd12.prod.outlook.com (2603:10b6:8:ce::10) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6413:EE_|IA1PR12MB7663:EE_ X-MS-Office365-Filtering-Correlation-Id: 3c9d7564-01f6-465c-5224-08df04189065 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|366016|23010399003|10070799003|10067099003|56012099006|11063799006|7136999003|3023799007|18002099003|22082099003|11062099010|921020; X-Microsoft-Antispam-Message-Info: LqIbs0OYOq05bpwPJ/KZL7k51VnMbvRzLtKKDfO8ZPkfq8AtLArCmjZcFDviOJ5WvLI1FYPymKz2ihjn4bNoROTFqjjQDoM75+/bZVhyma0dhDfXwZcrO5ngPWlF6tmpTGOWGZfV5h/gU5UiPMbW7dg05xbs/KLQkUujIV3iDY5buXRMjjjGawqGHVaj9jrz0BtjRPAHF5l3Qsrq6zFiUs6QLwTyOn7tU+yHTc7REZXbvUHoksFFeTMrcWIbb3QkvJoDOgLn14MRvmsMebMzsqgmjbfniFEfslC51TxmvHFWRde3BaK+qS/E4ML/orKR65vJFUSrVcZl6NMC0UjLVrLFbMx5RTPbPkM+Dv81Vhlc+l6pIwhl+2aitLrZ4RlTgEmECXRfKr79gvKKVNt/R8UJ/Dzsvtq2J0pW5n6yEx70bs3knRdyH77YaAJmXtHmUW2++3q8+n7ZMnNk+OGAx+aXus8LCCAGfw+IKVCQDyJYwD1q9oA4rDF1QFlsfSS+84mT+nSoZzjp0M0+STLV2Dn4i+IlrKgCUjut5hltBJCAzIHSFkoCZGK3EnUJ0OYwzCkYTD3MtCdRImGFV44LoaCu9TxThC7n6HUSrxMLzVM8bbAUwXbcz2Kf4jm31StfQM3Ih/Vi7N56BuiTPifsYSsfV+ZfUy0RrA+rxjJnMn3apB8UJHF5vB0wiuBOkOYMBVocJGXhGiT/MZhIM3LpzQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6413.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(366016)(23010399003)(10070799003)(10067099003)(56012099006)(11063799006)(7136999003)(3023799007)(18002099003)(22082099003)(11062099010)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VlNLdEMreElTTll3d2dsb3Z6czBzbGhtNCtSMktUNGtXYTZzQXRsNi9yck82?= =?utf-8?B?TG1pcEhXZlZzL1RzTlYwMnc0ZWc4OTlkT0xtMTc0MlRrU250dmljMzM4SjZH?= =?utf-8?B?WEkrNnY4UWhvNlFuSU51SUJkSnVBWVlTbGNkb0FQckRLY0lGQ0E1aTZLSmlV?= =?utf-8?B?NXF2Q0RvMml5Y29nd3BuSkhYRGY2M2NkUHkwVjZ1MHh6dkVudzQvTExvc0R5?= =?utf-8?B?RVlGbjd5S0FxNGlJWnlXNVd1YzJzSGwrVjk2Q1dNbzEvZHVDbDBPaWNkK01n?= =?utf-8?B?bk5aVVdKemdGOXRPVE1GWkRpTEgweXJxOHdiQ1Q1SDZFazNLQUJSRFFPUlhy?= =?utf-8?B?WU5RVG5SQXk2dUk5UkM2M3BhVnVabk9CWExOTUtlN3l4d3AzS29oVE9DVm12?= =?utf-8?B?S2NhcStuMGVEbXZCYm04aGR1V3hRZEk4VUZrbkNwOUVQSnB5bHZMKzRlWE1I?= =?utf-8?B?TlJNZXRTcTZtUDdnazdVeGpSVjR5VTNObTUxRllHSzhtQ1c0YUY4RjJaVnlR?= =?utf-8?B?VnhpVnMwMlpzMXM1VzVDaUhwTWJkMnZPTThsOFk2OThpZkRFRXlTTlE3R0Zw?= =?utf-8?B?a3U1VHM2N2g4U2daTTY0NFczbHJncURGK3FzM1hSN2V3NzVSN3lFSThvSHF0?= =?utf-8?B?eU9iUXBUOG1ZS3NYTmZ5WjFaVkNKQ3hXcVFLdmFpUzRJbVFkVVpDeE5abXdz?= =?utf-8?B?MkpPYUo1VHQ3YStKYUQzOUJ3d1RBVGNpNHlwQllWaUJZS2tJemZBQkFRYUMy?= =?utf-8?B?RWl4RlRqamxtcDNaajBhQ29EdGJMZnhWRVVCWTRQSlF4aXUzVDBoWFB6cGtV?= =?utf-8?B?am1sckZzVHUranJrTG1CN2p3V3lMSmNIZW9qbXdYcytneHVBV2dlcUErTE85?= =?utf-8?B?T1pHK0lJOHBiN2NRODUrb2tMc0RXbVNpOWhoVnRQU1RLSWJwVEVhQTFpUXc2?= =?utf-8?B?NXVRMUphUmJKWjJVSnVDQ1REMU1pRDFsU0RaVk45R21wNlFCaFZuMTJqWnpZ?= =?utf-8?B?YVlpaDdMeUgrN1pVcyt2UFBIVDNPeXVwRDQrVkdHTWU5dVJrV2JWRHE4SGZD?= =?utf-8?B?bUZkYXJzUkVXSmptR0c5Y3daQ2lIUytyRFNpV1cwR2JaVEszMmhFUGdTUVJY?= =?utf-8?B?bFpRZ1dnSENkd2xSNzNhTld0eVlUMGcwakZSdHNCV1dnNWhjRStBY2c2ODIz?= =?utf-8?B?QjlJSTNLY2xYNzlWZ0JkdXBLTThoM25mMllNTDFqTVd6TWIvdG9KQ3VHMXV6?= =?utf-8?B?Vlpza1FuMGRFUUk1ODlRUjFuSmdhMStvVlptOW5kS2s3eUdrUUlCZUN5YnRi?= =?utf-8?B?QjZlSURRZHRkNGpuRHp5cEJzMmM4d0YyTFgya0hnWjdxWTAzZkJKSHduOXNF?= =?utf-8?B?SjIyV09JbHE5RUlKd3lBQ2tiZURIdUpCRnc0M1Vtb3k3dVlaQ1hVMjR2ZWZ3?= =?utf-8?B?UWRNQ2dIU3lTbnZ2aFZjdW5SOUNmSHIyYkt1bkVGU3pMK2xYQWdVTDM5MUZh?= =?utf-8?B?VEsrTXJLaW9VTm1HL0FXUDl1cXZmMXVKWThIYXNGZ21Bd2JJbysyWE1JbGlQ?= =?utf-8?B?dzlqRDhWZGoyVmpvVUROZTkrYWNRQ1Zuc3NRVjlKRXhnZFI2QldQaG1rWkQv?= =?utf-8?B?RDMrbmpqc0ZKOUR4UitFS21sa1p0UnV5WWNQZFoxVlpFa1NzblEzTlI1Q1g5?= =?utf-8?B?blYvSkF1VzVUTURZMDN4TnB2WDIvdjNWZ3oveVdHelRYZ3JOQlphTTZJa0Jp?= =?utf-8?B?ZytKQWdHRE9yQVg5WkJNbFg3dzBRd1ZqbjFzdEhlbTc5bTNoQSsxemRGSW54?= =?utf-8?B?QWtmWFkxTjQ0UHp5K0NEV3hqbWQzZFRWWFpmUFpFdkdzRWw2ckFyWmVBZDYz?= =?utf-8?B?SjE2Tkhma1FtS3ROc2cyUStoNU5GZDdKbUk0R3NEcThiZ2RtN056VENaOTdT?= =?utf-8?B?U0t6dU0wSEdybnpOSUs5RWJ0TURzMlhFZ3I2MG5PNmE3aHlzNXNicCtGOVdF?= =?utf-8?B?M084T0t4NGdDeW8zVU9ORmF0Y0RTVlJubHUwdlNDS0svWnRGbWEzRzVsREU1?= =?utf-8?B?SFV6WGVBRFI1RkIwZmprS0JDM1UxUS9EYzZJeVJiMWhrSXJNSHp4aUNlQW55?= =?utf-8?B?aHhnQnhjU3lZS0RJZW1qbHQ3YkNJSWlzQ3piVFpYUTJubTFSQ0pJMHBYc3JP?= =?utf-8?B?ejJJN09XLzVGSnZVcjF0ZzlOd2VrME1BeUV1ZGxma005MUhqd09scXRoejdm?= =?utf-8?B?djNrdHQwcGZzR0hSTnpXazlodDhpS0xwK2p2a3dsZm43NEg2K0dxSEE5NTEw?= =?utf-8?B?dG9JeTJCaWR2QnZYYkJNbDdpNm5UL1lMVVdFWlJLT2VXZjdqc1BJZlVKK0Yv?= =?utf-8?Q?OGN8tL/5MsvBOUYVTrOSjk1Bgm1+Eel2MhXaDtCJGdwD1?= X-MS-Exchange-AntiSpam-MessageData-1: HhM/H3IxF9TkHw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3c9d7564-01f6-465c-5224-08df04189065 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6413.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2026 08:52:46.0058 (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: IhUJZym6z8bvbYYJIdiklo1TWmcdxUSvIhC2e7RZZ2xjrokeUouOIO2tFsJxuUam3dkFeXtK7CdcHTCqEG8LGA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB7663 From: Joel Fernandes Add self-tests for the PRAMIN aperture mechanism to verify correct operation during GPU probe. The tests validate various alignment requirements and corner cases. The tests are default disabled and behind CONFIG_NOVA_CORE_SELFTESTS. When enabled, tests run after GSP boot during probe. Signed-off-by: Joel Fernandes [ecourtney: convert the tests to window_at(), macros, and the new types] [ecourtney: cfg-gate the tests and expect(dead_code), not a runtime no-op] [ecourtney: run the self-tests on all architectures, drop the chipset arg] [ecourtney: test within a usable FB region, skip when none is large enough] [ecourtney: report failures without failing probe, start banner at dev_dbg] [ecourtney: removed the mm-specific Kconfig option] Signed-off-by: Eliot Courtney Acked-by: Danilo Krummrich --- drivers/gpu/nova-core/driver.rs | 3 + drivers/gpu/nova-core/gpu.rs | 12 ++++ drivers/gpu/nova-core/mm.rs | 40 ++++++++++- drivers/gpu/nova-core/mm/pramin.rs | 134 +++++++++++++++++++++++++++++++++= ++++ 4 files changed, 188 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver= .rs index cf3534dd47d4..8cef4c284277 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -86,6 +86,9 @@ fn probe<'bound>( // (`try_pin_init!()` initializes fields in declaration or= der), lives at a pinned // stable address, and is dropped after `gpu` (struct fiel= d drop order). gpu <- Gpu::new(pdev, unsafe { &*core::ptr::from_ref(bar) = }), + // Run optional GPU selftests. + #[cfg(CONFIG_NOVA_CORE_SELFTESTS)] + _: { gpu.run_selftests(pdev) }, _reg: auxiliary::Registration::new( pdev.as_ref(), c"nova-drm", diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 7b3e378c429b..f0cba7336b29 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -429,4 +429,16 @@ pub(crate) fn new<'a>( )?, }) } + + /// Runs self-tests on the constructed [`Gpu`], logging failures witho= ut failing probe. + #[cfg(CONFIG_NOVA_CORE_SELFTESTS)] + pub(crate) fn run_selftests(self: Pin<&mut Self>, pdev: &pci::Device) { + let this =3D self.project(); + let dev =3D pdev.as_ref(); + let regions =3D &this.gsp_static_info.usable_fb_regions; + + if let Err(err) =3D crate::mm::selftest::run(dev, this.mm, regions= ) { + dev_err!(dev, "self-tests failed: {:?}\n", err); + } + } } diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 58dce211a337..9e4338c7c393 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -3,7 +3,7 @@ =20 //! Memory management subsystems. =20 -#![expect(dead_code)] +#![cfg_attr(not(CONFIG_NOVA_CORE_SELFTESTS), expect(dead_code))] =20 use core::{ fmt::LowerHex, @@ -123,3 +123,41 @@ fn sub(self, rhs: Self) -> Self::Output { self.into_raw() - rhs.into_raw() } } + +#[cfg(CONFIG_NOVA_CORE_SELFTESTS)] +pub(crate) mod selftest { + use core::ops::Range; + + use kernel::{ + device, + sizes::SizeConstants, // + }; + + use super::*; + + /// Run MM subsystem self-tests during probe. + pub(crate) fn run( + dev: &device::Device, + mm: &mut GpuMm<'_>, + usable_fb_regions: &[Range], + ) -> Result { + // VRAM span the self-tests are free to overwrite, from the chosen= test base. + const SELFTEST_SPAN: u64 =3D u64::SZ_64M; + + let base =3D usable_fb_regions.iter().find_map(|region| { + // Tests rely on this being 8 byte aligned for checking misali= gnment handling. + let base =3D region.start.align_up(Alignment::new::<8>())?; + (base.checked_add(SELFTEST_SPAN)? <=3D region.end).then_some(b= ase) + }); + let Some(base) =3D base else { + dev_warn!( + dev, + "PRAMIN: skipping self-tests, no usable VRAM region of {:#= x} bytes\n", + SELFTEST_SPAN + ); + return Ok(()); + }; + + pramin::selftest::run(dev, mm.pramin_mut(), VramAddress::from_raw(= base)) + } +} diff --git a/drivers/gpu/nova-core/mm/pramin.rs b/drivers/gpu/nova-core/mm/= pramin.rs index 20be3fc471ba..7f89c093d591 100644 --- a/drivers/gpu/nova-core/mm/pramin.rs +++ b/drivers/gpu/nova-core/mm/pramin.rs @@ -176,3 +176,137 @@ pub(super) fn window_at<'a, T>( Ok(PraminAccess { view }) } } + +#[cfg(CONFIG_NOVA_CORE_SELFTESTS)] +pub(super) mod selftest { + use kernel::{ + device, + io::io_read, + sizes::SizeConstants, // + }; + + use super::*; + use crate::{ + selftest_assert, + selftest_assert_eq, // + }; + + /// Test read/write at byte granularity, at unaligned addresses. + fn test_byte_readwrite( + dev: &device::Device, + pramin: &mut Pramin<'_>, + base: VramAddress, + ) -> Result { + for i in 0u8..4 { + let addr =3D base + 1 + u64::from(i); + pramin.window_at::(addr)?.view().write_val(0xA0 + i); + } + + for i in 0u8..4 { + let addr =3D base + 1 + u64::from(i); + selftest_assert_eq!( + dev, + pramin.window_at::(addr)?.view().read_val(), + 0xA0 + i + ); + } + Ok(()) + } + + /// Test writing a `u32` and reading back as individual `u8`s. + fn test_u32_as_bytes( + dev: &device::Device, + pramin: &mut Pramin<'_>, + base: VramAddress, + ) -> Result { + let addr =3D base + 0x10; + let val: u32 =3D 0xDEADBEEF; + pramin.window_at::(addr)?.view().write_val(val); + + let window =3D pramin.window_at::<[u8; 4]>(addr)?; + for (i, &expected) in val.to_le_bytes().iter().enumerate() { + selftest_assert_eq!(dev, io_read!(window.view(), [build: i]), = expected); + } + Ok(()) + } + + /// Test window repositioning across 1 MiB boundaries. + fn test_window_reposition( + dev: &device::Device, + pramin: &mut Pramin<'_>, + base: VramAddress, + ) -> Result { + let addr_a =3D base; + let addr_b =3D base + u64::SZ_2M; // base + 2 MiB (different 1 MiB= region). + let val_a: u32 =3D 0x11111111; + let val_b: u32 =3D 0x22222222; + + pramin.window_at::(addr_a)?.view().write_val(val_a); + pramin.window_at::(addr_b)?.view().write_val(val_b); + + selftest_assert_eq!( + dev, + pramin.window_at::(addr_a)?.view().read_val(), + val_a + ); + selftest_assert_eq!( + dev, + pramin.window_at::(addr_b)?.view().read_val(), + val_b + ); + Ok(()) + } + + /// Test that offsets outside the VRAM region are rejected. + fn test_invalid_offset( + dev: &device::Device, + pramin: &mut Pramin<'_>, + vram_end: VramAddress, + ) -> Result { + selftest_assert!(dev, pramin.window_at::(vram_end).is_err()); + Ok(()) + } + + /// Test that misaligned accesses are rejected. + fn test_misaligned_access( + dev: &device::Device, + pramin: &mut Pramin<'_>, + base: VramAddress, + ) -> Result { + // `u16` at odd offset (not 2-byte aligned). + selftest_assert!(dev, pramin.window_at::(base + 0x21).is_err(= )); + + // `u32` at 2-byte-aligned (not 4-byte-aligned) offset. + selftest_assert!(dev, pramin.window_at::(base + 2).is_err()); + + // `u64` at a 4-byte-aligned (not 8-byte-aligned) address. + selftest_assert!(dev, pramin.window_at::(base + 0x44).is_err(= )); + + // A `u16` view at an even address is allowed. + pramin.window_at::(base + 0x22)?; + Ok(()) + } + + /// Run PRAMIN self-tests during probe. + /// + /// `base` is the start of a driver-usable VRAM span that the tests ar= e free to + /// overwrite. + pub(crate) fn run( + dev: &device::Device, + pramin: &mut Pramin<'_>, + base: VramAddress, + ) -> Result { + dev_dbg!(dev, "PRAMIN: starting self-tests\n"); + + let vram_end =3D pramin.vram_range.end; + + test_byte_readwrite(dev, pramin, base)?; + test_u32_as_bytes(dev, pramin, base)?; + test_window_reposition(dev, pramin, base)?; + test_invalid_offset(dev, pramin, vram_end)?; + test_misaligned_access(dev, pramin, base)?; + + dev_info!(dev, "PRAMIN: self-tests passed\n"); + Ok(()) + } +} --=20 2.55.0