xf86-video-intel: 3 commits - src/intel_device.c src/intel_driver.h src/uxa/intel_batchbuffer.c src/uxa/intel_driver.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Mar 18 09:53:41 PDT 2014


 src/intel_device.c          |   17 +---------
 src/intel_driver.h          |    2 -
 src/uxa/intel_batchbuffer.c |   17 +++++++---
 src/uxa/intel_driver.c      |   70 +++-----------------------------------------
 4 files changed, 20 insertions(+), 86 deletions(-)

New commits:
commit 15be6b7c9a89bfdac923d2a27649f539c430366f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Mar 18 16:31:07 2014 +0000

    uxa: Implement minimal flushing for bdw+
    
    Based on the patch by Kenneth Graunke,
    "Several places (such as intel_cache_expire) call intel_emit_batch_flush,
    so it needs to work on Broadwell.  Sometimes the batch is empty, in
    which case current_batch may not yet be BLT_RING.
    
    The PIPE_CONTROL code has not been ported to work on Broadwell, so
    trying to do a render ring flush will hang the GPU.  It also doesn't
    make any sense to do a render ring flush, given that we never use the
    render ring for UXA on Broadwell."
    
    Cc: Kenneth Graunke <kenneth at whitecape.org>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/uxa/intel_batchbuffer.c b/src/uxa/intel_batchbuffer.c
index 4aabe48..dedf7f8 100644
--- a/src/uxa/intel_batchbuffer.c
+++ b/src/uxa/intel_batchbuffer.c
@@ -183,16 +183,23 @@ void intel_batch_emit_flush(ScrnInfoPtr scrn)
 	int flags;
 
 	assert (!intel->in_batch_atomic);
-	assert (INTEL_INFO(intel)->gen < 0100);
 
 	/* Big hammer, look to the pipelined flushes in future. */
