xref: /aosp_15_r20/external/mesa3d/src/virtio/vdrm/vdrm.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2023 Google, Inc.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker /* A simple helper layer for virtgpu drm native context, which also
7*61046927SAndroid Build Coastguard Worker  * abstracted the differences between vtest (communicating via socket
8*61046927SAndroid Build Coastguard Worker  * with vtest server) vs virtgpu (communicating via drm/virtio driver
9*61046927SAndroid Build Coastguard Worker  * in the guest).
10*61046927SAndroid Build Coastguard Worker  */
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #ifndef __VDRM_H__
13*61046927SAndroid Build Coastguard Worker #define __VDRM_H__
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include <stdint.h>
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker #include "virglrenderer_hw.h"
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
22*61046927SAndroid Build Coastguard Worker extern "C" {
23*61046927SAndroid Build Coastguard Worker #endif
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker struct vdrm_device;
26*61046927SAndroid Build Coastguard Worker struct vdrm_execbuf_params;
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker struct vdrm_device_funcs {
29*61046927SAndroid Build Coastguard Worker    /* Note flush_locked and execbuf_locked are similar, and on top of virtgpu
30*61046927SAndroid Build Coastguard Worker     * guest kernel driver are basically the same.  But with vtest, only cmds
31*61046927SAndroid Build Coastguard Worker     * that result in host kernel cmd submission can take and/or return fence
32*61046927SAndroid Build Coastguard Worker     * and/or syncobj fd's.
33*61046927SAndroid Build Coastguard Worker     */
34*61046927SAndroid Build Coastguard Worker    int (*execbuf_locked)(struct vdrm_device *vdev, struct vdrm_execbuf_params *p,
35*61046927SAndroid Build Coastguard Worker                          void *command, unsigned size);
36*61046927SAndroid Build Coastguard Worker    int (*flush_locked)(struct vdrm_device *vdev, uintptr_t *fencep);
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker    void (*wait_fence)(struct vdrm_device *vdev, uintptr_t fence);
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    uint32_t (*dmabuf_to_handle)(struct vdrm_device *vdev, int fd);
41*61046927SAndroid Build Coastguard Worker    uint32_t (*handle_to_res_id)(struct vdrm_device *vdev, uint32_t handle);
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    uint32_t (*bo_create)(struct vdrm_device *vdev, size_t size, uint32_t blob_flags,
44*61046927SAndroid Build Coastguard Worker                          uint64_t blob_id, struct vdrm_ccmd_req *req);
45*61046927SAndroid Build Coastguard Worker    int (*bo_wait)(struct vdrm_device *vdev, uint32_t handle);
46*61046927SAndroid Build Coastguard Worker    void *(*bo_map)(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr);
47*61046927SAndroid Build Coastguard Worker    int (*bo_export_dmabuf)(struct vdrm_device *vdev, uint32_t handle);
48*61046927SAndroid Build Coastguard Worker    void (*bo_close)(struct vdrm_device *vdev, uint32_t handle);
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    void (*close)(struct vdrm_device *vdev);
51*61046927SAndroid Build Coastguard Worker };
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker struct vdrm_device {
54*61046927SAndroid Build Coastguard Worker    const struct vdrm_device_funcs *funcs;
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    struct virgl_renderer_capset_drm caps;
57*61046927SAndroid Build Coastguard Worker    struct vdrm_shmem *shmem;
58*61046927SAndroid Build Coastguard Worker    uint8_t *rsp_mem;
59*61046927SAndroid Build Coastguard Worker    uint32_t rsp_mem_len;
60*61046927SAndroid Build Coastguard Worker    uint32_t next_rsp_off;
61*61046927SAndroid Build Coastguard Worker    simple_mtx_t rsp_lock;
62*61046927SAndroid Build Coastguard Worker    simple_mtx_t eb_lock;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    uint32_t next_seqno;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    /*
67*61046927SAndroid Build Coastguard Worker     * Buffering for requests to host:
68*61046927SAndroid Build Coastguard Worker     */
69*61046927SAndroid Build Coastguard Worker    uint32_t reqbuf_len;
70*61046927SAndroid Build Coastguard Worker    uint32_t reqbuf_cnt;
71*61046927SAndroid Build Coastguard Worker    uint8_t reqbuf[0x4000];
72*61046927SAndroid Build Coastguard Worker };
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker struct vdrm_device *vdrm_device_connect(int fd, uint32_t context_type);
75*61046927SAndroid Build Coastguard Worker void vdrm_device_close(struct vdrm_device *vdev);
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker void * vdrm_alloc_rsp(struct vdrm_device *vdev, struct vdrm_ccmd_req *req, uint32_t sz);
78*61046927SAndroid Build Coastguard Worker int vdrm_send_req(struct vdrm_device *vdev, struct vdrm_ccmd_req *req, bool sync);
79*61046927SAndroid Build Coastguard Worker int vdrm_flush(struct vdrm_device *vdev);
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker struct vdrm_execbuf_params {
82*61046927SAndroid Build Coastguard Worker    int ring_idx;
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker    struct vdrm_ccmd_req *req;     /* Note, must be host kernel cmd submit */
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    uint32_t *handles;
87*61046927SAndroid Build Coastguard Worker    uint32_t num_handles;
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    struct drm_virtgpu_execbuffer_syncobj *in_syncobjs;
90*61046927SAndroid Build Coastguard Worker    struct drm_virtgpu_execbuffer_syncobj *out_syncobjs;
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    bool has_in_fence_fd : 1;
93*61046927SAndroid Build Coastguard Worker    bool needs_out_fence_fd : 1;
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    int fence_fd;                  /* in/out fence */
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    uint32_t num_in_syncobjs;
98*61046927SAndroid Build Coastguard Worker    uint32_t num_out_syncobjs;
99*61046927SAndroid Build Coastguard Worker };
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker /**
102*61046927SAndroid Build Coastguard Worker  * Note, must be a host cmd submission, which specified in/out fence/syncobj
103*61046927SAndroid Build Coastguard Worker  * can be passed to.  In the vtest case, we can't get fences/syncobjs for
104*61046927SAndroid Build Coastguard Worker  * other host cmds.
105*61046927SAndroid Build Coastguard Worker  */
106*61046927SAndroid Build Coastguard Worker int vdrm_execbuf(struct vdrm_device *vdev, struct vdrm_execbuf_params *p);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker void vdrm_host_sync(struct vdrm_device *vdev, const struct vdrm_ccmd_req *req);
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker /**
111*61046927SAndroid Build Coastguard Worker  * Import dmabuf fd returning a GEM handle
112*61046927SAndroid Build Coastguard Worker  */
113*61046927SAndroid Build Coastguard Worker static inline uint32_t
vdrm_dmabuf_to_handle(struct vdrm_device * vdev,int fd)114*61046927SAndroid Build Coastguard Worker vdrm_dmabuf_to_handle(struct vdrm_device *vdev, int fd)
115*61046927SAndroid Build Coastguard Worker {
116*61046927SAndroid Build Coastguard Worker    return vdev->funcs->dmabuf_to_handle(vdev, fd);
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker static inline uint32_t
vdrm_handle_to_res_id(struct vdrm_device * vdev,uint32_t handle)120*61046927SAndroid Build Coastguard Worker vdrm_handle_to_res_id(struct vdrm_device *vdev, uint32_t handle)
121*61046927SAndroid Build Coastguard Worker {
122*61046927SAndroid Build Coastguard Worker    return vdev->funcs->handle_to_res_id(vdev, handle);
123*61046927SAndroid Build Coastguard Worker }
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker uint32_t vdrm_bo_create(struct vdrm_device *vdev, size_t size,
126*61046927SAndroid Build Coastguard Worker                         uint32_t blob_flags, uint64_t blob_id,
127*61046927SAndroid Build Coastguard Worker                         struct vdrm_ccmd_req *req);
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker static inline int
vdrm_bo_wait(struct vdrm_device * vdev,uint32_t handle)130*61046927SAndroid Build Coastguard Worker vdrm_bo_wait(struct vdrm_device *vdev, uint32_t handle)
131*61046927SAndroid Build Coastguard Worker {
132*61046927SAndroid Build Coastguard Worker    return vdev->funcs->bo_wait(vdev, handle);
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker static inline void *
vdrm_bo_map(struct vdrm_device * vdev,uint32_t handle,size_t size,void * placed_addr)136*61046927SAndroid Build Coastguard Worker vdrm_bo_map(struct vdrm_device *vdev, uint32_t handle, size_t size, void *placed_addr)
137*61046927SAndroid Build Coastguard Worker {
138*61046927SAndroid Build Coastguard Worker    return vdev->funcs->bo_map(vdev, handle, size, placed_addr);
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker static inline int
vdrm_bo_export_dmabuf(struct vdrm_device * vdev,uint32_t handle)142*61046927SAndroid Build Coastguard Worker vdrm_bo_export_dmabuf(struct vdrm_device *vdev, uint32_t handle)
143*61046927SAndroid Build Coastguard Worker {
144*61046927SAndroid Build Coastguard Worker    return vdev->funcs->bo_export_dmabuf(vdev, handle);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker static inline void
vdrm_bo_close(struct vdrm_device * vdev,uint32_t handle)148*61046927SAndroid Build Coastguard Worker vdrm_bo_close(struct vdrm_device *vdev, uint32_t handle)
149*61046927SAndroid Build Coastguard Worker {
150*61046927SAndroid Build Coastguard Worker    vdev->funcs->bo_close(vdev, handle);
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
154*61046927SAndroid Build Coastguard Worker } /* end of extern "C" */
155*61046927SAndroid Build Coastguard Worker #endif
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker #endif /* __VDRM_H__ */
158