1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright 2024 Sergio Lopez 3*61046927SAndroid Build Coastguard Worker * Copyright 2022 Google LLC 4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker */ 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard Worker #ifndef ASAHI_PROTO_H_ 8*61046927SAndroid Build Coastguard Worker #define ASAHI_PROTO_H_ 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker /** 11*61046927SAndroid Build Coastguard Worker * Defines the layout of shmem buffer used for host->guest communication. 12*61046927SAndroid Build Coastguard Worker */ 13*61046927SAndroid Build Coastguard Worker struct asahi_shmem { 14*61046927SAndroid Build Coastguard Worker struct vdrm_shmem base; 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker /** 17*61046927SAndroid Build Coastguard Worker * Counter that is incremented on asynchronous errors, like SUBMIT 18*61046927SAndroid Build Coastguard Worker * or GEM_NEW failures. The guest should treat errors as context- 19*61046927SAndroid Build Coastguard Worker * lost. 20*61046927SAndroid Build Coastguard Worker */ 21*61046927SAndroid Build Coastguard Worker uint32_t async_error; 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker /** 24*61046927SAndroid Build Coastguard Worker * Counter that is incremented on global fault (see MSM_PARAM_FAULTS) 25*61046927SAndroid Build Coastguard Worker */ 26*61046927SAndroid Build Coastguard Worker uint32_t global_faults; 27*61046927SAndroid Build Coastguard Worker }; 28*61046927SAndroid Build Coastguard Worker DEFINE_CAST(vdrm_shmem, asahi_shmem) 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker /* 31*61046927SAndroid Build Coastguard Worker * Possible cmd types for "command stream", ie. payload of EXECBUF ioctl: 32*61046927SAndroid Build Coastguard Worker */ 33*61046927SAndroid Build Coastguard Worker enum asahi_ccmd { 34*61046927SAndroid Build Coastguard Worker ASAHI_CCMD_NOP = 1, /* No payload, can be used to sync with host */ 35*61046927SAndroid Build Coastguard Worker ASAHI_CCMD_IOCTL_SIMPLE, 36*61046927SAndroid Build Coastguard Worker ASAHI_CCMD_GET_PARAMS, 37*61046927SAndroid Build Coastguard Worker ASAHI_CCMD_GEM_NEW, 38*61046927SAndroid Build Coastguard Worker ASAHI_CCMD_GEM_BIND, 39*61046927SAndroid Build Coastguard Worker ASAHI_CCMD_SUBMIT, 40*61046927SAndroid Build Coastguard Worker }; 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker #define ASAHI_CCMD(_cmd, _len) \ 43*61046927SAndroid Build Coastguard Worker (struct vdrm_ccmd_req) \ 44*61046927SAndroid Build Coastguard Worker { \ 45*61046927SAndroid Build Coastguard Worker .cmd = ASAHI_CCMD_##_cmd, .len = (_len), \ 46*61046927SAndroid Build Coastguard Worker } 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker /* 49*61046927SAndroid Build Coastguard Worker * ASAHI_CCMD_NOP 50*61046927SAndroid Build Coastguard Worker */ 51*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_nop_req { 52*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req hdr; 53*61046927SAndroid Build Coastguard Worker }; 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker /* 56*61046927SAndroid Build Coastguard Worker * ASAHI_CCMD_IOCTL_SIMPLE 57*61046927SAndroid Build Coastguard Worker * 58*61046927SAndroid Build Coastguard Worker * Forward simple/flat IOC_RW or IOC_W ioctls. Limited ioctls are supported. 59*61046927SAndroid Build Coastguard Worker */ 60*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_ioctl_simple_req { 61*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req hdr; 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Worker uint32_t cmd; 64*61046927SAndroid Build Coastguard Worker uint8_t payload[]; 65*61046927SAndroid Build Coastguard Worker }; 66*61046927SAndroid Build Coastguard Worker DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_ioctl_simple_req) 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_ioctl_simple_rsp { 69*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_rsp hdr; 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker /* ioctl return value, interrupted syscalls are handled on the host without 72*61046927SAndroid Build Coastguard Worker * returning to the guest. 73*61046927SAndroid Build Coastguard Worker */ 74*61046927SAndroid Build Coastguard Worker int32_t ret; 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker /* The output payload for IOC_RW ioctls, the payload is the same size as 77*61046927SAndroid Build Coastguard Worker * asahi_context_cmd_ioctl_simple_req. 78*61046927SAndroid Build Coastguard Worker * 79*61046927SAndroid Build Coastguard Worker * For IOC_W ioctls (userspace writes, kernel reads) this is zero length. 80*61046927SAndroid Build Coastguard Worker */ 81*61046927SAndroid Build Coastguard Worker uint8_t payload[]; 82*61046927SAndroid Build Coastguard Worker }; 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_get_params_req { 85*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req hdr; 86*61046927SAndroid Build Coastguard Worker struct drm_asahi_get_params params; 87*61046927SAndroid Build Coastguard Worker }; 88*61046927SAndroid Build Coastguard Worker DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_get_params_req) 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_get_params_rsp { 91*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_rsp hdr; 92*61046927SAndroid Build Coastguard Worker int32_t ret; 93*61046927SAndroid Build Coastguard Worker struct drm_asahi_params_global params; 94*61046927SAndroid Build Coastguard Worker }; 95*61046927SAndroid Build Coastguard Worker 96*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_gem_new_req { 97*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req hdr; 98*61046927SAndroid Build Coastguard Worker uint32_t flags; 99*61046927SAndroid Build Coastguard Worker uint32_t bind_flags; 100*61046927SAndroid Build Coastguard Worker uint32_t vm_id; 101*61046927SAndroid Build Coastguard Worker uint32_t blob_id; 102*61046927SAndroid Build Coastguard Worker uint64_t size; 103*61046927SAndroid Build Coastguard Worker uint64_t addr; 104*61046927SAndroid Build Coastguard Worker }; 105*61046927SAndroid Build Coastguard Worker DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_gem_new_req) 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_gem_bind_req { 108*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req hdr; 109*61046927SAndroid Build Coastguard Worker uint32_t op; 110*61046927SAndroid Build Coastguard Worker uint32_t flags; 111*61046927SAndroid Build Coastguard Worker uint32_t vm_id; 112*61046927SAndroid Build Coastguard Worker uint32_t res_id; 113*61046927SAndroid Build Coastguard Worker uint64_t size; 114*61046927SAndroid Build Coastguard Worker uint64_t addr; 115*61046927SAndroid Build Coastguard Worker }; 116*61046927SAndroid Build Coastguard Worker DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_gem_bind_req) 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_gem_bind_rsp { 119*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_rsp hdr; 120*61046927SAndroid Build Coastguard Worker int32_t ret; 121*61046927SAndroid Build Coastguard Worker }; 122*61046927SAndroid Build Coastguard Worker 123*61046927SAndroid Build Coastguard Worker struct asahi_ccmd_submit_req { 124*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req hdr; 125*61046927SAndroid Build Coastguard Worker uint32_t queue_id; 126*61046927SAndroid Build Coastguard Worker uint32_t result_res_id; 127*61046927SAndroid Build Coastguard Worker uint32_t command_count; 128*61046927SAndroid Build Coastguard Worker 129*61046927SAndroid Build Coastguard Worker uint8_t payload[]; 130*61046927SAndroid Build Coastguard Worker }; 131*61046927SAndroid Build Coastguard Worker DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_submit_req) 132*61046927SAndroid Build Coastguard Worker 133*61046927SAndroid Build Coastguard Worker #endif // ASAHI_PROTO_H_ 134