mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
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> Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com> Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> Signed-off-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Janne Grunau <j@jananu.net> Tested-by: Deborah Brouwer <deborah.brouwer@collabora.com> Link: https://patch.msgid.link/20260316211646.650074-6-lyude@redhat.com [ * DRM_GEM_SHMEM_HELPER is a tristate; when a module driver selects it, it becomes =m. The Rust kernel crate and its C helpers are always built into vmlinux and can't reference symbols from a module, causing link errors. Thus, add RUST_DRM_GEM_SHMEM_HELPER bool Kconfig that selects DRM_GEM_SHMEM_HELPER, forcing it built-in when Rust drivers need it; use cfg(CONFIG_RUST_DRM_GEM_SHMEM_HELPER) for the shmem module. * Add cfg_attr(not(CONFIG_RUST_DRM_GEM_SHMEM_HELPER), expect(unused)) on pub(crate) use impl_aref_for_gem_obj and BaseObjectPrivate, so that unused warnings are suppressed when shmem is not enabled. * Enable const_refs_to_static (stabilized in 1.83) to prevent build errors with older compilers. * Use &raw const for bindings::drm_gem_shmem_vm_ops and add #[allow(unused_unsafe, reason = "Safe since Rust 1.82.0")]. * Fix incorrect C Header path and minor spelling and formatting issues. * Drop shmem::Object::sg_table() as the current implementation is unsound. - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>
79 lines
1.8 KiB
C
79 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include <drm/drm_gem.h>
|
|
#include <drm/drm_gem_shmem_helper.h>
|
|
#include <drm/drm_vma_manager.h>
|
|
|
|
#ifdef CONFIG_DRM
|
|
|
|
__rust_helper void rust_helper_drm_gem_object_get(struct drm_gem_object *obj)
|
|
{
|
|
drm_gem_object_get(obj);
|
|
}
|
|
|
|
__rust_helper void rust_helper_drm_gem_object_put(struct drm_gem_object *obj)
|
|
{
|
|
drm_gem_object_put(obj);
|
|
}
|
|
|
|
__rust_helper __u64
|
|
rust_helper_drm_vma_node_offset_addr(struct drm_vma_offset_node *node)
|
|
{
|
|
return drm_vma_node_offset_addr(node);
|
|
}
|
|
|
|
#ifdef CONFIG_DRM_GEM_SHMEM_HELPER
|
|
__rust_helper void
|
|
rust_helper_drm_gem_shmem_object_free(struct drm_gem_object *obj)
|
|
{
|
|
return drm_gem_shmem_object_free(obj);
|
|
}
|
|
|
|
__rust_helper void
|
|
rust_helper_drm_gem_shmem_object_print_info(struct drm_printer *p, unsigned int indent,
|
|
const struct drm_gem_object *obj)
|
|
{
|
|
drm_gem_shmem_object_print_info(p, indent, obj);
|
|
}
|
|
|
|
__rust_helper int
|
|
rust_helper_drm_gem_shmem_object_pin(struct drm_gem_object *obj)
|
|
{
|
|
return drm_gem_shmem_object_pin(obj);
|
|
}
|
|
|
|
__rust_helper void
|
|
rust_helper_drm_gem_shmem_object_unpin(struct drm_gem_object *obj)
|
|
{
|
|
drm_gem_shmem_object_unpin(obj);
|
|
}
|
|
|
|
__rust_helper struct sg_table *
|
|
rust_helper_drm_gem_shmem_object_get_sg_table(struct drm_gem_object *obj)
|
|
{
|
|
return drm_gem_shmem_object_get_sg_table(obj);
|
|
}
|
|
|
|
__rust_helper int
|
|
rust_helper_drm_gem_shmem_object_vmap(struct drm_gem_object *obj,
|
|
struct iosys_map *map)
|
|
{
|
|
return drm_gem_shmem_object_vmap(obj, map);
|
|
}
|
|
|
|
__rust_helper void
|
|
rust_helper_drm_gem_shmem_object_vunmap(struct drm_gem_object *obj,
|
|
struct iosys_map *map)
|
|
{
|
|
drm_gem_shmem_object_vunmap(obj, map);
|
|
}
|
|
|
|
__rust_helper int
|
|
rust_helper_drm_gem_shmem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
|
|
{
|
|
return drm_gem_shmem_object_mmap(obj, vma);
|
|
}
|
|
|
|
#endif /* CONFIG_DRM_GEM_SHMEM_HELPER */
|
|
#endif /* CONFIG_DRM */
|