/**************************************************************************1*2* Copyright © 2009 VMware, Inc., Palo Alto, CA., USA3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR18* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,19* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL20* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,21* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR22* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE23* USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627#ifndef __VMWGFX_DRM_H__28#define __VMWGFX_DRM_H__2930#define DRM_VMW_MAX_SURFACE_FACES 631#define DRM_VMW_MAX_MIP_LEVELS 243233#define DRM_VMW_EXT_NAME_LEN 1283435#define DRM_VMW_GET_PARAM 036#define DRM_VMW_ALLOC_DMABUF 137#define DRM_VMW_UNREF_DMABUF 238#define DRM_VMW_CURSOR_BYPASS 339/* guarded by DRM_VMW_PARAM_NUM_STREAMS != 0*/40#define DRM_VMW_CONTROL_STREAM 441#define DRM_VMW_CLAIM_STREAM 542#define DRM_VMW_UNREF_STREAM 643/* guarded by DRM_VMW_PARAM_3D == 1 */44#define DRM_VMW_CREATE_CONTEXT 745#define DRM_VMW_UNREF_CONTEXT 846#define DRM_VMW_CREATE_SURFACE 947#define DRM_VMW_UNREF_SURFACE 1048#define DRM_VMW_REF_SURFACE 1149#define DRM_VMW_EXECBUF 1250#define DRM_VMW_FIFO_DEBUG 1351#define DRM_VMW_FENCE_WAIT 1452/* guarded by minor version >= 2 */53#define DRM_VMW_UPDATE_LAYOUT 15545556/*************************************************************************/57/**58* DRM_VMW_GET_PARAM - get device information.59*60* DRM_VMW_PARAM_FIFO_OFFSET:61* Offset to use to map the first page of the FIFO read-only.62* The fifo is mapped using the mmap() system call on the drm device.63*64* DRM_VMW_PARAM_OVERLAY_IOCTL:65* Does the driver support the overlay ioctl.66*/6768#define DRM_VMW_PARAM_NUM_STREAMS 069#define DRM_VMW_PARAM_NUM_FREE_STREAMS 170#define DRM_VMW_PARAM_3D 271#define DRM_VMW_PARAM_FIFO_OFFSET 372#define DRM_VMW_PARAM_HW_CAPS 473#define DRM_VMW_PARAM_FIFO_CAPS 574#define DRM_VMW_PARAM_MAX_FB_SIZE 67576/**77* struct drm_vmw_getparam_arg78*79* @value: Returned value. //Out80* @param: Parameter to query. //In.81*82* Argument to the DRM_VMW_GET_PARAM Ioctl.83*/8485struct drm_vmw_getparam_arg {86uint64_t value;87uint32_t param;88uint32_t pad64;89};9091/*************************************************************************/92/**93* DRM_VMW_EXTENSION - Query device extensions.94*/9596/**97* struct drm_vmw_extension_rep98*99* @exists: The queried extension exists.100* @driver_ioctl_offset: Ioctl number of the first ioctl in the extension.101* @driver_sarea_offset: Offset to any space in the DRI SAREA102* used by the extension.103* @major: Major version number of the extension.104* @minor: Minor version number of the extension.105* @pl: Patch level version number of the extension.106*107* Output argument to the DRM_VMW_EXTENSION Ioctl.108*/109110struct drm_vmw_extension_rep {111int32_t exists;112uint32_t driver_ioctl_offset;113uint32_t driver_sarea_offset;114uint32_t major;115uint32_t minor;116uint32_t pl;117uint32_t pad64;118};119120/**121* union drm_vmw_extension_arg122*123* @extension - Ascii name of the extension to be queried. //In124* @rep - Reply as defined above. //Out125*126* Argument to the DRM_VMW_EXTENSION Ioctl.127*/128129union drm_vmw_extension_arg {130char extension[DRM_VMW_EXT_NAME_LEN];131struct drm_vmw_extension_rep rep;132};133134/*************************************************************************/135/**136* DRM_VMW_CREATE_CONTEXT - Create a host context.137*138* Allocates a device unique context id, and queues a create context command139* for the host. Does not wait for host completion.140*/141142/**143* struct drm_vmw_context_arg144*145* @cid: Device unique context ID.146*147* Output argument to the DRM_VMW_CREATE_CONTEXT Ioctl.148* Input argument to the DRM_VMW_UNREF_CONTEXT Ioctl.149*/150151struct drm_vmw_context_arg {152int32_t cid;153uint32_t pad64;154};155156/*************************************************************************/157/**158* DRM_VMW_UNREF_CONTEXT - Create a host context.159*160* Frees a global context id, and queues a destroy host command for the host.161* Does not wait for host completion. The context ID can be used directly162* in the command stream and shows up as the same context ID on the host.163*/164165/*************************************************************************/166/**167* DRM_VMW_CREATE_SURFACE - Create a host suface.168*169* Allocates a device unique surface id, and queues a create surface command170* for the host. Does not wait for host completion. The surface ID can be171* used directly in the command stream and shows up as the same surface172* ID on the host.173*/174175/**176* struct drm_wmv_surface_create_req177*178* @flags: Surface flags as understood by the host.179* @format: Surface format as understood by the host.180* @mip_levels: Number of mip levels for each face.181* An unused face should have 0 encoded.182* @size_addr: Address of a user-space array of sruct drm_vmw_size183* cast to an uint64_t for 32-64 bit compatibility.184* The size of the array should equal the total number of mipmap levels.185* @shareable: Boolean whether other clients (as identified by file descriptors)186* may reference this surface.187* @scanout: Boolean whether the surface is intended to be used as a188* scanout.189*190* Input data to the DRM_VMW_CREATE_SURFACE Ioctl.191* Output data from the DRM_VMW_REF_SURFACE Ioctl.192*/193194struct drm_vmw_surface_create_req {195uint32_t flags;196uint32_t format;197uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES];198uint64_t size_addr;199int32_t shareable;200int32_t scanout;201};202203/**204* struct drm_wmv_surface_arg205*206* @sid: Surface id of created surface or surface to destroy or reference.207*208* Output data from the DRM_VMW_CREATE_SURFACE Ioctl.209* Input argument to the DRM_VMW_UNREF_SURFACE Ioctl.210* Input argument to the DRM_VMW_REF_SURFACE Ioctl.211*/212213struct drm_vmw_surface_arg {214int32_t sid;215uint32_t pad64;216};217218/**219* struct drm_vmw_size ioctl.220*221* @width - mip level width222* @height - mip level height223* @depth - mip level depth224*225* Description of a mip level.226* Input data to the DRM_WMW_CREATE_SURFACE Ioctl.227*/228229struct drm_vmw_size {230uint32_t width;231uint32_t height;232uint32_t depth;233uint32_t pad64;234};235236/**237* union drm_vmw_surface_create_arg238*239* @rep: Output data as described above.240* @req: Input data as described above.241*242* Argument to the DRM_VMW_CREATE_SURFACE Ioctl.243*/244245union drm_vmw_surface_create_arg {246struct drm_vmw_surface_arg rep;247struct drm_vmw_surface_create_req req;248};249250/*************************************************************************/251/**252* DRM_VMW_REF_SURFACE - Reference a host surface.253*254* Puts a reference on a host surface with a give sid, as previously255* returned by the DRM_VMW_CREATE_SURFACE ioctl.256* A reference will make sure the surface isn't destroyed while we hold257* it and will allow the calling client to use the surface ID in the command258* stream.259*260* On successful return, the Ioctl returns the surface information given261* in the DRM_VMW_CREATE_SURFACE ioctl.262*/263264/**265* union drm_vmw_surface_reference_arg266*267* @rep: Output data as described above.268* @req: Input data as described above.269*270* Argument to the DRM_VMW_REF_SURFACE Ioctl.271*/272273union drm_vmw_surface_reference_arg {274struct drm_vmw_surface_create_req rep;275struct drm_vmw_surface_arg req;276};277278/*************************************************************************/279/**280* DRM_VMW_UNREF_SURFACE - Unreference a host surface.281*282* Clear a reference previously put on a host surface.283* When all references are gone, including the one implicitly placed284* on creation,285* a destroy surface command will be queued for the host.286* Does not wait for completion.287*/288289/*************************************************************************/290/**291* DRM_VMW_EXECBUF292*293* Submit a command buffer for execution on the host, and return a294* fence sequence that when signaled, indicates that the command buffer has295* executed.296*/297298/**299* struct drm_vmw_execbuf_arg300*301* @commands: User-space address of a command buffer cast to an uint64_t.302* @command-size: Size in bytes of the command buffer.303* @throttle-us: Sleep until software is less than @throttle_us304* microseconds ahead of hardware. The driver may round this value305* to the nearest kernel tick.306* @fence_rep: User-space address of a struct drm_vmw_fence_rep cast to an307* uint64_t.308* @version: Allows expanding the execbuf ioctl parameters without breaking309* backwards compatibility, since user-space will always tell the kernel310* which version it uses.311* @flags: Execbuf flags. None currently.312*313* Argument to the DRM_VMW_EXECBUF Ioctl.314*/315316#define DRM_VMW_EXECBUF_VERSION 0317318struct drm_vmw_execbuf_arg {319uint64_t commands;320uint32_t command_size;321uint32_t throttle_us;322uint64_t fence_rep;323uint32_t version;324uint32_t flags;325};326327/**328* struct drm_vmw_fence_rep329*330* @fence_seq: Fence sequence associated with a command submission.331* @error: This member should've been set to -EFAULT on submission.332* The following actions should be take on completion:333* error == -EFAULT: Fence communication failed. The host is synchronized.334* Use the last fence id read from the FIFO fence register.335* error != 0 && error != -EFAULT:336* Fence submission failed. The host is synchronized. Use the fence_seq member.337* error == 0: All is OK, The host may not be synchronized.338* Use the fence_seq member.339*340* Input / Output data to the DRM_VMW_EXECBUF Ioctl.341*/342343struct drm_vmw_fence_rep {344uint64_t fence_seq;345int32_t error;346uint32_t pad64;347};348349/*************************************************************************/350/**351* DRM_VMW_ALLOC_DMABUF352*353* Allocate a DMA buffer that is visible also to the host.354* NOTE: The buffer is355* identified by a handle and an offset, which are private to the guest, but356* useable in the command stream. The guest kernel may translate these357* and patch up the command stream accordingly. In the future, the offset may358* be zero at all times, or it may disappear from the interface before it is359* fixed.360*361* The DMA buffer may stay user-space mapped in the guest at all times,362* and is thus suitable for sub-allocation.363*364* DMA buffers are mapped using the mmap() syscall on the drm device.365*/366367/**368* struct drm_vmw_alloc_dmabuf_req369*370* @size: Required minimum size of the buffer.371*372* Input data to the DRM_VMW_ALLOC_DMABUF Ioctl.373*/374375struct drm_vmw_alloc_dmabuf_req {376uint32_t size;377uint32_t pad64;378};379380/**381* struct drm_vmw_dmabuf_rep382*383* @map_handle: Offset to use in the mmap() call used to map the buffer.384* @handle: Handle unique to this buffer. Used for unreferencing.385* @cur_gmr_id: GMR id to use in the command stream when this buffer is386* referenced. See not above.387* @cur_gmr_offset: Offset to use in the command stream when this buffer is388* referenced. See note above.389*390* Output data from the DRM_VMW_ALLOC_DMABUF Ioctl.391*/392393struct drm_vmw_dmabuf_rep {394uint64_t map_handle;395uint32_t handle;396uint32_t cur_gmr_id;397uint32_t cur_gmr_offset;398uint32_t pad64;399};400401/**402* union drm_vmw_dmabuf_arg403*404* @req: Input data as described above.405* @rep: Output data as described above.406*407* Argument to the DRM_VMW_ALLOC_DMABUF Ioctl.408*/409410union drm_vmw_alloc_dmabuf_arg {411struct drm_vmw_alloc_dmabuf_req req;412struct drm_vmw_dmabuf_rep rep;413};414415/*************************************************************************/416/**417* DRM_VMW_UNREF_DMABUF - Free a DMA buffer.418*419*/420421/**422* struct drm_vmw_unref_dmabuf_arg423*424* @handle: Handle indicating what buffer to free. Obtained from the425* DRM_VMW_ALLOC_DMABUF Ioctl.426*427* Argument to the DRM_VMW_UNREF_DMABUF Ioctl.428*/429430struct drm_vmw_unref_dmabuf_arg {431uint32_t handle;432uint32_t pad64;433};434435/*************************************************************************/436/**437* DRM_VMW_FIFO_DEBUG - Get last FIFO submission.438*439* This IOCTL copies the last FIFO submission directly out of the FIFO buffer.440*/441442/**443* struct drm_vmw_fifo_debug_arg444*445* @debug_buffer: User space address of a debug_buffer cast to an uint64_t //In446* @debug_buffer_size: Size in bytes of debug buffer //In447* @used_size: Number of bytes copied to the buffer // Out448* @did_not_fit: Boolean indicating that the fifo contents did not fit. //Out449*450* Argument to the DRM_VMW_FIFO_DEBUG Ioctl.451*/452453struct drm_vmw_fifo_debug_arg {454uint64_t debug_buffer;455uint32_t debug_buffer_size;456uint32_t used_size;457int32_t did_not_fit;458uint32_t pad64;459};460461struct drm_vmw_fence_wait_arg {462uint64_t sequence;463uint64_t kernel_cookie;464int32_t cookie_valid;465int32_t pad64;466};467468/*************************************************************************/469/**470* DRM_VMW_CONTROL_STREAM - Control overlays, aka streams.471*472* This IOCTL controls the overlay units of the svga device.473* The SVGA overlay units does not work like regular hardware units in474* that they do not automaticaly read back the contents of the given dma475* buffer. But instead only read back for each call to this ioctl, and476* at any point between this call being made and a following call that477* either changes the buffer or disables the stream.478*/479480/**481* struct drm_vmw_rect482*483* Defines a rectangle. Used in the overlay ioctl to define484* source and destination rectangle.485*/486487struct drm_vmw_rect {488int32_t x;489int32_t y;490uint32_t w;491uint32_t h;492};493494/**495* struct drm_vmw_control_stream_arg496*497* @stream_id: Stearm to control498* @enabled: If false all following arguments are ignored.499* @handle: Handle to buffer for getting data from.500* @format: Format of the overlay as understood by the host.501* @width: Width of the overlay.502* @height: Height of the overlay.503* @size: Size of the overlay in bytes.504* @pitch: Array of pitches, the two last are only used for YUV12 formats.505* @offset: Offset from start of dma buffer to overlay.506* @src: Source rect, must be within the defined area above.507* @dst: Destination rect, x and y may be negative.508*509* Argument to the DRM_VMW_CONTROL_STREAM Ioctl.510*/511512struct drm_vmw_control_stream_arg {513uint32_t stream_id;514uint32_t enabled;515516uint32_t flags;517uint32_t color_key;518519uint32_t handle;520uint32_t offset;521int32_t format;522uint32_t size;523uint32_t width;524uint32_t height;525uint32_t pitch[3];526527uint32_t pad64;528struct drm_vmw_rect src;529struct drm_vmw_rect dst;530};531532/*************************************************************************/533/**534* DRM_VMW_CURSOR_BYPASS - Give extra information about cursor bypass.535*536*/537538#define DRM_VMW_CURSOR_BYPASS_ALL (1 << 0)539#define DRM_VMW_CURSOR_BYPASS_FLAGS (1)540541/**542* struct drm_vmw_cursor_bypass_arg543*544* @flags: Flags.545* @crtc_id: Crtc id, only used if DMR_CURSOR_BYPASS_ALL isn't passed.546* @xpos: X position of cursor.547* @ypos: Y position of cursor.548* @xhot: X hotspot.549* @yhot: Y hotspot.550*551* Argument to the DRM_VMW_CURSOR_BYPASS Ioctl.552*/553554struct drm_vmw_cursor_bypass_arg {555uint32_t flags;556uint32_t crtc_id;557int32_t xpos;558int32_t ypos;559int32_t xhot;560int32_t yhot;561};562563/*************************************************************************/564/**565* DRM_VMW_CLAIM_STREAM - Claim a single stream.566*/567568/**569* struct drm_vmw_context_arg570*571* @stream_id: Device unique context ID.572*573* Output argument to the DRM_VMW_CREATE_CONTEXT Ioctl.574* Input argument to the DRM_VMW_UNREF_CONTEXT Ioctl.575*/576577struct drm_vmw_stream_arg {578uint32_t stream_id;579uint32_t pad64;580};581582/*************************************************************************/583/**584* DRM_VMW_UNREF_STREAM - Unclaim a stream.585*586* Return a single stream that was claimed by this process. Also makes587* sure that the stream has been stopped.588*/589590/*************************************************************************/591/**592* DRM_VMW_UPDATE_LAYOUT - Update layout593*594* Updates the preferred modes and connection status for connectors. The595* command conisits of one drm_vmw_update_layout_arg pointing out a array596* of num_outputs drm_vmw_rect's.597*/598599/**600* struct drm_vmw_update_layout_arg601*602* @num_outputs: number of active603* @rects: pointer to array of drm_vmw_rect604*605* Input argument to the DRM_VMW_UPDATE_LAYOUT Ioctl.606*/607608struct drm_vmw_update_layout_arg {609uint32_t num_outputs;610uint32_t pad64;611uint64_t rects;612};613614#endif615616617