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