vmware_bootstrap.c revision 591e32d7
13bfa90b6Smrg/* 23bfa90b6Smrg * Copyright 2011 VMWare, Inc. 33bfa90b6Smrg * All Rights Reserved. 43bfa90b6Smrg * 53bfa90b6Smrg * Permission is hereby granted, free of charge, to any person obtaining a 63bfa90b6Smrg * copy of this software and associated documentation files (the 73bfa90b6Smrg * "Software"), to deal in the Software without restriction, including 83bfa90b6Smrg * without limitation the rights to use, copy, modify, merge, publish, 93bfa90b6Smrg * distribute, sub license, and/or sell copies of the Software, and to 103bfa90b6Smrg * permit persons to whom the Software is furnished to do so, subject to 113bfa90b6Smrg * the following conditions: 123bfa90b6Smrg * 133bfa90b6Smrg * The above copyright notice and this permission notice (including the 143bfa90b6Smrg * next paragraph) shall be included in all copies or substantial portions 153bfa90b6Smrg * of the Software. 163bfa90b6Smrg * 173bfa90b6Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 183bfa90b6Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 193bfa90b6Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 203bfa90b6Smrg * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 213bfa90b6Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 223bfa90b6Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 233bfa90b6Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 243bfa90b6Smrg * 253bfa90b6Smrg * Author: Unknown at vmware 263bfa90b6Smrg * Author: Thomas Hellstrom <thellstrom@vmware.com> 273bfa90b6Smrg */ 283bfa90b6Smrg#ifdef HAVE_CONFIG_H 293bfa90b6Smrg#include "config.h" 303bfa90b6Smrg#endif 313bfa90b6Smrg 323bfa90b6Smrg#include "xf86.h" 333bfa90b6Smrg#include "compiler.h" 343bfa90b6Smrg#include "xf86Pci.h" /* pci */ 353bfa90b6Smrg#include "vm_device_version.h" 363bfa90b6Smrg#include "vmware_bootstrap.h" 3722f7e8e5Smrg#include <stdint.h> 383bfa90b6Smrg 393bfa90b6Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 403bfa90b6Smrg#include "xf86Resources.h" 413bfa90b6Smrg#endif 423bfa90b6Smrg 433bfa90b6Smrg#ifndef XSERVER_LIBPCIACCESS 443bfa90b6Smrg#include "vm_basic_types.h" 453bfa90b6Smrg#include "svga_reg.h" 463bfa90b6Smrg#endif 473bfa90b6Smrg 483bfa90b6Smrg#ifndef HAVE_XORG_SERVER_1_5_0 493bfa90b6Smrg#include <xf86_ansic.h> 503bfa90b6Smrg#include <xf86_libc.h> 513bfa90b6Smrg#endif 523bfa90b6Smrg 53591e32d7Ssnj#ifdef XSERVER_PLATFORM_BUS 54591e32d7Ssnj#include "xf86platformBus.h" 55591e32d7Ssnj#endif 56591e32d7Ssnj 573bfa90b6Smrg#ifdef HaveDriverFuncs 583bfa90b6Smrg#define VMWARE_DRIVER_FUNC HaveDriverFuncs 593bfa90b6Smrg#else 603bfa90b6Smrg#define VMWARE_DRIVER_FUNC 0 613bfa90b6Smrg#endif 623bfa90b6Smrg 633bfa90b6Smrg/* 643bfa90b6Smrg * So that the file compiles unmodified when dropped in to a < 6.9 source tree. 653bfa90b6Smrg */ 663bfa90b6Smrg#ifndef _X_EXPORT 673bfa90b6Smrg#define _X_EXPORT 683bfa90b6Smrg#endif 693bfa90b6Smrg/* 703bfa90b6Smrg * So that the file compiles unmodified when dropped into an xfree source tree. 713bfa90b6Smrg */ 723bfa90b6Smrg#ifndef XORG_VERSION_CURRENT 733bfa90b6Smrg#define XORG_VERSION_CURRENT XF86_VERSION_CURRENT 743bfa90b6Smrg#endif 753bfa90b6Smrg 763bfa90b6Smrg/* 773bfa90b6Smrg * This is the only way I know to turn a #define of an integer constant into 783bfa90b6Smrg * a constant string. 793bfa90b6Smrg */ 803bfa90b6Smrg#define VMW_INNERSTRINGIFY(s) #s 813bfa90b6Smrg#define VMW_STRING(str) VMW_INNERSTRINGIFY(str) 823bfa90b6Smrg 833bfa90b6Smrg#define VMWARE_NAME "vmware" 843bfa90b6Smrg#define VMWARE_DRIVER_NAME "vmware" 853bfa90b6Smrg#define VMWARE_DRIVER_VERSION \ 863bfa90b6Smrg (PACKAGE_VERSION_MAJOR * 65536 + PACKAGE_VERSION_MINOR * 256 + PACKAGE_VERSION_PATCHLEVEL) 873bfa90b6Smrg#define VMWARE_DRIVER_VERSION_STRING \ 883bfa90b6Smrg VMW_STRING(PACKAGE_VERSION_MAJOR) "." VMW_STRING(PACKAGE_VERSION_MINOR) \ 893bfa90b6Smrg "." VMW_STRING(PACKAGE_VERSION_PATCHLEVEL) 903bfa90b6Smrg 913bfa90b6Smrgstatic const char VMWAREBuildStr[] = "VMware Guest X Server " 923bfa90b6Smrg VMWARE_DRIVER_VERSION_STRING " - build=$Name: $\n"; 933bfa90b6Smrg 943bfa90b6Smrg/* 953bfa90b6Smrg * Standard four digit version string expected by VMware Tools installer. 963bfa90b6Smrg * As the driver's version is only {major, minor, patchlevel}, 973bfa90b6Smrg * The fourth digit may describe the commit number relative to the 983bfa90b6Smrg * last version tag as output from `git describe` 993bfa90b6Smrg */ 1003bfa90b6Smrg 1013bfa90b6Smrg#ifdef __GNUC__ 1023bfa90b6Smrg#ifdef VMW_SUBPATCH 1033bfa90b6Smrgconst char vmware_drv_modinfo[] 1043bfa90b6Smrg__attribute__((section(".modinfo"),unused)) = 1053bfa90b6Smrg "version=" VMWARE_DRIVER_VERSION_STRING "." VMW_STRING(VMW_SUBPATCH); 1063bfa90b6Smrg#else 1073bfa90b6Smrgconst char vmware_drv_modinfo[] 1083bfa90b6Smrg__attribute__((section(".modinfo"),unused)) = 1093bfa90b6Smrg "version=" VMWARE_DRIVER_VERSION_STRING ".0"; 1103bfa90b6Smrg#endif /*VMW_SUBPATCH*/ 1113bfa90b6Smrg#endif 1123bfa90b6Smrg 1133bfa90b6Smrg#ifndef XSERVER_LIBPCIACCESS 1143bfa90b6Smrgstatic resRange vmwareLegacyRes[] = { 1153bfa90b6Smrg { ResExcIoBlock, SVGA_LEGACY_BASE_PORT, 1163bfa90b6Smrg SVGA_LEGACY_BASE_PORT + SVGA_NUM_PORTS*sizeof(uint32)}, 1173bfa90b6Smrg _VGA_EXCLUSIVE, _END 1183bfa90b6Smrg}; 1193bfa90b6Smrg#else 1203bfa90b6Smrg#define vmwareLegacyRes NULL 1213bfa90b6Smrg#endif 1223bfa90b6Smrg 1233bfa90b6Smrg#if XSERVER_LIBPCIACCESS 1243bfa90b6Smrg#define VENDOR_ID(p) (p)->vendor_id 1253bfa90b6Smrg#define DEVICE_ID(p) (p)->device_id 1263bfa90b6Smrg#define SUBVENDOR_ID(p) (p)->subvendor_id 1273bfa90b6Smrg#define SUBSYS_ID(p) (p)->subdevice_id 1283bfa90b6Smrg#define CHIP_REVISION(p) (p)->revision 1293bfa90b6Smrg#else 1303bfa90b6Smrg#define VENDOR_ID(p) (p)->vendor 1313bfa90b6Smrg#define DEVICE_ID(p) (p)->chipType 1323bfa90b6Smrg#define SUBVENDOR_ID(p) (p)->subsysVendor 1333bfa90b6Smrg#define SUBSYS_ID(p) (p)->subsysCard 1343bfa90b6Smrg#define CHIP_REVISION(p) (p)->chipRev 1353bfa90b6Smrg#endif 1363bfa90b6Smrg 1373bfa90b6Smrg#if XSERVER_LIBPCIACCESS 1383bfa90b6Smrg 1393bfa90b6Smrg#define VMWARE_DEVICE_MATCH(d, i) \ 1403bfa90b6Smrg {PCI_VENDOR_ID_VMWARE, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } 1413bfa90b6Smrg 1423bfa90b6Smrgstatic const struct pci_id_match VMwareDeviceMatch[] = { 1433bfa90b6Smrg VMWARE_DEVICE_MATCH (PCI_DEVICE_ID_VMWARE_SVGA2, 0 ), 1443bfa90b6Smrg VMWARE_DEVICE_MATCH (PCI_DEVICE_ID_VMWARE_SVGA, 0 ), 1453bfa90b6Smrg { 0, 0, 0 }, 1463bfa90b6Smrg}; 1473bfa90b6Smrg#endif 1483bfa90b6Smrg 1493bfa90b6Smrg/* 1503bfa90b6Smrg * Currently, even the PCI obedient 0405 chip still only obeys IOSE and 1513bfa90b6Smrg * MEMSE for the SVGA resources. Thus, RES_EXCLUSIVE_VGA is required. 1523bfa90b6Smrg * 1533bfa90b6Smrg * The 0710 chip also uses hardcoded IO ports that aren't disablable. 1543bfa90b6Smrg */ 1553bfa90b6Smrg 1563bfa90b6Smrgstatic PciChipsets VMWAREPciChipsets[] = { 1573bfa90b6Smrg { PCI_DEVICE_ID_VMWARE_SVGA2, PCI_DEVICE_ID_VMWARE_SVGA2, RES_EXCLUSIVE_VGA }, 1583bfa90b6Smrg { PCI_DEVICE_ID_VMWARE_SVGA, PCI_DEVICE_ID_VMWARE_SVGA, vmwareLegacyRes }, 1593bfa90b6Smrg { -1, -1, RES_UNDEFINED } 1603bfa90b6Smrg}; 1613bfa90b6Smrg 1623bfa90b6Smrgstatic SymTabRec VMWAREChipsets[] = { 1633bfa90b6Smrg { PCI_DEVICE_ID_VMWARE_SVGA2, "vmware0405" }, 1643bfa90b6Smrg { PCI_DEVICE_ID_VMWARE_SVGA, "vmware0710" }, 1653bfa90b6Smrg { -1, NULL } 1663bfa90b6Smrg}; 1673bfa90b6Smrg 1683bfa90b6Smrg#ifdef XFree86LOADER 1693bfa90b6Smrgstatic XF86ModuleVersionInfo vmwareVersRec = { 1703bfa90b6Smrg VMWARE_DRIVER_NAME, 1713bfa90b6Smrg MODULEVENDORSTRING, 1723bfa90b6Smrg MODINFOSTRING1, 1733bfa90b6Smrg MODINFOSTRING2, 1743bfa90b6Smrg XORG_VERSION_CURRENT, 1753bfa90b6Smrg PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL, 1763bfa90b6Smrg ABI_CLASS_VIDEODRV, 1773bfa90b6Smrg ABI_VIDEODRV_VERSION, 1783bfa90b6Smrg MOD_CLASS_VIDEODRV, 1793bfa90b6Smrg { 0, 0, 0, 0} 1803bfa90b6Smrg}; 1813bfa90b6Smrg#endif /* XFree86LOADER */ 1823bfa90b6Smrg 1833bfa90b6Smrgstatic const OptionInfoRec VMWAREOptions[] = { 1843bfa90b6Smrg { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE }, 1853bfa90b6Smrg { OPTION_XINERAMA, "Xinerama", OPTV_BOOLEAN, {0}, FALSE }, 1863bfa90b6Smrg { OPTION_STATIC_XINERAMA, "StaticXinerama", OPTV_STRING, {0}, FALSE }, 1873bfa90b6Smrg { OPTION_GUI_LAYOUT, "GuiLayout", OPTV_STRING, {0}, FALSE }, 1883bfa90b6Smrg { OPTION_DEFAULT_MODE, "AddDefaultMode", OPTV_BOOLEAN, {0}, FALSE }, 1893bfa90b6Smrg { OPTION_RENDER_ACCEL, "RenderAccel", OPTV_BOOLEAN, {0}, FALSE}, 1903bfa90b6Smrg { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE}, 1913bfa90b6Smrg { OPTION_DIRECT_PRESENTS, "DirectPresents", OPTV_BOOLEAN, {0}, FALSE}, 1923bfa90b6Smrg { OPTION_HW_PRESENTS, "HWPresents", OPTV_BOOLEAN, {0}, FALSE}, 1933bfa90b6Smrg { OPTION_RENDERCHECK, "RenderCheck", OPTV_BOOLEAN, {0}, FALSE}, 1943bfa90b6Smrg { -1, NULL, OPTV_NONE, {0}, FALSE } 1953bfa90b6Smrg}; 1963bfa90b6Smrg 1973bfa90b6SmrgOptionInfoPtr VMWARECopyOptions(void) 1983bfa90b6Smrg{ 1993bfa90b6Smrg OptionInfoPtr options; 2003bfa90b6Smrg if (!(options = malloc(sizeof(VMWAREOptions)))) 2013bfa90b6Smrg return NULL; 2023bfa90b6Smrg 2033bfa90b6Smrg memcpy(options, VMWAREOptions, sizeof(VMWAREOptions)); 2043bfa90b6Smrg return options; 2053bfa90b6Smrg} 2063bfa90b6Smrg 20722f7e8e5Smrg/* 20822f7e8e5Smrg * Also in vmwgfx_hosted.h, which we don't include. 20922f7e8e5Smrg */ 21022f7e8e5Smrgvoid * 21122f7e8e5Smrgvmwgfx_hosted_detect(void); 21222f7e8e5Smrg 2133bfa90b6Smrgstatic Bool 2143bfa90b6SmrgVMwarePreinitStub(ScrnInfoPtr pScrn, int flags) 2153bfa90b6Smrg{ 2163bfa90b6Smrg#if XSERVER_LIBPCIACCESS 2173bfa90b6Smrg struct pci_device *pciInfo; 2183bfa90b6Smrg#else 2193bfa90b6Smrg pciVideoPtr pciInfo; 2203bfa90b6Smrg#endif /* XSERVER_LIBPCIACCESS */ 2213bfa90b6Smrg EntityInfoPtr pEnt; 2223bfa90b6Smrg 2233bfa90b6Smrg pScrn->PreInit = pScrn->driverPrivate; 2243bfa90b6Smrg 2253bfa90b6Smrg#ifdef BUILD_VMWGFX 2263bfa90b6Smrg pScrn->driverPrivate = NULL; 2273bfa90b6Smrg 2283bfa90b6Smrg /* 2293bfa90b6Smrg * Try vmwgfx path. 2303bfa90b6Smrg */ 2313bfa90b6Smrg if ((*pScrn->PreInit)(pScrn, flags)) 2323bfa90b6Smrg return TRUE; 2333bfa90b6Smrg 23422f7e8e5Smrg /* 23522f7e8e5Smrg * Can't run legacy hosted 23622f7e8e5Smrg */ 23722f7e8e5Smrg if (vmwgfx_hosted_detect()) 23822f7e8e5Smrg return FALSE; 2393bfa90b6Smrg#else 2403bfa90b6Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 2413bfa90b6Smrg "Driver was compiled without KMS- and 3D support.\n"); 2423bfa90b6Smrg#endif /* defined(BUILD_VMWGFX) */ 2433bfa90b6Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 2443bfa90b6Smrg "Disabling 3D support.\n"); 2453bfa90b6Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 2463bfa90b6Smrg "Disabling Render Acceleration.\n"); 2473bfa90b6Smrg xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 2483bfa90b6Smrg "Disabling RandR12+ support.\n"); 2493bfa90b6Smrg 2503bfa90b6Smrg pScrn->driverPrivate = NULL; 2513bfa90b6Smrg vmwlegacy_hookup(pScrn); 2523bfa90b6Smrg 2533bfa90b6Smrg pEnt = xf86GetEntityInfo(pScrn->entityList[0]); 2543bfa90b6Smrg pciInfo = xf86GetPciInfoForEntity(pEnt->index); 2553bfa90b6Smrg if (pciInfo == NULL) 2563bfa90b6Smrg return FALSE; 2573bfa90b6Smrg 2583bfa90b6Smrg pScrn->chipset = (char*)xf86TokenToString(VMWAREChipsets, 2593bfa90b6Smrg DEVICE_ID(pciInfo)); 2603bfa90b6Smrg 2613bfa90b6Smrg return (*pScrn->PreInit)(pScrn, flags); 2623bfa90b6Smrg}; 2633bfa90b6Smrg 2643bfa90b6Smrg#if XSERVER_LIBPCIACCESS 2653bfa90b6Smrgstatic Bool 2663bfa90b6SmrgVMwarePciProbe (DriverPtr drv, 2673bfa90b6Smrg int entity_num, 2683bfa90b6Smrg struct pci_device *device, 2693bfa90b6Smrg intptr_t match_data) 2703bfa90b6Smrg{ 2713bfa90b6Smrg ScrnInfoPtr scrn = NULL; 2723bfa90b6Smrg 2733bfa90b6Smrg scrn = xf86ConfigPciEntity(scrn, 0, entity_num, VMWAREPciChipsets, 2743bfa90b6Smrg NULL, NULL, NULL, NULL, NULL); 2753bfa90b6Smrg if (scrn != NULL) { 2763bfa90b6Smrg scrn->driverVersion = VMWARE_DRIVER_VERSION; 2773bfa90b6Smrg scrn->driverName = VMWARE_DRIVER_NAME; 2783bfa90b6Smrg scrn->name = VMWARE_NAME; 2793bfa90b6Smrg scrn->Probe = NULL; 2803bfa90b6Smrg } 2813bfa90b6Smrg 2823bfa90b6Smrg switch (DEVICE_ID(device)) { 2833bfa90b6Smrg case PCI_DEVICE_ID_VMWARE_SVGA2: 2843bfa90b6Smrg case PCI_DEVICE_ID_VMWARE_SVGA: 2853bfa90b6Smrg xf86MsgVerb(X_INFO, 4, "VMwarePciProbe: Valid device\n"); 2863bfa90b6Smrg 2873bfa90b6Smrg#ifdef BUILD_VMWGFX 2883bfa90b6Smrg vmwgfx_hookup(scrn); 2893bfa90b6Smrg#else 2903bfa90b6Smrg vmwlegacy_hookup(scrn); 2913bfa90b6Smrg#endif /* defined(BUILD_VMWGFX) */ 2923bfa90b6Smrg 2933bfa90b6Smrg scrn->driverPrivate = scrn->PreInit; 2943bfa90b6Smrg scrn->PreInit = VMwarePreinitStub; 2953bfa90b6Smrg break; 2963bfa90b6Smrg default: 2973bfa90b6Smrg xf86MsgVerb(X_INFO, 4, "VMwarePciProbe: Unknown device\n"); 2983bfa90b6Smrg } 2993bfa90b6Smrg return scrn != NULL; 3003bfa90b6Smrg} 3013bfa90b6Smrg#else 3023bfa90b6Smrg 3033bfa90b6Smrg/* 3043bfa90b6Smrg *---------------------------------------------------------------------- 3053bfa90b6Smrg * 3063bfa90b6Smrg * RewriteTagString -- 3073bfa90b6Smrg * 3083bfa90b6Smrg * Rewrites the given string, removing the $Name: $, and 3093bfa90b6Smrg * replacing it with the contents. The output string must 3103bfa90b6Smrg * have enough room, or else. 3113bfa90b6Smrg * 3123bfa90b6Smrg * Results: 3133bfa90b6Smrg * 3143bfa90b6Smrg * Output string updated. 3153bfa90b6Smrg * 3163bfa90b6Smrg * Side effects: 3173bfa90b6Smrg * None. 3183bfa90b6Smrg * 3193bfa90b6Smrg *---------------------------------------------------------------------- 3203bfa90b6Smrg */ 3213bfa90b6Smrg 3223bfa90b6Smrgstatic void 3233bfa90b6SmrgRewriteTagString(const char *istr, char *ostr, int osize) 3243bfa90b6Smrg{ 3253bfa90b6Smrg int chr; 3263bfa90b6Smrg Bool inTag = FALSE; 3273bfa90b6Smrg char *op = ostr; 3283bfa90b6Smrg 3293bfa90b6Smrg do { 3303bfa90b6Smrg chr = *istr++; 3313bfa90b6Smrg if (chr == '$') { 3323bfa90b6Smrg if (inTag) { 3333bfa90b6Smrg inTag = FALSE; 3343bfa90b6Smrg for (; op > ostr && op[-1] == ' '; op--) { 3353bfa90b6Smrg } 3363bfa90b6Smrg continue; 3373bfa90b6Smrg } 3383bfa90b6Smrg if (strncmp(istr, "Name:", 5) == 0) { 3393bfa90b6Smrg istr += 5; 3403bfa90b6Smrg istr += strspn(istr, " "); 3413bfa90b6Smrg inTag = TRUE; 3423bfa90b6Smrg continue; 3433bfa90b6Smrg } 3443bfa90b6Smrg } 3453bfa90b6Smrg *op++ = chr; 3463bfa90b6Smrg } while (chr); 3473bfa90b6Smrg} 3483bfa90b6Smrg 3493bfa90b6Smrgstatic Bool 3503bfa90b6SmrgVMWAREProbe(DriverPtr drv, int flags) 3513bfa90b6Smrg{ 3523bfa90b6Smrg int numDevSections, numUsed; 3533bfa90b6Smrg GDevPtr *devSections; 3543bfa90b6Smrg int *usedChips; 3553bfa90b6Smrg int i; 3563bfa90b6Smrg Bool foundScreen = FALSE; 3573bfa90b6Smrg char buildString[sizeof(VMWAREBuildStr)]; 3583bfa90b6Smrg 3593bfa90b6Smrg RewriteTagString(VMWAREBuildStr, buildString, sizeof(VMWAREBuildStr)); 3603bfa90b6Smrg xf86MsgVerb(X_PROBED, 4, "%s", buildString); 3613bfa90b6Smrg 3623bfa90b6Smrg numDevSections = xf86MatchDevice(VMWARE_DRIVER_NAME, &devSections); 3633bfa90b6Smrg if (numDevSections <= 0) { 3643bfa90b6Smrg#ifdef DEBUG 3653bfa90b6Smrg xf86MsgVerb(X_ERROR, 0, "No vmware driver section\n"); 3663bfa90b6Smrg#endif 3673bfa90b6Smrg return FALSE; 3683bfa90b6Smrg } 3693bfa90b6Smrg if (xf86GetPciVideoInfo()) { 3703bfa90b6Smrg VmwareLog(("Some PCI Video Info Exists\n")); 3713bfa90b6Smrg numUsed = xf86MatchPciInstances(VMWARE_NAME, PCI_VENDOR_ID_VMWARE, 3723bfa90b6Smrg VMWAREChipsets, VMWAREPciChipsets, devSections, 3733bfa90b6Smrg numDevSections, drv, &usedChips); 3743bfa90b6Smrg free(devSections); 3753bfa90b6Smrg if (numUsed <= 0) 3763bfa90b6Smrg return FALSE; 3773bfa90b6Smrg if (flags & PROBE_DETECT) 3783bfa90b6Smrg foundScreen = TRUE; 3793bfa90b6Smrg else 3803bfa90b6Smrg for (i = 0; i < numUsed; i++) { 3813bfa90b6Smrg ScrnInfoPtr pScrn = NULL; 3823bfa90b6Smrg 3833bfa90b6Smrg VmwareLog(("Even some VMware SVGA PCI instances exists\n")); 3843bfa90b6Smrg pScrn = xf86ConfigPciEntity(pScrn, flags, usedChips[i], 3853bfa90b6Smrg VMWAREPciChipsets, NULL, NULL, NULL, 3863bfa90b6Smrg NULL, NULL); 3873bfa90b6Smrg if (pScrn) { 3883bfa90b6Smrg VmwareLog(("And even configuration suceeded\n")); 3893bfa90b6Smrg pScrn->driverVersion = VMWARE_DRIVER_VERSION; 3903bfa90b6Smrg pScrn->driverName = VMWARE_DRIVER_NAME; 3913bfa90b6Smrg pScrn->name = VMWARE_NAME; 3923bfa90b6Smrg pScrn->Probe = VMWAREProbe; 3933bfa90b6Smrg 3943bfa90b6Smrg#ifdef BUILD_VMWGFX 3953bfa90b6Smrg vmwgfx_hookup(pScrn); 3963bfa90b6Smrg#else 3973bfa90b6Smrg vmwlegacy_hookup(pScrn); 3983bfa90b6Smrg#endif /* defined(BUILD_VMWGFX) */ 3993bfa90b6Smrg 4003bfa90b6Smrg pScrn->driverPrivate = pScrn->PreInit; 4013bfa90b6Smrg pScrn->PreInit = VMwarePreinitStub; 4023bfa90b6Smrg foundScreen = TRUE; 4033bfa90b6Smrg } 4043bfa90b6Smrg } 4053bfa90b6Smrg free(usedChips); 4063bfa90b6Smrg } 4073bfa90b6Smrg return foundScreen; 4083bfa90b6Smrg} 4093bfa90b6Smrg#endif 4103bfa90b6Smrg 411591e32d7Ssnj#ifdef XSERVER_PLATFORM_BUS 412591e32d7Ssnjstatic Bool 413591e32d7SsnjVMwarePlatformProbe(DriverPtr drv, int entity, int flags, 414591e32d7Ssnj struct xf86_platform_device *dev, intptr_t match_data) 415591e32d7Ssnj{ 416591e32d7Ssnj ScrnInfoPtr pScrn; 417591e32d7Ssnj int scrnFlag = 0; 418591e32d7Ssnj 419591e32d7Ssnj if (!dev->pdev) 420591e32d7Ssnj return FALSE; 421591e32d7Ssnj 422591e32d7Ssnj if (flags & PLATFORM_PROBE_GPU_SCREEN) 423591e32d7Ssnj scrnFlag = XF86_ALLOCATE_GPU_SCREEN; 424591e32d7Ssnj 425591e32d7Ssnj pScrn = xf86AllocateScreen(drv, scrnFlag); 426591e32d7Ssnj if (!pScrn) 427591e32d7Ssnj return FALSE; 428591e32d7Ssnj 429591e32d7Ssnj if (xf86IsEntitySharable(entity)) 430591e32d7Ssnj xf86SetEntityShared(entity); 431591e32d7Ssnj 432591e32d7Ssnj xf86AddEntityToScreen(pScrn, entity); 433591e32d7Ssnj 434591e32d7Ssnj pScrn->driverVersion = VMWARE_DRIVER_VERSION; 435591e32d7Ssnj pScrn->driverName = VMWARE_DRIVER_NAME; 436591e32d7Ssnj pScrn->name = VMWARE_NAME; 437591e32d7Ssnj pScrn->Probe = NULL; 438591e32d7Ssnj#ifdef BUILD_VMWGFX 439591e32d7Ssnj vmwgfx_hookup(pScrn); 440591e32d7Ssnj#else 441591e32d7Ssnj vmwlegacy_hookup(pScrn); 442591e32d7Ssnj#endif 443591e32d7Ssnj pScrn->driverPrivate = pScrn->PreInit; 444591e32d7Ssnj pScrn->PreInit = VMwarePreinitStub; 445591e32d7Ssnj 446591e32d7Ssnj return TRUE; 447591e32d7Ssnj} 448591e32d7Ssnj#endif 449591e32d7Ssnj 4503bfa90b6Smrgstatic void 4513bfa90b6SmrgVMWAREIdentify(int flags) 4523bfa90b6Smrg{ 4533bfa90b6Smrg xf86PrintChipsets(VMWARE_NAME, "driver for VMware SVGA", VMWAREChipsets); 4543bfa90b6Smrg} 4553bfa90b6Smrg 4563bfa90b6Smrgstatic const OptionInfoRec * 4573bfa90b6SmrgVMWAREAvailableOptions(int chipid, int busid) 4583bfa90b6Smrg{ 4593bfa90b6Smrg return VMWAREOptions; 4603bfa90b6Smrg} 4613bfa90b6Smrg 4623bfa90b6Smrg#if VMWARE_DRIVER_FUNC 4633bfa90b6Smrgstatic Bool 4643bfa90b6SmrgVMWareDriverFunc(ScrnInfoPtr pScrn, 4653bfa90b6Smrg xorgDriverFuncOp op, 4663bfa90b6Smrg pointer data) 4673bfa90b6Smrg{ 46822f7e8e5Smrg uint32_t *flag; 4693bfa90b6Smrg xorgRRModeMM *modemm; 4703bfa90b6Smrg 4713bfa90b6Smrg switch (op) { 4723bfa90b6Smrg case GET_REQUIRED_HW_INTERFACES: 47322f7e8e5Smrg flag = (uint32_t *)data; 4743bfa90b6Smrg 4753bfa90b6Smrg if (flag) { 47622f7e8e5Smrg#ifdef BUILD_VMWGFX 47722f7e8e5Smrg vmwgfx_modify_flags(flag); 47822f7e8e5Smrg#else 4793bfa90b6Smrg *flag = HW_IO | HW_MMIO; 48022f7e8e5Smrg#endif 4813bfa90b6Smrg } 4823bfa90b6Smrg return TRUE; 4833bfa90b6Smrg case RR_GET_MODE_MM: 4843bfa90b6Smrg modemm = (xorgRRModeMM *)data; 4853bfa90b6Smrg 4863bfa90b6Smrg /* 4873bfa90b6Smrg * Because changing the resolution of the guest is usually changing the size 4883bfa90b6Smrg * of a window on the host desktop, the real physical DPI will not change. To 4893bfa90b6Smrg * keep the guest in sync, we scale the 'physical' screen dimensions to 4903bfa90b6Smrg * keep the DPI constant. 4913bfa90b6Smrg */ 4923bfa90b6Smrg if (modemm && modemm->mode) { 4933bfa90b6Smrg modemm->mmWidth = (modemm->mode->HDisplay * VMWARE_INCHTOMM + 4943bfa90b6Smrg pScrn->xDpi / 2) / pScrn->xDpi; 4953bfa90b6Smrg modemm->mmHeight = (modemm->mode->VDisplay * VMWARE_INCHTOMM + 4963bfa90b6Smrg pScrn->yDpi / 2) / pScrn->yDpi; 4973bfa90b6Smrg } 4983bfa90b6Smrg return TRUE; 499591e32d7Ssnj#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 18 500591e32d7Ssnj case SUPPORTS_SERVER_FDS: 501591e32d7Ssnj return TRUE; 502591e32d7Ssnj#endif 5033bfa90b6Smrg default: 5043bfa90b6Smrg return FALSE; 5053bfa90b6Smrg } 5063bfa90b6Smrg} 5073bfa90b6Smrg#endif 5083bfa90b6Smrg 5093bfa90b6Smrg 5103bfa90b6Smrg_X_EXPORT DriverRec vmware = { 5113bfa90b6Smrg VMWARE_DRIVER_VERSION, 5123bfa90b6Smrg VMWARE_DRIVER_NAME, 5133bfa90b6Smrg VMWAREIdentify, 5143bfa90b6Smrg#if XSERVER_LIBPCIACCESS 5153bfa90b6Smrg NULL, 5163bfa90b6Smrg#else 5173bfa90b6Smrg VMWAREProbe, 5183bfa90b6Smrg#endif 5193bfa90b6Smrg VMWAREAvailableOptions, 5203bfa90b6Smrg NULL, 5213bfa90b6Smrg 0, 5223bfa90b6Smrg#if VMWARE_DRIVER_FUNC 5233bfa90b6Smrg VMWareDriverFunc, 5243bfa90b6Smrg#endif 525591e32d7Ssnj#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 4 5263bfa90b6Smrg#if XSERVER_LIBPCIACCESS 5273bfa90b6Smrg VMwareDeviceMatch, 5283bfa90b6Smrg VMwarePciProbe, 529591e32d7Ssnj#else 530591e32d7Ssnj NULL, 531591e32d7Ssnj NULL, 532591e32d7Ssnj#endif 533591e32d7Ssnj#endif 534591e32d7Ssnj#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 13 535591e32d7Ssnj#ifdef XSERVER_PLATFORM_BUS 536591e32d7Ssnj VMwarePlatformProbe, 537591e32d7Ssnj#else 538591e32d7Ssnj NULL, 539591e32d7Ssnj#endif 5403bfa90b6Smrg#endif 5413bfa90b6Smrg}; 5423bfa90b6Smrg 5433bfa90b6Smrg 5443bfa90b6Smrg#ifdef XFree86LOADER 5453bfa90b6Smrgstatic MODULESETUPPROTO(vmwareSetup); 5463bfa90b6Smrg 5473bfa90b6Smrg_X_EXPORT XF86ModuleData vmwareModuleData = { 5483bfa90b6Smrg &vmwareVersRec, 5493bfa90b6Smrg vmwareSetup, 5503bfa90b6Smrg NULL 5513bfa90b6Smrg}; 5523bfa90b6Smrg 5533bfa90b6Smrgstatic pointer 5543bfa90b6SmrgvmwareSetup(pointer module, pointer opts, int *errmaj, int *errmin) 5553bfa90b6Smrg{ 5563bfa90b6Smrg static Bool setupDone = FALSE; 5573bfa90b6Smrg 5583bfa90b6Smrg if (!setupDone) { 5593bfa90b6Smrg setupDone = TRUE; 5603bfa90b6Smrg 5613bfa90b6Smrg xf86AddDriver(&vmware, module, VMWARE_DRIVER_FUNC); 5623bfa90b6Smrg 5633bfa90b6Smrg VMWARERefSymLists(); 5643bfa90b6Smrg 5653bfa90b6Smrg return (pointer)1; 5663bfa90b6Smrg } 5673bfa90b6Smrg if (errmaj) { 5683bfa90b6Smrg *errmaj = LDR_ONCEONLY; 5693bfa90b6Smrg } 5703bfa90b6Smrg return NULL; 5713bfa90b6Smrg} 5723bfa90b6Smrg#endif /* XFree86LOADER */ 573