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

libdrm: Changes to 'debian-experimental'



 debian/changelog                               |    7 
 debian/control                                 |   31 
 debian/libdrm-nouveau1a.install                |    1 
 debian/libdrm-nouveau1a.lintian-overrides      |    1 
 debian/libdrm-nouveau1a.symbols                |   46 
 debian/patches/04_libdrm-2.4.37-nouveau-1.diff | 2921 -------------------------
 debian/patches/series                          |    1 
 debian/rules                                   |    8 
 8 files changed, 1 insertion(+), 3015 deletions(-)

New commits:
commit d05a296c523daed4558ea01b0eac7c896c66a63d
Author: Sven Joachim <svenjoac@gmx.de>
Date:   Wed Sep 5 19:19:24 2012 +0200

    Remove libdrm-nouveau1a
    
    Since Plymouth in Wheezy no longer links against libdrm_nouveau and
    Mesa 9.0 uses the new nouveau ABI, this package is redundant.

diff --git a/debian/changelog b/debian/changelog
index 11f33a7..51d7487 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,12 +2,7 @@ libdrm (2.4.39-1) UNRELEASED; urgency=low
 
   [ Maarten Lankhorst ]
   * New upstream release.
-  * Modify libdrm-2.4.37-nouveau-1.patch from fedora 17
-    - Allows building libdrm_nouveau.so.1 and 2 simultaneously
-    - libdrm_nouveau1.{so,pc} links to legacy libdrm_nouveau.so.1
-    - libdrm_nouveau.{so,pc} links to new api libdrm_nouveau.so.2
-    - This is done to allow building upstream unmodified,
-      while retaining compatibility with mesa stable
+    - Nouveau ABI change, replace libdrm-nouveau1a with libdrm-nouveau2.
 
   [ Timo Aaltonen ]
   * Bump libdrm-intel1's and libdrm-nouveau2's shlibs due to new symbols.
diff --git a/debian/control b/debian/control
index 96826f3..12171e7 100644
--- a/debian/control
+++ b/debian/control
@@ -23,7 +23,6 @@ Depends:
  libdrm2 (= ${binary:Version}),
  libdrm-intel1 (= ${binary:Version}) [amd64 i386 kfreebsd-amd64 kfreebsd-i386],
  libdrm-radeon1 (= ${binary:Version}) [linux-any],
- libdrm-nouveau1a (= ${binary:Version}) [linux-any],
  libdrm-nouveau2 (= ${binary:Version}) [linux-any],
  libdrm-omap1 (= ${binary:Version}) [any-arm],
  libkms1 (= ${binary:Version}) [linux-any],
@@ -113,36 +112,6 @@ Description: Userspace interface to intel-specific kernel DRM services -- debugg
  .
  This package provides the debugging symbols for the libdrm-intel1 package.
 
-Package: libdrm-nouveau1a
-Section: libs
-Architecture: linux-any
-Depends: ${shlibs:Depends},
- ${misc:Depends},
-Conflicts: libdrm-nouveau1
-Pre-Depends: ${misc:Pre-Depends}
-Multi-Arch: same
-Description: Userspace interface to nouveau-specific kernel DRM services -- runtime
- This library implements the userspace interface to the nouveau-specific kernel
- DRM services. DRM stands for "Direct Rendering Manager", which is the
- kernelspace portion of the "Direct Rendering Infrastructure" (DRI). The DRI is
- currently used on Linux to provide hardware-accelerated OpenGL drivers.
-
-Package: libdrm-nouveau1a-dbg
-Section: debug
-Priority: extra
-Architecture: linux-any
-Depends: libdrm-nouveau1a (= ${binary:Version}),
- ${misc:Depends},
-Conflicts: libdrm-nouveau1-dbg
-Multi-Arch: same
-Description: Userspace interface to nouveau-specific kernel DRM -- debugging symbols
- This library implements the userspace interface to the kernel DRM services.
- DRM stands for "Direct Rendering Manager", which is the kernelspace portion
- of the "Direct Rendering Infrastructure" (DRI). The DRI is currently used on
- Linux to provide hardware-accelerated OpenGL drivers.
- .
- This package provides the debugging symbols for the libdrm-nouveau1a package.
-
 Package: libdrm-nouveau2
 Section: libs
 Architecture: linux-any
