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

source code of linux/drivers/gpu/drm/loongson/lsdc_ttm.h