linux/include/drm/drm_vram_mm_helper.h
Thomas Zimmermann 59f5989ad4 drm: Integrate VRAM MM into struct drm_device
There's now a pointer to struct drm_vram_mm stored in struct drm_device.
DRM drivers that use VRAM MM should use this field to refer to their
instance of the data structure. Appropriate helpers are now provided as
well.

Adding struct drm_vram_mm to struct drm_device further avoids wrappers
and boilerplate code in drivers. This patch implements default functions
for callbacks in struct drm_driver and struct file_operations that use
the struct drm_vram_mm stored in struct drm_device. Drivers that need to
provide their own implementations can still do so.

The patch also adds documentation for the VRAM helper library in general.

v5:
	* set .llseek to no_llseek() from DRM_VRAM_MM_FILE_OPERATIONS
v4:
	* cleanups from checkpatch.pl
	* document VRAM helper library

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: http://patchwork.freedesktop.org/patch/msgid/20190508082630.15116-9-tzimmermann@suse.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2019-05-15 16:17:06 +02:00

103 lines
2.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef DRM_VRAM_MM_HELPER_H
#define DRM_VRAM_MM_HELPER_H
#include <drm/ttm/ttm_bo_driver.h>
struct drm_device;
/**
* struct drm_vram_mm_funcs - Callback functions for &struct drm_vram_mm
* @evict_flags: Provides an implementation for struct \
&ttm_bo_driver.evict_flags
* @verify_access: Provides an implementation for \
struct &ttm_bo_driver.verify_access
*
* These callback function integrate VRAM MM with TTM buffer objects. New
* functions can be added if necessary.
*/
struct drm_vram_mm_funcs {
void (*evict_flags)(struct ttm_buffer_object *bo,
struct ttm_placement *placement);
int (*verify_access)(struct ttm_buffer_object *bo, struct file *filp);
};
/**
* struct drm_vram_mm - An instance of VRAM MM
* @vram_base: Base address of the managed video memory
* @vram_size: Size of the managed video memory in bytes
* @bdev: The TTM BO device.
* @funcs: TTM BO functions
*
* The fields &struct drm_vram_mm.vram_base and
* &struct drm_vram_mm.vrm_size are managed by VRAM MM, but are
* available for public read access. Use the field
* &struct drm_vram_mm.bdev to access the TTM BO device.
*/
struct drm_vram_mm {
uint64_t vram_base;
size_t vram_size;
struct ttm_bo_device bdev;
const struct drm_vram_mm_funcs *funcs;
};
/**
* drm_vram_mm_of_bdev() - \
Returns the container of type &struct ttm_bo_device for field bdev.
* @bdev: the TTM BO device
*
* Returns:
* The containing instance of &struct drm_vram_mm
*/
static inline struct drm_vram_mm *drm_vram_mm_of_bdev(
struct ttm_bo_device *bdev)
{
return container_of(bdev, struct drm_vram_mm, bdev);
}
int drm_vram_mm_init(struct drm_vram_mm *vmm, struct drm_device *dev,
uint64_t vram_base, size_t vram_size,
const struct drm_vram_mm_funcs *funcs);
void drm_vram_mm_cleanup(struct drm_vram_mm *vmm);
int drm_vram_mm_mmap(struct file *filp, struct vm_area_struct *vma,
struct drm_vram_mm *vmm);
/*
* Helpers for integration with struct drm_device
*/
struct drm_vram_mm *drm_vram_helper_alloc_mm(
struct drm_device *dev, uint64_t vram_base, size_t vram_size,
const struct drm_vram_mm_funcs *funcs);
void drm_vram_helper_release_mm(struct drm_device *dev);
/*
* Helpers for &struct file_operations
*/
int drm_vram_mm_file_operations_mmap(
struct file *filp, struct vm_area_struct *vma);
/**
* define DRM_VRAM_MM_FILE_OPERATIONS - default callback functions for \
&struct file_operations
*
* Drivers that use VRAM MM can use this macro to initialize
* &struct file_operations with default functions.
*/
#define DRM_VRAM_MM_FILE_OPERATIONS \
.llseek = no_llseek, \
.read = drm_read, \
.poll = drm_poll, \
.unlocked_ioctl = drm_ioctl, \
.compat_ioctl = drm_compat_ioctl, \
.mmap = drm_vram_mm_file_operations_mmap, \
.open = drm_open, \
.release = drm_release \
#endif