vmw_screen_ioctl.c revision d12f2bb9c03a9e8a08824c849200f5b23c05914c
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"
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "xf86drm.h"
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmwgfx_drm.h"
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <sys/mman.h>
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <errno.h>
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include <unistd.h>
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_region
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGAGuestPtr ptr;
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t handle;
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint64_t map_handle;
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   void *data;
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t map_count;
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int drm_fd;
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t size;
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
606ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz/* XXX: This isn't a real hardware flag, but just a hack for kernel to
616ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz * know about primary surfaces. In newer versions of the kernel
626ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz * interface the driver uses a special field.
636ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz */
646ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz#define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9)
656ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_check_last_cmd(struct vmw_winsys_screen *vws)
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   static uint32_t buffer[16384];
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_fifo_debug_arg arg;
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return;
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.debug_buffer = (unsigned long)buffer;
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.debug_buffer_size = 65536;
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_FIFO_DEBUG,
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     &arg, sizeof(arg));
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("%s Ioctl error: \"%s\".\n", __FUNCTION__, strerror(-ret));
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return;
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (arg.did_not_fit) {
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("%s Command did not fit completely.\n", __FUNCTION__);
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga_dump_commands(buffer, arg.used_size);
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_fifo_unmap(struct vmw_winsys_screen *vws, void *mapping)
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)munmap(mapping, getpagesize());
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void *
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_fifo_map(struct vmw_winsys_screen *vws,
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                   uint32_t fifo_offset )
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   void *map;
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   map = mmap(NULL, getpagesize(), PROT_READ, MAP_SHARED,
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	      vws->ioctl.drm_fd, fifo_offset);
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (map == MAP_FAILED) {
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("Map failed %s\n", strerror(errno));
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return NULL;
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("Fifo (min) is 0x%08x\n", ((uint32_t *) map)[SVGA_FIFO_MIN]);
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return map;
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzuint32
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_context_create(struct vmw_winsys_screen *vws)
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_context_arg c_arg;
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandRead(vws->ioctl.drm_fd, DRM_VMW_CREATE_CONTEXT,
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			&c_arg, sizeof(c_arg));
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret)
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return -1;
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_check_last_cmd(vws);
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("Context id is %d\n", c_arg.cid);
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return c_arg.cid;
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_context_destroy(struct vmw_winsys_screen *vws, uint32 cid)
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_context_arg c_arg;
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&c_arg, 0, sizeof(c_arg));
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   c_arg.cid = cid;
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_UNREF_CONTEXT,
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			 &c_arg, sizeof(c_arg));
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_check_last_cmd(vws);
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzuint32
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_surface_create(struct vmw_winsys_screen *vws,
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      SVGA3dSurfaceFlags flags,
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      SVGA3dSurfaceFormat format,
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      SVGA3dSize size,
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			      uint32_t numFaces, uint32_t numMipLevels)
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union drm_vmw_surface_create_arg s_arg;
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_surface_create_req *req = &s_arg.req;
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_surface_arg *rep = &s_arg.rep;
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_size sizes[DRM_VMW_MAX_SURFACE_FACES*
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     DRM_VMW_MAX_MIP_LEVELS];
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_size *cur_size;
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t iFace;
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t iMipLevel;
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s flags %d format %d\n", __FUNCTION__, flags, format);
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&s_arg, 0, sizeof(s_arg));
1786ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz   if (vws->use_old_scanout_flag &&
1796a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz       (flags & SVGA3D_SURFACE_HINT_SCANOUT)) {
1806a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz      req->flags = (uint32_t) flags;
1816ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->scanout = false;
1826a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz   } else if (flags & SVGA3D_SURFACE_HINT_SCANOUT) {
1836ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->flags = (uint32_t) (flags & ~SVGA3D_SURFACE_HINT_SCANOUT);
1846a4cd124af9175832e506888e504d9195bf614b7Jakob Bornecrantz      req->scanout = true;
1856ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz   } else {
1866ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->flags = (uint32_t) flags;
1876ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz      req->scanout = false;
1886ffb6318a05f0e6405645a155cd32e5cfbdbc2ffJakob Bornecrantz   }
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->format = (uint32_t) format;
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->shareable = 1;
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   assert(numFaces * numMipLevels < DRM_VMW_MAX_SURFACE_FACES*
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	  DRM_VMW_MAX_MIP_LEVELS);
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cur_size = sizes;
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (iFace = 0; iFace < numFaces; ++iFace) {
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      SVGA3dSize mipSize = size;
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      req->mip_levels[iFace] = numMipLevels;
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      for (iMipLevel = 0; iMipLevel < numMipLevels; ++iMipLevel) {
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size->width = mipSize.width;
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size->height = mipSize.height;
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size->depth = mipSize.depth;
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 mipSize.width = MAX2(mipSize.width >> 1, 1);
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 mipSize.height = MAX2(mipSize.height >> 1, 1);
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 mipSize.depth = MAX2(mipSize.depth >> 1, 1);
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 cur_size++;
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (iFace = numFaces; iFace < SVGA3D_MAX_SURFACE_FACES; ++iFace) {
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      req->mip_levels[iFace] = 0;
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->size_addr = (unsigned long)&sizes;
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_CREATE_SURFACE,
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     &s_arg, sizeof(s_arg));
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret)
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return -1;
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("Surface id is %d\n", rep->sid);
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_check_last_cmd(vws);
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return rep->sid;
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_surface_destroy(struct vmw_winsys_screen *vws, uint32 sid)
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_surface_arg s_arg;
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&s_arg, 0, sizeof(s_arg));
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   s_arg.sid = sid;
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_UNREF_SURFACE,
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			 &s_arg, sizeof(s_arg));
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_check_last_cmd(vws);
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
244d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstromvmw_ioctl_command(struct vmw_winsys_screen *vws, int32_t cid,
245d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom		  uint32_t throttle_us, void *commands, uint32_t size,
246d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom		  uint32_t *pfence)
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_execbuf_arg arg;
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_fence_rep rep;
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifdef DEBUG
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   {
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      static boolean firsttime = TRUE;
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      static boolean debug = FALSE;
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      static boolean skip = FALSE;
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (firsttime) {
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         debug = debug_get_bool_option("SVGA_DUMP_CMD", FALSE);
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         skip = debug_get_bool_option("SVGA_SKIP_CMD", FALSE);
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (debug) {
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         VMW_FUNC;
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         svga_dump_commands(commands, size);
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      firsttime = FALSE;
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (skip) {
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         size = 0;
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&rep, 0, sizeof(rep));
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rep.error = -EFAULT;
2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.fence_rep = (unsigned long)&rep;
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.commands = (unsigned long)commands;
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.command_size = size;
279d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom   arg.throttle_us = throttle_us;
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   do {
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       ret = drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_EXECBUF, &arg, sizeof(arg));
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } while(ret == -ERESTART);
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("%s error %s.\n", __FUNCTION__, strerror(-ret));
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (rep.error) {
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /*
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * Kernel has synced and put the last fence sequence in the FIFO
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * register.
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (rep.error == -EFAULT)
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 rep.fence_seq = vws->ioctl.fifo_map[SVGA_FIFO_FENCE];
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("%s Fence error %s.\n", __FUNCTION__,
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		   strerror(-rep.error));
2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->ioctl.last_fence = rep.fence_seq;
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (pfence)
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      *pfence = rep.fence_seq;
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_check_last_cmd(vws);
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct vmw_region *
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_create(struct vmw_winsys_screen *vws, uint32_t size)
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_region *region;
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   union drm_vmw_alloc_dmabuf_arg arg;
3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_alloc_dmabuf_req *req = &arg.req;
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_dmabuf_rep *rep = &arg.rep;
3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: size = %u\n", __FUNCTION__, size);
3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region = CALLOC_STRUCT(vmw_region);
3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (!region)
3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto out_err1;
3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   req->size = size;
3273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   do {
3283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_ALLOC_DMABUF, &arg,
3293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				sizeof(arg));
3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } while (ret == -ERESTART);
3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("IOCTL failed %d: %s\n", ret, strerror(-ret));
3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto out_err1;
3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->ptr.gmrId = rep->cur_gmr_id;
3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->ptr.offset = rep->cur_gmr_offset;
3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->data = NULL;
3403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->handle = rep->handle;
3413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->map_handle = rep->map_handle;
3423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->map_count = 0;
3433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->size = size;
3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   region->drm_fd = vws->ioctl.drm_fd;
3453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("   gmrId = %u, offset = %u\n",
3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return region;
3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz out_err1:
352b62a74d3b94024bc08b31394f827761d354d2516Vinson Lee   FREE(region);
3533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return NULL;
3543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
3573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_destroy(struct vmw_region *region)
3583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_unref_dmabuf_arg arg;
3603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
3623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
3633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (region->data) {
3653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      munmap(region->data, region->size);
3663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      region->data = NULL;
3673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
3703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.handle = region->handle;
3713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   drmCommandWrite(region->drm_fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg));
3723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   FREE(region);
3743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3763192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGAGuestPtr
3773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_ptr(struct vmw_region *region)
3783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return region->ptr;
3803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid *
3833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_map(struct vmw_region *region)
3843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   void *map;
3863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
3883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
3893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (region->data == NULL) {
3913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      map = mmap(NULL, region->size, PROT_READ | PROT_WRITE, MAP_SHARED,
3923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		 region->drm_fd, region->map_handle);
3933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (map == MAP_FAILED) {
3943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 debug_printf("%s: Map failed.\n", __FUNCTION__);
3953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz	 return NULL;
3963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
3973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      region->data = map;
3993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ++region->map_count;
4023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return region->data;
4043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
4073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_region_unmap(struct vmw_region *region)
4083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
4103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              region->ptr.gmrId, region->ptr.offset);
4113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   --region->map_count;
4123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzint
4163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_fence_signalled(struct vmw_winsys_screen *vws,
4173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          uint32_t fence)
4183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t expected;
4203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t current;
4213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   assert(fence);
4233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!fence)
4243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return 0;
4253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   expected = fence;
4273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   current = vws->ioctl.fifo_map[SVGA_FIFO_FENCE];
4283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if ((int32)(current - expected) >= 0)
4303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return 0; /* fence passed */
4313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else
4323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return -1;
4333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
4373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_sync(struct vmw_winsys_screen *vws,
4383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		    uint32_t fence)
4393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32_t cur_fence;
4413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_fence_wait_arg arg;
4423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
4433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: fence = %lu\n", __FUNCTION__,
4453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              (unsigned long)fence);
4463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cur_fence = vws->ioctl.fifo_map[SVGA_FIFO_FENCE];
4483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s: Fence id read is 0x%08x\n", __FUNCTION__,
4493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              (unsigned int)cur_fence);
4503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if ((cur_fence - fence) < (1 << 24))
4523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return;
4533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&arg, 0, sizeof(arg));
4553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   arg.sequence = fence;
4563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   do {
4583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_FENCE_WAIT, &arg,
4593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz				 sizeof(arg));
4603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   } while (ret == -ERESTART);
4613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzint
4653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_fence_finish(struct vmw_winsys_screen *vws,
4663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       uint32_t fence)
4673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   assert(fence);
4693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(fence) {
4713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if(vmw_ioctl_fence_signalled(vws, fence) != 0) {
4723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vmw_ioctl_sync(vws, fence);
4733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
4743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return 0;
4773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzboolean
4813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_init(struct vmw_winsys_screen *vws)
4823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct drm_vmw_getparam_arg gp_arg;
4843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int ret;
4853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
4873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&gp_arg, 0, sizeof(gp_arg));
48949e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   gp_arg.param = DRM_VMW_PARAM_3D;
49049e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
49149e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz			     &gp_arg, sizeof(gp_arg));
49249e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   if (ret || gp_arg.value == 0) {
49349e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz      debug_printf("No 3D enabled (%i, %s)\n", ret, strerror(-ret));
49449e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz      goto out_err1;
49549e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   }
49649e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz
49749e4b624e5f4a68d51eb9681dbd2218aea0645faJakob Bornecrantz   memset(&gp_arg, 0, sizeof(gp_arg));
4983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   gp_arg.param = DRM_VMW_PARAM_FIFO_OFFSET;
4993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
5003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			     &gp_arg, sizeof(gp_arg));
5013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (ret) {
5033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      debug_printf("GET_PARAM on %d returned %d: %s\n",
5043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz		   vws->ioctl.drm_fd, ret, strerror(-ret));
5053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto out_err1;
5063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
5073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("Offset to map is 0x%08llx\n",
5093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz              (unsigned long long)gp_arg.value);
5103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->ioctl.fifo_map = vmw_ioctl_fifo_map(vws, gp_arg.value);
5123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (vws->ioctl.fifo_map == NULL)
5133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto out_err1;
5143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_printf("%s OK\n", __FUNCTION__);
5163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
5173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz out_err1:
5193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   debug_printf("%s Failed\n", __FUNCTION__);
5203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return FALSE;
5213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
5223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
5263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_ioctl_cleanup(struct vmw_winsys_screen *vws)
5273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
5283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   VMW_FUNC;
5293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_ioctl_fifo_unmap(vws, (void *)vws->ioctl.fifo_map);
5313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
532