From nobody Fri Apr 3 08:02:05 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012007.outbound.protection.outlook.com [40.93.195.7]) (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 9E68932B984; Wed, 18 Feb 2026 21:21:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.7 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449670; cv=fail; b=iROIx2WkacKVA4JlIxyJOoDAYetTHD7Qi3Dg3Pl3V6yd5bjE2G5K5WD4m5O8gGfDE01IKq07jVVk3euDSDe7OA+tbADyCKEUsjgkMS5ZADXFo9879e4gywdBw/74Yj9Iwr8F1OtgZ0PvM2RUyP0iiDxi0HvxpQEU1Ecav0sxcgY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449670; c=relaxed/simple; bh=f8WYLHcY43t7hxJMPfmk5jIw3692HTWn/n6QHUPRFdA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=DpOAQtT9i8gvw2qoEDHyuX28Fh7ienTalpHOsvttUexzYjRvdic7FZrjiH8rxRDdzTZzoTCVkbiGcA8SxT8kq9zcrARev3diN3+JFoseZ88IHnZO+a5JimiX+AANbpj/iSxPBBNVxQj34jQqJnra3b37qcQbmtBNkDRABr6CJz4= 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=aD2ZwA9M; arc=fail smtp.client-ip=40.93.195.7 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="aD2ZwA9M" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Pg7Bhg7vX7Ri16uJ6u1AetkB+qd+PZ06wVTR1wz6X7yyqDRxKLoRac4YmjBteFKa/i/zN3dJAqUObPooiT1XyLkyGK5hXCic+fJjnmIb1HYRyJwmzyEzDTTTZAWvvY1yhk8VP3AHBO2DdqM+fRQ1+MACbmpg8azNjwnRIYFMbwsLdpqwllHsBSpYS+ENfHiGRTu9GOezqpeeSrbL8UW8TNnNSFDDv22vaY+v1tIDTD16Czr1HRinXxmTEJdmTLtmzUQD/Y/53e5rChli5ybUs0ezjz58Hlswn4riEDFynBYakVoqIIPPrWHc9vk4zd3YyktkGyOriy86HyFxNNrCGg== 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=sT4ommh7tLlwmlDD6wuE0I49nGauntTXBhDhqIqn2F0=; b=ZjEVr2uT0T4aS4Ue0wzg6SE8zPqpspoZCscQdgHKcOzRPeFTVALQHdxECLjFbjngd9fVKMIa9+jL2TVpnaarKsX8i/Szxf0IUP4rXcvJ6IrPREY9c8bE9yCZK9y2VDKStd/XGLVQSASXvlHQsAmEwK+znAuCeVLMSGAxxN1L/AQfLLYwBOnqwIRL72PN0w7HGSr7x7xW1uRLTnUBmwpEfRNXWx/wRp00qoiO/H800BglFeSsb2H675s64cpp1CfrIpVY3dswrGbbvEbuQPP0O6X/q83iRERYMLfzqdI1w6Kl9QL7sBC6CQMc8qAnoqehOWbA+fZG66/1hPoOJRTlDw== 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=sT4ommh7tLlwmlDD6wuE0I49nGauntTXBhDhqIqn2F0=; b=aD2ZwA9MKTauIs41MCrTnCayFHArXEWTe5I4qW108Wal7bPkncNGtRbf4dcZYUPiZcPll7HR9HvGkt+xKdwdr3XQm+Q/DHL3fpTT0WWDeQ42NQwJfU2RWZB4/NchrqYCCigOHEl4IiWuUBp/XjTAfRCRtfwGNb63Zv7Mxb060VvIN1pyR+5WQvoiW3NH6lZe1ZqLDYB8lnREBLxL2eWYAutTOM3gcCkjtd+MvMJXaLkOVcozKkwfD4wLSt9sgMI30RPdHUjw1nsloJt8Ml3SgZkVUQ/R8zzT1SUwm9sD0NAJIrGuzG/Xjjpog+8CAGWqq7/NvvnbB/QjvvHPDGPseg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:05 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:05 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 01/23] nova-core: mm: Add support to use PRAMIN windows to write to VRAM Date: Wed, 18 Feb 2026 16:19:58 -0500 Message-Id: <20260218212020.800836-2-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR14CA0004.namprd14.prod.outlook.com (2603:10b6:208:23e::9) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: e635460a-cb47-4980-5e78-08de6f339fa0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?weDSbQAWPeIW5agECpvHVmfKBgQNtA1pCkhOFC7M6ogvV1MINRNnX2Smyu6I?= =?us-ascii?Q?A+DQMyeYD22EfOIxZMvwAv9f9wCAg7iWrn+C653bKaLVBZF57yHQDZyYNq8X?= =?us-ascii?Q?TOwKdLFjAnSwrxW/9lfa/kYQylhgCS95sSxC82eTBCdvOc/ojXL132VfHYS7?= =?us-ascii?Q?NfcMlijRVJ7aE6dvAsfW3u461fpdXndvd5tSraqAllkJ9pggtyrcVq4FMtlQ?= =?us-ascii?Q?8d1767Sz+8frJeLWOiS/kBM4fCeQhaLFLEu2vVk6C0oIosLTjPj2JMZN+rjr?= =?us-ascii?Q?DvREmOrmNf0TlVAlCCNZBc6QhnbVtrbePHeH+4A546v4R2tk82WZvl45IDwv?= =?us-ascii?Q?Devqa8t0NXoWVbPu78wTIgWSulSxRux/ymOxsxtQ1kmo6CnZ884kmY4ER+SA?= =?us-ascii?Q?1D1ml5vfvYvK5mXh5lvbTwPKxxuGQqtaqGLpPv7GhnalDRVmOPpMMRtR4Yby?= =?us-ascii?Q?k1sx/bbwS6q7TewHKCqXa1wzRgFnBttvqX2fEqZVD3Y19JRjkXR3N19kX1EK?= =?us-ascii?Q?k/13idDWjGdRiUn/QnYNB5nAEGlc5EJVgjVxwSVWfbxCC/yvshvH5c1Q3l7v?= =?us-ascii?Q?HZQ9eMlpUJvzrH10zxaXtleULuVHPnERQVrotIFnImEVFVeipUSMbznLYY4l?= =?us-ascii?Q?9JeBDG/Z6YjVRYIt+WU4TeWVzrfHVWHOfe/MFtAp4E8w+x96RoY/3OQqaHQw?= =?us-ascii?Q?3FbkopbX9UwZAM+lzlxCx0zdFuSn0kr5rrUbcVlUNkkRMOT6QFJbJq7A7r+7?= =?us-ascii?Q?7r3NjYM5+i5gV82QAlq1IpCks/DP2OdIITINuZZo01W1iu7jLsHUkJscDlA1?= =?us-ascii?Q?46GGRC5t2S6tGRMhuy98VnodoB0xZq3eRZZtUO3z7MlyE7PHlR6xrwtMeudf?= =?us-ascii?Q?SBT0O1SV4vhuuvXByLNh6FDG1tK2ur+9dSmhqEp6n4A7721vkMTLTzrlTGwQ?= =?us-ascii?Q?8DKioTQ3o92MQvGwZ9jRfEn9r4Fhr6sJNPuQmp3Fx5bF+rfpOcJW2p5IaZ5Y?= =?us-ascii?Q?QHtRW3dOj4wEwk/KfEX6UipKfRZZNDb/LH2cQMjEEdqA1jShkuckk2+/D49n?= =?us-ascii?Q?xOArNyiXmbyYkqFDh+Ucz4sMlm9BSgs3HY9oznNrTaq6e7AN6RfPkun0pEqD?= =?us-ascii?Q?fxarCeLikozTZ+krz4ft29g+8gCDTTq3ztQdSYpfZq+2k7GMmxLpbE8BL3A4?= =?us-ascii?Q?WdWK9MR5/Hlbn5d3JWRKTkI8xMAFsUwr/CxBl8yocxuyH6lz0zDywS4X5xaE?= =?us-ascii?Q?Alnn5Uu711VYhs+LRN4neJq01YSirp5sHFMJ8mA58tjBzUEKNA9QvfJ3QbpY?= =?us-ascii?Q?1kfGnbqVBUW+wk29DRp0mw7LyMeeBin09QB2i9VBttGKR0tfOi3vs47GH07/?= =?us-ascii?Q?6avMr3YnBjQLBNFonoPyr7zeeq0gg1NQuPrhZyQRdX2nMEB5geWfu1DoPCPt?= =?us-ascii?Q?D0fhtCRFOf4+44g5E7zcLRW60ql8B314+5Py2BCyR9JlXOPLBIG7vRjfVExw?= =?us-ascii?Q?TDVHh5nwHj7ExK0NsShUyCa76PpdPxc3LOoxl1QtaIdUVVJ9SHp0a6jP/kpa?= =?us-ascii?Q?4OvX+Ka9ZnRFWpeP0u0=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?G4SFl4jD3ex+PSB43V6VoaPjJ1TI7janDFlKMLjPQcrsp0rptnRKmQA1hZn7?= =?us-ascii?Q?xtYcr+OcsfofzSvch8mJLIqnR6xndLfgx6HvcqsrUsfMpjU1Ra7z4+1VWYMH?= =?us-ascii?Q?xtruypliJJWS8yXITu9i+u2TfjJc4OagmRj5mmOi5RO/S/JWCHOnc8Fq0WQs?= =?us-ascii?Q?eH862eJEvbsjopMaJf5/zIHdjUACbXkqu0p/HFKnYZ2Y+D0wk7XlDb2G2E0a?= =?us-ascii?Q?9qAl9zzlTknwelqRFDBY4L7PDl8InaHurB56lZVlYMgIgZsztvD/PpITQyxI?= =?us-ascii?Q?6vf3eOdUmIHBQjaEDJmJWZ5YANKjbWR5u0C45nBtuBwv+eO4eHBQGkiE/LGR?= =?us-ascii?Q?TL/2vcp0jJ72PAnNccpar2Gk5oHqBs3zpRx8yTPPAmylAZVzM5A1rj1ex0IE?= =?us-ascii?Q?TSEkpc937i0/Uf3EQbB7xbE/sNrL+0YwhFpQurs/ZfTGkD3OqVnoh2BqSJU/?= =?us-ascii?Q?sBJDhqjc/IMIIKCLzXc7/WsOzQ7iPq19jdCv+vErdVxQ5P9f2Y5ED6z/IPop?= =?us-ascii?Q?NBCsMJQwwoDfg2cpIG5RZK1nMswGvXjbCujewwv+VRUGWNDF3nBOkBsm8S3e?= =?us-ascii?Q?4C/Dk8MX6UI0giYF7OS1KVEB/j33+pQM7dO/GRKfzTf/1wGEEUERWHve5RGh?= =?us-ascii?Q?d68/B3/i/z4HHLExVjr3W5jrKqX8zCO6lytcE8Ef78hXCioBYguTVQuupuPl?= =?us-ascii?Q?tRyt5nph97K4VosJycHb9qm2NEn772egGGvO7ZJ3/IGFeVlgw0sqlqjRzuoY?= =?us-ascii?Q?bDrvA7pFBAqOg7BbxXm0CV6ueWPT9Oy30w7n37m17D8R1pxlonLi8M357gKB?= =?us-ascii?Q?aMG4pE9+7ddn3RLIizuhlrqvytDp9knKbuesw9r3JclatAcwgdC1Lyzae6Y2?= =?us-ascii?Q?Y4PvbnXoSvpMvF6bDY3rxPyev1HRleY7O7mKXVcp5Xu5+hN/UHrUOz7mfpGj?= =?us-ascii?Q?CXwxgiJktqgURicW4mMklLVzUpboOhnxLIMsE8EgwZNpmRCdR2BoxFOcxz/F?= =?us-ascii?Q?ApqEq+ETqXCX0KEvuFIj2k3h5bcPaRC8y/E8FpSRsxMopVbBexrQkuxaqoQ8?= =?us-ascii?Q?IuKcA+RRVnQdYwasmdO+PRFdx5574NGRl+76PZTK4dsz+LoBxg+85YBZOUBg?= =?us-ascii?Q?t6gV4vq911io0dculIY/6Ebw/fa16CtFmstyFyVyflYkyfJ7Q6JLOyFEFbJ4?= =?us-ascii?Q?1QqX1nxK6JYdhbNvhPeP4WZhaInPr6btUyPGU8SMdc0W2FK3xqvy79h8m73I?= =?us-ascii?Q?S6case9dgDr75uZXO2paNg2a64AZBNLVO0x1dcCoKzZW4fUrvJHqMTq3SNt9?= =?us-ascii?Q?KLjoF2q5VMxempjf+ZcuOz6rBcCZraeXPcUwguSJH74ueNSbZx16jf6P7MrE?= =?us-ascii?Q?Bm78zSPvpp6mkfdXbhTrizRq25mY1ROyHkCDIjGN4rt9qeqBJk/f7w2H9gme?= =?us-ascii?Q?L9ebefSpTtmjj7OxgNfNxlype+gyn4dTA46c6xf+Hzn1R1i4YrEFRa9mqQqB?= =?us-ascii?Q?QtSFrzr+hbqaHt0YMG6oOq84y9W2WI4fCyjHloLW4Cgts5L6LIeTUPc00Xxt?= =?us-ascii?Q?6uplriEtRzFxnovuMHOgiSgAOZ3Qxtwo4hGecR+h2f4zXUtgfszA7yQQRo0Z?= =?us-ascii?Q?d/lYiDO4Ze/GyZBDZlrRr+GeOt4/edKpZy0HIr35ZO4aBtPPKO1jyLoj+XcY?= =?us-ascii?Q?LWeB4ICucxHO938bhBj4Ux+PepKPYHZaoUqtuhefSRewReJH+vxU6Kd3+lvO?= =?us-ascii?Q?LkJApQqjog=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e635460a-cb47-4980-5e78-08de6f339fa0 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:05.0642 (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: uF7fKoVibZ0CiaK6fzYdNpTDlGXl8D+HiPrFNwwoaxy5Fn25V0J8xFyY2FTqGq6GhN0HneLn4qWSVJNcCJbqcQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" PRAMIN apertures are a crucial mechanism to direct read/write to VRAM. Add support for the same. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/mod.rs | 5 + drivers/gpu/nova-core/mm/pramin.rs | 293 +++++++++++++++++++++++++++++ drivers/gpu/nova-core/nova_core.rs | 1 + drivers/gpu/nova-core/regs.rs | 5 + 4 files changed, 304 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/mod.rs create mode 100644 drivers/gpu/nova-core/mm/pramin.rs diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs new file mode 100644 index 000000000000..7a5dd4220c67 --- /dev/null +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Memory management subsystems for nova-core. + +pub(crate) mod pramin; diff --git a/drivers/gpu/nova-core/mm/pramin.rs b/drivers/gpu/nova-core/mm/= pramin.rs new file mode 100644 index 000000000000..77916f5b231e --- /dev/null +++ b/drivers/gpu/nova-core/mm/pramin.rs @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Direct VRAM access through the PRAMIN aperture. +//! +//! PRAMIN provides a 1MB sliding window into VRAM through BAR0, allowing = the CPU to access +//! video memory directly. Access is managed through a two-level API: +//! +//! - [`Pramin`]: The parent object that owns the BAR0 reference and synch= ronization lock. +//! - [`PraminWindow`]: A guard object that holds exclusive PRAMIN access = for its lifetime. +//! +//! The PRAMIN aperture is a 1MB region at BAR0 + 0x700000 for all GPUs. T= he window base is +//! controlled by the `NV_PBUS_BAR0_WINDOW` register and must be 64KB alig= ned. +//! +//! # Examples +//! +//! ## Basic read/write +//! +//! ```no_run +//! use crate::driver::Bar0; +//! use crate::mm::pramin; +//! use kernel::devres::Devres; +//! use kernel::prelude::*; +//! use kernel::sync::Arc; +//! +//! fn example(devres_bar: Arc>) -> Result<()> { +//! let pramin =3D Arc::pin_init(pramin::Pramin::new(devres_bar)?, GFP= _KERNEL)?; +//! let mut window =3D pramin.window()?; +//! +//! // Write and read back. +//! window.try_write32(0x100, 0xDEADBEEF)?; +//! let val =3D window.try_read32(0x100)?; +//! assert_eq!(val, 0xDEADBEEF); +//! +//! Ok(()) +//! // Original window position restored on drop. +//! } +//! ``` +//! +//! ## Auto-repositioning across VRAM regions +//! +//! ```no_run +//! use crate::driver::Bar0; +//! use crate::mm::pramin; +//! use kernel::devres::Devres; +//! use kernel::prelude::*; +//! use kernel::sync::Arc; +//! +//! fn example(devres_bar: Arc>) -> Result<()> { +//! let pramin =3D Arc::pin_init(pramin::Pramin::new(devres_bar)?, GFP= _KERNEL)?; +//! let mut window =3D pramin.window()?; +//! +//! // Access first 1MB region. +//! window.try_write32(0x100, 0x11111111)?; +//! +//! // Access at 2MB - window auto-repositions. +//! window.try_write32(0x200000, 0x22222222)?; +//! +//! // Back to first region - window repositions again. +//! let val =3D window.try_read32(0x100)?; +//! assert_eq!(val, 0x11111111); +//! +//! Ok(()) +//! } +//! ``` + +#![allow(unused)] + +use crate::{ + driver::Bar0, + regs, // +}; + +use kernel::bits::genmask_u64; +use kernel::devres::Devres; +use kernel::io::Io; +use kernel::new_mutex; +use kernel::prelude::*; +use kernel::ptr::{ + Alignable, + Alignment, // +}; +use kernel::sizes::{ + SZ_1M, + SZ_64K, // +}; +use kernel::sync::{ + lock::mutex::MutexGuard, + Arc, + Mutex, // +}; + +/// PRAMIN aperture base offset in BAR0. +const PRAMIN_BASE: usize =3D 0x700000; + +/// PRAMIN aperture size (1MB). +const PRAMIN_SIZE: usize =3D SZ_1M; + +/// 64KB alignment for window base. +const WINDOW_ALIGN: Alignment =3D Alignment::new::(); + +/// Maximum addressable VRAM offset (40-bit address space). +/// +/// The `NV_PBUS_BAR0_WINDOW` register has a 24-bit `window_base` field (b= its 23:0) that stores +/// bits [39:16] of the target VRAM address. This limits the addressable s= pace to 2^40 bytes. +/// +/// CAST: On 64-bit systems, this fits in usize. +const MAX_VRAM_OFFSET: usize =3D genmask_u64(0..=3D39) as usize; + +/// Generate a PRAMIN read accessor. +macro_rules! define_pramin_read { + ($name:ident, $ty:ty) =3D> { + #[doc =3D concat!("Read a `", stringify!($ty), "` from VRAM at the= given offset.")] + pub(crate) fn $name(&mut self, vram_offset: usize) -> Result<$ty> { + // Compute window parameters without bar reference. + let (bar_offset, new_base) =3D + self.compute_window(vram_offset, ::core::mem::size_of::<$t= y>())?; + + // Update window base if needed and perform read. + let bar =3D self.bar.try_access().ok_or(ENODEV)?; + if let Some(base) =3D new_base { + Self::write_window_base(&bar, base); + self.state.current_base =3D base; + } + bar.$name(bar_offset) + } + }; +} + +/// Generate a PRAMIN write accessor. +macro_rules! define_pramin_write { + ($name:ident, $ty:ty) =3D> { + #[doc =3D concat!("Write a `", stringify!($ty), "` to VRAM at the = given offset.")] + pub(crate) fn $name(&mut self, vram_offset: usize, value: $ty) -> = Result { + // Compute window parameters without bar reference. + let (bar_offset, new_base) =3D + self.compute_window(vram_offset, ::core::mem::size_of::<$t= y>())?; + + // Update window base if needed and perform write. + let bar =3D self.bar.try_access().ok_or(ENODEV)?; + if let Some(base) =3D new_base { + Self::write_window_base(&bar, base); + self.state.current_base =3D base; + } + bar.$name(value, bar_offset) + } + }; +} + +/// PRAMIN state protected by mutex. +struct PraminState { + current_base: usize, +} + +/// PRAMIN aperture manager. +/// +/// Call [`Pramin::window()`] to acquire exclusive PRAMIN access. +#[pin_data] +pub(crate) struct Pramin { + bar: Arc>, + /// PRAMIN aperture state, protected by a mutex. + /// + /// # Safety + /// + /// This lock is acquired during the DMA fence signalling critical pat= h. + /// It must NEVER be held across any reclaimable CPU memory / allocati= ons + /// (`GFP_KERNEL`), because the memory reclaim path can call + /// `dma_fence_wait()`, which would deadlock with this lock held. + #[pin] + state: Mutex, +} + +impl Pramin { + /// Create a pin-initializer for PRAMIN. + pub(crate) fn new(bar: Arc>) -> Result= > { + let bar_access =3D bar.try_access().ok_or(ENODEV)?; + let current_base =3D Self::try_read_window_base(&bar_access)?; + + Ok(pin_init!(Self { + bar, + state <- new_mutex!(PraminState { current_base }, "pramin_stat= e"), + })) + } + + /// Acquire exclusive PRAMIN access. + /// + /// Returns a [`PraminWindow`] guard that provides VRAM read/write acc= essors. + /// The [`PraminWindow`] is exclusive and only one can exist at a time. + pub(crate) fn window(&self) -> Result> { + let state =3D self.state.lock(); + let saved_base =3D state.current_base; + Ok(PraminWindow { + bar: self.bar.clone(), + state, + saved_base, + }) + } + + /// Read the current window base from the BAR0_WINDOW register. + fn try_read_window_base(bar: &Bar0) -> Result { + let reg =3D regs::NV_PBUS_BAR0_WINDOW::read(bar); + let base =3D u64::from(reg.window_base()); + let shifted =3D base.checked_shl(16).ok_or(EOVERFLOW)?; + shifted.try_into().map_err(|_| EOVERFLOW) + } +} + +/// PRAMIN window guard for direct VRAM access. +/// +/// This guard holds exclusive access to the PRAMIN aperture. The window a= uto-repositions +/// when accessing VRAM offsets outside the current 1MB range. Original wi= ndow position +/// is saved on creation and restored on drop. +/// +/// Only one [`PraminWindow`] can exist at a time per [`Pramin`] instance = (enforced by the +/// internal `MutexGuard`). +pub(crate) struct PraminWindow<'a> { + bar: Arc>, + state: MutexGuard<'a, PraminState>, + saved_base: usize, +} + +impl PraminWindow<'_> { + /// Write a new window base to the BAR0_WINDOW register. + fn write_window_base(bar: &Bar0, base: usize) { + // CAST: + // - We have guaranteed that the base is within the addressable ra= nge (40-bits). + // - After >> 16, a 40-bit aligned base becomes 24 bits, which fit= s in u32. + regs::NV_PBUS_BAR0_WINDOW::default() + .set_window_base((base >> 16) as u32) + .write(bar); + } + + /// Compute window parameters for a VRAM access. + /// + /// Returns (`bar_offset`, `new_base`) where: + /// - `bar_offset`: The BAR0 offset to use for the access. + /// - `new_base`: `Some(base)` if window needs repositioning, `None` o= therwise. + fn compute_window( + &self, + vram_offset: usize, + access_size: usize, + ) -> Result<(usize, Option)> { + // Validate VRAM offset is within addressable range (40-bit addres= s space). + let end_offset =3D vram_offset.checked_add(access_size).ok_or(EINV= AL)?; + if end_offset > MAX_VRAM_OFFSET + 1 { + return Err(EINVAL); + } + + // Calculate which 64KB-aligned base we need. + let needed_base =3D vram_offset.align_down(WINDOW_ALIGN); + + // Calculate offset within the window. + let offset_in_window =3D vram_offset - needed_base; + + // Check if access fits in 1MB window from this base. + if offset_in_window + access_size > PRAMIN_SIZE { + return Err(EINVAL); + } + + // Return bar offset and whether window needs repositioning. + let new_base =3D if self.state.current_base !=3D needed_base { + Some(needed_base) + } else { + None + }; + + Ok((PRAMIN_BASE + offset_in_window, new_base)) + } + + define_pramin_read!(try_read8, u8); + define_pramin_read!(try_read16, u16); + define_pramin_read!(try_read32, u32); + define_pramin_read!(try_read64, u64); + + define_pramin_write!(try_write8, u8); + define_pramin_write!(try_write16, u16); + define_pramin_write!(try_write32, u32); + define_pramin_write!(try_write64, u64); +} + +impl Drop for PraminWindow<'_> { + fn drop(&mut self) { + // Restore the original window base if it changed. + if self.state.current_base !=3D self.saved_base { + if let Some(bar) =3D self.bar.try_access() { + Self::write_window_base(&bar, self.saved_base); + + // Update state to reflect the restored base. + self.state.current_base =3D self.saved_base; + } + } + // MutexGuard drops automatically, releasing the lock. + } +} diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index c1121e7c64c5..3de00db3279e 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -13,6 +13,7 @@ mod gfw; mod gpu; mod gsp; +mod mm; mod num; mod regs; mod sbuffer; diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index ea0d32f5396c..d0982e346f74 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -102,6 +102,11 @@ fn fmt(&self, f: &mut kernel::fmt::Formatter<'_>) -> k= ernel::fmt::Result { 31:16 frts_err_code as u16; }); =20 +register!(NV_PBUS_BAR0_WINDOW @ 0x00001700, "BAR0 window control for PRAMI= N access" { + 25:24 target as u8, "Target memory (0=3DVRAM, 1=3DSYS_MEM_COH, 2=3DS= YS_MEM_NONCOH)"; + 23:0 window_base as u32, "Window base address (bits 39:16 of FB add= r)"; +}); + // PFB =20 // The following two registers together hold the physical system memory ad= dress that is used by the --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 CF26232B9B2; Wed, 18 Feb 2026 21:21:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449673; cv=fail; b=RUZ0Q8e96RsGc9tUOPaqq4IblsXhZqPCqYXx8f8j4AdlvCHUZmYV6zmFc8pTKXNX6NsMiOw/tF/47BYfBwH+yfnisSRxyKUQy09a3vnh8+2ZESUdB9E8ktvpfk3u+7Wq7hiohqmSi1CtBnNijFnGpLGIDRJ0Hq0BiSqHDxKoCRk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449673; c=relaxed/simple; bh=n1hqeGjbdx5mSIk4s+W7Nrr/aMPkJT1rKKGQRkTEh4s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=B5Bx4Z62ch+LluYvgM2rSyO13fOPsHyTfcg4g9LPFecJzDWrXGLzq6Ya3q5H2KixoiLkR+xZCWpqEmYT3ZVHE41PqGEhS85CJ5f3jn4PHz7P3tsWTYZvM/tcmCWJjFRZ92a3iTeeL2x9EKnxudFGlCWZTK6upqhbqYvxPQ1Mru4= 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=cZIpnjcW; arc=fail smtp.client-ip=40.93.196.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="cZIpnjcW" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rjK/NH3ss+eR+a60dlDpLSQRDaLpq5TXRdpaXT+iIpX1tSZ7SiirlbD3LPIdn1Dm+gihEkYKL7CWDH6qFowrWGV1UysfikNg9MWH2YIK99uHGAYifmVW/73zynkKbXc+emGtrrUZtQmeO6fOJGd69MXv3udhtCevvV7AjJooqBmjZWtFTCBX1/tz8M8KRj74oXiXR3T7j7EcRYMxN2E15Iik4CORpj9B23y2ULTUamg7UN5/QsvDZLfGAm4TIQyq7zuyl+KR1DDlkx5w4sdlJGCbwu+LI7+8GzBidJazHA684q1HtpHwuqUcoNPbZB3kzIlQP4pkHfVDN01g5XaPLg== 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=F49cACl3HIGmeiyHiHJIq2FrsVqFrqeo3rTN1RQXi6c=; b=JJjlCORCaTv5MnLv5LgIuZYdHuFIl69B8eAzmW0QiNILHJ2Z/ggb9o4JML2nHybqy/Orn7tFxFhRJ76d/kcdsrtvp3bpFGtaQx/9FuX9IqvdAl+4/F+c9I5yYcrxMEDzzBX2U/nP5eylO//0LhnKZZiMReblWh1mK9V4YCpLwYYGrvYK/3Smv5Y3Rz6OA4KmvhONHfBz3fk/fcoGXZZU2pe7StkZ+v2Z6CsB9+dVNlWMG3gE2ftDcnKkRzhhwpgL4yq9TW4eDd0oPr8tBtalqnhqYWGKO4xR05XCsfNqQJgt4l4hWaohTOH0h9TWnOqyLoNdNhulZaCHW1V6JWKq0Q== 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=F49cACl3HIGmeiyHiHJIq2FrsVqFrqeo3rTN1RQXi6c=; b=cZIpnjcW5Z50sQb5qSFbmqG8HCHwmiD3Y1EKWeyORGwHkDeR8Y6qmTn6ic55vH+kMYeBIxMGM9AHZd+qwZ2xYc/DKEC2xehm39FX2ZWIOIa78HXZMQPVRtFtolwv9kz8gPAinHOIUH2O5mwOz+yCrcv5WXCJU+f0RVMFQZUY3UeuC6RmbVoH3+4E0HR1WJVcJ1n4q9t69JraQCNJU7MsW9+Qlg7dT+kYQcr5aZ9SkvKioWR0mDu97LRf2JSt9jEwfLOzeUiroYT4yeuAbtV3CndkLSOio3k0iOvM7R/osQSXVq0JOLJ6RGjdiyzFcZ+s3Z9jDEhW+/xWVYYBcmpWQQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:07 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:07 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 02/23] docs: gpu: nova-core: Document the PRAMIN aperture mechanism Date: Wed, 18 Feb 2026 16:19:59 -0500 Message-Id: <20260218212020.800836-3-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL1PR13CA0024.namprd13.prod.outlook.com (2603:10b6:208:256::29) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: cf9292a2-33dc-42d8-e32a-08de6f33a0fa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?soSNqlV25EH8Xs/C4cIPTCqZs7m4NezxSWVpL87lzd6AQzqMQfC/TZ1Llrra?= =?us-ascii?Q?cy7L2xNQH7kQ4Xwl5AnQ8xvkfR0Pd3n+sHAzHuZeGHbpTuxELf/nE7FLz2ZW?= =?us-ascii?Q?snl4+cLdUssBrLuwf9G1L6+cEt954lGlCxlqOOEqO6xUEAJyKe53dLSiL6IL?= =?us-ascii?Q?bR999n/J6im2fNyOykxciu/W40bUlFTMmzc5CFWjJB5zbg3XlSskENmL8oAI?= =?us-ascii?Q?hKGOiUsgvUMN+JhOSnJaXuGiZ3QeUIU8yLTXsgoJ/5tAEMepK6RgY5TOTjWP?= =?us-ascii?Q?RtHZNQrs0AAtRH4OR2wDvg9mwj5syMK6U+LKeA45IPV47FvvlPEwRf/Adns1?= =?us-ascii?Q?v/ibGa7Dd+7sVGduwAqjiW9U7y5PTRMqe8yCF7ldbVqHlfPVB3i8kIoHf06e?= =?us-ascii?Q?gU4HlZI2eWpZb7n5bE8JcyaKetfvNiwOoL+LJSnI6LatLxYAfqwBE9EcvDUE?= =?us-ascii?Q?sied4GUHzkKdA0gsM0SURDszBnEmzNcuk9tCGZ/HRgpiq8s3mEnKzborbvGf?= =?us-ascii?Q?UaXL/YYS4k8mecE6gIJDbjN5KUg6ORvIBWPFeb7LiHWWlc909pQqq/zS6mkl?= =?us-ascii?Q?XCDBRnxAs9BHiU4QSRBnhZwzWHe7eTItL8xZja4oAJmBTBWW3vwoa/yHNIUa?= =?us-ascii?Q?ipU+dHUaYgZYqjs7bHwGnlvw35p5Z7kV7s5bEoEgSk60vflNsTcBoQ1W+dWw?= =?us-ascii?Q?RH1M8T5Nr1ATJ8ldYx4HStUb5DMDvD36JvJKja5PnP09kMEn+i9SI7TiEbCX?= =?us-ascii?Q?BV343dBBAO4tIMYD8Q3QWjusYGBFg0DEBKu/EJTOoaBA2+n4vEV51Jb++Ydh?= =?us-ascii?Q?p6HZM5T6trbLYQWBFjZnQlCSRSyolig+zhRKqOW5J+4ugrAC8jbmJs7+LrSR?= =?us-ascii?Q?fQCZMEU0HRvH5mOWqYx5474HKYVq/yZnVukdKQX42VI9u/ut7TptyoNQVl2O?= =?us-ascii?Q?7RgNzs02YWjWA78S+Paoyp8u4FUhgty26zbytWcbFoXmX0gvpCqtu52dTeP/?= =?us-ascii?Q?xlp0JneZxq7ZK7rI6IdwirjOskE61C8NF6+1xRS9cdRtAE48dhI5GwUUh47k?= =?us-ascii?Q?bc98Y5/FYyt6mZ2IDLkaqyaSEwVCCsUwkv+9g1FttBAraFlY89GDGYeJB0h1?= =?us-ascii?Q?nz1bUFDx+lY+8R25B28gep3fIiN+N0llE9LoONp5VRtJKjJ6A4XBFS3rJerN?= =?us-ascii?Q?K6edfjPB3Q7mfMdiPzNikU2mZ01cQhPaEQo0MaYMzcIy5xW0w43qdRF+a3tM?= =?us-ascii?Q?Oqo4/Ou556xKBCgvX2tU5jADfS3ilXDmjPduCIMN9k6zGG7Y763eKwKfqibc?= =?us-ascii?Q?zEgA0OvogLem0j4xsahaEoLnpoiQSMUUBLNFe4yk7PvLfjx9Lz7e/6jE5/xY?= =?us-ascii?Q?0REHHTD2yegoN/29zM2iZJ9zcpKBLkYi/Ep4Kn3QkEEgtdAQBQLDi6fEuTGz?= =?us-ascii?Q?tbdlbYky8KpYpOWrMHScJc44JfgYt2jSJ3aqUWLwMwOT/10l9qbIjtcJMMmZ?= =?us-ascii?Q?1Vk/IU497fv2Ja7yngMIf/50Vfxd3rw/30JaKbnqrE/vsYdkSmAtEoYNJAMi?= =?us-ascii?Q?cR0uk7ho037Gh8QkgQs=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?/RsDB0mcc4o7Qre3Aq9h7KOFTBZ9Rjid4rmfoJqgW8xnYb9D5BlM6p3tiu/k?= =?us-ascii?Q?m4PwAvMDBZJLG5GmK3OI0dQtg5YPTZb3+uLaQnkbGQGIOtvnan1xE9l7SWQi?= =?us-ascii?Q?idagW7+JqY08gsvr/Z+jgQe6av0khXFlZpxR19O/upG+h0zEGOxbAlP6mkro?= =?us-ascii?Q?9rXhThFUYK4fpARsbiKLKwYpMEqBCHAysVqsw4Je6bRWbxguXpxwJtJLaFCj?= =?us-ascii?Q?SZ6XY1dOWDtI57ujxQh62NuPSHar90irZs103C4sFRy/grd7yRuuswur9gRX?= =?us-ascii?Q?cHm8NZmVbR38v2TOWRajZwSMoMeqt7/r70oVR2ykXQB5384zrH8HVRTZbZx2?= =?us-ascii?Q?gO4iO5CjqAtKaXmpM7COmq56MNdGyJFDKOG0WqXUxg6TLr7wWwjSM4XeWE4F?= =?us-ascii?Q?MBZHLwsbqX/BgXnZi/o7G8OPA8OWEK5Ne+sG469pXVOl9CLWpvHIW+D4TUKt?= =?us-ascii?Q?GOWhScFwtzz6p+eBn/biu+HuXlkK8VpbqP43RXjSYkWJTqyOOgFdDi2D7kAl?= =?us-ascii?Q?bdWPNDCt0GXc0Mdq0GuU9lyVWZ8woRSAExprLIMr7NqSuSF9h1a3+Uz+PSEe?= =?us-ascii?Q?nsfl5tYzAEMQwQ+lL6XEXRSMVxaYLGIcoW47lTzUcbHhtaQMeSjiqTXfWsnm?= =?us-ascii?Q?g6JL1EgNaHCWGh/SqnKhGBa11Wt+BigVkszNR3D2cCx1PwoMgPY2w39lPPaH?= =?us-ascii?Q?qco0Nq5LXXV14ajGmhtf0er6A1KwzigFOyLOqEShdPhzKwQ2I2PkzpiH1b1y?= =?us-ascii?Q?P0nPFv7sry+u+dNtGnHD8zQul5ytvncm1jOY0X5CYnSHQpjZi/JTb0Txyedk?= =?us-ascii?Q?sIBJuGVQGTb8QO+jFvCg5J/u4ALnKzbDOmi1LleZox0/fYcund4nYs4nuSbO?= =?us-ascii?Q?z/4fDJTLeQBJTPIkoZfH81+f0qp0wFX0iFXIoKCCZTEJZk/8RIthLiWvWjeR?= =?us-ascii?Q?45e6bmvziCCYUdOl//W9VJ1XyBU46Wn0EFv7C5gfG5iyRu9GBcgVvnke8XTv?= =?us-ascii?Q?jTCkyaHjOFGWfNOhtNGjaKF6ABRtD9DdaF6yvZyzkF8D/8jHnHCw5b0Z9/y+?= =?us-ascii?Q?xPWg7NrtEvFpVnnzQMKLSoHFD4GYyd26Aq29HUCyx7xm9tjHBxhjOhhqneXn?= =?us-ascii?Q?RSpHzhIkI13DAJsPEbi4gRzAeFBiv7OCQpreE+84Y3hq+hCknRDX8/ts5BEF?= =?us-ascii?Q?ER6cXZnoLpVrS/OZQqPvVlUl1wg0UJRqOGjsIqKxdQCnoNk12xbYzeF9ZhFJ?= =?us-ascii?Q?piC8x30YiK4oq0pEP90zgPhYRljQwd0Aitswuye0chuFZ7eFZWhhNpk+Y7up?= =?us-ascii?Q?YHxDtLxYI7EijMjfKiJYDXa6AvC1UU6qjnei9c3vx2tc61/RHWPfh79yMoRC?= =?us-ascii?Q?IHWn10fse53j70AKGjTSGmBsbt/YB0F+PAqsiIPqd4IDxTqjWhyaD2wmY4t5?= =?us-ascii?Q?jQsczGhnyqonWJiNyNkqSds+8ig+f4PZFsrfLx7YsiAa2VT+ZTQS4XgLDFRE?= =?us-ascii?Q?R/Pn16SIAKvA6YuQ+Phz/qJFYnHfIJtz7VrMKPhGulGzloTtOAPx8fwqVFRf?= =?us-ascii?Q?5e7jYeQ/f6/08NsmgGQtOZR7KRrfy0vS6IIV5z22UtLWnICcSvHqT0IAFjAI?= =?us-ascii?Q?mMJJXAUBngytzqR6a5x2A4Rvo4Q3+DteNMPyy8dTLKjEHxyRGtRRypNQpMtQ?= =?us-ascii?Q?lQxL3N0IQnaIP6v/9QU5YIVUQ8/SsfadH9MxOaQsgKP0f5fZlitW1xijkUtd?= =?us-ascii?Q?xRXrFVFMGA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cf9292a2-33dc-42d8-e32a-08de6f33a0fa X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:06.9949 (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: KQ6mKBFP2qb9JOUEsnQBrYuNX1sqnHQ5HDOF3KqrNAH0/AkJ2GrI9XPq7g+dzdl75Y9LrXBOot+O1FekLMOmzQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add documentation for the PRAMIN aperture mechanism used by nova-core for direct VRAM access. Nova only uses TARGET=3DVID_MEM for VRAM access. The SYS_MEM target values are documented for completeness but not used by the driver. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- Documentation/gpu/nova/core/pramin.rst | 125 +++++++++++++++++++++++++ Documentation/gpu/nova/index.rst | 1 + 2 files changed, 126 insertions(+) create mode 100644 Documentation/gpu/nova/core/pramin.rst diff --git a/Documentation/gpu/nova/core/pramin.rst b/Documentation/gpu/nov= a/core/pramin.rst new file mode 100644 index 000000000000..55ec9d920629 --- /dev/null +++ b/Documentation/gpu/nova/core/pramin.rst @@ -0,0 +1,125 @@ +.. 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 f= amily. + It may change for future generations and is intended to assist in under= standing + 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 are initialized. Th= is 1MB sliding window, +located at a fixed offset within BAR0, is essential for setting up page ta= bles and other critical +GPU data structures 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 through the PCIe interface:: + + +-----------------+ PCIe +------------------------------+ + | CPU |<----------->| GPU | + +-----------------+ | | + | +----------------------+ | + | | PBUS | | + | | (Bus Controller) | | + | | | | + | | +--------------+<------------ (w= indow starts at + | | | PRAMIN | | | B= AR0 + 0x700000) + | | | Window | | | + | | | (1MB) | | | + | | +--------------+ | | + | | | | | + | +---------|------------+ | + | | | + | v | + | +----------------------+<----------= -- (Program PRAMIN to any + | | VRAM | | 64= KB-aligned VRAM boundary) + | | (Several GBs) | | + | | | | + | | FB[0x000000000000] | | + | | ... | | + | | FB[0x7FFFFFFFFFF] | | + | +----------------------+ | + +------------------------------+ + +PBUS (PCIe Bus Controller) is responsible for, among other things, handlin= g 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 1MB sliding aperture that can be repositioned= over +the entire VRAM address space using the ``NV_PBUS_BAR0_WINDOW`` register. + +Window Control Mechanism +------------------------- + +The window position is controlled via the PBUS ``BAR0_WINDOW`` register:: + + NV_PBUS_BAR0_WINDOW Register (0x1700): + +-------+--------+--------------------------------------+ + | 31:26 | 25:24 | 23:0 | + | RSVD | TARGET | BASE_ADDR | + | | | (bits 39:16 of VRAM address) | + +-------+--------+--------------------------------------+ + + BASE_ADDR field (bits 23:0): + - Contains bits [39:16] of the target VRAM address + - Provides 40-bit (1TB) address space coverage + - Must be programmed with 64KB-aligned addresses + + TARGET field (bits 25:24): + - 0x0: VRAM (Video Memory) + - 0x1: SYS_MEM_COH (Coherent System Memory) + - 0x2: SYS_MEM_NONCOH (Non-coherent System Memory) + - 0x3: Reserved + + .. 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. + +64KB Alignment Requirement +--------------------------- + +The PRAMIN window must be aligned to 64KB boundaries in VRAM. This is enfo= rced +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 | + | | + | 0x000000000 +-----------------+ <-- 64KB aligned | + | | PRAMIN Window | | + | | (1MB) | | + | 0x0000FFFFF +-----------------+ | + | | + | | ^ | + | | | Window can slide | + | v | to any 64KB-aligned boundary | + | | + | 0x123400000 +-----------------+ <-- 64KB aligned | + | | PRAMIN Window | | + | | (1MB) | | + | 0x1234FFFFF +-----------------+ | + | | + | ... | + | | + | 0x7FFFF0000 +-----------------+ <-- 64KB aligned | + | | PRAMIN Window | | + | | (1MB) | | + | 0x7FFFFFFFF +-----------------+ | + +---------------------------------------------------------+ diff --git a/Documentation/gpu/nova/index.rst b/Documentation/gpu/nova/inde= x.rst index e39cb3163581..b8254b1ffe2a 100644 --- a/Documentation/gpu/nova/index.rst +++ b/Documentation/gpu/nova/index.rst @@ -32,3 +32,4 @@ vGPU manager VFIO driver and the nova-drm driver. core/devinit core/fwsec core/falcon + core/pramin --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 6F73B32E15B; Wed, 18 Feb 2026 21:21:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449674; cv=fail; b=TaeDGiKn6Olyd8PqhjcyELaCAbVBfopJNgXiZECuwBMFWH9jcOiLHbMxCNLEZzPQ6Gd1va6GS0xIpy9VznWdPMjd7cxp/xcxJ/odWKNSQ47whA1GIjilj3ZYEol5ODiBVrgNPo9lx4e0ZTADWLyYZYVoESWoLVdzA6/scf77joQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449674; c=relaxed/simple; bh=Ns7P0tP39/MbhhI1Cp485GRdO7tGHqRw9vFY1sB6Kxw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=cT3Ynkcdx8bZSrATN69g7n2/wqUS9Y1OHzPr2p2rp0nuqfOBCscv/sdOonB0NiBkDzDwMfAWX/9KetNAK/QeFkK9N3pzXVAu1qEjBUke7E2fGILPoid1J9sa0yfq3TvGuExTo4pvo5pFayYIQpZQj9Yz8a/YrRJCasOvbwP7OVA= 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=mMeWugGc; arc=fail smtp.client-ip=40.93.196.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="mMeWugGc" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=B/65Zqx7dyj5pumyievslN+rp/OnzsN0nXjtq0+bp3mbHsx7FmwfUxL8bTWAaMQLWCpodsq53NXVj7uei1627eWEeX3vIvYM/Asd3LdR+PmMTzg/p57uKr6tThBu04LZTcCvFi6BK8Dtrg96hAxqQT4TGzHViN7rDUM8+37D7miz2IVzDs+nbXw5BbPObFuMaEDg2aJevv/f/h1+Ch3WcrRDjjkkc8VTYwNfQldMrmKl2uTQepLc8jWkqwcgXMkTxp1G7FZOfr6Dg7BkeoF11qvBZlTJxpmQFIF6jbMvYMq/cdvedOmz3U6bsT03A8RDMhowyS2os+30MU+9SyrOxA== 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=fVpqjPK/Ro/GFRsrIztTPQdrqinpLTWyfd/PbTMmJKY=; b=bjrsBaVubai3uMtX+9eEdgyDdg0XUSMydsgHdpbqa0wz6pFmoZ21A8Zz+3cEycBuNEwm/rB4MSmh+dERaa1XpqE7EXL1zCYKOydtpwH22WX0DodVU7bVQocnZvu57n9R5CZUqIbgUeuYldTjV2t2MBh3RV71ApyFD/jV0k2nNQM/5ENIImyxRD5ZWmUC00i5OhdAC4v79nbWkqSuDowAK0VBxGnpJKaaFPRFwlxzqHwLlR0lW49Frd3obwyxIxKIqtO8KhCFW9kQYEFym4BVtUsXARvvhlwKKHxMQXpXhf2JOq1ttoBSjZlLar0mZNmMnlFMGHSO6tNEZKw7il6qOQ== 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=fVpqjPK/Ro/GFRsrIztTPQdrqinpLTWyfd/PbTMmJKY=; b=mMeWugGcX9ZOX50aFdh8XUrvFK++qx8MeaEjG76tS8oe8pBd8Rc7ETmJFAlntIO/3d9QDojQYmxffTm4cpsUvbxlJZ491KfeHy9tyVv+8JvwJsRW9p9IMYdNECK4uLPaqgIUX1nRRcRECe8eXMXbBCHmy8GmeoxntmSGF3kWSZyqyJTaruZiUo8oIsBVq0765tg53fE9GpkvVIMPTyBiRqmb4TdyrFO8+MPN/vbVQjYbgfvPr9lwbEyeao78A9C0rgPnJlyNLrfWwi2Pup5UzCxnF3Y657oXfxqxnFyi1OfrTgb6qTyNnOBsg6GgC1e0zN4nrhb5gSFPYBX/ouqyIQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:09 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:09 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 03/23] nova-core: Add BAR1 aperture type and size constant Date: Wed, 18 Feb 2026 16:20:00 -0500 Message-Id: <20260218212020.800836-4-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR14CA0030.namprd14.prod.outlook.com (2603:10b6:208:23e::35) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 46c917c6-af29-4e70-a764-08de6f33a241 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?/Pnbw2oEgZBqpdvdhqKX2tiY6U7Ncg3T7SwiFbR3xgT1HZsVHwIJmfizpzf6?= =?us-ascii?Q?8EUbuRhd49lqAK7TyTXUi+KuHGkJ/a2IneV23F8ZgXlPlLkYiaCLbZPjQv6X?= =?us-ascii?Q?FgirWRTwqrc0WBeyTxTmXqoXTUDTLS/bcehttWTiwcjReUKHG8zG8SDbBkvR?= =?us-ascii?Q?tzeGppg/W+aKcWjwQQjk//tpKiUUXt4EcSYpmnzWYS4o1WDYj1XZCw3ujtMp?= =?us-ascii?Q?C5m9JTP2SsWEgEx4b8Q09R3ThmAfpSbAWLSRiiT2ga5GsHm39jYCPT/M6sJp?= =?us-ascii?Q?MvNk/PfBrPE02ArR0vyelVrQIhVYMD5crysdJtVNT+66OFzRKBImJEDLcTVA?= =?us-ascii?Q?vDDEMxFtckVsP1aeAESCE8IEEYLF6fzKoYwLDJnpHedd9cLvkvYlNhcj92F8?= =?us-ascii?Q?FI27kM2ISDj45bAHe0y2IuVyj/Nn1DPJjVOw8LNfgOQomAGjQOp21sxVWjLE?= =?us-ascii?Q?VWcnT7pW26jPaWJrniBPS1cb/X+Mpc7vdjLTsW+1+NcqMLVt8S3XriHRYQNO?= =?us-ascii?Q?LJlg/jjwXqSIn/4BN1tI+tA0uyVPJHIKkksavaSVUV8CPmWx6CsmpHOUcB/o?= =?us-ascii?Q?gXBbpwCax7TljjDB9UuzuFoTdmTT79DXMv9X+t6ynzRdCmCk6X/SFPyn2tX5?= =?us-ascii?Q?X/ZRbydFMrGEGedgHXEXgwlCLL7l0Mv9WNqcv7DuF6KgNwjflaBl2mNfHK+r?= =?us-ascii?Q?tBXlEdOdxyf0pkiLsRl+qTSsQaCfGPEtnNEiKAzU42CoBajBj7jhA4zI7kjF?= =?us-ascii?Q?d9sFPm/DceLjdNWD9wxsv5Ku8OewSJrMIrfPr0uaQZCicycWMPYr2gldVRn/?= =?us-ascii?Q?icGyfC8po+lVthIovsyULPrdBR5T0fdE4y0RdNizqSujj21EaR7KCubCuVZ2?= =?us-ascii?Q?NV8BtTKg10vD0/zaVOK7SXpfNLJwbTUSTbV8hLuPW+gFp3/cxJtIzK8s8YKO?= =?us-ascii?Q?9vlJp+fAudM2fU4O4mFSfbdg7e6QzKhwyPDrla6m0/FHeGKxhjX2y8zBBraT?= =?us-ascii?Q?2rAbcObn9rOrL+gANU9YBqUzNwl1J37qFP8IZc4yabC4QsrWEiY1V7jpaHlq?= =?us-ascii?Q?K+0LSwUlLsnO80OhyI0g3mF910DhhcAoPzzGpk9J8j1R6SF3Q1l/7Y3hf+t6?= =?us-ascii?Q?osXL9jpvOJ+oTMIOHvprG14WtCK4y/ql9yn+7ku7hulQO94SZN7IrNdRaLZa?= =?us-ascii?Q?AGB553ZYnzV03xImupRdt6fV2acClg1rzbWP0MgjNSls/P8RCtdS+4QMRjKZ?= =?us-ascii?Q?ETT8A5JdLYNGFSFcyE83aCoXn5kELjPHetsWcP/EPnnAuG0o980gc+TH+Aot?= =?us-ascii?Q?miLBFdN5+kudir9R9zm7MPvico1pDD/x9D6aj4qj+k/00BfLiKBVsj8iqqUi?= =?us-ascii?Q?vnjo04/fR0SETsF56snhAXCSRbPP/k29kJChC7NiDKozJikpFkznGFQpZnWn?= =?us-ascii?Q?5i8oR3w3QnEWv4JoUW8mC1YyDtu4JMMvKbbLH5YtCkPst68l2gRkMvAUd127?= =?us-ascii?Q?MAJWkgEn6cFlGW5QbIrL/UDLXm2Oqjs76FKGu4ngQsnCe5zU8maKLf0vIHor?= =?us-ascii?Q?spkM30bUEyiQrZ7HzUU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?idYcsT6ZJ5ThqgBnfjON0KIOwpcpnGxok2TcIpv+yWxm0pGUMS94tOUHaUVd?= =?us-ascii?Q?JgbUweJ2o7jHGGFpxBhkL184cGme/y/HJOMzL0AUoItHmX1LoI5nu+SruKCR?= =?us-ascii?Q?loy2QiXNMpXLL4lYo/G10IvDGLBmQ2esmCDWfEYM4IqNFq9fZssbHxXSkpnZ?= =?us-ascii?Q?w63j+DYuiOjGflvxNIlI5VYbNu8WskQS6TRsZnQ+dzBgjzEkRBRi75gCSsZg?= =?us-ascii?Q?UXXUt4mmvzGKcF3bORiHo3SbslNZD/QKupCNYbpH2HIPpq+kevwhkwq8dNJD?= =?us-ascii?Q?4PBLO6aackS8+YU9AvxmgOtcr7PA9byG1UUdzVvDT5UaGT/O3oDCPwWhkeFH?= =?us-ascii?Q?9L4wigAelLxajfv2/zPlPG6sVzjyrqAAkmutnARt7IMchd9TEeM2XooY1ST6?= =?us-ascii?Q?x2hV0GVSwcOP+m7DmzlHPy4ghHqLpnK4W8He6Lo44z0zH0UnrJUAQQbCyR8N?= =?us-ascii?Q?4aYs2/qC3UtVFXP5+HVAlFZYo5/WojduqqAKxXBwksbzmH5LK5s9+ey9wfcY?= =?us-ascii?Q?7OIu+6Gw2gvmhcLhXzqCfkF+t7Io2oz5Ih1zHqmgjiO89xuiHton8h+1x3VG?= =?us-ascii?Q?tkH/8g6r2kEJKzJ3pB3AScY1QsRvS3aO4hWE7wuPpALsaRv/MzMy62TvBfK6?= =?us-ascii?Q?GvVxYfRQu6igJubDb5UeUoXOhTaRIu5yUFjEwhp8wDKKNj9ff7VJXxsya2VF?= =?us-ascii?Q?fIiTEabHHxPTrlNry6HGV73mhuP7Nxiz/PJ2qKfrC1rvLn4NmJwX9K16KEd8?= =?us-ascii?Q?jGGKUSikPSb4FkfOFmLmseaHuq2AYDyDGfdEL1D+2Ig01HzwLBVZEODDEQXI?= =?us-ascii?Q?rnWO5m4HIkh+t9GdIRrkNvO2isdbrFSYpBYiCeL04tfw0lqYsQt5gazazJT7?= =?us-ascii?Q?2B0wahWhsin+Nk9PFgT9PXGazBxU3D8bW/c03pcwWoXgzsIT+AYIlIhVKVlz?= =?us-ascii?Q?8mbR3aLCg+5pGBbW1jbO+HI3CrRNu4eaeBcDrrV/v+T+R7ni4J1EMUYPOMyV?= =?us-ascii?Q?to5dagYp8QSMqP0sXv/B7am//xZPpGpySYzEU0FHLMUC35QaZAzOyRCK0FeW?= =?us-ascii?Q?5aN/4hrszO0cjYPTV8T7wkcTx4Ya5v5TTyuE+tXvTV7dZ6aQcXbmwDUBQSZa?= =?us-ascii?Q?JzRzr2TEuhXTuXQGSBWHYVwqlLYu/B2LzzNeun/4nMmpMa9ZAFXrSLFnaTRk?= =?us-ascii?Q?53E2PRikced9UX9+vCiiHObwSOyd0fVMuJ/P9wNs8JyS6WMw3yGunME2Dv+3?= =?us-ascii?Q?fND8JZQJCrwo7Nf/KQWD3L007BNSQ3RX1xu5So5wKhFAM7ftqHhrGyfkLssz?= =?us-ascii?Q?DjIkNBfwwGsZeBtgV9ccE1WK8H544JWHw3SVTJONRlIas/WKiVZSE5HkUmZ2?= =?us-ascii?Q?0dJA6j4gVEbg6b/Q7vYIlKMPMrtzhahUKEyKv9GCr1YtVtsjedW0PNwe9Vy/?= =?us-ascii?Q?GWfMePF6pKwB6Idrjyqr4q5YDMzWGdvpJ26zMo2R9DWzgttV8z03w8EWiVRK?= =?us-ascii?Q?XowB01uu+sJWHRb/hPUSdyuqVFDRs7podnX0FNFqc7WXYYbm5ZSvar80uiWm?= =?us-ascii?Q?9OQ+w3XjZ0gJmZasFyhy1hLlRJzNlTSicOp52IdskOkrI0BWUL2LyYDu0ZI4?= =?us-ascii?Q?Gz1CqganOTCGHR/d87I9Xq6yQ4r6jjFKSWReRcS+mfW9vS0c5OQs3Jm2HXJU?= =?us-ascii?Q?CGPfVxMEZ3hVx6Z88P9uEV2EZN2SbehYJZb97+qJfChV9CjjJwOAuXE0smgu?= =?us-ascii?Q?3GuOCSNSAg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 46c917c6-af29-4e70-a764-08de6f33a241 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:09.1260 (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: XzZ/kIRZid3mwGby0Hyw96lxnHWQlHCgxFT9vhRtwSTuNNnkiqR/Q9UO81COkg7lSKhKuqHgLLLdKQTovKguMQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add BAR1_SIZE constant and Bar1 type alias for the 256MB BAR1 aperture. These are prerequisites for BAR1 memory access functionality. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/driver.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver= .rs index 5a4cc047bcfc..d8b2e967ba4c 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -13,7 +13,10 @@ Vendor, // }, prelude::*, - sizes::SZ_16M, + sizes::{ + SZ_16M, + SZ_256M, // + }, sync::Arc, // }; =20 @@ -28,6 +31,7 @@ pub(crate) struct NovaCore { } =20 const BAR0_SIZE: usize =3D SZ_16M; +pub(crate) const BAR1_SIZE: usize =3D SZ_256M; =20 // For now we only support Ampere which can use up to 47-bit DMA addresses. // @@ -38,6 +42,7 @@ pub(crate) struct NovaCore { const GPU_DMA_BITS: u32 =3D 47; =20 pub(crate) type Bar0 =3D pci::Bar; +pub(crate) type Bar1 =3D pci::Bar; =20 kernel::pci_device_table!( PCI_TABLE, --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 DA71B3314D1; Wed, 18 Feb 2026 21:21:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449676; cv=fail; b=UNa9RjSznRf7jAJq3yFRhq1/2MP7V0vTewnzpf48+OQ8w6O3SD2n4tSL0Jos+23PuCRkBl9ypFVqxpKc6D86fgpocQzqKlWa4eIaY1YUc7MjBgXOKZNHtwJIzoCgXmUJ2Alheyn6i7R3rjEFB10VU7R4J/Zdiyp9iCidL409uoI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449676; c=relaxed/simple; bh=4gKLWimn3ijyRCLVbIft+E2qKOvrhROlKg7IECzLuiM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=rLJVzS3xUDTFGRCTwKwOznX+vCmMaQp/qTWolxKpKbGmYlhsQVivVFz656FYXKNMAHnnvNEeT7QXqY5r8TrL3pMA24SggaNvVD970E2DAZUADiuoZ4Cr47DQ7ItyuYD5u69ETvM2SkF+L+cs2Sy7j3xZdid9xtGvpEVa0sGFaOc= 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=Fzz06Yj6; arc=fail smtp.client-ip=40.93.196.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="Fzz06Yj6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ov0PQchxbBFPKA4Tr1iGbxhu/qovxjh3zMeITXk06dl+5Czz62XGLBl+ErQ4BxUs9ZvxjFRMv1kdameQI1PQA5TCZ0g9OskWTkX2ThN8LvBoE5UCAeeKHIiOU8AD6SD9GEZLcAHuJPOs22hLplr/RaazeM+eyXgIIaTY6XXsNFFMZ0r07mPYKRTcYZ9Cay8JzwfwMfQ1TpdlGgKIb8hV+4LGNNhLBRVTy3sjf3Z08dWiIQTxYsWZ4jtFoVXI557szYYkHO0vE2x+Zd5lUATk4zGP8EI5VlXSgYFQpiXZ9eK9YTvT6Zu8UK1SNGTQo+3ScsRvvMDsAlJ5qH1idctCwQ== 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=Dm/Id0L+bMN976rAe/4bSH1D21ThrIBCdMG6+znLh3c=; b=H1YuaRGTGSjaliivQ4Nr6O1dtbyKPCL346WC/ydS10etA/0VDA6gil+f+LndhPhPoKOBDvZrVc+IFII5qEjImejFiColcsfVYadG+XdrvdLgZnEqcD8L1MjOb2qOq0Z0YPGL3b3XI3HyMh7oVFboJYY4XqyI8KedA/icCDCLfoHJKDDConyjzragFbG+COeTo3/wuMq9U//G5SIOvdOFHVJVHLJKB3LharDxmgH5joRTLuBZ3IL0/I31SxpOeueP823OPfnu6Ko+/uO7tTpcg57yMkx/NlmH1CnNqTENZs0e+QL93tBMggE1HzixASM9b6KKC7ECSUfsmbpG9s/7qA== 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=Dm/Id0L+bMN976rAe/4bSH1D21ThrIBCdMG6+znLh3c=; b=Fzz06Yj6AHiRONwaal8IXyqcS7uaCzTHXG45jDhdU6ge8Aa7q9kyyh/jOdM5MuZRbygysjKSzeRbdUH7cvMS6cSWdkxQJvN4UNEz88JL6uI51wXn4z3s5kYQMGYvYEyDZugDT9aHn6sTdbF3EHYWD5ygUoUhadtSGFBrQv5foE27X69mFx8vbQUHMVfsfTc2bkpnFDmIb/UNGol+CKUhIp+3Jy54fqADs/Zz/STI/a5Hb1y4A3+/Uw4tN0Z8A4VWMDwN22bxoOBbKOEv6odn4CFvJW86deXHYVJQhvQ178cij2WE88r9p70accKDUYddFzG6iyEWgcuFaChIxDMMwQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:10 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:10 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 04/23] nova-core: gsp: Add BAR1 PDE base accessors Date: Wed, 18 Feb 2026 16:20:01 -0500 Message-Id: <20260218212020.800836-5-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR14CA0001.namprd14.prod.outlook.com (2603:10b6:208:23e::6) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: ffcab90f-b61d-48f4-3c20-08de6f33a32a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?6r6Fym6s73vFdNF2uYKYQ0mFaTt5jeRSYOgXjLGzgjUz05TPDJBlsIATHAae?= =?us-ascii?Q?iQXErxKcbyfo7jI/qTPedi0JjDSmgrBx4YKVF5wFzghMrgd3pcx3waDsyWhR?= =?us-ascii?Q?WWKatU2ln1QpHlDoD9EObG6aRrnw8Z1mdesp89TQ761QkU1PiJf23wWG6KiM?= =?us-ascii?Q?AEHU7FhAbxbNjytuVvN22yhMGr22IVpLMPuv19nJlQGgIt1hHXmLEi+seH0/?= =?us-ascii?Q?RKHT0Znboc/fyWCnnQ2eVdK3X4aj6IVL906TtcTl/4sUrCbAtFDiFP+hK3XO?= =?us-ascii?Q?LutI1IWC1795fTYL0cLYRK39gAVVaAMh99Gy88gaKJBw/yG1TeAp1MRNR+bl?= =?us-ascii?Q?QyfK7jFnelQNrvi6CpJlPqRnMNVMVQlh8E7pqxItory2WW0F/lgDLZyBZuGy?= =?us-ascii?Q?JuFrGe5WBR0eyvW30wyJcrvrMcUB/bmi72+Q01+jTqSmZ9zXAka3sby9btCV?= =?us-ascii?Q?lT8O8x6p1H2HztSAMcDoqQ2CQ9S5GcQmJWgwhd//ttcQHWJbN9ME1S+JWwX1?= =?us-ascii?Q?lEXYGU/4tibllovH9wr0/Q6H1QhVfb3YSwHD3yOqRBDNxSACs5pAK1aMOMzz?= =?us-ascii?Q?yFEWcPf+ojFa51RnyEqTdiBknUpD9P9zxHqCSuJo/ixnMzUyd1AuzO5kyOaJ?= =?us-ascii?Q?vrH9USdMSAH8Uy/Jfv08t49ust8m2nw6nsI8HmWYcgbTFtVTqajaWIdyXlwB?= =?us-ascii?Q?6xh7nZKxFfpSKF2iHr6FkLaKh8LCp4t9xS1wVBOq+vCK4oWCkFF04aO3czG+?= =?us-ascii?Q?/c7JvD+WM1SnETcDjnenfRDBSOnop+fJAoxC/S66yHaEuz8zNVQ7k18nNPxN?= =?us-ascii?Q?GEzZK6yRbd/DMOXsycbDGlLxpLK9oHbR26MbUnCL9Y8kH/5jWwhYJqdTLG0i?= =?us-ascii?Q?uUCnHRIALfgqHe/Hv/qLRdT7HmfhaKLPAV8olC4oQPGMDy2BCtbd6z/RVzBW?= =?us-ascii?Q?/rXdWpHbWaBzhnpU6EyLWtIxM/TLv0gio8i5liMzFMq9YkKp5K2WpMjFzRCg?= =?us-ascii?Q?GFUgS4ej3lbjtwvV1SZ7FJei2zmSFfyASB/a2cJ6PZkKfi1JZXSvZyWtwIcU?= =?us-ascii?Q?h+J1A0hB2Guk7SkK7t5RitBlZZk9+6+QWxg5bbaR2eRryYTXt/nPsnEQ3QsA?= =?us-ascii?Q?sRBRMDneZeuV7MQNjRZCjVDaqGCLbKvY6Z12wUjY7XCTmGHNaL8HBfstG4zO?= =?us-ascii?Q?Smo5Hd7vluEnmB/JU+B82+h8Ky7t58bLF2XGbHthuvBENJo4wE5MY3sdQ4wY?= =?us-ascii?Q?RxbPSgse5f2HDEQEEk5/iW1knZSqP3qo4oZ2Q3upm74AIHHFnOLBgqCn5PGu?= =?us-ascii?Q?yhj5YSy7hSBDvE8dy3kj/8EH7ErVJ9JrjYC5StouBku8JZcPQPIDChV9Y3FF?= =?us-ascii?Q?LwAdIUVd5FYBqzzbWGO0VA85zmjfdhrZQ3Iizy7YfEMOXlDcG3c7XVMgGL/T?= =?us-ascii?Q?ad9hI2cKYgKuA5337qTzl+UeWMFeXvpLtyEP4EQfO3873iX7B2PLyKyHcQna?= =?us-ascii?Q?BygXIbSPrbkgKOYoow/hWzQr7GRTiB3TJ99cDFdTKTJnQbnXv8ro/1960JOT?= =?us-ascii?Q?+HY+qfXYM2idCpFm18k=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?WY0tP6MtjGewwWliitXsbNTVcYNHutA2f9Sq9Pna/pjUlpQw1oQYmJO0g1FI?= =?us-ascii?Q?ccTu3jvgp5SHeebLYR+8eo/SVQRzDod7Cy/ItH27NdMdletjlerPOUvrB3ti?= =?us-ascii?Q?wnAjGLtBoym4UfHrYDjD2OL9EBMEhQLRgOaHjQvAbPc/9QZ9PSx72hp0IT8k?= =?us-ascii?Q?cPmyn0xrNc/NlfdqzLkdau/v/LOWEaemKZ+H1NF72r/1t/j7V4R2Qe6OEp3T?= =?us-ascii?Q?+LgJPXvpsrhVevxGsGybNoVI89/J1Qn4Jr9nc2tWTH77G4DAscjj6OUuoCoP?= =?us-ascii?Q?C+UBvighlnFT7rnHeWejqNU8H01VTUaL7/kqAfvONwXnRDCUGc6Rt4t2PHeZ?= =?us-ascii?Q?3amtR6xkPDmIj/EyVRhx5mV0kc+Gzng9dfI5LqiTCi678X1TpKlatyaaQBgK?= =?us-ascii?Q?AizPOFXlTvfR3BG2XqcHdabnbOuEPNRo1klaMaI5R6uahc920xazvsRlE7pp?= =?us-ascii?Q?eyAh7dnnhCHi5/fyCeSbwhYxhMWGsNpQrqqidnz7rRgPWI/DRbbtfVoiWW6J?= =?us-ascii?Q?Beox2du7FiwKvOrrFtqyc48kze6bn8mhPv4sgZmKT/ZaA+DkAchm3JM6zxn4?= =?us-ascii?Q?NGg4NT9G0rpT4o4RKTs64Fd95wywsE9sKb6QHBF2G7KgAQiBBtdZCXgSkmJz?= =?us-ascii?Q?yyq3hhq9JErslbyhdCkB7psCo13T/7no10Q1LxraGiaue8vLrVVF9qKEm+1c?= =?us-ascii?Q?DOWSZkfzEzkOspFlMnEa7okQOsmVXmedXLnQn6i51/eqFFv1KI9ADNm+yhgc?= =?us-ascii?Q?AxJdTargNjcucU18lrvB8pmP0xkiGE8lFCgLYOAV0PhNUPHx2dLLwgHvGRPc?= =?us-ascii?Q?5A1zwHuCHXFLYgXJIwnJlYBNvNP1l3B0dbwhQPRb+enRw8GnJVAuZP5+MUdT?= =?us-ascii?Q?9bjsY9pSdD4SXEeEO9BGO5RKGw2At8hR01eXiHL/viA9Pv27qn/pdmD1fB9T?= =?us-ascii?Q?0iDJ8gYBiNJNgsSrv/w/cx+tqr+zKUtzWQKfwonU0YG1lBMUwM9EQII+ox1H?= =?us-ascii?Q?a2lWYBVmCQsUd6RRAKGecPit1Daq+c3qDeaWEey1vqQvZ1/QPMSkHVTmJtAN?= =?us-ascii?Q?4GvuX8awiohHrXkxid+tWpwZsbWfefvkvxEN2IosCR3R5wLRimJxP80MXo+m?= =?us-ascii?Q?E3GXoV5nMUi8mLC7RFmnrYjZnjCQxnR7ReQV0EtBarIeprOtciaPisfaSX0J?= =?us-ascii?Q?ImeE9kgQ3cicyJ+3KaX2rqTirEqeUoW1KkQRCmdK5Wch2e7FscAUA33ACTqI?= =?us-ascii?Q?aEQs6m2QHuUaiufQfMBPA7d5s1ljaAebSGqHvtNIdwi80RC6qUL5BLaLZV1X?= =?us-ascii?Q?oznmGInjvoz7wuLZBXJmGiuq1Ef13mFzMRsq0nhL26s0EvwP1doKvsdN7YCS?= =?us-ascii?Q?HyHNkTKcgwMZjHd3ZN1I8EijnbxoJ10Na9mgiZVuAAU2XybXcRLkbJCj9JjR?= =?us-ascii?Q?+1PDE+dHfFzT4Z84vvoYqmgJBqf17WuOhDryEcOMX8xAI61B77GeCnF/aeHG?= =?us-ascii?Q?TEtfTalruwsnQYAAEVz0RwrDEW5TCHGtUzBSqLeWJd3fB1m4DMRkeuvOFVpD?= =?us-ascii?Q?0KYFr/GtUFOWVJ/GgQV4dyS7tuFIE4U2aF/j9sV8CuxlgzY9RApc4NmX920H?= =?us-ascii?Q?aO/sf+rjVjganntsVdah7bB19QGF1K4f9pcphIXEUNvB/BTL3vwDjrlgIwe1?= =?us-ascii?Q?nnGG8/sCPvPYDmKzmZDEvS2KZ8ZIPalLgoNwscy0vr66Piy76hfSpCsPekHD?= =?us-ascii?Q?c+f+AI/RjA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ffcab90f-b61d-48f4-3c20-08de6f33a32a X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:10.6633 (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: 2PD2lnk0KWUzzQJX3jf/ON5Q/3cQ4GaiJNzcpZTvJywvz5TiTKF8lKW5vXRYPJG3c70ZJduVkPhz9tAyYVs8MA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add accessor methods to GspStaticConfigInfo for retrieving the BAR1 Page Directory Entry base addresses from GSP-RM firmware. These addresses point to the root page tables for BAR1 virtual memory space= s. The page tables are set up by GSP-RM during GPU initialization. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/driver.rs | 1 + drivers/gpu/nova-core/gsp/commands.rs | 8 ++++++++ drivers/gpu/nova-core/gsp/fw/commands.rs | 8 ++++++++ 3 files changed, 17 insertions(+) diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver= .rs index d8b2e967ba4c..f30ffa45cf13 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -42,6 +42,7 @@ pub(crate) struct NovaCore { const GPU_DMA_BITS: u32 =3D 47; =20 pub(crate) type Bar0 =3D pci::Bar; +#[expect(dead_code)] pub(crate) type Bar1 =3D pci::Bar; =20 kernel::pci_device_table!( diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 8f270eca33be..a7778d5d9e32 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -189,6 +189,7 @@ fn init(&self) -> impl Init { /// The reply from the GSP to the [`GetGspInfo`] command. pub(crate) struct GetGspStaticInfoReply { gpu_name: [u8; 64], + bar1_pde_base: u64, } =20 impl MessageFromGsp for GetGspStaticInfoReply { @@ -202,6 +203,7 @@ fn read( ) -> Result { Ok(GetGspStaticInfoReply { gpu_name: msg.gpu_name_str(), + bar1_pde_base: msg.bar1_pde_base(), }) } } @@ -228,6 +230,12 @@ pub(crate) fn gpu_name(&self) -> core::result::Result<= &str, GpuNameError> { .to_str() .map_err(GpuNameError::InvalidUtf8) } + + /// Returns the BAR1 Page Directory Entry base address. + #[expect(dead_code)] + pub(crate) fn bar1_pde_base(&self) -> u64 { + self.bar1_pde_base + } } =20 /// Send the [`GetGspInfo`] command and awaits for its reply. diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index 21be44199693..f069f4092911 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -114,6 +114,14 @@ impl GspStaticConfigInfo { pub(crate) fn gpu_name_str(&self) -> [u8; 64] { self.0.gpuNameString } + + /// Returns the BAR1 Page Directory Entry base address. + /// + /// This is the root page table address for BAR1 virtual memory, + /// set up by GSP-RM firmware. + pub(crate) fn bar1_pde_base(&self) -> u64 { + self.0.bar1PdeBase + } } =20 // SAFETY: Padding is explicit and will not contain uninitialized data. --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 76B6A33469C; Wed, 18 Feb 2026 21:21:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449677; cv=fail; b=oMlxvZ6UsX3lwm5mBS89EPGOBGtMYuk8D+cLYO5vIB21AfJchTKPUE3cdvUw5IiegLc6RySw4KBfmuJcqimZsFBIJNz5jo+6ERc00hWBpTtJwWfOGgKlzHcWPrAlJajZ0YG9JthfWynoy8/9cD8Kofl4oH8Y5J+oc0ruzEMvTOU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449677; c=relaxed/simple; bh=8cRg99iSBVynjZFKZSOmfvbdy7bo5Pi8BDxomJmBbBQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=VinwRw5zgrYzTvpLEBEnmCr+jVDT2nIkpTPmTYCY6Ji7rt4OFnyiUKFO42Gn75BvRWLE6USF1JVU6hxminWOTS91FNIQMv7I1X19IlvS98xDvozwIrS19zpiZ4cSVmZrm8JkaC6gBUOQMrYZyHxmdiew5JnWrwQHoWN+4WB3Rac= 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=YH44OcqN; arc=fail smtp.client-ip=40.93.196.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="YH44OcqN" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Hk88KPuuUFpcmp9NKGKYjIUB5xRE7gyMS5wbeFfe5HpaCxAD6PG+MndZXgjuus58cjbnnXPowEuBtVfOhOyRo1F7AV6nVSMSlC4osstLzseAf/6xGgXs2gVbDJrBLj8Eev5p7iX/N/kHdAb9r3Li8IdWFWoDLsgZz0UZjxh+lU7a96ebAorl1drFGGYRle5WS3g4dZVEe30Kjqi4XZ//6KLMNt9w7P5FozsWX3v2LSTGiglfaQsR7B7by+N0jUWiBP6mplp6Rw/71TRpaSHHUJulM7j/38l1SU9FZvdt/9GLAb5SWCs6aBB4Ihccikls9ftpk6Qg7tENDZXRTedh/A== 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=N43u8WIb9/kth7+DPlL7LJD7dd8ELTlJE2ouDBo8tBc=; b=N8oEMEsdSujchSAlTmNHKXSDJxSXzEF4mL6ry+F8z7wlnl4evTJ6iGH8rsYO1zoikJw03ADBduBKRyb24gvCfjTNNHf3/IW0GFW3sAWnOTpXHRKwfaVioT4paCopOJUX+i5zddZ+U455ibNGIx7LfNJIOoz1P7HFgAewri2ub1bJoTRi73+9oY/s4t0YLjaequuEiss5+upJU0sOUZSnICP9nJu/F2M7FVvQCNp+M5X8FbkT7Yj8VwWtuMVUwW2m/wCG7bPBd7AjeqQVqjgjaIPHQJ2EPR7yiz/GOSBNwVvC6QE7+eB3ZQezW0DG4pH44c7k0hVcwsm7sd32awVsuQ== 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=N43u8WIb9/kth7+DPlL7LJD7dd8ELTlJE2ouDBo8tBc=; b=YH44OcqNUxYCZxTNl9wdpmtrPgmWy81VPnLs2b8bJi4b/W1dhU/08WXOf+J+5sdzYLUERLlSFgfof2UdS1KJ/mZt7TRM1/qqT0bt78ihizksJsz1v34CohD1KrNpBtA5/ABZAxuF1pL+7mQfHZjKk570l3xlZKPIE4SlQMed1Q+okyXFnZ+sjS6Et6lETLkrwEOTMIB7DtcUMqNfdXSeabpezUU6guMuOyazQhLkg6R3bv2g8NSjtiwIEvc/A/yYp00p3UBFTfdr2jBzuqNVw8xpZz7unjfSFlsj7tZzIAx1/rU4YkTvS2VBTO6hrB38mT6mlgVmi+LZXJOmXWcoLg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:12 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:12 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 05/23] nova-core: mm: Add common memory management types Date: Wed, 18 Feb 2026 16:20:02 -0500 Message-Id: <20260218212020.800836-6-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR02CA0056.namprd02.prod.outlook.com (2603:10b6:207:3d::33) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 42550899-4c5f-43dd-6d92-08de6f33a412 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?736sAp9PNKbYI3b5k1Em30H3tonnZNmTpW6at8LhoRyISTnak4QQVm/SD2fo?= =?us-ascii?Q?ChKrwRnaSgHGuruAyQcKrjgeWpPhZrfuKSOlr7jo8I3EKflKao+/YmM1agBh?= =?us-ascii?Q?oNkFsMEuAnsjaHx5Qxt5ukVLra2tKAcgND7OBbsBkW+/prWZ4gz3Wsv1n21a?= =?us-ascii?Q?CsBSScgHDHIcNWwUWKTUDb+A0QoQzHrWrg5hpM9BO79L0keo2O6nPlT98KMe?= =?us-ascii?Q?XOqVb6MoTCJ5wmsPWmktArHHZBBZK6CYJCX6t0/ttfVg8I8ctdXvUTuLdHRr?= =?us-ascii?Q?fdGSfYLiFTvYeDg7VWu3CU1k8S/gf6IC0wucnMuCW030AmmSBC5phkXcmOC8?= =?us-ascii?Q?aNf1iQNtxq+WxVAbChH6oDPxxZFJr3FnJzikocWQltbQWVv4ndv5HPXKw7Gi?= =?us-ascii?Q?rrruoNuIEoKzGmKNMjzK0gw7eV+uNDwFG2l8c4gPT8nhPNpuZdcz0d5TT5cC?= =?us-ascii?Q?UO5i3kXTjpmsI5pdiVeFRedLI5/e0HVf47SUyxxcRYGKhU9qjV50xSLziT1V?= =?us-ascii?Q?gwP+TD2rh9WVx1++XMRZI3Nlw28SygdOkAFPdxUrzP1PP6DdeACYmuoqhzQM?= =?us-ascii?Q?RQKnHk3AbTXynqZ5f5qweuHGE0HFkjNN3oGF3W1wxQwpBQ3miEPQGWvF3KQn?= =?us-ascii?Q?dWDtXE6sCXVEFPgrMc/0RwLhomuRqKkjXvtYLeN473bCiKvjNgqd/jY07Njg?= =?us-ascii?Q?+gHwhpMPFiYM3G2QnIr4WPou/Pi+Odumjz34kFvleSpzMU4gNGfJdlsOMOFW?= =?us-ascii?Q?BgDL6Q+c0pQIrdF0IZbWPtfRwYb0xYP+OmaXMzJIfitijpc5VBHeHIrjJMUj?= =?us-ascii?Q?F0IdrFLL941F/GBeuvYY0cqxPy3czLe8fHiLCO+6wGIQybUi8w6PqQYDUc2A?= =?us-ascii?Q?aX2jkLgQrPBocBzF0u5ffCsKPqAEGAo+882aWU82fbOfY6pVwlHtOQhJTu/Q?= =?us-ascii?Q?K+rQYiGGitjkvEhe3MXyF2C+XDFahLCFQeN1xtwnVXC0VrEsBPi5fU+a5bUB?= =?us-ascii?Q?1Xrfu4R9iMk5IzgaaMmXhyt+hT2cnV/hTzzUnFF69t8Z43Ii2OHab0FGVoEI?= =?us-ascii?Q?IX+bYItBNkd2LeOZ6FoRp0Jt+ZPqVujOPhh7l+gUBqg0BZP5VbHH6FGIpbtG?= =?us-ascii?Q?DuGc36qow3MiydP0r0KKp/FoSfl01nPjigKA5kOUkzG9jeHYHpWJLd3WODb8?= =?us-ascii?Q?61Z/BCNYA18oVbLW6t7pydjkJjQsFWNlqMTKm+4DWRnuX9lSXPmebqfNZimJ?= =?us-ascii?Q?lW7VtgdtDBqitViFab1kyzxSh2SyuznN6FH4QaXWo2tOFidpH/7X6mGVGF5h?= =?us-ascii?Q?6ATZSfaHvw5bxny3YsVd8MT92cDgQe5PHjvSM4T6Y0kd+Vmq5X7L7QPxV0JZ?= =?us-ascii?Q?tSCNoQeyvHtm/ASjgQa4XrnKbddzk42IqHoCCEcACm1dF/CE6lfssIstrP1O?= =?us-ascii?Q?qwXfDrFDKwqHjIz+qg4CWyrFWRgU2AvSSG3kRwihANW6UBCPhKERUIqUkYxI?= =?us-ascii?Q?QgykFhDlsVARb13Za/qk+QndMbvyNoPLwAZndQkYMcp9o37/TDrivVJZeir/?= =?us-ascii?Q?O+mf4YIGPwxsUmD4QGA=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Pt3IWrkyd+X3fc1NL/CYDQPuIqYb1WGAS3M7t/0LGUpu14MImdyNZbHk8lSU?= =?us-ascii?Q?XTu/Jh3GwmNWx3fYuJVBtuB/06vAtIcNhHOnpfby8JE4a4wEgVgcvYmqc3sp?= =?us-ascii?Q?6v7B/9YzbvxYOoocP/O+cvhtB2FcOb7e2fv60a6LstNBoPIoHQeyabLxcG28?= =?us-ascii?Q?4qolxedpASWJDYGTjEnUbzPybgSjo1kJCZ2h3nILO686mm6JYHWSd34RdGth?= =?us-ascii?Q?VXK1maSL232wM4xB1tiZFiEzpSGauH5ri2i7moiV7ykwl9tb36noyjGfkg67?= =?us-ascii?Q?1POY+W1Xzl9uS9L4ESIRkVV31I77lzca2SFYEPQikR8vGkG0wVOjTeLpUNS5?= =?us-ascii?Q?0uXL4frltKHGPw5iFPk9e5Ej0eZEgvBBDGDp/OM/75emOmBp96gosQFgSRtW?= =?us-ascii?Q?OrCPsyirMV6PVfOXUfmchHxwlOjYXR/+yDECR5TzNSS02Iv26MX7RdAxAvkt?= =?us-ascii?Q?fDsPptbivUa1SYVu73KD7l2dugs45RZEaLemJ6SUMxIYCQEewOXUQMqG96UE?= =?us-ascii?Q?HXTSPar9OpwrHYLlF90VeBVCHRSuPGDnTDEdMmj4WfrnLFN05wF/BOAmGO8b?= =?us-ascii?Q?pB6Mx0Hiq1a/uPVCcqrIL1rVqGwvcvFDEJk3DNtXky8qgZYj1D90oCG166Hi?= =?us-ascii?Q?bpfGZnnvEMhz7bhM2dcnNJIUZMJZBK+aAHi1RWFQ7+jEgL0wFkPrEU7rr6zR?= =?us-ascii?Q?TrakkVGN98nO2lBFed39/LhV8G2GZtdAvlUAdvI3ngAwy5cxwmQjLVclt9tg?= =?us-ascii?Q?hYX4/XUV984aJAu36a5I03S4gL9r4wTmTTB7e6acgaHSB6Wvwz/UOxSEu4pn?= =?us-ascii?Q?YjvzE0FJvDyniVXt4iRCn1/y2FroFV1Ok/Q1Jz0qNAsFfsVqg48x20GsFlX5?= =?us-ascii?Q?aq0o+aEx3dGYTRkm6itatdqHZicz0zaQW0rnLUJxQQYnMFHqOL5HBvAQlj3R?= =?us-ascii?Q?zury/sVeQDwmqsVHDr6oqFOH7kG/gN3IlfxV8YXuDTet7d+h0t8LeTUxAyjj?= =?us-ascii?Q?BdWtbrzof37VwXEHDnWrRY40t2OXxNyaqqF0cBYIrvd+tIOthei1hP9w2spl?= =?us-ascii?Q?UIX2GbORVpqpkoERRt08ijBfIuzMNNxLWIZglKa9ilRCTFvPns/nwHcwfCxD?= =?us-ascii?Q?POWhQL2CrkFAaMgpybTGhtuPQtyG4W78BRAQWHuXzYTC2n7ZzuQpIIPOjYCQ?= =?us-ascii?Q?HjqNX3qzR1UbRJOaDhp9nyhibS1jSYRxLn/xD8y+e2DGqd+AIOxrYYCOaF9X?= =?us-ascii?Q?lDu4zbR4YIaPxb5czXyQIM3skV01bbM8ZDXOcPZQOc55gtazqM1fLZchv3QM?= =?us-ascii?Q?v8f8PaQjQVlHSdJ7CVYzOg0F2+nEkh3htCBF7m3sSBY3nRfsZdcLuwpL+yTZ?= =?us-ascii?Q?2msBBWTVR0YRBCeBg6PYLVgSoXGLyaJOpHe86JzO9ffgPLLZmuVvtTUDx7JD?= =?us-ascii?Q?+IQNDw/SVrPVPm+wKmS7aStUoVqN5cmdiOg3UKO9PH656Ojo+wzIWmnzeT0l?= =?us-ascii?Q?hDvx4Eu17mWiEUwF/HwenfqgUPKrglDYPpXwJX11EDszBzBb5Pz4nUyUYI8b?= =?us-ascii?Q?t0W+GX/PHoGbm4kIhiwfi8KQdDz5MWe77+qj2Pv6KVTA+wWIlk8ruhRBOWBq?= =?us-ascii?Q?3oeAp1Dm4IBvZP8/heqtX1T44ky/dd3GT36RQCK46vcJuDWAIRn7MX3cLnWZ?= =?us-ascii?Q?pAmDyHkQA6brilF7yQdNghjbRei1KALWmmCAKSAKr63yT23esyA++zYxsCWq?= =?us-ascii?Q?tB5kO98B5Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 42550899-4c5f-43dd-6d92-08de6f33a412 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:12.2062 (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: ARYOqoMfj7uN0A7z2NThtdPR6tijZ4JJ11c7PoQzsgHGj6DybiEFejSHPNVe0feXtEqZHzETRLDlSofoc78EYQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add foundational types for GPU memory management. These types are used throughout the nova memory management subsystem for page table operations, address translation, and memory allocation. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/mod.rs | 171 ++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs index 7a5dd4220c67..04d9baa7220e 100644 --- a/drivers/gpu/nova-core/mm/mod.rs +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -2,4 +2,175 @@ =20 //! Memory management subsystems for nova-core. =20 +#![expect(dead_code)] + pub(crate) mod pramin; + +use kernel::sizes::SZ_4K; + +/// Page size in bytes (4 KiB). +pub(crate) const PAGE_SIZE: usize =3D SZ_4K; + +bitfield! { + pub(crate) struct VramAddress(u64), "Physical VRAM address in GPU vide= o memory" { + 11:0 offset as u64, "Offset within 4KB page"; + 63:12 frame_number as u64 =3D> Pfn, "Physical frame number"; + } +} + +impl VramAddress { + /// Create a new VRAM address from a raw value. + pub(crate) const fn new(addr: u64) -> Self { + Self(addr) + } + + /// Get the raw address value as `usize` (useful for MMIO offsets). + pub(crate) const fn raw(&self) -> usize { + self.0 as usize + } + + /// Get the raw address value as `u64`. + pub(crate) const fn raw_u64(&self) -> u64 { + self.0 + } +} + +impl PartialEq for VramAddress { + fn eq(&self, other: &Self) -> bool { + self.0 =3D=3D other.0 + } +} + +impl Eq for VramAddress {} + +impl PartialOrd for VramAddress { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for VramAddress { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { + self.0.cmp(&other.0) + } +} + +impl From for VramAddress { + fn from(pfn: Pfn) -> Self { + Self::default().set_frame_number(pfn) + } +} + +bitfield! { + pub(crate) struct VirtualAddress(u64), "Virtual address in GPU address= space" { + 11:0 offset as u64, "Offset within 4KB page"; + 20:12 l4_index as u64, "Level 4 index (PTE)"; + 29:21 l3_index as u64, "Level 3 index (Dual PDE)"; + 38:30 l2_index as u64, "Level 2 index"; + 47:39 l1_index as u64, "Level 1 index"; + 56:48 l0_index as u64, "Level 0 index (PDB)"; + 63:12 frame_number as u64 =3D> Vfn, "Virtual frame number"; + } +} + +impl VirtualAddress { + /// Create a new virtual address from a raw value. + #[expect(dead_code)] + pub(crate) const fn new(addr: u64) -> Self { + Self(addr) + } + + /// Get the page table index for a given level (0-5). + pub(crate) fn level_index(&self, level: u64) -> u64 { + match level { + 0 =3D> self.l0_index(), + 1 =3D> self.l1_index(), + 2 =3D> self.l2_index(), + 3 =3D> self.l3_index(), + 4 =3D> self.l4_index(), + // L5 is only used by MMU v3 (PTE level). + 5 =3D> self.l4_index(), + _ =3D> 0, + } + } +} + +impl From for VirtualAddress { + fn from(vfn: Vfn) -> Self { + Self::default().set_frame_number(vfn) + } +} + +/// Physical Frame Number. +/// +/// Represents a physical page in VRAM. +#[repr(transparent)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub(crate) struct Pfn(u64); + +impl Pfn { + /// Create a new PFN from a frame number. + pub(crate) const fn new(frame_number: u64) -> Self { + Self(frame_number) + } + + /// Get the raw frame number. + pub(crate) const fn raw(self) -> u64 { + self.0 + } +} + +impl From for Pfn { + fn from(addr: VramAddress) -> Self { + addr.frame_number() + } +} + +impl From for Pfn { + fn from(val: u64) -> Self { + Self(val) + } +} + +impl From for u64 { + fn from(pfn: Pfn) -> Self { + pfn.0 + } +} + +/// Virtual Frame Number. +/// +/// Represents a virtual page in GPU address space. +#[repr(transparent)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub(crate) struct Vfn(u64); + +impl Vfn { + /// Create a new VFN from a frame number. + pub(crate) const fn new(frame_number: u64) -> Self { + Self(frame_number) + } + + /// Get the raw frame number. + pub(crate) const fn raw(self) -> u64 { + self.0 + } +} + +impl From for Vfn { + fn from(addr: VirtualAddress) -> Self { + addr.frame_number() + } +} + +impl From for Vfn { + fn from(val: u64) -> Self { + Self(val) + } +} + +impl From for u64 { + fn from(vfn: Vfn) -> Self { + vfn.0 + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 EE98833507C; Wed, 18 Feb 2026 21:21:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449689; cv=fail; b=Qp+GfDLfSZxDm5jX4gkloQYbchTkh9aNQpPFQkSKvfMz2XTf83Sllp2qS9MmK3U7DnPwdtk2ZnMS1LIn/HHMQMoK9aJtmNoJL/4W7+0sTsbzuCkjL0IPgyoQhRxtqhpEWIXhmlQNYyVBMpMVz5TtbcOlK47sQmY3aADjkVsg9+0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449689; c=relaxed/simple; bh=olT8ebQi0T+US/w+xQaaVBdd09OElCifqqzLe7C9u2A=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=BiOtHNNTtwAUV3FugNDuDGcVAFqoJuEE3N0dtz15nZQSQ6r03GGjuf1DUa+9r569G3zwyeAK9MVUVTqUJer4NTgBrYAiiL3vEuZOuYjZSiKucWd72LGkCZYRONWgRek6WfaL+cfkScR6JJM10hNlc65IOj9vYeSMl6l1GRQYHlg= 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=VdTyDfEV; arc=fail smtp.client-ip=40.93.196.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="VdTyDfEV" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UoCQVsKhUVfC4rv5g3YOyoVkQUZbNPWQpukonYSSSujntPF9kybE/1jOa9byS5fcVR3juSnKaew5KUKI+Vus1dcT8umLugaW+tcEvVqR4Q9m5S5ExSaRqpHpTdMBNi2h04KJK2YZFHurDOuX+MxGsoz21Pad6TAOQaL7054faue/1s2CtdmoMsO61TPT7NmSqpUiW6pPpdC2uLPFIi8HbTfc93dAwrJOIDB0Nfl4YGc9fbPfQpgKI3PSfq2hj023DXRrg7inEWXTraA+oHUyiwS0eMbLst2GadQ8xsbcwIGtvyCpYfk5Ac/LVMMqzoCmpLh+p1E4p/0dpokhh6mpig== 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=Y8PKs/VTWb4R67ByrAa+G7hk7mxsNxy5JfbbbtaYKUw=; b=HXYdc3nzV1YrPCi6c0I1rhQKQWQMnfbP3r4kzDSQy8s2tg3TvZgnPdOH5SkpNS/zXAnT6kYSjkfK34ocEuSFbnsO8zcgieu+B4nSwERC8HlVFnoIGYHQ9ZAvuu7idWlgDkoxJ8IQbSlRJ65bPwR0dS0bknch8Hzh713FMYi/5GYUifFotXBDSaPcuKcNpA8qEm6rjSMTdRk3RHCLL7ADEjdKTmzghqb+lzfoy2t+zXXlZXg0MjoXrtGPyWqJIUzV12qvEATTnpjqmDw9FiWm7H+BeLTbL1511NvluMTJ932YP1mQMfgpDrgdTP7ZyRStTUuRJchSlB0/XJ440OpjAw== 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=Y8PKs/VTWb4R67ByrAa+G7hk7mxsNxy5JfbbbtaYKUw=; b=VdTyDfEVV/C1SJ/YZvJrfhBLTzHkybVQQKkrbdDLxR+zoKEJ8S2A3L4Zzs2ztI0iqH801nhNlj6h6iugWhRX4Bth6PT+S5dRO1Ki4wpIFxzHft/2LDPjzOMjb2WehPoOIJstRE4VXHAfKEmfBgg7+HDzZusxjwP2qrloTFAZlks+k0EodCc5D9ySN4aHXO1bFfnttK4d3yYWpKpJSwgB4WmADCcr61gVQ2UtX+ttnlg73mYM3iU+LgFGdBMwxf3JtoZ4k4470PB/ZLe+XZx4V1ZfOE+9LumlEAIYjBqay1Gjmje+IjjjekR0zFkhUfLEaKw9LD+NlOYC7ZgL2Ovwgw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:13 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:13 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 06/23] nova-core: mm: Add common types for all page table formats Date: Wed, 18 Feb 2026 16:20:03 -0500 Message-Id: <20260218212020.800836-7-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL1PR13CA0403.namprd13.prod.outlook.com (2603:10b6:208:2c2::18) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 3da3e9eb-e166-4138-213f-08de6f33a50a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?W+VfS8Lf+1dR+lckmjNysKvUlJKZx5nexquhkwHI4JX1TFAonSGPDz6zshMA?= =?us-ascii?Q?n/T2WC/vJWEPgrB3udCQL76eRU0jFHE0AoFB2vEDehm94qQgFsljX7VcpbE7?= =?us-ascii?Q?0ocr2V874/XSYcSWtqQ8N9PmLmQKTKWA8jhI36o1f49gyEgQngt+usM7QBou?= =?us-ascii?Q?OOLB9rLfZA6b+h7mcS4vR+qVAm7JOp9wy7Ex9OwBzI1R3GM+5UPdv5SmTP0+?= =?us-ascii?Q?BOuQNIP79/L/XszagpDBzdw970cmA/alcLO+4jUdGJdE9IeDm6sZAe457La6?= =?us-ascii?Q?i7yF2AOlkYnqH8oS2CuJnm+g1AivTgfP7N9pFOIkt7qAErS6P4C8OW1ZkYt0?= =?us-ascii?Q?58l8H7+aDRev9s5KfOHPMEhM60Pgth8+aFsjkjEz8kaxL6pK0GRt6t+QG+HF?= =?us-ascii?Q?UQKhNkAmDpE4IKgGdYxFHMLyhlOJm/zYhKnNXTHejWL/SEyMY8cr8hfZwCo8?= =?us-ascii?Q?7HCY0Ojfflr3wka/zP5Cq1WQ/Pjdo+1wrecvruWGQBAdmBQW04dgoPvbpEUh?= =?us-ascii?Q?LBVe2vOmULDHSRH1RhQOA2wYo2cz36vt2vZMW1ilcOU0f4fjQjTwosEUyPiX?= =?us-ascii?Q?JKFRc5Wn9Nc8XdekfIBYXaaS9hYtBFUGpGolni8QGcIayPn6pdz//1cMIxLa?= =?us-ascii?Q?MHcso1TFXmUFfEDR3cIT/6sZXYwFJPevFhwHm+pj/XM2nmDtEAWwTn6zpZsb?= =?us-ascii?Q?jaf7da2v4KwxCbAyaxTVlbRziiDnpETP3LetQiNwbcxyBwLKHsnZF0HTGci9?= =?us-ascii?Q?0V04qX/SNA4P/8KdHP1uRQ09XJBD3dBgloadjqSDi0t1FjLYwx8bKsaVGEIj?= =?us-ascii?Q?8a4Ap6oyFTVeFR1zGOVZrxtNUgCn48JPMoTaTpOwpIfz7e6gjZZsf3+o9rVQ?= =?us-ascii?Q?LrpWXHsu6Sw3TFLAgTWIvbkUPcVjkNMAaHFX8QXDsEZANqApzQgJti4I/a9y?= =?us-ascii?Q?IHmit11W0V1DxRksMqsxkXVOtseFUwMiDD8k39iAdWrLkMH8S/1qIUyTF55W?= =?us-ascii?Q?PCxdV1WOGjw35f1+uV+eFhbP1NQKbyFFWHeodpXP7EKiSVe1auGVna1DcJTg?= =?us-ascii?Q?CD3bIXZwW+rNIHF6croGOcdYfrHNNqec8CFwbRejSFmkM5eI+Lxr8rq9d1k/?= =?us-ascii?Q?75w3K+0QJ75+lQhDg+AxO1r/hUuyH2pAFjMWkor/6awgrmUu4u+4kjREOXeY?= =?us-ascii?Q?VtLtiya7KQg1lZ90msWzt9LHZnyxE9yKA4sr1f++n3yIM6a9EUbL+B+sbEmc?= =?us-ascii?Q?fzgoAVZ3JkYyQWC9zs061PbwvmaS+wYFhHf1CSDXlZDWjwLB9xYIxGwYr0tO?= =?us-ascii?Q?f63gRzwbbnkgQlkmZd3kZn63z3tlPp7fve9k4CdFkNQ/ecRHXWOqRi7gEsdm?= =?us-ascii?Q?Tf6Wpknmq2qsdfmD9jh5cllke8xsauiLX19TPbDD2v6LDSOCUkyLh01SgTFS?= =?us-ascii?Q?wmO7axUT+3tCaVZbQzn571bfbU8hVXS2NbvK4XzxQVEl80NxfdolUD66V0Vl?= =?us-ascii?Q?tfHrT+KiqLeQNhv7ZuOz3oQh/viPiOLVIl6de0CzzDB2FavGeNOJ9HbPNhKC?= =?us-ascii?Q?IMooBJofWqWOQaRj6O8=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?8D084RshYQ97OFITRefsrJd6QohvOQVdkb7jjnZOdTOareqDUsaJQQ63qEyA?= =?us-ascii?Q?dK6p/GcXmM1MdpVUwSyrrT5xvgEAIRuAmO3HsH61+sbx37RS+1+vZY3V0klG?= =?us-ascii?Q?PYoC0Ya2Yk5+jr3/N1GuQ2wOgXkMR6Bh5NIqMPe6oSl+FcL0TUve1t9QBBaw?= =?us-ascii?Q?UclHYpCpbjPWkc/ehutf2LRHhjnkTr3pOYsudHlwhfTRoKl01+Mkm85n3vMX?= =?us-ascii?Q?Kxs5j4MYLc/YpDbkNbhjtXY46S8jmUf8jkGRrjNS5HqAUoizc8WX8+U1tmBZ?= =?us-ascii?Q?IuhagFJ30BrnnBnq63dN/44DsuuDccWWUlKVrlAMSZJkMpJraVBuowu8mvqq?= =?us-ascii?Q?tdHa+/wymyVgkcLOKXG7nACPfPrMGlVY81ITFpoODKuPTF8zJ4hXrySzVyxh?= =?us-ascii?Q?JiJmToTjtqP3jOpCzjLcKA8YPFNtzxuZZcDislp6rEp4bqQlW0qn7DXTXk58?= =?us-ascii?Q?AlKIlYVwdQwz1W3AwYjd+QIisdELoyANjrvBGrYowvqeYTIAYvQf4RQ3nK/e?= =?us-ascii?Q?ZNWI+noyt243OCC1KGXhO35cR2cl9QpJ7zEnPHJLksDCAdR0xU20itHNtPLR?= =?us-ascii?Q?3AKzt7nkepqIlwmctXSDjaxlOUVFnjtY3RrNSP4n7lSTRXHk65ykfRdmqpHU?= =?us-ascii?Q?E4LgpQ4OqgUZhh9nT0C4qhUZtvmKT9RTLQDxTOBQMJjCCjdTeN+hd+GgSsKX?= =?us-ascii?Q?ZXTmkcib2nIbC82qjw1+IxEdwQJYCAQDiAOpRcrYf3ZvhcH6wCm+6CbPWA0F?= =?us-ascii?Q?IrDcpCZ009n7UKzvLnWGFUM1FUUEAtUOvXjZcxmlXd52yb2+vKvar1eXqprD?= =?us-ascii?Q?BIaMPZ8IGGvjcUcS+fTDxspfuWgfHF722Z25gRSHwk43foJfeiczSrobWDIq?= =?us-ascii?Q?OibM7toI4XpGt5EEgv/ZjUdBb1Wc5ml0e2r3OHKriJeXKHcZebId0c67VfBJ?= =?us-ascii?Q?FXNk8fFb95QnS7aypwKvLm1n2I0AYM9qk1lzFf7oBfmhsGGb4DJZIg9Jfyna?= =?us-ascii?Q?zWlswy2obx3Rnh8l/0oIS5lNDTKGeKGrxvyHUpfDxQEL24JQqm9yxIGRM0XA?= =?us-ascii?Q?HWI7uywFRB2kyP75uZeeCANMpysulls5UEZs+G9gEFpJZnP48JhHZZuTowBT?= =?us-ascii?Q?4ARpoSg7cX7U64t3/2CaVbIQukYV+poc9u4i3C7L3dXpFR12YcgsGsIboJ67?= =?us-ascii?Q?IBC9BGReYVKviXtOygDbIB8I56E3zpdaLdL2eW1LmV0iBcq5+/izIh5pS/bS?= =?us-ascii?Q?VodRTDd/8fsAMz4C6q8qLUcLDYjzuertuvU7EROTzfFtG/ajiFyVic8E9ZqS?= =?us-ascii?Q?8q3spxlbTfvWgBfqZyT7XIowvr+tV6G5cLNyDxiS0o8o/eItljkQAzJq1Gyf?= =?us-ascii?Q?HzJZ1rBRFK5FpUwVcm5gROBYDFZK646RVx5HFr3cUClEm4I94rI1LxZl7WoF?= =?us-ascii?Q?H2M0oWT8FlUCg/j0IGH4KQ4SGtSaPH9aWABVWxu2WZxN8OtHPWQeJ9GARC5k?= =?us-ascii?Q?uCDxRp2rKddpF7mEl01+v9PWZHozKb349SWMVxg9RaZMcjyfp6YOweu55NGp?= =?us-ascii?Q?D51zkcr3pCl43KROvh41OGauyU2cEx5C5MP9qg8y+tNYt+s66cvKirfWG27N?= =?us-ascii?Q?x6dYJ2EuXt9sAjjkn7CrN//YY9R2EPzq0eqTCxDgIk6tIwqEpTeiiALEqHr6?= =?us-ascii?Q?aUIdSD8m0upf3Om2oQI5uiJewXnrnM4vFG3hpUmg5Pkvz04amvi3xCGCTTIF?= =?us-ascii?Q?FZ56BdOU2Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3da3e9eb-e166-4138-213f-08de6f33a50a X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:13.7442 (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: mrvjgklqYD9/c7zQ4IWhA7M6WsdNn1KWPRVx/LBxplUhXTQTgi4m8JCKLN4SSeCm1NJw35Q4aMKH2WCQxkgIZg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add common page table types shared between MMU v2 and v3. These types are hardware-agnostic and used by both MMU versions. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/mod.rs | 1 + drivers/gpu/nova-core/mm/pagetable/mod.rs | 149 ++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/pagetable/mod.rs diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs index 04d9baa7220e..c88b7b7b6975 100644 --- a/drivers/gpu/nova-core/mm/mod.rs +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -4,6 +4,7 @@ =20 #![expect(dead_code)] =20 +pub(crate) mod pagetable; pub(crate) mod pramin; =20 use kernel::sizes::SZ_4K; diff --git a/drivers/gpu/nova-core/mm/pagetable/mod.rs b/drivers/gpu/nova-c= ore/mm/pagetable/mod.rs new file mode 100644 index 000000000000..aea06e5da4ff --- /dev/null +++ b/drivers/gpu/nova-core/mm/pagetable/mod.rs @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Common page table types shared between MMU v2 and v3. +//! +//! This module provides foundational types used by both MMU versions: +//! - Page table level hierarchy +//! - Memory aperture types for PDEs and PTEs + +#![expect(dead_code)] + +use crate::gpu::Architecture; + +/// MMU version enumeration. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum MmuVersion { + /// MMU v2 for Turing/Ampere/Ada. + V2, + /// MMU v3 for Hopper and later. + V3, +} + +impl From for MmuVersion { + fn from(arch: Architecture) -> Self { + match arch { + Architecture::Turing | Architecture::Ampere | Architecture::Ad= a =3D> Self::V2, + // In the future, uncomment: + // _ =3D> Self::V3, + } + } +} + +/// Page Table Level hierarchy for MMU v2/v3. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum PageTableLevel { + /// Level 0 - Page Directory Base (root). + Pdb, + /// Level 1 - Intermediate page directory. + L1, + /// Level 2 - Intermediate page directory. + L2, + /// Level 3 - Intermediate page directory or dual PDE (version-depende= nt). + L3, + /// Level 4 - PTE level for v2, intermediate page directory for v3. + L4, + /// Level 5 - PTE level used for MMU v3 only. + L5, +} + +impl PageTableLevel { + /// Number of entries per page table (512 for 4KB pages). + pub(crate) const ENTRIES_PER_TABLE: usize =3D 512; + + /// Get the next level in the hierarchy. + pub(crate) const fn next(&self) -> Option { + match self { + Self::Pdb =3D> Some(Self::L1), + Self::L1 =3D> Some(Self::L2), + Self::L2 =3D> Some(Self::L3), + Self::L3 =3D> Some(Self::L4), + Self::L4 =3D> Some(Self::L5), + Self::L5 =3D> None, + } + } + + /// Convert level to index. + pub(crate) const fn as_index(&self) -> u64 { + match self { + Self::Pdb =3D> 0, + Self::L1 =3D> 1, + Self::L2 =3D> 2, + Self::L3 =3D> 3, + Self::L4 =3D> 4, + Self::L5 =3D> 5, + } + } +} + +/// Memory aperture for Page Table Entries (`PTE`s). +/// +/// Determines which memory region the `PTE` points to. +#[repr(u8)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub(crate) enum AperturePte { + /// Local video memory (VRAM). + #[default] + VideoMemory =3D 0, + /// Peer GPU's video memory. + PeerMemory =3D 1, + /// System memory with cache coherence. + SystemCoherent =3D 2, + /// System memory without cache coherence. + SystemNonCoherent =3D 3, +} + +// TODO[FPRI]: Replace with `#[derive(FromPrimitive)]` when available. +impl From for AperturePte { + fn from(val: u8) -> Self { + match val { + 0 =3D> Self::VideoMemory, + 1 =3D> Self::PeerMemory, + 2 =3D> Self::SystemCoherent, + 3 =3D> Self::SystemNonCoherent, + _ =3D> Self::VideoMemory, + } + } +} + +// TODO[FPRI]: Replace with `#[derive(ToPrimitive)]` when available. +impl From for u8 { + fn from(val: AperturePte) -> Self { + val as u8 + } +} + +/// Memory aperture for Page Directory Entries (`PDE`s). +/// +/// Note: For `PDE`s, `Invalid` (0) means the entry is not valid. +#[repr(u8)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub(crate) enum AperturePde { + /// Invalid/unused entry. + #[default] + Invalid =3D 0, + /// Page table is in video memory. + VideoMemory =3D 1, + /// Page table is in system memory with coherence. + SystemCoherent =3D 2, + /// Page table is in system memory without coherence. + SystemNonCoherent =3D 3, +} + +// TODO[FPRI]: Replace with `#[derive(FromPrimitive)]` when available. +impl From for AperturePde { + fn from(val: u8) -> Self { + match val { + 1 =3D> Self::VideoMemory, + 2 =3D> Self::SystemCoherent, + 3 =3D> Self::SystemNonCoherent, + _ =3D> Self::Invalid, + } + } +} + +// TODO[FPRI]: Replace with `#[derive(ToPrimitive)]` when available. +impl From for u8 { + fn from(val: AperturePde) -> Self { + val as u8 + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012024.outbound.protection.outlook.com [52.101.48.24]) (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 5CF3E32D0DD; Wed, 18 Feb 2026 21:21:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449690; cv=fail; b=Y9Gnce1MQZTulQsUJtqgWu/GdgnEfbxQOu4rv6xeb7Xod1bOFAB7MOQHrfIXusTQGdqf4Ys9JzQ+17rsaVuO7cr3PX/2htnwgNWooT2jvngHRZu6VxwAUnDWIVX9jxuS95QaqwrbH9xk9Llnu18r+Ne2l6CQBwLHmJbMRbSdQBg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449690; c=relaxed/simple; bh=Au5U1LESoG3UdqicuV0DaJPYddHAFg6P3UzSjJmlUA8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=hDniCCslR+9jGhwchQzwD0iKwtVF7bAI+hP30zXrzywWxulEIc0Q+Jw2C6dYrL8gv88byRQa0Bq8ckDv5cDPZrJLJleyn0amMuro4vDoOCCrEPKbQttyJ3xm9Mo4pNkqTDipq9PHcbEpnfKkHnt+Zio1fV+As5rFyFLlnIch49E= 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=fHHDqb2L; arc=fail smtp.client-ip=52.101.48.24 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="fHHDqb2L" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=djnkEqR7li8cFLkL5gQu+dLW0TIVIpWuqGUsTGl7XcI+UCzZShE1KPQD7dobGFttimkt+hfMma8+mCXzTynndnXSNC5rKPcZq66LAeHwFHrup2bdMQN5i6U4OrYjF5SS7OGETL3X5ks1Svus5znWmfo/j/7b0ooKxkhkM8fhq2kAvtUP1d1WOwoJYczhazQPQjPSaOp41WSa12dBJWVhM+KchKXBMuD1D3HVuAwGnI53IfFLwH61nZuxqG7Boyqf3D38UXJXZUT8uSwXP0fFX33nghBb6UQOHGsSgkPRpF66SzihyKXuQryVBKfNbxT/hoIv5ZVsQf081YigyNBnLA== 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=N4tZ18WQZI7pLjM2fqO+4IeV6mqiYFjqZZxeqcdkr3o=; b=VI9M2rsBcO8Bp16O93UtrDZXuB1rhiAtksIZfVsrvN+8BRQj1sHL1GA4Sz9eIUpm/EpIUokQe6AAHOJ0PDErQl7OXrLywT4PsCEBXNpSYedzzVLXXpN3FgyVZKe2e59bVTh2L2WzWLC8iiTBT7FlPsOpBhzTxOcnAhyZIKOoKdCNpRdZoTJu3qtG1UhtXh8WWyY9urfGMmtEZ/sp/dUA7OYL5mk8lkgerDDH8go6OEFc6T3P9TkPbLuf+rBSIzO7+6nYvi2E7pZFfCFnzVWlUSrH06SVYbAmKk+fBlx9b7T7NWGNYK/4Om7awks389xuIiTWLxl9y0/RjGGhIofgbA== 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=N4tZ18WQZI7pLjM2fqO+4IeV6mqiYFjqZZxeqcdkr3o=; b=fHHDqb2LU//X6Fvy6w6RPHNUvsxYqG37s8ILQhI1qCUk64HNRBJVL/B5NZOwg6406ix8zMyT7yR2yPTsgtS0d9nciuNRBsCD4Q3tK5J8LXEdyqtqS6WUODl2wVnUziTYwAo04SzXUzfHA+qJcCWabWGo+C7AeXWpa9NmphlYFU1wUdMV5gWi1Vxp48mKmAbLzTpNV41w0LhOJ5nv+UvmHc6rT3dD+VVGenU3DHDIG4rKA3gsTDJ/7Jrwlv5y5dFd7XK4FkZtrBYzu3mmHFShdo51JVNADYUb0wg8qCr6O5qeRtjW0BeKDp28D066J3aP9UfZDnIOA0GbKCEFRQeDMw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:15 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:15 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 07/23] nova-core: mm: Add MMU v2 page table types Date: Wed, 18 Feb 2026 16:20:04 -0500 Message-Id: <20260218212020.800836-8-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR1501CA0008.namprd15.prod.outlook.com (2603:10b6:207:17::21) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: c0a2b8f9-cdfa-4785-d8d1-08de6f33a60a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?UfPnU7CD8EO8TsSc62Uja6fHyAB3PZqhHAvhOjleWPtyhMinab23UEAAOQ2x?= =?us-ascii?Q?1y3qYodljujYUzo/ujk57Y5btKRxXOQ8+eDrol4z7FNNmTLCzTRBeq0N36+i?= =?us-ascii?Q?QCzQSGC+og/1h3qKvBJdi5uoEGgXh0jC8bv1nncLJxcE+7EUUpXZTVS5/g9+?= =?us-ascii?Q?TkdrsbYQJ2nlp07xlXiapfXvCugT1z4orIBr+/sl9sQsdXMduwfBKPNOHNOc?= =?us-ascii?Q?Y4+5f5ReiYQpzAOrP4Phmjgq/j7lUBDXIofa7Z9MxjUg/msmP5plqZZ/ivVh?= =?us-ascii?Q?jcmKIEMqeSOGj3c7T9aAZUtaMIOKZb/+9/9GXIaFPdf+QZhZVU4xeL4t79qO?= =?us-ascii?Q?gSxSJae6R5ua+4Vl8GQ5fWWCvfghlfwjdPfyX5nspKUs7wX5Dmz5eRb74hN2?= =?us-ascii?Q?VJYc4UByocGm15fheSfrQLwWo7YrZoFW2ntpz8uuSKaNnw1l/we2IVfPSLFd?= =?us-ascii?Q?spH/g6PxDTCpmGBHf8WHFeeLeusFLrx8TpD8JG0mlYAzIKwB6zD5ZqCNwjtI?= =?us-ascii?Q?t4ysVCOXw5cAujD4UI3vxLUtOQmnlsVldr40GtvpxgepAcNVXHT/tBR64D4H?= =?us-ascii?Q?bzxlQdPQDgE5Q14/ODvmykrDzJoEy9jO5UR5JBKRorDMqw7r3/3YmeuyQYvU?= =?us-ascii?Q?PPDiOvFtnfDBoWfBQXy32ImkbZYNCPWa1bqXaqokfkmt4+YdslbA8Oyod0xJ?= =?us-ascii?Q?bTISeiV/1FGvHifHPFYpYQmJAHLTPpK/SjiZaYCyOkd1+Cl4iLg5Towl9SKa?= =?us-ascii?Q?PMRp9+6OepXtbDUI9IbUp3lImOMwjkdiJBB7CF04Jiyeu7tUYlpPrtd+ELS7?= =?us-ascii?Q?dvlNKnbdb0avQkzrjA1BLRHcH1PjRUqw1A/Cz3OAY601j2k4yvRVkxe94u2h?= =?us-ascii?Q?RAaTzDvKoPlTIMOBzZmRKeQTHy1xuG6Br3WMP6F37+Y215djzwIqWUeq+Rpa?= =?us-ascii?Q?IUVLMb58i2Es/ei1QpAi6opoBW+r24e4aCyh+EjC/lCIUxOmuh+1/a69QRlR?= =?us-ascii?Q?SrWa0nzDgPbnJb6GTbMFmsWwYsrF4lriD2hKJR47EVHgId3HSjR1w9w6SHkU?= =?us-ascii?Q?2OgX4DPVKB6FNb0lqaZWULLgO2FdsdUXjnTRNdLTjN1BWloAEcz0Ld9V/yzQ?= =?us-ascii?Q?bNC+9ZTxHTs52vdlvfjFeypS/3xd5Ko2d4MSpnLHm4oWYwSrZYY0guogNs72?= =?us-ascii?Q?VjrCbMf1xzD0MeYNVKm4OrMgco43+zEFKm4yC7oOzjRQkhyEAUvGHIDYU7wD?= =?us-ascii?Q?wvbTbjJ9LEIMsprvoVQB1K8HfRh61HE4IOFrO8ip0ocUJJKOTmlTFC3uJSMJ?= =?us-ascii?Q?rnNkp6d3HvV4dNw/IlABjg9UIgtGxV1SyK02qs94Ky6hnaeJuDuZ/lY8T/65?= =?us-ascii?Q?EAUYkb3biMk2AKqGmFnVbizwCZ2AqLJesfA/Lll53sjbch699pzpZ2NnE8u1?= =?us-ascii?Q?VOBCAP2zT7JSMPY52tfgV+n/lyDAMbQA9MXSto3z2pEYRk6kJ+1ZxfUeDxLm?= =?us-ascii?Q?0KibriIM3ncX/lOgz/HpbgYibCON3QgVfzTxdMh4BItco205aWktq1Dv156N?= =?us-ascii?Q?kUAI6zO8tfkUiqlZ4I8=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CHMNmtKVhg48NXOsBpK1b7hlb0uN/Aor7ru05vAFTTU2UN0LexPDCkMKYC3l?= =?us-ascii?Q?pja8sNCb9TTOFpS+xheze5zIAVSqHQcm/nw15NW3Pr2O/VKOyMeNvSk/5+XG?= =?us-ascii?Q?vaQtymgoZoCynvel0Zm5O2hDZUS3JjYdxPbA0HVUVqLOarUdG2bU9GSz+T/9?= =?us-ascii?Q?WA4sSRZeouWnbInmgjUnHMocbdxMySz6ImplrunGRp6D0iiGuit3C78DB9OU?= =?us-ascii?Q?3tnqdMazxQW0KVgniEzS9K9o7FnsvYpsH/xpZ1omMC9jIdrCgDUwCAifvMxm?= =?us-ascii?Q?n0p1IjB01R00s4PvMgLhr+3CLqvScZkp31iK/vFJbGy/6KF0SfzwbDASoEDf?= =?us-ascii?Q?3AQ4UgbN/+KfwIE8DChgifU7mc4qey4HlCgl7a4pTyqj2Yss5E+0rrQ2blMv?= =?us-ascii?Q?gyTH1wSznKNSrz2HCNixY2CH4dowco4Pl5qL3O4hKR+AMerI8n2+jrA7bEBg?= =?us-ascii?Q?V889vjXMqceMBOe6SvWelx2hnXRPGca2OnciexcNyxBxV+IrZsxpeUAJ3P14?= =?us-ascii?Q?ZetDzBVhOEGeuYbLc+P4LkcwgG/6HRFU5po6Zc6fzRXrAdtffRWjRzfuaT+q?= =?us-ascii?Q?HG529Xrz8qQ1ZmtgyNa9gJxGrzfNyAlu9ZPTdZ+pT2ea3rWcIEt9cDluWThp?= =?us-ascii?Q?HQSKvnahmCvyRWpvSZWPbEZrMHdDi26nc4TcwTG5Gs229wtNCVcclqYZ3pP7?= =?us-ascii?Q?ERikWWUkAavpqw4lW1+54AW79l8QW00yhit5kEdszfAFB4P7SCEqq2v6uDx7?= =?us-ascii?Q?uvlDlRSNoSjt2ngv+yhzZxW4M8ZTeMxdq6gb6dC5lgAKoNWQlqGGHD2PRLSH?= =?us-ascii?Q?L6dcNi3n3IMNnmI7fww1c+eej4FepSvq/sEr4E2IcAiH8wDQrM64A7naYYZw?= =?us-ascii?Q?yjq/6gGMYP9mIy8fBPA2nOExe5eSgm4Dl6QgRPA4vzglSrcvdHHgt/+nen/W?= =?us-ascii?Q?cu8lhvLEVcvE64LVFrsrf63DFZkDWUIDlT/vQSq7T6qfGfYG+6aERpb1Y43t?= =?us-ascii?Q?BQSckOYd4lngmU1EEYFG6i6j/bw6N5xpdbrBeaL9L8ylii/IjvC9dueTtv44?= =?us-ascii?Q?KHou58wTu5qFwZOLq/UImvrgbMi1XFdIU5Io7fsziHepcLSV0MTeKlxXFsBc?= =?us-ascii?Q?IxAZ0HHgA5SB9S0BrYSzTkAwyx+c3iCgLZ1mCdnp3Nh4og9jypXU7MbClWEF?= =?us-ascii?Q?6EoBs3wYkRp2fLABECvvxQRj9+unlOVzKtyBaK9PVewygezdjAHY23pn3vFw?= =?us-ascii?Q?wkSudRDAkcnWazt6zkt35roVFEJHlwMHG1XVlzACSmGp6k4mRtD+eNCG5ev7?= =?us-ascii?Q?D1ZCChEmhEoxXNyDl0Qd1fV1a1+hP/pnDIFXfUHPqWMMIrFIs/JSlIyWGW3r?= =?us-ascii?Q?9YfJ39Z25MnRGIsJem8wq90dk6q+GKLLhCdcKFgXp1zQ6RQDsjH8OZ5h77ru?= =?us-ascii?Q?uqt0RB4OLMJ7MkPPdZgMLCfOmK7nU4OoLCs6r7/yCJ266t+vJ6JXabWQx6I6?= =?us-ascii?Q?MLVN0tMDI0wfO5XBqKdkdWIxiknXAtw9ktWRxnnbdLWpe3aQ0U8bvWr1O83D?= =?us-ascii?Q?luTMsHWOAxQE+OPChqwAQEM+RO9mhuFQ97JGYA1CDPBQInKDcD072IwyZDo5?= =?us-ascii?Q?yXtCB87lg1L3ELCrY7YmEwV2P6s807VU94PXCG4NT3IzlaPWg4XeQkpRoqo/?= =?us-ascii?Q?Fu2nvmGR818BSJsqu5qiREj7pNT23qNPo0TMN7hMTRLdagQqDeoAPrlxaOr3?= =?us-ascii?Q?VCL2Ik5UBQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c0a2b8f9-cdfa-4785-d8d1-08de6f33a60a X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:15.5257 (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: XSMzduwJj1RQqEq3l2yZMmwpwq44fiqjIM00mi7x0MY3r6eNP32d8Sg8wDUlhdqwMpLpckfCNDOKSVEK7XEpBg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add page table entry and directory structures for MMU version 2 used by Turing/Ampere/Ada GPUs. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/pagetable/mod.rs | 1 + drivers/gpu/nova-core/mm/pagetable/ver2.rs | 199 +++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/pagetable/ver2.rs diff --git a/drivers/gpu/nova-core/mm/pagetable/mod.rs b/drivers/gpu/nova-c= ore/mm/pagetable/mod.rs index aea06e5da4ff..925063fde45d 100644 --- a/drivers/gpu/nova-core/mm/pagetable/mod.rs +++ b/drivers/gpu/nova-core/mm/pagetable/mod.rs @@ -7,6 +7,7 @@ //! - Memory aperture types for PDEs and PTEs =20 #![expect(dead_code)] +pub(crate) mod ver2; =20 use crate::gpu::Architecture; =20 diff --git a/drivers/gpu/nova-core/mm/pagetable/ver2.rs b/drivers/gpu/nova-= core/mm/pagetable/ver2.rs new file mode 100644 index 000000000000..d30a9a8bddbd --- /dev/null +++ b/drivers/gpu/nova-core/mm/pagetable/ver2.rs @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! MMU v2 page table types for Turing and Ampere GPUs. +//! +//! This module defines MMU version 2 specific types (Turing, Ampere and A= da GPUs). +//! +//! Bit field layouts derived from the NVIDIA OpenRM documentation: +//! `open-gpu-kernel-modules/src/common/inc/swref/published/turing/tu102/d= ev_mmu.h` + +#![expect(dead_code)] + +use super::{ + AperturePde, + AperturePte, + PageTableLevel, // +}; +use crate::mm::{ + Pfn, + VramAddress, // +}; + +/// PDE levels for MMU v2 (5-level hierarchy: PDB -> L1 -> L2 -> L3 -> L4). +pub(crate) const PDE_LEVELS: &[PageTableLevel] =3D &[ + PageTableLevel::Pdb, + PageTableLevel::L1, + PageTableLevel::L2, + PageTableLevel::L3, +]; + +/// PTE level for MMU v2. +pub(crate) const PTE_LEVEL: PageTableLevel =3D PageTableLevel::L4; + +/// Dual PDE level for MMU v2 (128-bit entries). +pub(crate) const DUAL_PDE_LEVEL: PageTableLevel =3D PageTableLevel::L3; + +// Page Table Entry (PTE) for MMU v2 - 64-bit entry at level 4. +bitfield! { + pub(crate) struct Pte(u64), "Page Table Entry for MMU v2" { + 0:0 valid as bool, "Entry is valid"; + 2:1 aperture as u8 =3D> AperturePte, "Memory apertu= re type"; + 3:3 volatile as bool, "Volatile (bypass L2 cache)"; + 4:4 encrypted as bool, "Encryption enabled (Confiden= tial Computing)"; + 5:5 privilege as bool, "Privileged access only"; + 6:6 read_only as bool, "Write protection"; + 7:7 atomic_disable as bool, "Atomic operations disabled"; + 53:8 frame_number_sys as u64 =3D> Pfn, "Frame number for sys= tem memory"; + 32:8 frame_number_vid as u64 =3D> Pfn, "Frame number for vid= eo memory"; + 35:33 peer_id as u8, "Peer GPU ID for peer memory (0= -7)"; + 53:36 comptagline as u32, "Compression tag line bits"; + 63:56 kind as u8, "Surface kind/format"; + } +} + +impl Pte { + /// Create a PTE from a `u64` value. + pub(crate) fn new(val: u64) -> Self { + Self(val) + } + + /// Create a valid PTE for video memory. + pub(crate) fn new_vram(pfn: Pfn, writable: bool) -> Self { + Self::default() + .set_valid(true) + .set_aperture(AperturePte::VideoMemory) + .set_frame_number_vid(pfn) + .set_read_only(!writable) + } + + /// Create an invalid PTE. + pub(crate) fn invalid() -> Self { + Self::default() + } + + /// Get the frame number based on aperture type. + pub(crate) fn frame_number(&self) -> Pfn { + match self.aperture() { + AperturePte::VideoMemory =3D> self.frame_number_vid(), + _ =3D> self.frame_number_sys(), + } + } + + /// Get the raw `u64` value. + pub(crate) fn raw_u64(&self) -> u64 { + self.0 + } +} + +// Page Directory Entry (PDE) for MMU v2 - 64-bit entry at levels 0-2. +bitfield! { + pub(crate) struct Pde(u64), "Page Directory Entry for MMU v2" { + 0:0 valid_inverted as bool, "Valid bit (inverted logic)"; + 2:1 aperture as u8 =3D> AperturePde, "Memory apertu= re type"; + 3:3 volatile as bool, "Volatile (bypass L2 cache)"; + 5:5 no_ats as bool, "Disable Address Translation = Services"; + 53:8 table_frame_sys as u64 =3D> Pfn, "Table frame number f= or system memory"; + 32:8 table_frame_vid as u64 =3D> Pfn, "Table frame number f= or video memory"; + 35:33 peer_id as u8, "Peer GPU ID (0-7)"; + } +} + +impl Pde { + /// Create a PDE from a `u64` value. + pub(crate) fn new(val: u64) -> Self { + Self(val) + } + + /// Create a valid PDE pointing to a page table in video memory. + pub(crate) fn new_vram(table_pfn: Pfn) -> Self { + Self::default() + .set_valid_inverted(false) // 0 =3D valid + .set_aperture(AperturePde::VideoMemory) + .set_table_frame_vid(table_pfn) + } + + /// Create an invalid PDE. + pub(crate) fn invalid() -> Self { + Self::default() + .set_valid_inverted(true) + .set_aperture(AperturePde::Invalid) + } + + /// Check if this PDE is valid. + pub(crate) fn is_valid(&self) -> bool { + !self.valid_inverted() && self.aperture() !=3D AperturePde::Invalid + } + + /// Get the table frame number based on aperture type. + pub(crate) fn table_frame(&self) -> Pfn { + match self.aperture() { + AperturePde::VideoMemory =3D> self.table_frame_vid(), + _ =3D> self.table_frame_sys(), + } + } + + /// Get the VRAM address of the page table. + pub(crate) fn table_vram_address(&self) -> VramAddress { + debug_assert!( + self.aperture() =3D=3D AperturePde::VideoMemory, + "table_vram_address called on non-VRAM PDE (aperture: {:?})", + self.aperture() + ); + VramAddress::from(self.table_frame_vid()) + } + + /// Get the raw `u64` value of the PDE. + pub(crate) fn raw_u64(&self) -> u64 { + self.0 + } +} + +/// Dual PDE at Level 3 - 128-bit entry of Large/Small Page Table pointers. +/// +/// The dual PDE supports both large (64KB) and small (4KB) page tables. +#[repr(C)] +#[derive(Debug, Clone, Copy, Default)] +pub(crate) struct DualPde { + /// Large/Big Page Table pointer (lower 64 bits). + pub big: Pde, + /// Small Page Table pointer (upper 64 bits). + pub small: Pde, +} + +impl DualPde { + /// Create a dual PDE from raw 128-bit value (two `u64`s). + pub(crate) fn new(big: u64, small: u64) -> Self { + Self { + big: Pde::new(big), + small: Pde::new(small), + } + } + + /// Create a dual PDE with only the small page table pointer set. + /// + /// Note: The big (LPT) portion is set to 0, not `Pde::invalid()`. + /// According to hardware documentation, clearing bit 0 of the 128-bit + /// entry makes the PDE behave as a "normal" PDE. Using `Pde::invalid(= )` + /// would set bit 0 (valid_inverted), which breaks page table walking. + pub(crate) fn new_small(table_pfn: Pfn) -> Self { + Self { + big: Pde::new(0), + small: Pde::new_vram(table_pfn), + } + } + + /// Check if the small page table pointer is valid. + pub(crate) fn has_small(&self) -> bool { + self.small.is_valid() + } + + /// Check if the big page table pointer is valid. + pub(crate) fn has_big(&self) -> bool { + self.big.is_valid() + } + + /// Get the small page table PFN. + pub(crate) fn small_pfn(&self) -> Pfn { + self.small.table_frame() + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 6670332E120; Wed, 18 Feb 2026 21:21:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449690; cv=fail; b=MMmyJ567UMIuO7Lo8BMlX2oNj14of+ntvvS8J+4HoXmVSIa1iTUPaEW+2Q6rHdGH0Tl5OQB1RFvGqBjRBFoFr3jmX3rRyV/opfopDuJVLcfoyHXyYxmboIhSnTkYzn70pW3Qzm3pnzel3wU82kqkdM6rFgubuKedTN+VfzBrwSw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449690; c=relaxed/simple; bh=yPgpkGVL/x69YsqXE4eQOaLIDNPlf84xW1aS5C9ai48=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=LxbDxJwfn8Gnh9qZJ5o33bUc4iued4nXoIzbcZUA/eZK0rGeQJU2iSuY9NhJoapKruWvhk87F79y2tp1j2KjdLmArbo2kMXSy7kJ+GquaJAvcc+Bz1i0GWFJlFLP7ZHmBxl+E20jZN6NGR5ijJJfHhe835kKLf1wwfteXtn8Bmw= 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=eTHDNTAw; arc=fail smtp.client-ip=40.93.196.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="eTHDNTAw" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yIkksasybdR+XM7Zzwr7shZfXPyyT7fq/s98BvC7IKn1kIdIZvdCq+3hSx5z5q5dFUclG7aMLJNjmj0jATKGv49bGIuCU+qOlhkmQWL+DSbdbNvS+hDQLbpyahqFnYzwN+ewUMYOa1m5Lp+tTEeBt8xMDlYtKWQ5H+i/YUkOeL7MsUePlA1rKcyn+WIGATfzwAFlzUZb97FZpI7O+IiSHkhFIlnvLPoIRcgMuBBXk3PJLCxIzJ6akSlIdLxqMDPZSkK7avMH0elWE8wgSg0l6ofqtagEys1qAwUnyFMRW45dU62U0fjUUy3IRtSJ9r4mYvK8jArGMWGJuuz91vusng== 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=5P+LAknwW7UnyrFGO+Z/E38e0HhPyqCHB2kNaBTTJBY=; b=tGr5Bz5RK6cXHOGdXcBTQGjveaFzpz5aXAzgPVbu9Iw+S3SQ/mB5AlhuX2umNYdQraUwu4t4PV8tvjHSuneSSP1pSIcb42ljNFWnxmRfUKCW5kD0nsF4dchgzsQYAVfpJ++IPa0F2F3tL0EaAK/VXDbuHQtiU0ax/yPy5oyVa3Q550NzRr3Y+F626C496i/cIhVjeefmBVwzBE8YLlo/VSo4LJNpgD2EXO5kiWOKLmDURCRGUMivkhm0Oz/2TUBFyA3q4aIDoj5U4YgeyO50fhASfJyY7qI+LCGy/l/QMhj4v1FMAFyti8oGbagtyL0aI2nAl/9P4Jr2VI+MqGsorg== 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=5P+LAknwW7UnyrFGO+Z/E38e0HhPyqCHB2kNaBTTJBY=; b=eTHDNTAwlAp1hE4840VIXfS2qq7e/yamSDf2LA4Z5DJyKSNu6PeJh+8HFxkFoYSRx0QHcSXZn1xMv0E5Y5BoPfXQ2kMcXoDuA6RcN3Ur4HWbObyu994wJp0Dj9hVyMfPUfu8fHJ2Wkw+P7zBHtEKHFwxppUlMqw4vVJw4wJX6VNZ0x4HmnSZt9mGclRuDIss+dshUIRrFPI7Ix2elbrgMwrQpAyx6nrEJBKMWfGnC2E9qFrF97bPac6rZU2pMR28GoiM6Lgporc2zWwL3JGOjXdUXhpZRdjHDg5VykqrIQcUxRDCnUvk6t2MdOIre+O5uawN2B+7U1Oq6vGE5A9Wig== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:18 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:17 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 08/23] nova-core: mm: Add MMU v3 page table types Date: Wed, 18 Feb 2026 16:20:05 -0500 Message-Id: <20260218212020.800836-9-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL1PR13CA0397.namprd13.prod.outlook.com (2603:10b6:208:2c2::12) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 20f4de8e-6aaa-485a-4d07-08de6f33a6f3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?RexrAQ8xtdBbzd6/XqDJG13u62RIPMskbEOYH0VWKhgDIN5POww6G4BAo3Xy?= =?us-ascii?Q?5xvf1+y2ejnY2CO5X6U7P6cl5XeHYQVxr/R6Clg79k5Lqay+uvl7BtJoZF6Q?= =?us-ascii?Q?kSlxfCs0Egt54uhqPaI4OcOkD+j3vWulyJEESigj4N2ZeeEpHI63eyX72/1I?= =?us-ascii?Q?KEJpo/PYE57TYAqCv1N5ztQ4uYYofzzoxJKoP5GGVRlLkBrnYaQ4maeCABR9?= =?us-ascii?Q?uGaUc5kxosenuxS6Ev7pYAG6YDA0rrM+e7T7aXZC4tIjOdWiNVLrCExj/u0s?= =?us-ascii?Q?eKtn1+H3A9QQzP14beb2AB2t7BdZhoQ1N6SoYgbe7OiIovQxt5XOQZacjDov?= =?us-ascii?Q?e2l0kw4hUnooEhp/rs5X25Be5BZWZzHQ1u6Khzl2c+PV1B1DUk8bcO/fZ8DX?= =?us-ascii?Q?jNLA25CPUcyXKUw4/35dmhtOpJ8xQczX2KpEngqGIeosKEqLRqJ6AMel2VYp?= =?us-ascii?Q?lPINTR0u0nvPoFFQ67t+Q1vg4l9f8wSMB+j9iSBFpZbxf7bjj/mNxF1CaTjm?= =?us-ascii?Q?k+vJmnlY4rSMFTRG5b6sVwml+UIJIWOyunyh2prCeRlPX4WKCj76yE81G3ED?= =?us-ascii?Q?qIMgXs+bl/iukkYYlHofhJKd4FFL6IfD9VuizvwIaOUJt5P2I79+1l7ZlqR3?= =?us-ascii?Q?RMsnMFcn6ZYCOrGAFp7geLE3NlCVWsRnm24cn6a8oPXCwBqFZPICg4ku+qpS?= =?us-ascii?Q?QItAT01np1OxSHnxIo426wVXYvEfOQ2skWLqB0sA8cq5Z5+sxDZuiubJEcv/?= =?us-ascii?Q?QheR1R8B1X0kEskSiUR9RvAmQF+KAmhUkr2D9nJzcupoRxT9s12Us5gFORKc?= =?us-ascii?Q?qlqJnBG4ReyzklPOaVak9+lr1970HiBF43YfrDI/VfO6RRQWGp/Mt9jNhyw2?= =?us-ascii?Q?02JStX5tGNMUxpk6MLgXi2wYY400f0if9nY4bAppZAXCfJTbLIfkXvLjCaSL?= =?us-ascii?Q?UNF0gpFJFQHh+YMhSobemoO75q4x6t6V/47D235K+vNShtOryBusLTp91uJT?= =?us-ascii?Q?gR+56wQN4MpPUJzU/t52tMEHWEeVxnU2y/4X0xm/dzkAJN8H0tkRmR5yFlC2?= =?us-ascii?Q?7P3uneYLKFlCkZEZC61gkffd/9lFNMf1AHGW4+lO2DbYjnDY5dwTpqyq4G2p?= =?us-ascii?Q?271W5Px9K7Eng1e5PH/2wHS1QuCoR7mJ0SKBym7G+w9npHnRcCTWuwey1eaA?= =?us-ascii?Q?pZHi/qOjvK1PzMTxXXQDIOzCFhylK+zXljNsEwDCAbw7Blh3lAgOfovSciuU?= =?us-ascii?Q?jNzys81zavZQD1hR1bZ1bP/iWVnjo6kSbnpzWEFWQTfjGmPpHmeZYaFjCHSh?= =?us-ascii?Q?f7KZwZlQtcArxiMQJbhSbATdoNEUYAtMA/pW1GR1HbLQWJIdQkMl7xZUGsHu?= =?us-ascii?Q?1eShePmp8uPSrbnPKS2UhMyBAoKdSCKEC/BJD7MA6CjAfZvTw4UnxkejZYod?= =?us-ascii?Q?xh7JVyIbfNUIYAW77DhdX0JD4RSS6OdWIuOfpvgHQ2ii/wFnuQVYeEOF8scq?= =?us-ascii?Q?CErp5DF4zN7x7naC/S1YwTEmPNrBjTcJVoRDFFF204eU9ITuDejfaGvXFOp1?= =?us-ascii?Q?YVw5ZEu+qnC9nqOZ1Oo=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KuUzI+FwHl8TRwApgq5azpuz17Ie+jst9hm99kF4bwqcQnUiwYEpBTZDYpkV?= =?us-ascii?Q?jrXWhEGqDnJODVV555jExKf5UetJIUlJKWcWQnCXjj6epqIN3z/RH3TEAu5o?= =?us-ascii?Q?slENkiabcHtJayVf59Uv7UZjvJykYzcOHQt5cWuZrUzH4je7aXoQyXt8vwBE?= =?us-ascii?Q?zf+mi4AYbVg4elkVM2KALu3WZ9OwNgn6mpL8L+WvK22XxInaGypO7U5eEyCl?= =?us-ascii?Q?ZswItsC38xNhgbpABECb4aB3WRImcMEcIHg4ns79+DiAut4FeXTIVPgBKrDv?= =?us-ascii?Q?pE9Dgkghf7GZWimtr/WGZ10F0m0dBjmyL+iitpO7iXJdACs165nWkhli6fRd?= =?us-ascii?Q?TeOylDzV7zK34fYxNQctLBwKEzqXurNeg2XeZIS1zyQAH/2lXjgnw3KF4+7k?= =?us-ascii?Q?7CRtuMCY5FOrFpiS7ElAAQ6t2OQ/fDIg0ZVUgFVDUVoH26MThJror+tJ0fa7?= =?us-ascii?Q?0hA+y85WMlLb+CHMcotjUQbLV39J8HK3n6jJnEGc/6ssFT91hjzR0XOrMT7p?= =?us-ascii?Q?6Vu7nz6VdIgNe+x/v1wzQzwx9PFFkUIQ/Ra2TdNP+qZRhrvv7mOVFspn+5qq?= =?us-ascii?Q?U2FnJ85YQuNjacZm17uRhzxGAP2741GMHwTUk4huKFH4vzDA0ivhtMZaasJI?= =?us-ascii?Q?/ItiHKnKcyOs1bJPSL2ud/jv8kk8CbnMwtoIx64pdjNsGFXv7uq20sOkJVt/?= =?us-ascii?Q?NYwrFdgRrXC9l0IawHVvdDyddlCBSpIFEAJYNDjRH5IhXracN4PgnSSo53Mu?= =?us-ascii?Q?8ILTnyvjOdHCG0RuvshQ8HjJDmBAzJCd4lC/85MNFJ/JLiPgqyUNmoLpEeCJ?= =?us-ascii?Q?Tg0wGH/hoWCDgmwvf6PrbPzU72DVfY5zNlBGxDqmzViHS8FEEGImQdLLyfYN?= =?us-ascii?Q?aOzsyUox/lyLAacT01SSRJbq/LniTF5EaNb/LK90HUsJW9IkfW3mYdIsSyYz?= =?us-ascii?Q?KUrYZUjzqve0rbXLrgGUMgKa5GW3IjNhui8ymH1VPaiiITnJZFshQLCV734t?= =?us-ascii?Q?wqA8RTIhQFQj3458Srk/VKdzgoNDCBm2OY7pE4lAX11P89muFUMno6i/Fp+T?= =?us-ascii?Q?+v/gxp6uG1u+HTpDLZQJqDdD/CGaVp+xuuFKwKHhMj2yIGX4w/jv1zXiRJgY?= =?us-ascii?Q?+ux6kL0iRcr/MWIVnui//KxQjj4HtIt9GUUB/MuFS9DGBITDB18TT7IdjacQ?= =?us-ascii?Q?oZJY81aihy0MHAjNDOI69dSyCg1rT6hDHPOd7f2dV3GI6Lcn9J9yIin8HgTg?= =?us-ascii?Q?uj7HdgjAf9vGJ5fjB+m+zg5DRKer9NwX8q/acfM7CCtQbQ/+nUg3tElVFySB?= =?us-ascii?Q?/zRR0IhKrBUa6qvkqa4jDEosAvJSMMp895Um5BiiAQGypxLOEjc7xPk7fK+d?= =?us-ascii?Q?fbG+C5SZR7XcZQM9y6nIRmUOLLJ4RrruLBsQoATB/eXPgw6EYYyRYCIJ0lzX?= =?us-ascii?Q?apfd0t91sCxnxmbUWXivmBY8q97U6QkAg56CdkdEffZ1TX5bJXosvm+fFJEV?= =?us-ascii?Q?nkeaNW/DNtUDqikKcHQyi68OiXF7nJOa7qnTrkpPf+SkEcAdiJMPTEmARTj+?= =?us-ascii?Q?JdwZTJ+g8KUeGVtsR59MsgxIR5/wBP/Xqr0tB0GEek20Z4AfKe0QXlW49Ep/?= =?us-ascii?Q?DVw2gKsTIzhW2qNDHdi6ceBHwu5I6HFO9NDAFS2hPHcVXFoyjaGvjHpskXGX?= =?us-ascii?Q?38uH6hHR+GZL4djyIOYxAWXdc4aJoawi0Bu90vrL1Ywrpiz47j7ncWF5KEPw?= =?us-ascii?Q?fBqmWjzOMA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 20f4de8e-6aaa-485a-4d07-08de6f33a6f3 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:17.0669 (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: ppVdQ3oOdFtZ80kLRqWKP+wgUbH2Di2yF+Ih7fjEA/t0V5qlBzlygUpqv9c5ntoPxZWWbDUjFiBVhilr+I0ebg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add page table entry and directory structures for MMU version 3 used by Hopper and later GPUs. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/pagetable/mod.rs | 1 + drivers/gpu/nova-core/mm/pagetable/ver3.rs | 302 +++++++++++++++++++++ 2 files changed, 303 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/pagetable/ver3.rs diff --git a/drivers/gpu/nova-core/mm/pagetable/mod.rs b/drivers/gpu/nova-c= ore/mm/pagetable/mod.rs index 925063fde45d..5263a8f56529 100644 --- a/drivers/gpu/nova-core/mm/pagetable/mod.rs +++ b/drivers/gpu/nova-core/mm/pagetable/mod.rs @@ -8,6 +8,7 @@ =20 #![expect(dead_code)] pub(crate) mod ver2; +pub(crate) mod ver3; =20 use crate::gpu::Architecture; =20 diff --git a/drivers/gpu/nova-core/mm/pagetable/ver3.rs b/drivers/gpu/nova-= core/mm/pagetable/ver3.rs new file mode 100644 index 000000000000..e6cab2fe7d33 --- /dev/null +++ b/drivers/gpu/nova-core/mm/pagetable/ver3.rs @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! MMU v3 page table types for Hopper and later GPUs. +//! +//! This module defines MMU version 3 specific types (Hopper and later GPU= s). +//! +//! Key differences from MMU v2: +//! - Unified 40-bit address field for all apertures (v2 had separate sys/= vid fields). +//! - PCF (Page Classification Field) replaces separate privilege/RO/atomi= c/cache bits. +//! - KIND field is 4 bits (not 8). +//! - IS_PTE bit in PDE to support large pages directly. +//! - No COMPTAGLINE field (compression handled differently in v3). +//! - No separate ENCRYPTED bit. +//! +//! Bit field layouts derived from the NVIDIA OpenRM documentation: +//! `open-gpu-kernel-modules/src/common/inc/swref/published/hopper/gh100/d= ev_mmu.h` + +#![expect(dead_code)] + +use super::{ + AperturePde, + AperturePte, + PageTableLevel, // +}; +use crate::mm::{ + Pfn, + VramAddress, // +}; +use kernel::prelude::*; + +/// PDE levels for MMU v3 (6-level hierarchy). +pub(crate) const PDE_LEVELS: &[PageTableLevel] =3D &[ + PageTableLevel::Pdb, + PageTableLevel::L1, + PageTableLevel::L2, + PageTableLevel::L3, + PageTableLevel::L4, +]; + +/// PTE level for MMU v3. +pub(crate) const PTE_LEVEL: PageTableLevel =3D PageTableLevel::L5; + +/// Dual PDE level for MMU v3 (128-bit entries). +pub(crate) const DUAL_PDE_LEVEL: PageTableLevel =3D PageTableLevel::L4; + +// Page Classification Field (PCF) - 5 bits for PTEs in MMU v3. +bitfield! { + pub(crate) struct PtePcf(u8), "Page Classification Field for PTEs" { + 0:0 uncached as bool, "Bypass L2 cache (0=3Dcached, 1=3Dbyp= ass)"; + 1:1 acd as bool, "Access counting disabled (0=3Denable= d, 1=3Ddisabled)"; + 2:2 read_only as bool, "Read-only access (0=3Dread-write, 1= =3Dread-only)"; + 3:3 no_atomic as bool, "Atomics disabled (0=3Denabled, 1=3Dd= isabled)"; + 4:4 privileged as bool, "Privileged access only (0=3Dregular,= 1=3Dprivileged)"; + } +} + +impl PtePcf { + /// Create PCF for read-write mapping (cached, no atomics, regular mod= e). + pub(crate) fn rw() -> Self { + Self::default().set_no_atomic(true) + } + + /// Create PCF for read-only mapping (cached, no atomics, regular mode= ). + pub(crate) fn ro() -> Self { + Self::default().set_read_only(true).set_no_atomic(true) + } + + /// Get the raw `u8` value. + pub(crate) fn raw_u8(&self) -> u8 { + self.0 + } +} + +impl From for PtePcf { + fn from(val: u8) -> Self { + Self(val) + } +} + +// Page Classification Field (PCF) - 3 bits for PDEs in MMU v3. +// Controls Address Translation Services (ATS) and caching. +bitfield! { + pub(crate) struct PdePcf(u8), "Page Classification Field for PDEs" { + 0:0 uncached as bool, "Bypass L2 cache (0=3Dcached, 1=3Dbyp= ass)"; + 1:1 no_ats as bool, "Address Translation Services disable= d (0=3Denabled, 1=3Ddisabled)"; + } +} + +impl PdePcf { + /// Create PCF for cached mapping with ATS enabled (default). + pub(crate) fn cached() -> Self { + Self::default() + } + + /// Get the raw `u8` value. + pub(crate) fn raw_u8(&self) -> u8 { + self.0 + } +} + +impl From for PdePcf { + fn from(val: u8) -> Self { + Self(val) + } +} + +// Page Table Entry (PTE) for MMU v3. +bitfield! { + pub(crate) struct Pte(u64), "Page Table Entry for MMU v3" { + 0:0 valid as bool, "Entry is valid"; + 2:1 aperture as u8 =3D> AperturePte, "Memory aperture t= ype"; + 7:3 pcf as u8 =3D> PtePcf, "Page Classification Fi= eld"; + 11:8 kind as u8, "Surface kind (4 bits, 0x0=3Dpitch,= 0xF=3Dinvalid)"; + 51:12 frame_number as u64 =3D> Pfn, "Physical frame number (f= or all apertures)"; + 63:61 peer_id as u8, "Peer GPU ID for peer memory (0-7)"; + } +} + +impl Pte { + /// Create a PTE from a `u64` value. + pub(crate) fn new(val: u64) -> Self { + Self(val) + } + + /// Create a valid PTE for video memory. + pub(crate) fn new_vram(frame: Pfn, writable: bool) -> Self { + let pcf =3D if writable { PtePcf::rw() } else { PtePcf::ro() }; + Self::default() + .set_valid(true) + .set_aperture(AperturePte::VideoMemory) + .set_pcf(pcf) + .set_frame_number(frame) + } + + /// Create an invalid PTE. + pub(crate) fn invalid() -> Self { + Self::default() + } + + /// Get the raw `u64` value. + pub(crate) fn raw_u64(&self) -> u64 { + self.0 + } +} + +// Page Directory Entry (PDE) for MMU v3. +// +// Note: v3 uses a unified 40-bit address field (v2 had separate sys/vid a= ddress fields). +bitfield! { + pub(crate) struct Pde(u64), "Page Directory Entry for MMU v3 (Hopper+)= " { + 0:0 is_pte as bool, "Entry is a PTE (0=3DPDE, 1=3Dlarge p= age PTE)"; + 2:1 aperture as u8 =3D> AperturePde, "Memory aperture (0=3D= invalid, 1=3Dvidmem, 2=3Dcoherent, 3=3Dnon-coherent)"; + 5:3 pcf as u8 =3D> PdePcf, "Page Classification Field = (3 bits for PDE)"; + 51:12 table_frame as u64 =3D> Pfn, "Table frame number (40-bit u= nified address)"; + } +} + +impl Pde { + /// Create a PDE from a `u64` value. + pub(crate) fn new(val: u64) -> Self { + Self(val) + } + + /// Create a valid PDE pointing to a page table in video memory. + pub(crate) fn new_vram(table_pfn: Pfn) -> Self { + Self::default() + .set_is_pte(false) + .set_aperture(AperturePde::VideoMemory) + .set_table_frame(table_pfn) + } + + /// Create an invalid PDE. + pub(crate) fn invalid() -> Self { + Self::default().set_aperture(AperturePde::Invalid) + } + + /// Check if this PDE is valid. + pub(crate) fn is_valid(&self) -> bool { + self.aperture() !=3D AperturePde::Invalid + } + + /// Get the VRAM address of the page table. + pub(crate) fn table_vram_address(&self) -> VramAddress { + debug_assert!( + self.aperture() =3D=3D AperturePde::VideoMemory, + "table_vram_address called on non-VRAM PDE (aperture: {:?})", + self.aperture() + ); + VramAddress::from(self.table_frame()) + } + + /// Get the raw `u64` value. + pub(crate) fn raw_u64(&self) -> u64 { + self.0 + } +} + +// Big Page Table pointer for Dual PDE - 64-bit lower word of the 128-bit = Dual PDE. +bitfield! { + pub(crate) struct DualPdeBig(u64), "Big Page Table pointer in Dual PDE= (MMU v3)" { + 0:0 is_pte as bool, "Entry is a PTE (for large pages)"; + 2:1 aperture as u8 =3D> AperturePde, "Memory aperture type"; + 5:3 pcf as u8 =3D> PdePcf, "Page Classification Field"; + 51:8 table_frame as u64, "Table frame (table address 256-byte a= ligned)"; + } +} + +impl DualPdeBig { + /// Create a big page table pointer from a `u64` value. + pub(crate) fn new(val: u64) -> Self { + Self(val) + } + + /// Create an invalid big page table pointer. + pub(crate) fn invalid() -> Self { + Self::default().set_aperture(AperturePde::Invalid) + } + + /// Create a valid big PDE pointing to a page table in video memory. + pub(crate) fn new_vram(table_addr: VramAddress) -> Result { + // Big page table addresses must be 256-byte aligned (shift 8). + if table_addr.raw_u64() & 0xFF !=3D 0 { + return Err(EINVAL); + } + + let table_frame =3D table_addr.raw_u64() >> 8; + Ok(Self::default() + .set_is_pte(false) + .set_aperture(AperturePde::VideoMemory) + .set_table_frame(table_frame)) + } + + /// Check if this big PDE is valid. + pub(crate) fn is_valid(&self) -> bool { + self.aperture() !=3D AperturePde::Invalid + } + + /// Get the VRAM address of the big page table. + pub(crate) fn table_vram_address(&self) -> VramAddress { + debug_assert!( + self.aperture() =3D=3D AperturePde::VideoMemory, + "table_vram_address called on non-VRAM DualPdeBig (aperture: {= :?})", + self.aperture() + ); + VramAddress::new(self.table_frame() << 8) + } + + /// Get the raw `u64` value. + pub(crate) fn raw_u64(&self) -> u64 { + self.0 + } +} + +/// Dual PDE at Level 4 for MMU v3 - 128-bit entry. +/// +/// Contains both big (64KB) and small (4KB) page table pointers: +/// - Lower 64 bits: Big Page Table pointer. +/// - Upper 64 bits: Small Page Table pointer. +/// +/// ## Note +/// +/// The big and small page table pointers have different address layouts: +/// - Big address =3D field value << 8 (256-byte alignment). +/// - Small address =3D field value << 12 (4KB alignment). +/// +/// This is why `DualPdeBig` is a separate type from `Pde`. +#[repr(C)] +#[derive(Debug, Clone, Copy, Default)] +pub(crate) struct DualPde { + /// Big Page Table pointer. + pub big: DualPdeBig, + /// Small Page Table pointer. + pub small: Pde, +} + +impl DualPde { + /// Create a dual PDE from raw 128-bit value (two `u64`s). + pub(crate) fn new(big: u64, small: u64) -> Self { + Self { + big: DualPdeBig::new(big), + small: Pde::new(small), + } + } + + /// Create a dual PDE with only the small page table pointer set. + pub(crate) fn new_small(table_pfn: Pfn) -> Self { + Self { + big: DualPdeBig::invalid(), + small: Pde::new_vram(table_pfn), + } + } + + /// Check if the small page table pointer is valid. + pub(crate) fn has_small(&self) -> bool { + self.small.is_valid() + } + + /// Check if the big page table pointer is valid. + pub(crate) fn has_big(&self) -> bool { + self.big.is_valid() + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012024.outbound.protection.outlook.com [52.101.48.24]) (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 DEF133314B8; Wed, 18 Feb 2026 21:21:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449693; cv=fail; b=lGtw3oYCqrHsmgDGvqVZYxE+ez8Aghk+3C0IJcWYgotDMFSewazvjpJBTotaZPixmG2J6BWz+fTcla+3PlININFmiM72sBpVAbUKdi3idigbdrlUQ7AyFAaWaiCI6ASGq0Byte7PZSQsFuxY0MWouz/vqezvqAPWZKHEaVw7uN0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449693; c=relaxed/simple; bh=OvUzK9fveqPSZTlKNhXp+JPMlZlh714SbqGs36108Lk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=nd2vzLbVSwfnaWI8u//aUSXP9YhmTex3hhCVHP8hRQHHOiHQ9XDGEfhlcwl+rIITxb4GCNTRG64KgcRjnHDnn7RbwjpaB2pjVwZSHOKwd562E2Y53uZIIOnW8HFyvREpR4fZ9NyAu+pAUXGaoMIqXdeRPc6XC3U+yFpV057BEoQ= 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=p4oHLtG6; arc=fail smtp.client-ip=52.101.48.24 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="p4oHLtG6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gdoUC4WYBq00NFJk+lsSqgDgwTfzd9ZV+9ACTVWyVQcYM1d1uXjeMnhQEGBJDudR2lrOUwoPqPU5duKsMXks+zH+tMuZYb5JE76uNlxT+BKk5nLioFzrNhy4YL1NNPjBhfoFP9Ql0M4ulTK1Zobq/P5MmCzYYd60jo0Tyru/sJOPDIkgDmYKSn7P5VL7Ipx0LpAByVlpH4cB7BWYXfCdGFsROvKONeKfngpOzQ+PTfD7cacd9IywGdTJ0Q2os/AhrSbnx1+lDgdQRKnQxinTElqwzcfhjpmXHQmwko3Xg4uaLu3EgNt9zENQ5AhT3kgyyrK4XjDDJQpDYfmT6QGwBQ== 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=WVC+3ygdCAkcbtgPbkYFPzRKVDybmbhfDH26d0Te9hA=; b=ZiuWKgw3eupcVdmT+WjZnddxB/YguBjv8K0ciz8JUVHZOYNknovi0nLJZoG508d7logIRq4UelZnlAnprG8TXBzXF2lE+wpSfh2a9IsOeGjp98zEldU9zzUUM2pQ7lsHpaHv0NZrBFYn4Iblt5YrZ7OWqb4gvKzv01ep6e2pokLAawabplhFJHhCht8PGcxNIjZaoN0kGMaXDfh9uL7rENKE+PrVNe7HPeC44yBzZKaCb3s24jvrCvCV8vUSeuozpjGr0CfVlvv0Okj8yJzsF3+WzQ/Y9fbMZnibX1zGKbJpW4jxUt01w8gx7V+CnMHdS5XcwDslaLyIZvnUO0H7pw== 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=WVC+3ygdCAkcbtgPbkYFPzRKVDybmbhfDH26d0Te9hA=; b=p4oHLtG6po/1BA4LULc+NClQA7+1Mu/lYV+foIsgY2B91TaJEHKggMlSYlnOxBbRTPe9RLLniCnEem/ny7nPYqSI0YOFYFFykK/3KPkFTQLKs46wp5J3Hach/sHVahzT2eqd7IUmPKFbmZNjGL6s+0+gqwTNEPHJ3ELxOdXu9gcgkyVlx7CjGTBpSbBdfQ5GU/pxo1aM5bs+YBWoaUTxkLQv7AYjbY1mEwbxAe39AnRfn9tbOXd+4xEp0cPlUGn3lp9wrWQrbJhANHqkVszsAueG6ZgYMx2ZL9Wb0jXcxMICWUYUqvs2AO/gs3YeXL24X+kq5c99R0wXsJ7Bgt+4Jg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:19 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:19 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 09/23] nova-core: mm: Add unified page table entry wrapper enums Date: Wed, 18 Feb 2026 16:20:06 -0500 Message-Id: <20260218212020.800836-10-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL1PR13CA0409.namprd13.prod.outlook.com (2603:10b6:208:2c2::24) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 1101504a-57dd-4d19-735d-08de6f33a839 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?fMcigjS1ZeXyYEWDdsagH9HIsIIiCHnbmoqEJNWbTCNjz8cmO3LB1FoTCzjx?= =?us-ascii?Q?cItKrtksRa/2BJwQSE78loW+lIojKAmhxPeGQgFJB2yoHcWfZOMLir6GJvjr?= =?us-ascii?Q?UmQWXQSWfgl3y+T+gkjV7JqNjpH47lF70SpFXW1/Sx+tz/XNx055dBkVMtOs?= =?us-ascii?Q?bvuIIKbzCZQjA2EXWr0N7Rer0EcubrrOBE+Wl8WCcPS0iIXBPpqFQVVx8yk4?= =?us-ascii?Q?7RwjPSdv22iBI1kEpprQ0ZNdx3QUplBXZjnFCfmT5rKIKcnsWoW3SOLq1TyQ?= =?us-ascii?Q?ddQWndmC1n7SaEKyynpbtsV8Ul8uuCd2KK9x05bGmgRqQzDew+GR2AMyo+yV?= =?us-ascii?Q?JxG4x1Ml865v7zsstniETATCAKJtAxDo3W5F1C5hmonnaPKdzW2uvkvG+h1O?= =?us-ascii?Q?VFsdlRl060+NP7wBjJW6q29ye469PhXvrQT5wms/cFWds35h/8ld2Rdiib2a?= =?us-ascii?Q?tPQxjNEOSFdHGBMm/uww9c+qF+f4qu+KwRBjsBplE8WNionIVMBbayeSsNKR?= =?us-ascii?Q?38n5mVevuFHdBXRuls3eyJ8hsAx6yjh4k02vfETb5RP6jzwEy8FwMYWj1+Am?= =?us-ascii?Q?Jzl71yIApBq35JXNcLDr+a6SpnV/NQDPuR47kITqEaKZn/2lxp4s18jS5LHQ?= =?us-ascii?Q?AApLT6fYvezxwj3uU46uK36J2HxLQGrl+z02p12H8wS7yNz2i9lYcp9oQhYJ?= =?us-ascii?Q?i0QWYpM+9LaPwD2AKUKxXCH8V8je5/+WFD5doCLfuseaxQQi9B8mcbLxKEWV?= =?us-ascii?Q?vejc4cSZEDeZ87OirCPXvz+IRWRL/gxEYCBBybNz3okT9tDMJgLiSuyNXdoD?= =?us-ascii?Q?FYJjkGqBDr408cK1Bk+zjwpX+FdgmOtqT18bmMvHO6KgvMnC4wqdg2vgaK8J?= =?us-ascii?Q?HhvgcAi6NlrB6va+GnThiPM3KjokfM7CDE33XaNpN0ceNkuuAYk1VE4fhMw5?= =?us-ascii?Q?3gS8zd2o66cg0gqsWOWRFucsj97Jj8FpV6TzJzD9mjEjwH/q6ZgcfW+a0eUQ?= =?us-ascii?Q?E+qfB7MWqalP5wMWSnI4GoFSSg1KxfjdHjr5wEgACKAIjk9r//7DH1TOpSWd?= =?us-ascii?Q?UMJIxbZb91YyGpojf9+Fd8b9bZgviquNsPYYalIm6HPZhS5Fzsk+PVU4aFmS?= =?us-ascii?Q?gZdkqMnOw0ZtqKU84ZQQWDucjV6l2AcgdX03hHCQ0V2U78fZ5E/HI7lLF06r?= =?us-ascii?Q?Vq32dxKsXzivwyNRHdw/mt790VkKZUcVsmo/h9WfvUUIE7f1TuDldSCixJ74?= =?us-ascii?Q?AVH+IWV3sEx2RvQIbpUhGA5hD5xiqrgQ7LmsJJQoSeoFk8gKV7HWmcWKK82h?= =?us-ascii?Q?dOmiWiIUrqc+Fd4ZO0buVkdbrTBXaU+5nFJlBY9IBlswqtjzB4eYtYMliJ4D?= =?us-ascii?Q?TLhKG70dQneBG2YPYtNDb0dqAj9+oB5XPRe23Ol2aDQnx33axorcXUTlWY22?= =?us-ascii?Q?u3tX2bLJ3i3Yaj8S2vE5aMlfeNOfm2Fvoe46iO3uS2afiHDJfR8gPOXV3Qyc?= =?us-ascii?Q?kUSIKjFwHkrqFw62SQ/W0T0PhFwbKoH+zYgX12r30eTMs7Z/HZSRJR6ClWxV?= =?us-ascii?Q?Q+67xaGho14+KIKm8GE=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?QfyW91IhlzyUXqpVyi3DuAXSq4/2q2KlfbSp3i/yqUoanSCeTDeJaXJ7sj8H?= =?us-ascii?Q?LEeD2LTEqTVWcD81txiDenfrxw/JNvHu3MgzyEiGrvhXihpJjuIx4U0lG3VN?= =?us-ascii?Q?0wTyPUt07nsQGvWJeD3chnZL4ImA6fDaFCWnpn8DB9H0P64KysHkl/3u4F7c?= =?us-ascii?Q?dj9znNQK1bD6eMsF19PUV08BqsYpkGGQ0N6iFKMrn4L9zosVHgrwnjAIjxzF?= =?us-ascii?Q?kwObcZuJUoBiPOGG9DV2FLWO7wqHV5IhlstU+Bz36VfSLiP20TUE5uk6F748?= =?us-ascii?Q?wL+3XWjQgtN2NQ+36gbPcnnEhTRCqVMSeXomedR4oAmKslLjUtfysID8thHS?= =?us-ascii?Q?rA2rk5PkkvWG7AZ1LBbJBW7em2vivLjOELdcnxR4hcyykEy7t9vZt7HkmOas?= =?us-ascii?Q?4EreJT1G/OLaJlNbSOYwFm6NdVp1AL90YAWu/kBEmIpcvREJv/1J91qVqMmt?= =?us-ascii?Q?1W0Y7hIWANmp88+lpTcfZO1IgseUfWsWJGDATTVsBmOlAJSuaWhnAeSuqjuG?= =?us-ascii?Q?Bq3y2IDcpspdfbxf+pFAyKm6vz+6nTlxDFyhudibWwt0o3N8PqnBznPRXAHV?= =?us-ascii?Q?GmXfdCcdn+EFOsleXGyzQF+Uf8a8pE+wEvgCMffzG4V4bFaMhZLv2A/UZJ7L?= =?us-ascii?Q?QabfwINtWysj/exrh+Sl5e1b6jGs7vegVvZRzzc1vZcrRRl3bfojR0OlmeOr?= =?us-ascii?Q?ZIg4dWfpAF6Y29xX8Fo8kt/kSjz79LKIuyNe6waEiYyygBOo4ERMOJzM75aM?= =?us-ascii?Q?Rfc9oR6H9Bcpo1gFV6VghJp7MXU7degwtJmpBlRxC6+wwZtdvl4fhg8gVWyy?= =?us-ascii?Q?DzNMDPjuM0nZrxBt0c+YFuCqtUBc0KC2ec9MoVBiGlE1x9GXCdZv4+Q/pdHt?= =?us-ascii?Q?lL0MFBRcFNBwW3aGc3iQUqHTbmD4woXCV5xLB0bkl/FCiX5htj5Z1LfeJQ2U?= =?us-ascii?Q?3riRJ+48kir0TEVSOK8qzPw7yyjpSzIsFVCtVjDz4dDDoxyT5+shuj7e0pVp?= =?us-ascii?Q?wFgWzlI6scscdEYMkPXxfMEW157HNWqndHWHTYY5vkxQKgzUfWO7rtlmMOMI?= =?us-ascii?Q?EwpRmwPX8MjzM/E2VWULU/mwgt6lzdorjUUOK0CkVNDhnvo4Y0qiPrUi5h7m?= =?us-ascii?Q?OnHl7gEE8wFmGgz+ICSWa94BtCRFV3xUyrkgAUpMG3m7F2ER8YL1VxqMvIkO?= =?us-ascii?Q?06B7qtrnhdcBrpj/lcH104sexdnjMFAjqghSKMGqs/4bT38m9IRHdmi2IBxj?= =?us-ascii?Q?tGdyVEvrGrWBTp3q7R0/3Cjq+/jl1jJTHXCHAwlW0hAypphh53ZFTuaf0LeN?= =?us-ascii?Q?eoz+oH4kNSw/89LvANlLsts9dg1QdQZpSm8zmdtZRfsyZMX7sXQU5EnSPjUo?= =?us-ascii?Q?bOBmv5UICN8/9uQI0GD+68IA2EL84TZOSVFHPWRnXf4cyLwlMPDZOBqe9wg9?= =?us-ascii?Q?WAgCu2iD+9VKFLV8VsetakFMWXJasgJxqkYIlCiN3cka9e/xNjjwN2fa8KXR?= =?us-ascii?Q?R4IguO9BJVnVHoNbIo/bQaRrzFdQ3WV4Vi8e3VIq07qMsmW2VEmB2dHr5vs8?= =?us-ascii?Q?a8KxNtHsCK/hkFfLGMC10pZ01Zpw94YvuQQmpuiu8izkK6bgRq5wXE6dLjQ9?= =?us-ascii?Q?bEbmE8nWPNGI/XL6d15W4jdjx6GKJvkwLV32YjhUQUI8rRdexCy6HmL6Fyht?= =?us-ascii?Q?kCvyf1+U033P7XaMfswJrtyygHwPWy3BSd6ApeAP+RITh5iAuZYyeE+crrOE?= =?us-ascii?Q?z7N/JqW+NQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1101504a-57dd-4d19-735d-08de6f33a839 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:19.2659 (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: fwrWwvNWsDL1aBFFxEJgaj9yBcYSuDdoJHavpqCaHSyY+xho8gjxGTjAUjEwRrRHyMg4KlU0O2HYQx3/x5ROTg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add unified Pte, Pde, and DualPde wrapper enums that abstract over MMU v2 and v3 page table entry formats. These enums allow the page table walker and VMM to work with both MMU versions. Each unified type: - Takes MmuVersion parameter in constructors - Wraps both ver2 and ver3 variants - Delegates method calls to the appropriate variant This enables version-agnostic page table operations while keeping version-specific implementation details encapsulated in the ver2 and ver3 modules. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/pagetable/mod.rs | 327 ++++++++++++++++++++++ 1 file changed, 327 insertions(+) diff --git a/drivers/gpu/nova-core/mm/pagetable/mod.rs b/drivers/gpu/nova-c= ore/mm/pagetable/mod.rs index 5263a8f56529..1f783261a30f 100644 --- a/drivers/gpu/nova-core/mm/pagetable/mod.rs +++ b/drivers/gpu/nova-core/mm/pagetable/mod.rs @@ -10,6 +10,14 @@ pub(crate) mod ver2; pub(crate) mod ver3; =20 +use kernel::prelude::*; + +use super::{ + pramin, + Pfn, + VramAddress, + PAGE_SIZE, // +}; use crate::gpu::Architecture; =20 /// MMU version enumeration. @@ -77,6 +85,76 @@ pub(crate) const fn as_index(&self) -> u64 { } } =20 +impl MmuVersion { + /// Get the `PDE` levels (excluding PTE level) for page table walking. + pub(crate) fn pde_levels(&self) -> &'static [PageTableLevel] { + match self { + Self::V2 =3D> ver2::PDE_LEVELS, + Self::V3 =3D> ver3::PDE_LEVELS, + } + } + + /// Get the PTE level for this MMU version. + pub(crate) fn pte_level(&self) -> PageTableLevel { + match self { + Self::V2 =3D> ver2::PTE_LEVEL, + Self::V3 =3D> ver3::PTE_LEVEL, + } + } + + /// Get the dual PDE level (128-bit entries) for this MMU version. + pub(crate) fn dual_pde_level(&self) -> PageTableLevel { + match self { + Self::V2 =3D> ver2::DUAL_PDE_LEVEL, + Self::V3 =3D> ver3::DUAL_PDE_LEVEL, + } + } + + /// Get the number of PDE levels for this MMU version. + pub(crate) fn pde_level_count(&self) -> usize { + self.pde_levels().len() + } + + /// Get the entry size in bytes for a given level. + pub(crate) fn entry_size(&self, level: PageTableLevel) -> usize { + if level =3D=3D self.dual_pde_level() { + 16 // 128-bit dual PDE + } else { + 8 // 64-bit PDE/PTE + } + } + + /// Get the number of entries per page table page for a given level. + pub(crate) fn entries_per_page(&self, level: PageTableLevel) -> usize { + PAGE_SIZE / self.entry_size(level) + } + + /// Compute upper bound on page table pages needed for `num_virt_pages= `. + /// + /// Walks from PTE level up through PDE levels, accumulating the tree. + pub(crate) fn pt_pages_upper_bound(&self, num_virt_pages: usize) -> us= ize { + let mut total =3D 0; + + // PTE pages at the leaf level. + let pte_epp =3D self.entries_per_page(self.pte_level()); + // Ceiling of (num_virt_pages / entries_per_page). + let mut pages_at_level =3D (num_virt_pages + pte_epp - 1) / pte_ep= p; + total +=3D pages_at_level; + + // Walk PDE levels bottom-up (reverse of pde_levels()). + for &level in self.pde_levels().iter().rev() { + let epp =3D self.entries_per_page(level); + // How many pages at this level do we need to point to + // the previous pages_at_level? + // Calculated as ceiling of (pages_at_level / entries_per_page= ). + pages_at_level =3D (pages_at_level + epp - 1) / epp; + total +=3D pages_at_level; + } + + total + } +} + /// Memory aperture for Page Table Entries (`PTE`s). /// /// Determines which memory region the `PTE` points to. @@ -149,3 +227,252 @@ fn from(val: AperturePde) -> Self { val as u8 } } + +/// Unified Page Table Entry wrapper for both MMU v2 and v3 `PTE` +/// types, allowing the walker to work with either format. +#[derive(Debug, Clone, Copy)] +pub(crate) enum Pte { + /// MMU v2 `PTE` (Turing/Ampere/Ada). + V2(ver2::Pte), + /// MMU v3 `PTE` (Hopper+). + V3(ver3::Pte), +} + +impl Pte { + /// Create a `PTE` from a raw `u64` value for the given MMU version. + pub(crate) fn new(version: MmuVersion, val: u64) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::Pte::new(val)), + MmuVersion::V3 =3D> Self::V3(ver3::Pte::new(val)), + } + } + + /// Create an invalid `PTE` for the given MMU version. + pub(crate) fn invalid(version: MmuVersion) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::Pte::invalid()), + MmuVersion::V3 =3D> Self::V3(ver3::Pte::invalid()), + } + } + + /// Create a valid `PTE` for video memory. + pub(crate) fn new_vram(version: MmuVersion, pfn: Pfn, writable: bool) = -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::Pte::new_vram(pfn, writable= )), + MmuVersion::V3 =3D> Self::V3(ver3::Pte::new_vram(pfn, writable= )), + } + } + + /// Check if this `PTE` is valid. + pub(crate) fn is_valid(&self) -> bool { + match self { + Self::V2(p) =3D> p.valid(), + Self::V3(p) =3D> p.valid(), + } + } + + /// Get the physical frame number. + pub(crate) fn frame_number(&self) -> Pfn { + match self { + Self::V2(p) =3D> p.frame_number(), + Self::V3(p) =3D> p.frame_number(), + } + } + + /// Get the raw `u64` value. + pub(crate) fn raw_u64(&self) -> u64 { + match self { + Self::V2(p) =3D> p.raw_u64(), + Self::V3(p) =3D> p.raw_u64(), + } + } + + /// Read a `PTE` from VRAM. + pub(crate) fn read( + window: &mut pramin::PraminWindow<'_>, + addr: VramAddress, + mmu_version: MmuVersion, + ) -> Result { + let val =3D window.try_read64(addr.raw())?; + Ok(Self::new(mmu_version, val)) + } + + /// Write this `PTE` to VRAM. + pub(crate) fn write( + &self, + window: &mut pramin::PraminWindow<'_>, + addr: VramAddress, + ) -> Result { + window.try_write64(addr.raw(), self.raw_u64()) + } +} + +impl Default for Pte { + fn default() -> Self { + Self::V2(ver2::Pte::default()) + } +} + +/// Unified Page Directory Entry wrapper for both MMU v2 and v3 `PDE`. +#[derive(Debug, Clone, Copy)] +pub(crate) enum Pde { + /// MMU v2 `PDE` (Turing/Ampere/Ada). + V2(ver2::Pde), + /// MMU v3 `PDE` (Hopper+). + V3(ver3::Pde), +} + +impl Pde { + /// Create a `PDE` from a raw `u64` value for the given MMU version. + pub(crate) fn new(version: MmuVersion, val: u64) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::Pde::new(val)), + MmuVersion::V3 =3D> Self::V3(ver3::Pde::new(val)), + } + } + + /// Create a valid `PDE` pointing to a page table in video memory. + pub(crate) fn new_vram(version: MmuVersion, table_pfn: Pfn) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::Pde::new_vram(table_pfn)), + MmuVersion::V3 =3D> Self::V3(ver3::Pde::new_vram(table_pfn)), + } + } + + /// Create an invalid `PDE` for the given MMU version. + pub(crate) fn invalid(version: MmuVersion) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::Pde::invalid()), + MmuVersion::V3 =3D> Self::V3(ver3::Pde::invalid()), + } + } + + /// Check if this `PDE` is valid. + pub(crate) fn is_valid(&self) -> bool { + match self { + Self::V2(p) =3D> p.is_valid(), + Self::V3(p) =3D> p.is_valid(), + } + } + + /// Get the VRAM address of the page table. + pub(crate) fn table_vram_address(&self) -> VramAddress { + match self { + Self::V2(p) =3D> p.table_vram_address(), + Self::V3(p) =3D> p.table_vram_address(), + } + } + + /// Get the raw `u64` value. + pub(crate) fn raw_u64(&self) -> u64 { + match self { + Self::V2(p) =3D> p.raw_u64(), + Self::V3(p) =3D> p.raw_u64(), + } + } + + /// Read a `PDE` from VRAM. + pub(crate) fn read( + window: &mut pramin::PraminWindow<'_>, + addr: VramAddress, + mmu_version: MmuVersion, + ) -> Result { + let val =3D window.try_read64(addr.raw())?; + Ok(Self::new(mmu_version, val)) + } + + /// Write this `PDE` to VRAM. + pub(crate) fn write( + &self, + window: &mut pramin::PraminWindow<'_>, + addr: VramAddress, + ) -> Result { + window.try_write64(addr.raw(), self.raw_u64()) + } +} + +impl Default for Pde { + fn default() -> Self { + Self::V2(ver2::Pde::default()) + } +} + +/// Unified Dual Page Directory Entry wrapper for both MMU v2 and v3 [`Dua= lPde`]. +#[derive(Debug, Clone, Copy)] +pub(crate) enum DualPde { + /// MMU v2 [`DualPde`] (Turing/Ampere/Ada). + V2(ver2::DualPde), + /// MMU v3 [`DualPde`] (Hopper+). + V3(ver3::DualPde), +} + +impl DualPde { + /// Create a [`DualPde`] from raw 128-bit value (two `u64`s) for the g= iven MMU version. + pub(crate) fn new(version: MmuVersion, big: u64, small: u64) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::DualPde::new(big, small)), + MmuVersion::V3 =3D> Self::V3(ver3::DualPde::new(big, small)), + } + } + + /// Create a [`DualPde`] with only the small page table pointer set. + pub(crate) fn new_small(version: MmuVersion, table_pfn: Pfn) -> Self { + match version { + MmuVersion::V2 =3D> Self::V2(ver2::DualPde::new_small(table_pf= n)), + MmuVersion::V3 =3D> Self::V3(ver3::DualPde::new_small(table_pf= n)), + } + } + + /// Check if the small page table pointer is valid. + pub(crate) fn has_small(&self) -> bool { + match self { + Self::V2(d) =3D> d.has_small(), + Self::V3(d) =3D> d.has_small(), + } + } + + /// Get the small page table VRAM address. + pub(crate) fn small_vram_address(&self) -> VramAddress { + match self { + Self::V2(d) =3D> d.small.table_vram_address(), + Self::V3(d) =3D> d.small.table_vram_address(), + } + } + + /// Get the raw `u64` value of the big PDE. + pub(crate) fn big_raw_u64(&self) -> u64 { + match self { + Self::V2(d) =3D> d.big.raw_u64(), + Self::V3(d) =3D> d.big.raw_u64(), + } + } + + /// Get the raw `u64` value of the small PDE. + pub(crate) fn small_raw_u64(&self) -> u64 { + match self { + Self::V2(d) =3D> d.small.raw_u64(), + Self::V3(d) =3D> d.small.raw_u64(), + } + } + + /// Read a dual PDE (128-bit) from VRAM. + pub(crate) fn read( + window: &mut pramin::PraminWindow<'_>, + addr: VramAddress, + mmu_version: MmuVersion, + ) -> Result { + let lo =3D window.try_read64(addr.raw())?; + let hi =3D window.try_read64(addr.raw() + 8)?; + Ok(Self::new(mmu_version, lo, hi)) + } + + /// Write this dual PDE (128-bit) to VRAM. + pub(crate) fn write( + &self, + window: &mut pramin::PraminWindow<'_>, + addr: VramAddress, + ) -> Result { + window.try_write64(addr.raw(), self.big_raw_u64())?; + window.try_write64(addr.raw() + 8, self.small_raw_u64()) + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 1716F333453; Wed, 18 Feb 2026 21:21:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449692; cv=fail; b=PAdChYO5PBSif0xKzwtDnwZzRpQLC3F4prOJJD6GfD4AtzB36Wakb/7LWb5UnA3MCGkkmdd9IWjNY9PF5/rhKHCZLwSIrUz/KlQojwV4kBDVJSD2Ale1g4MWXqoylTzub2C6Yfqgxwc2SvSMX9v1L71fxtnFlHQhjzUF5QUBD0U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449692; c=relaxed/simple; bh=Bplz5g1/3AuNNm8c822OJvmelt86kW4QGevA7YW1cXo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=S5mb6QHafFSKNjYscy9gWSnEGSKhg9dCqUSCPg4hqWeDIOuLcC2z2GdYtZmQaENHS5cLBqGrG30Uv20Cy6Y3B8Ve2X3z197oKswfW7xBxZukBebt4s1I8+kX2IuqfY9NaXS77GnhotM6hj643o9JW01TvJLhiEC6u2us9qeHcY4= 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=Z+1z0E9h; arc=fail smtp.client-ip=40.93.196.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="Z+1z0E9h" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Lm9zWkw5nKfyDehwyNqUptjK+x6o+7J50bfKIpjaFqd7kar/d1CbjZFQWV243JoCm+xaIZOiUeKqlrtxlJ90jg4Tdl/PPaYONeAjKq3hTdxFMtWU61u8EjF/AzSn07ohGuobYvUVBc/3m1QsHD558QFh5WtFnCJipCwL0QNgf5caLY7wgUeMGqUM9XmUY3tIllQafwpE/SuU547bwHgn882jgppDx0vFsC9s4yjTR0Ez6+OJwy83AkIloseHPRSN03M8z8XOc+/vHLKT3f0Ja+Z/BXOQP2UwSboY9/Kv1h46dNnf9gD38sVnYXoE/xQoicZt2mm7elGbt1DL4GF+nQ== 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=F3kncOcQpD92IiZPyG98LLINEN1ssI9ZcSDi/UEFtQs=; b=yL44sVP3OaRFe0gbByJDWlgummaHhHhG8Rorly9jjeYO/I5auD4OmBX0fd00JaaVIrfyWBeXAy0V7X/w1Wyk8UUEkDSKghK7csEFColopGUg6VXpTXHa5hKBIZFDGnJRZmkX22U82gLxwyVBzLdFeZX6Q5NoPa7LXvAK9FD2fWwtZSz0D8VzktXpnNxvmqAZnri+oJdnZN3EC7SM8x8urIyxpOS39XthcH3gUNh46BKbr8xK9GHqeAO2JRCcnUJqobMCIY8W7fuXeW1w6MTuwH2mlcPOkZvmk+LhV/UF6jcx8p/08NvsKjrTWJ5nWRUrazFtOj/v/0F7D+BcYe9ntQ== 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=F3kncOcQpD92IiZPyG98LLINEN1ssI9ZcSDi/UEFtQs=; b=Z+1z0E9hvEmVsFEpH/4ZuykOzGnyC2yTKO83WqKUv48I3g9d04LXqf0EiOsUIrdeqcjTztHGFCtCPjgdns6l68xJ39L2Ue3hgtEAT+cclIzMTHK7rpCJ2Lz+gjywMEz4wtg8l06GNC66cc+PiFKKkMUWmbqewBmeF51NEgV27WJ4zoMzco7xzWvXBi8u2T4jQyRc7CPHOqar3QnWlYks0sgwV9kUS75p0roPK0G/8dCUOa2OFbev01Y/o3vlyZMYdRtDS/RHKs9uNq/E6EXoDWZAw1H+aIbVbMJBUlmeS7RGQm08jWlgDJgp/y0CiZ0r/n1hfbAwsAk6H8wBs/uDGg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:21 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:21 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 10/23] nova-core: mm: Add TLB flush support Date: Wed, 18 Feb 2026 16:20:07 -0500 Message-Id: <20260218212020.800836-11-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN0P221CA0002.NAMP221.PROD.OUTLOOK.COM (2603:10b6:208:52a::26) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 179fc581-440a-4f47-9a6d-08de6f33a96b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?DCIdncn2iLJ3kC3viV+LtHRkjiUaXmN9WqjZ3MT7rAAx4qt42iVPBLI0YyPE?= =?us-ascii?Q?8vj9ntfNxNk3sMMf9xKPt8JI/VU88WmOMcbBlGmrYM4tMWuudtwOmWcr9RWH?= =?us-ascii?Q?6aKFEhIvOoGnwnpDjNANk6xpVRavX6IDlIAAu1pymHkGzcUoarzdL4lVXkEh?= =?us-ascii?Q?MpBysc7eXFFX/t0Kn+//+gmwE3aj0FUF6khpjupXcAOXxVqe3OLLmXK5aVAH?= =?us-ascii?Q?Vi9Vh8L+BDu4WrCXZCaNq8CcVVkdY7O6obuFStz6JCPHDhM1XK8wG9gjM99v?= =?us-ascii?Q?TLwfnwM0NipVu0HV6Jv2/Thh0OoB43OQXox/IA5Sy7+YXRku4bIR7zhLM/yO?= =?us-ascii?Q?zAqEP6TEdrsWESoYKL2Ig9MYxU00P2b/CSSxJlK3q1QfIparl+zzOdYHt978?= =?us-ascii?Q?N1b97jf4eT7iiZI77aPUTwh05GovdPfGJ1FEsQVFhvMrRlUw/bB0J/rlNPmi?= =?us-ascii?Q?EbJXqB4D5n90F+/3v27VYTBv3XuQ/IiBR12eSXYg7b3MSy4T/ujcIxw6SV59?= =?us-ascii?Q?D/MA24ydb7Q3yxMRW+Qj8oQ6OoIxqVgmLgnBe5HAkAnG+OpvdrsMLev1xnyF?= =?us-ascii?Q?QTMzfrjlkWBD5hYJk9NJAy03TJqwhW+Trvo1PdWrdnda9dWir+oqGqECRuPg?= =?us-ascii?Q?HHEVhj3nO/W23Yz4jpw5UBLDlmB8RVMrAKDRQJZfB4RJupdBDZlk9sAS2Ngo?= =?us-ascii?Q?rWHOhnz7diWpbHF8xxO1FGUwVlA09QxrYAZ4U1ucZ9S66lx4nOrNrsyQaFrr?= =?us-ascii?Q?8n4YCnpcsCnSS+NzFT3RwQYELmCP3URzm/+hLcywBEXdX9imdUd8AkWiCzS0?= =?us-ascii?Q?ez+BhqBJySrEaG/6s2Iwx6WYywHGov650NiTP3697ESrk/Yd33TBp7K0tklm?= =?us-ascii?Q?opYQI4uQp6ib6zHll7ZSSs1V6TsoyoPxSJUCG3Ixd4uKzEDcYNQzhECIeEdB?= =?us-ascii?Q?RMzDOvgLUWg3mUmU9q9PbvzmXk5Day/R9TAVCIBry7SKar1Xt0m2RRm+7VFr?= =?us-ascii?Q?2PLTUXq3d15OaHU0pbjVJU5JkDqvfIIyqSWoyuYUhFY9NglH6C3/EOYH0HXi?= =?us-ascii?Q?LKnrAni+GvG9rLqec5EI23UwHWGgaYFhTxcT1SNMLb498qZ/pgyVPVxnS3pK?= =?us-ascii?Q?+oZsB17I/850KBSSaRz/e++aPNZTTmiii3hfnWzPWLaLCUAMLTF+0wdTJh3S?= =?us-ascii?Q?9X+lPwny5WNCuWasHfN8qcq630BqOmZowJ5a5dKVMJDrfqTIT9t4stRCidgD?= =?us-ascii?Q?AZ7C0MOMPCcYCVEfbpy81OfwT5APUxAVU9l1Bv7vJL7578HMN1kYNoaPRT6J?= =?us-ascii?Q?TJAIjM4qpOQAWJzmSfd62tpKzPDBzKCmcWIS/gq3Cx8S39fOR6gtQ4C84pRU?= =?us-ascii?Q?aa4XH9otJOSnTpyOnclFWmULMJwhHpuZqGiYlayKIhcfwgt6BkqLBQS1i7WQ?= =?us-ascii?Q?wnVhPd68Q4oBj7zs5MkZDPlFS2SWpKlG3mOylX+2uGnBvO4iOAilbwMLPnVd?= =?us-ascii?Q?YlcbxAgzSumftzovQVFDVf8aiFv8ullZhdzv1UW2xRkd0TlqEAQfHWbb4bn3?= =?us-ascii?Q?6xraB8bKPKiRkCvMu/o=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?20cHxl35fiwHUbP5n07ArgeGN1zPDYmjIHkKt6oDa0U9PNsTP72IP0+FXtSl?= =?us-ascii?Q?vifazNMB2i+KdObzd8y39MQZ+eqTenXxx+pQ2UjOoKaPN2xHTRRCyqcg20Z6?= =?us-ascii?Q?5DafGmiBjfG4pLZH2kaimBmvYDNUUw5pTh1WS5oiYinxZg/8EoVoQsUFUIZD?= =?us-ascii?Q?FKM8JCxZ3W+6B4N8UUUXSW0n0JviESYAvAIbbMD4f9Q+B6Fh/fzDIIkNPRem?= =?us-ascii?Q?k0iD0fNqD1SFJZOEBI1wpkxduey/Hpp1wqVUUMrIecRBZRag0+n74XkR9LzQ?= =?us-ascii?Q?XfmjD0Qc5frNU2vx97POVIqpsZhEGflukTjkWoRO4yKkc7Sy3chNoeUxZ5iE?= =?us-ascii?Q?UvOsEeidK/Q49dkFIPchrSMejCm2ehVT/u3BxcL4aZgsJqXDs5RAwsomsy54?= =?us-ascii?Q?YqUSehz3Vk6eJw6G7NF7CYWCnbD6GcIKuND6tWI8/se3mfXgVeT6mpuUy6X2?= =?us-ascii?Q?oE3A8uS6rAP6zcUYs6Kdj8HPCfp5eUjvF88wgpBjvinfxrG3PnlcAhMcu9f6?= =?us-ascii?Q?RPvWgMqvtZ+gsVkenubqOJpTCOlarbr+0rawblhjZSwVqYpRnS1oo/2jgVxx?= =?us-ascii?Q?rNv7PpVXKksvfv1HCV0/RgisfEY+bvh8wWjc/OA3HvQwPmFIBSqAi1btG4Nz?= =?us-ascii?Q?WKf5emwhiThxb9c9PiOlraN3kkeIOOt6ImZwQ6sexEPC8zPb47c1zGZa9TJn?= =?us-ascii?Q?/piw7ZD80SsV6bOLZep5bP0F4+BTzYZn/GxSAXFCp66zHA0BjlmbgMQlj7kA?= =?us-ascii?Q?ng4MdPX2TviRWwsuAV93KQ0jlp/iofcyOmxzv9keQlZwq3rNF/6qQO9SD5Xj?= =?us-ascii?Q?7LGnVEPiCZ95uLI7RHs40SdhlSMhNkuZ1mSBrEMkzg1KVseziw3UBAvQQNoa?= =?us-ascii?Q?ofs4lZEJnOjqYKAhLZZXdD2uDr30d0yVttpZ3TnEoLgpkWApBsrAsnRGdgwu?= =?us-ascii?Q?XNpe+euvvWzai8hAdm5QQvp2ve+7W/IVVSRH81tjV6Gqt7PLVZqKdhM+pQ7Y?= =?us-ascii?Q?OWD9UTlKsnBnumthCpTf5p0LNXRcwJQ/YNun95aN2brkAtiWiJj7+3YcSLUH?= =?us-ascii?Q?6fb9+YIH26wSAVNZEJzY9chOu5WxLOCUS5JThkh/fy1VJbbg/hgFAnZO0ubL?= =?us-ascii?Q?wO3+3pmVx5mLwLl2nyVD0OebrV3mbV/Vh825zXZMFZEqtb+LEmi5BmzVwSBK?= =?us-ascii?Q?hTzWRd9oknjkB7g8791ogRZzmnpWJj4kehoiY41PqeSbsMWkhmYwbH+EYo0p?= =?us-ascii?Q?yv+61aPR1s9NkgijekSC/S7I5CJc2o40xhcMPgEndslBul5rlYHniaaj+zaA?= =?us-ascii?Q?xMUHJwy6jJW8W2aMj0lDaxKie+uEooero0NvI+sgecCdTk5jc3DsyWiB4fTG?= =?us-ascii?Q?moafXQM6tQ0La0jJBTOysSUefu0y+hL8bK3yvBlIYF3VhaQwCCyHFBY6H+gg?= =?us-ascii?Q?aaAJ6RUwr3HcuDETMbV0OKQ4hph7MJNlqEJNOxDLORWpyxSv6orBAH8qiBwv?= =?us-ascii?Q?1EewdBCnQSsAZa29T1UU4cFBg2l4lYtemDZNqfT4h0rHMIiwr10xY2jK9p0S?= =?us-ascii?Q?fzRbFkvLjS8uWTftl41toTguoze/IFKXFeY1lBvkAJ+v1I0SQh0kvGx8T7LO?= =?us-ascii?Q?AvP1xQqG3bFW/DtrDsbWL2yVamrseQFIPGVbjpUYJcO3fkG4k8SeMJwr/eSA?= =?us-ascii?Q?qrWINKdEv6wzVMP1Di+5/TNWWcISrLtZLkS1HPNh274oG3R8HVWEBeWFCD+a?= =?us-ascii?Q?RNDT1tKbcQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 179fc581-440a-4f47-9a6d-08de6f33a96b X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:21.6910 (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: zPPOt1qMpdTnu568EfGLffTtcBcVxewSfXxQhOa9UdZNorty4i4XMtU45ee804dmSt6b9rMEHqna0prcGCXCiA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add TLB (Translation Lookaside Buffer) flush support for GPU MMU. After modifying page table entries, the GPU's TLB must be invalidated to ensure the new mappings take effect. The Tlb struct provides flush functionality through BAR0 registers. The flush operation writes the page directory base address and triggers an invalidation, polling for completion with a 2 second timeout matching the Nouveau driver. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/mod.rs | 1 + drivers/gpu/nova-core/mm/tlb.rs | 92 +++++++++++++++++++++++++++++++++ drivers/gpu/nova-core/regs.rs | 33 ++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/tlb.rs diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs index c88b7b7b6975..eafd56964b1b 100644 --- a/drivers/gpu/nova-core/mm/mod.rs +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -6,6 +6,7 @@ =20 pub(crate) mod pagetable; pub(crate) mod pramin; +pub(crate) mod tlb; =20 use kernel::sizes::SZ_4K; =20 diff --git a/drivers/gpu/nova-core/mm/tlb.rs b/drivers/gpu/nova-core/mm/tlb= .rs new file mode 100644 index 000000000000..466c7731323e --- /dev/null +++ b/drivers/gpu/nova-core/mm/tlb.rs @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! TLB (Translation Lookaside Buffer) flush support for GPU MMU. +//! +//! After modifying page table entries, the GPU's TLB must be flushed to +//! ensure the new mappings take effect. This module provides TLB flush +//! functionality for virtual memory managers. +//! +//! # Example +//! +//! ```ignore +//! use crate::mm::tlb::Tlb; +//! +//! fn page_table_update(tlb: &Tlb, pdb_addr: VramAddress) -> Result<()> { +//! // ... modify page tables ... +//! +//! // Flush TLB to make changes visible (polls for completion). +//! tlb.flush(pdb_addr)?; +//! +//! Ok(()) +//! } +//! ``` + +#![allow(dead_code)] + +use kernel::{ + devres::Devres, + io::poll::read_poll_timeout, + new_mutex, + prelude::*, + sync::{Arc, Mutex}, + time::Delta, // +}; + +use crate::{ + driver::Bar0, + mm::VramAddress, + regs, // +}; + +/// TLB manager for GPU translation buffer operations. +#[pin_data] +pub(crate) struct Tlb { + bar: Arc>, + /// TLB flush serialization lock: This lock is acquired during the + /// DMA fence signalling critical path. It must NEVER be held across a= ny + /// reclaimable CPU memory allocations because the memory reclaim path= can + /// call `dma_fence_wait()`, which would deadlock with this lock held. + #[pin] + lock: Mutex<()>, +} + +impl Tlb { + /// Create a new TLB manager. + pub(super) fn new(bar: Arc>) -> impl PinInit { + pin_init!(Self { + bar, + lock <- new_mutex!((), "tlb_flush"), + }) + } + + /// Flush the GPU TLB for a specific page directory base. + /// + /// This invalidates all TLB entries associated with the given PDB add= ress. + /// Must be called after modifying page table entries to ensure the GP= U sees + /// the updated mappings. + pub(crate) fn flush(&self, pdb_addr: VramAddress) -> Result { + let _guard =3D self.lock.lock(); + + let bar =3D self.bar.try_access().ok_or(ENODEV)?; + + // Write PDB address. + regs::NV_TLB_FLUSH_PDB_LO::from_pdb_addr(pdb_addr.raw_u64()).write= (&*bar); + regs::NV_TLB_FLUSH_PDB_HI::from_pdb_addr(pdb_addr.raw_u64()).write= (&*bar); + + // Trigger flush: invalidate all pages and enable. + regs::NV_TLB_FLUSH_CTRL::default() + .set_page_all(true) + .set_enable(true) + .write(&*bar); + + // Poll for completion - enable bit clears when flush is done. + read_poll_timeout( + || Ok(regs::NV_TLB_FLUSH_CTRL::read(&*bar)), + |ctrl| !ctrl.enable(), + Delta::ZERO, + Delta::from_secs(2), + )?; + + Ok(()) + } +} diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index d0982e346f74..c948f961f307 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -454,3 +454,36 @@ pub(crate) mod ga100 { 0:0 display_disabled as bool; }); } + +// MMU TLB + +register!(NV_TLB_FLUSH_PDB_LO @ 0x00b830a0, "TLB flush register: PDB addre= ss bits [39:8]" { + 31:0 pdb_lo as u32, "PDB address bits [39:8]"; +}); + +impl NV_TLB_FLUSH_PDB_LO { + /// Create a register value from a PDB address. + /// + /// Extracts bits [39:8] of the address and shifts it right by 8 bits. + pub(crate) fn from_pdb_addr(addr: u64) -> Self { + Self::default().set_pdb_lo(((addr >> 8) & 0xFFFF_FFFF) as u32) + } +} + +register!(NV_TLB_FLUSH_PDB_HI @ 0x00b830a4, "TLB flush register: PDB addre= ss bits [47:40]" { + 7:0 pdb_hi as u8, "PDB address bits [47:40]"; +}); + +impl NV_TLB_FLUSH_PDB_HI { + /// Create a register value from a PDB address. + /// + /// Extracts bits [47:40] of the address and shifts it right by 40 bit= s. + pub(crate) fn from_pdb_addr(addr: u64) -> Self { + Self::default().set_pdb_hi(((addr >> 40) & 0xFF) as u8) + } +} + +register!(NV_TLB_FLUSH_CTRL @ 0x00b830b0, "TLB flush control register" { + 0:0 page_all as bool, "Invalidate all pages"; + 31:31 enable as bool, "Enable/trigger flush (clears when flush compl= etes)"; +}); --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 D2E76334C3D; Wed, 18 Feb 2026 21:21:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449694; cv=fail; b=r3s5d3tCYNtVyD0JAUJovWI2dpOc7UL1/XUxmOjBGE8wnjZQnbM1Gwck9rMq+uJcFBVBRl/3vcGhde/zG53Aa6yoCqBqhxlcNlh9LX3/42d23tWy/x5yBt/9+Vg6OmLBd3F11ooxx86oydjcudh9Rt2dilZmMSvP3jAzGOjzzrk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449694; c=relaxed/simple; bh=9gYOGnqZMFLBOs0ZlH65wSPCBMY8/ZPlrcT1kUbRRk0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=q0oYiewgVaH2cna/TFa4uwD7pN7NsCc5obLDwpFeUX2Z2d0cSaG8v1KZqIssubHu5Sa7C1BUDGNrxfQgFtWB7X2j98yJWfq+F3FR+bSziJwEXIvPzheP7LYIRFn/k6L0GeSJiuOm6tWbM7uCp2wZ+YFS+hxqIKft9qz5hlhppPM= 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=Wo+I71ex; arc=fail smtp.client-ip=40.93.196.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="Wo+I71ex" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K2nm0NnkA1/y/I2p0LelgJsswPd9wt5Couk77QTeNsLUFdB8aNeoLgGFQVntnn3gIC0nIzhuUX1hWZsqhJfXe60PNXLXbIsFlq/6TEK/OErT003MPxPB2QpE48CXxDGfoYk93ZN43j/fMywBHxaDUhTpfP9tXCqUXpdY5PWhkr9Od33I5k65eVwoqKKb9QfFx4wmQ8ftsA3d3/6I1/23Q9l5rnMhdp+3YbWPqHQDLyHab9OrKvd75IrkzpNGFzCXILUI8QgauyV4TYrWrs6YLStnvKEXwTAmACuvJMt5jPqGZz2K2Lt3fNAO2VC5pSopWaiSvdAqElzuoC7dhoMF+w== 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=dg5EMgWYo0DHB/uO+FhKSLFh/5BwlURcswAEZZ2IK88=; b=tTh6EJ09KZXC4p1GuFciP3vebES+6jtf1Yy2CIYpZt2LGU4047nmKKtfrA3p7HRSgtfR3CE3sCIiVNzt9avkfaexwVD+H4SfKyRaLqcIGgfAwRck4G+6X5aokEknUbMMzQUlhOQaO8qrKrX/fG6zZAzo4IEuvC9kzqmj7bffot9CDqpDBLPOIqGsQlSE3HixvEhHsst7EX/WXmybUDqDwOn5SIA8pyziC2go2/j3HeqXBkZy1RnaSCkjMegwYm6/Vqrf7J6opvlF5DR0FHIErcZiVJdIfxVr4pIuLadtbSNkf7RPPpL3bO/XjaeifDOImy7NjugvrP83DZZEsvPMnQ== 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=dg5EMgWYo0DHB/uO+FhKSLFh/5BwlURcswAEZZ2IK88=; b=Wo+I71exBVqOpCW1WuiGV1tN7gIqUZ+Gf5DguXxf2AETEzh7Gl8G8vBrkCivK6viBzi4omlpeqH9qTEaYNg+2wLbjVG5rTXHiwXh9dgMmC8IXswC/eEzb25bVOXzyUkooG2NB/j2Owqbx94ZW4KbnFi2bdGncxeX21vhBU4M8vZtBGMazULVFV39FGwb4MDABQ6/oonzlwzoJem40F5mAYdu3RdLW/hOwJyujlRyXL6iFu9YI2LI/3ArIQdQ9FFQ28bAhqGLU70giUi9QdDzpOFXXF25typkfWaEHSHfLmlpne0SKJL59s9+ZYTK9EM0LFIA93TYJC51U9BlsELpNw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:23 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:23 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 11/23] nova-core: mm: Add GpuMm centralized memory manager Date: Wed, 18 Feb 2026 16:20:08 -0500 Message-Id: <20260218212020.800836-12-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR02CA0131.namprd02.prod.outlook.com (2603:10b6:208:35::36) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: f4869207-405c-4944-c4ca-08de6f33aa9a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?WfvZOr7+dDEqzP2WiSaMKk1uYgQT0rkv97i9Lv32tVl3GM1xIP8BCk7a3iTw?= =?us-ascii?Q?f7AE9RHa3vKB7tKTQiFqfDdW9InvXg8OF24993jw4iU99Kp+lw14cG6Yij+t?= =?us-ascii?Q?VOWDdd4LBL0hUqmNxqhdFEin2ycLr3hGSvsrEkOW7XzRVCH7t6gChfAFxfHv?= =?us-ascii?Q?HmMCUgak6bcB+ndxGQp49GpeSQw3rMc4YMwEdmhI6f1xYp+GDJyGqJemqv/3?= =?us-ascii?Q?eUCXgPKa+JJFSYox36f4YKIzeYSDgV8sg4Y1qCzBWE1o8glpVyycdAq1coRX?= =?us-ascii?Q?iIaJi1xCbJplU3ZX2WQDA+VKW3RXpWftUkrUyUP3lbTGM22I2rRKTbR1N/Bl?= =?us-ascii?Q?Mjq2+n3Q0UTKxEbjnUs8Ljwpe8GGxYp5agqISYHtIqXpITawoYOptp9Pav+w?= =?us-ascii?Q?VeEoNFx/PY8uGCdH7T21xGOMSIAy1Y1G6hz1tjQBb3BNt0G2EfwAYI7TD9jj?= =?us-ascii?Q?jnCCXSdE/Zs6cfYNqmKSSg2f1ZGByV7a6MgoZKGbdKWNeReoVjoRqnYXSj6h?= =?us-ascii?Q?7Iwm2z0uSkjzwoOBl+hCnb7KUlxD+78fL+YZ0Cz6ZBUa33WQ4KMjmkT9JShn?= =?us-ascii?Q?NqlWDM7EkOm9k9G1XYCCI1g6OBb/erRogiVtvBjQ2Ly+ViDqnu196amu8qYL?= =?us-ascii?Q?N1E3StPQpTNhVOcJM5xemZGAkOSEDqgWDQzvLoBo7BbWpRRPK+S6/LywVn6f?= =?us-ascii?Q?VuPIo5EQPEUDSFzeXyp7UVahLeLzBZzBNrU9WBHXHSvnm0IllfU3HsrYdEYv?= =?us-ascii?Q?rts2mk8ObEzAZP/bzW4AF8FdoP3dr0uAhSUqsuVouV4jOZb+Y6/4aoZl38Rj?= =?us-ascii?Q?x9dPpT5O7nhD2yNIL5WE+8UvRZuzJyOLPNSonrVQSwPHPttEstD7sktAKflW?= =?us-ascii?Q?ctjDBEqbSh3tKD8X5HrTb/27se8qPxJ1n9cd2kWACDhFVvuOr7Mo6d5IjxrH?= =?us-ascii?Q?HU0ruQv/FCyRTuXfxsZhAva5RJQXbaDGWy633SZv30QTF7YBaNMdg8qjZ3vm?= =?us-ascii?Q?oaxR7uiL8WEIExrCKLBtsKylWODKjzrDYXIm6rwUKcyUGarqIsEks37qY8D5?= =?us-ascii?Q?JlmbZI6tnPwAsRPUUcbmfGXTD7AxgCSET0XnmaQFY+HR44fx38oocWrvEl12?= =?us-ascii?Q?yrpkya7z345tif1eFi9JBZSaKqScmutPzVyJz7d/vbjc/sDl9KJ985a12pbF?= =?us-ascii?Q?n2+Hk00knsDUimju8v34GmgAccdoSL6NDmkKpFK92mZeI5dmQkOlCR0DAWAx?= =?us-ascii?Q?wKhjSt4QzlYs2m1eONPO5dd8VTxXUGa53X1zRqYGsP1+7igbZKrpZwAfBmCd?= =?us-ascii?Q?rXg9yH+1ZXQaXsVzwH6nU9K/V1o80trb7c5a2wTzJHIU7NBRFJF68pV6M6rF?= =?us-ascii?Q?mhoJT2r+oHw6K2U//Mqc1tmAZ1w4vbesN45LQ7lhf7dVbeomwQDSx41QVujt?= =?us-ascii?Q?r3xYwcE47dMcNxomV7vjp1cBb6t4gJZ0IQv4aitGZpnNHHGJGIA/ocPyb5gq?= =?us-ascii?Q?GcnjqeZsDJlCDbdtCgrqhpP9Q57elt3Kz5lmcvl8/8UaHmdkkiTvVsfe5pIu?= =?us-ascii?Q?yorFRfaoFGKBdZGZx74=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?3TGCOxjMxtr6L1VfVTg54iAMLqiCD5RLgOYcOKDIeGwe0NM1Ybe6HbFw5tfM?= =?us-ascii?Q?oMeuxiyLdlf4gfjQP67bdL0T91+E6t/6macGwbiVo94AtB65UMTbtKVtNXC3?= =?us-ascii?Q?Fc4VAjaY5DxR/C3aPlXy/g68KZfpkDBTGazNByIzNxtaDPg4S/NTVSF3Yp4S?= =?us-ascii?Q?sI/U34y2iLTXclT9Egbbhc3JmGb0/YjNZCFgel0rAIqDs3RY7obeMK7ncJrM?= =?us-ascii?Q?Rc8H4xceDXk8Vfv4hUA9oogHIHbaTEl5xXdY1VdJ9EHeZ7Nwrkff7fsrd02q?= =?us-ascii?Q?VFu+YtwJBkutdS+w78FoYUP7fFwOWqgTHeRymzZHDW9B1+6TCVx8X/sIQDXP?= =?us-ascii?Q?oZk1HKSa9AD8mYaLiuv/SqwMClwlH+C6est3whjrlCP40B2oK6EDDKuVhn3W?= =?us-ascii?Q?P9hC4o66qfJGlzZn4xh/RPaeq8uSZCQGtzCoYT1oZ1DLVLI8qMqSYPEZfQFz?= =?us-ascii?Q?ZL03QyFofoK4oL0EMa2/5mbXVXp84j4ZH4Z5KFfAYvukUsvrUsgB9yD70COi?= =?us-ascii?Q?bsnK0/OFpH4Ll6A3Dehpw4waEeRB8xRsYdqJHXcj0bj+MmPI2xtoBXV/BiZT?= =?us-ascii?Q?msedDRWjtjlR5Kvzl39DB2Zy7ZDEtO3kIQCuE0ZMEJY2vFSVIPX79DHpwLmk?= =?us-ascii?Q?ndyl4prM/y9bA3aLQG2lMMXicpQiuIyFBzeWXJnRLr94zbbvAY5KrJjw8ASd?= =?us-ascii?Q?oa7dCN+ay+GzNVYGm7DC9eoOqJdhDY9i4IjtlU2XIK2DzPY/Fdt78o6JHqQV?= =?us-ascii?Q?HcrqkwH0MsvleuL7Pws/skryJ3kCs8j19U8S+BhcKR4PY7M8RIvvhSyLZjkj?= =?us-ascii?Q?r20wH9v2ewgrutRkqD/e+8Vxk1JqKac9XMxVQ+RXw00GCRTZ7/GI0lXakS21?= =?us-ascii?Q?4L4OsTScmX14CR0A+oiMinzlFsH+R3dI40rP0YkXsV6bjeVI0QsqyZX5dKj6?= =?us-ascii?Q?uqZnzPbRhuyocnO0g6draUsPCGwomQX7x0kDo5t/8k9dq4VVOySYMZCdJTwu?= =?us-ascii?Q?t3nM9FZVTFZpNs/dTPmIRcBfgfFZAG9WIyONRhKwXhJpV2clAYX2Mh403ITX?= =?us-ascii?Q?KveaGgjyhSuOpyaKLmUxhnYjUsV/yMPk3SH3DP/LgVkaBdmrfFY3ZAugbzh8?= =?us-ascii?Q?6tgyYFi4/TCLorQv9L2UKUuCAPq4yd4K9A4EY1PApqTrvyqwZ51wbueeMVEA?= =?us-ascii?Q?Isf2X8NGWeW4m00LqMAozHuI+WxGRsja7R7XIsOQaRi3oo4luuEn3ngwy2CJ?= =?us-ascii?Q?Yb3WBs6ILsLUQ3j+FuZfvnv8CGhhJ9mQd7ptXeGNkqAiMV1hDYB916auVqRw?= =?us-ascii?Q?8U1RTOJOWqi9C+W9B/bN+cvKI01lQf+pbWP919q3WDO+B/ayF1a82wakNuO0?= =?us-ascii?Q?JgPEQJJUxadMulBZz0L2pvYthzs1luVOzRE/5vO7cbJ+2yvk8aejaVDg+Wvn?= =?us-ascii?Q?47kCoVITpHbCxOJ88k/rlcWimWjHWfdIC8ihvXNEVvEV3TpUWzLTR40P1MCx?= =?us-ascii?Q?tjPgWsHcjEcWdzFkegqZ2fAk4wEDPoz2FK14uXP35GEx9OgngJsEAHwC9VeU?= =?us-ascii?Q?qrmYzAzMmOl+3Hy4Fr7rytPv5F3oiXGQ+aJLuyKIIl1lBQe/nJRrHTJZdjQM?= =?us-ascii?Q?0FtgSxSlhYsDgnKJ4DM8aEB+4Q8fPl1Ebfn3vtdO7fBFYBsz09HzOlm1cynd?= =?us-ascii?Q?NoHxtMDNkCyt0GwE4KLRnMjRPqE51wzNO2Xu4PQfGhptdMc9c04NtZdW7dPf?= =?us-ascii?Q?jNtXSZ5YHw=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f4869207-405c-4944-c4ca-08de6f33aa9a X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:23.0762 (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: zj7UxBlgKDPmUyQwEJDoy3fGxeTVzusb33NVJz1eqN9pQbiE2aQVs0RuMvnPx/8utLdaE7wMuarceUDm6ixLHQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Introduce GpuMm as the centralized GPU memory manager that owns: - Buddy allocator for VRAM allocation. - PRAMIN window for direct VRAM access. - TLB manager for translation buffer operations. This provides clean ownership model where GpuMm provides accessor methods for its components that can be used for memory management operations. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/gpu.rs | 15 ++++++++ drivers/gpu/nova-core/mm/mod.rs | 63 ++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 9b042ef1a308..396d5bf57167 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -4,8 +4,10 @@ device, devres::Devres, fmt, + gpu::buddy::GpuBuddyParams, pci, prelude::*, + sizes::{SZ_1M, SZ_4K}, sync::Arc, // }; =20 @@ -19,6 +21,7 @@ fb::SysmemFlush, gfw, gsp::Gsp, + mm::GpuMm, regs, }; =20 @@ -249,6 +252,9 @@ pub(crate) struct Gpu { gsp_falcon: Falcon, /// SEC2 falcon instance, used for GSP boot up and cleanup. sec2_falcon: Falcon, + /// GPU memory manager owning memory management resources. + #[pin] + mm: GpuMm, /// GSP runtime data. Temporarily an empty placeholder. #[pin] gsp: Gsp, @@ -281,6 +287,15 @@ pub(crate) fn new<'a>( =20 sec2_falcon: Falcon::new(pdev.as_ref(), spec.chipset)?, =20 + // Create GPU memory manager owning memory management resource= s. + // This will be initialized with the usable VRAM region from G= SP in a later + // patch. For now, we use a placeholder of 1MB. + mm <- GpuMm::new(devres_bar.clone(), &GpuBuddyParams { + base_offset_bytes: 0, + physical_memory_size_bytes: SZ_1M as u64, + chunk_size_bytes: SZ_4K as u64, + })?, + gsp <- Gsp::new(pdev), =20 _: { gsp.boot(pdev, bar, spec.chipset, gsp_falcon, sec2_falcon= )? }, diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs index eafd56964b1b..471f8eb0635c 100644 --- a/drivers/gpu/nova-core/mm/mod.rs +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -8,7 +8,68 @@ pub(crate) mod pramin; pub(crate) mod tlb; =20 -use kernel::sizes::SZ_4K; +use kernel::{ + devres::Devres, + gpu::buddy::{ + GpuBuddy, + GpuBuddyParams, // + }, + prelude::*, + sizes::SZ_4K, + sync::Arc, // +}; + +use crate::driver::Bar0; + +pub(crate) use tlb::Tlb; + +/// GPU Memory Manager - owns all core MM components. +/// +/// Provides centralized ownership of memory management resources: +/// - [`GpuBuddy`] allocator for VRAM page table allocation. +/// - [`pramin::Pramin`] for direct VRAM access. +/// - [`Tlb`] manager for translation buffer flush operations. +#[pin_data] +pub(crate) struct GpuMm { + buddy: GpuBuddy, + #[pin] + pramin: pramin::Pramin, + #[pin] + tlb: Tlb, +} + +impl GpuMm { + /// Create a pin-initializer for `GpuMm`. + pub(crate) fn new( + bar: Arc>, + buddy_params: GpuBuddyParams, + ) -> Result> { + let buddy =3D GpuBuddy::new(buddy_params)?; + let tlb_init =3D Tlb::new(bar.clone()); + let pramin_init =3D pramin::Pramin::new(bar)?; + + Ok(pin_init!(Self { + buddy, + pramin <- pramin_init, + tlb <- tlb_init, + })) + } + + /// Access the [`GpuBuddy`] allocator. + pub(crate) fn buddy(&self) -> &GpuBuddy { + &self.buddy + } + + /// Access the [`pramin::Pramin`]. + pub(crate) fn pramin(&self) -> &pramin::Pramin { + &self.pramin + } + + /// Access the [`Tlb`] manager. + pub(crate) fn tlb(&self) -> &Tlb { + &self.tlb + } +} =20 /// Page size in bytes (4 KiB). pub(crate) const PAGE_SIZE: usize =3D SZ_4K; --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012024.outbound.protection.outlook.com [52.101.48.24]) (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 1921B335094; Wed, 18 Feb 2026 21:21:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449695; cv=fail; b=EDn3WW/+XTpKA8h5Zk3ipmIWr8dsITuzs0q7wcdwKDsrhxTqh0BxiRWxNtUU+ospR0SPBgKBQmXCSkm1TT5kdbzLspSEZAYQEAPv674i8SAk1+JREfg4JU+WEDVRhWT1y2fWDSeW2WAUD4NfXzhCpqw69r/y7/75ZpCRXl41Fb0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449695; c=relaxed/simple; bh=N0oBZzLsAhYC9UX2kTbudAx9+OyxM/P13Mb9Kt9xoUk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=h0XVAb3gvDVzfShwSDM8/HeDvugT+DDJFcGZ5/t0ML6o2eVL7ZAyyCOLjS5INg0+azETea3fpuFNxfIusR5wH8EiIEKF4KusegWealJswHVpmGO+9TiIKQkhccGufGCPQGDiwL0GtANDJyuP6+GaMKRBHL/L/kZY0Y0xF1z0TqU= 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=qHAuJUpq; arc=fail smtp.client-ip=52.101.48.24 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="qHAuJUpq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IwvB/LT9nxuBz75BhE6Y1wqClc5fHG+nj7nZFdeJGkGXV+idyk6aOYdIH14vOdLjvOAMyzUnCSU1xN+naud4owm1GWW4LGuE2LcS3DZaH9r1ZrP1IH866QhFJJjF2P0zUxW+6bIxTIk+16TjkKzSb55qIZXv41dqTUEkjJOqkXU1QEDBKKcDTXtfdOxv5uX7ck2Mgmr/tiEgg40G62zC0yEdx/aEdktOn7IlDZsl1Le/k0L24Er7UbAdVcZC5xDhWSCzFpUW8b1KkT/xpwEUZNwB681ShxZii35ed8EtA32xRgoR+2OXquWiYp0U2FLHD7c4tn2C3iSmoxplZ1WJXw== 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=D0eQgoKrxz5ZXvwJVRrum/Jwni9qdvqlTq+PSX4Emr4=; b=nuMt+kTcbM+4urGscEXoNosk+QzdIqHTA6FXmUb0sYtsH4xi4JerPfv68+zr3J1/tPKD4l00+2tf0rzKooRdXmluHo3bXhEelZY+lCdbcLn3/CutP/QBvJlHkc7mtEviq6eMuJCsD+F2xCoI0cBjLkjqIxXJ/lMhxGr7PyBJXT7EYvXgxDNRVe/naheCiXl37PdsvMBFzeDRxN8aNkiHoitH81Pg1vjsy1xAQv/oCNm2IJ6lUPYv3wnfb8NEpd6KDaSQxtKJ/2Atug9u2wH2hG7vb/wgckRGfLgC4FRXqf+JOQSWDB/s02G7zZNpir7vSglk/Tjzxu3xHcEGwioVtA== 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=D0eQgoKrxz5ZXvwJVRrum/Jwni9qdvqlTq+PSX4Emr4=; b=qHAuJUpqc3VmufPdQx598rclx9L114D+rEIx9A2RGYItyPUKitJ73IeBEMFaMQXg//aokEZaHbF4+Xc9rOfwaUn4ej1Mk/FIfOdA3p3P64IPasxt2uIHkzasOFn5H3CbFkahXALLUwiceoKRlMrUn3oDfc1aHKVLeNU1FwWlGQZp6leyouC48iNZDG+LS6PCmc68mhAIg25PKMivEE5rf68fHMRVV4KH2y6GQX3ZnPuRs783WHituKt0WoTJTSB8f97niua/inm9mh6nvBcZtpt3C7Phan/i/Dc77wF27FIey4v2oAv4fwckVI+coseUVuqD9QGq0ZzzFCNSL/sHrw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:25 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:25 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 12/23] nova-core: mm: Add page table walker for MMU v2/v3 Date: Wed, 18 Feb 2026 16:20:09 -0500 Message-Id: <20260218212020.800836-13-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR02CA0132.namprd02.prod.outlook.com (2603:10b6:208:35::37) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 69e279c6-8153-4574-d49c-08de6f33ab98 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?k/EeWkxRzmr3TnJxFNF1iGybbdRyJmBR6EMrTMgNYrFcPgs0cHgqyLP5AqED?= =?us-ascii?Q?XBY+FfuLsbZfScWwyTqgZ0mU1XHI/vI/IxUnkdjPzMB1MQb+4OtQK138/Bhb?= =?us-ascii?Q?inaE4OBl3d2jOvYwQ2hfE+kCNJDnmcdhGe4a6cFzKfY8cAfpidjcIfHQ3ZM3?= =?us-ascii?Q?8t82tkTDu3uZDHVLOSjWBkvy6QR6MD0fLxnglXhhdEsFTwXk2ZIUxHSFe6vx?= =?us-ascii?Q?97clPS+u7ZsAXpR++1dVbNW2EzZjw4f/hfarZKkadyI859SqbuCF2KNfpBF8?= =?us-ascii?Q?BZVaIBiuhbZm0irDLsVBrkCXpM4GaBsZm4zA5zLpMAgd7Ex+8kx9VJNYjvhu?= =?us-ascii?Q?i7dy2I9/6HNan2wqDyFCevYp6feeg2rAytGYLYpI1Euz2Zsfh7c3USVqWPv9?= =?us-ascii?Q?GJFDVHbfofzF+H5+jfgV4kALsN1vrj3LiDjIbh0HckFJPrAmtqwHfyvP41XE?= =?us-ascii?Q?qPKMJP1QR9Q0IfaJiy/LJG65GBELq5oMU83SZUzFqFU1ShYBbXvVQc9mKkgU?= =?us-ascii?Q?R/1cimZNGaCxfdL/KbGKc1aIwySw8ui0rLIIsVue7YgaF51alVm42geOwyrV?= =?us-ascii?Q?NrVQ331lfqhGTdPjPbht0HEqt7jgww+Q+A8klLc5H8R//ugXhFuJpaAnZD6b?= =?us-ascii?Q?beZ0kjxeqQGWh1VcI1BZshFi6rUomMrgRjoqwQEhnTN5vxmbirkjO8k5ZJu7?= =?us-ascii?Q?1zhJ07Hz/uG2OeivOQKrM0XZBFKEAdIjs9vsWZn4JLfb7+EL+JPCaC/E3mYF?= =?us-ascii?Q?+tM13Bq1UguKXjn+At6ZR5/c5dKARJQcEYogrV/chKSiSwCQeKCgXDeG5UJ2?= =?us-ascii?Q?nqs+wKwptqu2EXhVtLvQYpkTBakRpa4TKiLAU3ixhGpXMeKrYxhO5ox5DF6j?= =?us-ascii?Q?J5k3RJcgGmIlrDywURacpe6iWSdsBWfEcPW/9xvVvzZEFTisYBzsOdSGjmGr?= =?us-ascii?Q?sNhd96Czxivsf2qvmaDIn1ahO+oj1ckEBDBNgBcpa8hODCRy7p85vpWC47kk?= =?us-ascii?Q?5pH06CykQKu5va0tzemnVfkqKU2dKItvjElRPaOVF0J0JZVeYfnUJU1zqTvY?= =?us-ascii?Q?hTqvQmuN+yTfRy8/PTUD/neDC8fTEGFvvE4iErDJOa/4RIgYDnuLSPMM23IO?= =?us-ascii?Q?qUUK0prx4i8uBBdfstdu6/MG3XxcHLFKcjCEaIfxKDEj02h+LVGGm088FnmC?= =?us-ascii?Q?4oMWEvC2wSpNVsxoEMcmk5kXs6x5RWx5CWd4WAJIniEBl//M2lwmtoV2LPHk?= =?us-ascii?Q?TsF2Rj7sTig4XTRxqNM0VtrxxvKMAHgppjh1mmTpkzqp7U1l1FPpDJgD+wNJ?= =?us-ascii?Q?jEzX/QmIr4L02wu3mW9HswHlQLLNww74VryEuXaqcQkI1jubcA5G97ZwxXqm?= =?us-ascii?Q?SUp3yPpnbGuqZzUB6FKtMzF76W1yG08zyqAoCG1hE2Q8TDJmq+ZGyBifpFsC?= =?us-ascii?Q?5B4DCwWWQiMfJU7WDeDPDFE4qrGJR+S3D+iMgu95LHXs3O2MSXfxMLNoxLAb?= =?us-ascii?Q?hOaJpOKGYarlOW3QJnevd0C5N+3puP+qIcex9gjTpliufg3vyyZfdkf1UszR?= =?us-ascii?Q?dIiFksYM3yI3sFwfiN4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0ESd40R9dkRvDXoaUfEUqFE+Bj1rjotMQolLQNc/qF9cUS9gUUImgjfmIOzr?= =?us-ascii?Q?9vQNNC8HSFHKIndP5SXRpGQ5hJUhISNh9078XGF2A4mcJ8v3BLQQPO+ZLMJ+?= =?us-ascii?Q?TFK1z6+32H73QVF/4FmFrU1E6t+YtkHbQIQxox5Z+3QPt1mvVq2tXshQFVnB?= =?us-ascii?Q?LSFlL0m8mfWLzNtaX4trbzmU2z7eDpbQcaPLhTMt8oVFAvY890hFyGt0vQa5?= =?us-ascii?Q?RtCGV4BYXlT65o8dgDaPxYZ1oLREEOqKw5+X6TWZGBbDqkCL5mYLQ23iiGgj?= =?us-ascii?Q?hFasXOZTQBYwuU0p9hWkvg5aouCk4+vqX2sftwbFsPOMjZXwkhyt7SdUnWD0?= =?us-ascii?Q?1vRPoXd42uNgQtZUCzqcX3JAV5xd/ybV8PSfHYpT+xa8WlJVYWQ848+k0Hwn?= =?us-ascii?Q?n3Ouu2bLtC1q7B0hlB0CgW7oX6FKr0gNRTw/qC9778lHT1SxA04J4ew7XpZ7?= =?us-ascii?Q?N6yJydq1mqHVYown6sl2+rzEDh8ohLNLIVaof+uS7WzZkL/Iuw99Cr8gfqmL?= =?us-ascii?Q?aRJNPujYZjkwg5CSlAexJ08l8lpcyw61Xyz6UrDUTCGYUejt+FEJi91hYyUM?= =?us-ascii?Q?+uhd46Tx/RraZb5KUO02UIMcbOlyxlQ+8n3Ey8UPYxumFsXPZXCe/7Bv4xjB?= =?us-ascii?Q?w/WOa1u5wpXmfvbW9ewuQQdwlIvtLZiko4vK84xP6EuacMzLWtb6X1iXwfU6?= =?us-ascii?Q?LI+zSFAjgflxTrOIcT+vuetEagReLW8EJWwZ+VUWxzlCcX+vIvy+kMxS1Qni?= =?us-ascii?Q?yKWTgccLxGnPcWepq/5IQewqlOY1MIeNRHuupRuw3ZKCTl5LPeCEENpZRqx8?= =?us-ascii?Q?9aJRujDyHuI5HMSrwM7pCre1hPIrSqRFnUYqDAefzaKokcAc/2pJq2EZD69K?= =?us-ascii?Q?wXbXGG2+hGvuqYImMptCuDFhJ73MJQ4xJfhYdLgNL1+PulrJKjZsW0Ew5Vv6?= =?us-ascii?Q?62WtHpUz88asqXx+ikcPxU66h8mqml9BnHZvuQOBXSHiACjlyU9jXQ3ApSTa?= =?us-ascii?Q?KNVsyfc7SBawQ2AYZv22Ur5PpyieHE+fTtfeksfWjCDLfeTvJOSyd6zps3MR?= =?us-ascii?Q?k1IEv5MH1dCVYq8VCWXAc3OK4Awjw+e2+zKnciXQ+fS5RD4mbEzRgLaI8csz?= =?us-ascii?Q?X4Wh3aMYRrFtIsKtYEws6QZhXxhynwpO5z8vZefz9niy0kV2utAJ+mONUfsw?= =?us-ascii?Q?2JPdJCyylTpTVsoriozSRlvmhOUaLgyDVOPEEGX1aUqX1ZBmsvGCg5tnNER2?= =?us-ascii?Q?cvqNfmciMJq2K+LJ5C19xOr7WsAGYhETlK3qsTTRMWXY/YMCMOabEcfpElF1?= =?us-ascii?Q?OCre0MrPzK0Uq/pdZ6S/xRv/v5HSnIt9fzyp7zW9fuk3vtIz4FhjZdl7q/AO?= =?us-ascii?Q?Ab2v014Bx8yVxlWyBrM9AwEzngMcoq7vDbd5NE++SgZ7L2+/nCtRoxhOjw9/?= =?us-ascii?Q?Kf723J7qxQNqAh1z8ItUyFB1NIaP30w9v0GGSoDycqERdRVHcATDFb7B7zCa?= =?us-ascii?Q?Tj84OGPmjecPCVucNSJ8GuS3PHFLqo1v3HbFAVgpAtgW03bRUluSQFqZsx8l?= =?us-ascii?Q?J2DZRvXFsTWYuQgmZYyHwE15dCzYSkIn40Q46iet+TOP5ETT/TzYLNwuchWc?= =?us-ascii?Q?YauqRMROSAXK4iUzNuB6NBBN8Yj3XhR+eFi88vDWbN/XXiswlKhpILuRCWON?= =?us-ascii?Q?EEiwOvw8vKuJGzesc78zyKH0khNeAkrExP7pSK/KxAERN8kTJuOf+aQ2c1kE?= =?us-ascii?Q?Up66BGkB0A=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 69e279c6-8153-4574-d49c-08de6f33ab98 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:24.7854 (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: S1n2JyJXai6HFaReH8l7f5zyFySmb3/B/zpVyeOyfordXNE9Q5dhsPWt8PdtuyroUELrBuKmdSEmo8qlDAs9xQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add the page table walker implementation that traverses the page table hierarchy for both MMU v2 (5-level) and MMU v3 (6-level) to resolve virtual addresses to physical addresses or find PTE locations. Currently only v2 has been tested (nova-core currently boots pre-hopper) with some initial prepatory work done for v3. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/pagetable/mod.rs | 1 + drivers/gpu/nova-core/mm/pagetable/walk.rs | 213 +++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/pagetable/walk.rs diff --git a/drivers/gpu/nova-core/mm/pagetable/mod.rs b/drivers/gpu/nova-c= ore/mm/pagetable/mod.rs index 1f783261a30f..2b9fc60fb167 100644 --- a/drivers/gpu/nova-core/mm/pagetable/mod.rs +++ b/drivers/gpu/nova-core/mm/pagetable/mod.rs @@ -9,6 +9,7 @@ #![expect(dead_code)] pub(crate) mod ver2; pub(crate) mod ver3; +pub(crate) mod walk; =20 use kernel::prelude::*; =20 diff --git a/drivers/gpu/nova-core/mm/pagetable/walk.rs b/drivers/gpu/nova-= core/mm/pagetable/walk.rs new file mode 100644 index 000000000000..4ee343734d72 --- /dev/null +++ b/drivers/gpu/nova-core/mm/pagetable/walk.rs @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Page table walker implementation for NVIDIA GPUs. +//! +//! This module provides page table walking functionality for MMU v2 and v= 3. +//! The walker traverses the page table hierarchy to resolve virtual addre= sses +//! to physical addresses or to find PTE locations. +//! +//! # Page Table Hierarchy +//! +//! ## MMU v2 (Turing/Ampere/Ada) - 5 levels +//! +//! ```text +//! +-------+ +-------+ +-------+ +---------+ +-------+ +//! | PDB |---->| L1 |---->| L2 |---->| L3 Dual |---->| L4 | +//! | (L0) | | | | | | PDE | | (PTE) | +//! +-------+ +-------+ +-------+ +---------+ +-------+ +//! 64-bit 64-bit 64-bit 128-bit 64-bit +//! PDE PDE PDE (big+small) PTE +//! ``` +//! +//! ## MMU v3 (Hopper+) - 6 levels +//! +//! ```text +//! +-------+ +-------+ +-------+ +-------+ +---------= + +-------+ +//! | PDB |---->| L1 |---->| L2 |---->| L3 |---->| L4 Dual = |---->| L5 | +//! | (L0) | | | | | | | | PDE = | | (PTE) | +//! +-------+ +-------+ +-------+ +-------+ +---------= + +-------+ +//! 64-bit 64-bit 64-bit 64-bit 128-bit = 64-bit +//! PDE PDE PDE PDE (big+small= ) PTE +//! ``` +//! +//! # Result of a page table walk +//! +//! The walker returns a [`WalkResult`] indicating the outcome. + +use kernel::prelude::*; + +use super::{ + DualPde, + MmuVersion, + PageTableLevel, + Pde, + Pte, // +}; +use crate::mm::{ + pramin, + GpuMm, + Pfn, + Vfn, + VirtualAddress, + VramAddress, // +}; + +/// Result of walking to a PTE. +#[derive(Debug, Clone, Copy)] +pub(crate) enum WalkResult { + /// Intermediate page tables are missing (only returned in lookup mode= ). + PageTableMissing, + /// PTE exists but is invalid (page not mapped). + Unmapped { pte_addr: VramAddress }, + /// PTE exists and is valid (page is mapped). + Mapped { pte_addr: VramAddress, pfn: Pfn }, +} + +/// Result of walking PDE levels only. +/// +/// Returned by [`PtWalk::walk_pde_levels()`] to indicate whether all PDE = levels +/// resolved or a PDE is missing. +#[derive(Debug, Clone, Copy)] +pub(crate) enum WalkPdeResult { + /// All PDE levels resolved -- returns PTE page table address. + Complete { + /// VRAM address of the PTE-level page table. + pte_table: VramAddress, + }, + /// A PDE is missing and no prepared page was provided by the closure. + Missing { + /// PDE slot address in the parent page table (where to install). + install_addr: VramAddress, + /// The page table level that is missing. + level: PageTableLevel, + }, +} + +/// Page table walker for NVIDIA GPUs. +/// +/// Walks the page table hierarchy (5 levels for v2, 6 for v3) to find PTE +/// locations or resolve virtual addresses. +pub(crate) struct PtWalk { + pdb_addr: VramAddress, + mmu_version: MmuVersion, +} + +impl PtWalk { + /// Calculate the VRAM address of an entry within a page table. + fn entry_addr( + table: VramAddress, + mmu_version: MmuVersion, + level: PageTableLevel, + index: u64, + ) -> VramAddress { + let entry_size =3D mmu_version.entry_size(level) as u64; + VramAddress::new(table.raw_u64() + index * entry_size) + } + + /// Create a new page table walker. + pub(crate) fn new(pdb_addr: VramAddress, mmu_version: MmuVersion) -> S= elf { + Self { + pdb_addr, + mmu_version, + } + } + + /// Walk PDE levels with closure-based resolution for missing PDEs. + /// + /// Traverses all PDE levels for the MMU version. At each level, reads= the PDE. + /// If valid, extracts the child table address and continues. If missi= ng, calls + /// `resolve_prepared(install_addr)` to resolve the missing PDE. + pub(crate) fn walk_pde_levels( + &self, + window: &mut pramin::PraminWindow<'_>, + vfn: Vfn, + resolve_prepared: impl Fn(VramAddress) -> Option, + ) -> Result { + let va =3D VirtualAddress::from(vfn); + let mut cur_table =3D self.pdb_addr; + + for &level in self.mmu_version.pde_levels() { + let idx =3D va.level_index(level.as_index()); + let install_addr =3D Self::entry_addr(cur_table, self.mmu_vers= ion, level, idx); + + if level =3D=3D self.mmu_version.dual_pde_level() { + // 128-bit dual PDE with big+small page table pointers. + let dpde =3D DualPde::read(window, install_addr, self.mmu_= version)?; + if dpde.has_small() { + cur_table =3D dpde.small_vram_address(); + continue; + } + } else { + // Regular 64-bit PDE. + let pde =3D Pde::read(window, install_addr, self.mmu_versi= on)?; + if pde.is_valid() { + cur_table =3D pde.table_vram_address(); + continue; + } + } + + // PDE missing in HW. Ask caller for resolution. + if let Some(prepared_addr) =3D resolve_prepared(install_addr) { + cur_table =3D prepared_addr; + continue; + } + + return Ok(WalkPdeResult::Missing { + install_addr, + level, + }); + } + + Ok(WalkPdeResult::Complete { + pte_table: cur_table, + }) + } + + /// Walk to PTE for lookup only (no allocation). + /// + /// Returns [`WalkResult::PageTableMissing`] if intermediate tables do= n't exist. + pub(crate) fn walk_to_pte_lookup(&self, mm: &GpuMm, vfn: Vfn) -> Resul= t { + let mut window =3D mm.pramin().window()?; + self.walk_to_pte_lookup_with_window(&mut window, vfn) + } + + /// Walk to PTE using a caller-provided PRAMIN window (lookup only). + /// + /// Uses [`PtWalk::walk_pde_levels()`] for the PDE traversal, then rea= ds the PTE at + /// the leaf level. Useful when called for multiple VFNs with single P= RAMIN window + /// acquisition. Used by [`Vmm::execute_map()`] and [`Vmm::unmap_pages= ()`]. + pub(crate) fn walk_to_pte_lookup_with_window( + &self, + window: &mut pramin::PraminWindow<'_>, + vfn: Vfn, + ) -> Result { + match self.walk_pde_levels(window, vfn, |_| None)? { + WalkPdeResult::Complete { pte_table } =3D> { + Self::read_pte_at_level(window, vfn, pte_table, self.mmu_v= ersion) + } + WalkPdeResult::Missing { .. } =3D> Ok(WalkResult::PageTableMis= sing), + } + } + + /// Read the PTE at the PTE level given the PTE table address. + fn read_pte_at_level( + window: &mut pramin::PraminWindow<'_>, + vfn: Vfn, + pte_table: VramAddress, + mmu_version: MmuVersion, + ) -> Result { + let va =3D VirtualAddress::from(vfn); + let pte_level =3D mmu_version.pte_level(); + let pte_idx =3D va.level_index(pte_level.as_index()); + let pte_addr =3D Self::entry_addr(pte_table, mmu_version, pte_leve= l, pte_idx); + let pte =3D Pte::read(window, pte_addr, mmu_version)?; + + if pte.is_valid() { + return Ok(WalkResult::Mapped { + pte_addr, + pfn: pte.frame_number(), + }); + } + Ok(WalkResult::Unmapped { pte_addr }) + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 7ACB1332EB7; Wed, 18 Feb 2026 21:21:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449696; cv=fail; b=YiR89sFxG5S3PZvv3CrNNPPHdUItciDOfV7/l6K8gVREpRjBZfDXtY/RSNHRsZhhF33A21akf/J9wA4tiRdrvqi1nrST4GSDEedq2UiadHHelZ6Y/cXZr72ssHoBQnNUi7EZoZaKT7ker/awdpi6U9/pQLR/heBGf2fF95QMmzk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449696; c=relaxed/simple; bh=e7M99vhCgfG80LYmbxTChFZuT6bVWjXI4IyvUvkopV4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=U4XLbMNKBJLuHMarMMBDHDuu+PTW/yiDyrlgwxAOyU/wnf1YPcmCqFy3zkDTnfYbsiGn0V9a5MZgiDsHVrJZl0vrkwSMbh9a8+j58T+7U3YjupR/g4bY4QCQlwv6UcTdCR0r951lVTJMAVohl4u0w5UYGXK6+6KbSEu7vo3tFxU= 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=o8O2w4Bd; arc=fail smtp.client-ip=40.93.196.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="o8O2w4Bd" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aYzj2BC6Zir2HwVFuodg2sskapA3WmL8acoIX9zEmHvEbc3wVkfgTpfXbsr9ixDtv78JdNQSC0Cu+lcnB2t6unPZW1HHNzBfdTfgjICrdUMmq5U1bBcganCLeHIn+4zHfAqBXyC4SkLESQr0UXsuQNdFBQ0W/kD0zp0E3/cHSFHzVeny2W3Q+gCeSx8n/bnXZFw4Sn8jGlArx7ofa5NwmWGmJH8K+XIJLoOFw9jWOHvwHDaeiCC/AIbl363m+yy+Mx0OtBGFq4Eet+fhh+IdQt1tfVZgbSzbEv7D7/xUWG5JAXG5kUk9wEkky6NdcEF6ZBQPRD9O0BhxvMV3b9KEcw== 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=q9w3sq+e9q4uNIMFDdk1gJj2+ScZsyWxkYVau7dy/TA=; b=KMagsKOLfFPbzgx964SQu4wiIvXU9wswbfHAru6UNtCOhgMH5uiPdy5EXhfV6zW05/Lx4MboZExT+FqGUbsWDzURUU39S9bSVx6o7hJavn9l/zdMEV1+E/orGJaUbhkZUwF2yiygOY3DAxNeAI6dIdkJb5UZ+XB3ximZ0rFQ93KJANrKSchz5zo2eMLFhvC/bI4//rTRinKTZ0leHoq6c8DF5UfMOzV7Bsy1ZJ6iY6aY6R0BZkl7toF+AQk/rtLbvk9FlbxtHixCw/UMadKVet9e/0Z0JhoLAMvL5q6FTOXaylRNqwfIqqjSg5oYffgaVk+4mGRakfEYCj9WIg39JA== 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=q9w3sq+e9q4uNIMFDdk1gJj2+ScZsyWxkYVau7dy/TA=; b=o8O2w4BdHb8TNFpRNwBHHu8PKTez24erAIZyUZyDA+E6cZxoCBQCAs8nRfS0XRJpaXCf0nwJVVCIn1pT1Kl6lF/w/sjFOaR3fEDYhaiMRzrZoYnRiq0sPTV1YjTrKgzgiGM6x9Q1qIcokj+D3znhSc3VQ/ZRL6zjCG1JnJyAGymR0mI3QQg5AfQF4ssd7FwMarCTg+cDI+/u7wr6iEobmSM6Pm7VCwBJz1xmTSzdAmNEQ2IaFVbCnDm5oOV7XTj3/nSoyIWVP87lAioNgT1Z3DG9zzpQcfbqkPmF6OsBXqFOzmsxOIsRkHJz4Ijt1yOBce2DmMftFjLeAWs5c4TaLA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:26 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:26 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 13/23] nova-core: mm: Add Virtual Memory Manager Date: Wed, 18 Feb 2026 16:20:10 -0500 Message-Id: <20260218212020.800836-14-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BN9PR03CA0448.namprd03.prod.outlook.com (2603:10b6:408:113::33) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 44fb9631-0317-4ddb-8865-08de6f33ac77 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?6RrPiPSlpbb+y3B0DMIJamo3uFFhBkYXS0wM2VbOZipq+UvW6Nm9D6lLoPHl?= =?us-ascii?Q?sVpLPhzvKxdpf1ucZqeFdbaCsbthTuJv6OZsGKjuvdZjnOhpsej12eVmh1/0?= =?us-ascii?Q?fbqytXCwFYi1GdeENhxYodICChN+Yt9g5BlBIGjqhp7ntK6rx1l15Dl1sIcj?= =?us-ascii?Q?QL5L2hFKOIabGVbNvk5jK1R0REbF7fm0BVC0AeqFmymQ3iJkCIcgtXJQxpoj?= =?us-ascii?Q?mdv/lJTk6hh4lceJebBNS9vJyBNs0aDmUDDq4WRdiQS6xt2X8oEv3pBTYypL?= =?us-ascii?Q?avoCAp9C8OdmRWkugam9y7URHiycELegU2YUqFlasUJmESbUEvuyOnrdkqNp?= =?us-ascii?Q?4BfQ9ggwynpYN+Y9QN8TLNioqrd2At/k/oxqKNgDRvIErjCegqoFrGOTD1wb?= =?us-ascii?Q?wCOGyOGecPfr5rsnfGIQp0pqmVNSnZ5M+ytRfpXZekv4oV15TI7KBQyNlAWZ?= =?us-ascii?Q?ZxqQzDzU2ePv3Uhsk6Wwz7vy7u9J/Acvp6cM99ESsFY5ZlZHUNYh07+Gza9z?= =?us-ascii?Q?FC/ptXHS31GWHn6oxn0iZaqBVKrMfH0KLnvTpOsSC6k+75jCqJZUNdEXrQvZ?= =?us-ascii?Q?AEbk/8QAQd55CO0RZ3JsN1+2HdcWs5hLM+d5Rgt1moIXBZIuP8TXaH6D6/gL?= =?us-ascii?Q?UXCGrLXAVSlFhHZeNlhYPlgkPZwvsuLAWZDoM16U5Bo/BaludpRju4fUVVeK?= =?us-ascii?Q?EhU7c5qu3KRPCPiKJzDJjffMzgfjAOiUo5ayMmwueuafMrcz+yVWbOwJNw4d?= =?us-ascii?Q?ql5iK+J7DQbFRn+HpB0KCtZB+NiUKlcOJGotwJyQOzmHHLtoxsToFQdIWCyw?= =?us-ascii?Q?5pSoGxbzslWjEEmunZVWxWmuDw0Bql8ygP0zKwKUB04oaojAnkgX//W8R+3x?= =?us-ascii?Q?74qF5GUJb5KBFf0db9uuZHdyOTzZgPfMopBXhiy4WJJ1qAaFsRR6YDQRHvRi?= =?us-ascii?Q?TUfKmUJ7VVdUuARTHe/Hr/vRm/3p1tXjBllbO3gMrqEXUjEGC4W/W1wxh2CY?= =?us-ascii?Q?62HI8JFcjlvrFn5Ho+iOoxhSXQfcasEk41f8wBMTgIKOwyc0y1hJCBiAikI7?= =?us-ascii?Q?2h56ucv3jzZu+Zr385NPMWHMQV5q2UM83MmGEq7wM2YbL9gPwX2M35sl9fp4?= =?us-ascii?Q?sdJ3mF5mR/0NFsZyIe6bNjEaBWzt98MQN6SsLnLD6nwrM0L+ZAGXft/ilZrS?= =?us-ascii?Q?hfDStXJBOeeEppL+/2A3gYiMWsfUP5rAPWyrNfwag/1rb/kTLstyCUfQL5GM?= =?us-ascii?Q?oKJQM59ecXWvl3GsRJzWFUJlpN2wJY691wX3rlHAaIFNTLerdH40+csvDF+7?= =?us-ascii?Q?XA/X4USsfc/5BfXYUQQca3UuP2dzJi8Xjs0PYJyQ7BbgNbB0jL0rTiVOgIAl?= =?us-ascii?Q?YGeGrZdTr5z9+YtbVN/7A6Tx3Jes8Ffme1UlQizUALBQaIF8TjbVy5bEIMiJ?= =?us-ascii?Q?OwuXneI3EYrNqTRV4ESkBE7xXbpdtzySgGyBhZVPx939KL+/RMv6v8bTjAEQ?= =?us-ascii?Q?GwpiMqigSiHENeKtAe3VzDAJtLFyx3rh/oh4VZUHPrQz+6X4Mww29C04zFNJ?= =?us-ascii?Q?1SAKFR06FCMXmWw2fBU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?rWxXr1q9VXTFVqMjU2rHTtDhsUKVd1H/C9Upr/9rmJa+qvUjEXPFcMuh3sZG?= =?us-ascii?Q?KGUVFrb9Wb1q5hkkI8o3EpdtbmZ9DpW0TrdoIMbNtGH3Si92aHusRwnvETES?= =?us-ascii?Q?kLrGr65dRTYDkeBqibLVOx9cNtvWdaJQdLFXdsGrMiu97a20JJ5rkhMJvMg4?= =?us-ascii?Q?Mbg12wxvuGQ9iV98SXsub3UvMqxHqiwM45OXo+7+09ygR7XEmKPj2vhS7o8v?= =?us-ascii?Q?297RyXwiwGVpsucECkXXuhmnLuxVfoPoGoOihHOcWTvvAkw/6LNP6zTzbCGS?= =?us-ascii?Q?qHPvctEL9PfN/UOGNUOD/KpcIVemscG4Jw49TZjAO5eeWJidvzR6e7QxUGAx?= =?us-ascii?Q?Y899XbKCwYrLaUaff3bQ/ZulBickBiXqZxEHD9xVtbvjwHbIVfur/lQDJnzZ?= =?us-ascii?Q?9jfxVRZrikl4z/W5L9RrGdMy4aRlAJqAqnrUUqRcWmi4G3TtihpB1jR2kH3L?= =?us-ascii?Q?8q3+luui7GQ9nBsHkvchFnISyzGCiLouxDn9vzTGwBi9EvUaImr+/vr5olZZ?= =?us-ascii?Q?z4ca6KL9cC4P7j5pyqeBCdOKZW9GXzDvmKctCMCH2NfJshq6btjBsu2nVMJF?= =?us-ascii?Q?u+3A1tcpc3TAnXbsFK7ZFFtFL7jok9S/zm/QM2SuhI8YXCG0hrN5mp0qm6To?= =?us-ascii?Q?NyZ1y26VHs0By8J/ieylPkSXaxMoD+UjWrMcGfsvj2C98E3NPtxalewdgl20?= =?us-ascii?Q?G1/kPhnLsuEfKNd4NTZMfuCmEHGPOCBEsLYXOWOEoOzQfVTZllLgh567AIeZ?= =?us-ascii?Q?muCE0R+1TnBUAg+qTkUWdhi+T8I9LAR8rosN449hjIfk9hbNhFG9hcv163RM?= =?us-ascii?Q?JNFmA6DJ/1DBgtqlQygAg456rE2hPTTy7SXHx2U4rMp1E8MPx8wfjHti35CW?= =?us-ascii?Q?ceM6X58DcNKjB9zDhaD76vdjO7qAzNykqmemQp0KY2o0LiopF+/RSSp0kkDx?= =?us-ascii?Q?oOI679ywMIt9qytLTd4hCYe3w8xWdtcswWwRw96Whnlt5gCoaNo2Bz6YwcKZ?= =?us-ascii?Q?ftBzxImPFTi6vS+bqm1UJipMKDoT0/LVObExg8xI1z679hNOvmA9wv082ZYj?= =?us-ascii?Q?XliuashGjMaE5Cg9vy7Byl1NVHQSl/cQeOmNQ4Gbt7kwhEzvIZGDOd6HM2qn?= =?us-ascii?Q?l1koWA5S5N+FPuTunE8L6kGG5ubOrdJuSOOIX9n+Kb8x+MnlnDZ241M5AMKC?= =?us-ascii?Q?jfrGT/XAV3NmNvnS1q/C0ZDhiUiLXHEvzc1DiYcr51E63lX8etu+htHyUJ4y?= =?us-ascii?Q?hx0ENF3Z7+HCyB4N6xr5VKgyTezWaaFVu13OaLJ2shoF+X/X1GC1YP3I7Pil?= =?us-ascii?Q?C4pR4y/+WpoqA1w21eFVfvnoXiOIhK3Zw90lr+khlgW00tfCBE8vtCJ0p2bF?= =?us-ascii?Q?Zurj5a+Vignm/SEJoH+Z0HNRKkAm1e38QTtV+MOYO/6oDH5BP+nn07Ws3Q/4?= =?us-ascii?Q?wlmiIP+yhFxsfHWXUPRp9FGwLUQmwc11mLyHWM981is+aAOGvflq79SQlCu2?= =?us-ascii?Q?+6qFmhyAkZE1DCwGPXEZxybiCNaJRqHLx9f0wJ9W7tgDzKdCYcrmWbZ/rFRG?= =?us-ascii?Q?XX0P+XwDAJeZgnPsEr0POPfU2zD2CWUak8sSqo6ptSYV+zF/4eJD/jy61tIl?= =?us-ascii?Q?uAvJBhRX2agF8jsOOpclf2IoLjQKQucQUbgu718HFciUbyGC5/HQXAfgapcb?= =?us-ascii?Q?jjlaprsxYo1+2/CYyy889Myz3B3fWmE1hK8m0l7P2W6W/oG2AdwuiSmdlY89?= =?us-ascii?Q?w5BrvP654g=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 44fb9631-0317-4ddb-8865-08de6f33ac77 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:26.2747 (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: /HGE2GBNe89BPxiHKjY6QsGxWeIz8JiqDm4suYDu9YHCwXqbsGGUJOjv5E5g/m79ru9ujRTsPMy/K5BmuBlFaQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add the Virtual Memory Manager (VMM) infrastructure for GPU address space management. Each Vmm instance manages a single address space identified by its Page Directory Base (PDB) address, used for Channel, BAR1 and BAR2 mappings. Mapping APIs and virtual address range tracking are added in later commits. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/mod.rs | 1 + drivers/gpu/nova-core/mm/vmm.rs | 63 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/vmm.rs diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs index 471f8eb0635c..922479accba6 100644 --- a/drivers/gpu/nova-core/mm/mod.rs +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -7,6 +7,7 @@ pub(crate) mod pagetable; pub(crate) mod pramin; pub(crate) mod tlb; +pub(crate) mod vmm; =20 use kernel::{ devres::Devres, diff --git a/drivers/gpu/nova-core/mm/vmm.rs b/drivers/gpu/nova-core/mm/vmm= .rs new file mode 100644 index 000000000000..eaee707181b5 --- /dev/null +++ b/drivers/gpu/nova-core/mm/vmm.rs @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Virtual Memory Manager for NVIDIA GPU page table management. +//! +//! The [`Vmm`] provides high-level page mapping and unmapping operations = for GPU +//! virtual address spaces (Channels, BAR1, BAR2). It wraps the page table= walker +//! and handles TLB flushing after modifications. + +#![allow(dead_code)] + +use kernel::{ + gpu::buddy::AllocatedBlocks, + prelude::*, // +}; + +use crate::mm::{ + pagetable::{ + walk::{PtWalk, WalkResult}, + MmuVersion, // + }, + GpuMm, + Pfn, + Vfn, + VramAddress, // +}; + +/// Virtual Memory Manager for a GPU address space. +/// +/// Each [`Vmm`] instance manages a single address space identified by its= Page +/// Directory Base (`PDB`) address. The [`Vmm`] is used for Channel, BAR1 = and +/// BAR2 mappings. +pub(crate) struct Vmm { + pub(crate) pdb_addr: VramAddress, + pub(crate) mmu_version: MmuVersion, + /// Page table allocations required for mappings. + page_table_allocs: KVec>>, +} + +impl Vmm { + /// Create a new [`Vmm`] for the given Page Directory Base address. + pub(crate) fn new(pdb_addr: VramAddress, mmu_version: MmuVersion) -> R= esult { + // Only MMU v2 is supported for now. + if mmu_version !=3D MmuVersion::V2 { + return Err(ENOTSUPP); + } + + Ok(Self { + pdb_addr, + mmu_version, + page_table_allocs: KVec::new(), + }) + } + + /// Read the PFN for a mapped VFN if one is mapped. + pub(crate) fn read_mapping(&self, mm: &GpuMm, vfn: Vfn) -> Result> { + let walker =3D PtWalk::new(self.pdb_addr, self.mmu_version); + + match walker.walk_to_pte_lookup(mm, vfn)? { + WalkResult::Mapped { pfn, .. } =3D> Ok(Some(pfn)), + WalkResult::Unmapped { .. } | WalkResult::PageTableMissing =3D= > Ok(None), + } + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012024.outbound.protection.outlook.com [52.101.48.24]) (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 0AA243469EE; Wed, 18 Feb 2026 21:21:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449697; cv=fail; b=jGPMly/Kr0phqD41mQpKxrmok97I6ARp3gbPmG1Fs1z4brm66VTeaVNc7rDCzBzzY3yda4cH4Ux+RhCF7xgEo32eXKIDvOzCsKEnEd8lYjkGlmTwEvA8zjmmQVuMb1eQHeU1ZeYQW3b2qk4SgD81sukG0m9vGd0hDZVgvRxsqzI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449697; c=relaxed/simple; bh=L+Gbj8BWf8DB2JkBNwi44vxhWf7+XJ/RgGNT9DQigaA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=U5RUT2EdqcXewcXlrO0iAcr2yK4VJ6d+Fe4Hqb9TTEjJC6DLieIyE6sDc0HCmAeTW4CbtNuEaN72wK23GBv3HssmNDzlJr75pS1DJX7XqrXjdbR+efWSyn+fBnd6sLUZEdKJUC2KLR3VOuT01JTfFW/AR9oikI+0/RqXiFg9K5A= 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=emShInXp; arc=fail smtp.client-ip=52.101.48.24 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="emShInXp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=n25nI3YZZkBoqnbYFYVsiWejG09yoUo9wMIJA3+IdRZqniKb85e6JUHgz6PRZDGVESKOLvsq8WVIsxb+7rjQzBSJqcgOo97ZeaWd5ar2uJpgozJblGMzYNFovr0Olsd3YPfPycbSzb4U2UwjJ13fo5bh/mbCuLCRMBBg8wEAOAZg+/3Gcyw/n/ToEDGuRE/ZD0DIh5E3NWjXTXanvOM5/iWPF95Cm/EebyqmAu/czA9xrs4RQUwR80b5Dff1zYr7DLIDNPkmDw17VGGYjvv+o5toAWtZvQA0HRTipGMOTUpEeSuVBKRVcOdg1dhtaj6LXQdx2olTaw97tn2hxie8Pg== 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=sapLVutMzq2SvxQFSNN2weYf8tkRJOJ9CklDtC89Wn0=; b=Az9IZwKEuENYWbus8lm09RklvT6Oe1G+ymZcZjdtwv9ueI6uBPsbFLzmsZ4AoNwC+9ip50if2VPsy4pLewaxfMBnmZa/7TgPMxjrFE6UznVjrF6mp35hTebzj8BUkJUL+q3Kjk0BVqn8pXICQb9JnBZs7ziLCVFl6chshCW7pn1wkBagFelap/eRNK3RVztcvgip08I32RRl8BkZmDpCPoHGtYBiDtyuF4s0icuHa/D6TifDAGavGDXp4lrwiDMoCkXTVdBZp9utptajdAQZxhApuLb/qbifgRN0DGNhK+I39m1kOhZuFOzdaqhvyNb6RYCYjLS64hvP79lRj1offw== 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=sapLVutMzq2SvxQFSNN2weYf8tkRJOJ9CklDtC89Wn0=; b=emShInXpxcSeWcJ8n0FzoxLd7QmTJuncufwFzQ3qu74BNE7nWYXZKo4LdeDYrMP+pkJ6G2yVLnQ0OF1C5yemCHEiUvvH8JKVZVoFHZBhII91BSBpyWzkFAYKXghmvPWV8mZiRTVqgGNDiIcC1P71uCdxT9vX+JBe/O+lbbJx91viiF28fprM2bWmnaf47AqM341qRLHWBaW6r1Mvv2hulhskJX0tEbp5nTRGM7829BGJEIiczu0/xscwoaKDpqmbAbj1JkEpD8ukbk/lnmG7UX4fB81nTRHGPSSvHLU4Xin/pXri0MN9nuDcpN87bKRpKD/h40urw9K3u9lsNlXuZg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:28 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:28 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 14/23] nova-core: mm: Add virtual address range tracking to VMM Date: Wed, 18 Feb 2026 16:20:11 -0500 Message-Id: <20260218212020.800836-15-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BN1PR10CA0011.namprd10.prod.outlook.com (2603:10b6:408:e0::16) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: ccfbabbb-c335-4627-7236-08de6f33ad9b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?vHTPOoVgF7GotobW8BpjbX5rI/siCRC4HfAIl6dNrX7aNh/yJr0ZnadeSUMI?= =?us-ascii?Q?T6d3pyVSpGZG+brZXH6Jj8nw2/9UB359coeltCv/UKhmGVwetDQd4W48K3+u?= =?us-ascii?Q?qJalDkYG/HILjZ3bCHKE0pqRWISKKBQ9f4+z7Y++DvW5tiHqloadLpkFDLEb?= =?us-ascii?Q?kOfVAD0vOeyCkwQoLiafvlVhziCSLmc9+yavLf9DS9JA2P2WSLemv31SDP+v?= =?us-ascii?Q?HERFYt+Rd1a4/BuLH95T9GVGuNU06RwyDASQehPgIV7kPCGT8zVgXx67nqiQ?= =?us-ascii?Q?34uiRqCd46FjkvuJl32V9nPDaC4qdrBJPu7Jut6/ECM/l1UnirVr1j7rpRRI?= =?us-ascii?Q?lyOJvunN3Iib40EdcEij5wiiRIJwuJx/O7RgyDv0hMFGH+nyWfZG27rcxlGL?= =?us-ascii?Q?k9I6X7sEHdZc5IYtaIU3xqHQoWDst4SPUaY64FXpd7abeJlRnwcFcTAueaNG?= =?us-ascii?Q?7RFN7MMqBnAZVsl1+JWsfCDHlQTNpS5zQiDaLbMEhaeSx0/AfTSsnxuXSP49?= =?us-ascii?Q?HbyC4/+5XdKKzs0PvjuJWSfE9Mdn5xwblaiRxkkDPwLJeq7xwOLBRzEfZ2FN?= =?us-ascii?Q?pHpIuqicLBZy5K/ybWGdfB5jth8sNJeHU1IQNh7m99olfpELDUd4DkEcz/1/?= =?us-ascii?Q?oJjlf88yUwo1dNcAHpqJRlstk6RjElWL0rCtks6Sw7m7nM88JCrUaUL1TKSp?= =?us-ascii?Q?1Y5shT2FWbRvDz4A/0Rw70AiePLdxLXC8FUJxk+s+c1/wlWLHxv9jQ5UZ7JZ?= =?us-ascii?Q?Dejglao1bjnI4c6tyWSrw66wm681HutWw0S2C+FH3+TVB4My0ZKPBH9bYQKU?= =?us-ascii?Q?p2P0CuXtK1oQMLRgdMM0IAj5AApEFPYOfnBBcooDym1SCLP86UL3R3nnrdTg?= =?us-ascii?Q?QKDWD6zZRyYSKRxHC7Q9uGibpM8/8bfCfO0ClZbJhGz4Kdhz+/QEnNjMBn3T?= =?us-ascii?Q?mY2Yi482eQwxZG7fZlHbgqNd3MjJxdsc+tJUXJlb08gvMTyv7cDv8dI0BJkX?= =?us-ascii?Q?CNagG9uFzU55+b410qiUeVRnyHS4tJrZKKW2q5zX0YFQn4GKEL11HUW0Lips?= =?us-ascii?Q?7LqEDcGlWF1l3bLAI9R7syiu4eyguzFnXgYPaw5tKJR39iHwvy7c4ork/uzw?= =?us-ascii?Q?J2iAFj90XgZLHrIh8h8WnUq9ZIv2gv2EIzgLa+cxvTV0bNuAko0Mq+7eDfhL?= =?us-ascii?Q?EXfg9eOl8lfcuzpUlwnLJUkxQAgW/r3gogAVF3vYd5Z4ZJ1Ox2aSGZbT5cee?= =?us-ascii?Q?IW4FAA79qldlfLlhS8AKwISrBC0qlCsiEi0eD2pmNtOkUcSDgwkZlDzjvC5t?= =?us-ascii?Q?tRSiqKqTRitHsJwvX1wzOwxmdrBIt5pnvhZAwceiSIpJ0h9mY0g/gi8ypLXY?= =?us-ascii?Q?1esAY10JZ3tTce6QshpVUrFsriePFoQuqXL1YocpX0LRRJJEe7K2sEaHYOYx?= =?us-ascii?Q?DWFrBX6NyPq18txzthckrjxjCBrYoc8tn6oQPWx6N6tOEQZQXU54nKKz04i5?= =?us-ascii?Q?XR5WlICrnVlg/YLeTMH3tTRTUsuvIWlbAlrsl11dzjBcTwFKzbtau8hM5emb?= =?us-ascii?Q?zFjz6L7/TQWRIZzKzHQ=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?sWA7ibZPaCzR9mT+1ls5t1YOWsL7NA4dVHD01oqKi7dyiTnQAJvPQMi41bhM?= =?us-ascii?Q?KxE6NQdK6zTsFSbwXfHKv8QHOGjdbmaja97dzeJUfz94DTtfLei5y33v7mEs?= =?us-ascii?Q?4GKKEtxbF48q5w7avCEJHB/6L0jVPz6NbRKpwX/7S90jcEYLlTWMdRlLLmdN?= =?us-ascii?Q?UWglGmX3/W/w0ZFiKTRGMV7+v9gFH0NPGOgLg2hqx40NUqZv7wTT0TcOA/kn?= =?us-ascii?Q?a4ziP6J6tDOdt8IHvXUn0pI2gWmKC5DJWEaLDp++BYJu2TZBfGZ/IB0jLdA2?= =?us-ascii?Q?RWOfiTzhC7rAWvmOCOF2/ZnKZSATf/XoAmGMtCIBUp2mcvGOWHSz7SOb3M2K?= =?us-ascii?Q?5d4GtcOIUlU/4NqCifD4cGcv+Yqo3kunjydB/ImBzArqHh+i4TI+moSXYnB9?= =?us-ascii?Q?x1QyWBpgN1p19lntQN9L7mjr7L1zwo49MoI5qLlh8G9o56ePeJn/DgAB5KjC?= =?us-ascii?Q?V7Vr+eBJZ7Ocwj+EzZzExHqaEth2l88yeNNgSEK3o30e7f2NFZD32zzz+o97?= =?us-ascii?Q?Q96P2tBDfLAnMoPcMAfuryzjxRLQ1b5mWKyLIugQO99bBr66OekinfKmKqs2?= =?us-ascii?Q?hbS8P/nXA6+dUTswvx6N51ia3tXvS+wR6ZZCoKM3ROKjBFPvGiAUxWM5+MpV?= =?us-ascii?Q?Gk30XZwLovMurXUBvasR6a2QtSzXVKgJf7QdQfduw5w1JyTtzyvQfcJHjtXA?= =?us-ascii?Q?qHcxnkHz6HCwCP0I2UjKXyf/GCroObVaC0eg2CnneeI1lBUaEq+s2jT+CZAA?= =?us-ascii?Q?84JEvAjBobiN9m+eW75w5LeG2Ys81EIULkkZhI2QMPIFWJ41tGdrApLl8Pst?= =?us-ascii?Q?GKnr8nOEbo4FLFzakMuo7gC6tGDUjG6ig8/Wtt7Hnr2xmJdl67TaisRuz9PT?= =?us-ascii?Q?im52/qZN80aVvJLFedml8aJ0DWaCIjhCeQ0vLmAgqhepKTPvrMRZplgCTAkA?= =?us-ascii?Q?rjpOnqj1mIHo3JCCUUGQszWydojgI8jwvgK2+Aoxn0OnDykCNp1KOijnA2qF?= =?us-ascii?Q?tDoeMMySYS3O67I+85iZcmAWEg5hIH0+1l9bkuMnPkXrSSLCmhMWSBBzgPGK?= =?us-ascii?Q?QFvA13bMUV6RlX2YwRf/lIYUPSbKZAFkZCgBMyMQIYiFd2fIB7Y/XtrO9VZd?= =?us-ascii?Q?piODli5TLA2v5Q38q0gjs9SS9awD78Ccq/C/dk8cQgNSOBPvYPhF1gmnxP6q?= =?us-ascii?Q?etiWa4A0HSIUTfKVwX9lcX9cM0XQlLxeO3F9NRjUrdxGx/kYbPRB+C2jEfA6?= =?us-ascii?Q?QuWEVf9p10gDfxpNk1E0CSAaQMGjPGu5Z4zLXtNdBKx0I+Cw0a7zRJNeZgbb?= =?us-ascii?Q?ndV7xafoHMWdDVmPpCcsisnaXM4vpocVGWCohEWpcAJcAARHXMn1oO96dl/e?= =?us-ascii?Q?Ql1XweMcHhLZLSbp5Q1cp9O38TPr98W71a32ZWS1YsHlEDxzo6MW9jd+ZPwJ?= =?us-ascii?Q?zqRSCYf4iKTEngKYA6yUWVxF6S0I3YJg1LdXMwQwD8C6yM3sRn3ZGHUm+6RH?= =?us-ascii?Q?gorNmKoATcP2Jdq2srIy1Nu9WSQnHjr2KWuJENi+Mt7UYIeLuDnY5nmgalGp?= =?us-ascii?Q?YVnD7A4NlRC7EEIdF67XafqkAKeygtt0eGlxg7uAUyFLYlrEbtOAX4dglnTo?= =?us-ascii?Q?rn2yLEZ1ekczmEnVYUroEjqS2LTl1R+odjyO+G8/2hxItkKN8/iIMt65o1S6?= =?us-ascii?Q?umAiB4j67016nfU38gVw0CvFHR5vLxwz+c4RHk9CrPiK+EMF3w9iCXcCpolX?= =?us-ascii?Q?6nX7TyPqsw=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ccfbabbb-c335-4627-7236-08de6f33ad9b X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:28.1519 (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: 3u2KaDmy0uFt/ERv7XBtxgxTmUOJ4X3/yr7ZgXbY+UbWUCMFF16rCNnRI8jazZa0e4nXRBrnXfHAKT+WrxhfKA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add virtual address range tracking to the VMM using a buddy allocator. This enables contiguous virtual address range allocation for mappings. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/vmm.rs | 75 +++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/nova-core/mm/vmm.rs b/drivers/gpu/nova-core/mm/vmm= .rs index eaee707181b5..9e57916017ed 100644 --- a/drivers/gpu/nova-core/mm/vmm.rs +++ b/drivers/gpu/nova-core/mm/vmm.rs @@ -9,10 +9,19 @@ #![allow(dead_code)] =20 use kernel::{ - gpu::buddy::AllocatedBlocks, - prelude::*, // + gpu::buddy::{ + AllocatedBlocks, + BuddyFlags, + GpuBuddy, + GpuBuddyAllocParams, + GpuBuddyParams, // + }, + prelude::*, + sizes::SZ_4K, // }; =20 +use core::ops::Range; + use crate::mm::{ pagetable::{ walk::{PtWalk, WalkResult}, @@ -21,7 +30,8 @@ GpuMm, Pfn, Vfn, - VramAddress, // + VramAddress, + PAGE_SIZE, // }; =20 /// Virtual Memory Manager for a GPU address space. @@ -34,23 +44,80 @@ pub(crate) struct Vmm { pub(crate) mmu_version: MmuVersion, /// Page table allocations required for mappings. page_table_allocs: KVec>>, + /// Buddy allocator for virtual address range tracking. + virt_buddy: GpuBuddy, } =20 impl Vmm { /// Create a new [`Vmm`] for the given Page Directory Base address. - pub(crate) fn new(pdb_addr: VramAddress, mmu_version: MmuVersion) -> R= esult { + /// The [`Vmm`] will manage a virtual address space of `va_size` bytes. + pub(crate) fn new( + pdb_addr: VramAddress, + mmu_version: MmuVersion, + va_size: u64, + ) -> Result { // Only MMU v2 is supported for now. if mmu_version !=3D MmuVersion::V2 { return Err(ENOTSUPP); } =20 + let virt_buddy =3D GpuBuddy::new(GpuBuddyParams { + base_offset_bytes: 0, + physical_memory_size_bytes: va_size, + chunk_size_bytes: SZ_4K as u64, + })?; + Ok(Self { pdb_addr, mmu_version, page_table_allocs: KVec::new(), + virt_buddy, }) } =20 + /// Allocate a contiguous virtual frame number range. + /// + /// # Arguments + /// - `num_pages`: Number of pages to allocate. + /// - `va_range`: `None` =3D allocate anywhere, + /// `Some(range)` =3D constrain allocation to the given = range. + pub(crate) fn alloc_vfn_range( + &self, + num_pages: usize, + va_range: Option>, + ) -> Result<(Vfn, Pin>)> { + let size_bytes =3D (num_pages as u64) + .checked_mul(PAGE_SIZE as u64) + .ok_or(EOVERFLOW)?; + + let (start, end) =3D match va_range { + Some(r) =3D> { + let range_size =3D r.end.checked_sub(r.start).ok_or(EOVERF= LOW)?; + if range_size !=3D size_bytes { + return Err(EINVAL); + } + (r.start, r.end) + } + None =3D> (0, 0), + }; + + let params =3D GpuBuddyAllocParams { + start_range_address: start, + end_range_address: end, + size_bytes, + min_block_size_bytes: SZ_4K as u64, + buddy_flags: BuddyFlags::try_new(BuddyFlags::CONTIGUOUS_ALLOCA= TION)?, + }; + + let alloc =3D KBox::pin_init(self.virt_buddy.alloc_blocks(¶ms)= , GFP_KERNEL)?; + + // Get the starting offset of the first block (only block as range= is contiguous). + let offset =3D alloc.iter().next().ok_or(ENOMEM)?.offset(); + let vfn =3D Vfn::new(offset / PAGE_SIZE as u64); + + Ok((vfn, alloc)) + } + /// Read the PFN for a mapped VFN if one is mapped. pub(crate) fn read_mapping(&self, mm: &GpuMm, vfn: Vfn) -> Result> { let walker =3D PtWalk::new(self.pdb_addr, self.mmu_version); --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 2CB1634A3DC; Wed, 18 Feb 2026 21:21:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449698; cv=fail; b=tIXTd2exBQ1Gv7XdGOicqHQXvJ9AEeqiJZ2t030DQp3l5BwmXdo4JRND0JdRcooMA3gzI9VDHlCya1e+nkIRYv+kbTfn17VA2UWBIHdNa2g5DW9sw9CsYPd/KMMzc/tkbzfg49VLzP22KZ6+m7Qxw2IFX0tnUIDsq+ZzH8+Xpvg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449698; c=relaxed/simple; bh=jXtaGJ9yRrY65nHhfNs83lHP77oSTPXE4WG9MGAeFlc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=MTaTW5nXjFVJo57R4MA8pwCz/LojzQIrKbeojSVddA+dzS+qgXjvMYmtPOFT0MQxpY/f6lZ1ibxVzCQWOzA24RohI2SWJTccQwXOv60leYW+Jk6qkDfcA2tuE0Ev1bd+sTSAHASP/LSFiF0OEvgcNt9Vrq4SLnOxuKwrXRun7eg= 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=bYORAKuk; arc=fail smtp.client-ip=40.93.196.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="bYORAKuk" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HQ9R1AqPfGFz2FZveAkYp6IX0geO5l9hfIfNNJLWhmtWNkUx/1VphLdMMVsokchOdG7ST57XnxMWGKzLmWiDih7Whz6glaRP34T2cytRLnsJaYKsAwvUcRxizZ4KqLY14RIlDwsVFqK6UVO0WmU828xuKQrVX7eODlW0Ur7oXYnk8Yp0JVmRTttLfhd1i30BraCVBNeb9rahvFulIFbEu5e6KkRLtHUnoqpcEoQ+fwVP9HuZAOl9TQtvZxaeZaYvHzhMFgZGCqtubDprwQnZ5ozEKAICPabU98h5r6kPoFxYeKX0Y+bY/MBW4UyvpQKhO2WBEaqUgLm+VOZgkS/7WQ== 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=MorntlvmBNvZvd7EY4OZ6Xqbpuv2TxYxtWGLHOSQlDY=; b=ASOzEtyrDX2/L8LPOqQxiKnoO2AEr9fH/1pHq38MvNlMw+byDmoaFYXN0IHdHWcDOtWiqzIGHO/bHl/85A27T43wt2BoMs+pKw18YWlZUSIjKjMgylZkL9gGXO4BokRfuKt6DluhJqZ9AiQPlKY6ISSzkxazBkknUAYoufb2VST6wWAe3/u6XYfPonwL0I8Uq5k2aiItrzdOes/8PfYWhrAu6lEuLv4TszuFdnG0I41RHp5li8lGynGlVV2WkIu8rdmz2NVfcOFQS+CTx8sarQuyQlzFk+PqR2KESxhVV2vCr31bg8tZiBD8VTJ/8ls+4wWgjhWDNjVqiWnQwaD8zQ== 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=MorntlvmBNvZvd7EY4OZ6Xqbpuv2TxYxtWGLHOSQlDY=; b=bYORAKukV7C1lPDzSBmneJPzIKyIOSKN/G/Ddifh35md6kJoMipyE3BCB0heBp4eTYK87Itjt4bs3xmZZ5V0cqBQ6wr6NHrBidaWrv6/zqQtJQbyEtKAYhKKkD7rekBbGycUpAjILmmgfMsQdDTnbVv8LgiRgUsQjGWVA/AYURVEHGJRsRJTYFMSC63H+fCCBJwWL2ZpSGE3hfokIeRS5vDDcDg0oXxbR8pMME0Y6dAmX0g2ywTDJhetL/M/BNmD+3/815wbXhso/zZW2VbjaHx2z9OVx9Kno9/J66XU9Pj4KC3vaPgMM96wxJAkrlwy4vCwOelBSaa5BXAxza4j7Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:29 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:29 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 15/23] nova-core: mm: Add multi-page mapping API to VMM Date: Wed, 18 Feb 2026 16:20:12 -0500 Message-Id: <20260218212020.800836-16-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BN9PR03CA0119.namprd03.prod.outlook.com (2603:10b6:408:fd::34) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 8603d7a5-da0d-497e-c7e8-08de6f33ae85 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?VAbM8QhY+m743NB5pDIK6ianabnuwBas4DOvrxxwJ6GRF7CMMZ4mto1yHODf?= =?us-ascii?Q?P3cyMHYfZALY+7Noo3IPrkSQpSTKxxK7GntpmLZQlyrHZlRxPnTs2ZWjU5Ng?= =?us-ascii?Q?7TxqWN2SQWaPV4tFX5hGHtCUtEV+di0SgJbM5z1wg8KWqCnf2teXbVFwu+LG?= =?us-ascii?Q?9BLWqAhgHYPPFmkAe3wGom3WmDMJ3cPFgxRxBUuMN6IiG3RfPNdhlB5A7P8K?= =?us-ascii?Q?DqvMY+bIVBdLjdkvOyHR4DG3cMAbClJb7WgauKjasbcDiCpcFqxjKFgsnuwL?= =?us-ascii?Q?vvq/GaglK0CcqjFwDPa177xJapHpWUeotJE0szBG8fJDBFQuzdITHHj4ix6M?= =?us-ascii?Q?MvVIndecS/EoBCA14K8IhmMJcmvEBlx78uF8gnI8RdPY68oXuE2A9dd+N2Zd?= =?us-ascii?Q?JihuvXH+Jxjry/HbAVuvrLhexB7QrRzeNn48Ayn75q4wMV3yIXYmfE5xj1jw?= =?us-ascii?Q?g5cfF5+S1AFiAVwtj+Zpu7Hrvb0OOahywgT54eX6dTmzN851UQSfRN6kQEdg?= =?us-ascii?Q?2KBZVMmVOTIDzSSAdbJfh6Sglbf2Dg5+ALtz++WgvmaJd8K4K3dJf5L+pohQ?= =?us-ascii?Q?/ZHw/FpsObh1QKzeX6c1nK3yrnhZ9YooclksIUSZU0T1F2WtZEql8pCe84Jq?= =?us-ascii?Q?sJRfx8v2iI/iOS33QRyjiuyCaYzgbVgyyBa9EWCn6vgbFTBDHnXUoYyP2ycI?= =?us-ascii?Q?K9GUq8e23X4mRP+cRXNHaiyn5jYkWjNweiBgoq2A6ABv9/ZItCNFL4HhPYiY?= =?us-ascii?Q?8WvCdYTGKUcbOfsgPpIO6cEQPRk6Av4rXhIDo8DcTOB2/2K94nsndfN6Jrbu?= =?us-ascii?Q?HzsgiNqtprQMR1VWlXdXHxsXsSxwD+NMAGImZ0v0KFHgGzhOoD8Zyg7apy4H?= =?us-ascii?Q?fO6+hVeNYCdeVIEN1utlRePEAS+4kmInSf3L3NhaAzVgcstPCkXQitek/tQa?= =?us-ascii?Q?9+MzrmabcNtU1+5a5xNLYpvjKicJSqLXOGs9VwaPrExUxP2r8WDrq3gWUNNX?= =?us-ascii?Q?7D35w5f/azBPISLlx2mgmM7bAgVF0ayCDMs27d5GK6gnycLmg+XI317nvmpm?= =?us-ascii?Q?jImuyxZHNeY/0QCGfWryDW3V1AGPMLO4UaUdDLnMffWdmXeKC+h/ibbL5Y3j?= =?us-ascii?Q?wrLBb9ESXXIljK5g38UAdZnxSZZ6DPccHN7S610ENi0U5xQ2p5utfq1xxdcq?= =?us-ascii?Q?6K8MPammpaF8qib5CpPkuN2CVfVH+DzSOjFY1+MAEMnCxEaK8L0hrCPh412T?= =?us-ascii?Q?YScsY1Ofx6UzG9iRP9ABwCSopDN4dPS49fjg7M33h5sZsUQSldEEcXtSXmJg?= =?us-ascii?Q?IoVyvnWOm0oDflhg0jbJMY2uXNcJ+kCft2tcNFUQkPINS23KXk5zBUoYtWKz?= =?us-ascii?Q?vlLC8c08lgsPNxxxkoOhXHdq/c/iUsEJijvU61fQmyTp6aUTaI4MgPSNA9ku?= =?us-ascii?Q?eBR+LB0zZ0SgDo+l7CplJRnj3SFf5+Y/ZPQQT45qQBzJ1sLLJ+yuu96216th?= =?us-ascii?Q?jJWDVwxuMummvQs2gaXH7QlPOTHkFvBcNmKUxTgwM293ybmJX9WKNwi9mL3a?= =?us-ascii?Q?gQBsX0+Kj01frRvHTRk=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?nVVPWXbYvti43vXNIPyoQ3F6lLDf+66+APASPkCkOejY7yHsv/q4HRIxj3kl?= =?us-ascii?Q?NUUQadfjHBQTUYX/7Dg0s7cTpjXDQF4cSf7oxQkOl8/A8+9zolnB/CEIjRcZ?= =?us-ascii?Q?6xSvSHotiHuu3l5WzeWV59kXzUs9iipzwzu0tmRavEaMRiJUV1Wpgbn6TfVL?= =?us-ascii?Q?xRtaaX0VKS0+mHwPOLMFdXn1aRld2csap+EzdLdluUwpMQSAhORDsQOc0ewM?= =?us-ascii?Q?CMTk2TGrvHZRXTrIDYn53kx19SMhkmDW3g0bwqRCQD9RIViUrDxxYfEYEJl5?= =?us-ascii?Q?cGRUQdsWDyvsYrhbH7qVC0xk4mpyFScOTiVlIIp8975c72ntugR01JgeV7gO?= =?us-ascii?Q?b73EGrPHoWu8uje5RKKtl32Qzj7t3YUkX3PGA0D8rY0/DKqRQ1Vq5vKeJ9bh?= =?us-ascii?Q?gMOvSlhXWoTBGolBrCd37qpqPib0cQ5SGmVh0oKHuKNPlzmQvLx3Zl8UeiG5?= =?us-ascii?Q?mdeO3fm0a9d/7CipUBJPttmLXUfbACKgfCZuqRHS+oAIkgr4RGbG0uUtkrP+?= =?us-ascii?Q?0YsFV7EO+3yqGRTnPdynt2EKDBg6gnUTVqL4cPecoMdR6NYpm8aq/a37WW9B?= =?us-ascii?Q?3XNwCHs2400+UdkkucRFSYuTGKEtVej+AxOcosKgigh97fs6fIDiUMkQvLSJ?= =?us-ascii?Q?PR2civZqQLAy1XnvLy+DhsxgpJS6tFkJJwqPRk5o6RE9Y7b4y3gsIhaKvDDM?= =?us-ascii?Q?Oh2HgqeemwRWhZUB7Rzj7DeM+ohrUKS5zqY60cmu/fPKmfRgEu+6BSFTkPCh?= =?us-ascii?Q?ay8+ZQkWw3fABt0BWNQS0NDOfBb9Cly5Hb6IcpcF6me9Dm1n5JxN6B1pInRB?= =?us-ascii?Q?742TuEoRXM4YBCrJLTMtt17xJSmi8jrMslf/fOufUzpoRsJjWcBPdw/pKMS2?= =?us-ascii?Q?7Xm4Twoyu1TAbKRlqM7uYmJC7iv8lf/yfJY10YVYcLCMBrp3JH24gugAMXPX?= =?us-ascii?Q?eCwfLs9frRa/n1cYg6gxX4RbVJM4TKIDAtYxy4Mz1k2V96ehx5hA9hfV0gX7?= =?us-ascii?Q?sIlqEKF3gdEfDP2X6yaxawOwMW9p0FQtgaJJLpH8epuzVgusXPsi4O3qjlpr?= =?us-ascii?Q?OU4HS/hkSvTyg08fsmIVBsCoTihhsVOo0zV5dBHdaPoRGiRCqtijotBTpF4t?= =?us-ascii?Q?Sb3sitzj8eO8nRMVy1zyPEZhqHFypkVlqc3CkdrWLUGW+CGRmJD+0NQJBlhP?= =?us-ascii?Q?fc0+TyMmGJulZWOYrQjXQmbBep5Sh43oXxfci0bMNgznbWCqlLKfJaFnuZCq?= =?us-ascii?Q?tiGJi2Ab05GHKRRbG2CLF73p7PQwxGUVLlkJVrIwSFGYmS1SxaiIlTMW8nhS?= =?us-ascii?Q?FdRp9VdJvYBYG+dVaDeNao7aBHrL5XZsgK+TeQ6C//mlOkG3k1AcQlRXdwif?= =?us-ascii?Q?OnDFjuQ9rG6m/0WBwLvY/ce9lzbg6F+J+MIMt7eqlbkBuRuP6vVGKVdbb8tx?= =?us-ascii?Q?hsPaALiJsW8MTWTuWTGD13EXIRvBWIywcsJSmnLMLSry24RyDGu4ZiyGbw5u?= =?us-ascii?Q?JImhaxFb+jUpFw/uGDt7TYzHjYF0j3n30L2ph7m7cdy6XdFXTOfV3uxuZn//?= =?us-ascii?Q?mljDtPgUTitq4Vr0uK6GMpXBGEOC9WPMtujV7k+jLSl4ZhhQT4xbkckZYcqY?= =?us-ascii?Q?wLJ8lZQf6wz3yXqYU1kA/5ys86rzJoAKSsK0uPqbpfftUegJ7yU4CrR3MRmE?= =?us-ascii?Q?Nlbvn6UyXhbXraWWf0Jg6JC1O4RXlF3MOAyZ9LCtYyvc4C2rkLZtNgvealgz?= =?us-ascii?Q?3rr+pdDhdQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8603d7a5-da0d-497e-c7e8-08de6f33ae85 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:29.7208 (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: le028PspiDZRWDXoLjWvde41tl0SaEbhswmaZVuqyMnaZK8sbypgNEOcfcHVqvGZ5K3T8y3+BTCE7XL/QO7p+Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add the page table mapping and unmapping API to the Virtual Memory Manager, implementing a two-phase prepare/execute model suitable for use both inside and outside the DMA fence signalling critical path. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/mm/vmm.rs | 347 +++++++++++++++++++++++++++++++- 1 file changed, 345 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/mm/vmm.rs b/drivers/gpu/nova-core/mm/vmm= .rs index 9e57916017ed..af3daccbf958 100644 --- a/drivers/gpu/nova-core/mm/vmm.rs +++ b/drivers/gpu/nova-core/mm/vmm.rs @@ -17,15 +17,25 @@ GpuBuddyParams, // }, prelude::*, + rbtree::{RBTree, RBTreeNode}, sizes::SZ_4K, // }; =20 +use core::cell::Cell; use core::ops::Range; =20 use crate::mm::{ pagetable::{ - walk::{PtWalk, WalkResult}, - MmuVersion, // + walk::{ + PtWalk, + WalkPdeResult, + WalkResult, // + }, + DualPde, + MmuVersion, + PageTableLevel, + Pde, + Pte, // }, GpuMm, Pfn, @@ -46,6 +56,74 @@ pub(crate) struct Vmm { page_table_allocs: KVec>>, /// Buddy allocator for virtual address range tracking. virt_buddy: GpuBuddy, + /// Prepared PT pages pending PDE installation, keyed by `install_addr= `. + /// + /// Populated by `Vmm` mapping prepare phase and drained in the execut= e phase. + /// Shared by all pending maps in the `Vmm`, thus preventing races whe= re 2 + /// maps might be trying to install the same page table/directory entr= y pointer. + pt_pages: RBTree, +} + +/// A pre-allocated and zeroed page table page. +/// +/// Created during the mapping prepare phase and consumed during the mappi= ng execute phase. +/// Stored in an [`RBTree`] keyed by the PDE slot address (`install_addr`). +struct PreparedPtPage { + /// The allocated and zeroed page table page. + alloc: Pin>, + /// Page table level -- needed to determine if this PT page is for a d= ual PDE. + level: PageTableLevel, +} + +/// Multi-page prepared mapping -- VA range allocated, ready for execute. +/// +/// Produced by [`Vmm::prepare_map()`], consumed by [`Vmm::execute_map()`]. +/// The struct owns the VA space allocation between prepare and execute ph= ases. +pub(crate) struct PreparedMapping { + vfn_start: Vfn, + num_pages: usize, + vfn_alloc: Pin>, +} + +/// Result of a mapping operation -- tracks the active mapped range. +/// +/// Returned by [`Vmm::execute_map()`] and [`Vmm::map_pages()`]. +/// Owns the VA allocation; the VA range is freed when this is dropped. +/// Callers must call [`Vmm::unmap_pages()`] before dropping to invalidate +/// PTEs (dropping only frees the VA range, not the PTE entries). +pub(crate) struct MappedRange { + pub(crate) vfn_start: Vfn, + pub(crate) num_pages: usize, + /// VA allocation -- freed when [`MappedRange`] is dropped. + _vfn_alloc: Pin>, + /// Logs a warning if dropped without unmapping. + _drop_guard: MustUnmapGuard, +} + +/// Guard that logs a warning once if a [`MappedRange`] is dropped without +/// calling [`Vmm::unmap_pages()`]. +struct MustUnmapGuard { + armed: Cell, +} + +impl MustUnmapGuard { + const fn new() -> Self { + Self { + armed: Cell::new(true), + } + } + + fn disarm(&self) { + self.armed.set(false); + } +} + +impl Drop for MustUnmapGuard { + fn drop(&mut self) { + if self.armed.get() { + kernel::pr_warn_once!("MappedRange dropped without calling unm= ap_pages()\n"); + } + } } =20 impl Vmm { @@ -72,6 +150,7 @@ pub(crate) fn new( mmu_version, page_table_allocs: KVec::new(), virt_buddy, + pt_pages: RBTree::new(), }) } =20 @@ -127,4 +206,268 @@ pub(crate) fn read_mapping(&self, mm: &GpuMm, vfn: Vf= n) -> Result> { WalkResult::Unmapped { .. } | WalkResult::PageTableMissing =3D= > Ok(None), } } + + /// Allocate and zero a physical page table page for a specific PDE sl= ot. + /// Called during the map prepare phase. + fn alloc_and_zero_page_table( + &mut self, + mm: &GpuMm, + level: PageTableLevel, + ) -> Result { + let params =3D GpuBuddyAllocParams { + start_range_address: 0, + end_range_address: 0, + size_bytes: SZ_4K as u64, + min_block_size_bytes: SZ_4K as u64, + buddy_flags: BuddyFlags::try_new(0)?, + }; + let blocks =3D KBox::pin_init(mm.buddy().alloc_blocks(¶ms), GF= P_KERNEL)?; + + // Get page's VRAM address from the allocation. + let page_vram =3D VramAddress::new(blocks.iter().next().ok_or(ENOM= EM)?.offset()); + + // Zero via PRAMIN. + let mut window =3D mm.pramin().window()?; + let base =3D page_vram.raw(); + for off in (0..PAGE_SIZE).step_by(8) { + window.try_write64(base + off, 0)?; + } + + Ok(PreparedPtPage { + alloc: blocks, + level, + }) + } + + /// Ensure all intermediate page table pages are prepared for a [`Vfn`= ]. Just + /// finds out which PDE pages are missing, allocates pages for them, a= nd defers + /// installation to the execute phase. + /// + /// PRAMIN is released before each allocation and re-acquired after. M= emory + /// allocations outside of holding this lock to prevent deadlocks with= fence signalling + /// critical path. + fn ensure_pte_path(&mut self, mm: &GpuMm, vfn: Vfn) -> Result { + let walker =3D PtWalk::new(self.pdb_addr, self.mmu_version); + let max_iter =3D 2 * self.mmu_version.pde_level_count(); + + // Keep looping until all PDE levels are resolved. + for _ in 0..max_iter { + let mut window =3D mm.pramin().window()?; + + // Walk PDE levels. The closure checks self.pt_pages for prepa= red-but-uninstalled + // pages, letting the walker continue through them as if they = were installed in HW. + // The walker keeps calling the closure to get these "prepared= but not installed" pages. + let result =3D walker.walk_pde_levels(&mut window, vfn, |insta= ll_addr| { + self.pt_pages + .get(&install_addr) + .and_then(|p| Some(VramAddress::new(p.alloc.iter().nex= t()?.offset()))) + })?; + + match result { + WalkPdeResult::Complete { .. } =3D> { + // All PDE levels resolved. + return Ok(()); + } + WalkPdeResult::Missing { + install_addr, + level, + } =3D> { + // Drop PRAMIN before allocation. + drop(window); + let page =3D self.alloc_and_zero_page_table(mm, level)= ?; + let node =3D RBTreeNode::new(install_addr, page, GFP_K= ERNEL)?; + let old =3D self.pt_pages.insert(node); + if old.is_some() { + kernel::pr_warn_once!( + "VMM: duplicate install_addr in pt_pages (inte= rnal consistency error)\n" + ); + return Err(EIO); + } + // Loop: re-acquire PRAMIN and re-walk from root. + } + } + } + + Err(EIO) + } + + /// Prepare resources for mapping `num_pages` pages. + /// + /// Allocates a contiguous VA range, then walks the hierarchy per-VFN = to prepare pages + /// for all missing PDEs. Returns a [`PreparedMapping`] with the VA al= location. + /// + /// If `va_range` is not `None`, the VA range is constrained to the gi= ven range. Safe + /// to call outside the fence signalling critical path. + pub(crate) fn prepare_map( + &mut self, + mm: &GpuMm, + num_pages: usize, + va_range: Option>, + ) -> Result { + if num_pages =3D=3D 0 { + return Err(EINVAL); + } + + // Pre-reserve so execute_map() can use push_within_capacity (no a= lloc in + // fence signalling critical path). + // Upper bound on page table pages needed for the full tree (PTE p= ages + PDE + // pages at all levels). + let pt_upper_bound =3D self.mmu_version.pt_pages_upper_bound(num_p= ages); + self.page_table_allocs.reserve(pt_upper_bound, GFP_KERNEL)?; + + // Allocate contiguous VA range. + let (vfn_start, vfn_alloc) =3D self.alloc_vfn_range(num_pages, va_= range)?; + + // Walk the hierarchy per-VFN to prepare pages for all missing PDE= s. + for i in 0..num_pages { + let vfn =3D Vfn::new(vfn_start.raw() + i as u64); + self.ensure_pte_path(mm, vfn)?; + } + + Ok(PreparedMapping { + vfn_start, + num_pages, + vfn_alloc, + }) + } + + /// Execute a prepared multi-page mapping. + /// + /// Drain prepared PT pages and install PDEs followed by single TLB fl= ush. + pub(crate) fn execute_map( + &mut self, + mm: &GpuMm, + prepared: PreparedMapping, + pfns: &[Pfn], + writable: bool, + ) -> Result { + if pfns.len() !=3D prepared.num_pages { + return Err(EINVAL); + } + + let PreparedMapping { + vfn_start, + num_pages, + vfn_alloc, + } =3D prepared; + + let walker =3D PtWalk::new(self.pdb_addr, self.mmu_version); + let mut window =3D mm.pramin().window()?; + + // First, drain self.pt_pages, install all pending PDEs. + let mut cursor =3D self.pt_pages.cursor_front_mut(); + while let Some(c) =3D cursor { + let (next, node) =3D c.remove_current(); + let (install_addr, page) =3D node.to_key_value(); + let page_vram =3D VramAddress::new(page.alloc.iter().next().ok= _or(ENOMEM)?.offset()); + + if page.level =3D=3D self.mmu_version.dual_pde_level() { + let new_dpde =3D DualPde::new_small(self.mmu_version, Pfn:= :from(page_vram)); + new_dpde.write(&mut window, install_addr)?; + } else { + let new_pde =3D Pde::new_vram(self.mmu_version, Pfn::from(= page_vram)); + new_pde.write(&mut window, install_addr)?; + } + + // Track the allocated pages in the `Vmm`. + self.page_table_allocs + .push_within_capacity(page.alloc) + .map_err(|_| ENOMEM)?; + + cursor =3D next; + } + + // Next, write PTEs (all PDEs now installed in HW). + for (i, &pfn) in pfns.iter().enumerate() { + let vfn =3D Vfn::new(vfn_start.raw() + i as u64); + let result =3D walker.walk_to_pte_lookup_with_window(&mut wind= ow, vfn)?; + + match result { + WalkResult::Unmapped { pte_addr } | WalkResult::Mapped { p= te_addr, .. } =3D> { + let pte =3D Pte::new_vram(self.mmu_version, pfn, writa= ble); + pte.write(&mut window, pte_addr)?; + } + WalkResult::PageTableMissing =3D> { + kernel::pr_warn_once!("VMM: page table missing for VFN= {vfn:?}\n"); + return Err(EIO); + } + } + } + + drop(window); + + // Finally, flush the TLB. + mm.tlb().flush(self.pdb_addr)?; + + Ok(MappedRange { + vfn_start, + num_pages, + _vfn_alloc: vfn_alloc, + _drop_guard: MustUnmapGuard::new(), + }) + } + + /// Map pages doing prepare and execute in the same call. + /// + /// This is a convenience wrapper for callers outside the fence signal= ling critical + /// path (e.g., BAR mappings). For DRM usecases, [`Vmm::prepare_map()`= ] and + /// [`Vmm::execute_map()`] will be called separately. + pub(crate) fn map_pages( + &mut self, + mm: &GpuMm, + pfns: &[Pfn], + va_range: Option>, + writable: bool, + ) -> Result { + if pfns.is_empty() { + return Err(EINVAL); + } + + // Check if provided VA range is sufficient (if provided). + if let Some(ref range) =3D va_range { + let required =3D pfns.len().checked_mul(PAGE_SIZE).ok_or(EOVER= FLOW)? as u64; + let available =3D range.end.checked_sub(range.start).ok_or(EIN= VAL)?; + if available < required { + return Err(EINVAL); + } + } + + let prepared =3D self.prepare_map(mm, pfns.len(), va_range)?; + self.execute_map(mm, prepared, pfns, writable) + } + + /// Unmap all pages in a [`MappedRange`] with a single TLB flush. + /// + /// Takes the range by value (consumes it), then invalidates PTEs for = the range, + /// flushes the TLB, then drops the range (freeing the VA). PRAMIN loc= k is held. + pub(crate) fn unmap_pages(&mut self, mm: &GpuMm, range: MappedRange) -= > Result { + let walker =3D PtWalk::new(self.pdb_addr, self.mmu_version); + let invalid_pte =3D Pte::invalid(self.mmu_version); + + let mut window =3D mm.pramin().window()?; + for i in 0..range.num_pages { + let vfn =3D Vfn::new(range.vfn_start.raw() + i as u64); + let result =3D walker.walk_to_pte_lookup_with_window(&mut wind= ow, vfn)?; + + match result { + WalkResult::Mapped { pte_addr, .. } | WalkResult::Unmapped= { pte_addr } =3D> { + invalid_pte.write(&mut window, pte_addr)?; + } + WalkResult::PageTableMissing =3D> { + continue; + } + } + } + drop(window); + + mm.tlb().flush(self.pdb_addr)?; + + // TODO: Internal page table pages (PDE, PTE pages) are still kept= around. + // This is by design as repeated maps/unmaps will be fast. As a fu= ture TODO, + // we can add a reclaimer here to reclaim if VRAM is short. For no= w, the PT + // pages are dropped once the `Vmm` is dropped. + + range._drop_guard.disarm(); // Unmap complete, Ok to drop MappedRa= nge. + Ok(()) + } } --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012024.outbound.protection.outlook.com [52.101.48.24]) (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 B8E8532E15B; Wed, 18 Feb 2026 21:21:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449699; cv=fail; b=nnT/JwCun2RcmJEhYLzrRV5pfmSpgrMxWEcEPXKfpYypsOx7Hw/M7lZ9A6eQjCblrYqi85LhTe2rqfB3wo6b28uRRX9btDQXDQ5Ni1+sMyIjMMD2T44TdJkVPvjcASG4woSX62v5DDALuRTWG73u8dgWWAAyhMWiLplKnwyJ0fI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449699; c=relaxed/simple; bh=bFzPbbykP6u7veIfOY/1iPO87uuWxJHi0b7kPEBOvMQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=p+GpAvdbhzf+bcIq+9abCudYt5FwYolHbtGJMLXSOVHLLTC+AZXNEPPXi1cPqwdHUlz1x6HJtkpLf1M6ijh6TUTkc9jSTU4R4qFQeH13AnDu+viac2eUn4kRwivgdZBmc5DYyDNN0bJpYHg84Le4IH7dLigmTWgH4hE5Hc9UUpA= 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=Cg7iESfs; arc=fail smtp.client-ip=52.101.48.24 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="Cg7iESfs" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iDiCnHySxxcmHj5/z958JsR1QeLcvL4SnWY6b4bARI7YuEVW+0VBKz/JCt+sLg5geKxNC6It4VJmRwcrzjkyAVIqgbhiRB/o4T/M9Gyqdyu/mTr5kU2zvT7HoFdPNI/3HoaugPRMa+fgGIGVPGDQCLweS58tFfW5W8jN/cyJpOA3aQKE7xIoFsOwQd9603Cgnqa99hRuwkHasWYaqWByku1uty/dQfZl2iuHoepgFnLcpzH4q/KpDbnyEvbw88w+LeXgj8v40Sim/T3bskQHiY+XpK3eaBLLF0T3sVI4d/14RhyNb4AclDS0WOJyWt24PYKsTNmn85Z73VJ0iFfKwg== 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=EeQboGh8FJctxuyudhM6gkREmCQ+bZRxn8LqSDnxHbM=; b=I2deohwSAnMl7MAg1SZo33l3sMX2jWwXCD+bwiflVyzH5jWhR4DcB2jJZV+ZSRLa7yfiKObiWJICeO721+RVHqSqs8CGCVJ/0ghbm3MEfgbT2AbQuMK3SsUgHvyVQHQE5oTZ/cl8rfP5+ODdjKgeUePnYB5aJBRX4H7rPNJn5Zv2cTtoMGUOuPqsqypt1LBvKD1u2SqBwGm94B5Ku3uQLmddCD6psd/u5t2f6xXOhkK9chuh0reab2YPyZImkfiw6GT+GvG+uJiAJSB5LN4+QybDHnmLo11G0heQU+axJDnBgXslW2d7DxJQb0LY6Xm/Nm6nJGubhZfsLQWPxetNSQ== 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=EeQboGh8FJctxuyudhM6gkREmCQ+bZRxn8LqSDnxHbM=; b=Cg7iESfsbAgRrz7976DFbLSD9JFV5yvk4u6mc6a5COF5GfW3ljyy1dN/mGUMoCJKYgxaZdHMDxn8lYrp5CBDJFPrYI9Wi1GAFm49LqFjXujceuRA8/O1qQXpQtZ+Ptf+cRXJwqOK5GgTSabx6dwPsQefKWSW0SP/9BRPGWDuKboT4WGEiFsu4so74U2mJ8O3ed0MxjzJvzG/LR3VI4UcY8vFvQBI6VJ9/u7oZ3xhSIEJrdzI9IOzZoXuS7QgA2uY1rmsdGBvFIV+5Dwo51KHekk+HsrqAQ0rhtMHoX+bdoCKUQNqkURBXK0VK00XMh7GsfHbNFPuV8CSLv+XM1c4LQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:31 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:31 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 16/23] nova-core: mm: Add BAR1 user interface Date: Wed, 18 Feb 2026 16:20:13 -0500 Message-Id: <20260218212020.800836-17-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BN1PR10CA0029.namprd10.prod.outlook.com (2603:10b6:408:e0::34) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: f9c45fee-aa70-463a-1b6c-08de6f33af7a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?mP/RDIbjfK0JmRyWvr8WB12+tOtFb5ePDb8Tq4wbu9uHD8MYZVaef/0wsdwN?= =?us-ascii?Q?BV0zkiJ7jxJ3pLa/VrWfaU7aOBAZPFyaAbpJhRTaIfQ7YrKgi7G24ym1NS4Y?= =?us-ascii?Q?MnDqj/QnKPl3H4CK4YZL4phnZ2eFn21NeexmngDancG7R2FgNDqzJwUVz8jl?= =?us-ascii?Q?SK/KvuoWLiCzWzk9gG7p2/fRnefOT2sz69QgO5v7nC0ULxRLpC/rvfohxdmz?= =?us-ascii?Q?rhrpw130xTgL3h2vP3gHOiBz0GlME+iYZojcSy/yivGlagEpKvNffD8IRjV/?= =?us-ascii?Q?k71Enz5S8fLIC0/9QzKja00JWCuNwLwASXx9LSEvgE41XBI8caVBw9M5wpBJ?= =?us-ascii?Q?G/SyHNG5sypDGS7Wu3UMLj4mh1CLEeHblN1mbKliXyaausDn5QD5WgNJRUUL?= =?us-ascii?Q?ZdM7juxOQHx59Dgf4FJgb+OM0HFwy6vsmcZFVQeEXCyaQiSfsDLboFlE6iMC?= =?us-ascii?Q?cMi8koSks9rbhAPzTevzjB9NaEYNQD/+9PvMmlXW0qri3cTRCEe7wBxdxUZa?= =?us-ascii?Q?OaOWVaw+QP7CC01nUfT/tMoxnW/SLSJjplUtx1orUfhGm0GEnpnwndcUuf1U?= =?us-ascii?Q?JnZFw8vLTD7XK/7X0X8RzqTTMveA5kATuWBj1owoX+WtNizgMidm8ubSFnCS?= =?us-ascii?Q?1KFSI0TG1/RQ6U/aCnn2rGArc6ys6TrLqyXEPmBICx+vlgRtCy2zttgQArGH?= =?us-ascii?Q?K4JED28I5U74utaf9xv3Sm4ke4Mb3YRxRTYxGcnORkMnoQL+V+muxgty3pKJ?= =?us-ascii?Q?OqjsZapAZrEKg4thyiXfdNo2/FR9XGvaSfRyVNNhh4efCBKuYkjkOWpNRTBT?= =?us-ascii?Q?HTBL1RkPmY+hynQwvlcp7h9sQcX+3NDDf8kLnYNxtNZMiQxz91XkyAPTVBNn?= =?us-ascii?Q?aoTGyEjVZHbmR9npPES2g4KEvOFLf7KNG2YAvpAB3vLnSTCAG2SnGw0VOwBt?= =?us-ascii?Q?KHcLmruu+EDgNcZc4UgYoMFStsXw8UECEziDNWkHYRQLngYPgYWGzdnXPo82?= =?us-ascii?Q?HQ4jENJ73TU/xpB6WACaM9FqRHmOAlcUs0goz8BqNPGZQS+S/orMje1qj+g3?= =?us-ascii?Q?UhHevulP9YTnuuNzKClXzn22uvyDTVbdT3z3yswYmubqgRU+XX2lBwmcxdNh?= =?us-ascii?Q?GgDj/0WD9jvrv0V+TCygKtnD4HAVHan5qyeGcVJl7Lo+wZQlhGFgIccfjQDB?= =?us-ascii?Q?g6EZ1RiaxIC16vb6UG9I4BaJgWXJz/FbzOJj/565KaVAUeK7T9Z1+o9+PRFz?= =?us-ascii?Q?Wukg2GdSITqHnRjCT+RhIshsVEdLe80n1HgMN4qkldA6V5CLHWrTeRhfNm3z?= =?us-ascii?Q?grcmlY65HLoaJOCQHpni1Jek8FqzDgQRuqXoW+WlBygWvwrAwNXIVEpq4cq5?= =?us-ascii?Q?yKvxpTZjLWQ2NtXmpeJ7AwYEOOLaXcWt2not1uKM8hAe7b+RzwnORlG4K20E?= =?us-ascii?Q?/9N3cH/39/yF91W8XQPmtUnID+/layNV0hRxpBahz2L+aKAnngXuzGlE26cy?= =?us-ascii?Q?2tSwf8kdeCwXcOG0JfUe2wFu6jtCzpKkGR5qIau/LkgZVGa53DsgMfBhj7Ot?= =?us-ascii?Q?SpJAQQxCAKX8wpaGmhM=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?f+R/JjaCOpMzfb4BZIjwrreXrkZcICZgWXwfSPZf3rfrkZU/NASEaW33K6kL?= =?us-ascii?Q?RTsJbPQPOTb3EeJefu544kbpjZtoZzKhgtgQsz8ImeSuDtw5inlgphhnYJTf?= =?us-ascii?Q?c/eyp5ByqHp9+t6LUP24B6MQ/vOV5If2fqrNxkj2se6R73a9chTknKALXfDm?= =?us-ascii?Q?Wg0Cjj734Fh0u18yMyrlPNY+hObT9nP6e9nCYsgKkOefX/mV4iV9cbVFAGhl?= =?us-ascii?Q?6umIxE2cd4dlr909SWrRNQAB1XOHUrcCW2pvBbqtwB2trv5aH0nQl776UGUK?= =?us-ascii?Q?+aNUYfP4S2PY3LxrblwP315Cb7+uJjQhNDBH+ivfoyBcbLj6Dxh4SYfM1/Hv?= =?us-ascii?Q?xVbFfbd9kDAmfB5JoyBE+hGa8gQ+sfHfdYE8yQiaeKbwRP5I5wIgaRsopv2E?= =?us-ascii?Q?Ek4vhT2YXEd0eKQWU28g2Nk49hagCC6LqcH0uLTWZ7Cr5MLMLNIrYOtBqSUO?= =?us-ascii?Q?2P4mT6NNtp0Sw6A7dZJV6Q/xsm5XWYjlkbjjTp9M4lL4uhbpy6eYCi/8jsYs?= =?us-ascii?Q?iF0wk5GMYb1ohdYvwB/VQVnLL/n/RRWp6cthuqDf46iMZxj9MXKTdHvopsUh?= =?us-ascii?Q?+wsEV4Q9I/1jdyJxAkAIBjqjf7x7MDs8+y31oQL7DybUIvGwSRKhugIAJPnf?= =?us-ascii?Q?1bzlu194QgpL4TXtcHcDNMDhbeKI8otOmmAnmAs3D0fAFAS+5+r64cafUf9Q?= =?us-ascii?Q?atPkZJmsSng4Y+KIju5pS1GA22NVnmzJJHj3RPI7LYxRxndDl4x28m+P2cFy?= =?us-ascii?Q?GLmtYyKqXxP4ZpHK8lU98icb8wPV0hrC0tek9ktZDF5x+qWgUc9u5FSjb2bQ?= =?us-ascii?Q?UaI2+729WWAXyYYBE2K+WwonYFngyCVq1gnkmP69A+0WH6ZRCAf2XTWXuMBW?= =?us-ascii?Q?LES/4a6xTjz9ZzzCP571aBEka9aVrlz1xuMaxvAXv5rQ8hhQwpA4yD5n9mQ9?= =?us-ascii?Q?ZrPKYEZ77XA0d/J/RnLV/axK/URFbFgMq1TZe+sz3EHTyuYdj98LcAmi1FB9?= =?us-ascii?Q?+Sj0Sob8g2YnlKi+ImwHYNDlHryB0UsKNrfWl3p1EQ6QI2y0UL7IoiYj7YZJ?= =?us-ascii?Q?o7r0VNi01Kfry56qvJVB+wl3dfKEh+DV4eS9ZCSw//G2JMvDja0f6MhlYzUo?= =?us-ascii?Q?wHQaz3dYaN/HY9cl+e8ArQjK7UKdAaqrtpBv6sY2Tps97gfvmgnd31mXp0Hu?= =?us-ascii?Q?uOzzGVmvIGp5CvJ3uRn13nWGPY9d2HXql5e/hJ26dCMm8tIO4fGS+vNWjCIk?= =?us-ascii?Q?0oR9xT7+WL8H1S4wJsZMKoTPcVDvYa0AdS+jsBFwO95dt1XWRV1cNfP+58xa?= =?us-ascii?Q?rfBvjy8TjKXP7hD4KePfMgCkjCd18j7g2/g+bbljBmMc55bt3xAHxorczdwo?= =?us-ascii?Q?ADpXO1Vt4HrQEKpCiZnhziMCe5PjE0OdjYcY3m918iwNqesKlyvKuIW/IBBX?= =?us-ascii?Q?ECG5UINEPtiEM1OhNyuy+qZnUV2mELJa11xsiJOPO0DHEEZVoqCwAiCQ3pLX?= =?us-ascii?Q?Jy6gUN/mIZavZEnDKhhZStP292Fbfx3PaIcotkOGOM9qtMBBxNeUIBXKAX7i?= =?us-ascii?Q?oJW3mJpOLnhFxOnRzHHxanisr7eYa8T5pnWAsBGuoWUCqNKjGkCjwEkdgXOf?= =?us-ascii?Q?01wJZ2GPsYImtaWJ/LlbOnwsWPEtF2A/OgoyW/uDo2Sn4TmnfjbdZF+1Z/9R?= =?us-ascii?Q?5RkHB9UF2kZ6hEQyV6hc9Wl+tO5HOSK9rdBVeD0nk1BaFiqO6QE19A+IwvU6?= =?us-ascii?Q?RDZG159Hrg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f9c45fee-aa70-463a-1b6c-08de6f33af7a X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:31.2538 (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: jkXVz/p5NkfFYpbHlQwG+/LOiLYygagqWyfIQf5rt90/ZDtMs/ET3QI6N063lH/zDokzEjC+MytGQ/fJGzduUw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add the BAR1 user interface for CPU access to GPU video memory through the BAR1 aperture. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/driver.rs | 1 - drivers/gpu/nova-core/mm/bar_user.rs | 154 +++++++++++++++++++++++++++ drivers/gpu/nova-core/mm/mod.rs | 1 + 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/nova-core/mm/bar_user.rs diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver= .rs index f30ffa45cf13..d8b2e967ba4c 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -42,7 +42,6 @@ pub(crate) struct NovaCore { const GPU_DMA_BITS: u32 =3D 47; =20 pub(crate) type Bar0 =3D pci::Bar; -#[expect(dead_code)] pub(crate) type Bar1 =3D pci::Bar; =20 kernel::pci_device_table!( diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/m= m/bar_user.rs new file mode 100644 index 000000000000..74119c4d365e --- /dev/null +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! BAR1 user interface for CPU access to GPU virtual memory. Used for USE= RD +//! for GPU work submission, and applications to access GPU buffers via mm= ap(). + +use kernel::io::Io; +use kernel::prelude::*; + +use crate::{ + driver::Bar1, + mm::{ + pagetable::MmuVersion, + vmm::{ + MappedRange, + Vmm, // + }, + GpuMm, + Pfn, + Vfn, + VirtualAddress, + VramAddress, + PAGE_SIZE, // + }, +}; + +/// BAR1 user interface for virtual memory mappings. +/// +/// Owns a VMM instance with virtual address tracking and provides +/// BAR1-specific mapping and cleanup operations. +pub(crate) struct BarUser { + vmm: Vmm, +} + +impl BarUser { + /// Create a new [`BarUser`] with virtual address tracking. + pub(crate) fn new( + pdb_addr: VramAddress, + mmu_version: MmuVersion, + va_size: u64, + ) -> Result { + Ok(Self { + vmm: Vmm::new(pdb_addr, mmu_version, va_size)?, + }) + } + + /// Map physical pages to a contiguous BAR1 virtual range. + pub(crate) fn map<'a>( + &'a mut self, + mm: &'a GpuMm, + bar: &'a Bar1, + pfns: &[Pfn], + writable: bool, + ) -> Result> { + if pfns.is_empty() { + return Err(EINVAL); + } + + let mapped =3D self.vmm.map_pages(mm, pfns, None, writable)?; + + Ok(BarAccess { + vmm: &mut self.vmm, + mm, + bar, + mapped: Some(mapped), + }) + } +} + +/// Access object for a mapped BAR1 region. +/// +/// Wraps a [`MappedRange`] and provides BAR1 access. When dropped, +/// unmaps pages and releases the VA range (by passing the range to +/// [`Vmm::unmap_pages()`], which consumes it). +pub(crate) struct BarAccess<'a> { + vmm: &'a mut Vmm, + mm: &'a GpuMm, + bar: &'a Bar1, + /// Needs to be an `Option` so that we can `take()` it and call `Drop` + /// on it in [`Vmm::unmap_pages()`]. + mapped: Option, +} + +impl<'a> BarAccess<'a> { + /// Returns the active mapping. + fn mapped(&self) -> &MappedRange { + // SAFETY: unwrap() will never panic here because `mapped` is only + // `None` after `take()` in `Drop`, accessors are never called in = `Drop`. + self.mapped.as_ref().unwrap() + } + + /// Get the base virtual address of this mapping. + pub(crate) fn base(&self) -> VirtualAddress { + VirtualAddress::from(self.mapped().vfn_start) + } + + /// Get the total size of the mapped region in bytes. + pub(crate) fn size(&self) -> usize { + self.mapped().num_pages * PAGE_SIZE + } + + /// Get the starting virtual frame number. + pub(crate) fn vfn_start(&self) -> Vfn { + self.mapped().vfn_start + } + + /// Get the number of pages in this mapping. + pub(crate) fn num_pages(&self) -> usize { + self.mapped().num_pages + } + + /// Translate an offset within this mapping to a BAR1 aperture offset. + fn bar_offset(&self, offset: usize) -> Result { + if offset >=3D self.size() { + return Err(EINVAL); + } + + let base =3D (self.mapped().vfn_start.raw() as usize) + .checked_mul(PAGE_SIZE) + .ok_or(EOVERFLOW)?; + base.checked_add(offset).ok_or(EOVERFLOW) + } + + // Fallible accessors with runtime bounds checking. + + /// Read a 32-bit value at the given offset. + pub(crate) fn try_read32(&self, offset: usize) -> Result { + self.bar.try_read32(self.bar_offset(offset)?) + } + + /// Write a 32-bit value at the given offset. + pub(crate) fn try_write32(&self, value: u32, offset: usize) -> Result { + self.bar.try_write32(value, self.bar_offset(offset)?) + } + + /// Read a 64-bit value at the given offset. + pub(crate) fn try_read64(&self, offset: usize) -> Result { + self.bar.try_read64(self.bar_offset(offset)?) + } + + /// Write a 64-bit value at the given offset. + pub(crate) fn try_write64(&self, value: u64, offset: usize) -> Result { + self.bar.try_write64(value, self.bar_offset(offset)?) + } +} + +impl Drop for BarAccess<'_> { + fn drop(&mut self) { + if let Some(mapped) =3D self.mapped.take() { + if self.vmm.unmap_pages(self.mm, mapped).is_err() { + kernel::pr_warn_once!("BarAccess: unmap_pages failed.\n"); + } + } + } +} diff --git a/drivers/gpu/nova-core/mm/mod.rs b/drivers/gpu/nova-core/mm/mod= .rs index 922479accba6..b00f30641ab5 100644 --- a/drivers/gpu/nova-core/mm/mod.rs +++ b/drivers/gpu/nova-core/mm/mod.rs @@ -4,6 +4,7 @@ =20 #![expect(dead_code)] =20 +pub(crate) mod bar_user; pub(crate) mod pagetable; pub(crate) mod pramin; pub(crate) mod tlb; --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013037.outbound.protection.outlook.com [40.93.196.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 7EE5234BA50; Wed, 18 Feb 2026 21:21:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449700; cv=fail; b=Om2N4JPzIfr5NWV5V9a23aQsCte56ZutGv9G5h+Nzpm4sRbeIRNyAKB4tU8jPvKRDFBmmcq3BS/HO2SD3f/bPnGDVOH/CC2H6lYM1QdMg5iqE7OFlKrhtfMBbClZUy5PK3z7+SYVugM+XFDwcSurPT4n/+2xAS8tMW/VedkRCUo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449700; c=relaxed/simple; bh=D+wAaUQh2z2oO/pvxYvN9F0gi6rEReRPSvbs2Gb+Ky0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=GOwMC5PZRseYJUsN2F3HCtmpxeipPjm0FIJMZWucYNIwekzpFKYAfXb8TpR4tD6hWNptDfaeXF7/wW8pI8WJZth/Z9oSvF39cj4k3zaujxhKhBZxbWEwyHZl4yP5lP4/pVvR5xFQUFRpr5UdfAewB/TyfWCR112j505ssC6hmx4= 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=T9adnT1f; arc=fail smtp.client-ip=40.93.196.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="T9adnT1f" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OVCO/eEgFujp+GV2WjG7kRFKIUDZTDiN5PvPZXHsCD+h+d5AwgVTJlxJEOg7SuYf5oOgqwdLLsnf8AmCnKoakrnbaQQxJgU9jtHZ2f5n69eGL2FHuwChQrlpU8Awbwjfww62zozBc5gXXautj7msQ2BQ4jZk33Y1sMafx5U9dgt4myHyRwuld+LSTLfXJTb7yBMoevI8VaFnAgpvqoXFGWgD6Y+g4SrFXNB1wwlqGDb6jNDrbggs5ca3QApKaV9pu3Yzs2j88e5d/0A4WK9zXujFxAzrtCSGzIQanG6nByoudhnmermUhFfosIz6aAAK8AP2PH3Pn8BJ0sKIG5frrg== 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=FYrQ0oImcRmSbiS5VjSEUo33f8pNIpVKM/QVwSSP8rA=; b=nmmNE6x7ERDdwWqJpStPytgelMlt5wRdW/6gjcNebXqgdMm2iJDR8to0ma0w2JRhGyVD+PfmlbWlhcMGpHlQ0YNkuhavkX/MqpDsg26/S9Qu2qYqNnZK3qY8toagOIHPw85xJvlg1QfV1dYDJqoN5YeGF4GRIWZKAFBMR+OztrsI0k5IfbQxzkusxNhSFpgYuyP8XuI1xPEDvPXn5654wyyqIYqQ6yfiP/3i8XCmjwkmIiFL5CVireaFkUEff5Y9u34UKpa3DSR5r7eYTauyUYL3znvxybX1choyb70ZP2iPX76hf5Y+RiOg1xMJ1DOqbmwqX7xe5F34yCrGAg4ZVg== 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=FYrQ0oImcRmSbiS5VjSEUo33f8pNIpVKM/QVwSSP8rA=; b=T9adnT1fia+Dlm7yR4wraWb908VgCNqtfmgPES4uZ4VrDNV7I+Yf0yz5KdbOPVYB+p3hOA4zjKdH/dc+QQeBS4VUztgXFrsgnBWk3nISowezkQTbsd+zRv8r1mMrcpGI0fk9eFMGSmfcqBn7KLJXlmTAm8psh+cXDg83fdup8ii5Ao6ssBhW1uKvnYpDTKyt85T7ye7xD3BV9v5bMS1uTd71+qk8AzzwAHnQhhLCAqTpKmX4BcEyGIdT6cDMaF4DM/8EVM28uVhNBpuX4wy+UfFOcy391+7sYOJkBEVgZtFeBIBjQ9RNR1y6H9ZZHojspwPX17gsdDSogajlwfPgmw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:32 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:32 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 17/23] nova-core: gsp: Return GspStaticInfo and FbLayout from boot() Date: Wed, 18 Feb 2026 16:20:14 -0500 Message-Id: <20260218212020.800836-18-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BN1PR10CA0028.namprd10.prod.outlook.com (2603:10b6:408:e0::33) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 081d2a67-fa21-4a3f-0b38-08de6f33b045 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?5LqvLIFhrcS5n/wzU3oAgKX6b+UA5Jjwwp764OuEN1bK98u/cZ9/rPdiG8C9?= =?us-ascii?Q?6aEtaiKUqbispx47YE3Qswaz9/F1jralBuYDzjjeMfIAK1y7+kRZj5CHIPza?= =?us-ascii?Q?BSzsUN89C+s87nBcBD48VrD0nwIZXcPWnyTX9FvzfeWfaTyJATXGgwvmEghV?= =?us-ascii?Q?2QhfSgqdX8eS3DVNP9W6lzfBP160KPaZCJptkwKGAuiXk9n3bws1PNNcqixd?= =?us-ascii?Q?nD5iFY5dej0VbMhoV0l0LffiQi17f3qMOR2Ns9FdFfN0piCi6Qr0ne2j7ydH?= =?us-ascii?Q?BPxbWxvqANpZQ6fcYXDBUeFTu/M39bcdA6Bs79ld/YxgqlfSGpFbv2yX/Prf?= =?us-ascii?Q?JAoZUA2DIBrzqBUs4abOx+KpzEDtDGNjSfocpEvzLggRF5nESYq9UeMTpMD1?= =?us-ascii?Q?gz4/9eDQPTzjWELqnYVG6WT1nOhACuySAb9xqh1APfbBcSdOEnesJscSQpxd?= =?us-ascii?Q?Phi3stSo1iJrgICqQPOzM9cvwAsPBmB4U6Pm0hGe+VDtZc5Z8dA+IXKOYIVl?= =?us-ascii?Q?0wUVShS41nVDmJxnS4oFIouwdq5LloiDsEn7b2QdC4pCGHux8lGCeA9g2ZKl?= =?us-ascii?Q?BZ7KJzx3H67IE8QJgMGrdixxOKSNZgNhMEHSYDwWCoHcwG/L5dGWf+NAqaM+?= =?us-ascii?Q?JnBQOwZc+PJLvC58lxYwBvcnMVU0hQ8zbSJYBMnF2RD3eUQGgszQpt78IjkX?= =?us-ascii?Q?KkRicha3CgZRIIs1bApv+hsSRQbYNSmazwpuiC3PVCDsaNppLzBmRZZqGphU?= =?us-ascii?Q?Kyzu7klPyXiYHRankwt4HskqGIHrFetjnw+u7DcUcFHYiaDyM/WQzPrgqdJ6?= =?us-ascii?Q?qv6neV/qdHJq2VbjCJRPKlCk7IG9ThTu68XlpVMD8iAOM/M5M4Kr7Qk8Dpcp?= =?us-ascii?Q?xN+67ZQaekyd07YMwIyMrurE0k1l1haRgBnwsBg/1TIxLweEsnXQTi7OAOVv?= =?us-ascii?Q?u5hrQPerUfgDH8NiEDp2UNS8rrkrh07nAcR3G5OAasA5Lw3KAI49cySkr4mm?= =?us-ascii?Q?1QN62AVfW7a7LKraK94Qf/YQKzPa4ALneT3xynDjmFkw4TUqQC90N/YU+Kyv?= =?us-ascii?Q?7fZXrzcl0artw2Q+Lpoboluydopd8wcZ1VYYJvJP5a/qrbN/Frc/TIHUVhiN?= =?us-ascii?Q?L6zn+3x3Xfewe1LI72RjbXGCkkfPaV46KbYjfP0Up5/DIo68JScQWdSYV4jh?= =?us-ascii?Q?vlVM2mYKcE2iDnjD3OHZbUJteYJmeR3YvUZ7Lwc9vUOWScdg5q+zZoL1dNbn?= =?us-ascii?Q?Wo5wZvzyrgJLn/I6ywgvoIdzpWhrbEjuIu0WJ/bQEVObePVBly9Jti/FbS0z?= =?us-ascii?Q?d0CEpMY5suzZRILiDtFD2fgwd5THGnbDh5UYsFGGsTnsCbEPinb37ugbTiNU?= =?us-ascii?Q?93n3ZFgyJyhzWhrXeGXmcnR1zzLT0U/jMcnB1B7W5rnONutOUOaaIoxQLhYh?= =?us-ascii?Q?6Fk0+WUh1n1v2OFpHs9XFBXjaT+BFcH8inxTgYyGlfDD2xpF/Q/xmuJmxiup?= =?us-ascii?Q?/IBvLgpo/6CjJ0+bpxb5wJeQZ7Tu9rYCcShz1PNOa44mu3igflQ/HL54aLTp?= =?us-ascii?Q?HHn6cbQt97s1ExKCPyY=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CzowEYdZMvgKpRuEWHVDfNCX55zlNvL0mwRLkO4fKnlQKYpMjiqzp8UAKUAa?= =?us-ascii?Q?Oo4gE5SUMHZEgG25SXsmDVMx/DID8F1dfHEQyjdbhdh6DCpWVBCfg9LskD9h?= =?us-ascii?Q?vPAl7hzjIPvlLLQpNluAq4FzAznPTlB0Lf631Ql2+5oK6Kr8Ih2QHzgPNJSg?= =?us-ascii?Q?Pt5luIQetESBjQAqXfKIoF6W1NWItbUkuIiGKtvhowtSfpdTRUh/E0PN4U/y?= =?us-ascii?Q?YLNmZrstP2/mv3PeUY+zAi+bq/I8XaBKuZR1fH6wDFLyNhQjYeRQ8JonFmfk?= =?us-ascii?Q?kBwlK3kpGMISCsFmwKQBBrBdgWI6ukmcCjAJOpIAYKj6IwUgR9J64UQgDDm1?= =?us-ascii?Q?mFvaWLJ1Z1hm31ULysDjayEUqryHPUxqfeiO2Lj1zjnnG648kI9h1AGZXq2v?= =?us-ascii?Q?SG2PMRbAeCRsRTWL6asPjG4N6wJRfPy7dK9KWr7vsM6Esaa7S/7SI1/sSI61?= =?us-ascii?Q?bU/TQnpssM4mNuuNRSglYELlZQNaYoqF6K1ug/GMRAAt3LKVs46htI1yQECw?= =?us-ascii?Q?cQj9J2TeGFsNGdIy73J4wGLEvCUl6xZVUJaWC7b2uQ8ZOa6p7Oz3jAq46qbU?= =?us-ascii?Q?L4tMgo/y6/sGL7xcCc8hTg7iPB9KAlwyzWmoqFSOU8vSYQ6dXBGZ1JqfsDbk?= =?us-ascii?Q?5I/aMI0NnItMbgMRRzs4WjEuWhbXDPUefolra1fdapVmVYMn/Rw/IRyysKNP?= =?us-ascii?Q?hJYvzAJFezrTXZxCxwxJgDqsbP3PiJViewJ277tX4poqcOBQ2klrUvql7ukq?= =?us-ascii?Q?I4/jebLVJyfWYnrgjfRGmPYip8BmAWdjqdLA1BtZtKCjnwkmIY6S+WXHPQb/?= =?us-ascii?Q?EwSvu2qnsqfAQON9XAiySzeIsMKpXKEUoMSeurYG4RhUM6gHlNu7+H9fppxa?= =?us-ascii?Q?wrSyjFTbk4wyI07q0+MVIveTdEyC2GdpiH/DVNdb2zbVbPCatChs30dGWzWG?= =?us-ascii?Q?g0EuDGbTOCxB4ocI5vEmEtL1+qaqA8C6MsNrsyVC/SFf3Qtu+d79gqDbmKjg?= =?us-ascii?Q?QdO4a9w3qwxw5eo+RPKx919513ei5U7405WWBJaPjVl7rxRibTgRuxE8TGuM?= =?us-ascii?Q?WBARNMIAnEvqMClyHz9siiwKjj+MdBxasGNISZyD2i6R+lTnd1PY70zrisLD?= =?us-ascii?Q?c6c0ci9PQT991Hw32SP6IHJt0sZUWpARotepf4JorHoq/yxwdDOnBkgvOUdv?= =?us-ascii?Q?5yPfkx0Azjz++mMePkkUhDJr/8gtkVfwrXc+attVt8KjttFrN8HFzsnwi5w+?= =?us-ascii?Q?lv41Ui46oOWSpaOTtVoHVuUT43deTn3kzofgQr6XI+C+p6XnjHKthavwsKon?= =?us-ascii?Q?cecJ5jVntCZ4Gf2sIMMeBFrVX2TWH+3BHBBr8p5K/QSK618QscklU+DHW9NA?= =?us-ascii?Q?e2Rj5M6AWtuWHNVC9+lKhkw8norA5fvntdM2UPZ0oQVb8CKkMw5UxglwsehB?= =?us-ascii?Q?CIuuPTunzARIFC6Z9ny6uOGCMpmc/j29XnMrhqfvCiJkxb324rlZE0Mt+6vh?= =?us-ascii?Q?+vJ8vx4STS6XE08VyEQ1Xy8ebCqdu6T1KggZRUN8yZ75E7tsr/+GUDcg0yOl?= =?us-ascii?Q?q63Nbgp6lAQbPoBj0kOgHi0nIdGrbg3Q44kiqqZ/ixgdfxCg6X5euEAkN99R?= =?us-ascii?Q?kB4RWujxgRQIyVnfaEYG89OM6u51AwkazRmEAMiJjOgd7SBGBjYdEopKMEUq?= =?us-ascii?Q?vPEV9tVLtQGGrfBolmay+eFie+oyGRdPUe2uR6Ea6JiDay903jVm0hjPCTlj?= =?us-ascii?Q?0ZaQhFnSNA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 081d2a67-fa21-4a3f-0b38-08de6f33b045 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:32.5695 (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: PDHYbGJHWgWy8iPvSQvLSSxYDxSJtQoZSIkxMJ6bJo/HdVjg1heaR2CQqjdl3DAof9HFKrQMcpevs0AAGelXJw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Refactor the GSP boot function to return the GspStaticInfo and FbLayout. This enables access required for memory management initialization to: - bar1_pde_base: BAR1 page directory base. - bar2_pde_base: BAR2 page directory base. - usable memory regions in vidmem. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/gpu.rs | 9 +++++++-- drivers/gpu/nova-core/gsp/boot.rs | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 396d5bf57167..e217e5c7cb32 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -20,7 +20,10 @@ }, fb::SysmemFlush, gfw, - gsp::Gsp, + gsp::{ + commands::GetGspStaticInfoReply, + Gsp, // + }, mm::GpuMm, regs, }; @@ -258,6 +261,8 @@ pub(crate) struct Gpu { /// GSP runtime data. Temporarily an empty placeholder. #[pin] gsp: Gsp, + /// Static GPU information from GSP. + gsp_static_info: GetGspStaticInfoReply, } =20 impl Gpu { @@ -298,7 +303,7 @@ pub(crate) fn new<'a>( =20 gsp <- Gsp::new(pdev), =20 - _: { gsp.boot(pdev, bar, spec.chipset, gsp_falcon, sec2_falcon= )? }, + gsp_static_info: { gsp.boot(pdev, bar, spec.chipset, gsp_falco= n, sec2_falcon)?.0 }, =20 bar: devres_bar, }) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index be427fe26a58..7a4a0c759267 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -32,7 +32,10 @@ }, gpu::Chipset, gsp::{ - commands, + commands::{ + self, + GetGspStaticInfoReply, // + }, sequencer::{ GspSequencer, GspSequencerParams, // @@ -127,6 +130,12 @@ fn run_fwsec_frts( /// structures that the GSP will use at runtime. /// /// Upon return, the GSP is up and running, and its runtime object giv= en as return value. + /// + /// Returns a tuple containing: + /// - [`GetGspStaticInfoReply`]: Static GPU information from GSP, incl= uding the BAR1 page + /// directory base address needed for memory management. + /// - [`FbLayout`]: Frame buffer layout computed during boot, containi= ng memory regions + /// required for [`GpuMm`] initialization. pub(crate) fn boot( mut self: Pin<&mut Self>, pdev: &pci::Device, @@ -134,7 +143,7 @@ pub(crate) fn boot( chipset: Chipset, gsp_falcon: &Falcon, sec2_falcon: &Falcon, - ) -> Result { + ) -> Result<(GetGspStaticInfoReply, FbLayout)> { let dev =3D pdev.as_ref(); =20 let bios =3D Vbios::new(dev, bar)?; @@ -243,6 +252,6 @@ pub(crate) fn boot( Err(e) =3D> dev_warn!(pdev.as_ref(), "GPU name unavailable: {:= ?}\n", e), } =20 - Ok(()) + Ok((info, fb_layout)) } } --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012024.outbound.protection.outlook.com [52.101.48.24]) (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 A3B4234CFAB; Wed, 18 Feb 2026 21:21:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.24 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449701; cv=fail; b=ri7G9By+ItKbGZv/fGia5t7K+hKEArS9wTxa3d3mx15R9M25/8r3ZRmU78Xd63mlqFLcQXGHuqI7FI57BpNId55mSyMXFHHPHrtkeu+0yZZx/Vvn3wdXGuJQ6Oworx1NEvGyjr5Kd2PcYPKBV3Fxg4zswlA3RswWSCHCvrpFz1g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449701; c=relaxed/simple; bh=++1rPAhsSXTkkqfVupHjz7EUcnCt7ngK+laEAQnbXIw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=Ho2fDwNlTupsieQever9qUMyFXd98udnB1h5fxRpOnBYOOT9kpKvr42VbkG1kyzMbm1gBZRiMKYaHjlYR3Rgp3qqrBZODw5CWGNKZrCESNscAJnTfxCpEZEWtlwY/aQxuyOCF/ae6SCCq5S7mTY7mNueMHmdqGIM2wZHoe0JeSg= 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=eeCOyDlI; arc=fail smtp.client-ip=52.101.48.24 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="eeCOyDlI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O0tPEUDr+2Fw9do3CCSTiKCaoowDrtSz67XkBKjFD0ttz0kT7QRx4WNcRYSDR+HEg3JetZj7sZLPPz+OkhbLN9KN5gvG9Qbz0HtpceEUEagGWh9d1mBqUN5mldGA+FEg9ST1c06czA7ZiyehaEOF77r54JIvrIcF//Noh5TlJD2LN0q2UW48mPiAKlarAETA2grFHpvh5mSjVXyAX2JrTk1f90AdxZ5S+aslcy2YmLYS/Sj/fBGOSyku1QCrWoLC/gjfJm9rlmqxpQQnPLCimyyhNiNp+BuCS5pLZPKYxe3GbGj5hEmnb4waZhzwUG+4rrPfaQzqzbyfMuHtJaJpVA== 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=mCl4nMLQZZHghyVD438Ee7ruSVmIeeR60o5/thkoSzI=; b=r5dLLQz8PCOam1kCpoWyjfnqG1hmJDcD2md6ZLoAJ8K7RmeTVMVGhQBFc3y7rCdskLNICcidbpKDCQ2Zj4JLarWNRmWEEiEdPhIPPfjOXEyptT9BkXqImVO1AupMSMArEcV9ZYCrhRK0QQxompoW4+E339FJ0UdIArdywMzdtSVTeDebyzlnY4cZxPut77rq3QOgqE5BlIF7z+EQbM1KnkqE77DbAjAvIp8R8E2CTt6dkE3GrZz1LrkYbyo8t/RgwTr1y13/fLCSQxEbrlqOmsU0K6wZNZHpWYMH0xb0J+pcXWl0WOiE0+zpGUW5h8kXNNhAgdEmD2UyPDRGjsFDVA== 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=mCl4nMLQZZHghyVD438Ee7ruSVmIeeR60o5/thkoSzI=; b=eeCOyDlI5WJSkvGDz5+BF98f5PkCFP/apHfctWIFRG6i1gDRG1LAUmTaLhUL65bMfySkRaTz3Eu7mnezMC05VcCXCMMcksRXR1camkVSwPDmfSe3RNR6B6WO5yzW7oCNnvCnkS21mSZT/zkdZD5yyrS8t55X6/z8Da4CeBMHe67ECaxl2ARA242b1HbKjyLb5YkVwWp8SJc7ZBtTKB7Ex/AZgHVnGkzcfcPQPDhK+SqIHtVCnwuHFh2QIs/IQ3E2013XTmhFmB/0r4nWfPueZHB3vHrKaIiUzq/jL0+RZCF8HDRkFOoKkM5+lOxVvsUsSuAwn5+F2m9P5eFMo+Idkg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH0PR12MB999111.namprd12.prod.outlook.com (2603:10b6:510:38d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.14; Wed, 18 Feb 2026 21:21:34 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:34 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 18/23] nova-core: mm: Add BAR1 memory management self-tests Date: Wed, 18 Feb 2026 16:20:15 -0500 Message-Id: <20260218212020.800836-19-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BN9PR03CA0105.namprd03.prod.outlook.com (2603:10b6:408:fd::20) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH0PR12MB999111:EE_ X-MS-Office365-Filtering-Correlation-Id: 8f122583-c959-429c-bb47-08de6f33b133 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Xnpl/3s/nlQTjxZZAyxnxKJr0ebiBKfTReYAt9x6QKTsEtSOJxBbn+0eAYtA?= =?us-ascii?Q?zrlbWQynsVJD8G4hk1rlffzpRwghdcGV/IbsehlksLiiMB+VKyYph9L+kYLe?= =?us-ascii?Q?EBl6VYpSqDFkDh9zuGNoARp405jvTBmbtTY0rxZfm9sTgo/EsRvC0Ldq2P/s?= =?us-ascii?Q?66/IFhEU68XhiCrKzc1uaW8nbRoC/3+Blmb5vFN6axKeY6xN+Ij6J/D4mmJr?= =?us-ascii?Q?zHEBcxHu2zHiyit+Qa/9PDOhxYhh9/PKGUml9+/CTWvsM1J6VjiF56w1s0lJ?= =?us-ascii?Q?wwOOwHK92SWwDDLPTgw7W6iy/22J7jkpVTxGDGaVK842shC/cO8aDwhkfIVO?= =?us-ascii?Q?eAlqTzAaFwyJRSlEkAzjZHDfTfjm8l0GXePc0DdGFtEXbNmUDdHQ5WKAsauu?= =?us-ascii?Q?SsP3TAkbKn/vm3QUWVJfKnqPzXumjaHsKTGF0pR+w50WN5LmBRK2ntu6Iuio?= =?us-ascii?Q?mC/pOLum9+aTazNnfXFWP+0846lvISafJBcHghVh5udIqhzNm/MgsZ6pMrP7?= =?us-ascii?Q?AoS9spHKjklMdnrjd0YsqJ5kb28GAeLrAnmOxrM+HpZZrUykBNiwsujdW+JO?= =?us-ascii?Q?kS0DGnIDQEi6Hhxivi67P/bxgzotd1McYi/VlwIOEu73uU2bULWqr/QtuoDI?= =?us-ascii?Q?cXEqC5EKoeOP7TP0+LeQn48555FTeAd+rgGaciUfH2YMlnISA4EDAcJtLdkn?= =?us-ascii?Q?bhGJAGnlrwS/J2mFtR1sfrV3oL68HFFd0Iwgjg5lnKllk4coDJbSWlHVCr2X?= =?us-ascii?Q?octWFInjq2ODym6XU32u8fBQZ8a3egqgnHH6k2nb09jdVg9d3y1omo6JGkHM?= =?us-ascii?Q?3em3e7eGsytknbgr3LG2S0+OTU0wuWNdkVrIqolFNi3qWGpCmeQ08HCLegqY?= =?us-ascii?Q?l718TCsizZCiXU2VC5M9m6JTUosgRZWbHNeByxOwCMLYSVr4/RvzPn7j3Jg/?= =?us-ascii?Q?GOA22t5Q/yYz3R29vgEKeXqs+i7buq/JbwZKnOG3vbztt6y20QSp8CCT5oFm?= =?us-ascii?Q?NgiIYNnrGERigarwy8mQ9LCRbvRryrunwi4NunSI6n2MZ5CZEwrsiuYJ+Nkl?= =?us-ascii?Q?XLyvWur2b8GHQY5ykxb8RqwPl7X2BTJeeRbItRuGajw5dgqk85dTL/2Mdj4o?= =?us-ascii?Q?hn+6vIUTSZWFXbp/K4IxFJUkYO5lxFnxh6uKVoMMFEhlePLDYKqwA6L03SJ6?= =?us-ascii?Q?itJN8uas4OiwoowzdzPw7YvLPK9UVP5pdXusT3z1y/ahiR+NWrR+RDOvX3ty?= =?us-ascii?Q?U9n3xf4u93mqvJdxSCrW1v31FikrNQg0R0PeInqhI4sc97c5R75eOkTFaE6A?= =?us-ascii?Q?x7HAx8/FpowrpuqtygB4jQRneIYCU+x6NLABSqDLfdVSg01JHFt/0mQh7DOV?= =?us-ascii?Q?aMVJ7rXd7XfBa7I/5tPBBn/BSG+4cXCkBtJTuFyrJ8iWRitOTD4fJiOtfXOn?= =?us-ascii?Q?XBrpBj6y4X4ka7rDNHVnn8fj2HNASWrNkq5OP0Qlvl1wYYK2mvKcWyUIN9eD?= =?us-ascii?Q?yu2g0cbonXIdM304HH9yV3T24kCGxixRDs42XeXOj1JKbXYCSbcLed+3Yym9?= =?us-ascii?Q?FWk93V3QQJR4vgi/C6U=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?K3noChqc971cFDscvD2WH1Jv5NvEVFNsg2lpwQyXkipmBPhBSTuZRwXD9P/m?= =?us-ascii?Q?08irb70KIH8H9XvVaxBNZLH39zt+FpkGG3ys7rNsJeElNflZRjeT8GfIX55D?= =?us-ascii?Q?Kl0mwuq7cMJC6lL6vX25NDF0ryX9M9jwMZ0uDwS2iVVeZtZOQ/TJQlwpm/7D?= =?us-ascii?Q?XXVPTgtA/3VYdndyR91tMB5n5DcIQQsYaRgDscFw43H0EYlzstcpkwNaXV3S?= =?us-ascii?Q?xU2LNYgR2cgU6YPAUciAkS4CvT7fa1muQSWJhPu/U9tWL1QzfGZ4CHoZvfKI?= =?us-ascii?Q?P634SR8k9faFpULrq/ZTI2uR3T8XMHbBlwiw5bpJQdpVpHSvp9z1wIKXNulb?= =?us-ascii?Q?+Cv54o40IPkKqlfcpr5AzwOb0B5+qENk/fAtjho6yR6PFPB0KeMO67ag1JrK?= =?us-ascii?Q?QMzEazxXRvNPaBMi2tEIOPnv96ogv2aQpZttoGoDcIqCbMiCikrLEhu8540l?= =?us-ascii?Q?TQVyxv/NOIICXSo5rSFb+2tdreI5uY9Bxpr2mNKPLsBXRSzU7vqNHarkjXV2?= =?us-ascii?Q?0ChP9aulcMG8eakpW1ebnBt/mWHY3t/nFH6bO7o0lhZFNK5mhLqcH+lBmOWI?= =?us-ascii?Q?I7SJV9FgUOmYN8z9D/Vcd6pUg18MUXIR6436rOFR/1TC7Bh7mpr+tzkrtcJp?= =?us-ascii?Q?MixQeAdsf75yiK562JPxPXUG1k/u7r+mxo5UCJKQ2MyCgk10cn+mrsd3xS8K?= =?us-ascii?Q?a0MJdBSAtGYZbbPbf2opKyB0DWewltvJWFH0UJPWN71DR7nrjTx2Fx6Aa32f?= =?us-ascii?Q?BquqYgZTq1uQhO/2RkSfWgPfIKliiMGZxP2C8H+TMW9LXfqbJKBqx4pquUNG?= =?us-ascii?Q?u95MBNNwGnMbaesjEO2Cholx0kJq0+HxaF1D2EJUDmpQdg6CQ3AYnRvf4F60?= =?us-ascii?Q?ukaHMt9Runc/jXGF9fjHaQrdt9FHy6jUcd7OhC46VSaKMv9IbCWWjJOwqNoh?= =?us-ascii?Q?VzD6tL8CQRA4SCvTKO4ke89lVm2jqE5txQemXNd4BqheyVMGV+fQq0lhQTQO?= =?us-ascii?Q?pd7hXU/kUKphT1OhQMSVbN7uPVA9TY/YjX2HZRhGYFWV2ytvv550a4MuTBU5?= =?us-ascii?Q?LVZuFZKuVNFZhbbngSSpLXdp2LI+EO1yeOgjEASu3jrXQjVvOCxQ9kXuSV5+?= =?us-ascii?Q?IASe3XBt6NVH1BKxfwiYaJdysioZjnf3yemDI52ZmjsL+CclwYQuQQxQzS8T?= =?us-ascii?Q?ITTVXzPBkp4dScWf7OFghrWsFRrYbogDRXVosCfXBQv89N2px9ARVQ/N63VA?= =?us-ascii?Q?rGDr+76/AloZ3FhZSqTGvYpZGoiAZYHwcKUggber0DXN1X/xbCp9BMVktRss?= =?us-ascii?Q?D2XQQOMoXsovGwwCB9Hlad9Mx7Ms5WfBZ6h6P3025Z7y2vFsWL/bpTI1d66x?= =?us-ascii?Q?fTMv12Zj22xQLD88LimftwZNnCY70LuH4gHUl+QYUM0K+oiXpURFrgafavD5?= =?us-ascii?Q?4+uZ+fbJX35ddIQSWaRZh92ox7SOXmogX7QoaxkWogG+EuH1LSPpQJURGVgV?= =?us-ascii?Q?4DMSKpt2n7KbAC5MkluhKhLy4WI1ILMtPI7dr1kWjk2LLKVcedVXzhgf2hQ9?= =?us-ascii?Q?LQFZzlsBRCI5MWZNhKrTO2CBpEV6dhay9Pw8dUgeKUUuAZePFSWzTqL6nHeL?= =?us-ascii?Q?n2qWapRp2WazxJopYGZm86l1Uc7F/kZjahJaKcsisajdNPizzimUJFLd6FoC?= =?us-ascii?Q?kyI3/jpCyq3B11VGff4hMySwOFhxQsS3j4cimIlH20dV5WzEPjBK2pXTuLjE?= =?us-ascii?Q?Rt6+PsqZ4Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8f122583-c959-429c-bb47-08de6f33b133 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:34.1850 (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: bYRxowaXF/2v04tQi8GW1fWPcmZwNhq28dFvtjCJP7fZzrGpbZk5Pfc3WUyLK7n0EavsPX/fyTICiJnX9P0/cQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB999111 Content-Type: text/plain; charset="utf-8" Add self-tests for BAR1 access during driver probe when CONFIG_NOVA_MM_SELFTESTS is enabled (default disabled). This results in testing the Vmm, GPU buddy allocator and BAR1 region all of which should function correctly for the tests to pass. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/Kconfig | 10 ++ drivers/gpu/nova-core/driver.rs | 2 + drivers/gpu/nova-core/gpu.rs | 48 ++++++++ drivers/gpu/nova-core/gsp/commands.rs | 1 - drivers/gpu/nova-core/mm/bar_user.rs | 164 ++++++++++++++++++++++++++ 5 files changed, 224 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/Kconfig b/drivers/gpu/nova-core/Kconfig index 6513007bf66f..d0d4177adb1b 100644 --- a/drivers/gpu/nova-core/Kconfig +++ b/drivers/gpu/nova-core/Kconfig @@ -15,3 +15,13 @@ 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_MM_SELFTESTS + bool "Memory management self-tests" + depends on NOVA_CORE + help + Enable self-tests for the memory management subsystem. When enabled, + tests are run during GPU probe to verify page table walking, and BAR1 + virtual memory mapping functionality. + + This is a testing option and is default-disabled. diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver= .rs index d8b2e967ba4c..7d0d09939835 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -92,6 +92,8 @@ fn probe(pdev: &pci::Device, _info: &Self::IdInfo) = -> impl PinInit) { .inspect(|bar| self.sysmem_flush.unregister(bar)) .is_err()); } + + /// Run selftests on the constructed [`Gpu`]. + pub(crate) fn run_selftests( + mut self: Pin<&mut Self>, + pdev: &pci::Device, + ) -> Result { + self.as_mut().run_mm_selftests(pdev)?; + Ok(()) + } + + #[cfg(CONFIG_NOVA_MM_SELFTESTS)] + fn run_mm_selftests( + mut self: Pin<&mut Self>, + pdev: &pci::Device, + ) -> Result { + use crate::driver::BAR1_SIZE; + + let mmu_version =3D MmuVersion::from(self.spec.chipset.arch()); + + // BAR1 self-tests. + let bar1 =3D Arc::pin_init( + pdev.iomap_region_sized::(1, c"nova-core/bar1"), + GFP_KERNEL, + )?; + let bar1_access =3D bar1.access(pdev.as_ref())?; + + let proj =3D self.as_mut().project(); + let bar1_pde_base =3D proj.gsp_static_info.bar1_pde_base(); + let mm =3D proj.mm.as_ref().get_ref(); + + crate::mm::bar_user::run_self_test( + pdev.as_ref(), + mm, + bar1_access, + bar1_pde_base, + mmu_version, + )?; + + Ok(()) + } + + #[cfg(not(CONFIG_NOVA_MM_SELFTESTS))] + fn run_mm_selftests( + self: Pin<&mut Self>, + _pdev: &pci::Device, + ) -> Result { + Ok(()) + } } diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index a7778d5d9e32..bf9e3086565f 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -232,7 +232,6 @@ pub(crate) fn gpu_name(&self) -> core::result::Result<&= str, GpuNameError> { } =20 /// Returns the BAR1 Page Directory Entry base address. - #[expect(dead_code)] pub(crate) fn bar1_pde_base(&self) -> u64 { self.bar1_pde_base } diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/m= m/bar_user.rs index 74119c4d365e..5edaacf4c9d0 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -152,3 +152,167 @@ fn drop(&mut self) { } } } + +/// Check if the PDB has valid, VRAM-backed page tables. +/// +/// Returns `Err(ENOENT)` if page tables are missing or not in VRAM. +#[cfg(CONFIG_NOVA_MM_SELFTESTS)] +fn check_valid_page_tables(mm: &GpuMm, pdb_addr: VramAddress) -> Result { + use crate::mm::pagetable::ver2::Pde; + use crate::mm::pagetable::AperturePde; + + let mut window =3D mm.pramin().window()?; + let pdb_entry_raw =3D window.try_read64(pdb_addr.raw())?; + let pdb_entry =3D Pde::new(pdb_entry_raw); + + if !pdb_entry.is_valid() { + return Err(ENOENT); + } + + if pdb_entry.aperture() !=3D AperturePde::VideoMemory { + return Err(ENOENT); + } + + Ok(()) +} + +/// Run MM subsystem self-tests during probe. +/// +/// Tests page table infrastructure and `BAR1` MMIO access using the `BAR1` +/// address space. Uses the `GpuMm`'s buddy allocator / to allocate page t= ables +/// and test pages as needed. +#[cfg(CONFIG_NOVA_MM_SELFTESTS)] +pub(crate) fn run_self_test( + dev: &kernel::device::Device, + mm: &GpuMm, + bar1: &crate::driver::Bar1, + bar1_pdb: u64, + mmu_version: MmuVersion, +) -> Result { + use crate::mm::vmm::Vmm; + use crate::mm::PAGE_SIZE; + use kernel::gpu::buddy::BuddyFlags; + use kernel::gpu::buddy::GpuBuddyAllocParams; + use kernel::sizes::{ + SZ_4K, + SZ_64K, // + }; + + // Self-tests only support MMU v2 for now. + if mmu_version !=3D MmuVersion::V2 { + dev_info!( + dev, + "MM: Skipping self-tests for MMU {:?} (only V2 supported)\n", + mmu_version + ); + return Ok(()); + } + + // Test patterns. + const PATTERN_PRAMIN: u32 =3D 0xDEAD_BEEF; + const PATTERN_BAR1: u32 =3D 0xCAFE_BABE; + + dev_info!(dev, "MM: Starting self-test...\n"); + + let pdb_addr =3D VramAddress::new(bar1_pdb); + + // Check if initial page tables are in VRAM. + if check_valid_page_tables(mm, pdb_addr).is_err() { + dev_info!(dev, "MM: Self-test SKIPPED - no valid VRAM page tables\= n"); + return Ok(()); + } + + // Setup a test page from the buddy allocator. + let alloc_params =3D GpuBuddyAllocParams { + start_range_address: 0, + end_range_address: 0, + size_bytes: SZ_4K as u64, + min_block_size_bytes: SZ_4K as u64, + buddy_flags: BuddyFlags::try_new(0)?, + }; + + let test_page_blocks =3D KBox::pin_init(mm.buddy().alloc_blocks(&alloc= _params), GFP_KERNEL)?; + let test_vram_offset =3D test_page_blocks.iter().next().ok_or(ENOMEM)?= .offset(); + let test_vram =3D VramAddress::new(test_vram_offset); + let test_pfn =3D Pfn::from(test_vram); + + // Create a VMM of size 64K to track virtual memory mappings. + let mut vmm =3D Vmm::new(pdb_addr, MmuVersion::V2, SZ_64K as u64)?; + + // Create a test mapping. + let mapped =3D vmm.map_pages(mm, &[test_pfn], None, true)?; + let test_vfn =3D mapped.vfn_start; + + // Pre-compute test addresses for each access path. + // Use distinct offsets within the page for read (0x100) and write (0x= 200) tests. + let bar1_base_offset =3D test_vfn.raw() as usize * PAGE_SIZE; + let bar1_read_offset: usize =3D bar1_base_offset + 0x100; + let bar1_write_offset: usize =3D bar1_base_offset + 0x200; + let vram_read_addr: usize =3D test_vram.raw() + 0x100; + let vram_write_addr: usize =3D test_vram.raw() + 0x200; + + // Test 1: Write via PRAMIN, read via BAR1. + { + let mut window =3D mm.pramin().window()?; + window.try_write32(vram_read_addr, PATTERN_PRAMIN)?; + } + + // Read back via BAR1 aperture. + let bar1_value =3D bar1.try_read32(bar1_read_offset)?; + + let test1_passed =3D if bar1_value =3D=3D PATTERN_PRAMIN { + true + } else { + dev_err!( + dev, + "MM: Test 1 FAILED - Expected {:#010x}, got {:#010x}\n", + PATTERN_PRAMIN, + bar1_value + ); + false + }; + + // Test 2: Write via BAR1, read via PRAMIN. + bar1.try_write32(PATTERN_BAR1, bar1_write_offset)?; + + // Read back via PRAMIN. + let pramin_value =3D { + let mut window =3D mm.pramin().window()?; + window.try_read32(vram_write_addr)? + }; + + let test2_passed =3D if pramin_value =3D=3D PATTERN_BAR1 { + true + } else { + dev_err!( + dev, + "MM: Test 2 FAILED - Expected {:#010x}, got {:#010x}\n", + PATTERN_BAR1, + pramin_value + ); + false + }; + + // Cleanup - invalidate PTE. + vmm.unmap_pages(mm, mapped)?; + + // Test 3: Two-phase prepare/execute API. + let prepared =3D vmm.prepare_map(mm, 1, None)?; + let mapped2 =3D vmm.execute_map(mm, prepared, &[test_pfn], true)?; + let readback =3D vmm.read_mapping(mm, mapped2.vfn_start)?; + let test3_passed =3D if readback =3D=3D Some(test_pfn) { + true + } else { + dev_err!(dev, "MM: Test 3 FAILED - Two-phase map readback mismatch= \n"); + false + }; + vmm.unmap_pages(mm, mapped2)?; + + if test1_passed && test2_passed && test3_passed { + dev_info!(dev, "MM: All self-tests PASSED\n"); + Ok(()) + } else { + dev_err!(dev, "MM: Self-tests FAILED\n"); + Err(EIO) + } +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010049.outbound.protection.outlook.com [52.101.193.49]) (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 8071434D4EE; Wed, 18 Feb 2026 21:21:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449703; cv=fail; b=M8t6Z8d1eH8OCOpR7F9pl5r3p2i4KrIUuOCIv+/gx73jsbZoywdvHiRP7EsF/4+T4FDoaW/SWIH9A9Wi6uLoUXS3V01YHbtRgAT9iWV7UF9wp2EQyEJDqSEVP2PDtqm1L/FRiuVSD65mNpbezPfK8tnuM7wT8koosVP7U+yv8nY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449703; c=relaxed/simple; bh=ATPZCLhaDwe73OIbmI/0RJ7aOcdka/UJRKEXtvD2Nlg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=Hbp2wYLU6+0Uxv4XGskmQ/6ERoBcESqs2fMNSIvjTw9kkZaNuGHDEeAGzKLiJII/cY345b7nTTVtQmF/Qv5zIsjOt8CBvydPLiv1VHb/rWSi35YIDv2ulz4nmaQjypZlEOXJtJA1HnwAVFzdHZ0HBlRV7MbbN1AOFWMoUZodG3s= 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=LLxCETzc; arc=fail smtp.client-ip=52.101.193.49 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="LLxCETzc" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ixwrc/i/oSiiOIDkxjBkV4JjFaZk4wqOr8F+oTFeqzHPiKeh1W1AuWSYh7WGk90LpjxKlBwO614L4eioWVsJbOhyAViPyeXMyZ6v/XT85fCM8eu5ctssvsdoL4XKHnKeJ5UUCrJpkcypqiKLw+yUoxsO7Z78R+JbxvElh0E/XlPFuli1dMLe/2KcR9yHoG0cd+U4WQBPho2jYt7pQh4b4kbJoVSr0T76CHJeEVICWyda3ZDDaItdV588jjo5K1P6SYuhnKAu+VoZMBn9Q0kMr8IB/eYGlBq4DJn6yZsnHhaIws1yp8kI6Y+yykAZPqkHzSGJdgzsbO7YpY3bs9zgNA== 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=AP/tTN8kLDgeIPbQETr9YklpKScVQYyx7Sl+BIJMw9c=; b=G0Z6/bCGoqoSFVFIgD06zlvly+IvxL1JHV4HxFjFtQPqb5yFAmaUL6mMvMzYFID+5Iu35421eKvD1WydqrAngF3+fS0cPMvTTU1lCqwjqk0NKGo5er7izXBu2/RsHi6qruiko5ft5xcGqnZr7f6330nj1Ox4yTMrrCmYO14q1OaQImBjwVEXgIN9wv6M1ohKkI/Y7DqhMhVaicYBDR2zC7qejEb2c6ugfBVIliLALPcI4U6dBWeWmitjskjnem0EWhIxWrGhslSD0t09Lo7QcmfKLpMmalq6sbkb2b6v2gEx2XHGBmnMrApgwKtmQ5AwVbU1fVNnD+53yoNCooSeuw== 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=AP/tTN8kLDgeIPbQETr9YklpKScVQYyx7Sl+BIJMw9c=; b=LLxCETzcQ8FuRMK/ECN9ZL+Akdh2f6KRYSgjrLhYpfsEIIKuf5ikPVHFOUTrscPrMi+S0eUeSA+IUNmuXmY5YR+thbGxDm5/urNSNoOclewfQgyT4YC0e/lBhOkrTSaluYcQjBBaLgdUMKXbeMz38n1CzFF0VjXhS92zAJZx4R+xGr/Khtz30Jxb0v39F/SlTP+t3hENkF2RENI/XFcIDLLe4G/6ykv7mn8nlGBTa41YEomrlkwiZW/me/ASOSECmq9amTjQs4Vf9USMV03XI5Rk5RuG0ATAsMy1FYJadAuCDEeliw5l8M3Fp6uAAMkH4/QFy57F+1k89B1X6uTGng== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by SJ0PR12MB6805.namprd12.prod.outlook.com (2603:10b6:a03:44f::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.16; Wed, 18 Feb 2026 21:21:36 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:35 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 19/23] nova-core: mm: Add PRAMIN aperture self-tests Date: Wed, 18 Feb 2026 16:20:16 -0500 Message-Id: <20260218212020.800836-20-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR20CA0066.namprd20.prod.outlook.com (2603:10b6:208:235::35) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|SJ0PR12MB6805:EE_ X-MS-Office365-Filtering-Correlation-Id: 57f46851-7e4b-4824-adeb-08de6f33b232 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?YSHcc+cUIz62bAxLlPjf/9hbwK08QI3zc6M0xhQRlkYvDjwA+NLRoliUF+Kn?= =?us-ascii?Q?5EFXdfCQrJTf5JlkSufhdj/ejJhcsBmWItIfcMoH8BL+mwps0EzgPsywDKiB?= =?us-ascii?Q?5Fg/7BFHhbyJl6oKk7Ic2w1XkVL5xXendJ/ROLM/wLSzswBy4gXs9kivBPBV?= =?us-ascii?Q?Yi/rkGRCmgm4mrPqFk3Hibuc/Aw35ld97OWc1Szw19eihF14ZMqA2rP3s689?= =?us-ascii?Q?zOh9N0MNz3xLygBDyOBlJYXHBFz3qRvqCfroqxyq/dU4GLpltie+J/kLlNUX?= =?us-ascii?Q?BViq5grO2jbIKLLv/5Kr7urE7DUlbH9fiu9BnpbeOX/Vg0FkBHxMDDcOKGqo?= =?us-ascii?Q?0cutgIbfLgl6WRKa3nCAaIw8UTDGAO3IlosZvLzSA3jKtbFuq5zj5ZiJPHIU?= =?us-ascii?Q?rz00d2WM7GPSP/DIbOeqp8dRVQ+hlM8cIeXqm0XMXa65z2jSoNK+WGOsJ6fg?= =?us-ascii?Q?ui28sdmobGFmqo+dEyrvhul0qNvLaB9xkeA/dJLchOVtMhkki+M4VTmGhP49?= =?us-ascii?Q?ULYq9sripQ/YIdBEQbfydL/A2VJR9eZZ1BLRHM+go9+HL4Bw+/RbLZoPolfb?= =?us-ascii?Q?jQLKfz39yx7xU2UuyuOJr8LP6RR/u4ys6pU6REHXK2jNIEEOTIjoZj2Lr5pN?= =?us-ascii?Q?9PeEZ3qC/fPrXwm3kjAam4CdpDyfyi2Xu5sw6yAw70llulmFzkK7+WJEOIOx?= =?us-ascii?Q?PPk4zNERl/ZPqS5ZwaZlE2+gLYtMKCJS9t/sk+3sae5FbSo6dsCR7Rg6y6od?= =?us-ascii?Q?mJ4NltJIq4ZWfv0UJ2G1uLdIS5vBWEmTVsWcZ3uoz6F2ItoNgPaS2JYTnmHS?= =?us-ascii?Q?oMxHYlj/jYq65mwXvWRhowm3w7kz+qZ6YXhhm4o0eTDvyYdPC1H10jQZcgXC?= =?us-ascii?Q?V4ZBv1faF1EDBfORlYfzY8MoMOVt1lFqFyEINOwUOXf20UQ6UDH/CKEuyN8d?= =?us-ascii?Q?YjPaKQJGx9DWJqw1ZXt+aBk5uFeh2ysPj2Q0IIeRtBKY3cGwLKfhAZTSCPhT?= =?us-ascii?Q?KdpIqonbn/rLDmPYEOJ0An7LCz4OKGn0e4Jae/P/m8vIP3lhxHU7Gh8GDwdi?= =?us-ascii?Q?41yJW8dVzgc0SczoxATQJxALF1eub0er5y8JzlQzsrikg3g8dbB4aP1WhGqI?= =?us-ascii?Q?Y3yAJ2vBuAPcYGqzySdPS3kemCSVxVHpiN8IMsBt4mt4p/0xiCZI/a8YxJtB?= =?us-ascii?Q?TLk9Xd51blyBNi5zEultYKUua3Rieg38V8F5+ouVdNiuZcqPGd3aPPtMX+3f?= =?us-ascii?Q?hEnL6KUspevuMN01K251VIPqxfCIlxdlTWsXjNYSi+WN044ocmdqobS1fCOP?= =?us-ascii?Q?+yD0LWY+NveYLRLE9FmFa6Aoq9syryEWSvrTPjVvySxbCnRTprhpX0QwamzS?= =?us-ascii?Q?K3l6BhfpbOSZTKFpnU5kmudqt4xWeki03PFKDdlAkMoJUb5Ezj2Pf1zwaLTy?= =?us-ascii?Q?Q7NBePTmk79pHkn/SVQVbYNgwve9p0a/RSmdIbEyOKrZISdHo8EPUwp1ImaN?= =?us-ascii?Q?2wCk03OrsuiOAfsXGfSU08lpJ2WXhWDyeIK/L/8moWgbwxtxGTdgxqHFUtHX?= =?us-ascii?Q?O41/DoTnzCa2JvUESdA=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?w9j8jlv5xKSdyRyvzZCGD328NJVsA/fUqwpZZ6kZm+7sLe1pnedBC6sfYddg?= =?us-ascii?Q?OQUrx6kdHMIhNJxOaR6sKtgHSEYlq/L/+z6L557w+RFBXbINI8z4linoFFHh?= =?us-ascii?Q?Uf/oCLKs9FAd8JszEcDIuENouEG9YgRdedryOtxloG4ZPSy2dAzf9nAs5DNH?= =?us-ascii?Q?PQjENaPOsOO3hsTDSroRULiMHUCGHw0w/uleRGbDogadQvc4IwCJp77o2gRj?= =?us-ascii?Q?j3TEPAlIfkQsOKzDOnyQeuL43+zTHmLw+fXj9V9/piAPzA1AWPvdvrn4Cr1Z?= =?us-ascii?Q?KpkawLCj6A6fTEN9v0ZoHEpDu2HQGG10AfCKeV4dMKstOPa4Dq7BsQaQhO6I?= =?us-ascii?Q?wQbhPl5AFbLF3NQK+I4Wfn8ZW85UUFLufZ3VWgNglVuEKgRUgjMgYIJrjvQg?= =?us-ascii?Q?4Z9JTT+Zz6yoRv8iXGosWt2bC5KcRkKJOVJlUC2BxYzzZDF8IM/vxwq3JXhi?= =?us-ascii?Q?nDwXdSyGjxcFvnELm/1AFq83FMqI5RwlrhKLoGIr9aC3nshwLbOXbIUOmC2k?= =?us-ascii?Q?tX48z1r7Alo5YvRxyuGd+Axfy9UTxDYLrvtJHI6PMvFDBPMsPqWKkJP/Zre4?= =?us-ascii?Q?4JcMXgF9E0dVIbB0v73NXoJU0Y4kWm1ezgA7JbWO0SgbScf/RU34lNKnDOkw?= =?us-ascii?Q?yedKzAp9mQ3WPN9PuUPu7aqhCsWFI876UlTEC9hFkxzgSuvQHBcfTB+dEfwb?= =?us-ascii?Q?mdB3oYb1ITQxY1IPJSxKb6arysIR36OWAxzMcRbaGOq0k71N0HwhwlW3R1eO?= =?us-ascii?Q?BDjlqQfMpMku07Dtkiw6mKDF1qAls7giE95v0W3pC0VET4X4JrBzx8ylPDth?= =?us-ascii?Q?NrTFfO+92HakMDBPbuI2RIjR+Xh645OGAVQ6bTiL9PWK92SVM46U5vqdUACh?= =?us-ascii?Q?/4r9mBrmz32CTrNTf1kuHv6bbJ498LqgbQvh/3vP4Y45pYqHc2fqK1AlZGfl?= =?us-ascii?Q?3RslDfUE4mGt8Y5uG32LUj/VdjU6d18lCiNTMKNW9T175Jfs+rbgeIdkQd68?= =?us-ascii?Q?7vPJSToLsjKY4o9tLToVn/wigUZsIfhnE4rdnwKMzier4F0LM8MO6CyElia8?= =?us-ascii?Q?sFIMmH6kPu9a27SynrIvT2TaurtghHebEupT/ro51wJuOc2IqI3Amf101Ve/?= =?us-ascii?Q?g9LGKR5Gge9JsVsuw6pZeazpHOdrCJAjrU7TOP5DaA7qd64LtqQxwCECQLt7?= =?us-ascii?Q?DU4C5+cZaY5eKe0NJvovwMhUkDk8snQsxKCcYKHbjDALHM8qDryLdaZvp+ya?= =?us-ascii?Q?vph79LbDk0LqLuY563WHMTunizD3yyr2qzgObLw44K1aR5vS+GoQwvepCVkc?= =?us-ascii?Q?iWw1qO1l/a7jHpuU6oa2UA5056kaLZXFZ7EEKadJZS+O2sjIWK8ltUEAE7GX?= =?us-ascii?Q?+yjgN+hos9lE/Gl8TPXKYILBz3jFlIjur0bZeH1e8DLY6Oeg61LCNPAzJ1M6?= =?us-ascii?Q?yAt+e8xtQetlgYR4uvIH+tboblQ6pSy7HZB1r8x62GT3jSZz2XscnlguuHnG?= =?us-ascii?Q?NI9TimJo7w9DFZEIf4IDGilcef38CS0TXburgIWNY9xdw7MuqGoHYgOQjtbK?= =?us-ascii?Q?wgaz+Yh4DC4L2y5ZbUsx50MsfwQjEfFRhLfiZd+qUb8454Uarsb10mTl13C/?= =?us-ascii?Q?VDMvXr7HLu33cJGYPtp7tJrTqexHtFLXbFPq6chxjlgv5CAoHxq48XMM85Zs?= =?us-ascii?Q?PaByK3ZzGjDTAHwoibTHp0AWzHhJE2DN/TRpq9nIgZ3VHbHNJKn1NUQaL29f?= =?us-ascii?Q?6tuzXzft6A=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 57f46851-7e4b-4824-adeb-08de6f33b232 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:35.8778 (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: cuM+aOZW0US//qjK0af7J+Xd8aYFhOTkMHqi9Ui09e3lvl/uSdy/uKavZUsfZuI5JYgbOKF0syqVP3Hjyobp7w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB6805 Content-Type: text/plain; charset="utf-8" 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_PRAMIN_SELFTESTS. When enabled, tests run after GSP boot during probe. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/Kconfig | 4 +- drivers/gpu/nova-core/gpu.rs | 3 + drivers/gpu/nova-core/mm/pramin.rs | 161 +++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/Kconfig b/drivers/gpu/nova-core/Kconfig index d0d4177adb1b..35de55aabcfc 100644 --- a/drivers/gpu/nova-core/Kconfig +++ b/drivers/gpu/nova-core/Kconfig @@ -21,7 +21,7 @@ config NOVA_MM_SELFTESTS depends on NOVA_CORE help Enable self-tests for the memory management subsystem. When enabled, - tests are run during GPU probe to verify page table walking, and BAR1 - virtual memory mapping functionality. + tests are run during GPU probe to verify PRAMIN aperture access, + page table walking, and BAR1 virtual memory mapping functionality. =20 This is a testing option and is default-disabled. diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index f17bf1bf0b12..af5a0ffe78aa 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -338,6 +338,9 @@ fn run_mm_selftests( =20 let mmu_version =3D MmuVersion::from(self.spec.chipset.arch()); =20 + // PRAMIN aperture self-tests. + crate::mm::pramin::run_self_test(pdev.as_ref(), self.bar.clone(), = mmu_version)?; + // BAR1 self-tests. let bar1 =3D Arc::pin_init( pdev.iomap_region_sized::(1, c"nova-core/bar1"), diff --git a/drivers/gpu/nova-core/mm/pramin.rs b/drivers/gpu/nova-core/mm/= pramin.rs index 77916f5b231e..da98208b9cb7 100644 --- a/drivers/gpu/nova-core/mm/pramin.rs +++ b/drivers/gpu/nova-core/mm/pramin.rs @@ -291,3 +291,164 @@ fn drop(&mut self) { // MutexGuard drops automatically, releasing the lock. } } + +/// Run PRAMIN self-tests during boot if self-tests are enabled. +#[cfg(CONFIG_NOVA_MM_SELFTESTS)] +pub(crate) fn run_self_test( + dev: &kernel::device::Device, + bar: Arc>, + mmu_version: super::pagetable::MmuVersion, +) -> Result { + use super::pagetable::MmuVersion; + + // PRAMIN support is only for MMU v2 for now (Turing/Ampere/Ada). + if mmu_version !=3D MmuVersion::V2 { + dev_info!( + dev, + "PRAMIN: Skipping self-tests for MMU {:?} (only V2 supported)\= n", + mmu_version + ); + return Ok(()); + } + + dev_info!(dev, "PRAMIN: Starting self-test...\n"); + + let pramin =3D Arc::pin_init(Pramin::new(bar)?, GFP_KERNEL)?; + let mut win =3D pramin.window()?; + + // Use offset 0x1000 as test area. + let base: usize =3D 0x1000; + + // Test 1: Read/write at byte-aligned locations. + for i in 0u8..4 { + let offset =3D base + 1 + usize::from(i); // Offsets 0x1001, 0x100= 2, 0x1003, 0x1004 + let val =3D 0xA0 + i; + win.try_write8(offset, val)?; + let read_val =3D win.try_read8(offset)?; + if read_val !=3D val { + dev_err!( + dev, + "PRAMIN: FAIL - offset {:#x}: wrote {:#x}, read {:#x}\n", + offset, + val, + read_val + ); + return Err(EIO); + } + } + + // Test 2: Write `u32` and read back as `u8`s. + let test2_offset =3D base + 0x10; + let test2_val: u32 =3D 0xDEADBEEF; + win.try_write32(test2_offset, test2_val)?; + + // Read back as individual bytes (little-endian: EF BE AD DE). + let expected_bytes: [u8; 4] =3D [0xEF, 0xBE, 0xAD, 0xDE]; + for (i, &expected) in expected_bytes.iter().enumerate() { + let read_val =3D win.try_read8(test2_offset + i)?; + if read_val !=3D expected { + dev_err!( + dev, + "PRAMIN: FAIL - offset {:#x}: expected {:#x}, read {:#x}\n= ", + test2_offset + i, + expected, + read_val + ); + return Err(EIO); + } + } + + // Test 3: Window repositioning across 1MB boundaries. + // Write to offset > 1MB to trigger window slide, then verify. + let test3_offset_a: usize =3D base; // First 1MB region. + let test3_offset_b: usize =3D 0x200000 + base; // 2MB + base (differen= t 1MB region). + let val_a: u32 =3D 0x11111111; + let val_b: u32 =3D 0x22222222; + + // Write to first region. + win.try_write32(test3_offset_a, val_a)?; + + // Write to second region (triggers window reposition). + win.try_write32(test3_offset_b, val_b)?; + + // Read back from second region. + let read_b =3D win.try_read32(test3_offset_b)?; + if read_b !=3D val_b { + dev_err!( + dev, + "PRAMIN: FAIL - offset {:#x}: expected {:#x}, read {:#x}\n", + test3_offset_b, + val_b, + read_b + ); + return Err(EIO); + } + + // Read back from first region (triggers window reposition again). + let read_a =3D win.try_read32(test3_offset_a)?; + if read_a !=3D val_a { + dev_err!( + dev, + "PRAMIN: FAIL - offset {:#x}: expected {:#x}, read {:#x}\n", + test3_offset_a, + val_a, + read_a + ); + return Err(EIO); + } + + // Test 4: Invalid offset rejection (beyond 40-bit address space). + { + // 40-bit address space limit check. + let invalid_offset: usize =3D MAX_VRAM_OFFSET + 1; + let result =3D win.try_read32(invalid_offset); + if result.is_ok() { + dev_err!( + dev, + "PRAMIN: FAIL - read at invalid offset {:#x} should have f= ailed\n", + invalid_offset + ); + return Err(EIO); + } + } + + // Test 5: Misaligned multi-byte access rejection. + // Verify that misaligned `u16`/`u32`/`u64` accesses are properly reje= cted. + { + // `u16` at odd offset (not 2-byte aligned). + let offset_u16 =3D base + 0x21; + if win.try_write16(offset_u16, 0xABCD).is_ok() { + dev_err!( + dev, + "PRAMIN: FAIL - misaligned u16 write at {:#x} should have = failed\n", + offset_u16 + ); + return Err(EIO); + } + + // `u32` at 2-byte-aligned (not 4-byte-aligned) offset. + let offset_u32 =3D base + 0x32; + if win.try_write32(offset_u32, 0x12345678).is_ok() { + dev_err!( + dev, + "PRAMIN: FAIL - misaligned u32 write at {:#x} should have = failed\n", + offset_u32 + ); + return Err(EIO); + } + + // `u64` read at 4-byte-aligned (not 8-byte-aligned) offset. + let offset_u64 =3D base + 0x44; + if win.try_read64(offset_u64).is_ok() { + dev_err!( + dev, + "PRAMIN: FAIL - misaligned u64 read at {:#x} should have f= ailed\n", + offset_u64 + ); + return Err(EIO); + } + } + + dev_info!(dev, "PRAMIN: All self-tests PASSED\n"); + Ok(()) +} --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010049.outbound.protection.outlook.com [52.101.193.49]) (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 F037434D90F; Wed, 18 Feb 2026 21:21:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449705; cv=fail; b=uJn1gSdXDyT7k4QhztWV+ERW+2R0umSc4E8jfRFGVBfeDpgqEnQnt4ZQF5goJmp7+cLGkS1HiY6DzTiPwrIJ8SUJNBP/5UnMRvIkyJ9PYOMMaemihiNQOYhEul2w+3v41BuFcBMMm7zMv2Wik5I78AN4rG5YUa5Y0W1QB0XO2/A= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449705; c=relaxed/simple; bh=0+9DDkrctV6COkJs20nXZX3a88jDFybGVFHaEJpFp0s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=HK6cISGOVzJxZXCFskQeIKC7kPUr384ZKPAyn00i1lq7mHkQz6S66zgXFpuEifGHHQbVesRZNdyLvIh5U0PLQLpITf9i7tk//AFJ+uKfeqe7NMfMH3gImMYLzknBeQQoUwti6n4ntGHhfTyY/Ml+k8czVDExz0Ni+rE2AIod+Gs= 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=XWW//QiO; arc=fail smtp.client-ip=52.101.193.49 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="XWW//QiO" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Nsg7yutQs1rkARTahg4n6Vce6bdehwRNT3xg8JPUxeS+92rj01M47tHbyIf9qO0aystL0b5IhTj638Fo4mN343Di0/X+GEeKZ+xoqSTYPuLXJRX0FpD5c+FSgZ5TNEqx+3LdOq9GP6Lfdd8wZbdStIzVyHQLm4u1VsxMiGRngkmn/rxGANlWnKU9Ps34BjqFHhDkGREoXfJDU8eY0V0aMCI3zvCVSGw12aBv1wn1y3YyWX5OIwXJfRu2l4b0r6caRC2OI99av2bAJ2NmFPtoDoyKrsJlhqDRZabSnGksAekzFP7uGVLJgckchxBoMX6oRd5LHo6742hQVP40Ju05DQ== 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=lV0Tmup9jTUjNGCSO4uJh074QDi6mCrTIysebtuSLUw=; b=bZbhsexjAQqaewtadbxhvBJeE95tKfLccEmtrypPrTMgna270f7f7hgNbCRV2aYtilx4P37VOgbvHFDR/uzNuw83h752btcgds4kw03vUNl6btbF3BBaqAAkJ8ZAsYaQ8yo4IU5mbS4wNENsnqg7afjM4cbcdnAzPFnu9uu3zvSxQuWU3RNfPyYs4k63A5bboWeS4mRBz/FQnUFXaixwGV0m0o0kkNJwAziYznWOGRD7y4ouIIpaQssVfX83HBE3E2PsPrbpmlb1iKKq+HSegqUtCT9UrvBMgpKsuJZr7y/UU44vIeOpKAUTlNxE+lUOfb2q+eTsqrQiBOHkSf5Deg== 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=lV0Tmup9jTUjNGCSO4uJh074QDi6mCrTIysebtuSLUw=; b=XWW//QiO7qUdEBfvr6QeGv7QDXAcFF769iHBh6BYY0xHWfBVPvPk+JF/dPUreWOheV+utFSyyDw7uIVvPf0abVkazaXEiP4Imd2Sx17hJqBT3E/epN8vHvtJztYjMqsJZOgVOCWVWnXqdxL4Z4Diwk5o3wRcM2r2MwUt2r7OB817g1x35uRAhZL2IGeWigfoLlIpfZ2v6fFad/BHFO8WERY/U+6+8RsJTDOv7nwT8U0BVtocHo+ATv+12qxOx4yfr+ATMUQs6iPSZ0aylGPkzpzjzifJx3NvNC6/uSu/Hh0dO6+tzTjZd5tPoEkdSq9cXNmNCKjU7R1Ts5K/RmvzjA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by SJ0PR12MB6805.namprd12.prod.outlook.com (2603:10b6:a03:44f::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.16; Wed, 18 Feb 2026 21:21:37 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:37 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 20/23] nova-core: gsp: Extract usable FB region from GSP Date: Wed, 18 Feb 2026 16:20:17 -0500 Message-Id: <20260218212020.800836-21-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL1PR13CA0260.namprd13.prod.outlook.com (2603:10b6:208:2ba::25) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|SJ0PR12MB6805:EE_ X-MS-Office365-Filtering-Correlation-Id: 5b396135-6d3e-4bbb-8676-08de6f33b317 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?+60Kpy+FN+hgRP9JgiNurphiDbfchGKd/5RDnUZo1MzAou59+PWnc74JxWtK?= =?us-ascii?Q?GpZkt2a+OcwYiDO49BODHvZ7UDQGvZoZ5f/B/7WiK9iBNdixGQu1H7c6+plB?= =?us-ascii?Q?qAJUc1dA3+uAKizRRCoQESjmc5bM4r09bXVAJlS9fwWIj21IjpvEtE26GnBS?= =?us-ascii?Q?4N80q00H84fPQhTmZ8fP65Bg3o4IvK0Li3p2dpIMAMdf64aLE/FsesVgHwy9?= =?us-ascii?Q?uqpZwZhNhfsb8CMvcZYuaVlOalnlTYCfY2KDAXUilcrHKb+KzcUP8Hd07Z9e?= =?us-ascii?Q?A/wy6H60jU5TfEJaW9Mv2qOaamyvAnoKdIU8T+krOtUouffXfg7PwxUg+19p?= =?us-ascii?Q?MBV5PL4QKDqxp5Cr5mM5BACvqIi/EZxcM5mHXIsgEbQqdd567ID473h0Y8Sb?= =?us-ascii?Q?ZtwyWDJWwO2hoEubavFa+xbxn5VsXShPd1vwBTcJmkuuPpf3AUbjUFVmqa9Y?= =?us-ascii?Q?vGX99gw21ari74WYx/JWagWLuVSGAWuTBWW+G6wPL22c1gQv2U5x9JfwZ/qj?= =?us-ascii?Q?rzJfdA+xj91a65Ftt3UaS5yp35SfY9YvHiGJTOd3Ooto7518EZTh29d75R4a?= =?us-ascii?Q?35OMzSh22X7cq3qlLHynowVmTybdI4F5mX5jHbE52jHwHaTTxA14pRpKGmLV?= =?us-ascii?Q?qDemUaRDU9DGMUHjIfZUYZ7eyTpEpzDxP2wdXfFygjP4JOhCj/kyrfiiMnWy?= =?us-ascii?Q?goU5EqWWawm0A0vTme/LPN9jOKubkcBl7Q0NOcK1T4dlW9RWrvjGhvZCQqg8?= =?us-ascii?Q?RBK5dPljA7m0y6BO16El0D15x8+GPxDe6t4F3gEihZx35qYwfIJV1xMdkBUV?= =?us-ascii?Q?6SUOsHb2SYFkBu0BXjb7NOJGix2qlRJFKWz8JwDb3UpvwRAZtcbCaqPrHRBY?= =?us-ascii?Q?BPvmLIqNyOKZXmxaiDuyl11In1bhmdmF9QSaWFtHLpDoz6X5icgYb0CyUAXE?= =?us-ascii?Q?UaQnVFTKgl5PCZnGgVBdOPcG7C83VkGTiYFdVTnHqFSJu3sgCUJJ+r+xSNzz?= =?us-ascii?Q?tujUrFmNBcs6AGpS4kC6eVQQIHlBoW35UlFNkKdGMY80qEjb1qYsx+4EG3fy?= =?us-ascii?Q?THHrH6tXqbo0BRL/LxqRyCG8fo0iiKMHYtsPRU2qVVj4tF6noUz084FqND/M?= =?us-ascii?Q?lz1c8Hdkm6XqkVozXedU9HkB7VAoSFmSfbGu1m6bbZFxaObu7ghB19CqkqTp?= =?us-ascii?Q?KAaJwTQkdhKCKvQnCmp0fmse3JQfgw5/962IXL17T6QQ52TzXTS6staqkoWP?= =?us-ascii?Q?/5/aQB3DlPsNMyDBGaC+PJ8TC8WWxpFKCRBkS5tOpiDMquHPPxOCXAOAgB39?= =?us-ascii?Q?/rHzGLxV3goL1nUaUEMnYRdAH/LUiI4Xu6nTaEbi4LdIPT0faRnBeupGywDP?= =?us-ascii?Q?1TSz50ixLX+8C1Jkc8HfIbd2XaTy0h0ZpLOoTPXUIPN9dUZlnfUeGBP51lxc?= =?us-ascii?Q?VXvjID4hL4wEJ2jdcMzShiNGxDZgKV080PFR4uRzS3QQGEZaa4E7l7pUlYcS?= =?us-ascii?Q?wpLRAlkhJvibxMRvwtHRIRkt/naa2KqD5D3aVacR3L/82jcQsdKw0onm6kle?= =?us-ascii?Q?ts9Q/khCTF6dROA8KWY=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KaMjDGzSOmZoZvyfhmpWKdbEbnPvzJ5+hNzciLBEfdfdnxsenVWrjtMkDCUf?= =?us-ascii?Q?LG+l2nslECNoUyvDJMLqQa1I312Ie2V7r3oThcAFM6zUUdvrXjaozAX9WWER?= =?us-ascii?Q?uGIFbeSB8HGOg/7bngfF3PzeH8mqo3JH/k09+wP4K8tUVoUcjP0ZQ73EZ6KR?= =?us-ascii?Q?QXRmQgWwWVmxpbeZwewD0I0KP9uA2gxxBTp37KCTlHq/vuIY8sEYHOw24+xP?= =?us-ascii?Q?a8J2h2iLT6/ns3v2Vpgvx0vR5dbGGuILGLHrkbZFjIv4utNCkbPviIIGfw41?= =?us-ascii?Q?5lTylDPFwdYHO/eyErf340hzRgZ9DgwxHK0drsODesKIgmWsyQvfrvrVIEvF?= =?us-ascii?Q?sdk6P8T3fUNtCq1MSmSHHSG2rLVdYMmC0mr4vV6oPDxT36GwHrtbouTpyfB/?= =?us-ascii?Q?zJxjawVUnrgLsVx9T1XgQx3E3VA4HcqHe4tUD1Xn2U4ohryzH1FshRGigx8F?= =?us-ascii?Q?5W5dvVxpau7XJ9gVWuhmfglYTp1NsP3BaG3cyYktAVUBPdiQZf7WvgT1v21g?= =?us-ascii?Q?9c7iTfK27OsbrpPBmev1zyJRK5vr26KX8rq8gCiG4/uiL6K7LOU/Hc1OvIZb?= =?us-ascii?Q?8VGq7WnquaZoSAMxZybxUwWrnwO7nlhiydcajubPNSGnIk7NxS+jJj1LUfVS?= =?us-ascii?Q?5msSpwUtBsJa6jmdArAE7RrENi7MPzWfuox8ZxYwB6SmvvGWuKCaFC+lwwA3?= =?us-ascii?Q?GEzaEGU18BCBAHVcXtPjLCXAsabiAQevynwnAwbj1hRDB8hecAJtK9pBMD8g?= =?us-ascii?Q?iNEEd0jeNZRbxkoUJwnZFAobUQxN071ttE89R8wy1hua8GZ7KMLR32LJ7kPR?= =?us-ascii?Q?zDoSaQjw5rkT9VZTAkjIDNIqj70+317Yxphn8PhqAjbxHbd47pHU9r+2p+Y/?= =?us-ascii?Q?Dhq1ehDIJTdc1fbHWwP5Pj4gMlBFka9V8XlWjpNR1pF/gN0G6F6Y+ycQ2WLt?= =?us-ascii?Q?wNVmJNpnpa0xsS2BJwPuuMih32EoS9JhUCMjX9djfJdfuc7EJx5c1hrld/9V?= =?us-ascii?Q?xSq+c9BF5ZjJz0MyqsiihewuwsHsoxkJGUgV1Z/4UmTB8q3Lwu1pkyLJ7ENJ?= =?us-ascii?Q?DKDk+ZNk4qwYj4ScoO7Yd0070bzee4unmMKfbMs72XWR+IaLkClSe+dZrQye?= =?us-ascii?Q?Fif+1O32U3+mOHQy2EaPMleYMWtnjQImvtd1C+vssf9kOp1Fw4A8ZB1Ad1hq?= =?us-ascii?Q?iSfgx1qddXqGh+0o/+j42HYd3vFrtsF2Mpgv2pAp6KvXrF1kc03upZ4JoyoE?= =?us-ascii?Q?ejxn49PahJWBc2ZZV20AIuG8yXxnnecAo2KhKzGcIGPvM5yXJ53cM34sEmyG?= =?us-ascii?Q?CS0grYDR/C6nc4gvPhd5pQYlq3HTGptDLfvbPY1WY/ByrlVcp/02jvxdfDr2?= =?us-ascii?Q?BU2LHK0wpV1Cn2TB3XdKg9vuO0uvnalKJGuzlGdWlH3mPwnKNHa9ir0+INLD?= =?us-ascii?Q?djEdGJoxNHsU2OrNDIeqbxxvCtfa88dXjAWMmEmQID/3DRS+s0GJfH96HGCn?= =?us-ascii?Q?86tjNQpW1lS+Ap953NY2AFawTsLtzA6LNmkaODb6Up2ebajoz8nQywdgWnYK?= =?us-ascii?Q?IgkR5yat+GmD/P9HuawRek5jmhB7meMJ7FjORxxApa7uSdDxYA3whCgCcLCO?= =?us-ascii?Q?OlwbId0FD1YZk8iSY0asbua77PUhMMjGU9rMV8m2Yah3XYsE/7icqGpurOeR?= =?us-ascii?Q?NyqEyPkpAnticgdwnYN5k2g4yQ+Qiusq2eKC4Kmi+VemHGq7XKappgSzI15h?= =?us-ascii?Q?Tblk+17g8Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5b396135-6d3e-4bbb-8676-08de6f33b317 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:37.3423 (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: lV0jk49Ssu9oGne/jYcSqC3ckw0rGJ8fOZ/9ivvUKYTcuT4r7WwdOGM7WheM0VmvQIKlzJHDifZxNv6Yv06BIA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB6805 Content-Type: text/plain; charset="utf-8" Add first_usable_fb_region() to GspStaticConfigInfo to extract the first usable FB region from GSP's fbRegionInfoParams. Usable regions are those that are not reserved or protected. The extracted region is stored in GetGspStaticInfoReply and exposed via usable_fb_region() API for use by the memory subsystem. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/gsp/commands.rs | 13 +++++++++- drivers/gpu/nova-core/gsp/fw/commands.rs | 30 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index bf9e3086565f..44f8b08683f9 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -186,10 +186,13 @@ fn init(&self) -> impl Init { } } =20 -/// The reply from the GSP to the [`GetGspInfo`] command. +/// The reply from the GSP to the [`GetGspStaticInfo`] command. pub(crate) struct GetGspStaticInfoReply { gpu_name: [u8; 64], bar1_pde_base: u64, + /// First usable FB region `(base, size)` for memory allocation. + #[expect(dead_code)] + usable_fb_region: Option<(u64, u64)>, } =20 impl MessageFromGsp for GetGspStaticInfoReply { @@ -204,6 +207,7 @@ fn read( Ok(GetGspStaticInfoReply { gpu_name: msg.gpu_name_str(), bar1_pde_base: msg.bar1_pde_base(), + usable_fb_region: msg.first_usable_fb_region(), }) } } @@ -235,6 +239,13 @@ pub(crate) fn gpu_name(&self) -> core::result::Result<= &str, GpuNameError> { pub(crate) fn bar1_pde_base(&self) -> u64 { self.bar1_pde_base } + + /// Returns the usable FB region `(base, size)` for driver allocation = which is + /// already retrieved from the GSP. + #[expect(dead_code)] + pub(crate) fn usable_fb_region(&self) -> Option<(u64, u64)> { + self.usable_fb_region + } } =20 /// Send the [`GetGspInfo`] command and awaits for its reply. diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index f069f4092911..976eca5a59c4 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -122,6 +122,36 @@ impl GspStaticConfigInfo { pub(crate) fn bar1_pde_base(&self) -> u64 { self.0.bar1PdeBase } + + /// Extract the first usable FB region from GSP firmware data. + /// + /// Returns the first region suitable for driver memory allocation as = a `(base, size)` tuple. + /// Usable regions are those that: + /// - Are not reserved for firmware internal use. + /// - Are not protected (hardware-enforced access restrictions). + /// - Support compression (can use GPU memory compression for bandwidt= h). + /// - Support ISO (isochronous memory for display requiring guaranteed= bandwidth). + pub(crate) fn first_usable_fb_region(&self) -> Option<(u64, u64)> { + let fb_info =3D &self.0.fbRegionInfoParams; + for i in 0..fb_info.numFBRegions as usize { + if let Some(reg) =3D fb_info.fbRegion.get(i) { + // Skip malformed regions where limit < base. + if reg.limit < reg.base { + continue; + } + // Filter: not reserved, not protected, supports compressi= on and ISO. + if reg.reserved =3D=3D 0 + && reg.bProtected =3D=3D 0 + && reg.supportCompressed !=3D 0 + && reg.supportISO !=3D 0 + { + let size =3D reg.limit - reg.base + 1; + return Some((reg.base, size)); + } + } + } + None + } } =20 // SAFETY: Padding is explicit and will not contain uninitialized data. --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010049.outbound.protection.outlook.com [52.101.193.49]) (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 B42E634EEFA; Wed, 18 Feb 2026 21:21:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449707; cv=fail; b=F3co+Ic3QlTsmGvY/u6YLepz/ACDQ5yoDDlrgx4HdvB/uzvfh1oykzltWq03cIRfqVoB+tQNuWnAX7SqrCrV5/Llcid8WGAp9O1qsMR44qPbUjlkCnE0cQq5+3ryraX4Gm7mbBusa3kJIF4OwMg5ACS4fEBnEI50yqCTUr3wkx4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449707; c=relaxed/simple; bh=oUrNcbXIOPagriH9P2Iut//vvoE1nx2QFc8n8p7JPFM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=jxXZr/FsUOIawlaKjFi5vKJ7iA7R+gmBxZifHF8yCg5s+yl8vgurh1anV4/OZW7sMI8ekL4aV5jt76p+BVwdii9QYzTT0A+Ps7HURudA43U2L4lWCGqFHF5cTzG65S3y9XeqyCRkEIWSZNghXi2G76smNLfmF0sgwAq9O/RXbXw= 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=c3jQdkLz; arc=fail smtp.client-ip=52.101.193.49 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="c3jQdkLz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YQb/5rXXUwlP+led4Nxcnm478Zvu4qj+38OeYRsRWy55PBYX2csoXGD2UK0kRVNNv9lfOM6jZ1IfoM5qWv9OQIUGRIvRS+Kxedz+m1yJ7GCJVSHbkJkzfKXGzaamFlU0rIK9waXQRxnMQC0sY5Wax4rt39UW/k56lkWR60ew7FZ5OPhnQprE02l4p4Sqb8oqfe+E9faMc2jNOanzJG20WwipGGpd/mxXNFVRSAVYmMmWcrJiYAryni6bClTukBd7W2gl8XNgcVWACdGqHtQoBMF4RiJpYyQBg//rprUJ/5Mc2L4+zXvilBsKVzUlBldqE6kVNgro8ymSZBLwyYSLyA== 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=uC5xqeRpKePwkM8gzGQTJz9rgA0jif1S/46rGUE3Z9Y=; b=JW0NuPcwQEN/xKnwIaINmrP0hqzzj5dIYFg5iQOrXJWrojIV+K8HHEkfx3pbczDQwoVsVOB8BOGISf12QdCoL43fFwxcpd9uelxJ8HoNbBCJDQ3sADUJptDRXVvg9StvH3uPoASuohYpq/kYizNTMgAZmyO+NiFlCefIquivG7Oze5Plt621mLWFKdUTw39FRvB5U2Mjem6b44EKyZFeOIXSKamQntoPLPhLExwc7TB03ljZscn+3fZLi51RIlqBQ56qNc4UEV9Do+KvBBbWDRTx7nd0odWLJ9ic0n631sIDrIvh71DSQ8Yv159G5sEJIfb2iuVsybNPpY87sCFlvQ== 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=uC5xqeRpKePwkM8gzGQTJz9rgA0jif1S/46rGUE3Z9Y=; b=c3jQdkLzxetiBuHDjjVaOvJAIIskL3baet+Yxm93lLTLjL/WIBjF4JzXfOmQntF3LoG/l1epIM1WwKW1vgImD2ikiWlL63TBikB4FMr8k82bY6HpzZKp85zsc+rxvkKMjMGz0wxR43GHq0gORdJ8KGeh5gjHIIKc2/5RIwz1i29wR/7v1EIzjg3sIYi9ABqxOKQ8AKT5zrLFewEZ4zOKGmwH1BDttHQ0/U8Sz0q709Hcj8FoxPhTTz09krQn2YNOclWlR0gTbWOILQf7cwpTEbLdzdfWLWyVF7uPKeCUyxD8JyS8ODXpGtzWa5LVrZwz38ZKn9WGPVvEGuKSkEpk2g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by SJ0PR12MB6805.namprd12.prod.outlook.com (2603:10b6:a03:44f::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.16; Wed, 18 Feb 2026 21:21:38 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:38 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 21/23] nova-core: fb: Add usable_vram field to FbLayout Date: Wed, 18 Feb 2026 16:20:18 -0500 Message-Id: <20260218212020.800836-22-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL1P221CA0043.NAMP221.PROD.OUTLOOK.COM (2603:10b6:208:5b5::13) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|SJ0PR12MB6805:EE_ X-MS-Office365-Filtering-Correlation-Id: 5b825681-d8f1-4f0b-c1c9-08de6f33b3ed X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?LWjguJrYKFADJXqSVDTST7cRj0JaYQNDTUDgMv9jSwAgHXuHfnK1ipwJsg/Y?= =?us-ascii?Q?BIK8eYJ7kBfBSMvQmtxpTaaN35/YzfrL2qW+WDGm4BYijFQ1jprU+Gm7tRCb?= =?us-ascii?Q?VDhw3tASLwCSTvGOgFpOIhctllK89Nmowwzsg9xEFe/TXuTi7YTzgNZs3B3L?= =?us-ascii?Q?+ZIKalaPdLLNI46J10Rr3RyCWQp3GE8FnNqQd89jb+C3GT3gwig/MfuJq2sB?= =?us-ascii?Q?skJmV4JOpPXmp9PUd+Z0LmZ+MO1ExcsMorxbu/9+KzjxlANIquOyDEaHOPFA?= =?us-ascii?Q?Hb5bfTVEpz+J0fKk/RwlVxcJc85FWfszyV9D8IppDvnpUeyDE/a3VXR5cZ79?= =?us-ascii?Q?P93LYDDcfczR1yLT4UPqpzySmdCLI/hB6f3wlWhDzqqAxiUHhtafRpcT0NzC?= =?us-ascii?Q?EPw8EAMgRE92/mkGRSd+YGPG1tkUWuV3Kbrdy82srCa5C02DhCx+ic37eFVE?= =?us-ascii?Q?DUbXhMaj6Tusc4AX7eri91cp0e+5E0PirSseiUzYLI/ApENLdEwCaTQNJzc/?= =?us-ascii?Q?AXjmwZmcXSOpGp3Syo+Apnr+W18PJCOlwc3BNW0vPQS74pwp/s9z6AWreRg8?= =?us-ascii?Q?/U42ubZsIsx4H18YZkRqw8oj7pfqWgyNeZpijE2X/AsE4efFkDfGldUzwOEP?= =?us-ascii?Q?Pal4fRM3UtfaeJadq/PHJwKzZBTFWSJqVTOzjZP8rpaTB6ZN1tkf6CMjK+TR?= =?us-ascii?Q?qFPmJOC32lU7bFpxTzVKNAPBAYscHlvgdP68SO9WrTDp9OnpKUavKOvwim3R?= =?us-ascii?Q?qzR3pH3GBtJ4Rf4snO5hKcrJnl5vb4SIOsND/EF1I0fQUaMDctbZe9GNMyfm?= =?us-ascii?Q?zm6jtxRDvHkSFIpXTWIdmDwZE9HLMYeoxk7wvvrC92DY53kiROD/rzjtbCOx?= =?us-ascii?Q?gk+D4kHJGKGNDNs3qfloPpBvHyixYBNmPXXGdBTortsnJfVOsOT3Uh7uX5g4?= =?us-ascii?Q?TM7ukakMaX16bXkZVYJYnET6I0t2CAlgFeTQPyyUMi93OhFNfySXD6vkMKK+?= =?us-ascii?Q?niockTKjijtJbi0IO176q6RbrerJNT5knzH8XA9Q52pk590qUm1T+tp9hcqR?= =?us-ascii?Q?AeaUGR/AwK/sEbH1d8tUCj9Ng/aJixFIsZAQ56vcaelaYzvFOrkOt46yCaqu?= =?us-ascii?Q?9WjuMQL3EXqvf7A4AHaSEWC9s86DTAHZeDaGgMFSMdDtG37vzXMc+lnzklDh?= =?us-ascii?Q?FLjcixbJpyWY27PuCpScRkZNKLbf+rU/6hHZceF/l1n2oyWxwb3WluyBleme?= =?us-ascii?Q?3IzwtN4sIRUeauOi/KopbSLOV+nLbcPT/Cbj9wKmMzvFnbFC9oTaJznhoj6h?= =?us-ascii?Q?tjtZwAf7wqHXUWeQ8lyNKXyaghDwQP9Lw8NOVvHME7WZqYu7XhiMtMnZnCDL?= =?us-ascii?Q?MlM+rZsHaVx3Mdk54qCOaw4rxYqLw4nrjmJ6C6FC9Uy1Ab32yGlWCrEUWCyh?= =?us-ascii?Q?/vfBmprzhjks1UCzqC9gL1E/l7Oe6OzMaVvAyh/klH0apWt9D5+bNxUyofb4?= =?us-ascii?Q?KxEebepQIGHf8r3i33/IX06Bho0HUAOh8gTWQW+erH66goKgAz9s7AKeaCDV?= =?us-ascii?Q?yGsTyM9Z+/eTPavBshE=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Y0KsSnfpifeBJlPneN6ReXG1MX3NFhFVihs/TnIm88V3BIZsDm2IDg/fQWbB?= =?us-ascii?Q?1ZZn5dvOHxcTPJYyEezF8geXQ/yQR5LXjimGiJlVU/TcfD18lL8FPxOYbuMv?= =?us-ascii?Q?Jdl2zMwsPq3XJw3HVzACjDIEIxsOI48Oo4wB89ocusO4Ool8C0CCV22RMB1r?= =?us-ascii?Q?AmE4LaEJKkGKizapigqoshi0GmSjXMHwzh6GllsAlqfX3MMnFv56kRQFEEdL?= =?us-ascii?Q?CIBnJKzYBuqGwVJRyH09Yj9c5MFzSMZXbhJC2qTyiIZ7gQnKA4hDvEilxFrb?= =?us-ascii?Q?UUr4PxFMY2piEo2vzH5voZYH7YkKcZ9HakY6oiiX+vzc53kJTXRujNUab3TG?= =?us-ascii?Q?fI7r8r5YbJSZTS0Ihl+WYRFiNComr1JaTU+9i6G6PBgWHQx4czrrSotkO4w5?= =?us-ascii?Q?KNgvjWOY0rHA0siX59FNwNQ8jY9XshGfwDlzRW3JJ8R3is/DM7B0QJN5WsO4?= =?us-ascii?Q?TgMNCy2P/vWNYECm7gvRwFfp9WW2UJmSNl3url3kr4MH33nGRuiqoHlLWlQD?= =?us-ascii?Q?CIM3dxUTjO0M6DkgdyMr/vzLbIi/V+GSwY0gSd4MCgJzcEcNvmD9yzT5RqkG?= =?us-ascii?Q?X+dlSqBgcE5bGqLoEBQ+pw/N2tIXpGpyu601NnfI+BCchZqkYX9q3UH5SVj4?= =?us-ascii?Q?2c0vBn462FyTN14jixPWywXEHvSnwLEf008l9tsIi4ZeJevTeTGjoxIGw4T4?= =?us-ascii?Q?PLUuXO6ddzeqQAZn0uxtCWC193gqPrCpaRhV4k6MR9EdYplpsQapHantuaZR?= =?us-ascii?Q?YhIY2g8WF90oqhpQjB0lX1parvujIECgyliZnzWVKIjJLW1tgCgdzx7v1FDs?= =?us-ascii?Q?gDINNGNI/p202P5+MZ+snonCsRAbbgGqFaCpN47gQ2rW2Lfw13jm1oEwzmZ5?= =?us-ascii?Q?cNsYQG08Gw9+OPV/Vs3IC+Qd6XictCOzUrgPw79L3Mwl6n9QZwg1Pwwr66wW?= =?us-ascii?Q?Vqz0H3CUE0YocBZAjKcQp4ze2bAfLbY6sZMIZ2XMmHAluaqd5VpGTROnCp3X?= =?us-ascii?Q?1uH4VVNimjnPmztk5jb2t4TLh81PrUdYfGJ35QiVGA6BQgXLksDKw5QOUGir?= =?us-ascii?Q?++o+EDtYxViyhEe3VbIdqbTxYAHhW64jPeZgahCX9CP8APWMIS0fs8zSOY9t?= =?us-ascii?Q?VBeSXGf0xsTd7wh7GGs3K6uVf7YN6hWzv79A1P0FxpbdtptrvvZMapOlhf2D?= =?us-ascii?Q?dHZWFDW65VFL0cnlJHYtgH8jDCURYOQyVPYe7+utvobiNAPwo0soHXJku6op?= =?us-ascii?Q?0WvwvNkDGjnmWsZZcIpIDSJ0FqEnnkBfchsltKLvpZHKi1lyNDWfrHlihIpy?= =?us-ascii?Q?hFEXpp+5yXZB8B7gei5pW1tvmBl/yywbctBXPvojzxEzppH2Sx6aLUFka5Az?= =?us-ascii?Q?d5It2+CcjcGFgVLOTr0YeLxImNKQ647sDNC6wd5AN23br3+hrCxAgq/y03IK?= =?us-ascii?Q?4KFgDnBwUfPtYlu9NHOid33Q/6927GQrHI99qhGXebTWH9UIVDO1M9kzXFjr?= =?us-ascii?Q?Kbx4HK5FPYW4ckmRbI2rnIG8abnUodbfkk8iZ/h7OD6SFbanNjcTi1OGw4lI?= =?us-ascii?Q?vLYQ0+/RK7IxoF+OoCZbYqsFiDNo6TfMvvGh+wLl2kSNW9tqG17j2gtCXOx9?= =?us-ascii?Q?Yl/R/Ny68bfPonYbdzPz0H0yiq0N0hH8DlWfIfgCBj69ZAswUvs7wmcbOZww?= =?us-ascii?Q?BChGPVGbYdpellXPVAHByjzV8rj2drgp6Dh7ynd5BFmcmqPnqi6W+O9nORSW?= =?us-ascii?Q?XfBtJik3iQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5b825681-d8f1-4f0b-c1c9-08de6f33b3ed X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:38.7510 (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: MlljmiwNWpPyrbZ5m7M21rdPQBiXPtVbFMFR76P5E8roY8ASvIY903iF9lVTtJaG/qJBoXOI/UvY0M5/rMYpog== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB6805 Content-Type: text/plain; charset="utf-8" Add usable_vram field to FbLayout to store the usable VRAM region for driver allocations. This is populated after GSP boot with the region extracted from GSP's fbRegionInfoParams. FbLayout is now a two-phase structure: 1. new() computes firmware layout from hardware 2. set_usable_vram() populates usable region from GSP The new usable_vram field represents the actual usable VRAM region (~23.7GB on a 24GB GPU GA102 Ampere GPU). Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/fb.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index c62abcaed547..779447952b19 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -97,6 +97,10 @@ pub(crate) fn unregister(&self, bar: &Bar0) { /// Layout of the GPU framebuffer memory. /// /// Contains ranges of GPU memory reserved for a given purpose during the = GSP boot process. +/// +/// This structure is populated in 2 steps: +/// 1. [`FbLayout::new()`] computes firmware layout from hardware. +/// 2. [`FbLayout::set_usable_vram()`] populates usable region from GSP re= sponse. #[derive(Debug)] pub(crate) struct FbLayout { /// Range of the framebuffer. Starts at `0`. @@ -111,10 +115,14 @@ pub(crate) struct FbLayout { pub(crate) elf: Range, /// WPR2 heap. pub(crate) wpr2_heap: Range, - /// WPR2 region range, starting with an instance of `GspFwWprMeta`. + /// WPR2 region range, starting with an instance of [`GspFwWprMeta`]. pub(crate) wpr2: Range, + /// Non-WPR heap carved before WPR2, used by GSP firmware. pub(crate) heap: Range, pub(crate) vf_partition_count: u8, + /// Usable VRAM region for driver allocations (from GSP `fbRegionInfoP= arams`). + /// Initially [`None`], populated after GSP boot with usable region in= fo. + pub(crate) usable_vram: Option>, } =20 impl FbLayout { @@ -212,6 +220,19 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw= : &GspFirmware) -> Result< wpr2, heap, vf_partition_count: 0, + usable_vram: None, }) } + + /// Set the usable VRAM region from GSP response. + /// + /// Called after GSP boot with the first usable region extracted from + /// GSP's `fbRegionInfoParams`. Usable regions are those that: + /// - Are not reserved for firmware internal use. + /// - Are not protected (hardware-enforced access restrictions). + /// - Support compression (can use GPU memory compression for bandwidt= h). + /// - Support ISO (isochronous memory for display requiring guaranteed= bandwidth). + pub(crate) fn set_usable_vram(&mut self, base: u64, size: u64) { + self.usable_vram =3D Some(base..base.saturating_add(size)); + } } --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012061.outbound.protection.outlook.com [52.101.48.61]) (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 CFF6F34F481; Wed, 18 Feb 2026 21:21:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449709; cv=fail; b=WV7F0FaMmgu71RsQxR4na/6KmY3H8wqSFycsHGQQM7yZXy5YqgYnNYtil/h3hu+RLn1nxdM/r81k9tDk3ZETlT69Aco20hzu3K0LhmDYuwLUDRr648lQ+RIEAzpoN1AOTvPDrTkNKT+cs+YOc7Nv0Ws3QGSPAdDGkc+4WyEnvrU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449709; c=relaxed/simple; bh=EXp+hY0ZwXIVCU+HQSdGJUo1fKAuXi1zw4FNsrys+so=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=MlxvOeJ6VB/8SjP27i9AdcCOm+dW3ZcJS89+tSRABHvsnrgI9sUjWvCY9zZpSYpNHQkaeq+sYvpjYwMS2LmJmta+krKShF1z0Pmj1IfYLxJsp2hmzjJxTzz5HDTZ5A223v9Y1K988XHBAmhlBBPoDJ7rwSJfvrdH5Es1EDQzqb0= 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=SxDxqwhn; arc=fail smtp.client-ip=52.101.48.61 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="SxDxqwhn" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Rp2Y+stt3WSxWy7PClrvZU6rQJ/fvMKncocVN1rSJeVO3eDi2rD3XWEtuo1MUTZ0TDHYGXPu9JJCmzOMovW2JpXT7T2WhGZ4y4DSj/hGCv/cAap7xuOPGwP8Bs5Q7lq1e9tya+94sw/g+HUAkYb4JFEW33T7f3T+fp8SpG2KsN4bEQ3hVQ22WM7HqRp/3WA52ov0zSw2y0CZQTnp5Bc79IzNucwCdd9+umgOF6Rh2GlaEFs/tBEcCquFEqqrmyuXKopJPVb98gV9yNoBiUt11zocsBr8Db7ZdNWLv9WVEw7U93+UU2lPXN7GHUB/WPmE9MJW7pj/KcK0gNO/dn8sJg== 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=6Qp1LCdSFwsty8d96pzqazVljLBZaX85Lut2glWyFgo=; b=e52AgmUaX8SZ0Yc/KZEIXnceg10/6en6v+XuM6K9oPJhIdddwmu+xoyEd7B3Qb0kwaHf0mn1zGgf/OxX94/ahRhA1PZFF/HWkAU8uQTHIcrfh5ZsMVM8cBrfLju6zlNwIXjA1wOwxN6Cj7CNxSmgj0mkfCPnz33mFoF+rdUvE86i9o0o8MiSQ4GJLuig8BmpIq+R7jkZny8+X4hXhuSa8KNKa17Omtv3QBRxHEqBXiSqqdhUnmkE+PoXy9aYr0MUt8MUWjishnGA6/Kr9mFbhdysNSLCKO6fnRcxIe5XFKJBqIFkyQ74G+IXQMTCrotPpVRh119Q1bEo+fVgpZr3Cg== 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=6Qp1LCdSFwsty8d96pzqazVljLBZaX85Lut2glWyFgo=; b=SxDxqwhnPiRkxrLfMD+AqHdu9XgAaUVbhulPFb6x+s4JlQ//NFBpdAmZOiQYln9rNPloJxUALsNkiX7Kh7x5ufgKWzjmwOVv6/lajwMWDkoIAZiqBXt/D444hxe0eXoA2NawEtdCfkAezMLXw4j8o4DntRL5BjnaIzQ5SFNx9h84wVJ1H9NcycVb+yHCNiDvI44PVwcxzaoddI/ra0AQ9HAdn/aGkpALUcT4QtnX4Ef74+b+Re+tZVsJz3e11sgv0w0RA/igOjJ32ThpesWN69h6EYTqrrcww+U3zgzOdR41pbmsHr6GbLrKgBnR99IS9YAJqJ05rh2U+Cl6Gz1fWg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by SJ0PR12MB6805.namprd12.prod.outlook.com (2603:10b6:a03:44f::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.16; Wed, 18 Feb 2026 21:21:40 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:40 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 22/23] nova-core: mm: Use usable VRAM region for buddy allocator Date: Wed, 18 Feb 2026 16:20:19 -0500 Message-Id: <20260218212020.800836-23-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR20CA0048.namprd20.prod.outlook.com (2603:10b6:208:235::17) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|SJ0PR12MB6805:EE_ X-MS-Office365-Filtering-Correlation-Id: 60a8a7ec-ac09-434b-274f-08de6f33b4dc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Xw6X3pHVE/YhML/SGfObOa1C/EL/RGS5hw7XgkZUz+ZYevtHJCFm8SSY2eit?= =?us-ascii?Q?L+YLjJLI3OcR+BnazovlawhByISXY4+F9soZDMuAx6IfQfTD5JaWUfNU6vK6?= =?us-ascii?Q?SQEwNa5GBUcRUfUlOYDkllQ/lx6IpWfI5di/qBenJs6FZLL7snjJ/O4uwKxp?= =?us-ascii?Q?k/EufdVSlve/5LdvqY4QSstj1gy5LQNnQbPvBHSOqUc0uE1fXJCL7lTchcZj?= =?us-ascii?Q?zVRjTcoie+RlDSF9Jx1DQlnlqyg/sTxI+qHP2DOIGXagnwn9KqyMVtp3x2kY?= =?us-ascii?Q?Gs9971HotuIZtHO7+ydlLt2277mEkZer9MpID4uRvElp5cX3M4r7plswwNyJ?= =?us-ascii?Q?iY+04usDLgtOScS+tRqZKESR6UkcLDd6+HGnh5pP4dTxY3koQlBQQjnSIgMv?= =?us-ascii?Q?jKcmQsXcC8cdiFhiSJDS5pwPb29tKfCZhY8tsYKZM5jjuUYMZ4pLdEfJCo+r?= =?us-ascii?Q?h5uLL+UXxEZfAddVa8Otf8PfEfRGJsQSL67lKj0T4pt2JySOavaxTFYozarz?= =?us-ascii?Q?nyJ9QOWoFS7w7pHh9FLcTNoBylKJ0kCZ9Drf3dJV4r3sX9VMLactTNTmBPfF?= =?us-ascii?Q?FjAVAVBlLSM0JjWjDvrw97HjOXhJv7i1lNAzdadvgErOaEz1eWr/jSvzIAm6?= =?us-ascii?Q?e0NWYsLmpufEftELauEVMSz6mAdGn0arjdxKngpgdXlMCM4ubKD41UBump2l?= =?us-ascii?Q?4ntOwpelzG2dvbdXnadmcI6/4GCmHPFV4bjf+RKvIE3GkD7dit0gbgml6OmX?= =?us-ascii?Q?pNYQkAuVIv40oC2zrTgfxoJ9bSls8u+0fBqc1mRHfE0ieFCoIKuZTS6A4UJ0?= =?us-ascii?Q?deM9lTsfXzXPGr+ldYCHA0S2WfzPK5NPMvdDLPIm5qzdpj3zKGXs72GnMmsH?= =?us-ascii?Q?5fC9orQISO+5ixiz8CBVpPVAoH8G5OXP6PpRfw9NoQ1pCK+bPUJLzqYW1XrF?= =?us-ascii?Q?Zu3xLkxrrtlvLXMU8n2OV0EASlIp/raM3K1i9D6cr/LBS+oYQzWVcEdnIxZ2?= =?us-ascii?Q?hqc1sKVFzhFUvhiJ7GLemcuzIHfAEdSpI/YZfdg0Hcjy2ml8GQvV8LBuuBL1?= =?us-ascii?Q?9XykfXKu8cHiFnTWSDqAvwjjwqF2aMW/aDTpqPDbdAQc7BfXEs9p7cCc1e1v?= =?us-ascii?Q?G9lvYmsRi7YFzdfqHwgg5yZMJu/UOSYvwEJ9/U/BUgjYGRCXdMjiXvhsI38R?= =?us-ascii?Q?Ezs9GXJduy+3jhLJAFW1KbRlSoEFzCyIMN/zR3eTwSQbbU4xKF71RR7Q48mK?= =?us-ascii?Q?NaBjeF36W1AibPQRp2qAWaomJeLgvGy9PBzJjDntrrkHaLJFfarMCwtrYgHn?= =?us-ascii?Q?3iN2rA/BsHzIxFpS80jv8rrAXiOsa0Dzq9TlzT8BobnM/hFirrVdPCMF9B/j?= =?us-ascii?Q?PHF5YmBOaZCAIdDMBDLq8a6hFpOaUKxCEuchwVo0oKIP1s8jOZXbZo7JhgOD?= =?us-ascii?Q?s26yPZMargfql+3U3ZvaSXsSYoSH7e3/xB1AIXL8X7C8wcAn4hW1iMYimbky?= =?us-ascii?Q?hmMTTReC4ZKTw69441uXu8DYrce9IprEKTd5ghq/k7eiMcCYyfrXX3StVcYz?= =?us-ascii?Q?ffSNiBEKGl+f0ERCHHM=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?XPV0zbdguj6dCVF26gT2TCah4IxG5vyOaHe7nHjO3Q9aGuTUm/0gSGPV1Coh?= =?us-ascii?Q?KV9HbpUGN2mhwi7+D/4UDjTNtnEdSKAqJTGLgaa5PeYjNSx2yIsmvc3VRW85?= =?us-ascii?Q?J8zZGyK1v4crSFLnl7qgQFPbzKQU4mKhGrY7zsusMR+jpwsDzmwscEh7kt8L?= =?us-ascii?Q?BAFk38rAAFfQTzu/VM5WzS/q4W3mrjt9eqXRqASnxZR5HsLWBOJiZtGYIqa/?= =?us-ascii?Q?myYb/riZctob9MtaPixxYbbjja6XZoSADr+AeUBfc4K4YlI9v1ah8BMWNS7r?= =?us-ascii?Q?SdIHT8nFSiPrl7dXqa4/GYEn7/Do3RbMeo0yfch1ZzBmIsQIvf6bF3GqBbXj?= =?us-ascii?Q?rrmz5RrL0f8cMt4p8DxoB0NmJm9kyaVFpNmG84OLRbQKsAiAoS+kK6hX5dxn?= =?us-ascii?Q?KW4c7sFAY7CYVxH3lI6f+9MR9Tc+bfjqjKV2aCldPGEWuMO2PU4jZLrwYMcd?= =?us-ascii?Q?+AxJ7yYFv9eyhm3CdbrQ+G2+KGCRwRJM3R76RPH/dog8Tsp84uwo1+gHjAJe?= =?us-ascii?Q?gApRDlXD0MsZYgNwhvLMpsgN7jmeDS5gjwnnd0fNyv+VidI/DvGIf8h0auEv?= =?us-ascii?Q?D21Erq+No5lEKhb/j46+xSfRJInnwB+hGESxSAhj8v83Q2nD2e5f1ZJrKj9y?= =?us-ascii?Q?q0zYPhtL1FIn129HVXtK3Gnu52g7Cg3/plIY5lL8S2ZqvEEJq9R/xrHmbR9y?= =?us-ascii?Q?iEccdZoTSwXePAr6I449XuaU6RUotve6wUmTL570U9lqWLJs28+CcZjFNcdb?= =?us-ascii?Q?VmTyPOiwy5/iiQ73IEfRxjOtLcVjZU4hTpgd7aaz1wpzgZko44/g7PY7GozM?= =?us-ascii?Q?Vn7tI/kBzb/mRIW5S8pYcQMDE2/NITuYtOjWm62DgQlxElbedfYaf5C2LeO2?= =?us-ascii?Q?k5AI5Wi5KYIthW4axw55gzVcXlbHQpHESyZH+1aMMGsPzm7yHG9FgZztBXM5?= =?us-ascii?Q?4o2kCSJK3Y2k8BVPDT9qG2Y1Ppu1kJnO+g4bVMKH1mNdSKuIcr/cJThtx+Yv?= =?us-ascii?Q?FvXzLWnGllxUfOmv/EmfTikM1rCC6duWx7WY0ElwpGO/Ss2R75KpKwdvl/vf?= =?us-ascii?Q?xU4/WiyawP5khOBD6KY6VmOe428zeWlHLmunjLt+g8qcA8/IyKkR52zueSkR?= =?us-ascii?Q?+/7CQOpjXzOjwRhsz/nIute/iDnqKkq8EMgBcSD90IoTNUMILEVCCizYapfT?= =?us-ascii?Q?X1dNh7L8vkxnuc/Zc51gZA/f0mB1QICM2xDNTFLLhj8yKJFCT/gmeQKwEuuk?= =?us-ascii?Q?niZruZgCdAFrYrkRVHwJOY9zHNZCAdcGuDqQ17G6aThU1RMYmo4ko9eFw7sR?= =?us-ascii?Q?+IRZVndNK4BmZQn8tCLOVvxrTg3ik1aOh+2MHTeFjSO3kk0p8eSgUqt/QHSe?= =?us-ascii?Q?DZ/v50Z3Fc+vKu2wqnpXWk+0Y8sVt4r+5kcMskoRsrR1gvZoeOWvrtjIID3y?= =?us-ascii?Q?ZUQZbbrbdRtpIf0jgo8IIVBqjUdO4mtYL6G4F8Q4oI5w8SuuU96QfeMgFyQ2?= =?us-ascii?Q?CONmZAkFOkt9gbwUBuQo6mvd5rWPQ+i1KtmXBi8wUHmJD+MHDXX1vbWX3fdJ?= =?us-ascii?Q?fu5C8WsaROptl0O/bFECjU0AMGBlrFhrQHkY9FcEcgvPVCtcKQHltcciZ0uf?= =?us-ascii?Q?lilbFj45TMZ1iV2zmXE0tGMHSoNhM3jo360F0V0e+E6YZlYGFmxTp7yXXdzg?= =?us-ascii?Q?1iLrod7+paVV5kV/7yLygJOFsr83g/vmXyYAcX/6zVt8KG+dm/3/4RrIQKow?= =?us-ascii?Q?5/Zkoj45dQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 60a8a7ec-ac09-434b-274f-08de6f33b4dc X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:40.2598 (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: Xx/FBiHPjHC1DNlAGFbPIZOnD4tBb5p28pDURFBxkQQl0yctun7liw7swmSndbiwTPGkQfhWFDZNzcvP5REKrw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB6805 Content-Type: text/plain; charset="utf-8" The buddy allocator manages the actual usable VRAM. On my GA102 Ampere with 24GB video memory, that is ~23.7GB on a 24GB GPU enabling proper GPU memory allocation for driver use. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/gpu.rs | 62 ++++++++++++++++++++++----- drivers/gpu/nova-core/gsp/boot.rs | 7 ++- drivers/gpu/nova-core/gsp/commands.rs | 2 - 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index af5a0ffe78aa..670a2a89c6ec 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 =20 +use core::cell::Cell; + use kernel::{ device, devres::Devres, @@ -7,7 +9,7 @@ gpu::buddy::GpuBuddyParams, pci, prelude::*, - sizes::{SZ_1M, SZ_4K}, + sizes::SZ_4K, sync::Arc, // }; =20 @@ -28,6 +30,13 @@ regs, }; =20 +/// Parameters extracted from GSP boot for initializing memory subsystems. +#[derive(Clone, Copy)] +struct BootParams { + usable_vram_start: u64, + usable_vram_size: u64, +} + macro_rules! define_chipset { ({ $($variant:ident =3D $value:expr),* $(,)* }) =3D> { @@ -271,6 +280,13 @@ pub(crate) fn new<'a>( devres_bar: Arc>, bar: &'a Bar0, ) -> impl PinInit + 'a { + // Cell to share boot parameters between GSP boot and subsequent i= nitializations. + // Contains usable VRAM region from FbLayout and BAR1 PDE base fro= m GSP info. + let boot_params: Cell =3D Cell::new(BootParams { + usable_vram_start: 0, + usable_vram_size: 0, + }); + try_pin_init!(Self { spec: Spec::new(pdev.as_ref(), bar).inspect(|spec| { dev_info!(pdev.as_ref(),"NVIDIA ({})\n", spec); @@ -292,18 +308,42 @@ pub(crate) fn new<'a>( =20 sec2_falcon: Falcon::new(pdev.as_ref(), spec.chipset)?, =20 - // Create GPU memory manager owning memory management resource= s. - // This will be initialized with the usable VRAM region from G= SP in a later - // patch. For now, we use a placeholder of 1MB. - mm <- GpuMm::new(devres_bar.clone(), &GpuBuddyParams { - base_offset_bytes: 0, - physical_memory_size_bytes: SZ_1M as u64, - chunk_size_bytes: SZ_4K as u64, - })?, - gsp <- Gsp::new(pdev), =20 - gsp_static_info: { gsp.boot(pdev, bar, spec.chipset, gsp_falco= n, sec2_falcon)?.0 }, + // Boot GSP and extract usable VRAM region for buddy allocator. + gsp_static_info: { + let (info, fb_layout) =3D gsp.boot(pdev, bar, spec.chipset= , gsp_falcon, sec2_falcon)?; + + let usable_vram =3D fb_layout.usable_vram.as_ref().ok_or_e= lse(|| { + dev_err!(pdev.as_ref(), "No usable FB regions found fr= om GSP\n"); + ENODEV + })?; + + dev_info!( + pdev.as_ref(), + "Using FB region: {:#x}..{:#x}\n", + usable_vram.start, + usable_vram.end + ); + + boot_params.set(BootParams { + usable_vram_start: usable_vram.start, + usable_vram_size: usable_vram.end - usable_vram.start, + }); + + info + }, + + // Create GPU memory manager owning memory management resource= s. + // Uses the usable VRAM region from GSP for buddy allocator. + mm <- { + let params =3D boot_params.get(); + GpuMm::new(devres_bar.clone(), GpuBuddyParams { + base_offset_bytes: params.usable_vram_start, + physical_memory_size_bytes: params.usable_vram_size, + chunk_size_bytes: SZ_4K as u64, + })? + }, =20 bar: devres_bar, }) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 7a4a0c759267..bc4446282613 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -150,7 +150,7 @@ pub(crate) fn boot( =20 let gsp_fw =3D KBox::pin_init(GspFirmware::new(dev, chipset, FIRMW= ARE_VERSION), GFP_KERNEL)?; =20 - let fb_layout =3D FbLayout::new(chipset, bar, &gsp_fw)?; + let mut fb_layout =3D FbLayout::new(chipset, bar, &gsp_fw)?; dev_dbg!(dev, "{:#x?}\n", fb_layout); =20 Self::run_fwsec_frts(dev, gsp_falcon, bar, &bios, &fb_layout)?; @@ -252,6 +252,11 @@ pub(crate) fn boot( Err(e) =3D> dev_warn!(pdev.as_ref(), "GPU name unavailable: {:= ?}\n", e), } =20 + // Populate usable VRAM from GSP response. + if let Some((base, size)) =3D info.usable_fb_region() { + fb_layout.set_usable_vram(base, size); + } + Ok((info, fb_layout)) } } diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 44f8b08683f9..8b3fa29c57f1 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -191,7 +191,6 @@ pub(crate) struct GetGspStaticInfoReply { gpu_name: [u8; 64], bar1_pde_base: u64, /// First usable FB region `(base, size)` for memory allocation. - #[expect(dead_code)] usable_fb_region: Option<(u64, u64)>, } =20 @@ -242,7 +241,6 @@ pub(crate) fn bar1_pde_base(&self) -> u64 { =20 /// Returns the usable FB region `(base, size)` for driver allocation = which is /// already retrieved from the GSP. - #[expect(dead_code)] pub(crate) fn usable_fb_region(&self) -> Option<(u64, u64)> { self.usable_fb_region } --=20 2.34.1 From nobody Fri Apr 3 08:02:05 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010014.outbound.protection.outlook.com [52.101.56.14]) (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 3634734F49A; Wed, 18 Feb 2026 21:21:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449709; cv=fail; b=DJCPx+38s4D1a3KRCGUoyRhsyk06kTxftvMg/RUEuUVRx7QW8ztVurBDSAcW78yG9dESs3CuFTOPqRA9K1EbQOhRJMma4LYxhUUPGViPPbq3sZmLruZkFvuKH6dSVsvSKBhD6UMQn44aTD/5XksOmJC2SQXmQjD1AMQxsifXy0k= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771449709; c=relaxed/simple; bh=sjRDVIpfyfZznaoqn+t3qfRGvjlWnzjQ2mF54x+FTMY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=UaLDAM9U9q5IteM4A+Bx8MVx+NgdZkkWuUnOiJa5UXTGkl0qRPV/OaDEXJngdNBI5s6F9n2Al8Ms0CReXa4IrrwsJq0JkX2e+MsvzDKuYplY0Zh3455hJ0CQh7ImkcggxeJaJQ56AT7rjrwjCnVVWUr1eZ5rPopvezAHfw0NDHQ= 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=ghlkt1jp; arc=fail smtp.client-ip=52.101.56.14 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="ghlkt1jp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vMM4bGAFQTsZA8YVrEovUUcufPXYyai2nUmiwHo9421Ch14a0cnhuAqnWc/7p9qu3LeT800bpLWh+nZobfAKlH4pbzqgBKoaLeSc5LY/XpFFMX4a8VY4Ks+7Lv9ihoJvgsC6cS4vY4UNK6FWwuolCh1GydJFE2zNL4DJg6UriZbgx1A8VauAyfWu6QgBBT1dUm8JUjC5FG78hnyqIguYNpe+QYX90B6VSRxuP6PJLSMu07xfU5c6m5M2ubFC3ZeWnOImNWdAmSjfpb4TdnMkbuEZJBKWH/fU5nyknokU6rfFtKXcR/EpxJyVMZoco023mKO8ZE1JAm6hIx5qcpayiw== 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=oEFoi0XF3NRMKs/0e55+d2lFKLXGaXv3MzDlki0jRHs=; b=THE3HelhnY5mE+tfTLKqYJ13AXfrMtUYUmlURwZzoBPS0x+vj5tHdwyl/jHWIe0QPiKenDvebR3wtQ12o627YVI6PneRu7DAusfVTtJTwvCf2Uke6qDEOedItcSCIP/AGTS6cUjXGGJSbz8kGFfzPH8C4i8TAFfe1VjB9jtMpGn24j0VZ8HCVFY/MM5a+DlnZoPuQeITmWRu4sUJFZbaoR4WZp1VwIwhQJ4f909QTzKBS0+/ROEZfVnpz8WGQ55PpoP7F3ooNk6UqPOwH7f177ObfAcacl59+lOlRbp5xFv3Xo5eOx8FJ6E9hcKpd/OjJ2FweJArPYGJDNnGwKl2AA== 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=oEFoi0XF3NRMKs/0e55+d2lFKLXGaXv3MzDlki0jRHs=; b=ghlkt1jp0jbYexMnu9gliu9C4+oQUpQA/A4/soLvpUNGffJY2lDDlASFr3jAutw8m9QVvVMRPhyK4Cq2tMrY/s2dxcXic5o5elAM5vW7I4I4K+B1sdSaxg958DYx0pDgndaBzHroD/4nkMuNsaUtJQD7hVzGsF4csh3o82/VCvCMIIf8psvH5mZCJN6gzyZ/QWwSVKaqs3WqX7yLUSUi50Mz15UkgZ7Rno0EofiyCWcvdA1rZao957h3/MLIrgAVaFkYgs2tNn1gmfxHqAeKesTkYrmbFadjYHDMRF5GzGmm8unO/PEWLVzJICLehf/0dssG6YY3xWSruyJlKaoaZQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) by PH7PR12MB6636.namprd12.prod.outlook.com (2603:10b6:510:212::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.15; Wed, 18 Feb 2026 21:21:42 +0000 Received: from DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33]) by DS0PR12MB6486.namprd12.prod.outlook.com ([fe80::88a9:f314:c95f:8b33%4]) with mapi id 15.20.9632.010; Wed, 18 Feb 2026 21:21:41 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Jonathan Corbet , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , Huang Rui , Matthew Auld , Matthew Brost , Lucas De Marchi , =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= , Helge Deller , Danilo Krummrich , Alice Ryhl , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , Daniel Almeida , Eliot Courtney , joel@joelfernandes.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-fbdev@vger.kernel.org, Joel Fernandes , Nikola Djukic Subject: [PATCH v7 23/23] nova-core: mm: Add BarUser to struct Gpu and create at boot Date: Wed, 18 Feb 2026 16:20:20 -0500 Message-Id: <20260218212020.800836-24-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260218212020.800836-1-joelagnelf@nvidia.com> References: <20260218212020.800836-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BL0PR1501CA0034.namprd15.prod.outlook.com (2603:10b6:207:17::47) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) 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: DS0PR12MB6486:EE_|PH7PR12MB6636:EE_ X-MS-Office365-Filtering-Correlation-Id: 5c319d2f-5666-4997-4e32-08de6f33b5a3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?CDMJHqlqBAx5rnAfBaQmElB8YOVDKl21ndD8M2QxzbcZ0LWrbXQ9NG9tuWSf?= =?us-ascii?Q?Cx5ANKGpO8FU3PLLW4P38omQDBtjYpkTNmxEwKfuohF4Fz155ZvL5ItAuEO2?= =?us-ascii?Q?VZALkk2Ov4HOL1s/vrT4iQVO57+edDBpbCAer0MT+fg8zjetLmDgnqi3O6x6?= =?us-ascii?Q?GfUHI3E94oorsJNJXmW4VxYf9o4wVufd6TD1LZZufeMiFCLILPCrynvbg7IU?= =?us-ascii?Q?GgSbs8scMsNbP5qVyW2DUfFq0Z11iIRlXougYs+zU/vlxMDmOIV7VuhGNYjQ?= =?us-ascii?Q?7IKACANL2GYerXrfSy2hKn1/roYCIKS49zfi8kZl0yziejsuZjNPGmWPEOg2?= =?us-ascii?Q?4V5EfyE3zoN2B7YyOxbJKUPhX8S8JdN7cXXtnkJBioZiB0aOSRM9YRMYhbI3?= =?us-ascii?Q?IaAGivx505JUr82wbzO6XwdoeEvAn4EEKxNJaphkZHMdW0lFEImQq9Vv02n9?= =?us-ascii?Q?iCSmNJOPf7gUBHe7ZdpGCH+iPNvSel/gBZ9+heJd1yQt7fVCywdmnajZZQS6?= =?us-ascii?Q?qkkkAqYWme4EnFvrSkwkhxDhFAo61EeXhKp0QmGC0ZZSsMrCMR764vrzdy3n?= =?us-ascii?Q?qmIrga8zp6aOHiZBEXrokXXTvPe5CeNPgYivl4yzL0Uhg5mpuZMxeWC34HPk?= =?us-ascii?Q?IQ05GlmJ2KVzds8emxzuJQtjfony51XJaNvIs78Nf/Ze718oWTZUrHE99RZk?= =?us-ascii?Q?coh2xWaSuxTcxoXS237/OMlSWvJgZn0Q5TB3MzQ/oJd+nvFr/aAcHlQ5Rvp2?= =?us-ascii?Q?uHQ7MzdUEpG/mpf9UQA2JXQml2MzDNPQvDtHztUzSLLh+TmUeODFxtiLfNFl?= =?us-ascii?Q?XYSdc90kzvlI9523/iES56TPJScEb+LQdJ6iAjTHwmgGqnjhW4iGErvLy/+n?= =?us-ascii?Q?vJyUSIvJX8HB26rrJDK+Dnizjo7pmw5DIwzoTktUF206bOkJVNBD34mpl1+7?= =?us-ascii?Q?+77rXq0OxWXfSZbFO/gOYr5cI7x8k36E9hyu02gqzN1Fh2+0a7LsxUn+K2XH?= =?us-ascii?Q?HCzcOzZR+1VYNA3mIbRWe55hzfk1FmjfaYZx1EnaYPqzQbCpmBp2G2tY8M+7?= =?us-ascii?Q?Vobr0x6Al5eyWfV77i/Afz+ZksJfYABwb6rTWtk5gEFUOKd5nhycgBKjxPSR?= =?us-ascii?Q?eAc9HJAKmx6l4efl9jmuKHxMkOtcDgYzokvIopaNCqS4X4/mMc9821hSWG4x?= =?us-ascii?Q?IDcIXbddXSRbigaCV7vXqRS6MyMIKTGSLcyEccy6rhA5KMPP2JpztcvuI+Ip?= =?us-ascii?Q?6LwEuAC5zD8q5K+lNFHlOHXKRSg1KO2V9kzaj4NNlkeGES4ei7Q+M3EHFBUK?= =?us-ascii?Q?qlkVZbgR3uDcxalDSrUJuvYWbCWNCZOaW11/1v2kkXg75G43n1soEXraPNEF?= =?us-ascii?Q?Pgr0YVH839fb0qsggh8V9Ks+B8L2AMYeJdCtD7yRil6DF6+W/6MxAGcOCOhv?= =?us-ascii?Q?7SL8kWWWgWyZ+3PPPbfGzZ0k+SPSyBk93eUUqSoDJeou2+Ywrmdydaggm5BI?= =?us-ascii?Q?+W0wLaCbl9CFNlzoXzOFITfxHJUubP5rfeRWA3kBJ01s3aurSVuRNWZQbXLx?= =?us-ascii?Q?B/+gZ38pYkE55MgBMMw=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB6486.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(7416014)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?MD7/HA18MlDKQ7OF31CvU1E17IcM2cU16ejQyBdX2iH81cVYj5plW+vljj+e?= =?us-ascii?Q?X8GSC0RMszgzOdVGhi+5dN4rHOcA9WTeLVZHN0yyBV352wEi5w5E0vK59Wl/?= =?us-ascii?Q?fmvgbpiwywdXl798A9M7kh7bZ6hIPBxhvf9DAzfu4VQS2Onp9YXK2ubvqq31?= =?us-ascii?Q?QX8Kq0HqwBmMFG3rhBCG+A9lBZFsC67krYTwsRlr6Bg3Jl3lY1IfUwDCvAJ+?= =?us-ascii?Q?i6Ua6ImX45wp2rp7jXWhUbbrwUBpDa7Dj1brh7X1+jO0kFizNSpNtteDf1ta?= =?us-ascii?Q?RBWMGH6ZswOXxCwlamzNNUPmdS0c3DBJkyBwzD3RZe+5yrr5mc5BkFjTWAcs?= =?us-ascii?Q?tZahJKbjsGpJnM80Dp79wZ9OCd2/0uh5p59shDk/HZ9scdIwJ495KBDoiWcC?= =?us-ascii?Q?KqjEDV07arhnUWcaCeCNaOFw9HucYnqIpYITg8IwIisNEyfSn3Ze5yzUwjDQ?= =?us-ascii?Q?JoFW40Jx6d6hXqrB0LwgA/6pSzCxTrn3xY6nevlKFj9A0+UDOs55dE73/Suz?= =?us-ascii?Q?rV5uIX5GdfUxoaHM73pVZ39SF15DZmhidEKW0rlSzioYs+BUm6B+3Xsv89tN?= =?us-ascii?Q?vMasHhRvtmHFLmIqLI7vy6JoGZ+VBfa3R9yN4Ae+N7+6F0Z6iNIyx96e/sMb?= =?us-ascii?Q?9wYfq6yvdJgzx9ZnddZvQcjJ/AixcObE3OBYi5sTbwlYxhm6tJkZF9dVKNNO?= =?us-ascii?Q?oHSsWdrUAO8m9BgjXYDF+7ZZKw73SPoshSXmNuiWCqnBw4z+UrtdLPQtBZqr?= =?us-ascii?Q?MLt7MVWvNUnhKqTsNQMLgXwyTqGrgx3ISg0AqrFKy2n5zGb4Cwpp5hewmj0U?= =?us-ascii?Q?u8opg1Laab0iw4dsSxvbdfAe7b53dh7/hsFKHgIF/yISmC5RFGKBiaHPYI1b?= =?us-ascii?Q?Yr04uxNaAhS+COuFBW2QKUsdx1MsEpf4elDo2dTjs6tNxMM38Qh8kiFSkmmN?= =?us-ascii?Q?MrvYct6acEO42rrLEzV9UOQdCxH1GvlxrSFJppDfCdRhqeq25I/qMN+mfmKD?= =?us-ascii?Q?Ky4ZhVjmL7+akYQtPwGYUjwIqxdLkPkVTB48xq5grXr2QVUDTn3qCPVoJYmx?= =?us-ascii?Q?X/QYt/TYiQgHsxuNGQQZfVu668ct92utENOK/EAwVjhC/lllywJfZ67o6cRw?= =?us-ascii?Q?9//kbXBYv4V9U0sLL6fp1y0Td08PK/MnLZOz+gk46yfTq7XITWOau9EWPNCS?= =?us-ascii?Q?945a5oXcZSOoYCBNItsvsR2orPXTJ+HLZuXe9NUHy9w4LTXtv+QxRbY2CkF/?= =?us-ascii?Q?Bxh5w2+bvx+XnR2Az5DYrez0VKNcA4TgKZS3QlxrctL6K7PlWlG7WPxSjtx+?= =?us-ascii?Q?Vig9UD4JiTSGp/qzAoq9GrzfkuvvOnjBRKCOdMBVa1dK/BMtS+AaKzP2HmEu?= =?us-ascii?Q?lldbC7QmYkTN42pCxL/Sqg3YSjrxGJtXQPu8v4nioK01ZJ3rIRlCxc3NTI3U?= =?us-ascii?Q?V5+Oeeb5htjxeenKdq3VJRASnjczNqEwEtbvBC08nCCHstLm39yWR5Qw5JnD?= =?us-ascii?Q?MxZbV5LxUGce5b4zNroRKhvkLShdn7uUSo6uroKqVjMSLUhGSdz5Mo5/LXQz?= =?us-ascii?Q?9zQozmprF9NCoxWZKPwookuXQkZu5Wd2EAFuSPhLdqxqFdg2+z49WL5HlJH3?= =?us-ascii?Q?J634/OvfCUDQM8rGrP+yTQKn2Vfs64kwBhr9cBhVLpT0Irqrl5gU8ALsT2qk?= =?us-ascii?Q?eojgIbzl057vn8APPuxMpIgO5nuBBI2bRqGWaplVGS1wDO5uohXIUl44fDV5?= =?us-ascii?Q?TYDseo/Ffg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5c319d2f-5666-4997-4e32-08de6f33b5a3 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2026 21:21:41.6863 (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: GBnH3t+aq3yiWwcPoUzeSVaPIk3L7yExpChp6cJ6jXpaGPmYtzTcl+5E8BYczob0yDCN5yZZGvWoWMhpODYSnw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6636 Content-Type: text/plain; charset="utf-8" Add a BarUser field to struct Gpu and eagerly create it during GPU initialization. The BarUser provides the BAR1 user interface for CPU access to GPU virtual memory through the GPU's MMU. The BarUser is initialized using BAR1 PDE base address from GSP static info, MMU version and BAR1 size obtained from platform device. Cc: Nikola Djukic Signed-off-by: Joel Fernandes --- drivers/gpu/nova-core/gpu.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 670a2a89c6ec..159ccea8464a 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -26,7 +26,12 @@ commands::GetGspStaticInfoReply, Gsp, // }, - mm::GpuMm, + mm::{ + bar_user::BarUser, + pagetable::MmuVersion, + GpuMm, + VramAddress, // + }, regs, }; =20 @@ -35,6 +40,7 @@ struct BootParams { usable_vram_start: u64, usable_vram_size: u64, + bar1_pde_base: u64, } =20 macro_rules! define_chipset { @@ -272,6 +278,8 @@ pub(crate) struct Gpu { gsp: Gsp, /// Static GPU information from GSP. gsp_static_info: GetGspStaticInfoReply, + /// BAR1 user interface for CPU access to GPU virtual memory. + bar_user: BarUser, } =20 impl Gpu { @@ -285,6 +293,7 @@ pub(crate) fn new<'a>( let boot_params: Cell =3D Cell::new(BootParams { usable_vram_start: 0, usable_vram_size: 0, + bar1_pde_base: 0, }); =20 try_pin_init!(Self { @@ -329,6 +338,7 @@ pub(crate) fn new<'a>( boot_params.set(BootParams { usable_vram_start: usable_vram.start, usable_vram_size: usable_vram.end - usable_vram.start, + bar1_pde_base: info.bar1_pde_base(), }); =20 info @@ -345,6 +355,16 @@ pub(crate) fn new<'a>( })? }, =20 + // Create BAR1 user interface for CPU access to GPU virtual me= mory. + // Uses the BAR1 PDE base from GSP and full BAR1 size for VA s= pace. + bar_user: { + let params =3D boot_params.get(); + let pdb_addr =3D VramAddress::new(params.bar1_pde_base); + let mmu_version =3D MmuVersion::from(spec.chipset.arch()); + let bar1_size =3D pdev.resource_len(1)?; + BarUser::new(pdb_addr, mmu_version, bar1_size)? + }, + bar: devres_bar, }) } --=20 2.34.1