[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

libdrm: Changes to 'debian-unstable'



 ChangeLog                 |   66 +++++++++++++++++
 configure.ac              |    3 
 debian/changelog          |    6 +
 intel/intel_bufmgr_gem.c  |   35 +++++++--
 nouveau/nouveau_grobj.c   |    3 
 tests/Makefile.am         |    4 +
 tests/radeon/Makefile.am  |   12 +++
 tests/radeon/list.h       |  137 ++++++++++++++++++++++++++++++++++++
 tests/radeon/radeon_ttm.c |   75 ++++++++++++++++++++
 tests/radeon/rbo.c        |  171 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/radeon/rbo.h        |   50 +++++++++++++
 xf86drm.c                 |    8 +-
 12 files changed, 558 insertions(+), 12 deletions(-)

New commits:
commit 39b6ee2a990637e2cca665800eaa45c3f378d79d
Author: Cyril Brulebois <kibi@debian.org>
Date:   Tue Dec 6 15:17:53 2011 +0100

    Upload to unstable.

diff --git a/debian/changelog b/debian/changelog
index 32a09b4..69c262f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,8 @@
-libdrm (2.4.28-1) UNRELEASED; urgency=low
+libdrm (2.4.28-1) unstable; urgency=low
 
   * New upstream release.
 
- -- Cyril Brulebois <kibi@debian.org>  Tue, 06 Dec 2011 15:16:09 +0100
+ -- Cyril Brulebois <kibi@debian.org>  Tue, 06 Dec 2011 15:17:50 +0100
 
 libdrm (2.4.27-1) unstable; urgency=low
 

commit 99335af48c702cfedf7aa76a40f51e0f8d552622
Author: Cyril Brulebois <kibi@debian.org>
Date:   Tue Dec 6 15:17:47 2011 +0100

    Bump changelogs.

diff --git a/ChangeLog b/ChangeLog
index bac7f78..2bfd7b8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,69 @@
+commit e73161a02b604742e3da3bca8f13cff81276de43
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Mon Dec 5 10:30:52 2011 +0000
+
+    configure: Bump version to 2.4.28
+    
+    So that we can pull a couple of Intel bug fixes into xf86-video-intel.
+    
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+commit c549a777c1b6227a724942c64aa5cd181eb93c6c
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date:   Mon Dec 5 10:14:34 2011 +0000
+
+    intel: Unmap buffers during drm_intel_gem_bo_unmap
+    
+    We cannot afford to cache the vma per open bo as this may exhaust the
+    per-process limits.
+    
+    References: https://bugs.freedesktop.org/show_bug.cgi?id=43075
+    References: https://bugs.freedesktop.org/show_bug.cgi?id=40066
+    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+commit 36cff1cbb89477c839588a7e40fec2a8db7df396
+Author: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date:   Sun Dec 4 12:51:45 2011 +0100
+
+    intel: limit aperture space to mappable area on gen3
+    
+    Otherwise we blow up on heavy tiled blitter loads (with giant
+    pixmaps).
+    
+    Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+    Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+commit 37ccce5e390a9d757474920f488cafa1cf89854a
+Author: Maarten Lankhorst <m.b.lankhorst@gmail.com>
+Date:   Thu Nov 24 14:08:53 2011 +0100
+
+    nouveau: Mark nouveau subchannel unbound nouveau_grobj_free
+    
+    Valgrind throws warns about a user-after-free if you try to bind a
+    new subchannel after the old one in that slot was freed,
+    so remove it from the channel list.
+    
+    Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com>
+
+commit ca4971292cf99e0063416cd1c3467af94637bf2b
+Author: Jerome Glisse <jglisse@redhat.com>
+Date:   Thu Nov 10 16:47:10 2011 -0500
+
+    tests/radeon: radeon specific test
+    
+    Initial test only include ttm test for stressing ttm memory
+    allocations.
+    
+    Signed-off-by: Jerome Glisse <jglisse@redhat.com>
+
+commit 961bf9b5c2866ccb4fedf2b45b29fb688519d0db
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Tue Nov 1 14:42:13 2011 -0700
+
+    Fix compilation with -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
 commit cc9b751e82c5a3525907bba30ba3c95246751824
 Author: Eric Anholt <eric@anholt.net>
 Date:   Fri Oct 28 13:14:44 2011 -0700
diff --git a/debian/changelog b/debian/changelog
index 0fa808d..32a09b4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+libdrm (2.4.28-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Cyril Brulebois <kibi@debian.org>  Tue, 06 Dec 2011 15:16:09 +0100
+
 libdrm (2.4.27-1) unstable; urgency=low
 
   * New upstream release:

commit e73161a02b604742e3da3bca8f13cff81276de43
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Mon Dec 5 10:30:52 2011 +0000

    configure: Bump version to 2.4.28
    
    So that we can pull a couple of Intel bug fixes into xf86-video-intel.
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index 1447785..829e8d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@
 
 AC_PREREQ([2.63])
 AC_INIT([libdrm],
-        [2.4.27],
+        [2.4.28],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=DRI],
         [libdrm])
 

commit c549a777c1b6227a724942c64aa5cd181eb93c6c
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Mon Dec 5 10:14:34 2011 +0000

    intel: Unmap buffers during drm_intel_gem_bo_unmap
    
    We cannot afford to cache the vma per open bo as this may exhaust the
    per-process limits.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=43075
    References: https://bugs.freedesktop.org/show_bug.cgi?id=40066
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index 0cfeb98..d862329 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -156,6 +156,7 @@ struct _drm_intel_bo_gem {
 	void *mem_virtual;
 	/** GTT virtual address for the buffer, saved across map/unmap cycles */
 	void *gtt_virtual;
+	int map_count;
 
 	/** BO cache list */
 	drmMMListHead head;
@@ -879,11 +880,6 @@ drm_intel_gem_bo_free(drm_intel_bo *bo)
 	struct drm_gem_close close;
 	int ret;
 
-	if (bo_gem->mem_virtual)
-		munmap(bo_gem->mem_virtual, bo_gem->bo.size);
-	if (bo_gem->gtt_virtual)
-		munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
-
 	/* Close this object */
 	memset(&close, 0, sizeof(close));
 	close.handle = bo_gem->gem_handle;
@@ -1017,6 +1013,7 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
 		struct drm_i915_gem_mmap mmap_arg;
 
 		DBG("bo_map: %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
+		assert(bo_gem->map_count == 0);
 
 		memset(&mmap_arg, 0, sizeof(mmap_arg));
 		mmap_arg.handle = bo_gem->gem_handle;
@@ -1038,6 +1035,7 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
 	DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
 	    bo_gem->mem_virtual);
 	bo->virtual = bo_gem->mem_virtual;
+	bo_gem->map_count++;
 
 	set_domain.handle = bo_gem->gem_handle;
 	set_domain.read_domains = I915_GEM_DOMAIN_CPU;
@@ -1077,6 +1075,7 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
 
 		DBG("bo_map_gtt: mmap %d (%s)\n", bo_gem->gem_handle,
 		    bo_gem->name);
+		assert(bo_gem->map_count == 0);
 
 		memset(&mmap_arg, 0, sizeof(mmap_arg));
 		mmap_arg.handle = bo_gem->gem_handle;
@@ -1112,6 +1111,7 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
 	}
 
 	bo->virtual = bo_gem->gtt_virtual;
+	bo_gem->map_count++;
 
 	DBG("bo_map_gtt: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
 	    bo_gem->gtt_virtual);
@@ -1161,7 +1161,22 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
 		bo_gem->mapped_cpu_write = false;
 	}
 
