linux/include/drm/drm_gem_vram_helper.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2
   3#ifndef DRM_GEM_VRAM_HELPER_H
   4#define DRM_GEM_VRAM_HELPER_H
   5
   6#include <drm/drm_file.h>
   7#include <drm/drm_gem.h>
   8#include <drm/drm_ioctl.h>
   9#include <drm/drm_modes.h>
  10#include <drm/ttm/ttm_bo_api.h>
  11#include <drm/ttm/ttm_bo_driver.h>
  12
  13#include <linux/dma-buf-map.h>
  14#include <linux/kernel.h> /* for container_of() */
  15
  16struct drm_mode_create_dumb;
  17struct drm_plane;
  18struct drm_plane_state;
  19struct drm_simple_display_pipe;
  20struct filp;
  21struct vm_area_struct;
  22
  23#define DRM_GEM_VRAM_PL_FLAG_SYSTEM     (1 << 0)
  24#define DRM_GEM_VRAM_PL_FLAG_VRAM       (1 << 1)
  25#define DRM_GEM_VRAM_PL_FLAG_TOPDOWN    (1 << 2)
  26
  27/*
  28 * Buffer-object helpers
  29 */
  30
  31/**
  32 * struct drm_gem_vram_object - GEM object backed by VRAM
  33 * @bo:         TTM buffer object
  34 * @map:        Mapping information for @bo
  35 * @placement:  TTM placement information. Supported placements are \
  36        %TTM_PL_VRAM and %TTM_PL_SYSTEM
  37 * @placements: TTM placement information.
  38 *
  39 * The type struct drm_gem_vram_object represents a GEM object that is
  40 * backed by VRAM. It can be used for simple framebuffer devices with
  41 * dedicated memory. The buffer object can be evicted to system memory if
  42 * video memory becomes scarce.
  43 *
  44 * GEM VRAM objects perform reference counting for pin and mapping
  45 * operations. So a buffer object that has been pinned N times with
  46 * drm_gem_vram_pin() must be unpinned N times with
  47 * drm_gem_vram_unpin(). The same applies to pairs of
  48 * drm_gem_vram_kmap() and drm_gem_vram_kunmap(), as well as pairs of
  49 * drm_gem_vram_vmap() and drm_gem_vram_vunmap().
  50 */
  51struct drm_gem_vram_object {
  52        struct ttm_buffer_object bo;
  53        struct dma_buf_map map;
  54
  55        /**
  56         * @vmap_use_count:
  57         *
  58         * Reference count on the virtual address.
  59         * The address are un-mapped when the count reaches zero.
  60         */
  61        unsigned int vmap_use_count;
  62
  63        /* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */
  64        struct ttm_placement placement;
  65        struct ttm_place placements[2];
  66};
  67
  68/**
  69 * drm_gem_vram_of_bo - Returns the container of type
  70 * &struct drm_gem_vram_object for field bo.
  71 * @bo:         the VRAM buffer object
  72 * Returns:     The containing GEM VRAM object
  73 */
  74static inline struct drm_gem_vram_object *drm_gem_vram_of_bo(
  75        struct ttm_buffer_object *bo)
  76{
  77        return container_of(bo, struct drm_gem_vram_object, bo);
  78}
  79
  80/**
  81 * drm_gem_vram_of_gem - Returns the container of type
  82 * &struct drm_gem_vram_object for field gem.
  83 * @gem:        the GEM object
  84 * Returns:     The containing GEM VRAM object
  85 */
  86static inline struct drm_gem_vram_object *drm_gem_vram_of_gem(
  87        struct drm_gem_object *gem)
  88{
  89        return container_of(gem, struct drm_gem_vram_object, bo.base);
  90}
  91
  92struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
  93                                                size_t size,
  94                                                unsigned long pg_align);
  95void drm_gem_vram_put(struct drm_gem_vram_object *gbo);
  96u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo);
  97s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
  98int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag);
  99int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
 100int drm_gem_vram_vmap(struct drm_gem_vram_object *gbo, struct dma_buf_map *map);
 101void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, struct dma_buf_map *map);
 102
 103int drm_gem_vram_fill_create_dumb(struct drm_file *file,
 104                                  struct drm_device *dev,
 105                                  unsigned long pg_align,
 106                                  unsigned long pitch_align,
 107                                  struct drm_mode_create_dumb *args);
 108
 109/*
 110 * Helpers for struct drm_driver
 111 */
 112
 113int drm_gem_vram_driver_dumb_create(struct drm_file *file,
 114                                    struct drm_device *dev,
 115                                    struct drm_mode_create_dumb *args);
 116int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file,
 117                                         struct drm_device *dev,
 118                                         uint32_t handle, uint64_t *offset);
 119
 120/*
 121 * Helpers for struct drm_plane_helper_funcs
 122 */
 123int
 124drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane,
 125                                     struct drm_plane_state *new_state);
 126void
 127drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane,
 128                                     struct drm_plane_state *old_state);
 129
 130/*
 131 * Helpers for struct drm_simple_display_pipe_funcs
 132 */
 133
 134int drm_gem_vram_simple_display_pipe_prepare_fb(
 135        struct drm_simple_display_pipe *pipe,
 136        struct drm_plane_state *new_state);
 137
 138void drm_gem_vram_simple_display_pipe_cleanup_fb(
 139        struct drm_simple_display_pipe *pipe,
 140        struct drm_plane_state *old_state);
 141
 142/**
 143 * define DRM_GEM_VRAM_DRIVER - default callback functions for \
 144        &struct drm_driver
 145 *
 146 * Drivers that use VRAM MM and GEM VRAM can use this macro to initialize
 147 * &struct drm_driver with default functions.
 148 */
 149#define DRM_GEM_VRAM_DRIVER \
 150        .debugfs_init             = drm_vram_mm_debugfs_init, \
 151        .dumb_create              = drm_gem_vram_driver_dumb_create, \
 152        .dumb_map_offset          = drm_gem_vram_driver_dumb_mmap_offset, \
 153        .gem_prime_mmap           = drm_gem_prime_mmap
 154
 155/*
 156 *  VRAM memory manager
 157 */
 158
 159/**
 160 * struct drm_vram_mm - An instance of VRAM MM
 161 * @vram_base:  Base address of the managed video memory
 162 * @vram_size:  Size of the managed video memory in bytes
 163 * @bdev:       The TTM BO device.
 164 * @funcs:      TTM BO functions
 165 *
 166 * The fields &struct drm_vram_mm.vram_base and
 167 * &struct drm_vram_mm.vrm_size are managed by VRAM MM, but are
 168 * available for public read access. Use the field
 169 * &struct drm_vram_mm.bdev to access the TTM BO device.
 170 */
 171struct drm_vram_mm {
 172        uint64_t vram_base;
 173        size_t vram_size;
 174
 175        struct ttm_device bdev;
 176};
 177
 178/**
 179 * drm_vram_mm_of_bdev() - \
 180        Returns the container of type &struct ttm_device for field bdev.
 181 * @bdev:       the TTM BO device
 182 *
 183 * Returns:
 184 * The containing instance of &struct drm_vram_mm
 185 */
 186static inline struct drm_vram_mm *drm_vram_mm_of_bdev(
 187        struct ttm_device *bdev)
 188{
 189        return container_of(bdev, struct drm_vram_mm, bdev);
 190}
 191
 192void drm_vram_mm_debugfs_init(struct drm_minor *minor);
 193
 194/*
 195 * Helpers for integration with struct drm_device
 196 */
 197
 198struct drm_vram_mm *drm_vram_helper_alloc_mm(
 199        struct drm_device *dev, uint64_t vram_base, size_t vram_size);
 200void drm_vram_helper_release_mm(struct drm_device *dev);
 201
 202int drmm_vram_helper_init(struct drm_device *dev, uint64_t vram_base,
 203                          size_t vram_size);
 204
 205/*
 206 * Mode-config helpers
 207 */
 208
 209enum drm_mode_status
 210drm_vram_helper_mode_valid(struct drm_device *dev,
 211                           const struct drm_display_mode *mode);
 212
 213#endif
 214