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