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