xref: /aosp_15_r20/external/mesa3d/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2022 Imagination Technologies Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
24 #ifndef PVR_SRV_BRIDGE_H
25 #define PVR_SRV_BRIDGE_H
26 
27 #include <stdbool.h>
28 #include <stdint.h>
29 
30 #include "pvr_private.h"
31 #include "pvr_srv.h"
32 #include "pvr_types.h"
33 #include "util/macros.h"
34 
35 /******************************************************************************
36    Services bridges
37  ******************************************************************************/
38 
39 #define PVR_SRV_BRIDGE_SRVCORE 1UL
40 
41 #define PVR_SRV_BRIDGE_SRVCORE_CONNECT 0UL
42 #define PVR_SRV_BRIDGE_SRVCORE_DISCONNECT 1UL
43 #define PVR_SRV_BRIDGE_SRVCORE_GETMULTICOREINFO 12U
44 
45 #define PVR_SRV_BRIDGE_SYNC 2UL
46 
47 #define PVR_SRV_BRIDGE_SYNC_ALLOCSYNCPRIMITIVEBLOCK 0UL
48 #define PVR_SRV_BRIDGE_SYNC_FREESYNCPRIMITIVEBLOCK 1UL
49 #define PVR_SRV_BRIDGE_SYNC_SYNCPRIMSET 2UL
50 
51 #define PVR_SRV_BRIDGE_MM 6UL
52 
53 #define PVR_SRV_BRIDGE_MM_PMRUNREFUNLOCKPMR 8UL
54 #define PVR_SRV_BRIDGE_MM_PHYSMEMNEWRAMBACKEDLOCKEDPMR 10UL
55 #define PVR_SRV_BRIDGE_MM_DEVMEMINTCTXCREATE 15UL
56 #define PVR_SRV_BRIDGE_MM_DEVMEMINTCTXDESTROY 16UL
57 #define PVR_SRV_BRIDGE_MM_DEVMEMINTHEAPCREATE 17UL
58 #define PVR_SRV_BRIDGE_MM_DEVMEMINTHEAPDESTROY 18UL
59 #define PVR_SRV_BRIDGE_MM_DEVMEMINTMAPPMR 19UL
60 #define PVR_SRV_BRIDGE_MM_DEVMEMINTUNMAPPMR 20UL
61 #define PVR_SRV_BRIDGE_MM_DEVMEMINTRESERVERANGE 21UL
62 #define PVR_SRV_BRIDGE_MM_DEVMEMINTUNRESERVERANGE 22UL
63 #define PVR_SRV_BRIDGE_MM_DEVMEMINTMAPPAGES 24UL
64 #define PVR_SRV_BRIDGE_MM_DEVMEMINTUNMAPPAGES 25UL
65 #define PVR_SRV_BRIDGE_MM_HEAPCFGHEAPCOUNT 30UL
66 #define PVR_SRV_BRIDGE_MM_HEAPCFGHEAPDETAILS 32UL
67 
68 #define PVR_SRV_BRIDGE_DMABUF 11UL
69 
70 #define PVR_SRV_BRIDGE_DMABUF_PHYSMEMIMPORTDMABUF 0UL
71 #define PVR_SRV_BRIDGE_DMABUF_PHYSMEMEXPORTDMABUF 2UL
72 
73 #define PVR_SRV_BRIDGE_RGXTQ 128UL
74 
75 #define PVR_SRV_BRIDGE_RGXTQ_RGXCREATETRANSFERCONTEXT 0UL
76 #define PVR_SRV_BRIDGE_RGXTQ_RGXDESTROYTRANSFERCONTEXT 1UL
77 #define PVR_SRV_BRIDGE_RGXTQ_RGXSUBMITTRANSFER2 3UL
78 
79 #define PVR_SRV_BRIDGE_RGXCMP 129UL
80 
81 #define PVR_SRV_BRIDGE_RGXCMP_RGXCREATECOMPUTECONTEXT 0UL
82 #define PVR_SRV_BRIDGE_RGXCMP_RGXDESTROYCOMPUTECONTEXT 1UL
83 #define PVR_SRV_BRIDGE_RGXCMP_RGXKICKCDM2 5UL
84 
85 #define PVR_SRV_BRIDGE_RGXTA3D 130UL
86 
87 #define PVR_SRV_BRIDGE_RGXTA3D_RGXCREATEHWRTDATASET 0UL
88 #define PVR_SRV_BRIDGE_RGXTA3D_RGXDESTROYHWRTDATASET 1UL
89 #define PVR_SRV_BRIDGE_RGXTA3D_RGXCREATEFREELIST 6UL
90 #define PVR_SRV_BRIDGE_RGXTA3D_RGXDESTROYFREELIST 7UL
91 #define PVR_SRV_BRIDGE_RGXTA3D_RGXCREATERENDERCONTEXT 8UL
92 #define PVR_SRV_BRIDGE_RGXTA3D_RGXDESTROYRENDERCONTEXT 9UL
93 #define PVR_SRV_BRIDGE_RGXTA3D_RGXKICKTA3D2 12UL
94 
95 /******************************************************************************
96    DRM Services specific defines
97  ******************************************************************************/
98 /* DRM command numbers, relative to DRM_COMMAND_BASE.
99  * These defines must be prefixed with "DRM_".
100  */
101 #define DRM_SRVKM_CMD 0U /* PVR Services command. */
102 
103 /* PVR Sync commands */
104 #define DRM_SRVKM_SYNC_FORCE_SW_ONLY_CMD 2U
105 
106 /* PVR Software Sync commands */
107 #define DRM_SRVKM_SW_SYNC_CREATE_FENCE_CMD 3U
108 #define DRM_SRVKM_SW_SYNC_INC_CMD 4U
109 
110 /* PVR Services Render Device Init command */
111 #define DRM_SRVKM_INIT 5U /* PVR Services Render Device Init command. */
112 
113 /* These defines must be prefixed with "DRM_IOCTL_". */
114 #define DRM_IOCTL_SRVKM_CMD \
115    DRM_IOWR(DRM_COMMAND_BASE + DRM_SRVKM_CMD, struct drm_srvkm_cmd)
116 #define DRM_IOCTL_SRVKM_SYNC_FORCE_SW_ONLY_CMD \
117    DRM_IO(DRM_COMMAND_BASE + DRM_SRVKM_SYNC_FORCE_SW_ONLY_CMD)
118 #define DRM_IOCTL_SRVKM_SW_SYNC_CREATE_FENCE_CMD                   \
119    DRM_IOWR(DRM_COMMAND_BASE + DRM_SRVKM_SW_SYNC_CREATE_FENCE_CMD, \
120             struct drm_srvkm_sw_sync_create_fence_data)
121 #define DRM_IOCTL_SRVKM_SW_SYNC_INC_CMD                  \
122    DRM_IOR(DRM_COMMAND_BASE + DRM_SRVKM_SW_SYNC_INC_CMD, \
123            struct drm_srvkm_sw_timeline_advance_data)
124 #define DRM_IOCTL_SRVKM_INIT \
125    DRM_IOWR(DRM_COMMAND_BASE + DRM_SRVKM_INIT, struct drm_srvkm_init_data)
126 
127 /******************************************************************************
128    Misc defines
129  ******************************************************************************/
130 
131 #define SUPPORT_RGX_SET_OFFSET BITFIELD_BIT(4U)
132 #define DEBUG_SET_OFFSET BITFIELD_BIT(10U)
133 #define SUPPORT_BUFFER_SYNC_SET_OFFSET BITFIELD_BIT(11U)
134 #define OPTIONS_BIT31 BITFIELD_BIT(31U)
135 
136 #define RGX_BUILD_OPTIONS                       \
137    (SUPPORT_RGX_SET_OFFSET | DEBUG_SET_OFFSET | \
138     SUPPORT_BUFFER_SYNC_SET_OFFSET | OPTIONS_BIT31)
139 
140 #define PVR_SRV_VERSION_MAJ 1U
141 #define PVR_SRV_VERSION_MIN 17U
142 
143 #define PVR_SRV_VERSION                                            \
144    (((uint32_t)((uint32_t)(PVR_SRV_VERSION_MAJ)&0xFFFFU) << 16U) | \
145     (((PVR_SRV_VERSION_MIN)&0xFFFFU) << 0U))
146 
147 #define PVR_SRV_VERSION_BUILD 6256262
148 
149 /*! This flags gets set if the client is 64 Bit compatible. */
150 #define PVR_SRV_FLAGS_CLIENT_64BIT_COMPAT BITFIELD_BIT(5U)
151 
152 #define DEVMEM_ANNOTATION_MAX_LEN 64U
153 
154 #define PVR_SRV_SYNC_MAX 12U
155 
156 #define PVR_BUFFER_FLAG_READ BITFIELD_BIT(0U)
157 #define PVR_BUFFER_FLAG_WRITE BITFIELD_BIT(1U)
158 
159 /* clang-format off */
160 #define PVR_U8888_TO_U32(v1, v2, v3, v4)                                \
161    (((v1) & 0xFFU) | (((v2) & 0xFFU) << 8U) | (((v3) & 0xFFU) << 16U) | \
162     (((v4) & 0xFFU) << 24U))
163 /* clang-format on */
164 
165 /******************************************************************************
166    Services Boolean
167  ******************************************************************************/
168 
169 enum pvr_srv_bool {
170    PVR_SRV_FALSE = 0,
171    PVR_SRV_TRUE = 1,
172    PVR_SRV_FORCE_ALIGN = 0x7fffffff
173 };
174 
175 /******************************************************************************
176    Service Error codes
177  ******************************************************************************/
178 
179 enum pvr_srv_error {
180    PVR_SRV_OK,
181    PVR_SRV_ERROR_RETRY = 25,
182    PVR_SRV_ERROR_BRIDGE_CALL_FAILED = 37,
183    PVR_SRV_ERROR_FORCE_I32 = 0x7fffffff
184 };
185 
186 /******************************************************************************
187    PVR_SRV_BRIDGE_SRVCORE_CONNECT structs
188  ******************************************************************************/
189 
190 struct pvr_srv_bridge_connect_cmd {
191    uint32_t build_options;
192    uint32_t DDK_build;
193    uint32_t DDK_version;
194    uint32_t flags;
195 } PACKED;
196 
197 struct pvr_srv_bridge_connect_ret {
198    uint64_t bvnc;
199    enum pvr_srv_error error;
200    uint32_t capability_flags;
201    uint8_t kernel_arch;
202 } PACKED;
203 
204 /******************************************************************************
205    PVR_SRV_BRIDGE_SRVCORE_DISCONNECT struct
206  ******************************************************************************/
207 
208 struct pvr_srv_bridge_disconnect_ret {
209    enum pvr_srv_error error;
210 } PACKED;
211 
212 /******************************************************************************
213    PVR_SRV_BRIDGE_SRVCORE_GETMULTICOREINFO structs
214  ******************************************************************************/
215 
216 struct pvr_srv_bridge_getmulticoreinfo_cmd {
217    uint64_t *caps;
218    uint32_t caps_size;
219 } PACKED;
220 
221 struct pvr_srv_bridge_getmulticoreinfo_ret {
222    uint64_t *caps;
223    enum pvr_srv_error error;
224    uint32_t num_cores;
225 } PACKED;
226 
227 /******************************************************************************
228    PVR_SRV_BRIDGE_SYNC_ALLOCSYNCPRIMITIVEBLOCK struct
229  ******************************************************************************/
230 
231 struct pvr_srv_bridge_alloc_sync_primitive_block_ret {
232    void *handle;
233    void *pmr;
234    enum pvr_srv_error error;
235    uint32_t size;
236    uint32_t addr;
237 } PACKED;
238 
239 /******************************************************************************
240    PVR_SRV_BRIDGE_SYNC_FREESYNCPRIMITIVEBLOCK structs
241  ******************************************************************************/
242 
243 struct pvr_srv_bridge_free_sync_primitive_block_cmd {
244    void *handle;
245 } PACKED;
246 
247 struct pvr_srv_bridge_free_sync_primitive_block_ret {
248    enum pvr_srv_error error;
249 } PACKED;
250 
251 /******************************************************************************
252    PVR_SRV_BRIDGE_SYNC_SYNCPRIMSET structs
253  ******************************************************************************/
254 
255 struct pvr_srv_bridge_sync_prim_set_cmd {
256    void *handle;
257    uint32_t index;
258    uint32_t value;
259 } PACKED;
260 
261 struct pvr_srv_bridge_sync_prim_set_ret {
262    enum pvr_srv_error error;
263 } PACKED;
264 
265 /******************************************************************************
266    PVR_SRV_BRIDGE_MM_DEVMEMINTCTXCREATE structs
267  ******************************************************************************/
268 
269 struct pvr_srv_devmem_int_ctx_create_cmd {
270    uint32_t kernel_memory_ctx;
271 } PACKED;
272 
273 struct pvr_srv_devmem_int_ctx_create_ret {
274    void *server_memctx;
275    void *server_memctx_data;
276    enum pvr_srv_error error;
277    uint32_t cpu_cache_line_size;
278 } PACKED;
279 
280 /******************************************************************************
281    PVR_SRV_BRIDGE_MM_DEVMEMINTCTXDESTROY structs
282  ******************************************************************************/
283 
284 struct pvr_srv_devmem_int_ctx_destroy_cmd {
285    void *server_memctx;
286 } PACKED;
287 
288 struct pvr_srv_devmem_int_ctx_destroy_ret {
289    enum pvr_srv_error error;
290 } PACKED;
291 
292 /******************************************************************************
293    PVR_SRV_BRIDGE_MM_HEAPCFGHEAPCOUNT structs
294  ******************************************************************************/
295 
296 struct pvr_srv_heap_count_cmd {
297    uint32_t heap_config_index;
298 } PACKED;
299 
300 struct pvr_srv_heap_count_ret {
301    enum pvr_srv_error error;
302    uint32_t heap_count;
303 } PACKED;
304 
305 /******************************************************************************
306    PVR_SRV_BRIDGE_MM_HEAPCFGHEAPDETAILS structs
307  ******************************************************************************/
308 
309 struct pvr_srv_heap_cfg_details_cmd {
310    char *buffer;
311    uint32_t heap_config_index;
312    uint32_t heap_index;
313    uint32_t buffer_size;
314 } PACKED;
315 
316 struct pvr_srv_heap_cfg_details_ret {
317    pvr_dev_addr_t base_addr;
318    uint64_t size;
319    uint64_t reserved_size;
320    char *buffer;
321    enum pvr_srv_error error;
322    uint32_t log2_page_size;
323    uint32_t log2_alignment;
324 } PACKED;
325 
326 /******************************************************************************
327    PVR_SRV_BRIDGE_MM_DEVMEMINTHEAPCREATE structs
328  ******************************************************************************/
329 
330 struct pvr_srv_devmem_int_heap_create_cmd {
331    pvr_dev_addr_t base_addr;
332    uint64_t size;
333    void *server_memctx;
334    uint32_t log2_page_size;
335 } PACKED;
336 
337 struct pvr_srv_devmem_int_heap_create_ret {
338    void *server_heap;
339    enum pvr_srv_error error;
340 } PACKED;
341 
342 /******************************************************************************
343    PVR_SRV_BRIDGE_MM_DEVMEMINTHEAPDESTROY structs
344  ******************************************************************************/
345 
346 struct pvr_srv_devmem_int_heap_destroy_cmd {
347    void *server_heap;
348 } PACKED;
349 
350 struct pvr_srv_devmem_int_heap_destroy_ret {
351    enum pvr_srv_error error;
352 } PACKED;
353 
354 /******************************************************************************
355    PVR_SRV_BRIDGE_MM_DEVMEMINTRESERVERANGE structs
356  ******************************************************************************/
357 
358 struct pvr_srv_devmem_int_reserve_range_cmd {
359    pvr_dev_addr_t addr;
360    uint64_t size;
361    void *server_heap;
362 } PACKED;
363 
364 struct pvr_srv_devmem_int_reserve_range_ret {
365    void *reservation;
366    enum pvr_srv_error error;
367 } PACKED;
368 
369 /******************************************************************************
370    PVR_SRV_BRIDGE_MM_DEVMEMINTUNRESERVERANGE structs
371  ******************************************************************************/
372 
373 struct pvr_srv_bridge_in_devmem_int_unreserve_range_cmd {
374    void *reservation;
375 } PACKED;
376 
377 struct pvr_srv_bridge_in_devmem_int_unreserve_range_ret {
378    enum pvr_srv_error error;
379 } PACKED;
380 
381 /******************************************************************************
382    PVR_SRV_BRIDGE_MM_PHYSMEMNEWRAMBACKEDLOCKEDPMR structs
383  ******************************************************************************/
384 
385 struct pvr_srv_physmem_new_ram_backed_locked_pmr_cmd {
386    uint64_t block_size;
387    uint64_t size;
388    uint32_t *mapping_table;
389    const char *annotation;
390    uint32_t annotation_size;
391    uint32_t log2_page_size;
392    uint32_t phy_blocks;
393    uint32_t virt_blocks;
394    uint32_t pdump_flags;
395    uint32_t pid;
396    uint64_t flags;
397 } PACKED;
398 
399 struct pvr_srv_physmem_new_ram_backed_locked_pmr_ret {
400    void *pmr;
401    enum pvr_srv_error error;
402    uint64_t out_flags;
403 } PACKED;
404 
405 /******************************************************************************
406    PVR_SRV_BRIDGE_MM_PMRUNREFUNLOCKPMR structs
407  ******************************************************************************/
408 
409 struct pvr_srv_pmr_unref_unlock_pmr_cmd {
410    void *pmr;
411 } PACKED;
412 
413 struct pvr_srv_pmr_unref_unlock_pmr_ret {
414    enum pvr_srv_error error;
415 } PACKED;
416 
417 /******************************************************************************
418    PVR_SRV_BRIDGE_MM_DEVMEMINTMAPPAGES structs
419  ******************************************************************************/
420 
421 struct pvr_srv_devmem_int_map_pages_cmd {
422    pvr_dev_addr_t addr;
423    void *pmr;
424    void *reservation;
425    uint32_t page_count;
426    uint32_t page_offset;
427    uint64_t flags;
428 } PACKED;
429 
430 struct pvr_srv_devmem_int_map_pages_ret {
431    enum pvr_srv_error error;
432 } PACKED;
433 
434 /******************************************************************************
435    PVR_SRV_BRIDGE_MM_DEVMEMINTUNMAPPAGES structs
436  ******************************************************************************/
437 
438 struct pvr_srv_devmem_int_unmap_pages_cmd {
439    pvr_dev_addr_t dev_addr;
440    void *reservation;
441    uint32_t page_count;
442 } PACKED;
443 
444 struct pvr_srv_devmem_int_unmap_pages_ret {
445    enum pvr_srv_error error;
446 } PACKED;
447 
448 /******************************************************************************
449    PVR_SRV_BRIDGE_MM_DEVMEMINTMAPPMR structs
450  ******************************************************************************/
451 
452 struct pvr_srv_devmem_int_map_pmr_cmd {
453    void *server_heap;
454    void *pmr;
455    void *reservation;
456    uint64_t flags;
457 } PACKED;
458 
459 struct pvr_srv_devmem_int_map_pmr_ret {
460    void *mapping;
461    enum pvr_srv_error error;
462 } PACKED;
463 
464 /******************************************************************************
465    PVR_SRV_BRIDGE_MM_DEVMEMINTUNMAPPMR structs
466  ******************************************************************************/
467 
468 struct pvr_srv_devmem_int_unmap_pmr_cmd {
469    void *mapping;
470 } PACKED;
471 
472 struct pvr_srv_devmem_int_unmap_pmr_ret {
473    enum pvr_srv_error error;
474 } PACKED;
475 
476 /******************************************************************************
477    PVR_SRV_BRIDGE_DMABUF_PHYSMEMIMPORTDMABUF structs
478  ******************************************************************************/
479 
480 struct pvr_srv_phys_mem_import_dmabuf_cmd {
481    const char *name;
482    int buffer_fd;
483    uint32_t name_size;
484    uint64_t flags;
485 } PACKED;
486 
487 struct pvr_srv_phys_mem_import_dmabuf_ret {
488    uint64_t align;
489    uint64_t size;
490    void *pmr;
491    enum pvr_srv_error error;
492 } PACKED;
493 
494 /******************************************************************************
495    PVR_SRV_BRIDGE_DMABUF_PHYSMEMEXPORTDMABUF structs
496  ******************************************************************************/
497 
498 struct pvr_srv_phys_mem_export_dmabuf_cmd {
499    void *pmr;
500 } PACKED;
501 
502 struct pvr_srv_phys_mem_export_dmabuf_ret {
503    enum pvr_srv_error error;
504    int fd;
505 } PACKED;
506 
507 /******************************************************************************
508    PVR_SRV_BRIDGE_RGXTQ_RGXCREATETRANSFERCONTEXT structs
509  ******************************************************************************/
510 
511 struct pvr_srv_rgx_create_transfer_context_cmd {
512    uint64_t robustness_address;
513    void *priv_data;
514    uint8_t *reset_framework_cmd;
515    uint32_t context_flags;
516    uint32_t reset_framework_cmd_size;
517    uint32_t packed_ccb_size_u8888;
518    uint32_t priority;
519 } PACKED;
520 
521 struct pvr_srv_rgx_create_transfer_context_ret {
522    void *cli_pmr_mem;
523    void *transfer_context;
524    void *usc_pmr_mem;
525    enum pvr_srv_error error;
526 } PACKED;
527 
528 /******************************************************************************
529    PVR_SRV_BRIDGE_RGXTQ_RGXDESTROYTRANSFERCONTEXT structs
530  ******************************************************************************/
531 
532 struct pvr_srv_rgx_destroy_transfer_context_cmd {
533    void *transfer_context;
534 } PACKED;
535 
536 struct pvr_srv_rgx_destroy_transfer_context_ret {
537    enum pvr_srv_error error;
538 } PACKED;
539 
540 /******************************************************************************
541    PVR_SRV_BRIDGE_RGXTQ_RGXSUBMITTRANSFER2 structs
542  ******************************************************************************/
543 
544 struct pvr_srv_rgx_submit_transfer2_cmd {
545    void *transfer_context;
546    uint32_t *client_update_count;
547    uint32_t *cmd_size;
548    uint32_t *sync_pmr_flags;
549    uint32_t *tq_prepare_flags;
550    uint32_t **update_sync_offset;
551    uint32_t **update_value;
552    uint8_t **fw_command;
553    char *update_fence_name;
554    void **sync_pmrs;
555    void ***update_ufo_sync_prim_block;
556    int32_t update_timeline_2d;
557    int32_t update_timeline_3d;
558    int32_t check_fence;
559    uint32_t ext_job_ref;
560    uint32_t prepare_count;
561    uint32_t sync_pmr_count;
562 } PACKED;
563 
564 struct pvr_srv_rgx_submit_transfer2_ret {
565    enum pvr_srv_error error;
566    int32_t update_fence_2d;
567    int32_t update_fence_3d;
568 } PACKED;
569 
570 /******************************************************************************
571    PVR_SRV_BRIDGE_RGXCMP_RGXCREATECOMPUTECONTEXT structs
572  ******************************************************************************/
573 
574 struct pvr_srv_rgx_create_compute_context_cmd {
575    uint64_t robustness_address;
576    void *priv_data;
577    uint8_t *reset_framework_cmd;
578    uint8_t *static_compute_context_state;
579    uint32_t context_flags;
580    uint32_t reset_framework_cmd_size;
581    uint32_t max_deadline_ms;
582    uint32_t packed_ccb_size;
583    /* RGX_CONTEXT_PRIORITY_... flags. */
584    uint32_t priority;
585    uint32_t static_compute_context_state_size;
586 } PACKED;
587 
588 struct pvr_srv_rgx_create_compute_context_ret {
589    void *compute_context;
590    enum pvr_srv_error error;
591 } PACKED;
592 
593 /******************************************************************************
594    PVR_SRV_BRIDGE_RGXCMP_RGXDESTROYCOMPUTECONTEXT structs
595  ******************************************************************************/
596 
597 struct pvr_srv_rgx_destroy_compute_context_cmd {
598    void *compute_context;
599 } PACKED;
600 
601 struct pvr_srv_rgx_destroy_compute_context_ret {
602    enum pvr_srv_error error;
603 } PACKED;
604 
605 /******************************************************************************
606    PVR_SRV_BRIDGE_RGXCMP_RGXKICKCDM2 structs
607  ******************************************************************************/
608 
609 struct pvr_srv_rgx_kick_cdm2_cmd {
610    uint64_t max_deadline_us;
611    void *compute_context;
612    uint32_t *client_update_offset;
613    uint32_t *client_update_value;
614    uint32_t *sync_pmr_flags;
615    uint8_t *cdm_cmd;
616    char *update_fence_name;
617    void **client_update_ufo_sync_prim_block;
618    void **sync_pmrs;
619    int32_t check_fence;
620    int32_t update_timeline;
621    uint32_t client_update_count;
622    uint32_t cmd_size;
623    uint32_t ext_job_ref;
624    uint32_t num_work_groups;
625    uint32_t num_work_items;
626    uint32_t pdump_flags;
627    uint32_t sync_pmr_count;
628 } PACKED;
629 
630 struct pvr_srv_rgx_kick_cdm2_ret {
631    enum pvr_srv_error error;
632    int32_t update_fence;
633 } PACKED;
634 
635 /******************************************************************************
636    PVR_SRV_BRIDGE_RGXTA3D_RGXCREATEHWRTDATASET structs
637  ******************************************************************************/
638 
639 struct pvr_srv_rgx_create_hwrt_dataset_cmd {
640    uint64_t flipped_multi_sample_ctl;
641    uint64_t multi_sample_ctl;
642    /* ROGUE_FWIF_NUM_RTDATAS sized array. */
643    const pvr_dev_addr_t *macrotile_array_dev_addrs;
644    /* ROGUE_FWIF_NUM_RTDATAS sized array. */
645    const pvr_dev_addr_t *pm_mlist_dev_addrs;
646    /* ROGUE_FWIF_NUM_GEOMDATAS sized array. */
647    const pvr_dev_addr_t *rtc_dev_addrs;
648    /* ROGUE_FWIF_NUM_RTDATAS sized array. */
649    const pvr_dev_addr_t *rgn_header_dev_addrs;
650    /* ROGUE_FWIF_NUM_GEOMDATAS sized array. */
651    const pvr_dev_addr_t *tail_ptrs_dev_addrs;
652    /* ROGUE_FWIF_NUM_GEOMDATAS sized array. */
653    const pvr_dev_addr_t *vheap_table_dev_adds;
654    /* ROGUE_FWIF_NUM_RTDATAS sized array of handles. */
655    void **hwrt_dataset;
656    /* ROGUE_FW_MAX_FREELISTS size array of handles. */
657    void **free_lists;
658    uint32_t isp_merge_lower_x;
659    uint32_t isp_merge_lower_y;
660    uint32_t isp_merge_scale_x;
661    uint32_t isp_merge_scale_y;
662    uint32_t isp_merge_upper_x;
663    uint32_t isp_merge_upper_y;
664    uint32_t isp_mtile_size;
665    uint32_t mtile_stride;
666    uint32_t ppp_screen;
667    uint32_t rgn_header_size;
668    uint32_t te_aa;
669    uint32_t te_mtile1;
670    uint32_t te_mtile2;
671    uint32_t te_screen;
672    uint32_t tpc_size;
673    uint32_t tpc_stride;
674    uint16_t max_rts;
675 } PACKED;
676 
677 struct pvr_srv_rgx_create_hwrt_dataset_ret {
678    /* ROGUE_FWIF_NUM_RTDATAS sized array of handles. */
679    void **hwrt_dataset;
680    enum pvr_srv_error error;
681 } PACKED;
682 
683 /******************************************************************************
684    PVR_SRV_BRIDGE_RGXTA3D_RGXDESTROYHWRTDATASET structs
685  ******************************************************************************/
686 
687 struct pvr_srv_rgx_destroy_hwrt_dataset_cmd {
688    void *hwrt_dataset;
689 } PACKED;
690 
691 struct pvr_srv_rgx_destroy_hwrt_dataset_ret {
692    enum pvr_srv_error error;
693 } PACKED;
694 
695 /******************************************************************************
696    PVR_SRV_BRIDGE_RGXTA3D_RGXCREATEFREELIST structs
697  ******************************************************************************/
698 
699 struct pvr_srv_rgx_create_free_list_cmd {
700    pvr_dev_addr_t free_list_dev_addr;
701    uint64_t pmr_offset;
702    void *mem_ctx_priv_data;
703    void *free_list_pmr;
704    void *global_free_list;
705    enum pvr_srv_bool free_list_check;
706    uint32_t grow_free_list_pages;
707    uint32_t grow_param_threshold;
708    uint32_t init_free_list_pages;
709    uint32_t max_free_list_pages;
710 } PACKED;
711 
712 struct pvr_srv_rgx_create_free_list_ret {
713    void *cleanup_cookie;
714    enum pvr_srv_error error;
715 } PACKED;
716 
717 /******************************************************************************
718    PVR_SRV_BRIDGE_RGXTA3D_RGXDESTROYFREELIST structs
719  ******************************************************************************/
720 
721 struct pvr_srv_rgx_destroy_free_list_cmd {
722    void *cleanup_cookie;
723 } PACKED;
724 
725 struct pvr_srv_rgx_destroy_free_list_ret {
726    enum pvr_srv_error error;
727 } PACKED;
728 
729 /******************************************************************************
730    PVR_SRV_BRIDGE_RGXTA3D_RGXCREATERENDERCONTEXT structs
731  ******************************************************************************/
732 
733 struct pvr_srv_rgx_create_render_context_cmd {
734    pvr_dev_addr_t vdm_callstack_addr;
735    uint64_t robustness_address;
736    void *priv_data;
737    uint8_t *reset_framework_cmd;
738    uint8_t *static_render_context_state;
739 #define RGX_CONTEXT_FLAG_DISABLESLR BITFIELD_BIT(0U)
740    uint32_t context_flags;
741    uint32_t reset_framework_cmd_size;
742    uint32_t max_3d_deadline_ms;
743    uint32_t max_ta_deadline_ms;
744    uint32_t packed_ccb_size;
745 #define RGX_CONTEXT_PRIORITY_REALTIME UINT32_MAX
746 #define RGX_CONTEXT_PRIORITY_HIGH 2U
747 #define RGX_CONTEXT_PRIORITY_MEDIUM 1U
748 #define RGX_CONTEXT_PRIORITY_LOW 0U
749    uint32_t priority;
750    uint32_t static_render_context_state_size;
751    uint32_t call_stack_depth;
752 } PACKED;
753 
754 struct pvr_srv_rgx_create_render_context_ret {
755    void *render_context;
756    enum pvr_srv_error error;
757 } PACKED;
758 
759 /******************************************************************************
760    PVR_SRV_BRIDGE_RGXTA3D_RGXDESTROYRENDERCONTEXT structs
761  ******************************************************************************/
762 
763 struct pvr_srv_rgx_destroy_render_context_cmd {
764    void *render_context;
765 } PACKED;
766 
767 struct pvr_srv_rgx_destroy_render_context_ret {
768    enum pvr_srv_error error;
769 } PACKED;
770 
771 /******************************************************************************
772    PVR_SRV_BRIDGE_RGXTA3D_RGXKICKTA3D2 structs
773  ******************************************************************************/
774 
775 struct pvr_srv_rgx_kick_ta3d2_cmd {
776    uint64_t deadline;
777    void *hw_rt_dataset;
778    void *msaa_scratch_buffer;
779    void *pr_fence_ufo_sync_prim_block;
780    void *render_ctx;
781    void *zs_buffer;
782    uint32_t *client_3d_update_sync_offset;
783    uint32_t *client_3d_update_value;
784    uint32_t *client_ta_fence_sync_offset;
785    uint32_t *client_ta_fence_value;
786    uint32_t *client_ta_update_sync_offset;
787    uint32_t *client_ta_update_value;
788    uint32_t *sync_pmr_flags;
789    uint8_t *cmd_3d;
790    uint8_t *cmd_3d_pr;
791    uint8_t *cmd_ta;
792    char *update_fence_name;
793    char *update_fence_name_3d;
794    void **client_3d_update_sync_prim_block;
795    void **client_ta_fence_sync_prim_block;
796    void **client_ta_update_sync_prim_block;
797    void **sync_pmrs;
798    enum pvr_srv_bool abort;
799    enum pvr_srv_bool kick_3d;
800    enum pvr_srv_bool kick_pr;
801    enum pvr_srv_bool kick_ta;
802    int32_t check_fence;
803    int32_t check_fence_3d;
804    int32_t update_timeline;
805    int32_t update_timeline_3d;
806    uint32_t cmd_3d_size;
807    uint32_t cmd_3d_pr_size;
808    uint32_t client_3d_update_count;
809    uint32_t client_ta_fence_count;
810    uint32_t client_ta_update_count;
811    uint32_t ext_job_ref;
812    uint32_t num_draw_calls;
813    uint32_t num_indices;
814    uint32_t num_mrts;
815    uint32_t pdump_flags;
816    uint32_t client_pr_fence_ufo_sync_offset;
817    uint32_t client_pr_fence_value;
818    uint32_t render_target_size;
819    uint32_t sync_pmr_count;
820    uint32_t cmd_ta_size;
821 } PACKED;
822 
823 struct pvr_srv_rgx_kick_ta3d2_ret {
824    enum pvr_srv_error error;
825    int32_t update_fence;
826    int32_t update_fence_3d;
827 } PACKED;
828 
829 /******************************************************************************
830    Ioctl structures
831  ******************************************************************************/
832 
833 /* Ioctl to pass cmd and ret structures. */
834 struct drm_srvkm_cmd {
835    uint32_t bridge_id;
836    uint32_t bridge_func_id;
837    uint64_t in_data_ptr;
838    uint64_t out_data_ptr;
839    uint32_t in_data_size;
840    uint32_t out_data_size;
841 };
842 
843 /* Ioctl to initialize a module. */
844 struct drm_srvkm_init_data {
845 #define PVR_SRVKM_SERVICES_INIT 1U
846 #define PVR_SRVKM_SYNC_INIT 2U
847    uint32_t init_module;
848 };
849 
850 struct drm_srvkm_sw_sync_create_fence_data {
851    char name[32];
852    __s32 fence;
853    __u32 pad;
854    __u64 sync_pt_idx;
855 };
856 
857 struct drm_srvkm_sw_timeline_advance_data {
858    __u64 sync_pt_idx;
859 };
860 
861 /******************************************************************************
862    DRM helper enum
863  ******************************************************************************/
864 
865 enum pvr_srvkm_module_type {
866    PVR_SRVKM_MODULE_TYPE_SERVICES = PVR_SRVKM_SERVICES_INIT,
867    PVR_SRVKM_MODULE_TYPE_SYNC = PVR_SRVKM_SYNC_INIT,
868 };
869 
870 /******************************************************************************
871    Ioctl function prototypes
872  ******************************************************************************/
873 
874 VkResult pvr_srv_init_module(int fd, enum pvr_srvkm_module_type module);
875 
876 VkResult pvr_srv_set_timeline_sw_only(int sw_timeline_fd);
877 
878 VkResult pvr_srv_create_sw_fence(int sw_timeline_fd,
879                                  int *new_fence_fd,
880                                  uint64_t *sync_pt_idx);
881 
882 VkResult pvr_srv_sw_sync_timeline_increment(int sw_timeline_fd,
883                                             uint64_t *sync_pt_idx);
884 
885 /******************************************************************************
886    Bridge function prototypes
887  ******************************************************************************/
888 
889 VkResult pvr_srv_connection_create(int fd, uint64_t *const bvnc_out);
890 void pvr_srv_connection_destroy(int fd);
891 
892 VkResult pvr_srv_get_multicore_info(int fd,
893                                     uint32_t caps_size,
894                                     uint64_t *caps,
895                                     uint32_t *num_cores);
896 
897 VkResult pvr_srv_alloc_sync_primitive_block(int fd,
898                                             void **const handle_out,
899                                             void **const pmr_out,
900                                             uint32_t *const size_out,
901                                             uint32_t *const addr_out);
902 void pvr_srv_free_sync_primitive_block(int fd, void *handle);
903 VkResult pvr_srv_set_sync_primitive(int fd,
904                                     void *handle,
905                                     uint32_t index,
906                                     uint32_t value);
907 
908 VkResult pvr_srv_get_heap_count(int fd, uint32_t *const heap_count_out);
909 VkResult pvr_srv_get_heap_details(int fd,
910                                   uint32_t heap_index,
911                                   uint32_t buffer_size,
912                                   char *const buffer_out,
913                                   pvr_dev_addr_t *const base_address_out,
914                                   uint64_t *const size_out,
915                                   uint64_t *const reserved_size_out,
916                                   uint32_t *const log2_page_size_out);
917 
918 VkResult pvr_srv_int_heap_create(int fd,
919                                  pvr_dev_addr_t base_address,
920                                  uint64_t size,
921                                  uint32_t log2_page_size,
922                                  void *server_memctx,
923                                  void **const server_heap_out);
924 void pvr_srv_int_heap_destroy(int fd, void *server_heap);
925 
926 VkResult pvr_srv_int_ctx_create(int fd,
927                                 void **const server_memctx_out,
928                                 void **const server_memctx_data_out);
929 void pvr_srv_int_ctx_destroy(int fd, void *server_memctx);
930 
931 VkResult pvr_srv_int_reserve_addr(int fd,
932                                   void *server_heap,
933                                   pvr_dev_addr_t addr,
934                                   uint64_t size,
935                                   void **const reservation_out);
936 void pvr_srv_int_unreserve_addr(int fd, void *reservation);
937 
938 VkResult pvr_srv_alloc_pmr(int fd,
939                            uint64_t size,
940                            uint64_t block_size,
941                            uint32_t phy_blocks,
942                            uint32_t virt_blocks,
943                            uint32_t log2_page_size,
944                            uint64_t flags,
945                            uint32_t pid,
946                            void **const pmr_out);
947 void pvr_srv_free_pmr(int fd, void *pmr);
948 
949 VkResult pvr_srv_int_map_pages(int fd,
950                                void *reservation,
951                                void *pmr,
952                                uint32_t page_count,
953                                uint32_t page_offset,
954                                uint64_t flags,
955                                pvr_dev_addr_t addr);
956 void pvr_srv_int_unmap_pages(int fd,
957                              void *reservation,
958                              pvr_dev_addr_t dev_addr,
959                              uint32_t page_count);
960 
961 VkResult pvr_srv_int_map_pmr(int fd,
962                              void *server_heap,
963                              void *reservation,
964                              void *pmr,
965                              uint64_t flags,
966                              void **const mapping_out);
967 void pvr_srv_int_unmap_pmr(int fd, void *mapping);
968 
969 VkResult pvr_srv_physmem_import_dmabuf(int fd,
970                                        int buffer_fd,
971                                        uint64_t flags,
972                                        void **const pmr_out,
973                                        uint64_t *const size_out,
974                                        uint64_t *const align_out);
975 VkResult pvr_srv_physmem_export_dmabuf(int fd, void *pmr, int *const fd_out);
976 
977 VkResult
978 pvr_srv_rgx_create_compute_context(int fd,
979                                    uint32_t priority,
980                                    uint32_t reset_framework_cmd_size,
981                                    uint8_t *reset_framework_cmd,
982                                    void *priv_data,
983                                    uint32_t static_compute_context_state_size,
984                                    uint8_t *static_compute_context_state,
985                                    uint32_t packed_ccb_size,
986                                    uint32_t context_flags,
987                                    uint64_t robustness_address,
988                                    uint32_t max_deadline_ms,
989                                    void **const compute_context_out);
990 void pvr_srv_rgx_destroy_compute_context(int fd, void *compute_context);
991 
992 VkResult pvr_srv_rgx_kick_compute2(int fd,
993                                    void *compute_context,
994                                    uint32_t client_update_count,
995                                    void **client_update_ufo_sync_prim_block,
996                                    uint32_t *client_update_offset,
997                                    uint32_t *client_update_value,
998                                    int32_t check_fence,
999                                    int32_t update_timeline,
1000                                    uint32_t cmd_size,
1001                                    uint8_t *cdm_cmd,
1002                                    uint32_t ext_job_ref,
1003                                    uint32_t sync_pmr_count,
1004                                    uint32_t *sync_pmr_flags,
1005                                    void **sync_pmrs,
1006                                    uint32_t num_work_groups,
1007                                    uint32_t num_work_items,
1008                                    uint32_t pdump_flags,
1009                                    uint64_t max_deadline_us,
1010                                    char *update_fence_name,
1011                                    int32_t *const update_fence_out);
1012 
1013 VkResult pvr_srv_rgx_create_transfer_context(int fd,
1014                                              uint32_t priority,
1015                                              uint32_t reset_framework_cmd_size,
1016                                              uint8_t *reset_framework_cmd,
1017                                              void *priv_data,
1018                                              uint32_t packed_ccb_size_u8888,
1019                                              uint32_t context_flags,
1020                                              uint64_t robustness_address,
1021                                              void **const cli_pmr_out,
1022                                              void **const usc_pmr_out,
1023                                              void **const transfer_context_out);
1024 void pvr_srv_rgx_destroy_transfer_context(int fd, void *transfer_context);
1025 VkResult pvr_srv_rgx_submit_transfer2(int fd,
1026                                       void *transfer_context,
1027                                       uint32_t prepare_count,
1028                                       uint32_t *client_update_count,
1029                                       void ***update_ufo_sync_prim_block,
1030                                       uint32_t **update_sync_offset,
1031                                       uint32_t **update_value,
1032                                       int32_t check_fence,
1033                                       int32_t update_timeline_2d,
1034                                       int32_t update_timeline_3d,
1035                                       char *update_fence_name,
1036                                       uint32_t *cmd_size,
1037                                       uint8_t **fw_command,
1038                                       uint32_t *tq_prepare_flags,
1039                                       uint32_t ext_job_ref,
1040                                       uint32_t sync_pmr_count,
1041                                       uint32_t *sync_pmr_flags,
1042                                       void **sync_pmrs,
1043                                       int32_t *update_fence_2d_out,
1044                                       int32_t *update_fence_3d_out);
1045 
1046 VkResult
1047 pvr_srv_rgx_create_hwrt_dataset(int fd,
1048                                 uint64_t flipped_multi_sample_ctl,
1049                                 uint64_t multi_sample_ctl,
1050                                 const pvr_dev_addr_t *macrotile_array_dev_addrs,
1051                                 const pvr_dev_addr_t *pm_mlist_dev_addrs,
1052                                 const pvr_dev_addr_t *rtc_dev_addrs,
1053                                 const pvr_dev_addr_t *rgn_header_dev_addrs,
1054                                 const pvr_dev_addr_t *tail_ptrs_dev_addrs,
1055                                 const pvr_dev_addr_t *vheap_table_dev_adds,
1056                                 void **free_lists,
1057                                 uint32_t isp_merge_lower_x,
1058                                 uint32_t isp_merge_lower_y,
1059                                 uint32_t isp_merge_scale_x,
1060                                 uint32_t isp_merge_scale_y,
1061                                 uint32_t isp_merge_upper_x,
1062                                 uint32_t isp_merge_upper_y,
1063                                 uint32_t isp_mtile_size,
1064                                 uint32_t mtile_stride,
1065                                 uint32_t ppp_screen,
1066                                 uint32_t rgn_header_size,
1067                                 uint32_t te_aa,
1068                                 uint32_t te_mtile1,
1069                                 uint32_t te_mtile2,
1070                                 uint32_t te_screen,
1071                                 uint32_t tpc_size,
1072                                 uint32_t tpc_stride,
1073                                 uint16_t max_rts,
1074                                 void **hwrt_dataset_out);
1075 
1076 void pvr_srv_rgx_destroy_hwrt_dataset(int fd, void *hwrt_dataset);
1077 
1078 VkResult pvr_srv_rgx_create_free_list(int fd,
1079                                       void *mem_ctx_priv_data,
1080                                       uint32_t max_free_list_pages,
1081                                       uint32_t init_free_list_pages,
1082                                       uint32_t grow_free_list_pages,
1083                                       uint32_t grow_param_threshold,
1084                                       void *global_free_list,
1085                                       enum pvr_srv_bool free_list_check,
1086                                       pvr_dev_addr_t free_list_dev_addr,
1087                                       void *free_list_pmr,
1088                                       uint64_t pmr_offset,
1089                                       void **const cleanup_cookie_out);
1090 
1091 void pvr_srv_rgx_destroy_free_list(int fd, void *cleanup_cookie);
1092 
1093 VkResult
1094 pvr_srv_rgx_create_render_context(int fd,
1095                                   uint32_t priority,
1096                                   pvr_dev_addr_t vdm_callstack_addr,
1097                                   uint32_t call_stack_depth,
1098                                   uint32_t reset_framework_cmd_size,
1099                                   uint8_t *reset_framework_cmd,
1100                                   void *priv_data,
1101                                   uint32_t static_render_context_state_size,
1102                                   uint8_t *static_render_context_state,
1103                                   uint32_t packed_ccb_size,
1104                                   uint32_t context_flags,
1105                                   uint64_t robustness_address,
1106                                   uint32_t max_geom_deadline_ms,
1107                                   uint32_t max_frag_deadline_ms,
1108                                   void **const render_context_out);
1109 
1110 void pvr_srv_rgx_destroy_render_context(int fd, void *render_context);
1111 
1112 VkResult pvr_srv_rgx_kick_render2(int fd,
1113                                   void *render_ctx,
1114                                   uint32_t client_geom_fence_count,
1115                                   void **client_geom_fence_sync_prim_block,
1116                                   uint32_t *client_geom_fence_sync_offset,
1117                                   uint32_t *client_geom_fence_value,
1118                                   uint32_t client_geom_update_count,
1119                                   void **client_geom_update_sync_prim_block,
1120                                   uint32_t *client_geom_update_sync_offset,
1121                                   uint32_t *client_geom_update_value,
1122                                   uint32_t client_frag_update_count,
1123                                   void **client_frag_update_sync_prim_block,
1124                                   uint32_t *client_frag_update_sync_offset,
1125                                   uint32_t *client_frag_update_value,
1126                                   void *client_pr_fence_ufo_sync_prim_block,
1127                                   uint32_t client_pr_fence_ufo_sync_offset,
1128                                   uint32_t client_pr_fence_value,
1129                                   int32_t check_fence,
1130                                   int32_t update_timeline,
1131                                   int32_t *const update_fence_out,
1132                                   char *update_fence_name,
1133                                   int32_t check_fence_frag,
1134                                   int32_t update_timeline_frag,
1135                                   int32_t *const update_fence_frag_out,
1136                                   char *update_fence_name_frag,
1137                                   uint32_t cmd_geom_size,
1138                                   uint8_t *cmd_geom,
1139                                   uint32_t cmd_frag_pr_size,
1140                                   uint8_t *cmd_frag_pr,
1141                                   uint32_t cmd_frag_size,
1142                                   uint8_t *cmd_frag,
1143                                   uint32_t ext_job_ref,
1144                                   bool kick_geom,
1145                                   bool kick_pr,
1146                                   bool kick_frag,
1147                                   bool abort,
1148                                   uint32_t pdump_flags,
1149                                   void *hw_rt_dataset,
1150                                   void *zs_buffer,
1151                                   void *msaa_scratch_buffer,
1152                                   uint32_t sync_pmr_count,
1153                                   uint32_t *sync_pmr_flags,
1154                                   void **sync_pmrs,
1155                                   uint32_t render_target_size,
1156                                   uint32_t num_draw_calls,
1157                                   uint32_t num_indices,
1158                                   uint32_t num_mrts,
1159                                   uint64_t deadline);
1160 
1161 #endif /* PVR_SRV_BRIDGE_H */
1162