1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Copyright (C) 2023 Loongson Technology Corporation Limited 4 */ 5 6#ifndef __LSDC_TTM_H__ 7#define __LSDC_TTM_H__ 8 9#include <linux/container_of.h> 10#include <linux/iosys-map.h> 11#include <linux/list.h> 12 13#include <drm/drm_gem.h> 14#include <drm/ttm/ttm_bo.h> 15#include <drm/ttm/ttm_placement.h> 16#include <drm/ttm/ttm_range_manager.h> 17#include <drm/ttm/ttm_tt.h> 18 19#define LSDC_GEM_DOMAIN_SYSTEM 0x1 20#define LSDC_GEM_DOMAIN_GTT 0x2 21#define LSDC_GEM_DOMAIN_VRAM 0x4 22 23struct lsdc_bo { 24 struct ttm_buffer_object tbo; 25 26 /* Protected by gem.mutex */ 27 struct list_head list; 28 29 struct iosys_map map; 30 31 unsigned int vmap_count; 32 /* cross device driver sharing reference count */ 33 unsigned int sharing_count; 34 35 struct ttm_bo_kmap_obj kmap; 36 void *kptr; 37 bool is_iomem; 38 39 size_t size; 40 41 u32 initial_domain; 42 43 struct ttm_placement placement; 44 struct ttm_place placements[4]; 45}; 46 47static inline struct ttm_buffer_object *to_ttm_bo(struct drm_gem_object *gem) 48{ 49 return container_of(gem, struct ttm_buffer_object, base); 50} 51 52static inline struct lsdc_bo *to_lsdc_bo(struct ttm_buffer_object *tbo) 53{ 54 return container_of(tbo, struct lsdc_bo, tbo); 55} 56 57static inline struct lsdc_bo *gem_to_lsdc_bo(struct drm_gem_object *gem) 58{ 59 return container_of(gem, struct lsdc_bo, tbo.base); 60} 61 62const char *lsdc_mem_type_to_str(uint32_t mem_type); 63const char *lsdc_domain_to_str(u32 domain); 64 65struct lsdc_bo *lsdc_bo_create(struct drm_device *ddev, 66 u32 domain, 67 size_t size, 68 bool kernel, 69 struct sg_table *sg, 70 struct dma_resv *resv); 71 72struct lsdc_bo *lsdc_bo_create_kernel_pinned(struct drm_device *ddev, 73 u32 domain, 74 size_t size); 75 76void lsdc_bo_free_kernel_pinned(struct lsdc_bo *lbo); 77 78int lsdc_bo_reserve(struct lsdc_bo *lbo); 79void lsdc_bo_unreserve(struct lsdc_bo *lbo); 80 81int lsdc_bo_pin(struct lsdc_bo *lbo, u32 domain, u64 *gpu_addr); 82void lsdc_bo_unpin(struct lsdc_bo *lbo); 83 84void lsdc_bo_ref(struct lsdc_bo *lbo); 85void lsdc_bo_unref(struct lsdc_bo *lbo); 86 87u64 lsdc_bo_gpu_offset(struct lsdc_bo *lbo); 88size_t lsdc_bo_size(struct lsdc_bo *lbo); 89 90int lsdc_bo_kmap(struct lsdc_bo *lbo); 91void lsdc_bo_kunmap(struct lsdc_bo *lbo); 92void lsdc_bo_clear(struct lsdc_bo *lbo); 93 94int lsdc_bo_evict_vram(struct drm_device *ddev); 95 96int lsdc_ttm_init(struct lsdc_device *ldev); 97void lsdc_ttm_debugfs_init(struct lsdc_device *ldev); 98 99#endif 100