[xorg-x11-drv-nouveau] Add patches for server managed fd support

Hans de Goede jwrdegoede at fedoraproject.org
Fri Apr 18 11:37:43 UTC 2014


commit 2aabb9015a78c5e031d6d73362319bcdf53814c8
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Fri Apr 18 13:37:05 2014 +0200

    Add patches for server managed fd support
    
    - Rebuild for xserver 1.15.99.902

 ...Add-a-NVOpenNouveauDevice-helper-function.patch |  117 +++++++++++
 0002-Add-support-for-server-managed-fds.patch      |  218 ++++++++++++++++++++
 xorg-x11-drv-nouveau.spec                          |   23 +-
 3 files changed, 347 insertions(+), 11 deletions(-)
---
diff --git a/0001-Add-a-NVOpenNouveauDevice-helper-function.patch b/0001-Add-a-NVOpenNouveauDevice-helper-function.patch
new file mode 100644
index 0000000..55fa6a1
--- /dev/null
+++ b/0001-Add-a-NVOpenNouveauDevice-helper-function.patch
@@ -0,0 +1,117 @@
+From 47f08aa6d713da4e6ae9c35ce691e790ffaed09d Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 17 Mar 2014 17:37:30 +0100
+Subject: [PATCH xf86-video-nouveau v2 1/3] Add a NVOpenNouveauDevice helper
+ function
+
+This is a preparation patch for adding support for server managed fds
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+Signed-off-by: Martin Peres <martin.peres at free.fr>
+---
+ src/nv_driver.c | 59 ++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 29 insertions(+), 30 deletions(-)
+
+diff --git a/src/nv_driver.c b/src/nv_driver.c
+index 5131dcd..35cc03d 100644
+--- a/src/nv_driver.c
++++ b/src/nv_driver.c
+@@ -264,13 +264,12 @@ NVInitScrn(ScrnInfoPtr pScrn, int entity_num)
+ 					xf86GetNumEntityInstances(entity_num) - 1);
+ }
+ 
+-static Bool
+-NVHasKMS(struct pci_device *pci_dev)
++static struct nouveau_device *
++NVOpenNouveauDevice(struct pci_device *pci_dev, int scrnIndex, Bool probe)
+ {
+ 	struct nouveau_device *dev = NULL;
+-	drmVersion *version;
+ 	char *busid;
+-	int chipset, ret;
++	int ret;
+ 
+ #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
+ 	XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
+@@ -280,19 +279,35 @@ NVHasKMS(struct pci_device *pci_dev)
+ 			  pci_dev->domain, pci_dev->bus, pci_dev->dev, pci_dev->func);
+ #endif
+ 
+-	ret = drmCheckModesettingSupported(busid);
+-	if (ret) {
+-		xf86DrvMsg(-1, X_ERROR, "[drm] KMS not enabled\n");
+-		free(busid);
+-		return FALSE;
++	if (probe) {
++		ret = drmCheckModesettingSupported(busid);
++		if (ret) {
++			xf86DrvMsg(scrnIndex, X_ERROR, "[drm] KMS not enabled\n");
++			free(busid);
++			return NULL;
++		}
+ 	}
+ 
+ 	ret = nouveau_device_open(busid, &dev);
++	if (ret)
++		xf86DrvMsg(scrnIndex, X_ERROR,
++			   "[drm] Failed to open DRM device for %s: %d\n",
++			   busid, ret);
++
+ 	free(busid);
+-	if (ret) {
+-		xf86DrvMsg(-1, X_ERROR, "[drm] failed to open device\n");
++	return dev;
++}
++
++static Bool
++NVHasKMS(struct pci_device *pci_dev)
++{
++	struct nouveau_device *dev = NULL;
++	drmVersion *version;
++	int chipset;
++
++	dev = NVOpenNouveauDevice(pci_dev, -1, TRUE);
++	if (!dev)
+ 		return FALSE;
+-	}
+ 
+ 	/* Check the version reported by the kernel module.  In theory we
+ 	 * shouldn't have to do this, as libdrm_nouveau will do its own checks.
+@@ -688,8 +703,6 @@ static Bool NVOpenDRMMaster(ScrnInfoPtr pScrn)
+ {
+ 	NVPtr pNv = NVPTR(pScrn);
+ 	NVEntPtr pNVEnt = NVEntPriv(pScrn);
+-	struct pci_device *dev = pNv->PciInfo;
+-	char *busid;
+ 	drmSetVersion sv;
+ 	int err;
+ 	int ret;
+@@ -706,23 +719,9 @@ static Bool NVOpenDRMMaster(ScrnInfoPtr pScrn)
+ 		return TRUE;
+ 	}
+ 
+-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
+-	XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
+-		    dev->domain, dev->bus, dev->dev, dev->func);
+-#else
+-	busid = XNFprintf("pci:%04x:%02x:%02x.%d",
+-			  dev->domain, dev->bus, dev->dev, dev->func);
+-#endif
+-
+-	ret = nouveau_device_open(busid, &pNv->dev);
+-	if (ret) {
+-		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+-			   "[drm] Failed to open DRM device for %s: %d\n",
+-			   busid, ret);
+-		free(busid);
++	pNv->dev = NVOpenNouveauDevice(pNv->PciInfo, pScrn->scrnIndex, FALSE);
++	if (!pNv->dev)
+ 		return FALSE;
+-	}
+-	free(busid);
+ 
+ 	sv.drm_di_major = 1;
+ 	sv.drm_di_minor = 1;
+-- 
+1.9.0
+
diff --git a/0002-Add-support-for-server-managed-fds.patch b/0002-Add-support-for-server-managed-fds.patch
new file mode 100644
index 0000000..5de4230
--- /dev/null
+++ b/0002-Add-support-for-server-managed-fds.patch
@@ -0,0 +1,218 @@
+From 0c13843e300d1a9db2bfed18dc1b5df38c5adfdf Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 17 Mar 2014 17:37:31 +0100
+Subject: [PATCH xf86-video-nouveau v2 2/3] Add support for server managed fds
+
+v2 (Martin Peres):
+	- Do not define "NVEntPtr pNVEnt" if not needed to avoid some warnings
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+Signed-off-by: Martin Peres <martin.peres at free.fr>
+---
+ src/nv_driver.c | 64 ++++++++++++++++++++++++++++++++++++++++++++-------------
+ src/nv_type.h   |  4 ++++
+ 2 files changed, 54 insertions(+), 14 deletions(-)
+
+diff --git a/src/nv_driver.c b/src/nv_driver.c
+index 35cc03d..b8faab1 100644
+--- a/src/nv_driver.c
++++ b/src/nv_driver.c
+@@ -227,15 +227,21 @@ NVDriverFunc(ScrnInfoPtr scrn, xorgDriverFuncOp op, void *data)
+ 	    flag = (CARD32 *)data;
+ 	    (*flag) = 0;
+ 	    return TRUE;
++#if XORG_VERSION_CURRENT > XORG_VERSION_NUMERIC(1,15,99,0,0)
++	case SUPPORTS_SERVER_FDS:
++	    return TRUE;
++#endif
+ 	default:
+ 	    return FALSE;
+     }
+ }
+ 
+ static void
+-NVInitScrn(ScrnInfoPtr pScrn, int entity_num)
++NVInitScrn(ScrnInfoPtr pScrn, struct xf86_platform_device *platform_dev,
++	   int entity_num)
+ {
+ 	DevUnion *pPriv;
++	NVEntPtr pNVEnt;
+ 
+ 	pScrn->driverVersion    = NV_VERSION;
+ 	pScrn->driverName       = NV_DRIVER_NAME;
+@@ -258,6 +264,8 @@ NVInitScrn(ScrnInfoPtr pScrn, int entity_num)
+ 				     NVEntityIndex);
+ 	if (!pPriv->ptr) {
+ 		pPriv->ptr = xnfcalloc(sizeof(NVEntRec), 1);
++		pNVEnt = pPriv->ptr;
++		pNVEnt->platform_dev = platform_dev;
+ 	}
+ 
+ 	xf86SetEntityInstanceForScreen(pScrn, entity_num,
+@@ -265,11 +273,12 @@ NVInitScrn(ScrnInfoPtr pScrn, int entity_num)
+ }
+ 
+ static struct nouveau_device *
+-NVOpenNouveauDevice(struct pci_device *pci_dev, int scrnIndex, Bool probe)
++NVOpenNouveauDevice(struct pci_device *pci_dev,
++	struct xf86_platform_device *platform_dev, int scrnIndex, Bool probe)
+ {
+ 	struct nouveau_device *dev = NULL;
+ 	char *busid;
+-	int ret;
++	int ret, fd = -1;
+ 
+ #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0)
+ 	XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
+@@ -288,7 +297,15 @@ NVOpenNouveauDevice(struct pci_device *pci_dev, int scrnIndex, Bool probe)
+ 		}
+ 	}
+ 
+-	ret = nouveau_device_open(busid, &dev);
++#if defined(ODEV_ATTRIB_FD)
++	if (platform_dev)
++		fd = xf86_get_platform_device_int_attrib(platform_dev,
++							 ODEV_ATTRIB_FD, -1);
++#endif
++	if (fd != -1)
++		ret = nouveau_device_wrap(fd, 0, &dev);
++	else
++		ret = nouveau_device_open(busid, &dev);
+ 	if (ret)
+ 		xf86DrvMsg(scrnIndex, X_ERROR,
+ 			   "[drm] Failed to open DRM device for %s: %d\n",
+@@ -299,13 +316,13 @@ NVOpenNouveauDevice(struct pci_device *pci_dev, int scrnIndex, Bool probe)
+ }
+ 
+ static Bool
+-NVHasKMS(struct pci_device *pci_dev)
++NVHasKMS(struct pci_device *pci_dev, struct xf86_platform_device *platform_dev)
+ {
+ 	struct nouveau_device *dev = NULL;
+ 	drmVersion *version;
+ 	int chipset;
+ 
+-	dev = NVOpenNouveauDevice(pci_dev, -1, TRUE);
++	dev = NVOpenNouveauDevice(pci_dev, platform_dev, -1, TRUE);
+ 	if (!dev)
+ 		return FALSE;
+ 
+@@ -359,7 +376,7 @@ NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev,
+ 	};
+ 	ScrnInfoPtr pScrn = NULL;
+ 
+-	if (!NVHasKMS(pci_dev))
++	if (!NVHasKMS(pci_dev, NULL))
+ 		return FALSE;
+ 
+ 	pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, NVChipsets,
+@@ -367,7 +384,7 @@ NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev,
+ 	if (!pScrn)
+ 		return FALSE;
+ 
+-	NVInitScrn(pScrn, entity_num);
++	NVInitScrn(pScrn, NULL, entity_num);
+ 
+ 	return TRUE;
+ }
+@@ -383,7 +400,7 @@ NVPlatformProbe(DriverPtr driver,
+ 	if (!dev->pdev)
+ 		return FALSE;
+ 
+-	if (!NVHasKMS(dev->pdev))
++	if (!NVHasKMS(dev->pdev, dev))
+ 		return FALSE;
+ 
+ 	if (flags & PLATFORM_PROBE_GPU_SCREEN)
+@@ -397,7 +414,7 @@ NVPlatformProbe(DriverPtr driver,
+ 		xf86SetEntityShared(entity_num);
+ 	xf86AddEntityToScreen(scrn, entity_num);
+ 
+-	NVInitScrn(scrn, entity_num);
++	NVInitScrn(scrn, dev, entity_num);
+ 
+ 	return TRUE;
+ }
+@@ -436,13 +453,22 @@ NVEnterVT(VT_FUNC_ARGS_DECL)
+ {
+ 	SCRN_INFO_PTR(arg);
+ 	NVPtr pNv = NVPTR(pScrn);
++#ifdef XF86_PDEV_SERVER_FD
++	NVEntPtr pNVEnt = NVEntPriv(pScrn);
++#endif
+ 	int ret;
+ 
+ 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVEnterVT is called.\n");
+ 
+-	ret = drmSetMaster(pNv->dev->fd);
+-	if (ret)
+-		ErrorF("Unable to get master: %s\n", strerror(errno));
++#ifdef XF86_PDEV_SERVER_FD
++	if (!(pNVEnt->platform_dev &&
++	      (pNVEnt->platform_dev->flags & XF86_PDEV_SERVER_FD)))
++#endif
++	{
++		ret = drmSetMaster(pNv->dev->fd);
++		if (ret)
++			ErrorF("Unable to get master: %s\n", strerror(errno));
++	}
+ 
+ 	if (XF86_CRTC_CONFIG_PTR(pScrn)->num_crtc && !xf86SetDesiredModes(pScrn))
+ 		return FALSE;
+@@ -464,10 +490,19 @@ NVLeaveVT(VT_FUNC_ARGS_DECL)
+ {
+ 	SCRN_INFO_PTR(arg);
+ 	NVPtr pNv = NVPTR(pScrn);
++#ifdef XF86_PDEV_SERVER_FD
++	NVEntPtr pNVEnt = NVEntPriv(pScrn);
++#endif
+ 	int ret;
+ 
+ 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVLeaveVT is called.\n");
+ 
++#ifdef XF86_PDEV_SERVER_FD
++	if (pNVEnt->platform_dev &&
++	    (pNVEnt->platform_dev->flags & XF86_PDEV_SERVER_FD))
++		return;
++#endif
++
+ 	ret = drmDropMaster(pNv->dev->fd);
+ 	if (ret && errno != EIO && errno != ENODEV)
+ 		ErrorF("Error dropping master: %i(%m)\n", -errno);
+@@ -719,7 +754,8 @@ static Bool NVOpenDRMMaster(ScrnInfoPtr pScrn)
+ 		return TRUE;
+ 	}
+ 
+-	pNv->dev = NVOpenNouveauDevice(pNv->PciInfo, pScrn->scrnIndex, FALSE);
++	pNv->dev = NVOpenNouveauDevice(pNv->PciInfo, pNVEnt->platform_dev,
++				       pScrn->scrnIndex, FALSE);
+ 	if (!pNv->dev)
+ 		return FALSE;
+ 
+diff --git a/src/nv_type.h b/src/nv_type.h
+index e6945bc..6ee36d7 100644
+--- a/src/nv_type.h
++++ b/src/nv_type.h
+@@ -8,6 +8,7 @@
+ #include <stdbool.h>
+ #include <stdint.h>
+ #include "xf86Crtc.h"
++#include "xf86platformBus.h"
+ 
+ #if XF86_CRTC_VERSION >= 5
+ #define NOUVEAU_PIXMAP_SHARING 1
+@@ -28,8 +29,11 @@ typedef struct _NVRec *NVPtr;
+ 
+ typedef struct {
+ 	int fd;
++	struct xf86_platform_device *platform_dev;
+ } NVEntRec, *NVEntPtr;
+ 
++NVEntPtr NVEntPriv(ScrnInfoPtr pScrn);
++
+ typedef struct _NVRec {
+     uint32_t              Architecture;
+     EntityInfoPtr       pEnt;
+-- 
+1.9.0
+
diff --git a/xorg-x11-drv-nouveau.spec b/xorg-x11-drv-nouveau.spec
index b8b292e..def65c8 100644
--- a/xorg-x11-drv-nouveau.spec
+++ b/xorg-x11-drv-nouveau.spec
@@ -8,7 +8,7 @@ Name:      xorg-x11-drv-nouveau
 # need to set an epoch to get version number in sync with upstream
 Epoch:     1
 Version:   1.0.10
-Release:   1%{?dist}
+Release:   2%{?dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X Hardware Support
@@ -21,6 +21,9 @@ Source0: http://xorg.freedesktop.org/archive/individual/driver/xf86-video-nouvea
 %endif
 Source1: make-git-snapshot.sh
 
+Patch1:    0001-Add-a-NVOpenNouveauDevice-helper-function.patch
+Patch2:    0002-Add-support-for-server-managed-fds.patch
+
 ExcludeArch: s390 s390x
 
 %if 0%{?fedora} > 18
@@ -52,29 +55,27 @@ X.Org X11 nouveau video driver.
 
 %prep
 %setup -q -n xf86-video-nouveau-%{dirsuffix}
+%patch1 -p1
+%patch2 -p1
 
 %build
 autoreconf -v --install
 %configure --disable-static
-
-make
+make %{?_smp_mflags}
 
 %install
-rm -rf $RPM_BUILD_ROOT
-
-make install DESTDIR=$RPM_BUILD_ROOT
-
+%make_install
 find $RPM_BUILD_ROOT -regex ".*\.la$" | xargs rm -f --
 
-%clean
-rm -rf $RPM_BUILD_ROOT
-
 %files
-%defattr(-,root,root,-)
 %{driverdir}/nouveau_drv.so
 %{_mandir}/man4/nouveau.4*
 
 %changelog
+* Thu Apr 17 2014 Hans de Goede <hdegoede at redhat.com> - 1.0.10-2
+- Add patches for server managed fd support
+- Rebuild for xserver 1.15.99.902
+
 * Sun Mar 02 2014 Ben Skeggs <bskeggs at redhat.com> 1.0.10-1
 - add upstream 1.0.10 release
 


More information about the scm-commits mailing list