From 9cc046e896d504d1725e03acd28ff169dfaa0ff8 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 6 May 2014 16:33:21 +0200 Subject: [PATCH xf86-video-vmware 2/2] Add support for server managed fds Signed-off-by: Hans de Goede --- src/vmware_bootstrap.c | 5 +++++ vmwgfx/vmwgfx_driver.c | 31 +++++++++++++++++++++++++++---- vmwgfx/vmwgfx_driver.h | 2 ++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/vmware_bootstrap.c b/src/vmware_bootstrap.c index b30cf2b..1635876 100644 --- a/src/vmware_bootstrap.c +++ b/src/vmware_bootstrap.c @@ -30,6 +30,7 @@ #endif #include "xf86.h" +#include #include "compiler.h" #include "xf86Pci.h" /* pci */ #include "vm_device_version.h" @@ -496,6 +497,10 @@ VMWareDriverFunc(ScrnInfoPtr pScrn, pScrn->yDpi / 2) / pScrn->yDpi; } return TRUE; +#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,15,99,902,0) + case SUPPORTS_SERVER_FDS: + return TRUE; +#endif default: return FALSE; } diff --git a/vmwgfx/vmwgfx_driver.c b/vmwgfx/vmwgfx_driver.c index 7e5dc4e..03103a8 100644 --- a/vmwgfx/vmwgfx_driver.c +++ b/vmwgfx/vmwgfx_driver.c @@ -54,6 +54,10 @@ #include +#ifdef XSERVER_PLATFORM_BUS +#include "xf86platformBus.h" +#endif + #include "vmwgfx_driver.h" #include @@ -243,6 +247,15 @@ static const xf86CrtcConfigFuncsRec crtc_config_funcs = { .resize = drv_crtc_resize }; +static Bool vmwgfx_use_server_fd(modesettingPtr ms) +{ +#ifdef XF86_PDEV_SERVER_FD + return ms->platform_dev && (ms->platform_dev->flags & XF86_PDEV_SERVER_FD); +#else + return FALSE; +#endif +} + static Bool drv_init_drm(ScrnInfoPtr pScrn) { @@ -253,6 +266,12 @@ drv_init_drm(ScrnInfoPtr pScrn) ms->fd = vmwgfx_hosted_drm_fd(ms->hdriver, ms->hosted, ms->PciInfo); +#ifdef ODEV_ATTRIB_FD + if (ms->fd < 0 && vmwgfx_use_server_fd(ms)) + ms->fd = xf86_get_platform_device_int_attrib(ms->platform_dev, + ODEV_ATTRIB_FD, -1); +#endif + if (ms->fd < 0) { char bus_id[64]; @@ -472,6 +491,9 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags) goto out_err_bus; } + if (pEnt->location.type == BUS_PLATFORM) + ms->platform_dev = pEnt->location.id.plat; + xf86SetPrimInitDone(pScrn->entityList[0]); ms->hdriver = vmwgfx_hosted_detect(); @@ -605,7 +627,7 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags) free(ms->Options); out_depth: out_drm_version: - if (!vmwgfx_is_hosted(ms->hdriver)) + if (!vmwgfx_is_hosted(ms->hdriver) && !vmwgfx_use_server_fd(ms)) close(ms->fd); out_no_drm: vmwgfx_hosted_destroy(ms->hdriver, ms->hosted); @@ -783,8 +805,8 @@ drv_set_master(ScrnInfoPtr pScrn) { modesettingPtr ms = modesettingPTR(pScrn); - if (!vmwgfx_is_hosted(ms->hdriver) && !ms->isMaster && - drmSetMaster(ms->fd) != 0) { + if (!vmwgfx_is_hosted(ms->hdriver) && !vmwgfx_use_server_fd(ms) && + !ms->isMaster && drmSetMaster(ms->fd) != 0) { if (errno == EINVAL) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "drmSetMaster failed: 2.6.29 or newer kernel required for " @@ -1184,7 +1206,8 @@ drv_leave_vt(VT_FUNC_ARGS_DECL) vmwgfx_saa_drop_master(pScrn->pScreen); - if (!vmwgfx_is_hosted(ms->hdriver) && drmDropMaster(ms->fd)) + if (!vmwgfx_is_hosted(ms->hdriver) && !vmwgfx_use_server_fd(ms) && + drmDropMaster(ms->fd)) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "drmDropMaster failed: %s\n", strerror(errno)); ms->isMaster = FALSE; diff --git a/vmwgfx/vmwgfx_driver.h b/vmwgfx/vmwgfx_driver.h index c044a81..31dfc0f 100644 --- a/vmwgfx/vmwgfx_driver.h +++ b/vmwgfx/vmwgfx_driver.h @@ -83,6 +83,7 @@ enum xorg_throttling_reason { }; struct vmwgfx_hosted; +struct xf86_platform_device; typedef struct _modesettingRec { @@ -98,6 +99,7 @@ typedef struct _modesettingRec int Chipset; EntityInfoPtr pEnt; struct pci_device *PciInfo; + struct xf86_platform_device *platform_dev; /* Accel */ Bool accelerate_render; -- 1.9.0