162fb7a5eSGerd Hoffmann /* 262fb7a5eSGerd Hoffmann * Copyright 2013 Red Hat 362fb7a5eSGerd Hoffmann * All Rights Reserved. 462fb7a5eSGerd Hoffmann * 562fb7a5eSGerd Hoffmann * Permission is hereby granted, free of charge, to any person obtaining a 662fb7a5eSGerd Hoffmann * copy of this software and associated documentation files (the "Software"), 762fb7a5eSGerd Hoffmann * to deal in the Software without restriction, including without limitation 862fb7a5eSGerd Hoffmann * the rights to use, copy, modify, merge, publish, distribute, sublicense, 962fb7a5eSGerd Hoffmann * and/or sell copies of the Software, and to permit persons to whom the 1062fb7a5eSGerd Hoffmann * Software is furnished to do so, subject to the following conditions: 1162fb7a5eSGerd Hoffmann * 1262fb7a5eSGerd Hoffmann * The above copyright notice and this permission notice (including the next 1362fb7a5eSGerd Hoffmann * paragraph) shall be included in all copies or substantial portions of the 1462fb7a5eSGerd Hoffmann * Software. 1562fb7a5eSGerd Hoffmann * 1662fb7a5eSGerd Hoffmann * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1762fb7a5eSGerd Hoffmann * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1862fb7a5eSGerd Hoffmann * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1962fb7a5eSGerd Hoffmann * THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 2062fb7a5eSGerd Hoffmann * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2162fb7a5eSGerd Hoffmann * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2262fb7a5eSGerd Hoffmann * OTHER DEALINGS IN THE SOFTWARE. 2362fb7a5eSGerd Hoffmann */ 2462fb7a5eSGerd Hoffmann #ifndef VIRTGPU_DRM_H 2562fb7a5eSGerd Hoffmann #define VIRTGPU_DRM_H 2662fb7a5eSGerd Hoffmann 276e82e9c8SGabriel Laskar #include "drm.h" 2862fb7a5eSGerd Hoffmann 2938180815SEmil Velikov #if defined(__cplusplus) 3038180815SEmil Velikov extern "C" { 3138180815SEmil Velikov #endif 3238180815SEmil Velikov 3362fb7a5eSGerd Hoffmann /* Please note that modifications to all structs defined here are 3462fb7a5eSGerd Hoffmann * subject to backwards-compatibility constraints. 3562fb7a5eSGerd Hoffmann * 3629e08b05SGabriel Laskar * Do not use pointers, use __u64 instead for 32 bit / 64 bit user/kernel 3762fb7a5eSGerd Hoffmann * compatibility Keep fields aligned to their size 3862fb7a5eSGerd Hoffmann */ 3962fb7a5eSGerd Hoffmann 4062fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_MAP 0x01 4162fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_EXECBUFFER 0x02 4262fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_GETPARAM 0x03 4362fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_RESOURCE_CREATE 0x04 4462fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_RESOURCE_INFO 0x05 4562fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_TRANSFER_FROM_HOST 0x06 4662fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_TRANSFER_TO_HOST 0x07 4762fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_WAIT 0x08 4862fb7a5eSGerd Hoffmann #define DRM_VIRTGPU_GET_CAPS 0x09 49eda3e101SGurchetan Singh #define DRM_VIRTGPU_RESOURCE_CREATE_BLOB 0x0a 50b1079043SGurchetan Singh #define DRM_VIRTGPU_CONTEXT_INIT 0x0b 5162fb7a5eSGerd Hoffmann 52a56f9c86SRobert Foss #define VIRTGPU_EXECBUF_FENCE_FD_IN 0x01 53a56f9c86SRobert Foss #define VIRTGPU_EXECBUF_FENCE_FD_OUT 0x02 54b1079043SGurchetan Singh #define VIRTGPU_EXECBUF_RING_IDX 0x04 55a56f9c86SRobert Foss #define VIRTGPU_EXECBUF_FLAGS (\ 56a56f9c86SRobert Foss VIRTGPU_EXECBUF_FENCE_FD_IN |\ 57a56f9c86SRobert Foss VIRTGPU_EXECBUF_FENCE_FD_OUT |\ 58b1079043SGurchetan Singh VIRTGPU_EXECBUF_RING_IDX |\ 59a56f9c86SRobert Foss 0) 60a56f9c86SRobert Foss 6162fb7a5eSGerd Hoffmann struct drm_virtgpu_map { 6229e08b05SGabriel Laskar __u64 offset; /* use for mmap system call */ 6329e08b05SGabriel Laskar __u32 handle; 6429e08b05SGabriel Laskar __u32 pad; 6562fb7a5eSGerd Hoffmann }; 6662fb7a5eSGerd Hoffmann 677cb8d1abSDmitry Osipenko #define VIRTGPU_EXECBUF_SYNCOBJ_RESET 0x01 687cb8d1abSDmitry Osipenko #define VIRTGPU_EXECBUF_SYNCOBJ_FLAGS ( \ 697cb8d1abSDmitry Osipenko VIRTGPU_EXECBUF_SYNCOBJ_RESET | \ 707cb8d1abSDmitry Osipenko 0) 717cb8d1abSDmitry Osipenko struct drm_virtgpu_execbuffer_syncobj { 727cb8d1abSDmitry Osipenko __u32 handle; 737cb8d1abSDmitry Osipenko __u32 flags; 747cb8d1abSDmitry Osipenko __u64 point; 757cb8d1abSDmitry Osipenko }; 767cb8d1abSDmitry Osipenko 778f20660fSRyan Neph /* fence_fd is modified on success if VIRTGPU_EXECBUF_FENCE_FD_OUT flag is set. */ 7862fb7a5eSGerd Hoffmann struct drm_virtgpu_execbuffer { 79a56f9c86SRobert Foss __u32 flags; 8029e08b05SGabriel Laskar __u32 size; 8129e08b05SGabriel Laskar __u64 command; /* void* */ 8229e08b05SGabriel Laskar __u64 bo_handles; 8329e08b05SGabriel Laskar __u32 num_bo_handles; 842cd7b6f0SRobert Foss __s32 fence_fd; /* in/out fence fd (see VIRTGPU_EXECBUF_FENCE_FD_IN/OUT) */ 85b1079043SGurchetan Singh __u32 ring_idx; /* command ring index (see VIRTGPU_EXECBUF_RING_IDX) */ 867cb8d1abSDmitry Osipenko __u32 syncobj_stride; /* size of @drm_virtgpu_execbuffer_syncobj */ 877cb8d1abSDmitry Osipenko __u32 num_in_syncobjs; 887cb8d1abSDmitry Osipenko __u32 num_out_syncobjs; 897cb8d1abSDmitry Osipenko __u64 in_syncobjs; 907cb8d1abSDmitry Osipenko __u64 out_syncobjs; 9162fb7a5eSGerd Hoffmann }; 9262fb7a5eSGerd Hoffmann 9362fb7a5eSGerd Hoffmann #define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */ 949a191b11SDave Airlie #define VIRTGPU_PARAM_CAPSET_QUERY_FIX 2 /* do we have the capset fix */ 95eda3e101SGurchetan Singh #define VIRTGPU_PARAM_RESOURCE_BLOB 3 /* DRM_VIRTGPU_RESOURCE_CREATE_BLOB */ 967a571c76SGurchetan Singh #define VIRTGPU_PARAM_HOST_VISIBLE 4 /* Host blob resources are mappable */ 97bf36dea1SGurchetan Singh #define VIRTGPU_PARAM_CROSS_DEVICE 5 /* Cross virtio-device resource sharing */ 98b1079043SGurchetan Singh #define VIRTGPU_PARAM_CONTEXT_INIT 6 /* DRM_VIRTGPU_CONTEXT_INIT */ 99b1079043SGurchetan Singh #define VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs 7 /* Bitmask of supported capability set ids */ 100*7add8012SGurchetan Singh #define VIRTGPU_PARAM_EXPLICIT_DEBUG_NAME 8 /* Ability to set debug name from userspace */ 10162fb7a5eSGerd Hoffmann 10262fb7a5eSGerd Hoffmann struct drm_virtgpu_getparam { 10329e08b05SGabriel Laskar __u64 param; 10429e08b05SGabriel Laskar __u64 value; 10562fb7a5eSGerd Hoffmann }; 10662fb7a5eSGerd Hoffmann 10762fb7a5eSGerd Hoffmann /* NO_BO flags? NO resource flag? */ 10862fb7a5eSGerd Hoffmann /* resource flag for y_0_top */ 10962fb7a5eSGerd Hoffmann struct drm_virtgpu_resource_create { 11029e08b05SGabriel Laskar __u32 target; 11129e08b05SGabriel Laskar __u32 format; 11229e08b05SGabriel Laskar __u32 bind; 11329e08b05SGabriel Laskar __u32 width; 11429e08b05SGabriel Laskar __u32 height; 11529e08b05SGabriel Laskar __u32 depth; 11629e08b05SGabriel Laskar __u32 array_size; 11729e08b05SGabriel Laskar __u32 last_level; 11829e08b05SGabriel Laskar __u32 nr_samples; 11929e08b05SGabriel Laskar __u32 flags; 12029e08b05SGabriel Laskar __u32 bo_handle; /* if this is set - recreate a new resource attached to this bo ? */ 12129e08b05SGabriel Laskar __u32 res_handle; /* returned by kernel */ 12229e08b05SGabriel Laskar __u32 size; /* validate transfer in the host */ 12329e08b05SGabriel Laskar __u32 stride; /* validate transfer in the host */ 12462fb7a5eSGerd Hoffmann }; 12562fb7a5eSGerd Hoffmann 12662fb7a5eSGerd Hoffmann struct drm_virtgpu_resource_info { 12729e08b05SGabriel Laskar __u32 bo_handle; 12829e08b05SGabriel Laskar __u32 res_handle; 12929e08b05SGabriel Laskar __u32 size; 130eda3e101SGurchetan Singh __u32 blob_mem; 13162fb7a5eSGerd Hoffmann }; 13262fb7a5eSGerd Hoffmann 13362fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_box { 13429e08b05SGabriel Laskar __u32 x; 13529e08b05SGabriel Laskar __u32 y; 13629e08b05SGabriel Laskar __u32 z; 13729e08b05SGabriel Laskar __u32 w; 13829e08b05SGabriel Laskar __u32 h; 13929e08b05SGabriel Laskar __u32 d; 14062fb7a5eSGerd Hoffmann }; 14162fb7a5eSGerd Hoffmann 14262fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_transfer_to_host { 14329e08b05SGabriel Laskar __u32 bo_handle; 14462fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_box box; 14529e08b05SGabriel Laskar __u32 level; 14629e08b05SGabriel Laskar __u32 offset; 147eda3e101SGurchetan Singh __u32 stride; 148eda3e101SGurchetan Singh __u32 layer_stride; 14962fb7a5eSGerd Hoffmann }; 15062fb7a5eSGerd Hoffmann 15162fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_transfer_from_host { 15229e08b05SGabriel Laskar __u32 bo_handle; 15362fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_box box; 15429e08b05SGabriel Laskar __u32 level; 15529e08b05SGabriel Laskar __u32 offset; 156eda3e101SGurchetan Singh __u32 stride; 157eda3e101SGurchetan Singh __u32 layer_stride; 15862fb7a5eSGerd Hoffmann }; 15962fb7a5eSGerd Hoffmann 16062fb7a5eSGerd Hoffmann #define VIRTGPU_WAIT_NOWAIT 1 /* like it */ 16162fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_wait { 16229e08b05SGabriel Laskar __u32 handle; /* 0 is an invalid handle */ 16329e08b05SGabriel Laskar __u32 flags; 16462fb7a5eSGerd Hoffmann }; 16562fb7a5eSGerd Hoffmann 16662fb7a5eSGerd Hoffmann struct drm_virtgpu_get_caps { 16729e08b05SGabriel Laskar __u32 cap_set_id; 16829e08b05SGabriel Laskar __u32 cap_set_ver; 16929e08b05SGabriel Laskar __u64 addr; 17029e08b05SGabriel Laskar __u32 size; 17129e08b05SGabriel Laskar __u32 pad; 17262fb7a5eSGerd Hoffmann }; 17362fb7a5eSGerd Hoffmann 174eda3e101SGurchetan Singh struct drm_virtgpu_resource_create_blob { 175eda3e101SGurchetan Singh #define VIRTGPU_BLOB_MEM_GUEST 0x0001 176eda3e101SGurchetan Singh #define VIRTGPU_BLOB_MEM_HOST3D 0x0002 177eda3e101SGurchetan Singh #define VIRTGPU_BLOB_MEM_HOST3D_GUEST 0x0003 178eda3e101SGurchetan Singh 179eda3e101SGurchetan Singh #define VIRTGPU_BLOB_FLAG_USE_MAPPABLE 0x0001 180eda3e101SGurchetan Singh #define VIRTGPU_BLOB_FLAG_USE_SHAREABLE 0x0002 181eda3e101SGurchetan Singh #define VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 182eda3e101SGurchetan Singh /* zero is invalid blob_mem */ 183eda3e101SGurchetan Singh __u32 blob_mem; 184eda3e101SGurchetan Singh __u32 blob_flags; 185eda3e101SGurchetan Singh __u32 bo_handle; 186eda3e101SGurchetan Singh __u32 res_handle; 187eda3e101SGurchetan Singh __u64 size; 188eda3e101SGurchetan Singh 189eda3e101SGurchetan Singh /* 190eda3e101SGurchetan Singh * for 3D contexts with VIRTGPU_BLOB_MEM_HOST3D_GUEST and 191eda3e101SGurchetan Singh * VIRTGPU_BLOB_MEM_HOST3D otherwise, must be zero. 192eda3e101SGurchetan Singh */ 193eda3e101SGurchetan Singh __u32 pad; 194eda3e101SGurchetan Singh __u32 cmd_size; 195eda3e101SGurchetan Singh __u64 cmd; 196eda3e101SGurchetan Singh __u64 blob_id; 197eda3e101SGurchetan Singh }; 198eda3e101SGurchetan Singh 199b1079043SGurchetan Singh #define VIRTGPU_CONTEXT_PARAM_CAPSET_ID 0x0001 200b1079043SGurchetan Singh #define VIRTGPU_CONTEXT_PARAM_NUM_RINGS 0x0002 201b1079043SGurchetan Singh #define VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK 0x0003 202*7add8012SGurchetan Singh #define VIRTGPU_CONTEXT_PARAM_DEBUG_NAME 0x0004 203b1079043SGurchetan Singh struct drm_virtgpu_context_set_param { 204b1079043SGurchetan Singh __u64 param; 205b1079043SGurchetan Singh __u64 value; 206b1079043SGurchetan Singh }; 207b1079043SGurchetan Singh 208b1079043SGurchetan Singh struct drm_virtgpu_context_init { 209b1079043SGurchetan Singh __u32 num_params; 210b1079043SGurchetan Singh __u32 pad; 211b1079043SGurchetan Singh 212b1079043SGurchetan Singh /* pointer to drm_virtgpu_context_set_param array */ 213b1079043SGurchetan Singh __u64 ctx_set_params; 214b1079043SGurchetan Singh }; 215b1079043SGurchetan Singh 2167e78781dSGurchetan Singh /* 2177e78781dSGurchetan Singh * Event code that's given when VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK is in 2187e78781dSGurchetan Singh * effect. The event size is sizeof(drm_event), since there is no additional 2197e78781dSGurchetan Singh * payload. 2207e78781dSGurchetan Singh */ 2217e78781dSGurchetan Singh #define VIRTGPU_EVENT_FENCE_SIGNALED 0x90000000 2227e78781dSGurchetan Singh 22362fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_MAP \ 22462fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map) 22562fb7a5eSGerd Hoffmann 22662fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_EXECBUFFER \ 227a56f9c86SRobert Foss DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_EXECBUFFER,\ 22862fb7a5eSGerd Hoffmann struct drm_virtgpu_execbuffer) 22962fb7a5eSGerd Hoffmann 23062fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_GETPARAM \ 23162fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_GETPARAM,\ 23262fb7a5eSGerd Hoffmann struct drm_virtgpu_getparam) 23362fb7a5eSGerd Hoffmann 23462fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_RESOURCE_CREATE \ 23562fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_CREATE, \ 23662fb7a5eSGerd Hoffmann struct drm_virtgpu_resource_create) 23762fb7a5eSGerd Hoffmann 23862fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_RESOURCE_INFO \ 23962fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_INFO, \ 24062fb7a5eSGerd Hoffmann struct drm_virtgpu_resource_info) 24162fb7a5eSGerd Hoffmann 24262fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_TRANSFER_FROM_HOST \ 24362fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_TRANSFER_FROM_HOST, \ 24462fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_transfer_from_host) 24562fb7a5eSGerd Hoffmann 24662fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_TRANSFER_TO_HOST \ 24762fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_TRANSFER_TO_HOST, \ 24862fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_transfer_to_host) 24962fb7a5eSGerd Hoffmann 25062fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_WAIT \ 25162fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_WAIT, \ 25262fb7a5eSGerd Hoffmann struct drm_virtgpu_3d_wait) 25362fb7a5eSGerd Hoffmann 25462fb7a5eSGerd Hoffmann #define DRM_IOCTL_VIRTGPU_GET_CAPS \ 25562fb7a5eSGerd Hoffmann DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_GET_CAPS, \ 25662fb7a5eSGerd Hoffmann struct drm_virtgpu_get_caps) 25762fb7a5eSGerd Hoffmann 258eda3e101SGurchetan Singh #define DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB \ 259eda3e101SGurchetan Singh DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_CREATE_BLOB, \ 260eda3e101SGurchetan Singh struct drm_virtgpu_resource_create_blob) 261eda3e101SGurchetan Singh 262b1079043SGurchetan Singh #define DRM_IOCTL_VIRTGPU_CONTEXT_INIT \ 263b1079043SGurchetan Singh DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_CONTEXT_INIT, \ 264b1079043SGurchetan Singh struct drm_virtgpu_context_init) 265b1079043SGurchetan Singh 26638180815SEmil Velikov #if defined(__cplusplus) 26738180815SEmil Velikov } 26838180815SEmil Velikov #endif 26938180815SEmil Velikov 27062fb7a5eSGerd Hoffmann #endif 271