1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2024 Collabora Ltd. and Red Hat Inc.
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker #ifndef NVKMD_H
6*61046927SAndroid Build Coastguard Worker #define NVKMD_H 1
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include "nv_device_info.h"
9*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
10*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker #include "../nvk_debug.h"
13*61046927SAndroid Build Coastguard Worker #include "vulkan/vulkan_core.h"
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker #include <assert.h>
16*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
17*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
18*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
19*61046927SAndroid Build Coastguard Worker
20*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx;
21*61046927SAndroid Build Coastguard Worker struct nvkmd_dev;
22*61046927SAndroid Build Coastguard Worker struct nvkmd_mem;
23*61046927SAndroid Build Coastguard Worker struct nvkmd_pdev;
24*61046927SAndroid Build Coastguard Worker struct nvkmd_va;
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker struct _drmDevice;
27*61046927SAndroid Build Coastguard Worker struct vk_object_base;
28*61046927SAndroid Build Coastguard Worker struct vk_sync_wait;
29*61046927SAndroid Build Coastguard Worker struct vk_sync_signal;
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker /*
32*61046927SAndroid Build Coastguard Worker * Enums
33*61046927SAndroid Build Coastguard Worker */
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags {
36*61046927SAndroid Build Coastguard Worker /** Place memory as local as possible.
37*61046927SAndroid Build Coastguard Worker *
38*61046927SAndroid Build Coastguard Worker * This should be the default for most memory allocations. On discrete
39*61046927SAndroid Build Coastguard Worker * GPUs, it will default to be placed in VRAM but may be paged out to GART,
40*61046927SAndroid Build Coastguard Worker * depending on system memory pressure.
41*61046927SAndroid Build Coastguard Worker */
42*61046927SAndroid Build Coastguard Worker NVKMD_MEM_LOCAL = 1 << 0,
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker /** Place the memory in GART */
45*61046927SAndroid Build Coastguard Worker NVKMD_MEM_GART = 1 << 1,
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker /** Place the memory in VRAM */
48*61046927SAndroid Build Coastguard Worker NVKMD_MEM_VRAM = 1 << 2,
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker /** This memory object may be mapped */
51*61046927SAndroid Build Coastguard Worker NVKMD_MEM_CAN_MAP = 1 << 3,
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker /** This memory object may be shared with other processes */
54*61046927SAndroid Build Coastguard Worker NVKMD_MEM_SHARED = 1 << 4,
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags {
58*61046927SAndroid Build Coastguard Worker NVKMD_MEM_MAP_RD = 1 << 0,
59*61046927SAndroid Build Coastguard Worker NVKMD_MEM_MAP_WR = 1 << 1,
60*61046927SAndroid Build Coastguard Worker NVKMD_MEM_MAP_RDWR = NVKMD_MEM_MAP_RD | NVKMD_MEM_MAP_WR,
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /** Create a client mapping
63*61046927SAndroid Build Coastguard Worker *
64*61046927SAndroid Build Coastguard Worker * This sets nvkmd_mem::client_map instead of nvkmd_mem::map. These
65*61046927SAndroid Build Coastguard Worker * mappings may be different from internal mappings and have different
66*61046927SAndroid Build Coastguard Worker * rules. Only one client mapping may exist at a time but internal
67*61046927SAndroid Build Coastguard Worker * mappings are reference counted. Only client mappings can be used with
68*61046927SAndroid Build Coastguard Worker * MAP_FIXED or unmapped with nvkmd_mem_overmap().
69*61046927SAndroid Build Coastguard Worker */
70*61046927SAndroid Build Coastguard Worker NVKMD_MEM_MAP_CLIENT = 1 << 2,
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker NVKMD_MEM_MAP_FIXED = 1 << 3,
73*61046927SAndroid Build Coastguard Worker };
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker enum nvkmd_va_flags {
76*61046927SAndroid Build Coastguard Worker /** This VA should be configured for sparse (soft faults) */
77*61046927SAndroid Build Coastguard Worker NVKMD_VA_SPARSE = 1 << 0,
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker /** This VA should come from the capture/replay pool */
80*61046927SAndroid Build Coastguard Worker NVKMD_VA_REPLAY = 1 << 1,
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker /** Attempt to place this VA at the requested address and fail otherwise */
83*61046927SAndroid Build Coastguard Worker NVKMD_VA_ALLOC_FIXED = 1 << 2,
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker /** This VA will only be used with GART.
86*61046927SAndroid Build Coastguard Worker *
87*61046927SAndroid Build Coastguard Worker * Alignment requirements for GART-only are lower.
88*61046927SAndroid Build Coastguard Worker */
89*61046927SAndroid Build Coastguard Worker NVKMD_VA_GART = 1 << 3,
90*61046927SAndroid Build Coastguard Worker };
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker enum nvkmd_engines {
93*61046927SAndroid Build Coastguard Worker NVKMD_ENGINE_COPY = 1 << 0,
94*61046927SAndroid Build Coastguard Worker NVKMD_ENGINE_2D = 1 << 1,
95*61046927SAndroid Build Coastguard Worker NVKMD_ENGINE_3D = 1 << 2,
96*61046927SAndroid Build Coastguard Worker NVKMD_ENGINE_M2MF = 1 << 3,
97*61046927SAndroid Build Coastguard Worker NVKMD_ENGINE_COMPUTE = 1 << 4,
98*61046927SAndroid Build Coastguard Worker NVKMD_ENGINE_BIND = 1 << 5,
99*61046927SAndroid Build Coastguard Worker };
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker enum nvkmd_bind_op {
102*61046927SAndroid Build Coastguard Worker NVKMD_BIND_OP_BIND,
103*61046927SAndroid Build Coastguard Worker NVKMD_BIND_OP_UNBIND,
104*61046927SAndroid Build Coastguard Worker };
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker /*
107*61046927SAndroid Build Coastguard Worker * Structs
108*61046927SAndroid Build Coastguard Worker */
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker struct nvkmd_info {
111*61046927SAndroid Build Coastguard Worker bool has_dma_buf;
112*61046927SAndroid Build Coastguard Worker bool has_get_vram_used;
113*61046927SAndroid Build Coastguard Worker bool has_alloc_tiled;
114*61046927SAndroid Build Coastguard Worker bool has_map_fixed;
115*61046927SAndroid Build Coastguard Worker bool has_overmap;
116*61046927SAndroid Build Coastguard Worker };
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker struct nvkmd_pdev_ops {
119*61046927SAndroid Build Coastguard Worker void (*destroy)(struct nvkmd_pdev *pdev);
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker uint64_t (*get_vram_used)(struct nvkmd_pdev *pdev);
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker int (*get_drm_primary_fd)(struct nvkmd_pdev *pdev);
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker VkResult (*create_dev)(struct nvkmd_pdev *pdev,
126*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
127*61046927SAndroid Build Coastguard Worker struct nvkmd_dev **dev_out);
128*61046927SAndroid Build Coastguard Worker };
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker struct nvkmd_pdev {
131*61046927SAndroid Build Coastguard Worker const struct nvkmd_pdev_ops *ops;
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker enum nvk_debug debug_flags;
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker struct nv_device_info dev_info;
136*61046927SAndroid Build Coastguard Worker struct nvkmd_info kmd_info;
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker /** Device-wide GPU memory bind alignment
139*61046927SAndroid Build Coastguard Worker *
140*61046927SAndroid Build Coastguard Worker * Individual BOs may have a smaller alignment if, for instance, we know
141*61046927SAndroid Build Coastguard Worker * they are pinned to system ram.
142*61046927SAndroid Build Coastguard Worker */
143*61046927SAndroid Build Coastguard Worker uint32_t bind_align_B;
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker struct {
146*61046927SAndroid Build Coastguard Worker dev_t render_dev;
147*61046927SAndroid Build Coastguard Worker dev_t primary_dev;
148*61046927SAndroid Build Coastguard Worker } drm;
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker const struct vk_sync_type *const *sync_types;
151*61046927SAndroid Build Coastguard Worker };
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker struct nvkmd_dev_ops {
154*61046927SAndroid Build Coastguard Worker void (*destroy)(struct nvkmd_dev *dev);
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker uint64_t (*get_gpu_timestamp)(struct nvkmd_dev *dev);
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker int (*get_drm_fd)(struct nvkmd_dev *dev);
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker VkResult (*alloc_mem)(struct nvkmd_dev *dev,
161*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
162*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
163*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags,
164*61046927SAndroid Build Coastguard Worker struct nvkmd_mem **mem_out);
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Worker VkResult (*alloc_tiled_mem)(struct nvkmd_dev *dev,
167*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
168*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
169*61046927SAndroid Build Coastguard Worker uint8_t pte_kind, uint16_t tile_mode,
170*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags,
171*61046927SAndroid Build Coastguard Worker struct nvkmd_mem **mem_out);
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker VkResult (*import_dma_buf)(struct nvkmd_dev *dev,
174*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
175*61046927SAndroid Build Coastguard Worker int fd, struct nvkmd_mem **mem_out);
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker VkResult (*alloc_va)(struct nvkmd_dev *dev,
178*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
179*61046927SAndroid Build Coastguard Worker enum nvkmd_va_flags flags, uint8_t pte_kind,
180*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
181*61046927SAndroid Build Coastguard Worker uint64_t fixed_addr, struct nvkmd_va **va_out);
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker VkResult (*create_ctx)(struct nvkmd_dev *dev,
184*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
185*61046927SAndroid Build Coastguard Worker enum nvkmd_engines engines,
186*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx **ctx_out);
187*61046927SAndroid Build Coastguard Worker };
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker struct nvkmd_dev {
190*61046927SAndroid Build Coastguard Worker const struct nvkmd_dev_ops *ops;
191*61046927SAndroid Build Coastguard Worker struct nvkmd_pdev *pdev;
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker /* Start and end of the usable VA space. All nvkmd_va objects will be
194*61046927SAndroid Build Coastguard Worker * allocated within this range.
195*61046927SAndroid Build Coastguard Worker */
196*61046927SAndroid Build Coastguard Worker uint64_t va_start, va_end;
197*61046927SAndroid Build Coastguard Worker };
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker struct nvkmd_mem_ops {
200*61046927SAndroid Build Coastguard Worker void (*free)(struct nvkmd_mem *mem);
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker VkResult (*map)(struct nvkmd_mem *mem,
203*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
204*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags flags,
205*61046927SAndroid Build Coastguard Worker void *fixed_addr,
206*61046927SAndroid Build Coastguard Worker void **map_out);
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker void (*unmap)(struct nvkmd_mem *mem,
209*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags flags,
210*61046927SAndroid Build Coastguard Worker void *map);
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker VkResult (*overmap)(struct nvkmd_mem *mem,
213*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
214*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags flags,
215*61046927SAndroid Build Coastguard Worker void *map);
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker VkResult (*export_dma_buf)(struct nvkmd_mem *mem,
218*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
219*61046927SAndroid Build Coastguard Worker int *fd_out);
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker /** Handle to use for NVK_DEBUG_VM logging */
222*61046927SAndroid Build Coastguard Worker uint32_t (*log_handle)(struct nvkmd_mem *mem);
223*61046927SAndroid Build Coastguard Worker };
224*61046927SAndroid Build Coastguard Worker
225*61046927SAndroid Build Coastguard Worker struct nvkmd_mem {
226*61046927SAndroid Build Coastguard Worker const struct nvkmd_mem_ops *ops;
227*61046927SAndroid Build Coastguard Worker struct nvkmd_dev *dev;
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker uint32_t refcnt;
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags;
232*61046927SAndroid Build Coastguard Worker uint32_t bind_align_B;
233*61046927SAndroid Build Coastguard Worker
234*61046927SAndroid Build Coastguard Worker uint64_t size_B;
235*61046927SAndroid Build Coastguard Worker struct nvkmd_va *va;
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker simple_mtx_t map_mutex;
238*61046927SAndroid Build Coastguard Worker uint32_t map_cnt;
239*61046927SAndroid Build Coastguard Worker void *map;
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker void *client_map;
242*61046927SAndroid Build Coastguard Worker };
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker void nvkmd_mem_init(struct nvkmd_dev *dev,
245*61046927SAndroid Build Coastguard Worker struct nvkmd_mem *mem,
246*61046927SAndroid Build Coastguard Worker const struct nvkmd_mem_ops *ops,
247*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags,
248*61046927SAndroid Build Coastguard Worker uint64_t size_B,
249*61046927SAndroid Build Coastguard Worker uint32_t bind_align_B);
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker struct nvkmd_va_ops {
252*61046927SAndroid Build Coastguard Worker void (*free)(struct nvkmd_va *va);
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker VkResult (*bind_mem)(struct nvkmd_va *va,
255*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
256*61046927SAndroid Build Coastguard Worker uint64_t va_offset_B,
257*61046927SAndroid Build Coastguard Worker struct nvkmd_mem *mem,
258*61046927SAndroid Build Coastguard Worker uint64_t mem_offset_B,
259*61046927SAndroid Build Coastguard Worker uint64_t range_B);
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker VkResult (*unbind)(struct nvkmd_va *va,
262*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
263*61046927SAndroid Build Coastguard Worker uint64_t va_offset_B,
264*61046927SAndroid Build Coastguard Worker uint64_t range_B);
265*61046927SAndroid Build Coastguard Worker };
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker struct nvkmd_va {
268*61046927SAndroid Build Coastguard Worker const struct nvkmd_va_ops *ops;
269*61046927SAndroid Build Coastguard Worker struct nvkmd_dev *dev;
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker enum nvkmd_va_flags flags;
272*61046927SAndroid Build Coastguard Worker uint8_t pte_kind;
273*61046927SAndroid Build Coastguard Worker uint64_t addr;
274*61046927SAndroid Build Coastguard Worker uint64_t size_B;
275*61046927SAndroid Build Coastguard Worker };
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx_exec {
278*61046927SAndroid Build Coastguard Worker uint64_t addr;
279*61046927SAndroid Build Coastguard Worker uint32_t size_B;
280*61046927SAndroid Build Coastguard Worker bool no_prefetch;
281*61046927SAndroid Build Coastguard Worker };
282*61046927SAndroid Build Coastguard Worker
283*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx_bind {
284*61046927SAndroid Build Coastguard Worker enum nvkmd_bind_op op;
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker struct nvkmd_va *va;
287*61046927SAndroid Build Coastguard Worker uint64_t va_offset_B;
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker /* Ignored if op != NVK_BIND_OP_UNBIND */
290*61046927SAndroid Build Coastguard Worker struct nvkmd_mem *mem;
291*61046927SAndroid Build Coastguard Worker uint64_t mem_offset_B;
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker uint64_t range_B;
294*61046927SAndroid Build Coastguard Worker };
295*61046927SAndroid Build Coastguard Worker
296*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx_ops {
297*61046927SAndroid Build Coastguard Worker void (*destroy)(struct nvkmd_ctx *ctx);
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker VkResult (*wait)(struct nvkmd_ctx *ctx,
300*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
301*61046927SAndroid Build Coastguard Worker uint32_t wait_count,
302*61046927SAndroid Build Coastguard Worker const struct vk_sync_wait *waits);
303*61046927SAndroid Build Coastguard Worker
304*61046927SAndroid Build Coastguard Worker VkResult (*exec)(struct nvkmd_ctx *ctx,
305*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
306*61046927SAndroid Build Coastguard Worker uint32_t exec_count,
307*61046927SAndroid Build Coastguard Worker const struct nvkmd_ctx_exec *execs);
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker VkResult (*bind)(struct nvkmd_ctx *ctx,
310*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
311*61046927SAndroid Build Coastguard Worker uint32_t bind_count,
312*61046927SAndroid Build Coastguard Worker const struct nvkmd_ctx_bind *binds);
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker /* Implies flush() */
315*61046927SAndroid Build Coastguard Worker VkResult (*signal)(struct nvkmd_ctx *ctx,
316*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
317*61046927SAndroid Build Coastguard Worker uint32_t signal_count,
318*61046927SAndroid Build Coastguard Worker const struct vk_sync_signal *signals);
319*61046927SAndroid Build Coastguard Worker
320*61046927SAndroid Build Coastguard Worker VkResult (*flush)(struct nvkmd_ctx *ctx,
321*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj);
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker /* Implies flush() */
324*61046927SAndroid Build Coastguard Worker VkResult (*sync)(struct nvkmd_ctx *ctx,
325*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj);
326*61046927SAndroid Build Coastguard Worker };
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx {
329*61046927SAndroid Build Coastguard Worker const struct nvkmd_ctx_ops *ops;
330*61046927SAndroid Build Coastguard Worker struct nvkmd_dev *dev;
331*61046927SAndroid Build Coastguard Worker };
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker /*
334*61046927SAndroid Build Coastguard Worker * Macros
335*61046927SAndroid Build Coastguard Worker *
336*61046927SAndroid Build Coastguard Worker * All subclassed structs must be named nvkmd_<subcls>_<strct> where the
337*61046927SAndroid Build Coastguard Worker * original struct is named nvkmd_<strct>
338*61046927SAndroid Build Coastguard Worker */
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker #define NVKMD_DECL_SUBCLASS(strct, subcls) \
341*61046927SAndroid Build Coastguard Worker extern const struct nvkmd_##strct##_ops nvkmd_##subcls##_##strct##_ops; \
342*61046927SAndroid Build Coastguard Worker static inline struct nvkmd_##subcls##_##strct * \
343*61046927SAndroid Build Coastguard Worker nvkmd_##subcls##_##strct(struct nvkmd_##strct *nvkmd) \
344*61046927SAndroid Build Coastguard Worker { \
345*61046927SAndroid Build Coastguard Worker assert(nvkmd->ops == &nvkmd_##subcls##_##strct##_ops); \
346*61046927SAndroid Build Coastguard Worker return container_of(nvkmd, struct nvkmd_##subcls##_##strct, base); \
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker /*
350*61046927SAndroid Build Coastguard Worker * Methods
351*61046927SAndroid Build Coastguard Worker *
352*61046927SAndroid Build Coastguard Worker * Even though everything goes through a function pointer table, we always add
353*61046927SAndroid Build Coastguard Worker * an inline wrapper in case we want to move something into "core" NVKMD.
354*61046927SAndroid Build Coastguard Worker */
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
357*61046927SAndroid Build Coastguard Worker nvkmd_try_create_pdev_for_drm(struct _drmDevice *drm_device,
358*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
359*61046927SAndroid Build Coastguard Worker enum nvk_debug debug_flags,
360*61046927SAndroid Build Coastguard Worker struct nvkmd_pdev **pdev_out);
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker static inline void
nvkmd_pdev_destroy(struct nvkmd_pdev * pdev)363*61046927SAndroid Build Coastguard Worker nvkmd_pdev_destroy(struct nvkmd_pdev *pdev)
364*61046927SAndroid Build Coastguard Worker {
365*61046927SAndroid Build Coastguard Worker pdev->ops->destroy(pdev);
366*61046927SAndroid Build Coastguard Worker }
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker static inline uint64_t
nvkmd_pdev_get_vram_used(struct nvkmd_pdev * pdev)369*61046927SAndroid Build Coastguard Worker nvkmd_pdev_get_vram_used(struct nvkmd_pdev *pdev)
370*61046927SAndroid Build Coastguard Worker {
371*61046927SAndroid Build Coastguard Worker return pdev->ops->get_vram_used(pdev);
372*61046927SAndroid Build Coastguard Worker }
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker static inline int
nvkmd_pdev_get_drm_primary_fd(struct nvkmd_pdev * pdev)375*61046927SAndroid Build Coastguard Worker nvkmd_pdev_get_drm_primary_fd(struct nvkmd_pdev *pdev)
376*61046927SAndroid Build Coastguard Worker {
377*61046927SAndroid Build Coastguard Worker if (pdev->ops->get_drm_primary_fd == NULL)
378*61046927SAndroid Build Coastguard Worker return -1;
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker return pdev->ops->get_drm_primary_fd(pdev);
381*61046927SAndroid Build Coastguard Worker }
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_pdev_create_dev(struct nvkmd_pdev * pdev,struct vk_object_base * log_obj,struct nvkmd_dev ** dev_out)384*61046927SAndroid Build Coastguard Worker nvkmd_pdev_create_dev(struct nvkmd_pdev *pdev,
385*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
386*61046927SAndroid Build Coastguard Worker struct nvkmd_dev **dev_out)
387*61046927SAndroid Build Coastguard Worker {
388*61046927SAndroid Build Coastguard Worker return pdev->ops->create_dev(pdev, log_obj, dev_out);
389*61046927SAndroid Build Coastguard Worker }
390*61046927SAndroid Build Coastguard Worker
391*61046927SAndroid Build Coastguard Worker static inline void
nvkmd_dev_destroy(struct nvkmd_dev * dev)392*61046927SAndroid Build Coastguard Worker nvkmd_dev_destroy(struct nvkmd_dev *dev)
393*61046927SAndroid Build Coastguard Worker {
394*61046927SAndroid Build Coastguard Worker dev->ops->destroy(dev);
395*61046927SAndroid Build Coastguard Worker }
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker static inline uint64_t
nvkmd_dev_get_gpu_timestamp(struct nvkmd_dev * dev)398*61046927SAndroid Build Coastguard Worker nvkmd_dev_get_gpu_timestamp(struct nvkmd_dev *dev)
399*61046927SAndroid Build Coastguard Worker {
400*61046927SAndroid Build Coastguard Worker return dev->ops->get_gpu_timestamp(dev);
401*61046927SAndroid Build Coastguard Worker }
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker static inline int
nvkmd_dev_get_drm_fd(struct nvkmd_dev * dev)404*61046927SAndroid Build Coastguard Worker nvkmd_dev_get_drm_fd(struct nvkmd_dev *dev)
405*61046927SAndroid Build Coastguard Worker {
406*61046927SAndroid Build Coastguard Worker if (dev->ops->get_drm_fd == NULL)
407*61046927SAndroid Build Coastguard Worker return -1;
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker return dev->ops->get_drm_fd(dev);
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_dev_alloc_mem(struct nvkmd_dev * dev,struct vk_object_base * log_obj,uint64_t size_B,uint64_t align_B,enum nvkmd_mem_flags flags,struct nvkmd_mem ** mem_out)413*61046927SAndroid Build Coastguard Worker nvkmd_dev_alloc_mem(struct nvkmd_dev *dev,
414*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
415*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
416*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags,
417*61046927SAndroid Build Coastguard Worker struct nvkmd_mem **mem_out)
418*61046927SAndroid Build Coastguard Worker {
419*61046927SAndroid Build Coastguard Worker return dev->ops->alloc_mem(dev, log_obj, size_B, align_B, flags, mem_out);
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_dev_alloc_tiled_mem(struct nvkmd_dev * dev,struct vk_object_base * log_obj,uint64_t size_B,uint64_t align_B,uint8_t pte_kind,uint16_t tile_mode,enum nvkmd_mem_flags flags,struct nvkmd_mem ** mem_out)423*61046927SAndroid Build Coastguard Worker nvkmd_dev_alloc_tiled_mem(struct nvkmd_dev *dev,
424*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
425*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
426*61046927SAndroid Build Coastguard Worker uint8_t pte_kind, uint16_t tile_mode,
427*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags,
428*61046927SAndroid Build Coastguard Worker struct nvkmd_mem **mem_out)
429*61046927SAndroid Build Coastguard Worker {
430*61046927SAndroid Build Coastguard Worker return dev->ops->alloc_tiled_mem(dev, log_obj, size_B, align_B,
431*61046927SAndroid Build Coastguard Worker pte_kind, tile_mode, flags, mem_out);
432*61046927SAndroid Build Coastguard Worker }
433*61046927SAndroid Build Coastguard Worker
434*61046927SAndroid Build Coastguard Worker /* Implies NVKMD_MEM_CAN_MAP */
435*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
436*61046927SAndroid Build Coastguard Worker nvkmd_dev_alloc_mapped_mem(struct nvkmd_dev *dev,
437*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
438*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
439*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_flags flags,
440*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags map_flags,
441*61046927SAndroid Build Coastguard Worker struct nvkmd_mem **mem_out);
442*61046927SAndroid Build Coastguard Worker
443*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_dev_import_dma_buf(struct nvkmd_dev * dev,struct vk_object_base * log_obj,int fd,struct nvkmd_mem ** mem_out)444*61046927SAndroid Build Coastguard Worker nvkmd_dev_import_dma_buf(struct nvkmd_dev *dev,
445*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
446*61046927SAndroid Build Coastguard Worker int fd, struct nvkmd_mem **mem_out)
447*61046927SAndroid Build Coastguard Worker {
448*61046927SAndroid Build Coastguard Worker return dev->ops->import_dma_buf(dev, log_obj, fd, mem_out);
449*61046927SAndroid Build Coastguard Worker }
450*61046927SAndroid Build Coastguard Worker
451*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
452*61046927SAndroid Build Coastguard Worker nvkmd_dev_alloc_va(struct nvkmd_dev *dev,
453*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
454*61046927SAndroid Build Coastguard Worker enum nvkmd_va_flags flags, uint8_t pte_kind,
455*61046927SAndroid Build Coastguard Worker uint64_t size_B, uint64_t align_B,
456*61046927SAndroid Build Coastguard Worker uint64_t fixed_addr, struct nvkmd_va **va_out);
457*61046927SAndroid Build Coastguard Worker
458*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_dev_create_ctx(struct nvkmd_dev * dev,struct vk_object_base * log_obj,enum nvkmd_engines engines,struct nvkmd_ctx ** ctx_out)459*61046927SAndroid Build Coastguard Worker nvkmd_dev_create_ctx(struct nvkmd_dev *dev,
460*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
461*61046927SAndroid Build Coastguard Worker enum nvkmd_engines engines,
462*61046927SAndroid Build Coastguard Worker struct nvkmd_ctx **ctx_out)
463*61046927SAndroid Build Coastguard Worker {
464*61046927SAndroid Build Coastguard Worker return dev->ops->create_ctx(dev, log_obj, engines, ctx_out);
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker static inline struct nvkmd_mem *
nvkmd_mem_ref(struct nvkmd_mem * mem)468*61046927SAndroid Build Coastguard Worker nvkmd_mem_ref(struct nvkmd_mem *mem)
469*61046927SAndroid Build Coastguard Worker {
470*61046927SAndroid Build Coastguard Worker p_atomic_inc(&mem->refcnt);
471*61046927SAndroid Build Coastguard Worker return mem;
472*61046927SAndroid Build Coastguard Worker }
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker void nvkmd_mem_unref(struct nvkmd_mem *mem);
475*61046927SAndroid Build Coastguard Worker
476*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
477*61046927SAndroid Build Coastguard Worker nvkmd_mem_map(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
478*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags flags, void *fixed_addr,
479*61046927SAndroid Build Coastguard Worker void **map_out);
480*61046927SAndroid Build Coastguard Worker
481*61046927SAndroid Build Coastguard Worker void nvkmd_mem_unmap(struct nvkmd_mem *mem, enum nvkmd_mem_map_flags flags);
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_mem_overmap(struct nvkmd_mem * mem,struct vk_object_base * log_obj,enum nvkmd_mem_map_flags flags)484*61046927SAndroid Build Coastguard Worker nvkmd_mem_overmap(struct nvkmd_mem *mem, struct vk_object_base *log_obj,
485*61046927SAndroid Build Coastguard Worker enum nvkmd_mem_map_flags flags)
486*61046927SAndroid Build Coastguard Worker {
487*61046927SAndroid Build Coastguard Worker assert(flags & NVKMD_MEM_MAP_CLIENT);
488*61046927SAndroid Build Coastguard Worker assert(mem->client_map != NULL);
489*61046927SAndroid Build Coastguard Worker
490*61046927SAndroid Build Coastguard Worker VkResult result = mem->ops->overmap(mem, log_obj, flags, mem->client_map);
491*61046927SAndroid Build Coastguard Worker if (result == VK_SUCCESS)
492*61046927SAndroid Build Coastguard Worker mem->client_map = NULL;
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Worker return result;
495*61046927SAndroid Build Coastguard Worker }
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_mem_export_dma_buf(struct nvkmd_mem * mem,struct vk_object_base * log_obj,int * fd_out)498*61046927SAndroid Build Coastguard Worker nvkmd_mem_export_dma_buf(struct nvkmd_mem *mem,
499*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
500*61046927SAndroid Build Coastguard Worker int *fd_out)
501*61046927SAndroid Build Coastguard Worker {
502*61046927SAndroid Build Coastguard Worker assert(mem->flags & NVKMD_MEM_SHARED);
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker return mem->ops->export_dma_buf(mem, log_obj, fd_out);
505*61046927SAndroid Build Coastguard Worker }
506*61046927SAndroid Build Coastguard Worker
507*61046927SAndroid Build Coastguard Worker void
508*61046927SAndroid Build Coastguard Worker nvkmd_va_free(struct nvkmd_va *va);
509*61046927SAndroid Build Coastguard Worker
510*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
511*61046927SAndroid Build Coastguard Worker nvkmd_va_bind_mem(struct nvkmd_va *va,
512*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
513*61046927SAndroid Build Coastguard Worker uint64_t va_offset_B,
514*61046927SAndroid Build Coastguard Worker struct nvkmd_mem *mem,
515*61046927SAndroid Build Coastguard Worker uint64_t mem_offset_B,
516*61046927SAndroid Build Coastguard Worker uint64_t range_B);
517*61046927SAndroid Build Coastguard Worker
518*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
519*61046927SAndroid Build Coastguard Worker nvkmd_va_unbind(struct nvkmd_va *va,
520*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
521*61046927SAndroid Build Coastguard Worker uint64_t va_offset_B,
522*61046927SAndroid Build Coastguard Worker uint64_t range_B);
523*61046927SAndroid Build Coastguard Worker
524*61046927SAndroid Build Coastguard Worker static inline void
nvkmd_ctx_destroy(struct nvkmd_ctx * ctx)525*61046927SAndroid Build Coastguard Worker nvkmd_ctx_destroy(struct nvkmd_ctx *ctx)
526*61046927SAndroid Build Coastguard Worker {
527*61046927SAndroid Build Coastguard Worker ctx->ops->destroy(ctx);
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_ctx_wait(struct nvkmd_ctx * ctx,struct vk_object_base * log_obj,uint32_t wait_count,const struct vk_sync_wait * waits)531*61046927SAndroid Build Coastguard Worker nvkmd_ctx_wait(struct nvkmd_ctx *ctx,
532*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
533*61046927SAndroid Build Coastguard Worker uint32_t wait_count,
534*61046927SAndroid Build Coastguard Worker const struct vk_sync_wait *waits)
535*61046927SAndroid Build Coastguard Worker {
536*61046927SAndroid Build Coastguard Worker return ctx->ops->wait(ctx, log_obj, wait_count, waits);
537*61046927SAndroid Build Coastguard Worker }
538*61046927SAndroid Build Coastguard Worker
539*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_ctx_exec(struct nvkmd_ctx * ctx,struct vk_object_base * log_obj,uint32_t exec_count,const struct nvkmd_ctx_exec * execs)540*61046927SAndroid Build Coastguard Worker nvkmd_ctx_exec(struct nvkmd_ctx *ctx,
541*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
542*61046927SAndroid Build Coastguard Worker uint32_t exec_count,
543*61046927SAndroid Build Coastguard Worker const struct nvkmd_ctx_exec *execs)
544*61046927SAndroid Build Coastguard Worker {
545*61046927SAndroid Build Coastguard Worker return ctx->ops->exec(ctx, log_obj, exec_count, execs);
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker
548*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
549*61046927SAndroid Build Coastguard Worker nvkmd_ctx_bind(struct nvkmd_ctx *ctx,
550*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
551*61046927SAndroid Build Coastguard Worker uint32_t bind_count,
552*61046927SAndroid Build Coastguard Worker const struct nvkmd_ctx_bind *binds);
553*61046927SAndroid Build Coastguard Worker
554*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_ctx_signal(struct nvkmd_ctx * ctx,struct vk_object_base * log_obj,uint32_t signal_count,const struct vk_sync_signal * signals)555*61046927SAndroid Build Coastguard Worker nvkmd_ctx_signal(struct nvkmd_ctx *ctx,
556*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj,
557*61046927SAndroid Build Coastguard Worker uint32_t signal_count,
558*61046927SAndroid Build Coastguard Worker const struct vk_sync_signal *signals)
559*61046927SAndroid Build Coastguard Worker {
560*61046927SAndroid Build Coastguard Worker return ctx->ops->signal(ctx, log_obj, signal_count, signals);
561*61046927SAndroid Build Coastguard Worker }
562*61046927SAndroid Build Coastguard Worker
563*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_ctx_flush(struct nvkmd_ctx * ctx,struct vk_object_base * log_obj)564*61046927SAndroid Build Coastguard Worker nvkmd_ctx_flush(struct nvkmd_ctx *ctx,
565*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj)
566*61046927SAndroid Build Coastguard Worker {
567*61046927SAndroid Build Coastguard Worker return ctx->ops->flush(ctx, log_obj);
568*61046927SAndroid Build Coastguard Worker }
569*61046927SAndroid Build Coastguard Worker
570*61046927SAndroid Build Coastguard Worker static inline VkResult MUST_CHECK
nvkmd_ctx_sync(struct nvkmd_ctx * ctx,struct vk_object_base * log_obj)571*61046927SAndroid Build Coastguard Worker nvkmd_ctx_sync(struct nvkmd_ctx *ctx,
572*61046927SAndroid Build Coastguard Worker struct vk_object_base *log_obj)
573*61046927SAndroid Build Coastguard Worker {
574*61046927SAndroid Build Coastguard Worker return ctx->ops->sync(ctx, log_obj);
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker #endif /* NVKMD_H */
578