2019-05-08 16:26:16 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
|
|
|
|
#ifndef DRM_VRAM_MM_HELPER_H
|
|
|
|
#define DRM_VRAM_MM_HELPER_H
|
|
|
|
|
2019-06-30 14:19:19 +08:00
|
|
|
#include <drm/drm_file.h>
|
|
|
|
#include <drm/drm_ioctl.h>
|
2019-05-08 16:26:16 +08:00
|
|
|
#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);
|
|
|
|
|
2019-05-08 16:26:18 +08:00
|
|
|
/*
|
|
|
|
* 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 \
|
|
|
|
|
2019-05-08 16:26:16 +08:00
|
|
|
#endif
|