185438a8dSThomas Zimmermann /* SPDX-License-Identifier: GPL-2.0-or-later */
285438a8dSThomas Zimmermann 
385438a8dSThomas Zimmermann #ifndef DRM_GEM_VRAM_HELPER_H
485438a8dSThomas Zimmermann #define DRM_GEM_VRAM_HELPER_H
585438a8dSThomas Zimmermann 
685438a8dSThomas Zimmermann #include <drm/drm_gem.h>
785438a8dSThomas Zimmermann #include <drm/ttm/ttm_bo_api.h>
885438a8dSThomas Zimmermann #include <drm/ttm/ttm_placement.h>
985438a8dSThomas Zimmermann #include <linux/kernel.h> /* for container_of() */
1085438a8dSThomas Zimmermann 
1185438a8dSThomas Zimmermann struct filp;
1285438a8dSThomas Zimmermann 
1385438a8dSThomas Zimmermann #define DRM_GEM_VRAM_PL_FLAG_VRAM	TTM_PL_FLAG_VRAM
1485438a8dSThomas Zimmermann #define DRM_GEM_VRAM_PL_FLAG_SYSTEM	TTM_PL_FLAG_SYSTEM
1585438a8dSThomas Zimmermann 
1685438a8dSThomas Zimmermann /*
1785438a8dSThomas Zimmermann  * Buffer-object helpers
1885438a8dSThomas Zimmermann  */
1985438a8dSThomas Zimmermann 
2085438a8dSThomas Zimmermann /**
2185438a8dSThomas Zimmermann  * struct drm_gem_vram_object - GEM object backed by VRAM
2285438a8dSThomas Zimmermann  * @gem:	GEM object
2385438a8dSThomas Zimmermann  * @bo:		TTM buffer object
2485438a8dSThomas Zimmermann  * @kmap:	Mapping information for @bo
2585438a8dSThomas Zimmermann  * @placement:	TTM placement information. Supported placements are \
2685438a8dSThomas Zimmermann 	%TTM_PL_VRAM and %TTM_PL_SYSTEM
2785438a8dSThomas Zimmermann  * @placements:	TTM placement information.
2885438a8dSThomas Zimmermann  * @pin_count:	Pin counter
2985438a8dSThomas Zimmermann  *
3085438a8dSThomas Zimmermann  * The type struct drm_gem_vram_object represents a GEM object that is
3185438a8dSThomas Zimmermann  * backed by VRAM. It can be used for simple framebuffer devices with
3285438a8dSThomas Zimmermann  * dedicated memory. The buffer object can be evicted to system memory if
3385438a8dSThomas Zimmermann  * video memory becomes scarce.
3485438a8dSThomas Zimmermann  */
3585438a8dSThomas Zimmermann struct drm_gem_vram_object {
3685438a8dSThomas Zimmermann 	struct drm_gem_object gem;
3785438a8dSThomas Zimmermann 	struct ttm_buffer_object bo;
3885438a8dSThomas Zimmermann 	struct ttm_bo_kmap_obj kmap;
3985438a8dSThomas Zimmermann 
4085438a8dSThomas Zimmermann 	/* Supported placements are %TTM_PL_VRAM and %TTM_PL_SYSTEM */
4185438a8dSThomas Zimmermann 	struct ttm_placement placement;
4285438a8dSThomas Zimmermann 	struct ttm_place placements[2];
4385438a8dSThomas Zimmermann 
4485438a8dSThomas Zimmermann 	int pin_count;
4585438a8dSThomas Zimmermann };
4685438a8dSThomas Zimmermann 
4785438a8dSThomas Zimmermann /**
4885438a8dSThomas Zimmermann  * Returns the container of type &struct drm_gem_vram_object
4985438a8dSThomas Zimmermann  * for field bo.
5085438a8dSThomas Zimmermann  * @bo:		the VRAM buffer object
5185438a8dSThomas Zimmermann  * Returns:	The containing GEM VRAM object
5285438a8dSThomas Zimmermann  */
5385438a8dSThomas Zimmermann static inline struct drm_gem_vram_object *drm_gem_vram_of_bo(
5485438a8dSThomas Zimmermann 	struct ttm_buffer_object *bo)
5585438a8dSThomas Zimmermann {
5685438a8dSThomas Zimmermann 	return container_of(bo, struct drm_gem_vram_object, bo);
5785438a8dSThomas Zimmermann }
5885438a8dSThomas Zimmermann 
5985438a8dSThomas Zimmermann /**
6085438a8dSThomas Zimmermann  * Returns the container of type &struct drm_gem_vram_object
6185438a8dSThomas Zimmermann  * for field gem.
6285438a8dSThomas Zimmermann  * @gem:	the GEM object
6385438a8dSThomas Zimmermann  * Returns:	The containing GEM VRAM object
6485438a8dSThomas Zimmermann  */
6585438a8dSThomas Zimmermann static inline struct drm_gem_vram_object *drm_gem_vram_of_gem(
6685438a8dSThomas Zimmermann 	struct drm_gem_object *gem)
6785438a8dSThomas Zimmermann {
6885438a8dSThomas Zimmermann 	return container_of(gem, struct drm_gem_vram_object, gem);
6985438a8dSThomas Zimmermann }
7085438a8dSThomas Zimmermann 
7185438a8dSThomas Zimmermann struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
7285438a8dSThomas Zimmermann 						struct ttm_bo_device *bdev,
7385438a8dSThomas Zimmermann 						size_t size,
7485438a8dSThomas Zimmermann 						unsigned long pg_align,
7585438a8dSThomas Zimmermann 						bool interruptible);
7685438a8dSThomas Zimmermann void drm_gem_vram_put(struct drm_gem_vram_object *gbo);
7785438a8dSThomas Zimmermann int drm_gem_vram_reserve(struct drm_gem_vram_object *gbo, bool no_wait);
7885438a8dSThomas Zimmermann void drm_gem_vram_unreserve(struct drm_gem_vram_object *gbo);
7985438a8dSThomas Zimmermann u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo);
8085438a8dSThomas Zimmermann s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
8185438a8dSThomas Zimmermann int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag);
8285438a8dSThomas Zimmermann int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
8385438a8dSThomas Zimmermann int drm_gem_vram_push_to_system(struct drm_gem_vram_object *gbo);
8485438a8dSThomas Zimmermann void *drm_gem_vram_kmap_at(struct drm_gem_vram_object *gbo, bool map,
8585438a8dSThomas Zimmermann 			   bool *is_iomem, struct ttm_bo_kmap_obj *kmap);
8685438a8dSThomas Zimmermann void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map,
8785438a8dSThomas Zimmermann 			bool *is_iomem);
8885438a8dSThomas Zimmermann void drm_gem_vram_kunmap_at(struct drm_gem_vram_object *gbo,
8985438a8dSThomas Zimmermann 			    struct ttm_bo_kmap_obj *kmap);
9085438a8dSThomas Zimmermann void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo);
9185438a8dSThomas Zimmermann 
9285438a8dSThomas Zimmermann #endif
93