xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_knl.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * based in part on anv driver which is:
7*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
8*61046927SAndroid Build Coastguard Worker  */
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #ifndef TU_DRM_H
11*61046927SAndroid Build Coastguard Worker #define TU_DRM_H
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "tu_common.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker struct tu_u_trace_syncobj;
16*61046927SAndroid Build Coastguard Worker struct vdrm_bo;
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker enum tu_bo_alloc_flags {
19*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_NO_FLAGS = 0,
20*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_ALLOW_DUMP = 1 << 0,
21*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_GPU_READ_ONLY = 1 << 1,
22*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_REPLAYABLE = 1 << 2,
23*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_INTERNAL_RESOURCE = 1 << 3,
24*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_DMABUF = 1 << 4,
25*61046927SAndroid Build Coastguard Worker    TU_BO_ALLOC_SHAREABLE = 1 << 5,
26*61046927SAndroid Build Coastguard Worker };
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker /* Define tu_timeline_sync type based on drm syncobj for a point type
29*61046927SAndroid Build Coastguard Worker  * for vk_sync_timeline, and the logic to handle is mostly copied from
30*61046927SAndroid Build Coastguard Worker  * anv_bo_sync since it seems it can be used by similar way to anv.
31*61046927SAndroid Build Coastguard Worker  */
32*61046927SAndroid Build Coastguard Worker enum tu_timeline_sync_state {
33*61046927SAndroid Build Coastguard Worker    /** Indicates that this is a new (or newly reset fence) */
34*61046927SAndroid Build Coastguard Worker    TU_TIMELINE_SYNC_STATE_RESET,
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker    /** Indicates that this fence has been submitted to the GPU but is still
37*61046927SAndroid Build Coastguard Worker     * (as far as we know) in use by the GPU.
38*61046927SAndroid Build Coastguard Worker     */
39*61046927SAndroid Build Coastguard Worker    TU_TIMELINE_SYNC_STATE_SUBMITTED,
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker    TU_TIMELINE_SYNC_STATE_SIGNALED,
42*61046927SAndroid Build Coastguard Worker };
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker enum tu_mem_sync_op {
45*61046927SAndroid Build Coastguard Worker    TU_MEM_SYNC_CACHE_TO_GPU,
46*61046927SAndroid Build Coastguard Worker    TU_MEM_SYNC_CACHE_FROM_GPU,
47*61046927SAndroid Build Coastguard Worker };
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker struct tu_bo {
50*61046927SAndroid Build Coastguard Worker    uint32_t gem_handle;
51*61046927SAndroid Build Coastguard Worker #ifdef TU_HAS_VIRTIO
52*61046927SAndroid Build Coastguard Worker    uint32_t res_id;
53*61046927SAndroid Build Coastguard Worker #endif
54*61046927SAndroid Build Coastguard Worker    uint64_t size;
55*61046927SAndroid Build Coastguard Worker    uint64_t iova;
56*61046927SAndroid Build Coastguard Worker    void *map;
57*61046927SAndroid Build Coastguard Worker    const char *name; /* pointer to device->bo_sizes's entry's name */
58*61046927SAndroid Build Coastguard Worker    int32_t refcnt;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    uint32_t bo_list_idx;
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker #ifdef TU_HAS_KGSL
63*61046927SAndroid Build Coastguard Worker    /* We have to store fd returned by ion_fd_data
64*61046927SAndroid Build Coastguard Worker     * in order to be able to mmap this buffer and to
65*61046927SAndroid Build Coastguard Worker     * export file descriptor.
66*61046927SAndroid Build Coastguard Worker     */
67*61046927SAndroid Build Coastguard Worker    int shared_fd;
68*61046927SAndroid Build Coastguard Worker #endif
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker    bool implicit_sync : 1;
71*61046927SAndroid Build Coastguard Worker    bool never_unmap : 1;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    /* Pointer to the vk_object_base associated with the BO
74*61046927SAndroid Build Coastguard Worker     * for the purposes of VK_EXT_device_address_binding_report
75*61046927SAndroid Build Coastguard Worker     */
76*61046927SAndroid Build Coastguard Worker    struct vk_object_base *base;
77*61046927SAndroid Build Coastguard Worker };
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker struct tu_knl {
80*61046927SAndroid Build Coastguard Worker    const char *name;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    VkResult (*device_init)(struct tu_device *dev);
83*61046927SAndroid Build Coastguard Worker    void (*device_finish)(struct tu_device *dev);
84*61046927SAndroid Build Coastguard Worker    int (*device_get_gpu_timestamp)(struct tu_device *dev, uint64_t *ts);
85*61046927SAndroid Build Coastguard Worker    int (*device_get_suspend_count)(struct tu_device *dev, uint64_t *suspend_count);
86*61046927SAndroid Build Coastguard Worker    VkResult (*device_check_status)(struct tu_device *dev);
87*61046927SAndroid Build Coastguard Worker    int (*submitqueue_new)(struct tu_device *dev, int priority, uint32_t *queue_id);
88*61046927SAndroid Build Coastguard Worker    void (*submitqueue_close)(struct tu_device *dev, uint32_t queue_id);
89*61046927SAndroid Build Coastguard Worker    VkResult (*bo_init)(struct tu_device *dev, struct vk_object_base *base,
90*61046927SAndroid Build Coastguard Worker                        struct tu_bo **out_bo, uint64_t size, uint64_t client_iova,
91*61046927SAndroid Build Coastguard Worker                        VkMemoryPropertyFlags mem_property,
92*61046927SAndroid Build Coastguard Worker                        enum tu_bo_alloc_flags flags, const char *name);
93*61046927SAndroid Build Coastguard Worker    VkResult (*bo_init_dmabuf)(struct tu_device *dev, struct tu_bo **out_bo,
94*61046927SAndroid Build Coastguard Worker                               uint64_t size, int prime_fd);
95*61046927SAndroid Build Coastguard Worker    int (*bo_export_dmabuf)(struct tu_device *dev, struct tu_bo *bo);
96*61046927SAndroid Build Coastguard Worker    VkResult (*bo_map)(struct tu_device *dev, struct tu_bo *bo, void *placed_addr);
97*61046927SAndroid Build Coastguard Worker    void (*bo_allow_dump)(struct tu_device *dev, struct tu_bo *bo);
98*61046927SAndroid Build Coastguard Worker    void (*bo_finish)(struct tu_device *dev, struct tu_bo *bo);
99*61046927SAndroid Build Coastguard Worker    void (*bo_set_metadata)(struct tu_device *dev, struct tu_bo *bo,
100*61046927SAndroid Build Coastguard Worker                            void *metadata, uint32_t metadata_size);
101*61046927SAndroid Build Coastguard Worker    int (*bo_get_metadata)(struct tu_device *dev, struct tu_bo *bo,
102*61046927SAndroid Build Coastguard Worker                           void *metadata, uint32_t metadata_size);
103*61046927SAndroid Build Coastguard Worker    VkResult (*device_wait_u_trace)(struct tu_device *dev,
104*61046927SAndroid Build Coastguard Worker                                    struct tu_u_trace_syncobj *syncobj);
105*61046927SAndroid Build Coastguard Worker    VkResult (*queue_submit)(struct tu_queue *queue,
106*61046927SAndroid Build Coastguard Worker                             struct vk_queue_submit *submit);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker    const struct vk_device_entrypoint_table *device_entrypoints;
109*61046927SAndroid Build Coastguard Worker };
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker struct tu_zombie_vma {
112*61046927SAndroid Build Coastguard Worker    int fence;
113*61046927SAndroid Build Coastguard Worker    uint32_t gem_handle;
114*61046927SAndroid Build Coastguard Worker #ifdef TU_HAS_VIRTIO
115*61046927SAndroid Build Coastguard Worker    uint32_t res_id;
116*61046927SAndroid Build Coastguard Worker #endif
117*61046927SAndroid Build Coastguard Worker    uint64_t iova;
118*61046927SAndroid Build Coastguard Worker    uint64_t size;
119*61046927SAndroid Build Coastguard Worker };
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker struct tu_timeline_sync {
122*61046927SAndroid Build Coastguard Worker    struct vk_sync base;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    enum tu_timeline_sync_state state;
125*61046927SAndroid Build Coastguard Worker    uint32_t syncobj;
126*61046927SAndroid Build Coastguard Worker };
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker VkResult
129*61046927SAndroid Build Coastguard Worker tu_bo_init_new_explicit_iova(struct tu_device *dev,
130*61046927SAndroid Build Coastguard Worker                              struct vk_object_base *base,
131*61046927SAndroid Build Coastguard Worker                              struct tu_bo **out_bo,
132*61046927SAndroid Build Coastguard Worker                              uint64_t size,
133*61046927SAndroid Build Coastguard Worker                              uint64_t client_iova,
134*61046927SAndroid Build Coastguard Worker                              VkMemoryPropertyFlags mem_property,
135*61046927SAndroid Build Coastguard Worker                              enum tu_bo_alloc_flags flags,
136*61046927SAndroid Build Coastguard Worker                              const char *name);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker static inline VkResult
tu_bo_init_new(struct tu_device * dev,struct vk_object_base * base,struct tu_bo ** out_bo,uint64_t size,enum tu_bo_alloc_flags flags,const char * name)139*61046927SAndroid Build Coastguard Worker tu_bo_init_new(struct tu_device *dev, struct vk_object_base *base,
140*61046927SAndroid Build Coastguard Worker                struct tu_bo **out_bo, uint64_t size,
141*61046927SAndroid Build Coastguard Worker                enum tu_bo_alloc_flags flags, const char *name)
142*61046927SAndroid Build Coastguard Worker {
143*61046927SAndroid Build Coastguard Worker    // TODO don't mark everything with HOST_VISIBLE !!! Anything that
144*61046927SAndroid Build Coastguard Worker    // never gets CPU access should not have this bit set
145*61046927SAndroid Build Coastguard Worker    return tu_bo_init_new_explicit_iova(
146*61046927SAndroid Build Coastguard Worker       dev, base, out_bo, size, 0,
147*61046927SAndroid Build Coastguard Worker       VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
148*61046927SAndroid Build Coastguard Worker          VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
149*61046927SAndroid Build Coastguard Worker          VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
150*61046927SAndroid Build Coastguard Worker       flags, name);
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker VkResult
154*61046927SAndroid Build Coastguard Worker tu_bo_init_dmabuf(struct tu_device *dev,
155*61046927SAndroid Build Coastguard Worker                   struct tu_bo **bo,
156*61046927SAndroid Build Coastguard Worker                   uint64_t size,
157*61046927SAndroid Build Coastguard Worker                   int fd);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker int
160*61046927SAndroid Build Coastguard Worker tu_bo_export_dmabuf(struct tu_device *dev, struct tu_bo *bo);
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker void
163*61046927SAndroid Build Coastguard Worker tu_bo_finish(struct tu_device *dev, struct tu_bo *bo);
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker VkResult
166*61046927SAndroid Build Coastguard Worker tu_bo_map(struct tu_device *dev, struct tu_bo *bo, void *placed_addr);
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker VkResult
169*61046927SAndroid Build Coastguard Worker tu_bo_unmap(struct tu_device *dev, struct tu_bo *bo, bool reserve);
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker void
172*61046927SAndroid Build Coastguard Worker tu_bo_sync_cache(struct tu_device *dev,
173*61046927SAndroid Build Coastguard Worker                  struct tu_bo *bo,
174*61046927SAndroid Build Coastguard Worker                  VkDeviceSize offset,
175*61046927SAndroid Build Coastguard Worker                  VkDeviceSize size,
176*61046927SAndroid Build Coastguard Worker                  enum tu_mem_sync_op op);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker uint32_t tu_get_l1_dcache_size();
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker void tu_bo_allow_dump(struct tu_device *dev, struct tu_bo *bo);
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker void tu_bo_set_metadata(struct tu_device *dev, struct tu_bo *bo,
183*61046927SAndroid Build Coastguard Worker                         void *metadata, uint32_t metadata_size);
184*61046927SAndroid Build Coastguard Worker int tu_bo_get_metadata(struct tu_device *dev, struct tu_bo *bo,
185*61046927SAndroid Build Coastguard Worker                        void *metadata, uint32_t metadata_size);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker static inline struct tu_bo *
tu_bo_get_ref(struct tu_bo * bo)188*61046927SAndroid Build Coastguard Worker tu_bo_get_ref(struct tu_bo *bo)
189*61046927SAndroid Build Coastguard Worker {
190*61046927SAndroid Build Coastguard Worker    p_atomic_inc(&bo->refcnt);
191*61046927SAndroid Build Coastguard Worker    return bo;
192*61046927SAndroid Build Coastguard Worker }
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker VkResult tu_knl_kgsl_load(struct tu_instance *instance, int fd);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker struct _drmVersion;
197*61046927SAndroid Build Coastguard Worker VkResult tu_knl_drm_msm_load(struct tu_instance *instance,
198*61046927SAndroid Build Coastguard Worker                              int fd, struct _drmVersion *version,
199*61046927SAndroid Build Coastguard Worker                              struct tu_physical_device **out);
200*61046927SAndroid Build Coastguard Worker VkResult tu_knl_drm_virtio_load(struct tu_instance *instance,
201*61046927SAndroid Build Coastguard Worker                                 int fd, struct _drmVersion *version,
202*61046927SAndroid Build Coastguard Worker                                 struct tu_physical_device **out);
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker VkResult
205*61046927SAndroid Build Coastguard Worker tu_enumerate_devices(struct vk_instance *vk_instance);
206*61046927SAndroid Build Coastguard Worker VkResult
207*61046927SAndroid Build Coastguard Worker tu_physical_device_try_create(struct vk_instance *vk_instance,
208*61046927SAndroid Build Coastguard Worker                               struct _drmDevice *drm_device,
209*61046927SAndroid Build Coastguard Worker                               struct vk_physical_device **out);
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker VkResult
212*61046927SAndroid Build Coastguard Worker tu_drm_device_init(struct tu_device *dev);
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker void
215*61046927SAndroid Build Coastguard Worker tu_drm_device_finish(struct tu_device *dev);
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker int
218*61046927SAndroid Build Coastguard Worker tu_device_get_gpu_timestamp(struct tu_device *dev,
219*61046927SAndroid Build Coastguard Worker                             uint64_t *ts);
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker int
222*61046927SAndroid Build Coastguard Worker tu_device_get_suspend_count(struct tu_device *dev,
223*61046927SAndroid Build Coastguard Worker                             uint64_t *suspend_count);
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker VkResult
226*61046927SAndroid Build Coastguard Worker tu_device_wait_u_trace(struct tu_device *dev, struct tu_u_trace_syncobj *syncobj);
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker VkResult
229*61046927SAndroid Build Coastguard Worker tu_device_check_status(struct vk_device *vk_device);
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker int
232*61046927SAndroid Build Coastguard Worker tu_drm_submitqueue_new(struct tu_device *dev,
233*61046927SAndroid Build Coastguard Worker                        int priority,
234*61046927SAndroid Build Coastguard Worker                        uint32_t *queue_id);
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker void
237*61046927SAndroid Build Coastguard Worker tu_drm_submitqueue_close(struct tu_device *dev, uint32_t queue_id);
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker VkResult
240*61046927SAndroid Build Coastguard Worker tu_queue_submit(struct vk_queue *vk_queue, struct vk_queue_submit *submit);
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker #endif /* TU_DRM_H */
243