xref: /aosp_15_r20/external/mesa3d/src/virtio/virtio-gpu/drm_hw.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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 DRM_HW_H_
7*61046927SAndroid Build Coastguard Worker #define DRM_HW_H_
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker struct virgl_renderer_capset_drm {
10*61046927SAndroid Build Coastguard Worker    uint32_t wire_format_version;
11*61046927SAndroid Build Coastguard Worker    /* Underlying drm device version: */
12*61046927SAndroid Build Coastguard Worker    uint32_t version_major;
13*61046927SAndroid Build Coastguard Worker    uint32_t version_minor;
14*61046927SAndroid Build Coastguard Worker    uint32_t version_patchlevel;
15*61046927SAndroid Build Coastguard Worker #define VIRTGPU_DRM_CONTEXT_MSM   1
16*61046927SAndroid Build Coastguard Worker    uint32_t context_type;
17*61046927SAndroid Build Coastguard Worker    uint32_t pad;
18*61046927SAndroid Build Coastguard Worker    union {
19*61046927SAndroid Build Coastguard Worker       struct {
20*61046927SAndroid Build Coastguard Worker          uint32_t has_cached_coherent;
21*61046927SAndroid Build Coastguard Worker          uint32_t priorities;
22*61046927SAndroid Build Coastguard Worker          uint64_t va_start;
23*61046927SAndroid Build Coastguard Worker          uint64_t va_size;
24*61046927SAndroid Build Coastguard Worker          uint32_t gpu_id;
25*61046927SAndroid Build Coastguard Worker          uint32_t gmem_size;
26*61046927SAndroid Build Coastguard Worker          uint64_t gmem_base;
27*61046927SAndroid Build Coastguard Worker          uint64_t chip_id;
28*61046927SAndroid Build Coastguard Worker          uint32_t max_freq;
29*61046927SAndroid Build Coastguard Worker       } msm;  /* context_type == VIRTGPU_DRM_CONTEXT_MSM */
30*61046927SAndroid Build Coastguard Worker    } u;
31*61046927SAndroid Build Coastguard Worker };
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker /**
34*61046927SAndroid Build Coastguard Worker  * Defines the layout of shmem buffer used for host->guest communication.
35*61046927SAndroid Build Coastguard Worker  */
36*61046927SAndroid Build Coastguard Worker struct vdrm_shmem {
37*61046927SAndroid Build Coastguard Worker    /**
38*61046927SAndroid Build Coastguard Worker     * The sequence # of last cmd processed by the host
39*61046927SAndroid Build Coastguard Worker     */
40*61046927SAndroid Build Coastguard Worker    uint32_t seqno;
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker    /**
43*61046927SAndroid Build Coastguard Worker     * Offset to the start of rsp memory region in the shmem buffer.  This
44*61046927SAndroid Build Coastguard Worker     * is set by the host when the shmem buffer is allocated, to allow for
45*61046927SAndroid Build Coastguard Worker     * extending the shmem buffer with new fields.  The size of the rsp
46*61046927SAndroid Build Coastguard Worker     * memory region is the size of the shmem buffer (controlled by the
47*61046927SAndroid Build Coastguard Worker     * guest) minus rsp_mem_offset.
48*61046927SAndroid Build Coastguard Worker     *
49*61046927SAndroid Build Coastguard Worker     * The guest should use the vdrm_shmem_has_field() macro to determine
50*61046927SAndroid Build Coastguard Worker     * if the host supports a given field, ie. to handle compatibility of
51*61046927SAndroid Build Coastguard Worker     * newer guest vs older host.
52*61046927SAndroid Build Coastguard Worker     *
53*61046927SAndroid Build Coastguard Worker     * Making the guest userspace responsible for backwards compatibility
54*61046927SAndroid Build Coastguard Worker     * simplifies the host VMM.
55*61046927SAndroid Build Coastguard Worker     */
56*61046927SAndroid Build Coastguard Worker    uint32_t rsp_mem_offset;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker #define vdrm_shmem_has_field(shmem, field) ({                             \
59*61046927SAndroid Build Coastguard Worker       struct vdrm_shmem *_shmem = &(shmem)->base;                         \
60*61046927SAndroid Build Coastguard Worker       (_shmem->rsp_mem_offset > offsetof(__typeof__(*(shmem)), field));   \
61*61046927SAndroid Build Coastguard Worker    })
62*61046927SAndroid Build Coastguard Worker };
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker /**
65*61046927SAndroid Build Coastguard Worker  * A Guest -> Host request header.
66*61046927SAndroid Build Coastguard Worker  */
67*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_req {
68*61046927SAndroid Build Coastguard Worker    uint32_t cmd;
69*61046927SAndroid Build Coastguard Worker    uint32_t len;
70*61046927SAndroid Build Coastguard Worker    uint32_t seqno;
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    /* Offset into shmem ctrl buffer to write response.  The host ensures
73*61046927SAndroid Build Coastguard Worker     * that it doesn't write outside the bounds of the ctrl buffer, but
74*61046927SAndroid Build Coastguard Worker     * otherwise it is up to the guest to manage allocation of where responses
75*61046927SAndroid Build Coastguard Worker     * should be written in the ctrl buf.
76*61046927SAndroid Build Coastguard Worker     *
77*61046927SAndroid Build Coastguard Worker     * Only applicable for cmds that have a response message.
78*61046927SAndroid Build Coastguard Worker     */
79*61046927SAndroid Build Coastguard Worker    uint32_t rsp_off;
80*61046927SAndroid Build Coastguard Worker };
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /**
83*61046927SAndroid Build Coastguard Worker  * A Guest <- Host response header.
84*61046927SAndroid Build Coastguard Worker  */
85*61046927SAndroid Build Coastguard Worker struct vdrm_ccmd_rsp {
86*61046927SAndroid Build Coastguard Worker    uint32_t len;
87*61046927SAndroid Build Coastguard Worker };
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker #define DEFINE_CAST(parent, child)                                             \
90*61046927SAndroid Build Coastguard Worker    static inline struct child *to_##child(const struct parent *x)              \
91*61046927SAndroid Build Coastguard Worker    {                                                                           \
92*61046927SAndroid Build Coastguard Worker       return (struct child *)x;                                                \
93*61046927SAndroid Build Coastguard Worker    }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker #endif /* DRM_HW_H_ */
96