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