xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/asahi_proto.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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