-	bo->virtual = NULL;
+	/* We need to unmap after every innovation as we cannot track
+	 * an open vma for every bo as that will exhaasut the system
+	 * limits and cause later failures.
+	 */
+	if (--bo_gem->map_count == 0) {
+		if (bo_gem->mem_virtual) {
+			munmap(bo_gem->mem_virtual, bo_gem->bo.size);
+			bo_gem->mem_virtual = NULL;
+		}
+		if (bo_gem->gtt_virtual) {
+			munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
+			bo_gem->gtt_virtual = NULL;
+		}
+
+		bo->virtual = NULL;
+	}
 	pthread_mutex_unlock(&bufmgr_gem->lock);
 
 	return ret;

commit 36cff1cbb89477c839588a7e40fec2a8db7df396
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Sun Dec 4 12:51:45 2011 +0100

    intel: limit aperture space to mappable area on gen3
    
    Otherwise we blow up on heavy tiled blitter loads (with giant
    pixmaps).
    
    Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Acked-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index dd58c0c..0cfeb98 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -2204,6 +2204,14 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)
 	else
 		bufmgr_gem->gen = 6;
 
+	if (IS_GEN3(bufmgr_gem) && bufmgr_gem->gtt_size > 256*1024*1024) {
+		/* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't
+		 * be used for tiled blits. To simplify the accounting, just
+		 * substract the unmappable part (fixed to 256MB on all known
+		 * gen3 devices) if the kernel advertises it. */
+		bufmgr_gem->gtt_size -= 256*1024*1024;
+	}
+
 	gp.value = &tmp;
 
 	gp.param = I915_PARAM_HAS_EXECBUF2;

commit 37ccce5e390a9d757474920f488cafa1cf89854a
Author: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Date:   Thu Nov 24 14:08:53 2011 +0100

    nouveau: Mark nouveau subchannel unbound nouveau_grobj_free
    
    Valgrind throws warns about a user-after-free if you try to bind a
    new subchannel after the old one in that slot was freed,
    so remove it from the channel list.
    
    Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com>

diff --git a/nouveau/nouveau_grobj.c b/nouveau/nouveau_grobj.c
index c6b98f1..36344b9 100644
--- a/nouveau/nouveau_grobj.c
+++ b/nouveau/nouveau_grobj.c
@@ -100,12 +100,13 @@ nouveau_grobj_free(struct nouveau_grobj **grobj)
 		struct drm_nouveau_gpuobj_free f;
 
 		FIRE_RING(&chan->base);
-
 		f.channel = chan->drm.channel;
 		f.handle  = nvgrobj->base.handle;
 		drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GPUOBJ_FREE,
 				&f, sizeof(f));	
 	}
+	if (nvgrobj->base.bound != NOUVEAU_GROBJ_UNBOUND)
+		chan->base.subc[nvgrobj->base.subc].gr = NULL;
 	free(nvgrobj);
 }
 

commit ca4971292cf99e0063416cd1c3467af94637bf2b
Author: Jerome Glisse <jglisse@redhat.com>
Date:   Thu Nov 10 16:47:10 2011 -0500

    tests/radeon: radeon specific test
    
    Initial test only include ttm test for stressing ttm memory
    allocations.
    
    Signed-off-by: Jerome Glisse <jglisse@redhat.com>

diff --git a/configure.ac b/configure.ac
index 95d64a7..1447785 100644
--- a/configure.ac
+++ b/configure.ac
@@ -283,6 +283,7 @@ AC_CONFIG_FILES([
 	tests/modeprint/Makefile
 	tests/modetest/Makefile
 	tests/kmstest/Makefile
+	tests/radeon/Makefile
 	tests/vbltest/Makefile
 	include/Makefile
 	include/drm/Makefile
diff --git a/tests/Makefile.am b/tests/Makefile.am
index bf1987f..a3a59bd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -16,6 +16,10 @@ if HAVE_LIBKMS
 SUBDIRS += kmstest modetest
 endif
 
+if HAVE_RADEON
+SUBDIRS += radeon
+endif
+
 if HAVE_LIBUDEV
 
 check_LTLIBRARIES = libdrmtest.la
diff --git a/tests/radeon/Makefile.am b/tests/radeon/Makefile.am
new file mode 100644
index 0000000..021ca72
--- /dev/null
+++ b/tests/radeon/Makefile.am
@@ -0,0 +1,12 @@
+AM_CFLAGS = \
+	-I $(top_srcdir)/include/drm \
+	-I $(top_srcdir)
+
+LDADD = $(top_builddir)/libdrm.la
+
+noinst_PROGRAMS = \
+	radeon_ttm
+
+radeon_ttm_SOURCES = \
+	rbo.c \
+	radeon_ttm.c
diff --git a/tests/radeon/list.h b/tests/radeon/list.h
new file mode 100644
index 0000000..305c903
--- /dev/null
+++ b/tests/radeon/list.h
@@ -0,0 +1,137 @@
+/*
+ *
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ */
+
+/**
+ * \file
+ * List macros heavily inspired by the Linux kernel
+ * list handling. No list looping yet.
+ *
+ * Is not threadsafe, so common operations need to
+ * be protected using an external mutex.
+ */
+#ifndef _U_DOUBLE_LIST_H_
+#define _U_DOUBLE_LIST_H_
+
+#include <stddef.h>
+
+struct list_head
+{
+    struct list_head *prev;
+    struct list_head *next;
+};
+
+static void list_inithead(struct list_head *item)
+{
+    item->prev = item;
+    item->next = item;
+}
+
+static void list_add(struct list_head *item, struct list_head *list)
+{
+    item->prev = list;
+    item->next = list->next;
+    list->next->prev = item;
+    list->next = item;
+}
+
+static void list_addtail(struct list_head *item, struct list_head *list)
+{
+    item->next = list;
+    item->prev = list->prev;
+    list->prev->next = item;
+    list->prev = item;
+}
+
+static void list_replace(struct list_head *from, struct list_head *to)
+{
+    to->prev = from->prev;
+    to->next = from->next;
+    from->next->prev = to;
+    from->prev->next = to;
+}
+
+static void list_del(struct list_head *item)
+{
+    item->prev->next = item->next;
+    item->next->prev = item->prev;
+}
+
+static void list_delinit(struct list_head *item)
+{
+    item->prev->next = item->next;
+    item->next->prev = item->prev;
+    item->next = item;
+    item->prev = item;
+}
+
+#define LIST_INITHEAD(__item) list_inithead(__item)
+#define LIST_ADD(__item, __list) list_add(__item, __list)
+#define LIST_ADDTAIL(__item, __list) list_addtail(__item, __list)
+#define LIST_REPLACE(__from, __to) list_replace(__from, __to)
+#define LIST_DEL(__item) list_del(__item)
+#define LIST_DELINIT(__item) list_delinit(__item)
+
+#define LIST_ENTRY(__type, __item, __field)   \
+    ((__type *)(((char *)(__item)) - offsetof(__type, __field)))
+
+#define LIST_IS_EMPTY(__list)                   \
+    ((__list)->next == (__list))
+
+#ifndef container_of
+#define container_of(ptr, sample, member)				\
+    (void *)((char *)(ptr)						\
+	     - ((char *)&(sample)->member - (char *)(sample)))
+#endif
+
+#define LIST_FOR_EACH_ENTRY(pos, head, member)				\
+   for (pos = container_of((head)->next, pos, member);			\
+	&pos->member != (head);						\
+	pos = container_of(pos->member.next, pos, member))
+
+#define LIST_FOR_EACH_ENTRY_SAFE(pos, storage, head, member)	\
+   for (pos = container_of((head)->next, pos, member),			\
+	storage = container_of(pos->member.next, pos, member);	\
+	&pos->member != (head);						\
+	pos = storage, storage = container_of(storage->member.next, storage, member))
+
+#define LIST_FOR_EACH_ENTRY_SAFE_REV(pos, storage, head, member)	\
+   for (pos = container_of((head)->prev, pos, member),			\
+	storage = container_of(pos->member.prev, pos, member);		\
+	&pos->member != (head);						\
+	pos = storage, storage = container_of(storage->member.prev, storage, member))
+
+#define LIST_FOR_EACH_ENTRY_FROM(pos, start, head, member)		\
+   for (pos = container_of((start), pos, member);			\
+	&pos->member != (head);						\
+	pos = container_of(pos->member.next, pos, member))
+
+#define LIST_FOR_EACH_ENTRY_FROM_REV(pos, start, head, member)		\
+   for (pos = container_of((start), pos, member);			\
+	&pos->member != (head);						\
+	pos = container_of(pos->member.prev, pos, member))
+
+#endif /*_U_DOUBLE_LIST_H_*/
diff --git a/tests/radeon/radeon_ttm.c b/tests/radeon/radeon_ttm.c
new file mode 100644
index 0000000..246fd99
--- /dev/null
+++ b/tests/radeon/radeon_ttm.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2011 Red Hat
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Jerome Glisse <j.glisse@gmail.com>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "rbo.h"
+
+/* allocate as many single page bo to try to starve the kernel
+ * memory zone (below highmem)
+ */
+void ttm_starve_kernel_private_memory(int fd)
+{
+    struct list_head list;
+    struct rbo *bo, *tmp;
+    unsigned nbo = 0;
+
+    printf("\n[%s]\n", __func__);
+    list_inithead(&list);
+    while (1) {
+        bo = rbo(fd, 0, 4096, 0, NULL);
+        if (bo == NULL) {
+            printf("failing after %d bo\n", nbo);
+            break;
+        }
+        nbo++;
+        list_add(&bo->list, &list);
+    }
+    LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, &list, list) {
+        list_del(&bo->list);
+        rbo_decref(bo);
+    }
+}
+
+int radeon_open_fd(void)
+{
+    return drmOpen("radeon", NULL);
+}
+
+int main(void)
+{
+    int radeonfd;
+
+    radeonfd = radeon_open_fd();
+    if (radeonfd < 0) {
+        fprintf(stderr, "failed to open radeon fd\n");
+        return -1;
+    }
+
+    ttm_starve_kernel_private_memory(radeonfd);
+
+    close(radeonfd);
+    return 0;
+}
diff --git a/tests/radeon/rbo.c b/tests/radeon/rbo.c
new file mode 100644
index 0000000..70a288c
--- /dev/null
+++ b/tests/radeon/rbo.c
@@ -0,0 +1,171 @@
+/*
+ * Copyright © 2011 Red Hat
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Jerome Glisse <j.glisse@gmail.com>
+ */
+#define _FILE_OFFSET_BITS 64
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include "xf86drm.h"
+#include "radeon_drm.h"
+#include "rbo.h"
+
+struct rbo *rbo(int fd, unsigned handle, unsigned size,
+                unsigned alignment, void *ptr)
+{
+    struct rbo *bo;
+    int r;
+
+    bo = calloc(1, sizeof(*bo));
+    if (bo == NULL) {
+        return NULL;
+    }
+    list_inithead(&bo->list);
+    bo->fd = fd;
+    bo->size = size;
+    bo->handle = handle;
+    bo->refcount = 1;
+    bo->alignment = alignment;
+
+    if (handle) {
+        struct drm_gem_open open_arg;
+
+        memset(&open_arg, 0, sizeof(open_arg));
+        open_arg.name = handle;
+        r = drmIoctl(fd, DRM_IOCTL_GEM_OPEN, &open_arg);
+        if (r != 0) {
+            free(bo);
+            return NULL;
+        }
+        bo->handle = open_arg.handle;
+    } else {
+        struct drm_radeon_gem_create args;
+
+        args.size = size;
+        args.alignment = alignment;
+        args.initial_domain = RADEON_GEM_DOMAIN_CPU;
+        args.flags = 0;
+        args.handle = 0;
+        r = drmCommandWriteRead(fd, DRM_RADEON_GEM_CREATE,
+                                &args, sizeof(args));
+        bo->handle = args.handle;
+        if (r) {
+            fprintf(stderr, "Failed to allocate :\n");
+            fprintf(stderr, "   size      : %d bytes\n", size);
+            fprintf(stderr, "   alignment : %d bytes\n", alignment);
+            free(bo);
+            return NULL;
+        }
+    }
+    if (ptr) {
+        if (rbo_map(bo)) {
+            fprintf(stderr, "%s failed to copy data into bo\n", __func__);
+            return rbo_decref(bo);
+        }
+        memcpy(bo->data, ptr, size);
+        rbo_unmap(bo);
+    }
+    return bo;
+}
+
+int rbo_map(struct rbo *bo)
+{
+    struct drm_radeon_gem_mmap args;
+    void *ptr;
+    int r;
+
+    if (bo->mapcount++ != 0) {
+        return 0;
+    }
+    /* Zero out args to make valgrind happy */
+    memset(&args, 0, sizeof(args));
+    args.handle = bo->handle;
+    args.offset = 0;
+    args.size = (uint64_t)bo->size;
+    r = drmCommandWriteRead(bo->fd, DRM_RADEON_GEM_MMAP,
+                            &args, sizeof(args));
+    if (r) {
+        fprintf(stderr, "error mapping %p 0x%08X (error = %d)\n",
+            bo, bo->handle, r);
+        return r;
+    }
+    ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, bo->fd, args.addr_ptr);
+    if (ptr == MAP_FAILED) {
+        fprintf(stderr, "%s failed to map bo\n", __func__);
+        return -errno;
+    }
+    bo->data = ptr;
+    return 0;
+}
+
+void rbo_unmap(struct rbo *bo)
+{
+    if (--bo->mapcount > 0) {
+        return;
+    }
+    munmap(bo->data, bo->size);
+    bo->data = NULL;
+}
+
+struct rbo *rbo_incref(struct rbo *bo)
+{
+    bo->refcount++;
+    return bo;
+}
+
+struct rbo *rbo_decref(struct rbo *bo)
+{
+    struct drm_gem_close args;
+
+    if (bo == NULL)
+        return NULL;
+    if (--bo->refcount > 0) {
+        return NULL;
+    }
+
+    munmap(bo->data, bo->size);
+    memset(&args, 0, sizeof(args));
+    args.handle = bo->handle;
+    drmIoctl(bo->fd, DRM_IOCTL_GEM_CLOSE, &args);
+    memset(bo, 0, sizeof(struct rbo));
+    free(bo);
+    return NULL;
+}
+
+int rbo_wait(struct rbo *bo)
+{
+    struct drm_radeon_gem_wait_idle args;
+    int ret;
+
+    /* Zero out args to make valgrind happy */
+    memset(&args, 0, sizeof(args));
+    args.handle = bo->handle;
+    do {
+        ret = drmCommandWriteRead(bo->fd, DRM_RADEON_GEM_WAIT_IDLE,
+                                  &args, sizeof(args));
+    } while (ret == -EBUSY);
+    return ret;
+}
diff --git a/tests/radeon/rbo.h b/tests/radeon/rbo.h
new file mode 100644
index 0000000..c25c73a
--- /dev/null
+++ b/tests/radeon/rbo.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2011 Red Hat
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Jerome Glisse <j.glisse@gmail.com>
+ */
+#ifndef RBO_H
+#define RBO_H
+
+#include "list.h"
+
+struct rbo {
+    struct list_head    list;
+    int                 fd;
+    unsigned            refcount;
+    unsigned            mapcount;
+    unsigned            handle;
+    unsigned            size;
+    unsigned            alignment;
+    void                *data;
+};
+
+struct rbo *rbo(int fd, unsigned handle, unsigned size,
+                unsigned alignment, void *ptr);
+int rbo_map(struct rbo *bo);
+void rbo_unmap(struct rbo *bo);
+struct rbo *rbo_incref(struct rbo *bo);
+struct rbo *rbo_decref(struct rbo *bo);
+int rbo_wait(struct rbo *bo);
+
+#endif

