hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/nouveau/nouveau_bo.h
....@@ -1,12 +1,13 @@
1
-/* SPDX-License-Identifier: GPL-2.0 */
1
+/* SPDX-License-Identifier: MIT */
22 #ifndef __NOUVEAU_BO_H__
33 #define __NOUVEAU_BO_H__
4
-
4
+#include <drm/ttm/ttm_bo_driver.h>
55 #include <drm/drm_gem.h>
66
77 struct nouveau_channel;
8
+struct nouveau_cli;
9
+struct nouveau_drm;
810 struct nouveau_fence;
9
-struct nvkm_vma;
1011
1112 struct nouveau_bo {
1213 struct ttm_buffer_object bo;
....@@ -17,12 +18,16 @@
1718 bool force_coherent;
1819 struct ttm_bo_kmap_obj kmap;
1920 struct list_head head;
21
+ struct list_head io_reserve_lru;
2022
2123 /* protected by ttm_bo_reserve() */
2224 struct drm_file *reserved_by;
2325 struct list_head entry;
2426 int pbbo_index;
2527 bool validate_mapped;
28
+
29
+ /* GPU address space is independent of CPU word size */
30
+ uint64_t offset;
2631
2732 struct list_head vma_list;
2833
....@@ -34,11 +39,6 @@
3439 unsigned mode;
3540
3641 struct nouveau_drm_tile *tile;
37
-
38
- /* Only valid if allocated via nouveau_gem_new() and iff you hold a
39
- * gem reference to it! For debugging, use gem.filp != NULL to test
40
- * whether it is valid. */
41
- struct drm_gem_object gem;
4242
4343 /* protect by the ttm reservation lock */
4444 int pin_refcnt;
....@@ -61,12 +61,14 @@
6161 return -EINVAL;
6262 prev = *pnvbo;
6363
64
- *pnvbo = ref ? nouveau_bo(ttm_bo_reference(&ref->bo)) : NULL;
65
- if (prev) {
66
- struct ttm_buffer_object *bo = &prev->bo;
67
-
68
- ttm_bo_unref(&bo);
64
+ if (ref) {
65
+ ttm_bo_get(&ref->bo);
66
+ *pnvbo = nouveau_bo(&ref->bo);
67
+ } else {
68
+ *pnvbo = NULL;
6969 }
70
+ if (prev)
71
+ ttm_bo_put(&prev->bo);
7072
7173 return 0;
7274 }
....@@ -74,9 +76,13 @@
7476 extern struct ttm_bo_driver nouveau_bo_driver;
7577
7678 void nouveau_bo_move_init(struct nouveau_drm *);
77
-int nouveau_bo_new(struct nouveau_cli *, u64 size, int align, u32 flags,
79
+struct nouveau_bo *nouveau_bo_alloc(struct nouveau_cli *, u64 *size, int *align,
80
+ u32 domain, u32 tile_mode, u32 tile_flags);
81
+int nouveau_bo_init(struct nouveau_bo *, u64 size, int align, u32 domain,
82
+ struct sg_table *sg, struct dma_resv *robj);
83
+int nouveau_bo_new(struct nouveau_cli *, u64 size, int align, u32 domain,
7884 u32 tile_mode, u32 tile_flags, struct sg_table *sg,
79
- struct reservation_object *robj,
85
+ struct dma_resv *robj,
8086 struct nouveau_bo **);
8187 int nouveau_bo_pin(struct nouveau_bo *, u32 flags, bool contig);
8288 int nouveau_bo_unpin(struct nouveau_bo *);
....@@ -91,6 +97,8 @@
9197 bool no_wait_gpu);
9298 void nouveau_bo_sync_for_device(struct nouveau_bo *nvbo);
9399 void nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo);
100
+void nouveau_bo_add_io_reserve_lru(struct ttm_buffer_object *bo);
101
+void nouveau_bo_del_io_reserve_lru(struct ttm_buffer_object *bo);
94102
95103 /* TODO: submit equivalent to TTM generic API upstream? */
96104 static inline void __iomem *
....@@ -114,13 +122,13 @@
114122 }
115123
116124 static inline int
117
-nouveau_bo_new_pin_map(struct nouveau_cli *cli, u64 size, int align, u32 flags,
125
+nouveau_bo_new_pin_map(struct nouveau_cli *cli, u64 size, int align, u32 domain,
118126 struct nouveau_bo **pnvbo)
119127 {
120
- int ret = nouveau_bo_new(cli, size, align, flags,
128
+ int ret = nouveau_bo_new(cli, size, align, domain,
121129 0, 0, NULL, NULL, pnvbo);
122130 if (ret == 0) {
123
- ret = nouveau_bo_pin(*pnvbo, flags, true);
131
+ ret = nouveau_bo_pin(*pnvbo, domain, true);
124132 if (ret == 0) {
125133 ret = nouveau_bo_map(*pnvbo);
126134 if (ret == 0)
....@@ -131,4 +139,42 @@
131139 }
132140 return ret;
133141 }
142
+
143
+int nv04_bo_move_init(struct nouveau_channel *, u32);
144
+int nv04_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
145
+ struct ttm_resource *, struct ttm_resource *);
146
+
147
+int nv50_bo_move_init(struct nouveau_channel *, u32);
148
+int nv50_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
149
+ struct ttm_resource *, struct ttm_resource *);
150
+
151
+int nv84_bo_move_exec(struct nouveau_channel *, struct ttm_buffer_object *,
152
+ struct ttm_resource *, struct ttm_resource *);
153
+
154
+int nva3_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
155
+ struct ttm_resource *, struct ttm_resource *);
156
+
157
+int nvc0_bo_move_init(struct nouveau_channel *, u32);
158
+int nvc0_bo_move_m2mf(struct nouveau_channel *, struct ttm_buffer_object *,
159
+ struct ttm_resource *, struct ttm_resource *);
160
+
161
+int nvc0_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
162
+ struct ttm_resource *, struct ttm_resource *);
163
+
164
+int nve0_bo_move_init(struct nouveau_channel *, u32);
165
+int nve0_bo_move_copy(struct nouveau_channel *, struct ttm_buffer_object *,
166
+ struct ttm_resource *, struct ttm_resource *);
167
+
168
+#define NVBO_WR32_(b,o,dr,f) nouveau_bo_wr32((b), (o)/4 + (dr), (f))
169
+#define NVBO_RD32_(b,o,dr) nouveau_bo_rd32((b), (o)/4 + (dr))
170
+#define NVBO_RD32(A...) DRF_RD(NVBO_RD32_, ##A)
171
+#define NVBO_RV32(A...) DRF_RV(NVBO_RD32_, ##A)
172
+#define NVBO_TV32(A...) DRF_TV(NVBO_RD32_, ##A)
173
+#define NVBO_TD32(A...) DRF_TD(NVBO_RD32_, ##A)
174
+#define NVBO_WR32(A...) DRF_WR( NVBO_WR32_, ##A)
175
+#define NVBO_WV32(A...) DRF_WV( NVBO_WR32_, ##A)
176
+#define NVBO_WD32(A...) DRF_WD( NVBO_WR32_, ##A)
177
+#define NVBO_MR32(A...) DRF_MR(NVBO_RD32_, NVBO_WR32_, u32, ##A)
178
+#define NVBO_MV32(A...) DRF_MV(NVBO_RD32_, NVBO_WR32_, u32, ##A)
179
+#define NVBO_MD32(A...) DRF_MD(NVBO_RD32_, NVBO_WR32_, u32, ##A)
134180 #endif