From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012068.outbound.protection.outlook.com [52.101.43.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6AA435C1B6; Tue, 24 Feb 2026 22:54:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.68 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771973642; cv=fail; b=seYB4oQKP2DLh8EP9cSxWsETVZXUk3uPzF1DgHStI0QX5OXpO82NqkFOY9v943LqMX1Kpms/AMbQdSroQxvdSTKswwTmOkTmH45PWE+kMlijGX4J7zi11e3CpNggyvXEZOMazC0idSgGMO1X3bhjQgJ5e8RTIxc2c27HJurz0YI= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771973642; c=relaxed/simple; bh=brG2ukR0yY8Xg655mEM4/sMIcvp+7ubb8LkxpY9l1IQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=u06LrWEV6l5EDcPN3hJzYwBOEDLRXZ1eCyDj4BMOpTiW8NrWyaKC/menu6zZY6i/6jIe8WKK4mnUCp3iY9+gcBUVr5y+C1vAg2NbETDTSB/wLRHIWThb3tnPZbzBD4ntOnbX1B6NtnVv5e1tV0x/waMBcSgzxm2Ae8PBjsfYMk4= 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=LU17rnwE; arc=fail smtp.client-ip=52.101.43.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="LU17rnwE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AA44LE7glNme9gwlmRWlP6zmkOK6jcnnjp47ppdP9bH1rz7T23inzVgAG3tuhFjHxSoMZq6Dyf2LVujjrOeFeB1oBF5ZLi2Zhx8pLaxef3RiAFNT6BWzkzNvG25zNzvKqkUFaRXBxosCPSrCcRFIVjZZInCm3LqC6wQp9+jyTQ+kI8+nOuIoaJPQe5BAKODsYOarz22nbM1jBUYGJgwzTp4WGXumZvG5IoBPZ3qbIP82pu7L9/xAvuRoBPNG9TiaAZkXEnsMPqiB6wj5EPksBzL6qC0zpg3gdkL5Q5BdvoaqX9sDzfs710/+sRBtR7VaeDeJzMVgn8qEJdFhigtITg== 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=c9le9zPmfGGE54JcHse8SBISSPbKA3QFpZI2evo42hs=; b=cpdV+6e9n6CfsMlAEbcTVHhoh9zR++hCq9EsaF2kwjTt1ZOb4Y+7OP5ZwzB8KUOM8/qyUedANGo9DjdOaeGcwjSNLd+9IrPPl2CM/4oBZzWzd81FJEZtb/yGwHu7512NRDBE2V4Xm7N3APbrPZZUsJ2r7Nr3ulxR5I7Med/kQCtu2I5bdGGb8Tz1CaNgEZg1YC/tEhMmnAUj5hGJ5RWlegeADSLaalY9EC7F+ha5D4R4fLSVhNbHUp5CWY34KblWBlsP6GK26GMSCF3pWkdejCX0tbe+pHy83BDSya73QLY1+q8qoo7X6V5GjcNQ9OU4LX3qW/zjgMLKwHDyFfQYjg== 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=c9le9zPmfGGE54JcHse8SBISSPbKA3QFpZI2evo42hs=; b=LU17rnwE8LGH2f3/J611OEOWRZWKQoAriE5iAfIhY1VsXk13xNrwMVgRkJ2ua8pwt7dpuicU37WlxXBDZ20zF+IszEDUfoCr5cO4SrB8z1pMX2Vk342hRyYOUu1fX6WKBEPWs4G6siKkZGBveyzdOKIC4NI0evqL4S7BFkdasorFLVlPA6JhciJU+ZyWV+BywLM4+2bQox6da4ueLzME7U1sw8NBm8x+SeypRuoPYyqVMJsg69IgRjC/A7ZTYIlhfZutvNCLQfUxqejPTBH6AiEXafcZxRo/R8jZZNIk08BGXd0b04IwSIzYyJUI0FWUL5fqQi8EKjGwTqWqa+NILg== 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 SN7PR12MB6885.namprd12.prod.outlook.com (2603:10b6:806:263::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.21; Tue, 24 Feb 2026 22:53:46 +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.017; Tue, 24 Feb 2026 22:53:46 +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 v8 08/25] gpu: nova-core: mm: Add common memory management types Date: Tue, 24 Feb 2026 17:53:06 -0500 Message-Id: <20260224225323.3312204-9-joelagnelf@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260224225323.3312204-1-joelagnelf@nvidia.com> References: <20260224225323.3312204-1-joelagnelf@nvidia.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: IA1P220CA0022.NAMP220.PROD.OUTLOOK.COM (2603:10b6:208:464::11) 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_|SN7PR12MB6885:EE_ X-MS-Office365-Filtering-Correlation-Id: 91b23abe-cfd7-4132-2b78-08de73f790f2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?J6SfvEsXhJ1c/MZGm3T1IDcdFROETZa47t5vUbWze3CnotMjeZ6eGu7hmZgK?= =?us-ascii?Q?FBXr+3myWQu0i0XzeJ2ecGuAIi8I9B5z8+6ZDUsF3TY7t/IpfiQVtbwVznEp?= =?us-ascii?Q?AoYGTY6+ZWrmuJpASAYZLv1cNDLqXEL7xwkHkwPUXaInVlLQUWUpIq09i/sP?= =?us-ascii?Q?QIG22dRizJ8N4MyAkhsnyl0248hysO9lCyFhPBTUs+FpOEGLTqDLc29abm9m?= =?us-ascii?Q?KK5lnzbMZTNDm5Py4ZRmlnBIEMD/aBR7F/Hw0JNVOvTWyYDzKU3lTduZs6Ue?= =?us-ascii?Q?kn1zmlz4ubxfiCxsS5orZdtaultxb2V5wy6QgbC3WtbhsJ4D52/pDovoPjT4?= =?us-ascii?Q?y2Y8GRJQ3MomhW7C3FbZoy9H8R7J1ZaKGG6ef7tBkG9nWJG+EFpOJZEsrf7Q?= =?us-ascii?Q?HAyX3BzmuLrm0iyWQpz+D5m5IPKXzdps/AqBsbtsTxSN2W1RBTo8NtQn/0A9?= =?us-ascii?Q?5cXyrSfVHdeMUkxet72rh+woTfqJ9ifSR8Hmb8pDfjsDERX9yOADQsoAblEO?= =?us-ascii?Q?QhPbCFaSUvL11PrK5N7CaTlY3I49qywLAY7XK0Gw+Rairs3raQoXvk1eFk/b?= =?us-ascii?Q?dieLlkkEaXjO0jY4A8E3n11++sNDLsilbwh0vGtw9b/Hc1xne9JstPVIElni?= =?us-ascii?Q?ShqocuAjs+N0OXdBGMY7P6a+GwH/u6lE85FoBTjoV/CVsWTx7UFUEChZWglh?= =?us-ascii?Q?XWPhSmPZTS3KEqd5znAH1Y3jiy0tb/JYA/Hn0jcXyqtL9iuRC6sKb3J2nuZc?= =?us-ascii?Q?APuOetD4x9+JxvxfDF9lz3v7brn5xLAV4UBY/wh5Pp6blTSRV2LOzXBefnz3?= =?us-ascii?Q?thooOlZdC2xT654VnBa9wJeAG9fTe1FAqNOPER8DHuGRlfip4U2acEUER4K2?= =?us-ascii?Q?7bqh9ZZvhzWKnAmpO7Y5TSqJ1TS3uZR2hGa1SHqjh03wbJZyr9Vr37Da5GVh?= =?us-ascii?Q?2K0n5Ax7FGcLGG+6Fyt2bOT+fztrQ7jhTMKfA9eX0MXtMCo3Awe3uOC6cl81?= =?us-ascii?Q?h3Y3EtnWoC00IgobA6jhSnW++iXCo9vq7mhO4ulm/0PVg61k9t8ntScxaD/9?= =?us-ascii?Q?BNUdzUcmSHZeyMGb0q0H0Vr613gWc9PZyGffu7SKZ3p7TnUgge5iyDaWw8AP?= =?us-ascii?Q?LjUhji7K34uUVYF8enkW5TtQSYNqZ50gmhmbOlClCpCDREZqc+//BG1hyd8w?= =?us-ascii?Q?RPMACof0yOHVXyJb7vZIgUkcvG68qAVfqZVCIjJBYOBJqjDPIbmsbNTPbeZn?= =?us-ascii?Q?waI2znjcFB0ELRArgvG2bT7J5IsONai0xZb+hWdJT7f/i1oCQzMOfqRnN0Mh?= =?us-ascii?Q?UmBAVbKJrTubDK0WJ1XVFwpN8M95n47tN5LY3mm1BmDruM3r0Scovv3/AJQ2?= =?us-ascii?Q?yT6wkhsmuKkOczedpbUWIeCiVcPZX3UbvULIFfzUCGwj5KR9EgezIEjuq/j/?= =?us-ascii?Q?XCRg1QL2tUBykx/on8Tuh6aDwmlI7elQuJ6ztBMVOTj0592woAp3NnjmF2lN?= =?us-ascii?Q?7rvUrNjp8BIsczPUqmL0Xzg4POzOScj2zcjlXfJmbrPaPAXqNGD6MdYDBVYF?= =?us-ascii?Q?MEHKW5SEBIM76m4FrSs=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)(7416014)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?p8TmyLjshuVpHZdQSb11zVGxxk0hLEKhUshw1gm2zS0T7CRQ4OO1qb52ecHW?= =?us-ascii?Q?3ncLZZhTPALwX0gAnmuaZykPFBxrf06XSbV+DZf2uNrXeeIxoPAbN0rknuBm?= =?us-ascii?Q?gF2YfpsAh0J+zz8p/hEf/VUWrSzDw+gSpd3+XO7y8meaAR6TumruAZxHhGrT?= =?us-ascii?Q?zbDKLW+NniAqlxspXjNp7fYriMYKZxNZZi2eUyjd/pGr/LOv2j4jjOjiiA4e?= =?us-ascii?Q?4oWlIOFzUiGiwto8fhRFq3REReZ5uToGJkCm1mtLRrf/N/YHn4R0KRVRGpbh?= =?us-ascii?Q?eXX+rZIo3zlsbOpDX1Rs7lUmEZ0oJUEv86LTRbdmxl41CCdfNiLrcm1vLfdI?= =?us-ascii?Q?zIXTy3ogFrSKk2pXY1g6Bkn/zrNRLDwl9auGjU+JTeKOl9ZMosKfV0aYWLYw?= =?us-ascii?Q?FxsMC2/y1nVJw5uQ3mpW6KgYY0WoC/ZeD1ROTHOihm7L3vda016tDJ8HiL0/?= =?us-ascii?Q?PLzpBwW4ITsJa1Pqfo7X0EkZQEH5DdBRD980XNN+mo9So5hGgoauHtV0KxwO?= =?us-ascii?Q?4UAkmPoTD2qdj/8gpIOy5W6pdQfYyI8yJBM26WiK6FSk0kLdZ3C5MqnV/2QP?= =?us-ascii?Q?+czVsjAU3NqcKKttyVmir3tJs7WY6ydHg6nJG4Xbsy0vo7pxN9K5F/6NPVZg?= =?us-ascii?Q?wHdBO2ypM9XiHjC6YODSYU/s6VRpaoSOMy8+Yh5tokAzL/a71Q346AAN0zHT?= =?us-ascii?Q?ul19Yh3nArov+DHKj6/zyL1j4jR85C1MAmeIsN8jgSt0xJB3ERrpIZrT5PYx?= =?us-ascii?Q?OimMrzZJNju6uieRJsipvifDIiaYz9ouzGG368T7xrV+GBCg7YDLJ5eyk938?= =?us-ascii?Q?7Tpdt2TY1jz+eh3y2gOTDsJAEz5pZquu+poM4bHpiv25JJND2hX5I0LF3d7c?= =?us-ascii?Q?uW7+T1lH5MQPQFZ+d9fjQbcBqNHYQ4okFrbpi+35FlkyGlK3FqVGUyQjibtB?= =?us-ascii?Q?sdjuXcH1jGZF65zDkJvpc191IqyvIRW5yA+KbNH2SAB4dG0Ptu0N+Rw4gh8y?= =?us-ascii?Q?R8mklyatR9uPdpZ/iuhbC9xBpUznVFseJQKaPCcZT4nsr31uVyM5e+gqOD/L?= =?us-ascii?Q?yNMzG6pN3gRSkCuhf6mbh9dSjc1SlSM/nce6ZowfvxoL+gbOjmRyfPAet69W?= =?us-ascii?Q?5pQpgQ2QmypRHI6JtzpV26ljHgs074r6gQpdO3NHjAIhCL2pyFmlt5F/SzEA?= =?us-ascii?Q?Dv7KAF4tjZRzUTg7YArhDwg2f87lppdbecZ0PPgaXygMeBDILw9ZH8Y9Zt2I?= =?us-ascii?Q?nCM0oPot2xhSD6zx72L4HPKWddVexBqF7qqLsVc1i/wpy1KyXDd5sLU46c/U?= =?us-ascii?Q?5iLNbQYdTbRLons8jBSR3Gx5OUrgDYd4SaTFInaCRfEs12MD5r9+QgqQXzm+?= =?us-ascii?Q?KzR+wXWKuvzKjngV58fMZ/O2UXIlkEZSUrHzvmdk45zp03GI1Nlg7GPssVrI?= =?us-ascii?Q?kXssCsnyJ2TFfuB9FACTmkkraEPysYjiNaQLLZBacaldHcjn8C5go7S7Sdxz?= =?us-ascii?Q?U9DPTiw6sehtgY/KJVKaK+MJxSiJk8B1UbL4yuRzUJgFU8yNPJ73YH9oNvF4?= =?us-ascii?Q?trjEDp8Ztbl0PuurryuYu4okh3SZKcTN66ugqHI1DLMyM8SYjKQozY49aaMO?= =?us-ascii?Q?iOmmmayMloCZXNiuxHDm//myDmZJNVQsFYIiwyLpaOU9kGc9UAbpvJkTMwof?= =?us-ascii?Q?EDp6D86L6gkkLZu8uepBch5pF+SEt5JIdyVslaDgN+R8Bco2PqxU8Xti/O3o?= =?us-ascii?Q?pitkzLnemA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 91b23abe-cfd7-4132-2b78-08de73f790f2 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB6486.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2026 22:53:46.0404 (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: jwM6NEAkcbbhlNgBgHIpDqcippdYZXghMG9ptmKTv0qoY87Y0k0uZ5e2H1ITcg0Nqr4IU5KUAnP1j2DZspD81A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB6885 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 | 174 ++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 7a5dd4220c67..a8b2e1870566 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -2,4 +2,178 @@ //! 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) + } +} + +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 => 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 => self.l0_index(), + 1 => self.l1_index(), + 2 => self.l2_index(), + 3 => self.l3_index(), + 4 => self.l4_index(), + + // L5 is only used by MMU v3 (PTE level). + 5 => self.l4_index(), + _ => 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