/* * Copyright 2024 Sergio Lopez * Copyright 2022 Google LLC * SPDX-License-Identifier: MIT */ #ifndef ASAHI_PROTO_H_ #define ASAHI_PROTO_H_ /** * Defines the layout of shmem buffer used for host->guest communication. */ struct asahi_shmem { struct vdrm_shmem base; /** * Counter that is incremented on asynchronous errors, like SUBMIT * or GEM_NEW failures. The guest should treat errors as context- * lost. */ uint32_t async_error; /** * Counter that is incremented on global fault (see MSM_PARAM_FAULTS) */ uint32_t global_faults; }; DEFINE_CAST(vdrm_shmem, asahi_shmem) /* * Possible cmd types for "command stream", ie. payload of EXECBUF ioctl: */ enum asahi_ccmd { ASAHI_CCMD_NOP = 1, /* No payload, can be used to sync with host */ ASAHI_CCMD_IOCTL_SIMPLE, ASAHI_CCMD_GET_PARAMS, ASAHI_CCMD_GEM_NEW, ASAHI_CCMD_GEM_BIND, ASAHI_CCMD_SUBMIT, }; #define ASAHI_CCMD(_cmd, _len) \ (struct vdrm_ccmd_req) \ { \ .cmd = ASAHI_CCMD_##_cmd, .len = (_len), \ } /* * ASAHI_CCMD_NOP */ struct asahi_ccmd_nop_req { struct vdrm_ccmd_req hdr; }; /* * ASAHI_CCMD_IOCTL_SIMPLE * * Forward simple/flat IOC_RW or IOC_W ioctls. Limited ioctls are supported. */ struct asahi_ccmd_ioctl_simple_req { struct vdrm_ccmd_req hdr; uint32_t cmd; uint8_t payload[]; }; DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_ioctl_simple_req) struct asahi_ccmd_ioctl_simple_rsp { struct vdrm_ccmd_rsp hdr; /* ioctl return value, interrupted syscalls are handled on the host without * returning to the guest. */ int32_t ret; /* The output payload for IOC_RW ioctls, the payload is the same size as * asahi_context_cmd_ioctl_simple_req. * * For IOC_W ioctls (userspace writes, kernel reads) this is zero length. */ uint8_t payload[]; }; struct asahi_ccmd_get_params_req { struct vdrm_ccmd_req hdr; struct drm_asahi_get_params params; }; DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_get_params_req) struct asahi_ccmd_get_params_rsp { struct vdrm_ccmd_rsp hdr; int32_t ret; struct drm_asahi_params_global params; }; struct asahi_ccmd_gem_new_req { struct vdrm_ccmd_req hdr; uint32_t flags; uint32_t bind_flags; uint32_t vm_id; uint32_t blob_id; uint64_t size; uint64_t addr; }; DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_gem_new_req) struct asahi_ccmd_gem_bind_req { struct vdrm_ccmd_req hdr; uint32_t op; uint32_t flags; uint32_t vm_id; uint32_t res_id; uint64_t size; uint64_t addr; }; DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_gem_bind_req) struct asahi_ccmd_gem_bind_rsp { struct vdrm_ccmd_rsp hdr; int32_t ret; }; struct asahi_ccmd_submit_req { struct vdrm_ccmd_req hdr; uint32_t queue_id; uint32_t result_res_id; uint32_t command_count; uint8_t payload[]; }; DEFINE_CAST(vdrm_ccmd_req, asahi_ccmd_submit_req) #endif // ASAHI_PROTO_H_