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

libdrm: Changes to 'ubuntu-quantal'



 .gitignore                                              |   10 
 ChangeLog                                               |  733 ++++++++++++++++
 Makefile.am                                             |    8 
 configure.ac                                            |   76 +
 debian/changelog                                        |   50 -
 debian/control                                          |    5 
 debian/libdrm-dev.install                               |    2 
 debian/libdrm-nouveau2.symbols                          |    1 
 debian/patches/02_build_libkms_against_in_tree_drm.diff |   17 
 debian/patches/series                                   |    1 
 debian/rules                                            |    6 
 exynos/Makefile.am                                      |    2 
 exynos/exynos_drm.h                                     |   52 +
 exynos/exynos_fimg2d.c                                  |  630 +++++++++++++
 exynos/fimg2d.h                                         |  325 +++++++
 exynos/fimg2d_reg.h                                     |  114 ++
 freedreno/Makefile.am                                   |   19 
 freedreno/README                                        |   16 
 freedreno/freedreno_bo.c                                |  274 +++++
 freedreno/freedreno_device.c                            |   45 
 freedreno/freedreno_drmif.h                             |   99 ++
 freedreno/freedreno_pipe.c                              |  227 ++++
 freedreno/freedreno_priv.h                              |  117 ++
 freedreno/freedreno_ringbuffer.c                        |  249 +++++
 freedreno/freedreno_ringbuffer.h                        |   87 +
 freedreno/kgsl_drm.h                                    |  192 ++++
 freedreno/libdrm_freedreno.pc.in                        |   11 
 freedreno/list.h                                        |  137 ++
 freedreno/msm_kgsl.h                                    |  519 +++++++++++
 intel/intel_bufmgr_gem.c                                |   22 
 intel/intel_chipset.h                                   |  379 ++++----
 intel/intel_decode.c                                    |    4 
 libkms/Makefile.am                                      |    2 
 libkms/intel.c                                          |    1 
 libkms/linux.c                                          |    2 
 libkms/nouveau.c                                        |    1 
 man/Makefile.am                                         |   63 +
 man/drm-kms.xml                                         |  342 +++++++
 man/drm-memory.xml                                      |  430 +++++++++
 man/drm.xml                                             |  137 ++
 man/drmAvailable.xml                                    |   75 +
 man/drmHandleEvent.xml                                  |  102 ++
 man/drmModeGetResources.xml                             |  139 +++
 nouveau/abi16.c                                         |   28 
 nouveau/libdrm_nouveau.pc.in                            |    4 
 nouveau/nouveau.c                                       |   21 
 nouveau/nouveau.h                                       |   16 
 nouveau/private.h                                       |    2 
 nouveau/pushbuf.c                                       |   16 
 omap/omap_drm.c                                         |    2 
 radeon/r600_pci_ids.h                                   |   29 
 radeon/radeon_bo_gem.c                                  |   16 
 radeon/radeon_cs_gem.c                                  |    2 
 radeon/radeon_surface.c                                 |  405 +++++++-
 radeon/radeon_surface.h                                 |    2 
 tests/Makefile.am                                       |    4 
 tests/exynos/Makefile.am                                |   19 
 tests/exynos/exynos_fimg2d_test.c                       |  695 +++++++++++++++
 tests/kmstest/Makefile.am                               |    5 
 tests/modeprint/Makefile.am                             |    5 
 tests/modetest/Makefile.am                              |   16 
 tests/vbltest/Makefile.am                               |    6 
 xf86drmMode.c                                           |    5 
 63 files changed, 6697 insertions(+), 324 deletions(-)

New commits:
commit 7c88e4544a079a590a6fac05cd63f2441e9e619a
Author: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date:   Mon Apr 22 15:46:59 2013 +0200

    release to quantal

diff --git a/debian/changelog b/debian/changelog
index d884e8e..2b54bb3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-libdrm (2.4.43-0ubuntu0.1) UNRELEASED; urgency=low
+libdrm (2.4.43-0ubuntu0.1) quantal-proposed; urgency=low
 
   * Copy package from raring, and re-enable libdrm-nouveau1a. (LP: #1171340)
 

commit 645deada451406398728c7ce524b40579cbc824d
Author: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Date:   Mon Apr 22 11:09:36 2013 +0200

    Copy package from raring, and re-enable libdrm-nouveau1a. (LP: #1171340)

diff --git a/debian/changelog b/debian/changelog
index 8ca09a8..d884e8e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+libdrm (2.4.43-0ubuntu0.1) UNRELEASED; urgency=low
+
+  * Copy package from raring, and re-enable libdrm-nouveau1a. (LP: #1171340)
+
+ -- Maarten Lankhorst <maarten.lankhorst@ubuntu.com>  Mon, 22 Apr 2013 11:06:19 +0200
+
 libdrm (2.4.43-0ubuntu1) raring; urgency=low
 
   * Sync from unreleased debian git.
diff --git a/debian/control b/debian/control
index 4e3f61f..dd5805a 100644
--- a/debian/control
+++ b/debian/control
@@ -27,6 +27,7 @@ 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],
@@ -116,6 +117,36 @@ 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
new file mode 100644
index 0000000..6c55080
--- /dev/null
+++ b/debian/libdrm-nouveau1a.install
@@ -0,0 +1 @@
+usr/lib/*/libdrm_nouveau.so.1*
diff --git a/debian/libdrm-nouveau1a.lintian-overrides b/debian/libdrm-nouveau1a.lintian-overrides
new file mode 100644
index 0000000..76c525b
--- /dev/null
+++ b/debian/libdrm-nouveau1a.lintian-overrides
@@ -0,0 +1 @@
+libdrm-nouveau1a: package-name-doesnt-match-sonames libdrm-nouveau1
diff --git a/debian/libdrm-nouveau1a.symbols b/debian/libdrm-nouveau1a.symbols
new file mode 100644
index 0000000..a2ba922
--- /dev/null
+++ b/debian/libdrm-nouveau1a.symbols
@@ -0,0 +1,46 @@
+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
new file mode 100644
index 0000000..10f02a9
--- /dev/null
+++ b/debian/patches/04_libdrm-2.4.37-nouveau-1.diff
@@ -0,0 +1,2921 @@
+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.
++ *


Reply to: