[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