commit 961bf9b5c2866ccb4fedf2b45b29fb688519d0db
Author: Jeremy Huddleston <jeremyhu@apple.com>
Date:   Tue Nov 1 14:42:13 2011 -0700

    Fix compilation with -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast
    
    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>

diff --git a/xf86drm.c b/xf86drm.c
index a183eee..6ea068f 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -976,7 +976,7 @@ int drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type,
     if (drmIoctl(fd, DRM_IOCTL_ADD_MAP, &map))
 	return -errno;
     if (handle)
-	*handle = (drm_handle_t)map.handle;
+	*handle = (drm_handle_t)(uintptr_t)map.handle;
     return 0;
 }
 
@@ -984,7 +984,7 @@ int drmRmMap(int fd, drm_handle_t handle)
 {
     drm_map_t map;
 
-    map.handle = (void *)handle;
+    map.handle = (void *)(uintptr_t)handle;
 
     if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map))
 	return -errno;
@@ -2120,7 +2120,7 @@ int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
     drm_ctx_priv_map_t map;
 
     map.ctx_id = ctx_id;
-    map.handle = (void *)handle;
+    map.handle = (void *)(uintptr_t)handle;
 
     if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map))
 	return -errno;
@@ -2137,7 +2137,7 @@ int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
     if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))
 	return -errno;
     if (handle)
-	*handle = (drm_handle_t)map.handle;
+	*handle = (drm_handle_t)(uintptr_t)map.handle;
 
     return 0;
 }


Reply to: