Commit | Line | Data |
---|---|---|
85438a8d TZ |
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_gem.h> | |
7 | #include <drm/ttm/ttm_bo_api.h> | |
8 | #include <drm/ttm/ttm_placement.h> | |
9 | #include <linux/kernel.h> /* for container_of() */ | |
10 | ||
fed1eec0 | 11 | struct drm_mode_create_dumb; |
85438a8d TZ |
12 | struct filp; |
13 | ||
14 | #define DRM_GEM_VRAM_PL_FLAG_VRAM TTM_PL_FLAG_VRAM | |
15 | #define DRM_GEM_VRAM_PL_FLAG_SYSTEM TTM_PL_FLAG_SYSTEM | |
16 | ||
17 | /* | |
18 | * Buffer-object helpers | |
19 | */ | |
20 | ||
21 | /** | |
22 | * struct drm_gem_vram_object - GEM object backed by VRAM | |
23 | * @gem: GEM object | |
24 | * @bo: TTM buffer object | |
25 | * @kmap: Mapping information for @bo | |
26 | * @placement: TTM placement information. Supported placements are \ | |
27 | %TTM_PL_VRAM and %TTM_PL_SYSTEM | |
28 | * @placements: TTM placement information. | |
29 | * @pin_count: Pin counter | |
30 | * | |
31 | * The type struct drm_gem_vram_object represents a GEM object that is | |
32 | * backed by VRAM. It can be used for simple framebuffer devices with | |
33 | * dedicated memory. The buffer object can be evicted to system memory if | |
34 | * video memory becomes scarce. | |
35 | */ | |
36 | struct drm_gem_vram_object { | |
37 | struct drm_gem_object gem; | |
38 | struct ttm_buffer_object bo; | |
39 | struct ttm_bo_kmap_obj kmap; | |
40 | ||
41 | /* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */ | |
42 | struct ttm_placement placement; | |
43 | struct ttm_place placements[2]; | |
44 | ||
45 | int pin_count; | |
46 | }; | |
47 | ||
48 | /** | |
49 | * Returns the container of type &struct drm_gem_vram_object | |
50 | * for field bo. | |
51 | * @bo: the VRAM buffer object | |
52 | * Returns: The containing GEM VRAM object | |
53 | */ | |
54 | static inline struct drm_gem_vram_object *drm_gem_vram_of_bo( | |
55 | struct ttm_buffer_object *bo) | |
56 | { | |
57 | return container_of(bo, struct drm_gem_vram_object, bo); | |
58 | } | |
59 | ||
60 | /** | |
61 | * Returns the container of type &struct drm_gem_vram_object | |
62 | * for field gem. | |
63 | * @gem: the GEM object | |
64 | * Returns: The containing GEM VRAM object | |
65 | */ | |
66 | static inline struct drm_gem_vram_object *drm_gem_vram_of_gem( | |
67 | struct drm_gem_object *gem) | |
68 | { | |
69 | return container_of(gem, struct drm_gem_vram_object, gem); | |
70 | } | |
71 | ||
72 | struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev, | |
73 | struct ttm_bo_device *bdev, | |
74 | size_t size, | |
75 | unsigned long pg_align, | |
76 | bool interruptible); | |
77 | void drm_gem_vram_put(struct drm_gem_vram_object *gbo); | |
78 | int drm_gem_vram_reserve(struct drm_gem_vram_object *gbo, bool no_wait); | |
79 | void drm_gem_vram_unreserve(struct drm_gem_vram_object *gbo); | |
80 | u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo); | |
81 | s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo); | |
82 | int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag); | |
83 | int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo); | |
84 | int drm_gem_vram_push_to_system(struct drm_gem_vram_object *gbo); | |
85 | void *drm_gem_vram_kmap_at(struct drm_gem_vram_object *gbo, bool map, | |
86 | bool *is_iomem, struct ttm_bo_kmap_obj *kmap); | |
87 | void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map, | |
88 | bool *is_iomem); | |
89 | void drm_gem_vram_kunmap_at(struct drm_gem_vram_object *gbo, | |
90 | struct ttm_bo_kmap_obj *kmap); | |
91 | void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo); | |
92 | ||
fed1eec0 TZ |
93 | int drm_gem_vram_fill_create_dumb(struct drm_file *file, |
94 | struct drm_device *dev, | |
95 | struct ttm_bo_device *bdev, | |
96 | unsigned long pg_align, | |
97 | bool interruptible, | |
98 | struct drm_mode_create_dumb *args); | |
99 | ||
6c812bc5 TZ |
100 | /* |
101 | * Helpers for struct ttm_bo_driver | |
102 | */ | |
103 | ||
104 | void drm_gem_vram_bo_driver_evict_flags(struct ttm_buffer_object *bo, | |
105 | struct ttm_placement *pl); | |
106 | ||
107 | int drm_gem_vram_bo_driver_verify_access(struct ttm_buffer_object *bo, | |
108 | struct file *filp); | |
109 | ||
737000fd TZ |
110 | /* |
111 | * Helpers for struct drm_driver | |
112 | */ | |
113 | ||
114 | void drm_gem_vram_driver_gem_free_object_unlocked(struct drm_gem_object *gem); | |
115 | ||
116 | int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file, | |
117 | struct drm_device *dev, | |
118 | uint32_t handle, uint64_t *offset); | |
119 | ||
85438a8d | 120 | #endif |