From c17ecaeba2b2e099d6c4e34a974040fb60aae2a8 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Fri, 17 Apr 2009 02:32:54 +0000 Subject: [PATCH] - nouveau: post writes to pushbuf before incrementing PUT Thu Apr 16 2009 Dave Airlie 2.4.6-5 - libdrm-radeon: fix wait idle --- libdrm-radeon.patch | 2 +- libdrm.spec | 11 ++- nouveau-updates.patch | 161 ++++++------------------------------------ 3 files changed, 33 insertions(+), 141 deletions(-) diff --git a/libdrm-radeon.patch b/libdrm-radeon.patch index 96e8a3c..2eec60f 100644 --- a/libdrm-radeon.patch +++ b/libdrm-radeon.patch @@ -484,7 +484,7 @@ index 0000000..70f4b6b + do { + ret = drmCommandWriteRead(bo->bom->fd, DRM_RADEON_GEM_WAIT_IDLE, + &args, sizeof(args)); -+ } while (ret == -EAGAIN); ++ } while (ret == -EBUSY); + return ret; +} + diff --git a/libdrm.spec b/libdrm.spec index 86568bc..8313c0e 100644 --- a/libdrm.spec +++ b/libdrm.spec @@ -3,7 +3,7 @@ Summary: Direct Rendering Manager runtime library Name: libdrm Version: 2.4.6 -Release: 4%{?dist} +Release: 6%{?dist} License: MIT Group: System Environment/Libraries URL: http://dri.sourceforge.net @@ -30,6 +30,8 @@ Patch3: libdrm-make-dri-perms-okay.patch Patch4: libdrm-2.4.0-no-bc.patch # radeon libdrm patches from modesetting-gem branch of upstream Patch8: libdrm-radeon.patch +# nouveau fixes from drm.git +Patch9: nouveau-updates.patch %description Direct Rendering Manager runtime library @@ -50,6 +52,7 @@ Direct Rendering Manager development package %patch3 -p1 -b .forceperms %patch4 -p1 -b .no-bc %patch8 -p1 -b .radeon +%patch9 -p1 -b .nouveau %build autoreconf -v --install || exit 1 @@ -109,6 +112,12 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/pkgconfig/libdrm_nouveau.pc %changelog +* Fri Apr 17 2009 Ben Skeggs 2.4.6-6 +- nouveau: post writes to pushbuf before incrementing PUT + +* Thu Apr 16 2009 Dave Airlie 2.4.6-5 +- libdrm-radeon: fix wait idle + * Sat Apr 11 2009 Dave Airlie 2.4.6-4 - libdrm-2.4.7-revert-bong.patch - revert connector "speedups" diff --git a/nouveau-updates.patch b/nouveau-updates.patch index d6489d2..606b3df 100644 --- a/nouveau-updates.patch +++ b/nouveau-updates.patch @@ -1,143 +1,26 @@ -diff -Nur libdrm-2.4.5.orig/libdrm/nouveau/Makefile.am libdrm-2.4.5/libdrm/nouveau/Makefile.am ---- libdrm-2.4.5.orig/libdrm/nouveau/Makefile.am 2009-02-11 10:09:35.000000000 +1000 -+++ libdrm-2.4.5/libdrm/nouveau/Makefile.am 2009-03-25 09:06:49.000000000 +1000 -@@ -19,7 +19,9 @@ - nouveau_bo.c \ - nouveau_resource.c \ - nouveau_dma.c \ -- nouveau_fence.c -+ nouveau_fence.c \ -+ nouveau_dma.h \ -+ nouveau_private.h - - libdrm_nouveaucommonincludedir = ${includedir}/nouveau - libdrm_nouveaucommoninclude_HEADERS = \ -diff -Nur libdrm-2.4.5.orig/libdrm/nouveau/nouveau_bo.c libdrm-2.4.5/libdrm/nouveau/nouveau_bo.c ---- libdrm-2.4.5.orig/libdrm/nouveau/nouveau_bo.c 2009-02-11 10:09:35.000000000 +1000 -+++ libdrm-2.4.5/libdrm/nouveau/nouveau_bo.c 2009-03-25 09:06:20.000000000 +1000 -@@ -347,24 +347,25 @@ - if (!bo || !handle) - return -EINVAL; - -- if (!nvdev->mm_enabled) -- return -ENODEV; -- - if (!nvbo->global_handle) { - struct drm_gem_flink req; - - ret = nouveau_bo_kalloc(nvbo, NULL); - if (ret) - return ret; -- -- req.handle = nvbo->handle; -- ret = ioctl(nvdev->fd, DRM_IOCTL_GEM_FLINK, &req); -- if (ret) { -- nouveau_bo_kfree(nvbo); -- return ret; -+ -+ if (nvdev->mm_enabled) { -+ req.handle = nvbo->handle; -+ ret = ioctl(nvdev->fd, DRM_IOCTL_GEM_FLINK, &req); -+ if (ret) { -+ nouveau_bo_kfree(nvbo); -+ return ret; -+ } -+ -+ nvbo->global_handle = req.name; -+ } else { -+ nvbo->global_handle = nvbo->offset; - } -- -- nvbo->global_handle = req.name; +diff --git a/libdrm/nouveau/nouveau_bo.c b/libdrm/nouveau/nouveau_bo.c +index 023c6be..66466e3 100644 +--- a/libdrm/nouveau/nouveau_bo.c ++++ b/libdrm/nouveau/nouveau_bo.c +@@ -404,7 +404,8 @@ nouveau_bo_handle_ref(struct nouveau_device *dev, uint32_t handle, + nvbo->size = req.size; + nvbo->handle = req.handle; } - - *handle = nvbo->global_handle; -@@ -412,6 +413,8 @@ - { - struct nouveau_bo_priv *nvbo = priv; - -+ nouveau_fence_ref(NULL, &nvbo->fence); -+ nouveau_fence_ref(NULL, &nvbo->wr_fence); - nouveau_bo_kfree(nvbo); - free(nvbo); - } -diff -Nur libdrm-2.4.5.orig/libdrm/nouveau/nouveau_device.c libdrm-2.4.5/libdrm/nouveau/nouveau_device.c ---- libdrm-2.4.5.orig/libdrm/nouveau/nouveau_device.c 2009-02-22 03:54:48.000000000 +1000 -+++ libdrm-2.4.5/libdrm/nouveau/nouveau_device.c 2009-03-25 09:06:21.000000000 +1000 -@@ -76,6 +76,22 @@ - } - nvdev->base.vm_vram_base = value; - -+ ret = nouveau_device_get_param(&nvdev->base, -+ NOUVEAU_GETPARAM_FB_SIZE, &value); -+ if (ret) { -+ nouveau_device_close((void *)&nvdev); -+ return ret; -+ } -+ nvdev->vram_aper_size = value; +- + -+ ret = nouveau_device_get_param(&nvdev->base, -+ NOUVEAU_GETPARAM_AGP_SIZE, &value); -+ if (ret) { -+ nouveau_device_close((void *)&nvdev); -+ return ret; -+ } -+ nvdev->gart_aper_size = value; -+ - ret = nouveau_bo_init(&nvdev->base); - if (ret) { - nouveau_device_close((void *)&nvdev); -@@ -128,7 +144,7 @@ - { - struct nouveau_device_priv *nvdev; - -- if (dev || !*dev) -+ if (!dev || !*dev) - return; - nvdev = nouveau_device(*dev); - *dev = NULL; -diff -Nur libdrm-2.4.5.orig/libdrm/nouveau/nouveau_drmif.h libdrm-2.4.5/libdrm/nouveau/nouveau_drmif.h ---- libdrm-2.4.5.orig/libdrm/nouveau/nouveau_drmif.h 2009-02-11 10:09:35.000000000 +1000 -+++ libdrm-2.4.5/libdrm/nouveau/nouveau_drmif.h 2009-03-25 09:06:21.000000000 +1000 -@@ -37,6 +37,9 @@ - int needs_close; - - int mm_enabled; -+/*XXX: move to nouveau_device when interface gets bumped */ -+ uint64_t vram_aper_size; -+ uint64_t gart_aper_size; - }; - #define nouveau_device(n) ((struct nouveau_device_priv *)(n)) - -diff -Nur libdrm-2.4.5.orig/libdrm/nouveau/nouveau_fence.c libdrm-2.4.5/libdrm/nouveau/nouveau_fence.c ---- libdrm-2.4.5.orig/libdrm/nouveau/nouveau_fence.c 2009-02-11 10:09:35.000000000 +1000 -+++ libdrm-2.4.5/libdrm/nouveau/nouveau_fence.c 2009-03-25 09:06:21.000000000 +1000 -@@ -96,22 +96,16 @@ - int - nouveau_fence_ref(struct nouveau_fence *ref, struct nouveau_fence **fence) - { -- struct nouveau_fence_priv *nvfence; -- - if (!fence) - return -EINVAL; - -- if (*fence) { -- nouveau_fence_del(fence); -- *fence = NULL; -- } -+ if (ref) -+ nouveau_fence(ref)->refcount++; - -- if (ref) { -- nvfence = nouveau_fence(ref); -- nvfence->refcount++; -- *fence = &nvfence->base; -- } -+ if (*fence) -+ nouveau_fence_del(fence); - -+ *fence = ref; ++ nvbo->base.handle = nvbo->handle; return 0; - } + } - +diff --git a/libdrm/nouveau/nouveau_dma.c b/libdrm/nouveau/nouveau_dma.c +index 23da64b..b084f70 100644 +--- a/libdrm/nouveau/nouveau_dma.c ++++ b/libdrm/nouveau/nouveau_dma.c +@@ -41,6 +41,7 @@ WRITE_PUT(struct nouveau_channel_priv *nvchan, uint32_t val) + volatile int dum; + + NOUVEAU_DMA_BARRIER; ++ dum = nvchan->pushbuf[0]; + dum = READ_GET(nvchan); + + *nvchan->put = put;