diff --git a/debian/libdrm-nouveau1a.install b/debian/libdrm-nouveau1a.install
deleted file mode 100644
index 6c55080..0000000
--- a/debian/libdrm-nouveau1a.install
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/*/libdrm_nouveau.so.1*
diff --git a/debian/libdrm-nouveau1a.lintian-overrides b/debian/libdrm-nouveau1a.lintian-overrides
deleted file mode 100644
index 76c525b..0000000
--- a/debian/libdrm-nouveau1a.lintian-overrides
+++ /dev/null
@@ -1 +0,0 @@
-libdrm-nouveau1a: package-name-doesnt-match-sonames libdrm-nouveau1
diff --git a/debian/libdrm-nouveau1a.symbols b/debian/libdrm-nouveau1a.symbols
deleted file mode 100644
index a2ba922..0000000
--- a/debian/libdrm-nouveau1a.symbols
+++ /dev/null
@@ -1,46 +0,0 @@
-libdrm_nouveau.so.1 libdrm-nouveau1a #MINVER#
- nouveau_bo_busy@Base 2.4.23
- nouveau_bo_emit_buffer@Base 2.4.23
- nouveau_bo_handle_get@Base 2.4.23
- nouveau_bo_handle_ref@Base 2.4.23
- nouveau_bo_init@Base 2.4.23
- nouveau_bo_map@Base 2.4.23
- nouveau_bo_map_flush@Base 2.4.23
- nouveau_bo_map_range@Base 2.4.23
- nouveau_bo_new@Base 2.4.23
- nouveau_bo_new_tile@Base 2.4.23
- nouveau_bo_pending@Base 2.4.23
- nouveau_bo_ref@Base 2.4.23
- nouveau_bo_takedown@Base 2.4.23
- nouveau_bo_unmap@Base 2.4.23
- nouveau_bo_user@Base 2.4.23
- nouveau_bo_wrap@Base 2.4.23
- nouveau_channel_alloc@Base 2.4.23
- nouveau_channel_free@Base 2.4.23
- nouveau_device_close@Base 2.4.23
- nouveau_device_get_param@Base 2.4.23
- nouveau_device_open@Base 2.4.23
- nouveau_device_open_existing@Base 2.4.23
- nouveau_device_set_param@Base 2.4.23
- nouveau_grobj_alloc@Base 2.4.23
- nouveau_grobj_autobind@Base 2.4.23
- nouveau_grobj_free@Base 2.4.23
- nouveau_grobj_ref@Base 2.4.23
- nouveau_notifier_alloc@Base 2.4.23
- nouveau_notifier_free@Base 2.4.23
- nouveau_notifier_reset@Base 2.4.23
- nouveau_notifier_return_val@Base 2.4.23
- nouveau_notifier_status@Base 2.4.23
- nouveau_notifier_wait_status@Base 2.4.23
- nouveau_pushbuf_emit_reloc@Base 2.4.23
- nouveau_pushbuf_fini@Base 2.4.23
- nouveau_pushbuf_flush@Base 2.4.23
- nouveau_pushbuf_init@Base 2.4.23
- nouveau_pushbuf_marker_emit@Base 2.4.23
- nouveau_pushbuf_marker_undo@Base 2.4.23
- nouveau_pushbuf_submit@Base 2.4.23
- nouveau_reloc_emit@Base 2.4.23
- nouveau_resource_alloc@Base 2.4.23
- nouveau_resource_destroy@Base 2.4.23
- nouveau_resource_free@Base 2.4.23
- nouveau_resource_init@Base 2.4.23
diff --git a/debian/patches/04_libdrm-2.4.37-nouveau-1.diff b/debian/patches/04_libdrm-2.4.37-nouveau-1.diff
deleted file mode 100644
index 10f02a9..0000000
--- a/debian/patches/04_libdrm-2.4.37-nouveau-1.diff
+++ /dev/null
@@ -1,2921 +0,0 @@
-diff --git a/Makefile.am b/Makefile.am
-index 256a8cc..045add1 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -34,7 +34,7 @@ INTEL_SUBDIR = intel
- endif
- 
- if HAVE_NOUVEAU
--NOUVEAU_SUBDIR = nouveau
-+NOUVEAU_SUBDIR = nouveau-1 nouveau
- endif
- 
- if HAVE_RADEON
-diff --git a/configure.ac b/configure.ac
-index a1c8c69..6439b81 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -319,6 +319,8 @@ AC_CONFIG_FILES([
- 	intel/libdrm_intel.pc
- 	radeon/Makefile
- 	radeon/libdrm_radeon.pc
-+	nouveau-1/Makefile
-+	nouveau-1/libdrm_nouveau1.pc
- 	nouveau/Makefile
- 	nouveau/libdrm_nouveau.pc
- 	omap/Makefile
-diff --git a/nouveau-1/Makefile.am b/nouveau-1/Makefile.am
-new file mode 100644
-index 0000000..7e6aa13
---- /dev/null
-+++ b/nouveau-1/Makefile.am
-@@ -0,0 +1,43 @@
-+AM_CFLAGS = \
-+	$(WARN_CFLAGS) \
-+	-I$(top_srcdir) \
-+	-I$(top_srcdir)/nouveau-1 \
-+	$(PTHREADSTUBS_CFLAGS) \
-+	-I$(top_srcdir)/include/drm
-+
-+libdrm_nouveau_la_LTLIBRARIES = libdrm_nouveau.la
-+libdrm_nouveau_ladir = $(libdir)
-+libdrm_nouveau_la_LDFLAGS = -version-number 1:0:0 -no-undefined
-+libdrm_nouveau_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@
-+
-+libdrm_nouveau_la_SOURCES = \
-+			    nouveau_device.c \
-+			    nouveau_channel.c \
-+			    nouveau_pushbuf.c \
-+			    nouveau_grobj.c \
-+			    nouveau_notifier.c \
-+			    nouveau_bo.c \
-+			    nouveau_resource.c \
-+			    nouveau_private.h \
-+			    nouveau_reloc.c
-+
-+libdrm_nouveaucommonincludedir = ${includedir}/nouveau
-+libdrm_nouveaucommoninclude_HEADERS = \
-+				nouveau_device.h \
-+				nouveau_channel.h \
-+				nouveau_grobj.h \
-+				nouveau_notifier.h \
-+				nouveau_pushbuf.h \
-+				nv04_pushbuf.h \
-+				nvc0_pushbuf.h \
-+				nouveau_bo.h \
-+				nouveau_resource.h \
-+				nouveau_reloc.h
-+
-+
-+libdrm_nouveauincludedir = ${includedir}/libdrm
-+libdrm_nouveauinclude_HEADERS = \
-+				nouveau_drmif.h
-+
-+pkgconfigdir = @pkgconfigdir@
-+pkgconfig_DATA = libdrm_nouveau1.pc
-diff --git a/nouveau-1/libdrm_nouveau1.pc.in b/nouveau-1/libdrm_nouveau1.pc.in
-new file mode 100644
-index 0000000..8f3d40f
---- /dev/null
-+++ b/nouveau-1/libdrm_nouveau1.pc.in
-@@ -0,0 +1,11 @@
-+prefix=@prefix@
-+exec_prefix=@exec_prefix@
-+libdir=@libdir@
-+includedir=@includedir@
-+
-+Name: libdrm_nouveau
-+Description: Userspace interface to nouveau kernel DRM services
-+Version: 0.6
-+Libs: -L${libdir} -ldrm_nouveau1
-+Cflags: -I${includedir} -I${includedir}/libdrm -I${includedir}/nouveau
-+Requires.private: libdrm
-diff --git a/nouveau-1/nouveau_bo.c b/nouveau-1/nouveau_bo.c
-new file mode 100644
-index 0000000..d6bb22d
---- /dev/null
-+++ b/nouveau-1/nouveau_bo.c
-@@ -0,0 +1,549 @@
-+/*
-+ * Copyright 2007 Nouveau Project
-+ *
-+ * 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 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 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.
-+ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+#include <stdint.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+#include <assert.h>
-+
-+#include <sys/mman.h>
-+
-+#include "nouveau_private.h"
-+
-+int
-+nouveau_bo_init(struct nouveau_device *dev)
-+{
-+	return 0;
-+}
-+
-+void
-+nouveau_bo_takedown(struct nouveau_device *dev)
-+{
-+}
-+
-+static int
-+nouveau_bo_info(struct nouveau_bo_priv *nvbo, struct drm_nouveau_gem_info *arg)
-+{
-+	nvbo->handle = nvbo->base.handle = arg->handle;
-+	nvbo->domain = arg->domain;
-+	nvbo->size = arg->size;
-+	nvbo->offset = arg->offset;
-+	nvbo->map_handle = arg->map_handle;
-+	nvbo->base.tile_mode = arg->tile_mode;
-+	/* XXX - flag inverted for backwards compatibility */
-+	nvbo->base.tile_flags = arg->tile_flags ^ NOUVEAU_GEM_TILE_NONCONTIG;
-+	return 0;
-+}
-+
-+static int
-+nouveau_bo_allocated(struct nouveau_bo_priv *nvbo)
-+{
-+	if (nvbo->sysmem || nvbo->handle)
-+		return 1;
-+	return 0;
-+}
-+
-+static int
-+nouveau_bo_ualloc(struct nouveau_bo_priv *nvbo)
-+{
-+	if (nvbo->user || nvbo->sysmem) {
-+		assert(nvbo->sysmem);
-+		return 0;
-+	}
-+
-+	nvbo->sysmem = malloc(nvbo->size);
-+	if (!nvbo->sysmem)
-+		return -ENOMEM;
-+
-+	return 0;
-+}
-+
-+static void
-+nouveau_bo_ufree(struct nouveau_bo_priv *nvbo)
-+{
-+	if (nvbo->sysmem) {
-+		if (!nvbo->user)
-+			free(nvbo->sysmem);
-+		nvbo->sysmem = NULL;
-+	}
-+}
-+
-+static void
-+nouveau_bo_kfree(struct nouveau_bo_priv *nvbo)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(nvbo->base.device);
-+	struct drm_gem_close req;
-+
-+	if (!nvbo->handle)
-+		return;
-+
-+	if (nvbo->map) {
-+		munmap(nvbo->map, nvbo->size);
-+		nvbo->map = NULL;
-+	}
-+
-+	req.handle = nvbo->handle;
-+	nvbo->handle = 0;
-+	drmIoctl(nvdev->fd, DRM_IOCTL_GEM_CLOSE, &req);
-+}
-+
-+static int
-+nouveau_bo_kalloc(struct nouveau_bo_priv *nvbo, struct nouveau_channel *chan)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(nvbo->base.device);
-+	struct drm_nouveau_gem_new req;
-+	struct drm_nouveau_gem_info *info = &req.info;
-+	int ret;
-+
-+	if (nvbo->handle)
-+		return 0;
-+
-+	req.channel_hint = chan ? chan->id : 0;
-+	req.align = nvbo->align;
-+
-+
-+	info->size = nvbo->size;
-+	info->domain = 0;
-+
-+	if (nvbo->flags & NOUVEAU_BO_VRAM)
-+		info->domain |= NOUVEAU_GEM_DOMAIN_VRAM;
-+	if (nvbo->flags & NOUVEAU_BO_GART)
-+		info->domain |= NOUVEAU_GEM_DOMAIN_GART;
-+	if (!info->domain) {
-+		info->domain |= (NOUVEAU_GEM_DOMAIN_VRAM |
-+				 NOUVEAU_GEM_DOMAIN_GART);
-+	}
-+
-+	if (nvbo->flags & NOUVEAU_BO_MAP)
-+		info->domain |= NOUVEAU_GEM_DOMAIN_MAPPABLE;
-+
-+	info->tile_mode = nvbo->base.tile_mode;
-+	info->tile_flags = nvbo->base.tile_flags;
-+	/* XXX - flag inverted for backwards compatibility */
-+	info->tile_flags ^= NOUVEAU_GEM_TILE_NONCONTIG;
-+	if (!nvdev->has_bo_usage)
-+		info->tile_flags &= NOUVEAU_GEM_TILE_LAYOUT_MASK;
-+
-+	ret = drmCommandWriteRead(nvdev->fd, DRM_NOUVEAU_GEM_NEW,
-+				  &req, sizeof(req));
-+	if (ret)
-+		return ret;
-+
-+	nouveau_bo_info(nvbo, &req.info);
-+	return 0;
-+}
-+
-+static int
-+nouveau_bo_kmap(struct nouveau_bo_priv *nvbo)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(nvbo->base.device);
-+
-+	if (nvbo->map)
-+		return 0;
-+
-+	if (!nvbo->map_handle)
-+		return -EINVAL;
-+
-+	nvbo->map = mmap(0, nvbo->size, PROT_READ | PROT_WRITE,
-+			 MAP_SHARED, nvdev->fd, nvbo->map_handle);
-+	if (nvbo->map == MAP_FAILED) {
-+		nvbo->map = NULL;
-+		return -errno;
-+	}
-+
-+	return 0;
-+}
-+
-+int
-+nouveau_bo_new_tile(struct nouveau_device *dev, uint32_t flags, int align,
-+		    int size, uint32_t tile_mode, uint32_t tile_flags,
-+		    struct nouveau_bo **bo)
-+{
-+	struct nouveau_bo_priv *nvbo;
-+	int ret;
-+
-+	if (!dev || !bo || *bo)
-+		return -EINVAL;
-+
-+	nvbo = calloc(1, sizeof(struct nouveau_bo_priv));
-+	if (!nvbo)
-+		return -ENOMEM;
-+	nvbo->base.device = dev;
-+	nvbo->base.size = size;
-+	nvbo->base.tile_mode = tile_mode;
-+	nvbo->base.tile_flags = tile_flags;
-+
-+	nvbo->refcount = 1;
-+	nvbo->flags = flags;
-+	nvbo->size = size;
-+	nvbo->align = align;
-+
-+	if (flags & (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)) {
-+		ret = nouveau_bo_kalloc(nvbo, NULL);
-+		if (ret) {
-+			nouveau_bo_ref(NULL, (void *)&nvbo);
-+			return ret;
-+		}
-+	}
-+
-+	*bo = &nvbo->base;
-+	return 0;
-+}
-+
-+int
-+nouveau_bo_new(struct nouveau_device *dev, uint32_t flags, int align,
-+	       int size, struct nouveau_bo **bo)
-+{
-+	return nouveau_bo_new_tile(dev, flags, align, size, 0, 0, bo);
-+}
-+
-+int
-+nouveau_bo_user(struct nouveau_device *dev, void *ptr, int size,
-+		struct nouveau_bo **bo)
-+{
-+	struct nouveau_bo_priv *nvbo;
-+	int ret;
-+
-+	ret = nouveau_bo_new(dev, NOUVEAU_BO_MAP, 0, size, bo);
-+	if (ret)
-+		return ret;
-+	nvbo = nouveau_bo(*bo);
-+
-+	nvbo->sysmem = ptr;
-+	nvbo->user = 1;
-+	return 0;
-+}
-+
-+int
-+nouveau_bo_wrap(struct nouveau_device *dev, uint32_t handle,
-+		struct nouveau_bo **bo)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(dev);
-+	struct drm_nouveau_gem_info req;
-+	struct nouveau_bo_priv *nvbo;
-+	int ret;
-+
-+	ret = nouveau_bo_new(dev, 0, 0, 0, bo);
-+	if (ret)
-+		return ret;
-+	nvbo = nouveau_bo(*bo);
-+
-+	req.handle = handle;
-+	ret = drmCommandWriteRead(nvdev->fd, DRM_NOUVEAU_GEM_INFO,
-+				  &req, sizeof(req));
-+	if (ret) {
-+		nouveau_bo_ref(NULL, bo);
-+		return ret;
-+	}
-+
-+	nouveau_bo_info(nvbo, &req);
-+	nvbo->base.size = nvbo->size;
-+	return 0;
-+}
-+
-+int
-+nouveau_bo_handle_get(struct nouveau_bo *bo, uint32_t *handle)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(bo->device);
-+	struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
-+	int ret;
-+ 
-+	if (!bo || !handle)
-+		return -EINVAL;
-+
-+	if (!nvbo->global_handle) {
-+		struct drm_gem_flink req;
-+ 
-+		ret = nouveau_bo_kalloc(nvbo, NULL);
-+		if (ret)
-+			return ret;
-+
-+		req.handle = nvbo->handle;
-+		ret = drmIoctl(nvdev->fd, DRM_IOCTL_GEM_FLINK, &req);
-+		if (ret) {
-+			nouveau_bo_kfree(nvbo);
-+			return ret;
-+		}
-+
-+		nvbo->global_handle = req.name;
-+	}
-+ 
-+	*handle = nvbo->global_handle;
-+	return 0;
-+}
-+ 
-+int
-+nouveau_bo_handle_ref(struct nouveau_device *dev, uint32_t handle,
-+		      struct nouveau_bo **bo)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(dev);
-+	struct nouveau_bo_priv *nvbo;
-+	struct drm_gem_open req;
-+	int ret;
-+
-+	req.name = handle;
-+	ret = drmIoctl(nvdev->fd, DRM_IOCTL_GEM_OPEN, &req);
-+	if (ret) {
-+		nouveau_bo_ref(NULL, bo);
-+		return ret;
-+	}
-+
-+	ret = nouveau_bo_wrap(dev, req.handle, bo);
-+	if (ret) {
-+		nouveau_bo_ref(NULL, bo);
-+		return ret;
-+	}
-+
-+	nvbo = nouveau_bo(*bo);
-+	nvbo->base.handle = nvbo->handle;
-+	return 0;
-+} 
-+
-+static void
-+nouveau_bo_del(struct nouveau_bo **bo)
-+{
-+	struct nouveau_bo_priv *nvbo;
-+
-+	if (!bo || !*bo)
-+		return;
-+	nvbo = nouveau_bo(*bo);
-+	*bo = NULL;
-+
-+	if (--nvbo->refcount)
-+		return;
-+
-+	if (nvbo->pending) {
-+		nvbo->pending = NULL;
-+		nouveau_pushbuf_flush(nvbo->pending_channel, 0);
-+	}
-+
-+	nouveau_bo_ufree(nvbo);
-+	nouveau_bo_kfree(nvbo);
-+	free(nvbo);
-+}
-+
-+int
-+nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pbo)
-+{
-+	if (!pbo)
-+		return -EINVAL;
-+
-+	if (ref)
-+		nouveau_bo(ref)->refcount++;
-+
-+	if (*pbo)
-+		nouveau_bo_del(pbo);
-+
-+	*pbo = ref;
-+	return 0;
-+}
-+
-+static int
-+nouveau_bo_wait(struct nouveau_bo *bo, int cpu_write, int no_wait, int no_block)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(bo->device);
-+	struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
-+	struct drm_nouveau_gem_cpu_prep req;
-+	int ret;
-+
-+	if (!nvbo->global_handle && !nvbo->write_marker && !cpu_write)
-+		return 0;
-+
-+	if (nvbo->pending &&
-+	    (nvbo->pending->write_domains || cpu_write)) {
-+		nvbo->pending = NULL;
-+		nouveau_pushbuf_flush(nvbo->pending_channel, 0);
-+	}
-+
-+	req.handle = nvbo->handle;
-+	req.flags = 0;
-+	if (cpu_write)
-+		req.flags |= NOUVEAU_GEM_CPU_PREP_WRITE;
-+	if (no_wait)
-+		req.flags |= NOUVEAU_GEM_CPU_PREP_NOWAIT;
-+	if (no_block)
-+		req.flags |= NOUVEAU_GEM_CPU_PREP_NOBLOCK;
-+
-+	do {
-+		ret = drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_CPU_PREP,
-+				      &req, sizeof(req));
-+	} while (ret == -EAGAIN);
-+	if (ret)
-+		return ret;
-+
-+	if (ret == 0)
-+		nvbo->write_marker = 0;
-+	return 0;
-+}
-+
-+int
-+nouveau_bo_map_range(struct nouveau_bo *bo, uint32_t delta, uint32_t size,
-+		     uint32_t flags)
-+{
-+	struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
-+	int ret;
-+
-+	if (!nvbo || bo->map)
-+		return -EINVAL;
-+
-+	if (!nouveau_bo_allocated(nvbo)) {
-+		if (nvbo->flags & (NOUVEAU_BO_VRAM | NOUVEAU_BO_GART)) {
-+			ret = nouveau_bo_kalloc(nvbo, NULL);
-+			if (ret)
-+				return ret;
-+		}
-+
-+		if (!nouveau_bo_allocated(nvbo)) {
-+			ret = nouveau_bo_ualloc(nvbo);
-+			if (ret)
-+				return ret;
-+		}
-+	}
-+
-+	if (nvbo->sysmem) {
-+		bo->map = (char *)nvbo->sysmem + delta;
-+	} else {
-+		ret = nouveau_bo_kmap(nvbo);
-+		if (ret)
-+			return ret;
-+
-+		if (!(flags & NOUVEAU_BO_NOSYNC)) {
-+			ret = nouveau_bo_wait(bo, (flags & NOUVEAU_BO_WR),
-+					      (flags & NOUVEAU_BO_NOWAIT), 0);
-+			if (ret)
-+				return ret;
-+
-+			nvbo->map_refcnt++;
-+		}
-+
-+		bo->map = (char *)nvbo->map + delta;
-+	}
-+
-+	return 0;
-+}
-+
-+void
-+nouveau_bo_map_flush(struct nouveau_bo *bo, uint32_t delta, uint32_t size)
-+{
-+}
-+
-+int
-+nouveau_bo_map(struct nouveau_bo *bo, uint32_t flags)
-+{
-+	return nouveau_bo_map_range(bo, 0, bo->size, flags);
-+}
-+
-+void
-+nouveau_bo_unmap(struct nouveau_bo *bo)
-+{
-+	struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
-+
-+	if (bo->map && !nvbo->sysmem && nvbo->map_refcnt) {
-+		struct nouveau_device_priv *nvdev = nouveau_device(bo->device);
-+		struct drm_nouveau_gem_cpu_fini req;
-+
-+		req.handle = nvbo->handle;
-+		drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_CPU_FINI,
-+				&req, sizeof(req));
-+		nvbo->map_refcnt--;
-+	}
-+
-+	bo->map = NULL;
-+}
-+
-+int
-+nouveau_bo_busy(struct nouveau_bo *bo, uint32_t access)
-+{
-+	return nouveau_bo_wait(bo, (access & NOUVEAU_BO_WR), 1, 1);
-+}
-+
-+uint32_t
-+nouveau_bo_pending(struct nouveau_bo *bo)
-+{
-+	struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
-+	uint32_t flags;
-+
-+	if (!nvbo->pending)
-+		return 0;
-+
-+	flags = 0;
-+	if (nvbo->pending->read_domains)
-+		flags |= NOUVEAU_BO_RD;
-+	if (nvbo->pending->write_domains)
-+		flags |= NOUVEAU_BO_WR;
-+
-+	return flags;
-+}
-+
-+struct drm_nouveau_gem_pushbuf_bo *
-+nouveau_bo_emit_buffer(struct nouveau_channel *chan, struct nouveau_bo *bo)
-+{
-+	struct nouveau_pushbuf_priv *nvpb = &nouveau_channel(chan)->pb;
-+	struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
-+	struct drm_nouveau_gem_pushbuf_bo *pbbo;
-+	struct nouveau_bo *ref = NULL;
-+	int ret;
-+
-+	if (nvbo->pending)
-+		return nvbo->pending;
-+
-+	if (!nvbo->handle) {
-+		ret = nouveau_bo_kalloc(nvbo, chan);
-+		if (ret)
-+			return NULL;
-+
-+		if (nvbo->sysmem) {
-+			void *sysmem_tmp = nvbo->sysmem;
-+
-+			nvbo->sysmem = NULL;
-+			ret = nouveau_bo_map(bo, NOUVEAU_BO_WR);
-+			if (ret)
-+				return NULL;
-+			nvbo->sysmem = sysmem_tmp;
-+
-+			memcpy(bo->map, nvbo->sysmem, nvbo->base.size);
-+			nouveau_bo_ufree(nvbo);
-+			nouveau_bo_unmap(bo);
-+		}
-+	}
-+
-+	if (nvpb->nr_buffers >= NOUVEAU_GEM_MAX_BUFFERS)
-+		return NULL;
-+	pbbo = nvpb->buffers + nvpb->nr_buffers++;
-+	nvbo->pending = pbbo;
-+	nvbo->pending_channel = chan;
-+	nvbo->pending_refcnt = 0;
-+
-+	nouveau_bo_ref(bo, &ref);
-+	pbbo->user_priv = (uint64_t)(unsigned long)ref;
-+	pbbo->handle = nvbo->handle;
-+	pbbo->valid_domains = NOUVEAU_GEM_DOMAIN_VRAM | NOUVEAU_GEM_DOMAIN_GART;
-+	pbbo->read_domains = 0;
-+	pbbo->write_domains = 0;
-+	pbbo->presumed.domain = nvbo->domain;
-+	pbbo->presumed.offset = nvbo->offset;
-+	pbbo->presumed.valid = 1;
-+	return pbbo;
-+}
-diff --git a/nouveau-1/nouveau_bo.h b/nouveau-1/nouveau_bo.h
-new file mode 100644
-index 0000000..3a1f2d4
---- /dev/null
-+++ b/nouveau-1/nouveau_bo.h
-@@ -0,0 +1,104 @@
-+/*
-+ * Copyright 2007 Nouveau Project
-+ *
-+ * 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 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 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.
-+ */
-+
-+#ifndef __NOUVEAU_BO_H__
-+#define __NOUVEAU_BO_H__
-+
-+/* Relocation/Buffer type flags */
-+#define NOUVEAU_BO_VRAM   (1 << 0)
-+#define NOUVEAU_BO_GART   (1 << 1)
-+#define NOUVEAU_BO_RD     (1 << 2)
-+#define NOUVEAU_BO_WR     (1 << 3)
-+#define NOUVEAU_BO_RDWR   (NOUVEAU_BO_RD | NOUVEAU_BO_WR)
-+#define NOUVEAU_BO_MAP    (1 << 4)
-+#define NOUVEAU_BO_LOW    (1 << 6)
-+#define NOUVEAU_BO_HIGH   (1 << 7)
-+#define NOUVEAU_BO_OR     (1 << 8)
-+#define NOUVEAU_BO_INVAL  (1 << 12)
-+#define NOUVEAU_BO_NOSYNC (1 << 13)
-+#define NOUVEAU_BO_NOWAIT (1 << 14)
-+#define NOUVEAU_BO_IFLUSH (1 << 15)
-+#define NOUVEAU_BO_DUMMY  (1 << 31)
-+
-+#define NOUVEAU_BO_TILE_LAYOUT_MASK 0x0000ff00
-+#define NOUVEAU_BO_TILE_16BPP       0x00000001
-+#define NOUVEAU_BO_TILE_32BPP       0x00000002
-+#define NOUVEAU_BO_TILE_ZETA        0x00000004
-+#define NOUVEAU_BO_TILE_SCANOUT     0x00000008
-+
-+struct nouveau_bo {
-+	struct nouveau_device *device;
-+	uint32_t handle;
-+
-+	uint64_t size;
-+	void *map;
-+
-+	uint32_t tile_mode;
-+	uint32_t tile_flags;
-+};
-+
-+int
-+nouveau_bo_new(struct nouveau_device *, uint32_t flags, int align, int size,
-+	       struct nouveau_bo **);
-+
-+int
-+nouveau_bo_new_tile(struct nouveau_device *, uint32_t flags, int align,
-+		    int size, uint32_t tile_mode, uint32_t tile_flags,
-+		    struct nouveau_bo **);
-+
-+int
-+nouveau_bo_user(struct nouveau_device *, void *ptr, int size,
-+		struct nouveau_bo **);
-+
-+int
-+nouveau_bo_wrap(struct nouveau_device *, uint32_t handle, struct nouveau_bo **);
-+
-+int
-+nouveau_bo_handle_get(struct nouveau_bo *, uint32_t *);
-+
-+int
-+nouveau_bo_handle_ref(struct nouveau_device *, uint32_t handle,
-+		      struct nouveau_bo **);
-+
-+int
-+nouveau_bo_ref(struct nouveau_bo *, struct nouveau_bo **);
-+
-+int
-+nouveau_bo_map_range(struct nouveau_bo *, uint32_t delta, uint32_t size,
-+		     uint32_t flags);
-+
-+void
-+nouveau_bo_map_flush(struct nouveau_bo *, uint32_t delta, uint32_t size);
-+
-+int
-+nouveau_bo_map(struct nouveau_bo *, uint32_t flags);
-+
-+void
-+nouveau_bo_unmap(struct nouveau_bo *);
-+
-+int
-+nouveau_bo_busy(struct nouveau_bo *, uint32_t access);
-+
-+uint32_t
-+nouveau_bo_pending(struct nouveau_bo *);
-+
-+#endif
-diff --git a/nouveau-1/nouveau_channel.c b/nouveau-1/nouveau_channel.c
-new file mode 100644
-index 0000000..96fa03b
---- /dev/null
-+++ b/nouveau-1/nouveau_channel.c
-@@ -0,0 +1,142 @@
-+/*
-+ * Copyright 2007 Nouveau Project
-+ *
-+ * 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 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 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.
-+ */
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <errno.h>
-+
-+#include "nouveau_private.h"
-+
-+int
-+nouveau_channel_alloc(struct nouveau_device *dev, uint32_t fb_ctxdma,
-+		      uint32_t tt_ctxdma, int pushbuf_size,
-+		      struct nouveau_channel **chan)
-+{
-+	struct nouveau_device_priv *nvdev = nouveau_device(dev);
-+	struct nouveau_channel_priv *nvchan;
-+	unsigned i;
-+	int ret;
-+
-+	if (!nvdev || !chan || *chan)
-+	    return -EINVAL;
-+
-+	nvchan = calloc(1, sizeof(struct nouveau_channel_priv));
-+	if (!nvchan)
-+		return -ENOMEM;
-+	nvchan->base.device = dev;
-+
-+	nvchan->drm.fb_ctxdma_handle = fb_ctxdma;
-+	nvchan->drm.tt_ctxdma_handle = tt_ctxdma;
-+	ret = drmCommandWriteRead(nvdev->fd, DRM_NOUVEAU_CHANNEL_ALLOC,
-+				  &nvchan->drm, sizeof(nvchan->drm));
-+	if (ret) {
-+		free(nvchan);
-+		return ret;
-+	}
-+
-+	nvchan->base.id = nvchan->drm.channel;
-+	if (nouveau_grobj_ref(&nvchan->base, nvchan->drm.fb_ctxdma_handle,
-+			      &nvchan->base.vram) ||
-+	    nouveau_grobj_ref(&nvchan->base, nvchan->drm.tt_ctxdma_handle,
-+		    	      &nvchan->base.gart)) {
-+		nouveau_channel_free((void *)&nvchan);
-+		return -EINVAL;
-+	}
-+
-+	/* Mark all DRM-assigned subchannels as in-use */
-+	for (i = 0; i < nvchan->drm.nr_subchan; i++) {
-+		struct nouveau_grobj_priv *gr = calloc(1, sizeof(*gr));
-+
-+		gr->base.bound = NOUVEAU_GROBJ_BOUND_EXPLICIT;
-+		gr->base.subc = i;
-+		gr->base.handle = nvchan->drm.subchan[i].handle;
-+		gr->base.grclass = nvchan->drm.subchan[i].grclass;
-+		gr->base.channel = &nvchan->base;
-+
-+		nvchan->base.subc[i].gr = &gr->base;
-+	}
-+
-+	if (dev->chipset < 0xc0) {


Reply to: