blob: 8820b46a5e74cbc478453b3fe2d0427f6ed23ac4 [file] [log] [blame] [edit]
/*
* 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_