-	if ((INTEL_INFO(intel)->gen >= 060)) {
+	if ((INTEL_INFO(intel)->gen >= 0100)) {
+		/* Only BLT supported */
+		BEGIN_BATCH_BLT(4);
+		OUT_BATCH(MI_FLUSH_DW | 2);
+		OUT_BATCH(0); /* address low */
+		OUT_BATCH(0); /* address high */
+		OUT_BATCH(0); /* dword data */
+		ADVANCE_BATCH();
+	} else if ((INTEL_INFO(intel)->gen >= 060)) {
 		if (intel->current_batch == BLT_BATCH) {
 			BEGIN_BATCH_BLT(4);
 			OUT_BATCH(MI_FLUSH_DW | 2);
-			OUT_BATCH(0);
-			OUT_BATCH(0);
-			OUT_BATCH(0);
+			OUT_BATCH(0); /* address */
+			OUT_BATCH(0); /* qword low */
+			OUT_BATCH(0); /* qword high */
 			ADVANCE_BATCH();
 		} else  {
 			if ((INTEL_INFO(intel)->gen == 060)) {
commit 6446bf96f0cc01e730c240f7ed5c91f5d2292139
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Tue Mar 18 15:16:30 2014 +0100

    intel: Don't close the fd on probe failure if it is server managed
    
    I hit this corner case when testing a single X server spanning both intel
    gfx + an usb display link adapter driven by xf86-video-modesetting.
    
    In this scenario the intel driver gets its platformProbe method called first,
    and if it then closes the server managed fd, the xf86-video-modesetting gets
    EBADFD errors.
    
    Signed-off-by: Hans de Goede <hdegoede at redhat.com>

diff --git a/src/intel_device.c b/src/intel_device.c
index e95936b..11118c2 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -339,7 +339,8 @@ int intel_open_device(int entity_num,
 	return fd;
 
 err_close:
-	close(fd);
+	if (master_count == 0) /* Don't close server-fds */
+		close(fd);
 err_path:
 	free(local_path);
 	return -1;
commit 4a6e09c6cdb13773bca5f6831f9f5164008699c9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Mar 18 15:52:19 2014 +0000

    uxa: Add support for server managed fds (via intel_device)
    
    Based on the patch by Hans de Goede, this removes the handling of
    drmOpen() and DRM_MASTER from within uxa and instead uses the common
    routines. This reduces the duplicate code from within uxa, and enables
    new features such as server managed fds.
    
    Cc: Hans de Goede <hdegoede at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_device.c b/src/intel_device.c
index c0e1582..e95936b 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -441,20 +441,6 @@ int intel_put_master(ScrnInfoPtr scrn)
 	return ret;
 }
 
-void __intel_uxa_release_device(ScrnInfoPtr scrn)
-{
-	struct intel_device *dev = intel_device(scrn);
-	if (dev && dev->open_count == 0) {
-		intel_set_device(scrn, NULL);
-
-		drmClose(dev->fd);
-		if (dev->render_node != dev->master_node)
-			free(dev->render_node);
-		free(dev->master_node);
-		free(dev);
-	}
-}
-
 void intel_put_device(ScrnInfoPtr scrn)
 {
 	struct intel_device *dev = intel_device(scrn);
diff --git a/src/intel_driver.h b/src/intel_driver.h
index b2cb1b9..182a30e 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -132,8 +132,6 @@ int intel_get_master(ScrnInfoPtr scrn);
 int intel_put_master(ScrnInfoPtr scrn);
 void intel_put_device(ScrnInfoPtr scrn);
 
-void __intel_uxa_release_device(ScrnInfoPtr scrn);
-
 #define hosted() (0)
 
 #endif /* INTEL_DRIVER_H */
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index 7ea3b63..0a4fe2a 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -247,62 +247,9 @@ static void intel_check_dri_option(ScrnInfoPtr scrn)
 static Bool intel_open_drm_master(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	struct pci_device *dev = intel->PciInfo;
-	drmSetVersion sv;
-	struct drm_i915_getparam gp;
-	int err, has_gem;
-	char busid[20];
 
-	snprintf(busid, sizeof(busid), "pci:%04x:%02x:%02x.%d",
-		 dev->domain, dev->bus, dev->dev, dev->func);
-
-	intel->drmSubFD = drmOpen(NULL, busid);
-	if (intel->drmSubFD == -1) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] Failed to open DRM device for %s: %s\n",
-			   busid, strerror(errno));
-		return FALSE;
-	}
-
-	/* Check that what we opened was a master or a master-capable FD,
-	 * by setting the version of the interface we'll use to talk to it.
-	 * (see DRIOpenDRMMaster() in DRI1)
-	 */
-	sv.drm_di_major = 1;
-	sv.drm_di_minor = 1;
-	sv.drm_dd_major = -1;
-	sv.drm_dd_minor = -1;
-	err = drmSetInterfaceVersion(intel->drmSubFD, &sv);
-	if (err != 0) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] failed to set drm interface version.\n");
-		drmClose(intel->drmSubFD);
-		intel->drmSubFD = -1;
-		return FALSE;
-	}
-
-	has_gem = FALSE;
-	gp.param = I915_PARAM_HAS_GEM;
-	gp.value = &has_gem;
-	(void)drmCommandWriteRead(intel->drmSubFD, DRM_I915_GETPARAM,
-				  &gp, sizeof(gp));
-	if (!has_gem) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] Failed to detect GEM.  Kernel 2.6.28 required.\n");
-		drmClose(intel->drmSubFD);
-		intel->drmSubFD = -1;
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static void intel_close_drm_master(intel_screen_private *intel)
-{
-	if (intel && intel->drmSubFD > 0) {
-		drmClose(intel->drmSubFD);
-		intel->drmSubFD = -1;
-	}
+	intel->drmSubFD = intel_get_device(scrn);
+	return intel->drmSubFD != -1;
 }
 
 static int intel_init_bufmgr(intel_screen_private *intel)
@@ -1090,8 +1037,8 @@ static void I830FreeScreen(FREE_SCREEN_ARGS_DECL)
 
 	if (intel && !((uintptr_t)intel & 1)) {
 		intel_mode_fini(intel);
-		intel_close_drm_master(intel);
 		intel_bufmgr_fini(intel);
+		intel_put_device(scrn);
 
 		free(intel);
 		scrn->driverPrivate = NULL;
@@ -1102,14 +1049,12 @@ static void I830LeaveVT(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	int ret;
 
 	xf86RotateFreeShadow(scrn);
 
 	xf86_hide_cursors(scrn);
 
-	ret = drmDropMaster(intel->drmSubFD);
-	if (ret)
+	if (intel_put_master(scrn))
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmDropMaster failed: %s\n", strerror(errno));
 }
@@ -1121,13 +1066,12 @@ static Bool I830EnterVT(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	int ret;
 
-	ret = drmSetMaster(intel->drmSubFD);
-	if (ret) {
+	if (intel_get_master(scrn)) {
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmSetMaster failed: %s\n",
 			   strerror(errno));
+		return FALSE;
 	}
 
 	if (!xf86SetDesiredModes(scrn))
@@ -1293,8 +1237,6 @@ static Bool I830PMEvent(SCRN_ARG_TYPE arg, pmEvent event, Bool undo)
 
 Bool intel_init_scrn(ScrnInfoPtr scrn)
 {
-	__intel_uxa_release_device(scrn);
-
 	scrn->PreInit = I830PreInit;
 	scrn->ScreenInit = I830ScreenInit;
 	scrn->SwitchMode = I830SwitchMode;


More information about the xorg-commit mailing list