13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2009 VMware, Inc.  All rights reserved.
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy,
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions:
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software.
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE.
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * @file
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Wrappers for DRM ioctl functionlaity used by the rest of the vmw
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * drm winsys.
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Based on svgaicd_escape.c
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h"
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h"
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h"
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svgadump/svga_dump.h"
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_screen.h"
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_context.h"
42e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom#include "vmw_fence.h"
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "xf86drm.h"
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmwgfx_drm.h"
45e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom#include "svga3d_caps.h"
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
471284d5b25507a56634519ac385cbc00a00b94417Chia-I Wu#include "os/os_mman.h"
481284d5b25507a56634519ac385cbc00a00b94417Chia-I Wu
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <errno.h>
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <unistd.h>
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_region
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAGuestPtr ptr;
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t handle;
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint64_t map_handle;
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   void *data;
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t map_count;
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int drm_fd;
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t size;
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
636ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz/* XXX: This isn't a real hardware flag, but just a hack for kernel to
646ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz * know about primary surfaces. In newer versions of the kernel
656ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz * interface the driver uses a special field.
666ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz */
676ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz#define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9)
686ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzuint32
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_context_create(struct vmw_winsys_screen *vws)
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_context_arg c_arg;
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandRead(vws->ioctl.drm_fd, DRM_VMW_CREATE_CONTEXT,
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			&c_arg, sizeof(c_arg));
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret)
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return -1;
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("Context id is %d\n", c_arg.cid);
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return c_arg.cid;
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_context_destroy(struct vmw_winsys_screen *vws, uint32 cid)
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_context_arg c_arg;
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&c_arg, 0, sizeof(c_arg));
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   c_arg.cid = cid;
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_UNREF_CONTEXT,
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			 &c_arg, sizeof(c_arg));
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzuint32
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_surface_create(struct vmw_winsys_screen *vws,
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      SVGA3dSurfaceFlags flags,
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      SVGA3dSurfaceFormat format,
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      SVGA3dSize size,
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      uint32_t numFaces, uint32_t numMipLevels)
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union drm_vmw_surface_create_arg s_arg;
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_surface_create_req *req = &s_arg.req;
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_surface_arg *rep = &s_arg.rep;
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_size sizes[DRM_VMW_MAX_SURFACE_FACES*
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     DRM_VMW_MAX_MIP_LEVELS];
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_size *cur_size;
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t iFace;
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t iMipLevel;
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s flags %d format %d\n", __FUNCTION__, flags, format);
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&s_arg, 0, sizeof(s_arg));
1236ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz   if (vws->use_old_scanout_flag &&
1246a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz       (flags & SVGA3D_SURFACE_HINT_SCANOUT)) {
1256a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz      req->flags = (uint32_t) flags;
1266ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->scanout = false;
1276a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz   } else if (flags & SVGA3D_SURFACE_HINT_SCANOUT) {
1286ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->flags = (uint32_t) (flags & ~SVGA3D_SURFACE_HINT_SCANOUT);
1296a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz      req->scanout = true;
1306ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz   } else {
1316ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->flags = (uint32_t) flags;
1326ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->scanout = false;
1336ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz   }
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->format = (uint32_t) format;
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->shareable = 1;
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   assert(numFaces * numMipLevels < DRM_VMW_MAX_SURFACE_FACES*
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	  DRM_VMW_MAX_MIP_LEVELS);
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cur_size = sizes;
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (iFace = 0; iFace < numFaces; ++iFace) {
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      SVGA3dSize mipSize = size;
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      req->mip_levels[iFace] = numMipLevels;
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      for (iMipLevel = 0; iMipLevel < numMipLevels; ++iMipLevel) {
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size->width = mipSize.width;
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size->height = mipSize.height;
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size->depth = mipSize.depth;
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 mipSize.width = MAX2(mipSize.width >> 1, 1);
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 mipSize.height = MAX2(mipSize.height >> 1, 1);
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 mipSize.depth = MAX2(mipSize.depth >> 1, 1);
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size++;
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (iFace = numFaces; iFace < SVGA3D_MAX_SURFACE_FACES; ++iFace) {
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      req->mip_levels[iFace] = 0;
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->size_addr = (unsigned long)&sizes;
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_CREATE_SURFACE,
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     &s_arg, sizeof(s_arg));
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret)
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return -1;
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("Surface id is %d\n", rep->sid);
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return rep->sid;
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_surface_destroy(struct vmw_winsys_screen *vws, uint32 sid)
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_surface_arg s_arg;
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&s_arg, 0, sizeof(s_arg));
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   s_arg.sid = sid;
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_UNREF_SURFACE,
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			 &s_arg, sizeof(s_arg));
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
186d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstromvmw_ioctl_command(struct vmw_winsys_screen *vws, int32_t cid,
187d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom		  uint32_t throttle_us, void *commands, uint32_t size,
188e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom		  struct pipe_fence_handle **pfence)
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_execbuf_arg arg;
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_fence_rep rep;
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifdef DEBUG
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   {
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      static boolean firsttime = TRUE;
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      static boolean debug = FALSE;
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      static boolean skip = FALSE;
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (firsttime) {
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         debug = debug_get_bool_option("SVGA_DUMP_CMD", FALSE);
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         skip = debug_get_bool_option("SVGA_SKIP_CMD", FALSE);
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (debug) {
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         VMW_FUNC;
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         svga_dump_commands(commands, size);
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      firsttime = FALSE;
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (skip) {
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         size = 0;
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&rep, 0, sizeof(rep));
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rep.error = -EFAULT;
218e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (pfence)
219e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      arg.fence_rep = (unsigned long)&rep;
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.commands = (unsigned long)commands;
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.command_size = size;
222d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom   arg.throttle_us = throttle_us;
223e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.version = DRM_VMW_EXECBUF_VERSION;
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   do {
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       ret = drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_EXECBUF, &arg, sizeof(arg));
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } while(ret == -ERESTART);
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("%s error %s.\n", __FUNCTION__, strerror(-ret));
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
231e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (rep.error) {
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /*
235e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom       * Kernel has already synced, or caller requested no fence.
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
237e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      if (pfence)
238e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	 *pfence = NULL;
239e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   } else {
240e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      if (pfence) {
241e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	 *pfence = vmw_fence_create(rep.handle, rep.mask);
242e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
243e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	 if (*pfence == NULL) {
244e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	    /*
245e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	     * Fence creation failed. Need to sync.
246e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	     */
247e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	    (void) vmw_ioctl_fence_finish(vws, rep.handle, rep.mask);
248e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	    vmw_ioctl_fence_unref(vws, rep.handle);
249e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	 }
250e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      }
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_region *
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_create(struct vmw_winsys_screen *vws, uint32_t size)
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_region *region;
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union drm_vmw_alloc_dmabuf_arg arg;
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_alloc_dmabuf_req *req = &arg.req;
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_dmabuf_rep *rep = &arg.rep;
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: size = %u\n", __FUNCTION__, size);
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region = CALLOC_STRUCT(vmw_region);
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (!region)
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto out_err1;
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->size = size;
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   do {
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_ALLOC_DMABUF, &arg,
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				sizeof(arg));
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } while (ret == -ERESTART);
2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("IOCTL failed %d: %s\n", ret, strerror(-ret));
2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto out_err1;
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->ptr.gmrId = rep->cur_gmr_id;
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->ptr.offset = rep->cur_gmr_offset;
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->data = NULL;
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->handle = rep->handle;
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->map_handle = rep->map_handle;
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->map_count = 0;
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->size = size;
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->drm_fd = vws->ioctl.drm_fd;
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("   gmrId = %u, offset = %u\n",
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return region;
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz out_err1:
297b62a74d3b94024bc08b31394f827761d354d2516Vinson Lee   FREE(region);
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return NULL;
2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_destroy(struct vmw_region *region)
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_unref_dmabuf_arg arg;
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (region->data) {
3101284d5b25507a56634519ac385cbc00a00b94417Chia-I Wu      os_munmap(region->data, region->size);
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      region->data = NULL;
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.handle = region->handle;
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   drmCommandWrite(region->drm_fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg));
3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   FREE(region);
3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3213192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGAGuestPtr
3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_ptr(struct vmw_region *region)
3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return region->ptr;
3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid *
3283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_map(struct vmw_region *region)
3293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   void *map;
3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (region->data == NULL) {
3361284d5b25507a56634519ac385cbc00a00b94417Chia-I Wu      map = os_mmap(NULL, region->size, PROT_READ | PROT_WRITE, MAP_SHARED,
3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		 region->drm_fd, region->map_handle);
3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (map == MAP_FAILED) {
3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 debug_printf("%s: Map failed.\n", __FUNCTION__);
3403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 return NULL;
3413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
3423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      region->data = map;
3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ++region->map_count;
3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return region->data;
3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
3523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_unmap(struct vmw_region *region)
3533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
3553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
3563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   --region->map_count;
3573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
359e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvoid
360e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_ioctl_fence_unref(struct vmw_winsys_screen *vws,
361e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom		      uint32_t handle)
3623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
363e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   struct drm_vmw_fence_arg arg;
364e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   int ret;
3653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
366e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   memset(&arg, 0, sizeof(arg));
367e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.handle = handle;
3683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
369e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   ret = drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_FENCE_UNREF,
370e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom			 &arg, sizeof(arg));
371e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (ret != 0)
372e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      debug_printf("%s Failed\n", __FUNCTION__);
373e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom}
3743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
375e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromstatic INLINE uint32_t
376e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_drm_fence_flags(uint32_t flags)
3773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
378e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom    uint32_t dflags = 0;
3793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
380e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom    if (flags & SVGA_FENCE_FLAG_EXEC)
381e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	dflags |= DRM_VMW_FENCE_FLAG_EXEC;
382e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom    if (flags & SVGA_FENCE_FLAG_QUERY)
383e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	dflags |= DRM_VMW_FENCE_FLAG_QUERY;
384e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
385e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom    return dflags;
386e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom}
3873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
389e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromint
390e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstromvmw_ioctl_fence_signalled(struct vmw_winsys_screen *vws,
391e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom			  uint32_t handle,
392e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom			  uint32_t flags)
393e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom{
394e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   struct drm_vmw_fence_signaled_arg arg;
395e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   uint32_t vflags = vmw_drm_fence_flags(flags);
396e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   int ret;
3973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
399e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.handle = handle;
400e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.flags = vflags;
4013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
402e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_FENCE_SIGNALED,
403e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom			     &arg, sizeof(arg));
404e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
405e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (ret != 0)
406e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      return ret;
407e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
408e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   return (arg.signaled) ? 0 : -1;
4093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
412e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
4133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzint
4143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_fence_finish(struct vmw_winsys_screen *vws,
415e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom                       uint32_t handle,
416e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom		       uint32_t flags)
4173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
418e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   struct drm_vmw_fence_wait_arg arg;
419e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   uint32_t vflags = vmw_drm_fence_flags(flags);
420e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   int ret;
421e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
422e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   memset(&arg, 0, sizeof(arg));
423e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
424e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.handle = handle;
425e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.timeout_us = 10*1000000;
426e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.lazy = 0;
427e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   arg.flags = vflags;
428e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
429e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_FENCE_WAIT,
430e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom			     &arg, sizeof(arg));
431e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
432e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (ret != 0)
433e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      debug_printf("%s Failed\n", __FUNCTION__);
4343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return 0;
4363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzboolean
4403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_init(struct vmw_winsys_screen *vws)
4413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_getparam_arg gp_arg;
443e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   struct drm_vmw_get_3d_cap_arg cap_arg;
444e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   unsigned int size;
4453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
4463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
4483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&gp_arg, 0, sizeof(gp_arg));
45049e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   gp_arg.param = DRM_VMW_PARAM_3D;
45149e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
45249e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz			     &gp_arg, sizeof(gp_arg));
45349e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   if (ret || gp_arg.value == 0) {
454e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      debug_printf("No 3D enabled (%i, %s).\n", ret, strerror(-ret));
455e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      goto out_no_3d;
45649e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   }
45749e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz
45849e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   memset(&gp_arg, 0, sizeof(gp_arg));
459e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   gp_arg.param = DRM_VMW_PARAM_FIFO_HW_VERSION;
4603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
4613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     &gp_arg, sizeof(gp_arg));
4623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
463e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      debug_printf("Failed to get fifo hw version"
464e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom		   " (%i, %s).\n", ret, strerror(-ret));
465e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      goto out_no_3d;
466e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   }
467e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   vws->ioctl.hwversion = gp_arg.value;
468e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
469e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   size = SVGA_FIFO_3D_CAPS_SIZE * sizeof(uint32_t);
470e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   vws->ioctl.buffer = calloc(1, size);
471e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (!vws->ioctl.buffer) {
472e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      debug_printf("Failed alloc fifo 3D caps buffer.\n");
473e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      goto out_no_3d;
4743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
476e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   memset(&cap_arg, 0, sizeof(cap_arg));
477e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   cap_arg.buffer = (uint64_t) (unsigned long) (vws->ioctl.buffer);
478e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   cap_arg.max_size = size;
4793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
480e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   ret = drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_GET_3D_CAP,
481e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom			 &cap_arg, sizeof(cap_arg));
482e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
483e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (ret) {
484e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      debug_printf("Failed to get 3D capabilities"
485e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom		   " (%i, %s).\n", ret, strerror(-ret));
486e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      goto out_no_caps;
487e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   }
4883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s OK\n", __FUNCTION__);
4903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
491e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom  out_no_caps:
492e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   free(vws->ioctl.buffer);
493e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom  out_no_3d:
4943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   debug_printf("%s Failed\n", __FUNCTION__);
4953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return FALSE;
4963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
5013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_cleanup(struct vmw_winsys_screen *vws)
5023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
5033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
5043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
505