xref: /aosp_15_r20/external/virglrenderer/src/drm/msm/msm_proto.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #ifndef MSM_PROTO_H_
7*bbecb9d1SAndroid Build Coastguard Worker #define MSM_PROTO_H_
8*bbecb9d1SAndroid Build Coastguard Worker 
9*bbecb9d1SAndroid Build Coastguard Worker /**
10*bbecb9d1SAndroid Build Coastguard Worker  * General protocol notes:
11*bbecb9d1SAndroid Build Coastguard Worker  * 1) Request (req) messages are generally sent over DRM_VIRTGPU_EXECBUFFER
12*bbecb9d1SAndroid Build Coastguard Worker  *    but can also be sent via DRM_VIRTGPU_RESOURCE_CREATE_BLOB (in which
13*bbecb9d1SAndroid Build Coastguard Worker  *    case they are processed by the host before ctx->get_blob())
14*bbecb9d1SAndroid Build Coastguard Worker  * 2) Response (rsp) messages are returned via shmem->rsp_mem, at an offset
15*bbecb9d1SAndroid Build Coastguard Worker  *    specified by the guest in the req message.  Not all req messages have
16*bbecb9d1SAndroid Build Coastguard Worker  *    a rsp.
17*bbecb9d1SAndroid Build Coastguard Worker  * 3) Host and guest could have different pointer sizes, ie. 32b guest and
18*bbecb9d1SAndroid Build Coastguard Worker  *    64b host, or visa versa, so similar to kernel uabi, req and rsp msgs
19*bbecb9d1SAndroid Build Coastguard Worker  *    should be explicitly padded to avoid 32b vs 64b struct padding issues
20*bbecb9d1SAndroid Build Coastguard Worker  */
21*bbecb9d1SAndroid Build Coastguard Worker 
22*bbecb9d1SAndroid Build Coastguard Worker /**
23*bbecb9d1SAndroid Build Coastguard Worker  * Defines the layout of shmem buffer used for host->guest communication.
24*bbecb9d1SAndroid Build Coastguard Worker  */
25*bbecb9d1SAndroid Build Coastguard Worker struct msm_shmem {
26*bbecb9d1SAndroid Build Coastguard Worker    /**
27*bbecb9d1SAndroid Build Coastguard Worker     * The sequence # of last cmd processed by the host
28*bbecb9d1SAndroid Build Coastguard Worker     */
29*bbecb9d1SAndroid Build Coastguard Worker    uint32_t seqno;
30*bbecb9d1SAndroid Build Coastguard Worker 
31*bbecb9d1SAndroid Build Coastguard Worker    /**
32*bbecb9d1SAndroid Build Coastguard Worker     * Offset to the start of rsp memory region in the shmem buffer.  This
33*bbecb9d1SAndroid Build Coastguard Worker     * is set by the host when the shmem buffer is allocated, to allow for
34*bbecb9d1SAndroid Build Coastguard Worker     * extending the shmem buffer with new fields.  The size of the rsp
35*bbecb9d1SAndroid Build Coastguard Worker     * memory region is the size of the shmem buffer (controlled by the
36*bbecb9d1SAndroid Build Coastguard Worker     * guest) minus rsp_mem_offset.
37*bbecb9d1SAndroid Build Coastguard Worker     *
38*bbecb9d1SAndroid Build Coastguard Worker     * The guest should use the msm_shmem_has_field() macro to determine
39*bbecb9d1SAndroid Build Coastguard Worker     * if the host supports a given field, ie. to handle compatibility of
40*bbecb9d1SAndroid Build Coastguard Worker     * newer guest vs older host.
41*bbecb9d1SAndroid Build Coastguard Worker     *
42*bbecb9d1SAndroid Build Coastguard Worker     * Making the guest userspace responsible for backwards compatibility
43*bbecb9d1SAndroid Build Coastguard Worker     * simplifies the host VMM.
44*bbecb9d1SAndroid Build Coastguard Worker     */
45*bbecb9d1SAndroid Build Coastguard Worker    uint32_t rsp_mem_offset;
46*bbecb9d1SAndroid Build Coastguard Worker 
47*bbecb9d1SAndroid Build Coastguard Worker #define msm_shmem_has_field(shmem, field) ({                         \
48*bbecb9d1SAndroid Build Coastguard Worker       struct msm_shmem *_shmem = (shmem);                            \
49*bbecb9d1SAndroid Build Coastguard Worker       (_shmem->rsp_mem_offset > offsetof(struct msm_shmem, field));  \
50*bbecb9d1SAndroid Build Coastguard Worker    })
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker    /**
53*bbecb9d1SAndroid Build Coastguard Worker     * Counter that is incremented on asynchronous errors, like SUBMIT
54*bbecb9d1SAndroid Build Coastguard Worker     * or GEM_NEW failures.  The guest should treat errors as context-
55*bbecb9d1SAndroid Build Coastguard Worker     * lost.
56*bbecb9d1SAndroid Build Coastguard Worker     */
57*bbecb9d1SAndroid Build Coastguard Worker    uint32_t async_error;
58*bbecb9d1SAndroid Build Coastguard Worker };
59*bbecb9d1SAndroid Build Coastguard Worker 
60*bbecb9d1SAndroid Build Coastguard Worker #define DEFINE_CAST(parent, child)                                             \
61*bbecb9d1SAndroid Build Coastguard Worker    static inline struct child *to_##child(const struct parent *x)              \
62*bbecb9d1SAndroid Build Coastguard Worker    {                                                                           \
63*bbecb9d1SAndroid Build Coastguard Worker       return (struct child *)x;                                                \
64*bbecb9d1SAndroid Build Coastguard Worker    }
65*bbecb9d1SAndroid Build Coastguard Worker 
66*bbecb9d1SAndroid Build Coastguard Worker /*
67*bbecb9d1SAndroid Build Coastguard Worker  * Possible cmd types for "command stream", ie. payload of EXECBUF ioctl:
68*bbecb9d1SAndroid Build Coastguard Worker  */
69*bbecb9d1SAndroid Build Coastguard Worker enum msm_ccmd {
70*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_NOP = 1,         /* No payload, can be used to sync with host */
71*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_IOCTL_SIMPLE,
72*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_GEM_NEW,
73*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_GEM_SET_IOVA,
74*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_GEM_CPU_PREP,
75*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_GEM_SET_NAME,
76*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_GEM_SUBMIT,
77*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_GEM_UPLOAD,
78*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_SUBMITQUEUE_QUERY,
79*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_WAIT_FENCE,
80*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_SET_DEBUGINFO,
81*bbecb9d1SAndroid Build Coastguard Worker    MSM_CCMD_LAST,
82*bbecb9d1SAndroid Build Coastguard Worker };
83*bbecb9d1SAndroid Build Coastguard Worker 
84*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_req {
85*bbecb9d1SAndroid Build Coastguard Worker    uint32_t cmd;
86*bbecb9d1SAndroid Build Coastguard Worker    uint32_t len;
87*bbecb9d1SAndroid Build Coastguard Worker    uint32_t seqno;
88*bbecb9d1SAndroid Build Coastguard Worker 
89*bbecb9d1SAndroid Build Coastguard Worker    /* Offset into shmem ctrl buffer to write response.  The host ensures
90*bbecb9d1SAndroid Build Coastguard Worker     * that it doesn't write outside the bounds of the ctrl buffer, but
91*bbecb9d1SAndroid Build Coastguard Worker     * otherwise it is up to the guest to manage allocation of where responses
92*bbecb9d1SAndroid Build Coastguard Worker     * should be written in the ctrl buf.
93*bbecb9d1SAndroid Build Coastguard Worker     */
94*bbecb9d1SAndroid Build Coastguard Worker    uint32_t rsp_off;
95*bbecb9d1SAndroid Build Coastguard Worker };
96*bbecb9d1SAndroid Build Coastguard Worker 
97*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_rsp {
98*bbecb9d1SAndroid Build Coastguard Worker    uint32_t len;
99*bbecb9d1SAndroid Build Coastguard Worker };
100*bbecb9d1SAndroid Build Coastguard Worker 
101*bbecb9d1SAndroid Build Coastguard Worker #define MSM_CCMD(_cmd, _len) (struct msm_ccmd_req){ \
102*bbecb9d1SAndroid Build Coastguard Worker        .cmd = MSM_CCMD_##_cmd,                      \
103*bbecb9d1SAndroid Build Coastguard Worker        .len = (_len),                               \
104*bbecb9d1SAndroid Build Coastguard Worker    }
105*bbecb9d1SAndroid Build Coastguard Worker 
106*bbecb9d1SAndroid Build Coastguard Worker /*
107*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_NOP
108*bbecb9d1SAndroid Build Coastguard Worker  */
109*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_nop_req {
110*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
111*bbecb9d1SAndroid Build Coastguard Worker };
112*bbecb9d1SAndroid Build Coastguard Worker 
113*bbecb9d1SAndroid Build Coastguard Worker /*
114*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_IOCTL_SIMPLE
115*bbecb9d1SAndroid Build Coastguard Worker  *
116*bbecb9d1SAndroid Build Coastguard Worker  * Forward simple/flat IOC_RW or IOC_W ioctls.  Limited ioctls are supported.
117*bbecb9d1SAndroid Build Coastguard Worker  */
118*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_ioctl_simple_req {
119*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
120*bbecb9d1SAndroid Build Coastguard Worker 
121*bbecb9d1SAndroid Build Coastguard Worker    uint32_t cmd;
122*bbecb9d1SAndroid Build Coastguard Worker    uint8_t payload[];
123*bbecb9d1SAndroid Build Coastguard Worker };
124*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_ioctl_simple_req)
125*bbecb9d1SAndroid Build Coastguard Worker 
126*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_ioctl_simple_rsp {
127*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_rsp hdr;
128*bbecb9d1SAndroid Build Coastguard Worker 
129*bbecb9d1SAndroid Build Coastguard Worker    /* ioctl return value, interrupted syscalls are handled on the host without
130*bbecb9d1SAndroid Build Coastguard Worker     * returning to the guest.
131*bbecb9d1SAndroid Build Coastguard Worker     */
132*bbecb9d1SAndroid Build Coastguard Worker    int32_t ret;
133*bbecb9d1SAndroid Build Coastguard Worker 
134*bbecb9d1SAndroid Build Coastguard Worker    /* The output payload for IOC_RW ioctls, the payload is the same size as
135*bbecb9d1SAndroid Build Coastguard Worker     * msm_context_cmd_ioctl_simple_req.
136*bbecb9d1SAndroid Build Coastguard Worker     *
137*bbecb9d1SAndroid Build Coastguard Worker     * For IOC_W ioctls (userspace writes, kernel reads) this is zero length.
138*bbecb9d1SAndroid Build Coastguard Worker     */
139*bbecb9d1SAndroid Build Coastguard Worker    uint8_t payload[];
140*bbecb9d1SAndroid Build Coastguard Worker };
141*bbecb9d1SAndroid Build Coastguard Worker 
142*bbecb9d1SAndroid Build Coastguard Worker /*
143*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_GEM_NEW
144*bbecb9d1SAndroid Build Coastguard Worker  *
145*bbecb9d1SAndroid Build Coastguard Worker  * GEM buffer allocation, maps to DRM_MSM_GEM_NEW plus DRM_MSM_GEM_INFO to
146*bbecb9d1SAndroid Build Coastguard Worker  * set the BO's iova (to avoid extra guest -> host trip)
147*bbecb9d1SAndroid Build Coastguard Worker  *
148*bbecb9d1SAndroid Build Coastguard Worker  * No response.
149*bbecb9d1SAndroid Build Coastguard Worker  */
150*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_new_req {
151*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
152*bbecb9d1SAndroid Build Coastguard Worker 
153*bbecb9d1SAndroid Build Coastguard Worker    uint64_t iova;
154*bbecb9d1SAndroid Build Coastguard Worker    uint64_t size;
155*bbecb9d1SAndroid Build Coastguard Worker    uint32_t flags;
156*bbecb9d1SAndroid Build Coastguard Worker    uint32_t blob_id;
157*bbecb9d1SAndroid Build Coastguard Worker };
158*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_new_req)
159*bbecb9d1SAndroid Build Coastguard Worker 
160*bbecb9d1SAndroid Build Coastguard Worker /*
161*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_GEM_SET_IOVA
162*bbecb9d1SAndroid Build Coastguard Worker  *
163*bbecb9d1SAndroid Build Coastguard Worker  * Set the buffer iova (for imported BOs).  Also used to release the iova
164*bbecb9d1SAndroid Build Coastguard Worker  * (by setting it to zero) when a BO is freed.
165*bbecb9d1SAndroid Build Coastguard Worker  */
166*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_set_iova_req {
167*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
168*bbecb9d1SAndroid Build Coastguard Worker 
169*bbecb9d1SAndroid Build Coastguard Worker    uint64_t iova;
170*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
171*bbecb9d1SAndroid Build Coastguard Worker };
172*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_set_iova_req)
173*bbecb9d1SAndroid Build Coastguard Worker 
174*bbecb9d1SAndroid Build Coastguard Worker /*
175*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_GEM_CPU_PREP
176*bbecb9d1SAndroid Build Coastguard Worker  *
177*bbecb9d1SAndroid Build Coastguard Worker  * Maps to DRM_MSM_GEM_CPU_PREP
178*bbecb9d1SAndroid Build Coastguard Worker  *
179*bbecb9d1SAndroid Build Coastguard Worker  * Note: Since we don't want to block the single threaded host, this returns
180*bbecb9d1SAndroid Build Coastguard Worker  * immediately with -EBUSY if the fence is not yet signaled.  The guest
181*bbecb9d1SAndroid Build Coastguard Worker  * should poll if needed.
182*bbecb9d1SAndroid Build Coastguard Worker  */
183*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_cpu_prep_req {
184*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
185*bbecb9d1SAndroid Build Coastguard Worker 
186*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
187*bbecb9d1SAndroid Build Coastguard Worker    uint32_t op;
188*bbecb9d1SAndroid Build Coastguard Worker };
189*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_cpu_prep_req)
190*bbecb9d1SAndroid Build Coastguard Worker 
191*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_cpu_prep_rsp {
192*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_rsp hdr;
193*bbecb9d1SAndroid Build Coastguard Worker 
194*bbecb9d1SAndroid Build Coastguard Worker    int32_t ret;
195*bbecb9d1SAndroid Build Coastguard Worker };
196*bbecb9d1SAndroid Build Coastguard Worker 
197*bbecb9d1SAndroid Build Coastguard Worker /*
198*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_GEM_SET_NAME
199*bbecb9d1SAndroid Build Coastguard Worker  *
200*bbecb9d1SAndroid Build Coastguard Worker  * Maps to DRM_MSM_GEM_INFO:MSM_INFO_SET_NAME
201*bbecb9d1SAndroid Build Coastguard Worker  *
202*bbecb9d1SAndroid Build Coastguard Worker  * No response.
203*bbecb9d1SAndroid Build Coastguard Worker  */
204*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_set_name_req {
205*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
206*bbecb9d1SAndroid Build Coastguard Worker 
207*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
208*bbecb9d1SAndroid Build Coastguard Worker    /* Note: packet size aligned to 4 bytes, so the string name may
209*bbecb9d1SAndroid Build Coastguard Worker     * be shorter than the packet header indicates.
210*bbecb9d1SAndroid Build Coastguard Worker     */
211*bbecb9d1SAndroid Build Coastguard Worker    uint32_t len;
212*bbecb9d1SAndroid Build Coastguard Worker    uint8_t  payload[];
213*bbecb9d1SAndroid Build Coastguard Worker };
214*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_set_name_req)
215*bbecb9d1SAndroid Build Coastguard Worker 
216*bbecb9d1SAndroid Build Coastguard Worker /*
217*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_GEM_SUBMIT
218*bbecb9d1SAndroid Build Coastguard Worker  *
219*bbecb9d1SAndroid Build Coastguard Worker  * Maps to DRM_MSM_GEM_SUBMIT
220*bbecb9d1SAndroid Build Coastguard Worker  *
221*bbecb9d1SAndroid Build Coastguard Worker  * The actual for-reals cmdstream submission.  Note this intentionally
222*bbecb9d1SAndroid Build Coastguard Worker  * does not support relocs, since we already require a non-ancient
223*bbecb9d1SAndroid Build Coastguard Worker  * kernel.
224*bbecb9d1SAndroid Build Coastguard Worker  *
225*bbecb9d1SAndroid Build Coastguard Worker  * Note, no in/out fence-fd, that synchronization is handled on guest
226*bbecb9d1SAndroid Build Coastguard Worker  * kernel side (ugg).. need to come up with a better story for fencing.
227*bbecb9d1SAndroid Build Coastguard Worker  * We probably need to sort something out for that to handle syncobjs.
228*bbecb9d1SAndroid Build Coastguard Worker  *
229*bbecb9d1SAndroid Build Coastguard Worker  * No response.
230*bbecb9d1SAndroid Build Coastguard Worker  */
231*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_submit_req {
232*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
233*bbecb9d1SAndroid Build Coastguard Worker 
234*bbecb9d1SAndroid Build Coastguard Worker    uint32_t flags;
235*bbecb9d1SAndroid Build Coastguard Worker    uint32_t queue_id;
236*bbecb9d1SAndroid Build Coastguard Worker    uint32_t nr_bos;
237*bbecb9d1SAndroid Build Coastguard Worker    uint32_t nr_cmds;
238*bbecb9d1SAndroid Build Coastguard Worker 
239*bbecb9d1SAndroid Build Coastguard Worker    /**
240*bbecb9d1SAndroid Build Coastguard Worker     * The fence "seqno" assigned by the guest userspace.  The host SUBMIT
241*bbecb9d1SAndroid Build Coastguard Worker     * ioctl uses the MSM_SUBMIT_FENCE_SN_IN flag to let the guest assign
242*bbecb9d1SAndroid Build Coastguard Worker     * the sequence #, to avoid the guest needing to wait for a response
243*bbecb9d1SAndroid Build Coastguard Worker     * from the host.
244*bbecb9d1SAndroid Build Coastguard Worker     */
245*bbecb9d1SAndroid Build Coastguard Worker    uint32_t fence;
246*bbecb9d1SAndroid Build Coastguard Worker 
247*bbecb9d1SAndroid Build Coastguard Worker    /**
248*bbecb9d1SAndroid Build Coastguard Worker     * Payload is first an array of 'struct drm_msm_gem_submit_bo' of
249*bbecb9d1SAndroid Build Coastguard Worker     * length determined by nr_bos (note that handles are guest resource
250*bbecb9d1SAndroid Build Coastguard Worker     * ids which are translated to host GEM handles by the host VMM),
251*bbecb9d1SAndroid Build Coastguard Worker     * followed by an array of 'struct drm_msm_gem_submit_cmd' of length
252*bbecb9d1SAndroid Build Coastguard Worker     * determined by nr_cmds
253*bbecb9d1SAndroid Build Coastguard Worker     */
254*bbecb9d1SAndroid Build Coastguard Worker    int8_t   payload[];
255*bbecb9d1SAndroid Build Coastguard Worker };
256*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_submit_req)
257*bbecb9d1SAndroid Build Coastguard Worker 
258*bbecb9d1SAndroid Build Coastguard Worker /*
259*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_GEM_UPLOAD
260*bbecb9d1SAndroid Build Coastguard Worker  *
261*bbecb9d1SAndroid Build Coastguard Worker  * Upload data to a GEM buffer
262*bbecb9d1SAndroid Build Coastguard Worker  *
263*bbecb9d1SAndroid Build Coastguard Worker  * No response.
264*bbecb9d1SAndroid Build Coastguard Worker  */
265*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_gem_upload_req {
266*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
267*bbecb9d1SAndroid Build Coastguard Worker 
268*bbecb9d1SAndroid Build Coastguard Worker    uint32_t res_id;
269*bbecb9d1SAndroid Build Coastguard Worker    uint32_t pad;
270*bbecb9d1SAndroid Build Coastguard Worker    uint32_t off;
271*bbecb9d1SAndroid Build Coastguard Worker 
272*bbecb9d1SAndroid Build Coastguard Worker    /* Note: packet size aligned to 4 bytes, so the payload may
273*bbecb9d1SAndroid Build Coastguard Worker     * be shorter than the packet header indicates.
274*bbecb9d1SAndroid Build Coastguard Worker     */
275*bbecb9d1SAndroid Build Coastguard Worker    uint32_t len;
276*bbecb9d1SAndroid Build Coastguard Worker    uint8_t  payload[];
277*bbecb9d1SAndroid Build Coastguard Worker };
278*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_upload_req)
279*bbecb9d1SAndroid Build Coastguard Worker 
280*bbecb9d1SAndroid Build Coastguard Worker /*
281*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_SUBMITQUEUE_QUERY
282*bbecb9d1SAndroid Build Coastguard Worker  *
283*bbecb9d1SAndroid Build Coastguard Worker  * Maps to DRM_MSM_SUBMITQUEUE_QUERY
284*bbecb9d1SAndroid Build Coastguard Worker  */
285*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_submitqueue_query_req {
286*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
287*bbecb9d1SAndroid Build Coastguard Worker 
288*bbecb9d1SAndroid Build Coastguard Worker    uint32_t queue_id;
289*bbecb9d1SAndroid Build Coastguard Worker    uint32_t param;
290*bbecb9d1SAndroid Build Coastguard Worker    uint32_t len;   /* size of payload in rsp */
291*bbecb9d1SAndroid Build Coastguard Worker };
292*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_submitqueue_query_req)
293*bbecb9d1SAndroid Build Coastguard Worker 
294*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_submitqueue_query_rsp {
295*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_rsp hdr;
296*bbecb9d1SAndroid Build Coastguard Worker 
297*bbecb9d1SAndroid Build Coastguard Worker    int32_t  ret;
298*bbecb9d1SAndroid Build Coastguard Worker    uint32_t out_len;
299*bbecb9d1SAndroid Build Coastguard Worker    uint8_t  payload[];
300*bbecb9d1SAndroid Build Coastguard Worker };
301*bbecb9d1SAndroid Build Coastguard Worker 
302*bbecb9d1SAndroid Build Coastguard Worker /*
303*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_WAIT_FENCE
304*bbecb9d1SAndroid Build Coastguard Worker  *
305*bbecb9d1SAndroid Build Coastguard Worker  * Maps to DRM_MSM_WAIT_FENCE
306*bbecb9d1SAndroid Build Coastguard Worker  *
307*bbecb9d1SAndroid Build Coastguard Worker  * Note: Since we don't want to block the single threaded host, this returns
308*bbecb9d1SAndroid Build Coastguard Worker  * immediately with -ETIMEDOUT if the fence is not yet signaled.  The guest
309*bbecb9d1SAndroid Build Coastguard Worker  * should poll if needed.
310*bbecb9d1SAndroid Build Coastguard Worker  */
311*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_wait_fence_req {
312*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
313*bbecb9d1SAndroid Build Coastguard Worker 
314*bbecb9d1SAndroid Build Coastguard Worker    uint32_t queue_id;
315*bbecb9d1SAndroid Build Coastguard Worker    uint32_t fence;
316*bbecb9d1SAndroid Build Coastguard Worker };
317*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_wait_fence_req)
318*bbecb9d1SAndroid Build Coastguard Worker 
319*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_wait_fence_rsp {
320*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_rsp hdr;
321*bbecb9d1SAndroid Build Coastguard Worker 
322*bbecb9d1SAndroid Build Coastguard Worker    int32_t ret;
323*bbecb9d1SAndroid Build Coastguard Worker };
324*bbecb9d1SAndroid Build Coastguard Worker 
325*bbecb9d1SAndroid Build Coastguard Worker /*
326*bbecb9d1SAndroid Build Coastguard Worker  * MSM_CCMD_SET_DEBUGINFO
327*bbecb9d1SAndroid Build Coastguard Worker  *
328*bbecb9d1SAndroid Build Coastguard Worker  * Set per-guest-process debug info (comm and cmdline).  For GPU faults/
329*bbecb9d1SAndroid Build Coastguard Worker  * crashes, it isn't too useful to see the crosvm (for ex.) comm/cmdline,
330*bbecb9d1SAndroid Build Coastguard Worker  * since the host process is only a proxy.  This allows the guest to
331*bbecb9d1SAndroid Build Coastguard Worker  * pass through the guest process comm and commandline for debugging
332*bbecb9d1SAndroid Build Coastguard Worker  * purposes.
333*bbecb9d1SAndroid Build Coastguard Worker  *
334*bbecb9d1SAndroid Build Coastguard Worker  * No response.
335*bbecb9d1SAndroid Build Coastguard Worker  */
336*bbecb9d1SAndroid Build Coastguard Worker struct msm_ccmd_set_debuginfo_req {
337*bbecb9d1SAndroid Build Coastguard Worker    struct msm_ccmd_req hdr;
338*bbecb9d1SAndroid Build Coastguard Worker 
339*bbecb9d1SAndroid Build Coastguard Worker    uint32_t comm_len;
340*bbecb9d1SAndroid Build Coastguard Worker    uint32_t cmdline_len;
341*bbecb9d1SAndroid Build Coastguard Worker 
342*bbecb9d1SAndroid Build Coastguard Worker    /**
343*bbecb9d1SAndroid Build Coastguard Worker     * Payload is first the comm string followed by cmdline string, padded
344*bbecb9d1SAndroid Build Coastguard Worker     * out to a multiple of 4.
345*bbecb9d1SAndroid Build Coastguard Worker     */
346*bbecb9d1SAndroid Build Coastguard Worker    int8_t   payload[];
347*bbecb9d1SAndroid Build Coastguard Worker };
348*bbecb9d1SAndroid Build Coastguard Worker DEFINE_CAST(msm_ccmd_req, msm_ccmd_set_debuginfo_req)
349*bbecb9d1SAndroid Build Coastguard Worker 
350*bbecb9d1SAndroid Build Coastguard Worker #endif /* MSM_PROTO_H_ */
351