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