From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012001.outbound.protection.outlook.com [40.107.209.1]) (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 EB807368294; Wed, 11 Mar 2026 00:40:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.1 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773189654; cv=fail; b=snCRl1Q9DfPTbi6pqDV2gM9DE+cS/4SQfof3NosXhQE2conMprs/WR73IDlrYGQYCKgWFRYq1nfKDmZpFZGZDAOSLd6GsP5yacaW/zxsmeW3djs6xxySw/qKV0FOg/rnrky/qOb1gNU6L65TkSuHOz47W2WsstpAdqGU1bMvpVk= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773189654; c=relaxed/simple; bh=ha1Dyv2a+eoI4cTyHvJ6CHaLml68cZcWWoCuv+Q6A6c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=jtOw7eEqmhvERt77VuCYnx7Y1WFzD+KvqzOUXkFsQuCmn6h56feLvZiIH+ajNbHtG4gescbnf3TfQGBNxai1JZykcXhLvOCTW1BEE+BRWxJUrnrJaQl9t5wLA6EIIlmfRD1Sjckoh4vO3X2PBphCSJkQsVwV0lTe4Lvlmy2VsB4= 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=qhU6P5KL; arc=fail smtp.client-ip=40.107.209.1 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="qhU6P5KL" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QfLvlaT1rAUyRZmIC8L5isgmeGa58w87Asrp64Q/HXpI9usT8DZt3s9rgy37zcJQEWq1Ac05bxjXnMxsjCbpi+4SfjbfBRVy7Fjel+HS/QiyTtIDWk0zfBQkL36C0uGLhjp1uvxbIxQcEyYwdCG26eQx7vh7Z1bFYsLH+cTx80io1JdrlThAPWK+gBTBXYNoxga51gYG1MnQ7LEFUN95imyOptKsZKCvN6kmh8Mzm/mlzsAYKgQjGBEcAdZmTjAU79J3g2jHI7d0WxbKb1u36EId8o+3dFW6vcaOb5pbPQpinv8AhHjCsZzyVckST0dtaHKZ+AiuOb7cKiTxz/Y0CQ== 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=kIrBwu2vIm7Qv/38/Fon3a8r4O7Lsyzc45gD+zI4ewg=; b=pXFM+TdKreRXDQVfh704nKdivIyepoFE6fHWHY6iKohlWjMugETqy9DCDtKaiJ0M7GX7loLksY8WiPzC8FFcrmtplXNLss5eZROF47Kpnz3K5WuZdUySapnEVwXcTGdDtNa54mHb+OiuuN4xmnldBa5L4KMPFFq+n8dPsHUyUOPmGmfLZDXVTiOOEoZRoBmRT9kYfcoWryQv7VcyepL0JkE6ybCPBeAE1o2ypcSDPm6jJDa4Ire+sthANeC+u0xXnKuBIo8+Q5j2sRexa66g0J2uCQ9nDsc+bp6WmRkTnpMcML4m2IM7F71Uz1ZE5vF4ygECvC2/Dn8jTm0M3zsC3w== 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=kIrBwu2vIm7Qv/38/Fon3a8r4O7Lsyzc45gD+zI4ewg=; b=qhU6P5KLMHAmHXJ/Wme5ImcXuqQm7o3ULJu5Rrwt4NqnBv8CtCyAOaSYQMJq5NLsuSW8LgtNZVCUtyLZerWImc4UrV6/vQjokC+Z5wzowMyicfYcKRmFsdI08yoxYVMdIg7gt4gqVGS7DAZdUcyAsq37rDbeT1yZGlPIJdb+yOR4qJ39wa2OIYa+MdChFBfP4FP+iKdcKlSNJIVEBDKKge3O7Vgbn+RCKGGHq837JRerCicXsNxtyw88BfRFuqJv7CTi9WumFIsugjBCrzbZjfIBs7SDaDrbfp+cFKB4fJ+1gEIQ/MOYtSRxCP9OxpTjDrVt4Y3gDVt3lIRQCgXCBw== 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 BY5PR12MB4051.namprd12.prod.outlook.com (2603:10b6:a03:20c::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.11; Wed, 11 Mar 2026 00:40: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.9700.010; Wed, 11 Mar 2026 00:40:36 +0000 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Dave Airlie , Daniel Almeida , Koen Koning , dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, Nikola Djukic , 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 , Alex Gaynor , Boqun Feng , John Hubbard , Alistair Popple , Timur Tabi , Edwin Peer , Alexandre Courbot , Andrea Righi , Andy Ritger , Zhi Wang , Balbir Singh , Philipp Stanner , Elle Rhumsaa , alexeyi@nvidia.com, Eliot Courtney , joel@joelfernandes.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 Subject: [PATCH v9 08/23] gpu: nova-core: mm: Add common memory management types Date: Tue, 10 Mar 2026 20:39:53 -0400 Message-Id: <20260311004008.2208806-9-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260311004008.2208806-1-joelagnelf@nvidia.com> References: <20260311004008.2208806-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BL1PR13CA0422.namprd13.prod.outlook.com (2603:10b6:208:2c3::7) To DS0PR12MB6486.namprd12.prod.outlook.com (2603:10b6:8:c5::21) Precedence: bulk X-Mailing-List: linux-fbdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB6486:EE_|BY5PR12MB4051:EE_ X-MS-Office365-Filtering-Correlation-Id: f5ad797a-f882-48d8-e36c-08de7f06cf88 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: yM8CUwHgz0IZzoV78BZpWn/8tpemjshhve9BnvWqblwPajYV+BUbfBlnzg9nFCFMK5S5aT00lG5ISX2o5x26pVsnqi2h3lhmi+cAQAGX/csaIpfOsOsew8HVgrldCi1jFixiD0Sr1leynVHrVibp7dko7n/FKTQQdST+5DuDTz58KEJYnzkYWK9s5QZ3Q/B3CP+sLnK0X+6gdOCmJtv6wShSIUhg2ccnc4YoVOw0M7008OJne/xhQweLiuAc8JsKtDygWCeRLtI7TduQ+BYuhBGYtS41VDXSRgs7w1vEg+sQ3CGibMpcWQ8rRiQJObRLUOk6gGWeubet++xwPuUuhY3Zxtjycqrfl9JT+Qp+DtMelxftdZTJEWRzw1Bzh20zteRg0nw8WfF9PBvJI08b2lIV4n1lHpuW8jJSMuXwaUPFH2FoGj3BJm6JEXmsIM4CXLeLiv4DC+AjNUBaFvrI1QI2g/uidJF6o/p3azsaKZvWJSICHvHAegHii4IQ20KlWaNWE4HqkEZ4tkyfP8fLR4osXjk6ymOLBtdsYgoXJ23IjbDB5Tcf741Ruv7IZWimi18CQD05UbrI63KbEgWJZ5KlhgnOT+0KpR2jrZxeCMe+tQ/JgbWa0yUfB6OB5OLSfxV3G9i++bEV/pC2jQPazHAgI3h/hYrhCBYYm3D1R/pFECAh+3NBbm5ov/yQR5eZYvnh1fNZbG/li6a+6bjJPwGqjVcmwJScr5s8usmDJrM= 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)(7416014)(376014)(366016)(1800799024)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vDPHH650vblnWOnXP0nrTiiVuGhPIcEGasUCUnVjT7TbobYRcASni+jUbl5x?= =?us-ascii?Q?rkl0ODovHY5aQY4z8MJjfI3vlwQ9C2hqGFq3dFAJw6TlbwhuW+/m00RY0d8a?= =?us-ascii?Q?jz80fsxnM/D7a8HOe3Lyj4ecJb54jMbLPM/HRP4rXf+ecz52kFcNGvMEpkaV?= =?us-ascii?Q?p3heV6XyyIFP9GycgAd6FpoQ6CHkNV1YlDyo/APgjz5TMYsoOy9BBs+C4ZwG?= =?us-ascii?Q?kDTr/eIwljq5MieA21NkkOVlpLwvN88ptubKwHXXw9SrB4X1sdzBujriqKRS?= =?us-ascii?Q?PCx/ja9QAby33570b8XktjkeAdDJ7E5koe35RAHl8vjw3whaIzO3/hd238qQ?= =?us-ascii?Q?wqWpMWwHQRJtjsHX9WJbnVvCeXD/+QHk0QXZpsut64KinuLlD+DDLQNXv6hU?= =?us-ascii?Q?0JXwezIriIGoBn+ljJDJUMrEkAX44NXHD+tYPkx7BFOCCil54SYWO4dlQ4Ol?= =?us-ascii?Q?dxIMZ5pqbpSxHNySy1NnqqUOmdHOai7s8hncEZqscBA8kx5R/E8UG7hx1mtB?= =?us-ascii?Q?pq8xhxho/YwhlGxJxOn8CYVZ5yBcJhSH5qa/YIbiWTbjxBRRTYxZobY3gsFC?= =?us-ascii?Q?v5Q0TUDVNP/p66vSlQp1bszFFwRlip+1gnnpoWDimrEHa3rWfIVhd6yTRGGL?= =?us-ascii?Q?NKVb7rF/zKLNR3KQ+P8ZvH6MqljQwfJcdzALi5A6AmSeDdkI3k/58O6dl/VZ?= =?us-ascii?Q?3KfYgCvr7uAGZjgNjAaNVis2WeQaC4b4uxhBbsUontrKo1ou4kW5TrVnTOYV?= =?us-ascii?Q?TAi1LuOJ3yDNKyXoOKkmyOUjxKv0WVNGLc57se5u8E2hhgwOvy9EuQkQCDOM?= =?us-ascii?Q?PmRXsmjBP0sm+jTE+iB5wO953Hea/sTDKuJW46fqTfmMq+3eP1JFVjUVeSsI?= =?us-ascii?Q?pYYLLJUjJ8KOs02EzZIHfJLWRTEZ0SezJvfdHznPzl0xJ8ExWuQWzyx85jGt?= =?us-ascii?Q?j5GEEZmAFOt2mQD6qoZtZFSIGreI1NeymG1fLEC4XJaDE4QJm9j1dTINiuBr?= =?us-ascii?Q?N9bgVrZ+VDT548kTuM8rK5btMRDTtc4J/w1jCBzLaYZ5McUW6WjE4DcWLPti?= =?us-ascii?Q?8B4KLiFfZhGgYk8T2c78kcneM8jT4UgHZmLLmVqi7dhW8Fh3i97MC4CkdtHi?= =?us-ascii?Q?2gxOSjkOVXZFKj+Ilky18mqmoxht9vzcP/lVioVk09ZZN4FuTsWZTVttRO6E?= =?us-ascii?Q?aRsbu1cp5UbAQZZ11atZuM9DKwH3Z7bDFCEUiHN9XR0IAEZqO3pd34YLFcKY?= =?us-ascii?Q?Gx7ujua0krRDqKZz11v7cUiHUr19lm5o8af5/4NXMVeoSI+P8xrxHe/Gn81X?= =?us-ascii?Q?c+FaPDlENQ45jMe9C+PRcmA8JEscRnijFrmfTbN3o/EfPDl4BJa0CKSDLr4l?= =?us-ascii?Q?XeqjpMaYYQzx8fELpWsKOfQI27bslNgE0WUkISvS0augTj7pvozNU2i278Pr?= =?us-ascii?Q?m1R/MX+krCvYgHCTKOJNWaG/2cnvV3uoimzW3u1vNmZJLo76aEd8qvj+J9ca?= =?us-ascii?Q?B6UkWM9MfbD1999KcwgJDL5cGw72d5cEneiNaEcKKkj+hBhd/reoLxZjlrXR?= =?us-ascii?Q?KicLEHqhjjFLzX0LNv6anx/HIk2zHfUxdbgN/iqknX211BKajQ1bQqvPk27D?= =?us-ascii?Q?PrJvvYbzVUH5Xp4ef2hu+U+YR0WoCooxJXbukI69/6tb4/cbuKq4ydErSR9U?= =?us-ascii?Q?4gwMdrVtrQt+odq9NSNcCIrweGQidCM5DNzTdUz6IplOR+QZCvlkBMnjO3xM?= =?us-ascii?Q?mHiHi7BrvA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f5ad797a-f882-48d8-e36c-08de7f06cf88 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Mar 2026 00:40:36.2819 (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: 0rWYnqhV+BUiYeILDeaUMoS6AaGOHkdnoLfiJhpf/0/q9o02U5T1Klxdj7d/q1+O2d7K31FFQENU58NFhkWZ/w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4051 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.rs | 160 ++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 7a5dd4220c67..b2cb245b38b7 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -2,4 +2,164 @@ //! Memory management subsystems for nova-core. +#![expect(dead_code)] + pub(crate) mod pramin; + +use kernel::sizes::SZ_4K; + +use crate::num::u64_as_usize; + +/// Page size in bytes (4 KiB). +pub(crate) const PAGE_SIZE: usize = SZ_4K; + +bitfield! { + pub(crate) struct VramAddress(u64), "Physical VRAM address in GPU video memory" { + 11:0 offset as u64, "Offset within 4KB page"; + 63:12 frame_number as u64 => 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 { + u64_as_usize(self.0) + } + + /// 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 == 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) + } +} + +// GPU virtual address. +bitfield! { + pub(crate) struct VirtualAddress(u64), "Virtual address in GPU address space" { + 11:0 offset as u64, "Offset within 4KB page"; + 63:12 frame_number as u64 => 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 raw address value as `u64`. + pub(crate) const fn raw_u64(&self) -> u64 { + self.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 + } +} -- 2.34.1