From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 BAFCF43CEED; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; cv=none; b=ghSKAax1YHSAOwL6gRI2+ZED00RGyXqzIjGCHoOpSJ4kPUQf6OH2hav5jZ+GSrwzJeBZYVWFL18JKFHHqemJ+VqpZk6vRL9k4OJgwx682QyeAm5hJOHfejUxB/YOJcYF4M7KMDTCexmGwMqed0SqlsdnHyLEVQzpgAc0fzgyOv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; c=relaxed/simple; bh=HCzDlkK0nf8Z76dEe91GoDU2vHhNj6rRuUesVWHafOw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VByoBTFPY3ZqZf/6vk3g4uyccrBrGIIFEre8ocArfI4OguVsLaocVlwKFUJ+2SwElwBsCzGffb22JXJVtTfHAsXbhgIlbFtPMJR3+C13o/TrNCXqyq64QGAhYYIwd8BNFh1c49K95g0NJejuEBuWH2XOItv/TwslzvIJd4KR7oA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jX33c9XY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jX33c9XY" Received: by smtp.kernel.org (Postfix) with ESMTPS id 522E6C2BCFB; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=HCzDlkK0nf8Z76dEe91GoDU2vHhNj6rRuUesVWHafOw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=jX33c9XY5g4KGOiSmG2AnOP383Z/xJUqQrbv1Wkj61BWYTJHfz9wmsSFslCWuBrKQ 7tk8Jgn796rG3a5yBrMbnXcq5MzA32kq7dyo3MyczCnzIjMB8hXbLcK7kdEQhFO0YO vt/t0dLjZ6DqGXJu29XVtu9hQX4BFkmK9CPFh2grBP9L0DJODRfkx+NO3pzdQYau7P Qwx+uhtrEmbO3LZvbdxa3eTsNcSjHehgYj/WmlgIa8D+G2n4JX9voc1VdsZc4i7Rkr ms8gN8lfztRTF9Cle9nzY6x9UN0ZTYYCTUgS0dtc/h2QZhNzpnlY86lyq7ZS2lXjZv 0L/+RmXsLn0ag== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34902C61DD6; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:00 +0800 Subject: [PATCH 1/9] rust: sizes: add SZ_4G constant Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-1-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=1486; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=dYFc5/veCaNNg8MQU+9cuPLHHyO8FGpKl5rFntX1WcU=; b=665RQwJmoeo0nrNVmNip20fm5N4zGkoBukodL5WY0TTyTfeVY/eNtHvU8BWWPfC/6vzciEs6k 9wfe94ky53RBThFvDgMjbDYxxCtTUb/RhJlfk4M+oPk0Kzj7p0de1UC X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun SZ_4G is used by the Tyr driver when splitting the GPU VA range into user and kernel regions. Signed-off-by: Alvin Sun Reviewed-by: Daniel Almeida Reviewed-by: Gary Guo --- rust/bindings/bindings_helper.h | 1 + rust/kernel/sizes.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helpe= r.h index 1124785e210b3..3c37993991b1e 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -110,6 +110,7 @@ const size_t RUST_CONST_HELPER_ARCH_SLAB_MINALIGN =3D ARCH_SLAB_MINALIGN; const size_t RUST_CONST_HELPER_ARCH_KMALLOC_MINALIGN =3D ARCH_KMALLOC_MINA= LIGN; const size_t RUST_CONST_HELPER_PAGE_SIZE =3D PAGE_SIZE; +const unsigned long long RUST_CONST_HELPER_SZ_4G =3D SZ_4G; const gfp_t RUST_CONST_HELPER_GFP_ATOMIC =3D GFP_ATOMIC; const gfp_t RUST_CONST_HELPER_GFP_KERNEL =3D GFP_KERNEL; const gfp_t RUST_CONST_HELPER_GFP_KERNEL_ACCOUNT =3D GFP_KERNEL_ACCOUNT; diff --git a/rust/kernel/sizes.rs b/rust/kernel/sizes.rs index 521b2b38bfe77..b236573f0792e 100644 --- a/rust/kernel/sizes.rs +++ b/rust/kernel/sizes.rs @@ -132,3 +132,15 @@ impl SizeConstants for $first { } =20 define_sizes!(u32, u64, usize); + +/// Large size constants (=E2=89=A5 4 GiB). +/// +/// Only implemented for `u64`. +pub trait LargeSizeConstants { + /// `0x1_0000_0000`. + const SZ_4G: Self; +} + +impl LargeSizeConstants for u64 { + const SZ_4G: Self =3D bindings::SZ_4G; +} --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 BB07043E078; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; cv=none; b=e/rih2UNb9vS+/nGEqFp9EBcKGyVm8/eguwFTVCQGKq2Qt0w8tdTjvmQF5GYMiXDvdT40Rvc0uZyTGFiBGnuffbaptscBeZbjCTPeKIJggtw5TcN5pdUcApQrzfvZyl7eeIVjjV60sKqdD8a3Cv88OKZSTJ3NL9NGCf6gySjTIU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; c=relaxed/simple; bh=Wt41fk7XzYRzVaO2AD9iXe5dEZ1C2sk1KBdtD95Axko=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Bi8iDTmq7jUhhtjO2voBzJKDBub/9HLB7j4rsgmrWTJJY1ckGj+8xAgsbXLd4IhyGOhSoIHeiUdnm3BSWDZXkDltqs+eRMd3pAdoVY/teS0gS+7WEVUsShLnlYnX1892WJ33eqC67kXnvXsnbdc+20TFYo3GR3U4IEk2hsR7kCQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PoHyfItD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PoHyfItD" Received: by smtp.kernel.org (Postfix) with ESMTPS id 62C3CC2BCFA; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=Wt41fk7XzYRzVaO2AD9iXe5dEZ1C2sk1KBdtD95Axko=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=PoHyfItDv/cQMIf8jK0VhNkZYeFYGxny7MAWnM8rUzJjgoaRjj2fQtON9uWac2CBj PWYHpv37no8yuoRQ1eLjxPlaYw6MYUtaKTBzoT/Ftq2Tx2JYCpnaXWaHO5RbUcyXHk 9tDk/aVmGdTf0kXSQ0xfh56ywP+yODcNuPWQ77Y3UXo0TM69gcA90JEKisNdG0PpYc OgexZXVp+JLqfIWXY86cvSX6fEhGixJOnKCWa8uOpVlV4NH+JpIONdNDnZDOmgIJoz UBmZlqPigqzooGA5gmlVY/Hq5TYh/ED2NIA1OKxG+EPFyUDxEYQ3CyoJZ0WRi9aiAH Rcv1BWNqOSEoQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44897C624D5; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:01 +0800 Subject: [PATCH 2/9] rust: mm: add `task_size` helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-2-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=891; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=qqWFYnkUdOvaxzK249OpGaOu6UGHYSzktFTqj4uM+pI=; b=oHWDNasF+q42cZjuP7Vyzw0DKfYfsrBz1qiLDguWG+DGqzqQ2c8I3XwHLkj5Nv7tFARXpDbIw aU+eSOJuPDQDe41AF9ZIFWnYyr5WukFdVIFMSsNJps+nQQeVcfZydmr X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Expose the task's address space size. It is used by the Tyr driver for splitting a VM's GPU address space into user and kernel regions. Signed-off-by: Alvin Sun Reviewed-by: Daniel Almeida --- rust/kernel/mm.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rust/kernel/mm.rs b/rust/kernel/mm.rs index 4764d7b68f2a7..d2dfbb7d43972 100644 --- a/rust/kernel/mm.rs +++ b/rust/kernel/mm.rs @@ -149,6 +149,13 @@ pub fn mmget_not_zero(&self) -> Option> { None } } + + /// The size of the process virtual address space. + #[inline] + pub fn task_size(&self) -> usize { + // SAFETY: `self.as_raw()` is a valid pointer to an `mm_struct` pe= r the type invariants. + unsafe { (*self.as_raw()).__bindgen_anon_1.task_size } + } } =20 // These methods require `mm_users` to be non-zero. --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 BAE8964; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; cv=none; b=j2kcYCJIQ25/sAH4D8omsUHT2HlHE2o3uJ7lHavPsN+t4zQ7xWtAJwVtjVpUKGfCmNy9S/ghT+fRZ2EIzYA9fDhXBoj6qShQprlbFHtyTBHZENIxWveGhPXA2wIQAyAiWnwL8ixEyDkD/SBhp9a8E5/37amoTxlVzaHO578a6vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; c=relaxed/simple; bh=zA9tgWKf4SBtTBAhJRzDALR4sj2TbJPjvzc1j0kLi+0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dBGLTJGu4jmSqPQsEr+Ak8ClfnAFbL1SmPanY8eCpB0qGNRp46PKXZ96ELrPeF5jUziWUeAaiaU6TD901N3ErZEi7aKTUlNa1snKApUgF4SsgF8ckh90KKoXz4KGzEAKzn0TJdXKGUEkFvKKlYSNdyoew3RqMQFx1iWGdKhQBfw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cU3Cnl1/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cU3Cnl1/" Received: by smtp.kernel.org (Postfix) with ESMTPS id 72EBDC2BD04; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=zA9tgWKf4SBtTBAhJRzDALR4sj2TbJPjvzc1j0kLi+0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=cU3Cnl1/XCHcPDdhbKsQkf8GKY7v5T2PGtfYkY15wwAgVlsUwjuwf8UHtvcLZoGrG do4N21kgV/k8mi+Wj6+GuNQC/oCEsDZjBoW12KcptuskpQ5kTzPXWwgFffzF4DQNIO thGQFCK6baOliEawFl1G8wR2yZ+SUkAW/dL1tKw0sdF5+nYuLyeKxCfRLPSwk3RoNP RMJHZtU26V2LljAZTejFiCmkQAoReIlgEmMylujcu+gxJuwScyZQbTmrsiUDjJCkw7 ZpuunTc9CAL/2h7eQyXEN+MURonSafxnbjjoAK9ToK9cnnW06rnSY2S/SkaZpKixSm 6/QXbxuc54kiA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 545D1C624D3; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:02 +0800 Subject: [PATCH 3/9] rust: sync: arc: relax `ForeignOwnable` for `Arc` Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-3-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=1287; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=VpFApDEE0ShMOm5bITUkvBMmnsmsJS6eNADKklXNSp4=; b=uHDTxFGNUx1spLlyFI1jfXtWSsQ4Kct+pqNbd2CyQ94I8hDhvntBrOhaGdYAsbGexhRYLJ6WZ 8/XubxirktGCH9ARwXTL8UZSFEUKMVeukuaBmnBA2/hj0TMY6/ZHIWS X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Drop the `'static` bound so that refcounted values borrowing from a driver registration scope can be foreign-owned by the XArray abstraction. Signed-off-by: Alvin Sun Reviewed-by: Daniel Almeida Reviewed-by: Gary Guo --- rust/kernel/sync/arc.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs index 5ac4961b7cd20..cd6faba84ffcb 100644 --- a/rust/kernel/sync/arc.rs +++ b/rust/kernel/sync/arc.rs @@ -363,11 +363,17 @@ pub fn into_unique_or_drop(this: Self) -> Option>> { =20 // SAFETY: The pointer returned by `into_foreign` was originally allocated= as an // `KBox>`, so that type is what determines the alignment. -unsafe impl ForeignOwnable for Arc { +unsafe impl ForeignOwnable for Arc { const FOREIGN_ALIGN: usize =3D > as ForeignOwnable>::= FOREIGN_ALIGN; =20 - type Borrowed<'a> =3D ArcBorrow<'a, T>; - type BorrowedMut<'a> =3D Self::Borrowed<'a>; + type Borrowed<'a> + =3D ArcBorrow<'a, T> + where + T: 'a; + type BorrowedMut<'a> + =3D Self::Borrowed<'a> + where + T: 'a; =20 fn into_foreign(self) -> *mut c_void { ManuallyDrop::new(self).ptr.as_ptr().cast() --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 C20513DAC13; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; cv=none; b=bjdYshfKH19UdemjL3pBlF2i7QxckoBlgKkLTdnI4oj/XqdqnDQmqOqqrdPOTaPhzpZEqLjEH8TzPp6RTK9t3QZP8809v9qQBMSYqP5iS1wU9SOtziBGMrhsgwIMexfEFGLC0S/se/K9jodQQkygrt0HySGDR0WstrbS+luS5Xk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278956; c=relaxed/simple; bh=vVRTAJM2qAJtjzVNw7AfiDMOZQ6QUxUlTdr6404pWUc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fzB/O9JkLXAUkto7GWWnxRQqE/uTIsf+L1W2ICS316+oroRikGb15ZTyxMiMaYVvExFlH4se36FPcviXCrUYzW38+uF0PpAXhVctjeLT0WwIji4TYjA7hJp9dBfnBoDkswyLGYHjIvOLbk9cQuH/scseomIYqLzplxcc/mRRCwk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RtNnEY7h; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RtNnEY7h" Received: by smtp.kernel.org (Postfix) with ESMTPS id 7C349C32782; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=vVRTAJM2qAJtjzVNw7AfiDMOZQ6QUxUlTdr6404pWUc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=RtNnEY7hoph2NGV04fm7KqnQgfxO8XyXwmiTGUGtI3nVJfe16N40RwZkDYLT+ksZO 2YY+rS0wl+a+/TsgI1fmeUZgiWHI+idrSNb+jMfzJSc+f7p5rqYHt+gtS1nGBEt+IQ dRR3YQt/Hkm0k0lq+vc9whkbty2GyDmdKXMhfr+Hcreqfr/NlHeuETdjUGbqFSo39e SNoFvcFY8ssqH8I5/kD0XGsv8IgmE43VcBeYNH6Mw5uGP91kgbiGcsWCMkvivJ5157 W5XF6Y7c/8MUnW/r6hyHIp1Bo/d4MA3WA5xjWPleDxXUVo51o6H1b21u9574RPh0Oq 8D6lZfwiTb+eA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63CD2C624D7; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:03 +0800 Subject: [PATCH 4/9] drm/tyr: add per-file VM pool Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-4-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=3857; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=GYNt5fASDjvzxxgWZLDWPIxhdkvjI20iaVSTTPTfRwI=; b=zNDRrCK4SuOMnUEDGOcfEfklYsW34X7DcrbeHuulWK+S9BJ2TEp/jQ1FknCrKMDLdreWsyCD/ nGswWYrR5lrDce2bdKmuXNKhOd67JYC7lkzIJftaHcELHGgPGNrZ0Jc X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Add a per-file VM pool using the IdPool for ID allocation and an XArray for VM storage. Signed-off-by: Alvin Sun --- drivers/gpu/drm/tyr/pool.rs | 102 ++++++++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/tyr/tyr.rs | 1 + 2 files changed, 103 insertions(+) diff --git a/drivers/gpu/drm/tyr/pool.rs b/drivers/gpu/drm/tyr/pool.rs new file mode 100644 index 0000000000000..1745116930c3e --- /dev/null +++ b/drivers/gpu/drm/tyr/pool.rs @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT + +//! Per-drm-file VM id pool. + +use kernel::{ + id_pool::IdPool, + new_mutex, + prelude::*, + sync::{ + Arc, + ArcBorrow, + Mutex, // + }, + xarray::{ + AllocKind, + XArray, // + }, // +}; + +use crate::vm::Vm; + +/// Maximum number of VMs per open file. Matches panthor's +/// `PANTHOR_MAX_VMS_PER_FILE`. +pub(crate) const PANTHOR_MAX_VMS_PER_FILE: u32 =3D 32; + +/// Per-open-file pool of VMs. +#[pin_data] +pub(crate) struct VmPool<'drm> { + #[pin] + ids: Mutex, + #[pin] + vms: XArray>>, +} + +impl<'drm> VmPool<'drm> { + /// Creates a new [`VmPool`] with capacity for [`PANTHOR_MAX_VMS_PER_F= ILE`] VMs. + pub(crate) fn new() -> Result> { + let ids =3D IdPool::with_capacity(PANTHOR_MAX_VMS_PER_FILE as usiz= e, GFP_KERNEL)?; + Ok(pin_init!(Self { + ids <- new_mutex!(ids), + vms <- XArray::new(AllocKind::Alloc), + })) + } + + /// Inserts a VM into the pool, returning the allocated ID. + pub(crate) fn add(&self, vm: ArcBorrow<'_, Vm<'drm>>) -> Result { + let id =3D { + let mut ids =3D self.ids.lock(); + ids.find_unused_id(1).ok_or(ENOSPC)?.acquire() + }; + + let vm: Arc> =3D vm.into(); + let mut vms =3D self.vms.lock(); + match vms.store(id, vm, GFP_KERNEL) { + Ok(previous) =3D> { + // Drop the previous entry (expected `None`). + drop(previous); + Ok(id as u32) + } + Err(err) =3D> { + // Drop the XArray spinlock before acquiring the `ids` mut= ex. + drop(vms); + // Release the stored entry and the pooled id. + drop(err.value); + let mut ids =3D self.ids.lock(); + ids.release_id(id); + Err(err.error) + } + } + } + + /// Removes the VM with the given ID. + pub(crate) fn remove(&self, id: u32) -> Result>> { + let mut vms =3D self.vms.lock(); + match vms.remove(id as usize) { + Some(vm) =3D> { + drop(vms); + let mut ids =3D self.ids.lock(); + ids.release_id(id as usize); + Ok(vm) + } + None =3D> Err(EINVAL), + } + } + + /// Gets the VM with the given ID. + pub(crate) fn get(&self, id: u32) -> Option>> { + let vms =3D self.vms.lock(); + let borrow =3D vms.get(id as usize)?; + Some(Arc::from(borrow)) + } + + /// Removes and returns the first VM in the pool. + pub(crate) fn pop_first(&self) -> Option>> { + for id in 0..PANTHOR_MAX_VMS_PER_FILE { + if let Ok(vm) =3D self.remove(id) { + return Some(vm); + } + } + None + } +} diff --git a/drivers/gpu/drm/tyr/tyr.rs b/drivers/gpu/drm/tyr/tyr.rs index e7ec450bdc9c0..8c0c18c1a970b 100644 --- a/drivers/gpu/drm/tyr/tyr.rs +++ b/drivers/gpu/drm/tyr/tyr.rs @@ -13,6 +13,7 @@ mod gem; mod gpu; mod mmu; +mod pool; mod regs; mod slot; mod vm; --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 F15AA43F0A8; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; cv=none; b=ax3gp1MWsxGYg6WdnWHX3bMNH5fHxv4HlI1XiN73DSU/DRbhzTL0S2Y8H8nTTxXIA3AcQ/Y59qtx92TJBKjcOB65n8vsrku65uxtScOFmhq5Mj/Bfsui2TWKYK89AlhExipJw005goz+T9/DLUUejSnEnivzP3ZaXEy0yE5xWgs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; c=relaxed/simple; bh=PSLHqobnkdvMJe1tvr/RPViAu3hkoHIIG03CHceYiGM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ufSPMB9RX4k5oFBGDiD8O2yw4qCbl0Ocy3Xtf1Koc0fUfOO6n4b7atjR1TUbvgdP6KMXqDuhvkcqd/1Br1xIh7zF1LyygPo081oYcAEsTVueEWyAiIiQID98n4pfvo5mh/7jk2gZrnatRdYLyk+PtQgSaPSVXLKMO+iOjMR8azY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aUphgSgB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aUphgSgB" Received: by smtp.kernel.org (Postfix) with ESMTPS id 8B46FC4AF0F; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=PSLHqobnkdvMJe1tvr/RPViAu3hkoHIIG03CHceYiGM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=aUphgSgB0v6k2Wq5pu7SiKno9bA7AtaV14w7RJAL8cvOGwtIhiY6Dfw+K7LD/zEi/ jh+lSqgLh19b4L9EVGwa7rtl+XjjEYHwfmr78XOnZMAC8yaiYGQ8b7bTEBtZ5RVSfU FSjMTss5/j39T+SChUSHp7i03QA63hnLrkC7BaB1AuugedSxAjnMA/gaAYRmvx+C90 OHNJujG73xf9AIqrxIdkqEXNMXdW6POg58lJmsUPKewTwIyfowjLDIFE0UO9CjYtWS 3/d/RLxlXnWeS5CQA0qzD1MWueSz1mr0QUnL52/5C641jEq82xhV/xmCRxI4BnSeV2 FDSCy8Z4qcgFg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 74C1AC61DD6; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:04 +0800 Subject: [PATCH 5/9] drm/tyr: add user and MCU VM specifications Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-5-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=8800; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=2SBxoqBj8xjU52eYLbPgv6zsg5Z424qq5hzSskCeA58=; b=lEifaEgkXm0ISzMuvaMYK9zl3QonHu4Ce8AA/bVbkJGYW8WMBH2HIyuEvsXxAWmIWfPDVbBoj eLgQpug/RpnDdEO2EW/ISHVRrGbp9azDFYpzPSfDrpgUdi2EC/LtyqA X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Distinguish MCU VMs from user VMs, and compute the user/kernel GPU VA split for user VMs. Signed-off-by: Alvin Sun --- drivers/gpu/drm/tyr/fw.rs | 8 +-- drivers/gpu/drm/tyr/vm.rs | 134 ++++++++++++++++++++++++++++++++++++++++++= +--- 2 files changed, 131 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/tyr/fw.rs b/drivers/gpu/drm/tyr/fw.rs index 47d25c901bd01..9b4b488521b85 100644 --- a/drivers/gpu/drm/tyr/fw.rs +++ b/drivers/gpu/drm/tyr/fw.rs @@ -51,7 +51,6 @@ KernelBoVaAlloc, // }, gpu::GpuInfo, - mmu::Mmu, regs::{ gpu_control::{ @@ -66,7 +65,10 @@ JOB_IRQ_RAWSTAT, // }, // }, - vm::Vm, // + vm::{ + Vm, + VmSpec, // + }, // }; =20 mod parser; @@ -220,7 +222,7 @@ pub(crate) fn new( mmu: ArcBorrow<'_, Mmu<'drm>>, gpu_info: &GpuInfo, ) -> Result> { - let vm =3D Vm::new(dev, ddev, mmu, gpu_info)?; + let vm =3D Vm::new(dev, ddev, mmu, gpu_info, VmSpec::Mcu)?; vm.activate()?; =20 let result =3D (|| { diff --git a/drivers/gpu/drm/tyr/vm.rs b/drivers/gpu/drm/tyr/vm.rs index c5e307b1e2416..76c3d60bb2fe2 100644 --- a/drivers/gpu/drm/tyr/vm.rs +++ b/drivers/gpu/drm/tyr/vm.rs @@ -8,6 +8,7 @@ //! mapped into hardware address space (AS) slots for GPU execution. =20 use core::marker::PhantomData; +use core::num::NonZeroU64; use core::ops::Range; =20 use kernel::{ @@ -43,6 +44,8 @@ new_mutex, prelude::*, sizes::{ + LargeSizeConstants, + SizeConstants, SZ_1G, SZ_2M, SZ_4K, // @@ -154,6 +157,109 @@ fn try_from(value: u32) -> Result { } } =20 +/// User VA size request for a user VM. +pub(crate) enum UserVaRequest { + /// Split based on `task_size()` and the GPU VA range. + Auto, + /// Caller-specified size; construction guarantees `> 0`. + Fixed(NonZeroU64), +} + +impl UserVaRequest { + /// UAPI boundary normalization: `0` -> [`Auto`](Self::Auto). + pub(crate) fn from_uapi(v: u64) -> Self { + match NonZeroU64::new(v) { + Some(size) =3D> Self::Fixed(size), + None =3D> Self::Auto, + } + } +} + +pub(crate) enum VmSpec { + /// MCU/firmware VM, entirely kernel-managed. + Mcu, + /// User VM: full GPU VA range, split into user/kernel per `user_va`. + User { user_va: UserVaRequest }, +} + +/// Final user/kernel VA layout for a VM. +pub(crate) struct VmLayout { + /// Full GPU VA range covered by this VM. + pub(crate) full: Range, + /// User-accessible VA range. Empty for MCU VMs. + pub(crate) user: Range, +} + +impl VmLayout { + /// Kernel VA range, reserved for future kernel object allocation. + #[expect(dead_code)] + pub(crate) fn kernel(&self) -> Range { + self.user.end..self.full.end + } + + /// Compute a user/kernel split for a user VM from the full GPU VA ran= ge and + /// a user request. + pub(crate) fn compute(full: Range, req: UserVaRequest) -> Result<= Self> { + /// Minimum VA space reserved for kernel objects (heaps, ring buff= ers, ...). + const MIN_KERNEL_VA: u64 =3D u64::SZ_256M; + + if full.end <=3D MIN_KERNEL_VA { + pr_err!( + "Invalid VA range {:#x}..{:#x}, kernel VA min required: >{= :#x}\n", + full.start, + full.end, + MIN_KERNEL_VA + ); + return Err(EINVAL); + } + + let user_max =3D full.end - MIN_KERNEL_VA; + + let user_end =3D match req { + UserVaRequest::Fixed(v) =3D> { + let user_size =3D v.get(); + if user_size > user_max { + pr_err!( + "Requested user VA range {:#x} exceeds maximum {:#= x}\n", + user_size, + user_max + ); + return Err(EINVAL); + } + user_size + } + UserVaRequest::Auto =3D> { + let task_size =3D current!().mm().map(|mm| mm.task_size()); + let candidate =3D match task_size { + // `task_size()` returns usize; widen to u64 for the c= omparison. + Some(t) if (t as u64) < full.end =3D> t as u64, + None | Some(_) =3D> { + // If the range exceeds 4G, split it in two so CPU= and + // GPU share the same addresses (SVM). + if full.end > u64::SZ_4G { + full.end / 2 + } else { + user_max + } + } + }; + candidate.min(user_max) + } + }; + + let delta =3D full.end - user_end; + // Pick a kernel VA range that's a power of two, to have a clear s= plit. + let kernel_va_range =3D 1u64 << delta.ilog2(); + let kernel_va_start =3D full.end - kernel_va_range; + let full_start =3D full.start; + + Ok(Self { + full, + user: full_start..kernel_va_start, + }) + } +} + /// Arguments for a virtual memory map operation. struct VmMapArgs<'drm> { /// Access permissions and caching behavior for the mapping. @@ -329,8 +435,8 @@ pub(crate) struct Vm<'drm> { /// Non-core part of the GPUVM. Can be used for stuff that doesn't mod= ify the /// internal mapping tree, like GpuVm::obtain() gpuvm: ARef>>, - /// VA range for this VM. - va_range: Range, + /// VA layout for this VM. + pub(crate) layout: VmLayout, } =20 impl<'drm> Vm<'drm> { @@ -343,6 +449,7 @@ pub(crate) fn new( ddev: &TyrDrmDevice, mmu: ArcBorrow<'_, Mmu<'drm>>, gpu_info: &GpuInfo, + spec: VmSpec, ) -> Result>> { let mmu_features =3D MMU_FEATURES::from_raw(gpu_info.mmu_features); let va_bits =3D mmu_features.va_bits().get(); @@ -351,6 +458,14 @@ pub(crate) fn new( let range =3D 0..(1u64 << va_bits); let reserve_range =3D 0..0u64; =20 + let layout =3D match spec { + VmSpec::Mcu =3D> VmLayout { + full: range.clone(), + user: 0..0u64, + }, + VmSpec::User { user_va } =3D> VmLayout::compute(range.clone(),= user_va)?, + }; + // dummy_obj is used to initialize the GPUVM tree. let dummy_obj =3D gem::new_dummy_object(ddev).inspect_err(|e| { dev_err!(dev, "Failed to create dummy GEM object: {:?}", e); @@ -380,7 +495,7 @@ pub(crate) fn new( mmu: mmu.into(), gpuvm, gpuvm_unique <- new_mutex!(gpuvm_unique), - va_range: range, + layout, }), GFP_KERNEL, )?; @@ -414,7 +529,10 @@ pub(crate) fn kill(&self) { // TODO: Turn the VM into a state where it can't be used. let _ =3D self.deactivate(); let _ =3D self - .unmap_range(self.va_range.start, self.va_range.end - self.va_= range.start) + .unmap_range( + self.layout.full.start, + self.layout.full.end - self.layout.full.start, + ) .inspect_err(|e| { dev_err!(self.dev, "Failed to unmap range during deactivat= e: {:?}", e); }); @@ -551,14 +669,14 @@ pub(crate) fn unmap_range(&self, va: u64, size: u64) = -> Result { =20 let end =3D va.checked_add(size).ok_or(EINVAL)?; =20 - if va < self.va_range.start || end > self.va_range.end { + if va < self.layout.full.start || end > self.layout.full.end { dev_err!( self.dev, "Unmap range {:#x}..{:#x} exceeds VM range {:#x}..{:#x}", va, end, - self.va_range.start, - self.va_range.end + self.layout.full.start, + self.layout.full.end ); return Err(EINVAL); } @@ -568,7 +686,7 @@ pub(crate) fn unmap_range(&self, va: u64, size: u64) ->= Result { region: va..end, }; =20 - let full_vm =3D va =3D=3D self.va_range.start && end =3D=3D self.v= a_range.end; + let full_vm =3D va =3D=3D self.layout.full.start && end =3D=3D sel= f.layout.full.end; =20 let mut resources =3D VmOpResources { preallocated_gpuvas: if full_vm { --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2521844063C; Tue, 1 Sep 2026 16:09:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; cv=none; b=ZhZsBEzDg8nVrIkVkSA0nqHTuJxXnso5YNg4+/IVz/bUqzhRyDE+jAx4JrUi8P+Hl1wDO64ve0NnobJXCcx/D29eo7EMf/8Wnbq3o48vOp58k+mzwSmZHAOAdOIk7YAN2onJxeKfQI1Y+xYI2YeLDEsri21wvI/+yuoN/sWDINU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; c=relaxed/simple; bh=HasbAbiscgkB/JlAaddXUmrmL9X8xBNF+D/Mcih0n8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cdl/Ptiv5WtaGvFYE5W6/X4RGYR6/uPoT6RIPKjib551b/piyelO77ja/7FhI6E6CFXRDYOh/qyjCTPUwseiA/895eL5l3b92js5IY8+s4gmNklUsV8N+z8+VI09O9xHCZMi4G5l3vniVTKM9WJueM8gVvkrdmjd+IJ1fl08e7M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IDvXcKZF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IDvXcKZF" Received: by smtp.kernel.org (Postfix) with ESMTPS id 98C79C2BD01; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=HasbAbiscgkB/JlAaddXUmrmL9X8xBNF+D/Mcih0n8o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=IDvXcKZFF+vOqq/a8se+Fwjyyj4ZeLXSgNdmjkYAZwbXFaXOraDptqSv4a4vAnn3f 6o3MM8H5Kdg+mlZngaSM1nNzpdcngSqgPVlwMqSELFnSZORwGJOvo1a1w1BlScVFUg G2hyzPoEVIUzT0rvy8C2RDxDERdaoWADKxXLpue1dsc6X9AJXwKn9uTy3CJxGONBj1 vLKkgsdNQ5xhbCrJ0jN6sc/m0AaNtoDyMbZt3/aRqRwDYwWqzV/umUQz9B2ZkdxkfB NDaXnsHJxweTIqJ99ckAyMiOmmLT4vNWKPc+bHaa+0mHQZfWejQSFPcWB3zxC2FUyZ 6V8mPS1T2fpFg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85208C624D8; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:05 +0800 Subject: [PATCH 6/9] drm/tyr: add BO creation and lookup helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-6-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=1841; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=abNwTjK9PrYCz2ItiXXIoKFGbxiH33YuD8UYsvPqLiI=; b=Uex/3W0EyxB0gcIL8eWYA/sjQXzaCiLpc+HrvugLg0hsDIo+bbu6Hon1FX9UroXbEfvMh/VHJ pQSLU4FgRc6BySPUkPs/8YHeEOfNFFzyRJi0GtpBOWJGbhyaWeskyvR X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Add the new_object() and lookup_handle() helpers. Signed-off-by: Alvin Sun --- drivers/gpu/drm/tyr/gem.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/tyr/gem.rs b/drivers/gpu/drm/tyr/gem.rs index 3bf3787f5c3fd..be1affe80db1a 100644 --- a/drivers/gpu/drm/tyr/gem.rs +++ b/drivers/gpu/drm/tyr/gem.rs @@ -9,9 +9,11 @@ use kernel::{ drm::gem::{ self, - shmem, // + shmem, + BaseObject, // }, prelude::*, + sizes::SZ_4K, sync::{ aref::ARef, Arc, // @@ -23,6 +25,7 @@ TyrDrmDevice, TyrDrmDriver, // }, + file::TyrDrmFile, vm::{ Vm, VmMapFlags, // @@ -53,6 +56,30 @@ fn new(_dev: &TyrDrmDevice, _size: usize, args: BoCreate= Args) -> impl PinInit; =20 +/// Create a new GEM buffer object. +pub(crate) fn new_object(ddev: &TyrDrmDevice, size: usize, flags: u32) -> = Result> { + if size =3D=3D 0 { + return Err(EINVAL); + } + + let aligned_size =3D size.checked_next_multiple_of(SZ_4K).ok_or(EINVAL= )?; + + Bo::new( + ddev, + aligned_size, + shmem::ObjectConfig { + map_wc: true, + parent_resv_obj: None, + }, + BoCreateArgs { flags }, + ) +} + +/// Look up a GEM object by handle for a DRM file. +pub(crate) fn lookup_handle(file: &TyrDrmFile, handle: u32) -> Result> { + Bo::lookup_handle(file, handle) +} + /// Creates a dummy GEM object to serve as the root of a GPUVM. pub(crate) fn new_dummy_object(ddev: &TyrDrmDevice) -> Result> { let bo =3D Bo::new( --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 01C6443F4A6; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; cv=none; b=DiIwB7OyY2iYJ6cVuIBY6Rc9CkOUUPxaci27ijoC0+xf+9TxrFIZQLG3/jcA/GyiXPq+cb0kw/x4TirFuHKXwtL5ArVJyB+yxIqGkgV+7R9ht1ppzaLGroneiTBu6xzJQfsTRc+QOOiIkPyc8x82pHBS3ppGXBpQ/f/BvkfQxzc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; c=relaxed/simple; bh=tGulbdEu3dRFWulYij37FRo+LIbl4tpCnnrPz5XH21w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hAUkHNhW9mtexd/hKjfRJW7hS6XLo/a7kVAaSYYt+E7d3WcSkaDvXHPB49ab508d6Pd+OYhjORcAYhQigGHPoNMWhTQUIH1SDIx/uusyv7+ERo5TB+U7rKt1Oq7OAT64jWAnD4GN6KrcMgANH8aUwLrmYMxQjhO5Hs2NNEJHSPo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uskcNA54; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uskcNA54" Received: by smtp.kernel.org (Postfix) with ESMTPS id A9130C2BCFD; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=tGulbdEu3dRFWulYij37FRo+LIbl4tpCnnrPz5XH21w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=uskcNA54RBdpVd3VvbmnwJbbOtPvcMgEFDpY+U8yPaqk6VL9D35lb95YcI7duvTl1 XrLvSmxZ4znTOKl85rwaB7ZCu766PJvjMm/2iUpUZzgZk4lE0cL6HVVSoOWlfyuIwH 8ox6RK4+ktlE+2el2EjE8p6SoauF+nh1V29Hg4QWE/qecJdf7IW+slxHFOKCrGOF/g mNTzW7UNmTGOQLejvZoZ8VzUiD6lJhomXgBFdX44df4JJ1OOgk6lI55017I4Rnca03 sWCgTmVGtNSWZUl2Vl1Vehgsi/RqyyCU1B/9YjBPUGLJbuUmXkF6GtHX8fHiF0Wayi o34vIcilV2igg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 962C2C61DD3; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:06 +0800 Subject: [PATCH 7/9] drm/tyr: refactor new_dummy_object to use new_object Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-7-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=1139; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=Ej92qQwFTpPtrIg4SAbvIlKuALoNm6gS9q8GLNp1YDQ=; b=+rvDr8eIgCszYK0KN0VFmkfXWahqtsVwtgx8CXqR+iJjCYkPEJsiRv5hYWJIDWEiIAxxnCCeq Wc/8K2eTe6EDzkVKNm6yRvYo252RjG/JDEoeTp/q173HXGhHdq/SF6K X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun new_dummy_object() duplicated the BO creation code that new_object() now provides; call new_object() instead. Signed-off-by: Alvin Sun Reviewed-by: Daniel Almeida --- drivers/gpu/drm/tyr/gem.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/tyr/gem.rs b/drivers/gpu/drm/tyr/gem.rs index be1affe80db1a..d9ddcb287f52b 100644 --- a/drivers/gpu/drm/tyr/gem.rs +++ b/drivers/gpu/drm/tyr/gem.rs @@ -82,17 +82,8 @@ pub(crate) fn lookup_handle(file: &TyrDrmFile, handle: u= 32) -> Result> =20 /// Creates a dummy GEM object to serve as the root of a GPUVM. pub(crate) fn new_dummy_object(ddev: &TyrDrmDevice) -> Result> { - let bo =3D Bo::new( - ddev, - 4096, - shmem::ObjectConfig { - map_wc: true, - parent_resv_obj: None, - }, - BoCreateArgs { flags: 0 }, - )?; - - Ok(bo) + // FIXME: use a Rust resv-object abstraction once available, rather th= an a real BO. + new_object(ddev, 4096, 0) } =20 /// Specifies how to choose a GPU virtual address for a [`KernelBo`]. --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EAE5542BEAA; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; cv=none; b=bwHOxs8cOibT8BBLD48KWzBdebjqYIttORfStLejOEaRyQX9GFaI9GoHg+eoP3ftHHMywZ68M2jfjcZ2XIx0hjOD/9f5Fyg2Xj4znBX1Vndenu8m3uiVZt4HmdNQd8oG7FdJpcRZa+WVmbJBUgjh5/DQIMG2U7KxuDPMVs6KaCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; c=relaxed/simple; bh=cw3f2x1GbJSqzOgRbTGfEjpybb2q2g41K94Jc4NVQoY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FK37eNJJOkXBWhboqZL3YOHjL7Nsl/ej06D0gUJ59HdM0qEr66dNbkiXozadQmCwlljb+hbmwI07Z69KJRbX6xOaoPdGoQTTwnxDxwY/9q6KRtCmmYSPA+5rBiIfKAd14NbPuTrQDzGUPrV3DOSzA3TFUOTaXrUvpoHgPIH1d0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B0VQyxh6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B0VQyxh6" Received: by smtp.kernel.org (Postfix) with ESMTPS id BD29EC2BCFF; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=cw3f2x1GbJSqzOgRbTGfEjpybb2q2g41K94Jc4NVQoY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=B0VQyxh6iyr398tRYC2jM8w1XrYic3fuLJc1A75Jh1/X4iDfDOJPwOSDfOQAWHSz0 wYFnO2SJH3Oj/M9GxnPZ6h+gKTY8Rj9JvXqVI6PhjCjc8MMB/wRo+rZQtzBhrIXwHj sJteaJd23Rf++uZa3YUVNcDWvzVwiF2RSXA4293f8W+EdCwZBnE5r+TOslrFGogZN2 xEPa1F1P7uxEKqlh/9BlJQnx0WsUUgP1lgrQu/YvYLf2EuE924+jR+/Tcnu9yxwAj9 EgWv3tOoWQYhMYKIyh3Kp+p4dcmWcWzGLAqtHa0s0FU7zbsO+8dOA6PYIIasYxZ9rk hpilQIk+hcbqQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A75F9C624D5; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:07 +0800 Subject: [PATCH 8/9] drm/tyr: add VM-related ioctls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-8-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=16278; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=A0Lnaw5c7egAHpTai8vWjw5a256cs/YFCe2NaCe06hU=; b=faNpv23p7LweACexfwrogN/u0AX0wg8LVFWtZoLPYXi9bZUQWR3NvkGY8YWQYU4x3kNgCwG+w TI6fGCmSqU4APwvuuhQYBTlGOz2KnLP2cDtvZIsZeX+3ujjazndE/Cj X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Manage per-file user VMs. - VM_CREATE creates a user VM and returns its ID. - VM_DESTROY destroys the VM identified by the given ID. - VM_BIND maps or unmaps BO ranges in the VM's user VA space. - VM_GET_STATE reports whether the VM is usable or unusable. Signed-off-by: Alvin Sun --- drivers/gpu/drm/tyr/driver.rs | 12 +- drivers/gpu/drm/tyr/file.rs | 324 ++++++++++++++++++++++++++++++++++++++= ++-- drivers/gpu/drm/tyr/vm.rs | 24 +++- 3 files changed, 346 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs index 94bc85635725e..b3145526ada06 100644 --- a/drivers/gpu/drm/tyr/driver.rs +++ b/drivers/gpu/drm/tyr/driver.rs @@ -33,7 +33,7 @@ Mutex, // }, time, - types::CovariantForLt, // + types::ForLt, // }; =20 use crate::{ @@ -72,6 +72,9 @@ pub(crate) struct TyrDrmRegistrationData<'drm> { /// Firmware sections. pub(crate) fw: Firmware<'drm>, =20 + /// Memory management unit for address space slots. + pub(crate) mmu: Arc>, + #[pin] clks: Mutex, =20 @@ -164,6 +167,7 @@ fn probe<'bound>( let reg_data =3D pin_init!(TyrDrmRegistrationData { pdev, fw: firmware, + mmu, clks <- new_mutex!(Clocks { core: core_clk, stacks: stacks_clk, @@ -207,7 +211,7 @@ fn drop(self: Pin<&mut Self>) {} impl drm::Driver for TyrDrmDriver { type Data =3D (); type RegistrationData<'drm> =3D TyrDrmRegistrationData<'drm>; - type File =3D CovariantForLt!(TyrDrmFileData); + type File =3D ForLt!(TyrDrmFileData<'_>); type Object =3D Bo; type ParentDevice =3D platform::Device; =20 @@ -216,6 +220,10 @@ impl drm::Driver for TyrDrmDriver { =20 kernel::declare_drm_ioctls! { (PANTHOR_DEV_QUERY, drm_panthor_dev_query, ioctl::RENDER_ALLOW, Ty= rDrmFileData::dev_query), + (PANTHOR_VM_CREATE, drm_panthor_vm_create, ioctl::RENDER_ALLOW, Ty= rDrmFileData::vm_create), + (PANTHOR_VM_DESTROY, drm_panthor_vm_destroy, ioctl::RENDER_ALLOW, = TyrDrmFileData::vm_destroy), + (PANTHOR_VM_BIND, drm_panthor_vm_bind, ioctl::RENDER_ALLOW, TyrDrm= FileData::vm_bind), + (PANTHOR_VM_GET_STATE, drm_panthor_vm_get_state, ioctl::RENDER_ALL= OW, TyrDrmFileData::vm_get_state), } } =20 diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs index 933a365cb016e..157bc40e1cac4 100644 --- a/drivers/gpu/drm/tyr/file.rs +++ b/drivers/gpu/drm/tyr/file.rs @@ -3,37 +3,70 @@ use kernel::{ drm::{ self, + gem::BaseObject, Registered, // }, prelude::*, - uaccess::UserSlice, + sizes::SizeConstants, + transmute::FromBytes, + uaccess::{ + UserSlice, + UserSliceReader, // + }, uapi, // }; =20 -use crate::driver::{ - TyrDrmDevice, - TyrDrmDriver, - TyrDrmRegistrationData, // +use crate::{ + driver::{ + TyrDrmDevice, + TyrDrmDriver, + TyrDrmRegistrationData, // + }, + pool::VmPool, + vm::{ + UserVaRequest, + Vm, + VmMapFlags, + VmSpec, // + }, // }; =20 -#[pin_data] -pub(crate) struct TyrDrmFileData {} +#[pin_data(PinnedDrop)] +pub(crate) struct TyrDrmFileData<'a> { + reg: &'a TyrDrmRegistrationData<'a>, + + #[pin] + vm_pool: VmPool<'a>, +} =20 /// Convenience type alias for our DRM `File` type. pub(crate) type TyrDrmFile =3D drm::file::File; =20 -impl drm::file::DriverFile<'_> for TyrDrmFileData { +impl<'a> drm::file::DriverFile<'a> for TyrDrmFileData<'a> { type Driver =3D TyrDrmDriver; =20 fn open( _device: &TyrDrmDevice, - _reg_data: &TyrDrmRegistrationData<'_>, + reg_data: &'a TyrDrmRegistrationData<'a>, ) -> impl PinInit { - Ok(Self {}) + try_pin_init!(Self { + reg: reg_data, + vm_pool <- VmPool::new()?, + }) } } =20 -impl TyrDrmFileData { +#[pinned_drop] +impl PinnedDrop for TyrDrmFileData<'_> { + fn drop(self: Pin<&mut Self>) { + let proj =3D self.project(); + while let Some(vm) =3D proj.vm_pool.pop_first() { + vm.kill(); + } + } +} + +impl TyrDrmFileData<'_> { pub(crate) fn dev_query( _ddev: &TyrDrmDevice, reg_data: &TyrDrmRegistrationData<'_>, @@ -65,4 +98,273 @@ pub(crate) fn dev_query( } } } + + pub(crate) fn vm_create( + ddev: &TyrDrmDevice, + _reg_data: &TyrDrmRegistrationData<'_>, + vmcreate: &mut uapi::drm_panthor_vm_create, + file: &TyrDrmFile, + ) -> Result { + if vmcreate.flags !=3D 0 { + dev_err!( + ddev.as_ref(), + "Invalid VM create flags: {:#x}\n", + vmcreate.flags + ); + return Err(EINVAL); + } + + let ret: Result =3D file.inner_with(|fd| { + let vm =3D Vm::new( + fd.reg.pdev.as_ref(), + ddev, + fd.reg.mmu.as_arc_borrow(), + &fd.reg.gpu_info, + VmSpec::User { + user_va: UserVaRequest::from_uapi(vmcreate.user_va_ran= ge), + }, + )?; + vmcreate.user_va_range =3D vm.layout.user.end; + + let id =3D fd.vm_pool.add(vm.as_arc_borrow()).inspect_err(|_| { + vm.kill(); + })?; + vmcreate.id =3D id; + + Ok(0) + }); + ret + } + + pub(crate) fn vm_destroy( + ddev: &TyrDrmDevice, + _reg_data: &TyrDrmRegistrationData<'_>, + vmdestroy: &mut uapi::drm_panthor_vm_destroy, + file: &TyrDrmFile, + ) -> Result { + if vmdestroy.pad !=3D 0 { + dev_err!( + ddev.as_ref(), + "Invalid VM destroy pad: {:#x}\n", + vmdestroy.pad + ); + return Err(EINVAL); + } + + let ret: Result =3D file.inner_with(|fd| { + let vm =3D fd.vm_pool.remove(vmdestroy.id)?; + vm.kill(); + Ok(0) + }); + ret + } + + pub(crate) fn vm_bind( + ddev: &TyrDrmDevice, + _reg_data: &TyrDrmRegistrationData<'_>, + vmbind: &mut uapi::drm_panthor_vm_bind, + file: &TyrDrmFile, + ) -> Result { + let async_flag =3D uapi::drm_panthor_vm_bind_flags_DRM_PANTHOR_VM_= BIND_ASYNC; + + if vmbind.flags & !async_flag !=3D 0 { + dev_err!( + ddev.as_ref(), + "Invalid VM_BIND flags: {:#x}\n", + vmbind.flags + ); + return Err(EINVAL); + } + + if vmbind.flags & async_flag !=3D 0 { + dev_err!(ddev.as_ref(), "Async VM_BIND not supported\n"); + return Err(ENOTSUPP); + } + + let count =3D vmbind.ops.count as usize; + if count =3D=3D 0 { + return Ok(0); + } + + let size_of_op =3D size_of::(); + // Stride versions the UAPI struct: reject only undersized strides. + if size_of_op > vmbind.ops.stride as usize { + dev_err!( + ddev.as_ref(), + "Invalid VM_BIND op stride {}\n", + vmbind.ops.stride + ); + return Err(EINVAL); + } + let stride =3D vmbind.ops.stride as usize; + + let total_len =3D stride.checked_mul(count).ok_or_else(|| { + dev_err!(ddev.as_ref(), "VM_BIND ops length overflow\n"); + EINVAL + })?; + let mut reader =3D + UserSlice::new(UserPtr::from_addr(vmbind.ops.array as usize), = total_len).reader(); + let mut ops =3D KVec::new(); + for _ in 0..count { + ops.push(reader.read::()?, GFP_KERNEL)?; + read_padding_zero(&mut reader, stride - size_of_op)?; + } + + let ret: Result =3D file.inner_with(|fd| { + let vm =3D fd.vm_pool.get(vmbind.vm_id).ok_or_else(|| { + dev_err!(ddev.as_ref(), "Invalid VM_BIND vm_id: {}\n", vmb= ind.vm_id); + EINVAL + })?; + + for (i, op) in ops.iter().enumerate() { + if let Err(e) =3D vm_bind_exec_op(&vm, file, op) { + dev_dbg!(ddev.as_ref(), "VM_BIND op {} failed: {:?}\n"= , i, e); + vmbind.ops.count =3D i as u32; + return Err(e); + } + } + + Ok(0) + }); + ret + } + + pub(crate) fn vm_get_state( + ddev: &TyrDrmDevice, + _reg_data: &TyrDrmRegistrationData<'_>, + vmgetstate: &mut uapi::drm_panthor_vm_get_state, + file: &TyrDrmFile, + ) -> Result { + file.inner_with(|fd| { + let vm =3D fd.vm_pool.get(vmgetstate.vm_id).ok_or_else(|| { + dev_err!( + ddev.as_ref(), + "Invalid VM_GET_STATE vm_id: {}\n", + vmgetstate.vm_id + ); + EINVAL + })?; + vmgetstate.state =3D if vm.is_unusable() { + uapi::drm_panthor_vm_state_DRM_PANTHOR_VM_STATE_UNUSABLE + } else { + uapi::drm_panthor_vm_state_DRM_PANTHOR_VM_STATE_USABLE + }; + Ok(0) + }) + } +} + +fn vm_bind_exec_op(vm: &Vm<'_>, file: &TyrDrmFile, op: &VmBindOp) -> Resul= t { + if vm.is_unusable() { + dev_err!(vm.dev(), "VM_BIND on destroyed VM\n"); + return Err(EINVAL); + } + + if op.size =3D=3D 0 { + return Ok(()); + } + + if op.syncs.count !=3D 0 { + dev_err!(vm.dev(), "VM_BIND op syncs not supported\n"); + return Err(EINVAL); + } + + let end =3D match op.va.checked_add(op.size) { + Some(end) =3D> end, + None =3D> { + dev_err!(vm.dev(), "VM_BIND op VA range overflow\n"); + return Err(EINVAL); + } + }; + if op.va < vm.layout.user.start || end > vm.layout.user.end { + dev_err!( + vm.dev(), + "VM_BIND op VA range {:#x}..{:#x} outside user range\n", + op.va, + end + ); + return Err(EINVAL); + } + + if (op.va | op.size | op.bo_offset) & (u64::SZ_4K - 1) !=3D 0 { + dev_err!(vm.dev(), "VM_BIND op not GPU-page-aligned\n"); + return Err(EINVAL); + } + + const TYPE_MASK: u32 =3D + uapi::drm_panthor_vm_bind_op_flags_DRM_PANTHOR_VM_BIND_OP_TYPE_MAS= K as u32; + const TYPE_MAP: u32 =3D uapi::drm_panthor_vm_bind_op_flags_DRM_PANTHOR= _VM_BIND_OP_TYPE_MAP as u32; + const TYPE_UNMAP: u32 =3D + uapi::drm_panthor_vm_bind_op_flags_DRM_PANTHOR_VM_BIND_OP_TYPE_UNM= AP as u32; + + match op.flags & TYPE_MASK { + TYPE_MAP =3D> { + let map_flags =3D match VmMapFlags::try_from(op.flags & !TYPE_= MASK) { + Ok(flags) =3D> flags, + Err(_) =3D> { + dev_err!(vm.dev(), "VM_BIND op invalid map flags {:#x}= \n", op.flags); + return Err(EINVAL); + } + }; + let bo =3D crate::gem::lookup_handle(file, op.bo_handle).map_e= rr(|_| { + dev_err!(vm.dev(), "VM_BIND op invalid BO handle {}\n", op= .bo_handle); + EINVAL + })?; + // Validate the BO window before mapping. + let bo_size =3D bo.size() as u64; + if op.size > bo_size || op.bo_offset > bo_size - op.size { + dev_err!(vm.dev(), "VM_BIND op BO range out of bounds\n"); + return Err(EINVAL); + } + vm.map_bo_range(&bo, op.bo_offset, op.size, op.va, map_flags) + } + TYPE_UNMAP =3D> { + // Unmap must not carry map-specific flags or BO references. + if op.flags & !TYPE_MASK !=3D 0 || op.bo_handle !=3D 0 || op.b= o_offset !=3D 0 { + dev_err!( + vm.dev(), + "VM_BIND UNMAP carries flags/BO refs: flags=3D{:#x} bo= _handle=3D{} bo_offset=3D{}\n", + op.flags, + op.bo_handle, + op.bo_offset + ); + return Err(EINVAL); + } + vm.unmap_range(op.va, op.size) + } + _ =3D> { + dev_err!(vm.dev(), "VM_BIND op type {:#x} not supported\n", op= .flags); + Err(EINVAL) + } + } } + +/// Reads `len` bytes of array padding, rejecting any nonzero byte with `E= 2BIG`. +fn read_padding_zero(reader: &mut UserSliceReader, len: usize) -> Result { + let mut buf =3D [0u8; 64]; + let mut remaining =3D len; + while remaining > 0 { + let chunk =3D remaining.min(buf.len()); + reader.read_slice(&mut buf[..chunk])?; + if buf[..chunk].iter().any(|&b| b !=3D 0) { + return Err(E2BIG); + } + remaining -=3D chunk; + } + Ok(()) +} + +#[repr(transparent)] +struct VmBindOp(uapi::drm_panthor_vm_bind_op); + +impl core::ops::Deref for VmBindOp { + type Target =3D uapi::drm_panthor_vm_bind_op; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +// SAFETY: `VmBindOp` contains only integers, so any bit pattern is valid; +// the `#[repr(transparent)]` wrapper has the same layout as the UAPI stru= ct. +unsafe impl FromBytes for VmBindOp {} diff --git a/drivers/gpu/drm/tyr/vm.rs b/drivers/gpu/drm/tyr/vm.rs index 76c3d60bb2fe2..610bab69c1a55 100644 --- a/drivers/gpu/drm/tyr/vm.rs +++ b/drivers/gpu/drm/tyr/vm.rs @@ -10,6 +10,10 @@ use core::marker::PhantomData; use core::num::NonZeroU64; use core::ops::Range; +use core::sync::atomic::{ + AtomicBool, + Ordering, // +}; =20 use kernel::{ device::{ @@ -437,6 +441,8 @@ pub(crate) struct Vm<'drm> { gpuvm: ARef>>, /// VA layout for this VM. pub(crate) layout: VmLayout, + /// Whether the VM is unusable. + unusable: AtomicBool, } =20 impl<'drm> Vm<'drm> { @@ -496,6 +502,7 @@ pub(crate) fn new( gpuvm, gpuvm_unique <- new_mutex!(gpuvm_unique), layout, + unusable: AtomicBool::new(false), }), GFP_KERNEL, )?; @@ -526,7 +533,7 @@ fn deactivate(&self) -> Result { =20 /// Kills the VM by deactivating it and unmapping all regions. pub(crate) fn kill(&self) { - // TODO: Turn the VM into a state where it can't be used. + self.mark_unusable(); let _ =3D self.deactivate(); let _ =3D self .unmap_range( @@ -538,6 +545,15 @@ pub(crate) fn kill(&self) { }); } =20 + /// Marks the VM unusable. + pub(crate) fn mark_unusable(&self) { + self.unusable.store(true, Ordering::Release); + } + + pub(crate) fn is_unusable(&self) -> bool { + self.unusable.load(Ordering::Acquire) + } + /// Executes a virtual memory operation. /// /// This handles both map and unmap operations by coordinating between= the @@ -649,6 +665,12 @@ pub(crate) fn map_bo_range( }; let result =3D { let mut gpuvm_unique =3D self.gpuvm_unique.lock(); + // Check under the GPUVM lock so a concurrent `mark_unusable()` + // teardown cannot race with this operation. + if self.is_unusable() { + dev_err!(self.dev, "Cannot map on unusable VM\n"); + return Err(EINVAL); + } self.exec_op(gpuvm_unique.as_mut().get_mut(), req, &mut resour= ces) }; // We flush the defer cleanup list now. Things will be different in --=20 2.43.0 From nobody Sat Sep 26 12:28:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 160EF43F8D9; Tue, 1 Sep 2026 16:09:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; cv=none; b=bOGxfpXGDSVJ1uS7faYSsadw/pAW9x8JWPnK0+LMbnmTz/43VhVTInVv2NapsbmuU552PzBOc6GSGOsS6cEQcxYwXwAMI01yVlclO86Ef5PGxhDR4SlP0Z/n2/HIOrEz88P2u9tVJfJzEvmGsEzY8SXBMSyj1yJretQT6HH07cA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278957; c=relaxed/simple; bh=2rDFcVDpVSOb7E7Q6WZ1n2yT0y1382pLRES1c4DMPSY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sCz3Rb/4q38/Xjkr/N77CMzW8DC6xhVa+kVU5Nt9UfFrBWeMeu05yvCuupnkWWlsaYvamPx/EXwjBdpY+15bFCVYmdx01D306Z0q6LkWvQRj9hyKl9y7m2t0RIc9gzGfPNbfcL+WNmOvT9vwxQBFVUwRKR8xUK4FFG/o2LMpDYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Rox7nyIJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Rox7nyIJ" Received: by smtp.kernel.org (Postfix) with ESMTPS id CDFBEC4AF0D; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788278956; bh=2rDFcVDpVSOb7E7Q6WZ1n2yT0y1382pLRES1c4DMPSY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Rox7nyIJz4XYUKSbtGWvHgHM43zJWFsnI5A216rQQkesWjf+9JviSQjRNYUoy4Dlt ZJXTqE2isLzWICxOQqtkaBCGlz+GbFVgDL18u8VpYRUqeNvFDMSW8w4mqmuco+vBTr 9++A3jT/Orx2icuW+LOZ6Q8MqYYZW2LKmDiXwbln3EH5lH8rR64tgY1HzL7J+HlSVJ A1i2dVGlUgQB8cR/aKPN7eyYpcKHd3UlQURhbBU/B6IsSC1fWvUm9Cssjt/RzU7zSA uCWFLVjocFcvu6JnlZhqbGR2RhRMwXwlcQ//Kc28P//55lt7a6Uw/v9QfUfj64klry sh0UtKR46IHHQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B9F5FC624D3; Tue, 1 Sep 2026 16:09:16 +0000 (UTC) From: Ke Sun via B4 Relay Date: Wed, 02 Sep 2026 00:09:08 +0800 Subject: [PATCH 9/9] drm/tyr: add BO-related ioctls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260902-tyr-ioctls-v1-9-e0fdbf8bd108@kylinos.cn> References: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> In-Reply-To: <20260902-tyr-ioctls-v1-0-e0fdbf8bd108@kylinos.cn> To: rust-for-linux@vger.kernel.org Cc: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , Lorenzo Stoakes , "Liam R. Howlett" , Lyude Paul , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org, linux-mm@kvack.org, dri-devel@lists.freedesktop.org, Ke Sun , Alvin Sun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788278954; l=4674; i=sunke@kylinos.cn; s=20260317; h=from:subject:message-id; bh=GB09PX+9tSC0xXDoB/KYTwCpkupIwMi/t6ujGhWMHCY=; b=3u5QXxhXzE8PTncHj0Olzvwbk36Gnj+5vmGi8iSqdmGh8w7HtluwATOet3QKkFSy3LnDcQ8F/ ROMIFgAhZvfDBDlBA2bDnpKNn+XvzEDEHkHdnZeJP4HolUp8mxXyTEf X-Developer-Key: i=sunke@kylinos.cn; a=ed25519; pk=CHcwQp8GSoj25V/L1ZWNSQjWp9eSIb0s9LKr0Nm3WuE= X-Endpoint-Received: by B4 Relay for sunke@kylinos.cn/20260317 with auth_id=950 X-Original-From: Ke Sun Reply-To: sunke@kylinos.cn From: Alvin Sun Expose buffer creation and BO mmap offset retrieval. - BO_CREATE page-aligns the size and returns a handle with write-combined mapping. - BO_MMAP_OFFSET provides the offset for the DRM generic mmap path, rejecting NO_MMAP objects and non-zero pad. Signed-off-by: Alvin Sun Reviewed-by: Daniel Almeida --- drivers/gpu/drm/tyr/driver.rs | 2 ++ drivers/gpu/drm/tyr/file.rs | 70 +++++++++++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/tyr/gem.rs | 7 +++++ 3 files changed, 79 insertions(+) diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs index b3145526ada06..fc8d11c9ba1ca 100644 --- a/drivers/gpu/drm/tyr/driver.rs +++ b/drivers/gpu/drm/tyr/driver.rs @@ -224,6 +224,8 @@ impl drm::Driver for TyrDrmDriver { (PANTHOR_VM_DESTROY, drm_panthor_vm_destroy, ioctl::RENDER_ALLOW, = TyrDrmFileData::vm_destroy), (PANTHOR_VM_BIND, drm_panthor_vm_bind, ioctl::RENDER_ALLOW, TyrDrm= FileData::vm_bind), (PANTHOR_VM_GET_STATE, drm_panthor_vm_get_state, ioctl::RENDER_ALL= OW, TyrDrmFileData::vm_get_state), + (PANTHOR_BO_CREATE, drm_panthor_bo_create, ioctl::RENDER_ALLOW, Ty= rDrmFileData::bo_create), + (PANTHOR_BO_MMAP_OFFSET, drm_panthor_bo_mmap_offset, ioctl::RENDER= _ALLOW, TyrDrmFileData::bo_mmap_offset), } } =20 diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs index 157bc40e1cac4..16abf2968299c 100644 --- a/drivers/gpu/drm/tyr/file.rs +++ b/drivers/gpu/drm/tyr/file.rs @@ -252,6 +252,76 @@ pub(crate) fn vm_get_state( Ok(0) }) } + + pub(crate) fn bo_create( + ddev: &TyrDrmDevice, + _reg_data: &TyrDrmRegistrationData<'_>, + bocreate: &mut uapi::drm_panthor_bo_create, + file: &TyrDrmFile, + ) -> Result { + if bocreate.size =3D=3D 0 + || bocreate.pad !=3D 0 + || bocreate.flags & !uapi::drm_panthor_bo_flags_DRM_PANTHOR_BO= _NO_MMAP !=3D 0 + || bocreate.exclusive_vm_id !=3D 0 + { + dev_err!( + ddev.as_ref(), + "Invalid BO_CREATE params: size=3D{}, pad=3D{}, flags=3D{:= #x}, exclusive_vm_id=3D{}\n", + bocreate.size, + bocreate.pad, + bocreate.flags, + bocreate.exclusive_vm_id + ); + return Err(EINVAL); + } + + let size =3D usize::try_from(bocreate.size).map_err(|_| { + dev_err!( + ddev.as_ref(), + "BO_CREATE size {:#x} too large\n", + bocreate.size + ); + EINVAL + })?; + let bo =3D crate::gem::new_object(ddev, size, bocreate.flags)?; + bocreate.handle =3D bo.create_handle(file)?; + bocreate.size =3D bo.size() as u64; + + Ok(0) + } + + pub(crate) fn bo_mmap_offset( + ddev: &TyrDrmDevice, + _reg_data: &TyrDrmRegistrationData<'_>, + bommap: &mut uapi::drm_panthor_bo_mmap_offset, + file: &TyrDrmFile, + ) -> Result { + if bommap.pad !=3D 0 { + dev_err!( + ddev.as_ref(), + "BO mmap offset pad not zero: {}\n", + bommap.pad + ); + return Err(EINVAL); + } + + let bo =3D crate::gem::lookup_handle(file, bommap.handle).inspect_= err(|_| { + dev_err!(ddev.as_ref(), "Invalid BO mmap handle: {}\n", bommap= .handle); + })?; + if bo.create_flags() & uapi::drm_panthor_bo_flags_DRM_PANTHOR_BO_N= O_MMAP !=3D 0 { + dev_err!(ddev.as_ref(), "BO mmap offset on NO_MMAP object\n"); + return Err(EPERM); + } + bommap.offset =3D bo.create_mmap_offset().inspect_err(|_| { + dev_err!( + ddev.as_ref(), + "Failed to create mmap offset for handle {}\n", + bommap.handle + ); + })?; + + Ok(0) + } } =20 fn vm_bind_exec_op(vm: &Vm<'_>, file: &TyrDrmFile, op: &VmBindOp) -> Resul= t { diff --git a/drivers/gpu/drm/tyr/gem.rs b/drivers/gpu/drm/tyr/gem.rs index d9ddcb287f52b..f404139f54f32 100644 --- a/drivers/gpu/drm/tyr/gem.rs +++ b/drivers/gpu/drm/tyr/gem.rs @@ -38,6 +38,13 @@ pub(crate) struct BoData { flags: u32, } =20 +impl BoData { + /// Returns the flags the BO was created with. + pub(crate) fn create_flags(&self) -> u32 { + self.flags + } +} + /// Provides a way to pass arguments when creating BoData /// as required by the gem::DriverObject trait. pub(crate) struct BoCreateArgs { --=20 2.43.0