Skip to content

Commit 6f4ad4c

Browse files
hoshinolinamarcan
authored andcommitted
rust: drm: gem: shmem: Add DRM shmem helper abstraction
The DRM shmem helper includes common code useful for drivers which allocate GEM objects as anonymous shmem. Add a Rust abstraction for this. Drivers can choose the raw GEM implementation or the shmem layer, depending on their needs. Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent 20d913e commit 6f4ad4c

4 files changed

Lines changed: 456 additions & 5 deletions

File tree

rust/bindings/bindings_helper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <drm/drm_drv.h>
1111
#include <drm/drm_file.h>
1212
#include <drm/drm_gem.h>
13+
#include <drm/drm_gem_shmem_helper.h>
1314
#include <drm/drm_ioctl.h>
1415
#include <linux/delay.h>
1516
#include <linux/device.h>
@@ -18,6 +19,7 @@
1819
#include <linux/slab.h>
1920
#include <linux/fs.h>
2021
#include <linux/io-pgtable.h>
22+
#include <linux/iosys-map.h>
2123
#include <linux/ktime.h>
2224
#include <linux/lockdep.h>
2325
#include <linux/of.h>

rust/helpers.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020

2121
#include <drm/drm_gem.h>
22+
#include <drm/drm_gem_shmem_helper.h>
2223
#include <linux/bug.h>
2324
#include <linux/build_bug.h>
2425
#include <linux/device.h>
@@ -423,6 +424,18 @@ resource_size_t rust_helper_resource_size(const struct resource *res)
423424
}
424425
EXPORT_SYMBOL_GPL(rust_helper_resource_size);
425426

427+
dma_addr_t rust_helper_sg_dma_address(const struct scatterlist *sg)
428+
{
429+
return sg_dma_address(sg);
430+
}
431+
EXPORT_SYMBOL_GPL(rust_helper_sg_dma_address);
432+
433+
int rust_helper_sg_dma_len(const struct scatterlist *sg)
434+
{
435+
return sg_dma_len(sg);
436+
}
437+
EXPORT_SYMBOL_GPL(rust_helper_sg_dma_len);
438+
426439
#ifdef CONFIG_DRM
427440

428441
void rust_helper_drm_gem_object_get(struct drm_gem_object *obj)
@@ -443,6 +456,60 @@ __u64 rust_helper_drm_vma_node_offset_addr(struct drm_vma_offset_node *node)
443456
}
444457
EXPORT_SYMBOL_GPL(rust_helper_drm_vma_node_offset_addr);
445458

459+
#ifdef CONFIG_DRM_GEM_SHMEM_HELPER
460+
461+
void rust_helper_drm_gem_shmem_object_free(struct drm_gem_object *obj)
462+
{
463+
return drm_gem_shmem_object_free(obj);
464+
}
465+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_free);
466+
467+
void rust_helper_drm_gem_shmem_object_print_info(struct drm_printer *p, unsigned int indent,
468+
const struct drm_gem_object *obj)
469+
{
470+
drm_gem_shmem_object_print_info(p, indent, obj);
471+
}
472+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_print_info);
473+
474+
int rust_helper_drm_gem_shmem_object_pin(struct drm_gem_object *obj)
475+
{
476+
return drm_gem_shmem_object_pin(obj);
477+
}
478+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_pin);
479+
480+
void rust_helper_drm_gem_shmem_object_unpin(struct drm_gem_object *obj)
481+
{
482+
drm_gem_shmem_object_unpin(obj);
483+
}
484+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_unpin);
485+
486+
struct sg_table *rust_helper_drm_gem_shmem_object_get_sg_table(struct drm_gem_object *obj)
487+
{
488+
return drm_gem_shmem_object_get_sg_table(obj);
489+
}
490+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_get_sg_table);
491+
492+
int rust_helper_drm_gem_shmem_object_vmap(struct drm_gem_object *obj,
493+
struct iosys_map *map)
494+
{
495+
return drm_gem_shmem_object_vmap(obj, map);
496+
}
497+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_vmap);
498+
499+
void rust_helper_drm_gem_shmem_object_vunmap(struct drm_gem_object *obj,
500+
struct iosys_map *map)
501+
{
502+
drm_gem_shmem_object_vunmap(obj, map);
503+
}
504+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_vunmap);
505+
506+
int rust_helper_drm_gem_shmem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
507+
{
508+
return drm_gem_shmem_object_mmap(obj, vma);
509+
}
510+
EXPORT_SYMBOL_GPL(rust_helper_drm_gem_shmem_object_mmap);
511+
512+
#endif
446513
#endif
447514

448515
/*

rust/kernel/drm/gem/mod.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
//!
55
//! C header: [`include/linux/drm/drm_gem.h`](../../../../include/linux/drm/drm_gem.h)
66
7+
#[cfg(CONFIG_DRM_GEM_SHMEM_HELPER = "y")]
8+
pub mod shmem;
9+
710
use alloc::boxed::Box;
811

912
use crate::{
@@ -195,8 +198,6 @@ impl<T: IntoGEMObject> BaseObject for T {}
195198
#[pin_data]
196199
pub struct Object<T: DriverObject> {
197200
obj: bindings::drm_gem_object,
198-
// The DRM core ensures the Device exists as long as its objects exist, so we don't need to
199-
// manage the reference count here.
200201
dev: *const bindings::drm_device,
201202
#[pin]
202203
inner: T,
@@ -236,14 +237,12 @@ impl<T: DriverObject> Object<T> {
236237
..Default::default()
237238
},
238239
inner <- T::new(dev, size),
239-
// SAFETY: The drm subsystem guarantees that the drm_device will live as long as
240-
// the GEM object lives, so we can conjure a reference out of thin air.
241240
dev: dev.drm.get(),
242241
_p: PhantomPinned
243242
}))?;
244243

245244
to_result(unsafe {
246-
bindings::drm_gem_object_init(dev.raw() as *mut _, &obj.obj as *const _ as *mut _, size)
245+
bindings::drm_gem_object_init(dev.raw_mut(), &obj.obj as *const _ as *mut _, size)
247246
})?;
248247

249248
// SAFETY: We never move out of self

0 commit comments

Comments
 (0)