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

libdrm: Changes to 'debian-unstable'



 .gitignore                 |   99 
 autogen.sh                 |   12 
 shared-core/drm_drawable.c |  330 +
 shared-core/drm_pciids.txt |  464 +
 shared-core/i915_dma.c     |  846 +++
 shared-core/i915_drv.h     |  342 +
 shared-core/i915_irq.c     |  578 ++
 shared-core/i915_mem.c     |  397 +
 shared-core/imagine_drv.h  |   43 
 shared-core/mach64_dma.c   | 1539 +++++
 shared-core/mach64_drv.h   | 1048 ++++
 shared-core/mach64_irq.c   |  136 
 shared-core/mach64_state.c |  903 +++
 shared-core/mga_dma.c      | 1182 ++++
 shared-core/mga_drv.h      |  683 ++
 shared-core/mga_irq.c      |  150 
 shared-core/mga_state.c    | 1178 ++++
 shared-core/mga_ucode.h    |11645 +++++++++++++++++++++++++++++++++++++++++++++
 shared-core/mga_warp.c     |  198 
 shared-core/nv_drv.h       |   52 
 shared-core/r128_cce.c     |  948 +++
 shared-core/r128_drv.h     |  520 ++
 shared-core/r128_irq.c     |  102 
 shared-core/r128_state.c   | 1713 ++++++
 shared-core/r300_cmdbuf.c  |  973 +++
 shared-core/radeon_cp.c    | 2257 ++++++++
 shared-core/radeon_drv.h   | 1170 ++++
 shared-core/radeon_irq.c   |  244 
 shared-core/radeon_mem.c   |  314 +
 shared-core/radeon_state.c | 3301 ++++++++++++
 shared-core/savage_bci.c   | 1109 ++++
 shared-core/savage_drv.h   |  575 ++
 shared-core/savage_state.c | 1164 ++++
 shared-core/sis_drv.h      |   91 
 shared-core/sis_ds.c       |  299 +
 shared-core/sis_ds.h       |  146 
 shared-core/sis_mm.c       |  418 +
 shared-core/tdfx_drv.h     |   47 
 shared-core/via_dma.c      |  777 +++
 shared-core/via_drv.c      |  114 
 shared-core/via_drv.h      |  164 
 shared-core/via_ds.c       |  274 +
 shared-core/via_ds.h       |  104 
 shared-core/via_irq.c      |  393 +
 shared-core/via_map.c      |  133 
 shared-core/via_mm.c       |  362 +
 shared-core/via_mm.h       |   40 
 shared-core/via_verifier.c | 1101 ++++
 shared-core/via_verifier.h |   63 
 shared-core/via_video.c    |   97 
 50 files changed, 40838 insertions(+)

New commits:
commit d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1e
Author: Dave Airlie <airlied@linux.ie>
Date:   Thu Nov 9 08:55:58 2006 +1100

    libdrm: add drmOpenOnce + drmCloseOnce to libdrm

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 05b40f7..56450e8 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -3215,3 +3215,64 @@ int drmMMUnlock(int fd, unsigned memType)
     
     return ret;	
 }
+
+#define DRM_MAX_FDS 16
+static struct {
+   char *BusID;
+   int fd;
+   int refcount;
+} connection[DRM_MAX_FDS];
+
+static int nr_fds = 0;
+
+int drmOpenOnce(void *unused, 
+		const char *BusID,
+		int *newlyopened)
+{
+   int i;
+   int fd;
+   
+   for (i = 0; i < nr_fds; i++)
+      if (strcmp(BusID, connection[i].BusID) == 0) {
+	 connection[i].refcount++;
+	 *newlyopened = 0;
+	 return connection[i].fd;
+      }
+
+   fd = drmOpen(unused, BusID);
+   if (fd <= 0 || nr_fds == DRM_MAX_FDS)
+      return fd;
+   
+   connection[nr_fds].BusID = strdup(BusID);
+   connection[nr_fds].fd = fd;
+   connection[nr_fds].refcount = 1;
+   *newlyopened = 1;
+
+   if (0)
+      fprintf(stderr, "saved connection %d for %s %d\n", 
+              nr_fds, connection[nr_fds].BusID, 
+              strcmp(BusID, connection[nr_fds].BusID));
+
+   nr_fds++;
+
+   return fd;   
+}
+
+void drmCloseOnce(int fd)
+{
+   int i;
+
+   for (i = 0; i < nr_fds; i++) {
+      if (fd == connection[i].fd) {
+	 if (--connection[i].refcount == 0) {
+	    drmClose(connection[i].fd);
+	    free(connection[i].BusID);
+	    
+	    if (i < --nr_fds) 
+	       connection[i] = connection[nr_fds];
+
+	    return;
+	 }
+      }
+   }
+}
diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h
index 4d9580c..34c9ec0 100644
--- a/libdrm/xf86drm.h
+++ b/libdrm/xf86drm.h
@@ -655,6 +655,9 @@ extern int  drmSLLookupNeighbors(void *l, unsigned long key,
 				 unsigned long *prev_key, void **prev_value,
 				 unsigned long *next_key, void **next_value);
 
+extern int drmOpenOnce(void *unused, const char *BusID, int *newlyopened);
+extern void drmCloseOnce(int fd);
+
 #include "xf86mm.h"
 
 #endif

commit 79038751ffe47ed1ce82766e027d98fd2f0e2c6a
Author: Dave Airlie <airlied@linux.ie>
Date:   Wed Nov 8 15:08:09 2006 +1100

    libdrm: add support for server side functionality in libdrm
    
    This adds APIs to allow the X server to use libdrm from the system
    rather than its own in-built copy.

diff --git a/configure.ac b/configure.ac
index 224f43a..c0b11b2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,7 +19,7 @@
 #  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 AC_PREREQ(2.57)
-AC_INIT([libdrm], 2.2.0, [dri-devel@lists.sourceforge.net], libdrm)
+AC_INIT([libdrm], 2.3.0, [dri-devel@lists.sourceforge.net], libdrm)
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2])
 
diff --git a/libdrm/Makefile.am b/libdrm/Makefile.am
index 91a7e5d..e7e07e4 100644
--- a/libdrm/Makefile.am
+++ b/libdrm/Makefile.am
@@ -20,7 +20,7 @@
 
 libdrm_la_LTLIBRARIES = libdrm.la
 libdrm_ladir = $(libdir)
-libdrm_la_LDFLAGS = -version-number 2:0:0 -no-undefined
+libdrm_la_LDFLAGS = -version-number 2:3:0 -no-undefined
 
 AM_CFLAGS = -I$(top_srcdir)/shared-core
 libdrm_la_SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 5efb532..05b40f7 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -35,40 +35,25 @@
 #include <xorg-config.h>
 #endif
 
-#ifdef XFree86Server
-# include "xf86.h"
-# include "xf86_OSproc.h"
-# include "drm.h"
-# include "xf86_ansic.h"
-# define _DRM_MALLOC xalloc
-# define _DRM_FREE   xfree
-# ifndef XFree86LOADER
-#  include <sys/mman.h>
-# endif
-#else
-# ifdef HAVE_CONFIG_H
-#  include <config.h>
-# endif
-# include <stdio.h>
-# include <stdlib.h>
-# include <unistd.h>
-# include <string.h>
-# include <ctype.h>
-# include <fcntl.h>
-# include <errno.h>
-# include <signal.h>
-# include <sys/types.h>
-# include <sys/stat.h>
-# define stat_t struct stat
-# include <sys/ioctl.h>
-# include <sys/mman.h>
-# include <sys/time.h>
-# include <stdarg.h>
-# define _DRM_MALLOC malloc
-# define _DRM_FREE   free
-# include "drm.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
 #endif
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#define stat_t struct stat
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <stdarg.h>
+#include "drm.h"
 
 /* Not all systems have MAP_FAILED defined */
 #ifndef MAP_FAILED
@@ -107,6 +92,13 @@
 
 #define DRM_MSG_VERBOSITY 3
 
+static drmServerInfoPtr drm_server_info;
+
+void drmSetServerInfo(drmServerInfoPtr info)
+{
+  drm_server_info = info;
+}
+
 /**
  * Output a message to stderr.
  *
@@ -115,44 +107,54 @@
  * \internal
  * This function is a wrapper around vfprintf().
  */
+
+static int drmDebugPrint(const char *format, va_list ap)
+{
+  return vfprintf(stderr, format, ap);
+}
+
+static int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint;
+
 static void
 drmMsg(const char *format, ...)
 {
     va_list	ap;
-
-#ifndef XFree86Server
     const char *env;
-    if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose"))
-#endif
+    if (((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) || drm_server_info)
     {
 	va_start(ap, format);
-#ifdef XFree86Server
-	xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
-#else
-	vfprintf(stderr, format, ap);
-#endif
+	if (drm_server_info) {
+	  drm_server_info->debug_print(format,ap);
+	} else {
+	  drm_debug_print(format, ap);
+	}
 	va_end(ap);
     }
 }
 
+void
+drmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap))
+{
+  drm_debug_print = debug_msg_ptr;
+}
+
 static void *drmHashTable = NULL; /* Context switch callbacks */
 
-typedef struct drmHashEntry {
-    int      fd;
-    void     (*f)(int, void *, void *);
-    void     *tagTable;
-} drmHashEntry;
+void *drmGetHashTable(void)
+{
+  return drmHashTable;
+}
 
 void *drmMalloc(int size)
 {
     void *pt;
-    if ((pt = _DRM_MALLOC(size))) memset(pt, 0, size);
+    if ((pt = malloc(size))) memset(pt, 0, size);
     return pt;
 }
 
 void drmFree(void *pt)
 {
-    if (pt) _DRM_FREE(pt);
+    if (pt) free(pt);
 }
 
 /* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
@@ -163,7 +165,7 @@ static char *drmStrdup(const char *s)
     if (!s)
         return NULL;
 
-    retval = _DRM_MALLOC(strlen(s)+1);
+    retval = malloc(strlen(s)+1);
     if (!retval)
         return NULL;
 
@@ -182,7 +184,7 @@ static unsigned long drmGetKeyFromFd(int fd)
     return st.st_rdev;
 }
 
-static drmHashEntry *drmGetEntry(int fd)
+drmHashEntry *drmGetEntry(int fd)
 {
     unsigned long key = drmGetKeyFromFd(fd);
     void          *value;
@@ -269,21 +271,20 @@ static int drmOpenDevice(long dev, int minor)
     stat_t          st;
     char            buf[64];
     int             fd;
-    mode_t          devmode = DRM_DEV_MODE;
+    mode_t          devmode = DRM_DEV_MODE, serv_mode;
     int             isroot  = !geteuid();
-#if defined(XFree86Server)
     uid_t           user    = DRM_DEV_UID;
-    gid_t           group   = DRM_DEV_GID;
-#endif
-
+    gid_t           group   = DRM_DEV_GID, serv_group;
+    
     sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
     drmMsg("drmOpenDevice: node name is %s\n", buf);
 
-#if defined(XFree86Server)
-    devmode  = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
-    devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
-    group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
-#endif
+    if (drm_server_info) {
+      drm_server_info->get_perms(&serv_group, &serv_mode);
+      devmode  = serv_mode ? serv_mode : DRM_DEV_MODE;
+      devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
+      group = (serv_group >= 0) ? serv_group : DRM_DEV_GID;
+    }
 
     if (stat(DRM_DIR_NAME, &st)) {
 	if (!isroot) return DRM_ERR_NOT_ROOT;
@@ -298,10 +299,11 @@ static int drmOpenDevice(long dev, int minor)
 	remove(buf);
 	mknod(buf, S_IFCHR | devmode, dev);
     }
-#if defined(XFree86Server)
-    chown(buf, user, group);
-    chmod(buf, devmode);
-#endif
+
+    if (drm_server_info) {
+      chown(buf, user, group);
+      chmod(buf, devmode);
+    }
 
     fd = open(buf, O_RDWR, 0);
     drmMsg("drmOpenDevice: open result is %d, (%s)\n",
@@ -315,10 +317,10 @@ static int drmOpenDevice(long dev, int minor)
 	if (!isroot) return DRM_ERR_NOT_ROOT;
 	remove(buf);
 	mknod(buf, S_IFCHR | devmode, dev);
-#if defined(XFree86Server)
-	chown(buf, user, group);
-	chmod(buf, devmode);
-#endif
+	if (drm_server_info) {
+	  chown(buf, user, group);
+	  chmod(buf, devmode);
+	}
     }
     fd = open(buf, O_RDWR, 0);
     drmMsg("drmOpenDevice: open result is %d, (%s)\n",
@@ -456,16 +458,16 @@ static int drmOpenByName(const char *name)
     char *        id;
     
     if (!drmAvailable()) {
-#if !defined(XFree86Server)
+      if (!drm_server_info)
 	return -1;
-#else
+      else {
         /* try to load the kernel module now */
-        if (!xf86LoadKernelModule(name)) {
-            ErrorF("[drm] failed to load kernel module \"%s\"\n",
-		   name);
-            return -1;
+        if (!drm_server_info->load_module(name)) {
+	  drmMsg("[drm] failed to load kernel module \"%s\"\n",
+		 name);
+	  return -1;
         }
-#endif
+      }
     }
 
     /*
@@ -547,16 +549,14 @@ static int drmOpenByName(const char *name)
  */
 int drmOpen(const char *name, const char *busid)
 {
-#ifdef XFree86Server
-    if (!drmAvailable() && name != NULL) {
+    if (!drmAvailable() && name != NULL && drm_server_info) {
 	/* try to load the kernel */
-	if (!xf86LoadKernelModule(name)) {
-	    ErrorF("[drm] failed to load kernel module \"%s\"\n",
+	if (!drm_server_info->load_module(name)) {
+	  drmMsg("[drm] failed to load kernel module \"%s\"\n",
 	           name);
 	    return -1;
 	}
     }
-#endif
 
     if (busid) {
 	int fd;
@@ -710,15 +710,17 @@ drmVersionPtr drmGetLibVersion(int fd)
     drm_version_t *version = drmMalloc(sizeof(*version));
 
     /* Version history:
+     *   NOTE THIS MUST NOT GO ABOVE VERSION 1.X due to drivers needing it
      *   revision 1.0.x = original DRM interface with no drmGetLibVersion
      *                    entry point and many drm<Device> extensions
      *   revision 1.1.x = added drmCommand entry points for device extensions
      *                    added drmGetLibVersion to identify libdrm.a version
      *   revision 1.2.x = added drmSetInterfaceVersion
      *                    modified drmOpen to handle both busid and name
+     *   revision 1.3.x = added server + memory manager
      */
-    version->version_major      = 2;
-    version->version_minor      = 2;
+    version->version_major      = 1;
+    version->version_minor      = 3;
     version->version_patchlevel = 0;
 
     return (drmVersionPtr)version;
diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h
index 86ee7d3..4d9580c 100644
--- a/libdrm/xf86drm.h
+++ b/libdrm/xf86drm.h
@@ -36,6 +36,8 @@
 #ifndef _XF86DRM_H_
 #define _XF86DRM_H_
 
+#include <stdarg.h>
+#include <sys/types.h>
 #include <drm.h>
 
 				/* Defaults, if nothing set in xf86config */
@@ -61,6 +63,21 @@
 typedef unsigned int  drmSize,     *drmSizePtr;	    /**< For mapped regions */
 typedef void          *drmAddress, **drmAddressPtr; /**< For mapped regions */
 
+typedef struct _drmServerInfo {
+  int (*debug_print)(const char *format, va_list ap);
+  int (*load_module)(const char *name);
+  void (*get_perms)(gid_t *, mode_t *);
+} drmServerInfo, *drmServerInfoPtr;
+
+typedef struct drmHashEntry {
+    int      fd;
+    void     (*f)(int, void *, void *);
+    void     *tagTable;
+} drmHashEntry;
+
+extern void *drmGetHashTable(void);
+extern drmHashEntry *drmGetEntry(int fd);
+
 /**
  * Driver version information.
  *
@@ -604,6 +621,7 @@ extern int           drmScatterGatherFree(int fd, drm_handle_t handle);
 extern int           drmWaitVBlank(int fd, drmVBlankPtr vbl);
 
 /* Support routines */
+extern void          drmSetServerInfo(drmServerInfoPtr info);
 extern int           drmError(int err, const char *label);
 extern void          *drmMalloc(int size);
 extern void          drmFree(void *pt);

commit 584acab6d6103552711bd6b5596ee4ccad305bc2
Author: Eric Anholt <eric@anholt.net>
Date:   Tue Nov 7 09:36:40 2006 -0800

    Add drm_u64_t typedef on non-linux to fix libdrm build.

diff --git a/shared-core/drm.h b/shared-core/drm.h
index 16e8626..9efb1dc 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -139,6 +139,8 @@ typedef unsigned long long drm_u64_t;
 
 typedef unsigned int drm_handle_t;
 #else
+#include <sys/types.h>
+typedef u_int64_t drm_u64_t;
 typedef unsigned long drm_handle_t;	/**< To mapped regions */
 #endif
 typedef unsigned int drm_context_t;	/**< GLXContext handle */

commit 7b6cd95bb6c41653aed78952da0a461bd4791413
Author: Alan Hourihane <alanh@fairlite.demon.co.uk>
Date:   Tue Oct 31 10:01:53 2006 +0000

    Fix bug #8839 - a comment

diff --git a/bsd-core/i915_drv.c b/bsd-core/i915_drv.c
index 269d7b3..d42b207 100644
--- a/bsd-core/i915_drv.c
+++ b/bsd-core/i915_drv.c
@@ -1,4 +1,4 @@
-/* i915_drv.c -- ATI Radeon driver -*- linux-c -*-
+/* i915_drv.c -- Intel i915 driver -*- linux-c -*-
  * Created: Wed Feb 14 17:10:04 2001 by gareth@valinux.com
  */
 /*-

commit 4b04c0cc45f7a89c757ce442e4f2742b9d3aa293
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Mon Oct 30 11:18:44 2006 +0100

    Bugzilla Bug #8819
    Build fixes for powerpc.
    Reported by Katerina Barone-Adesi

diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c
index 13bec48..931972a 100644
--- a/linux-core/drm_ttm.c
+++ b/linux-core/drm_ttm.c
@@ -30,7 +30,7 @@
 
 static void drm_ttm_ipi_handler(void *null)
 {
-	wbinvd();
+	flush_agp_cache();
 }
 
 static void drm_ttm_cache_flush(void) 
diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c
index fd6e89d..6eb996a 100644
--- a/linux-core/drm_vm.c
+++ b/linux-core/drm_vm.c
@@ -57,7 +57,7 @@ pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma)
 	}
 #elif defined(__powerpc__)
 	pgprot_val(tmp) |= _PAGE_NO_CACHE;
-	if (map->type == _DRM_REGISTERS)
+	if (map_type == _DRM_REGISTERS)
 		pgprot_val(tmp) |= _PAGE_GUARDED;
 #endif
 #if defined(__ia64__)

commit 56563c22d658b6dcb7926fd41513618cd46c31a6
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Sun Oct 29 15:39:11 2006 +0100

    Minor bugfix, indentation and removal of unnused variables.

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index df41d77..5efb532 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2369,14 +2369,14 @@ int drmFenceUpdate(int fd, drmFence *fence)
 	drm_fence_arg_t arg;
 	
     memset(&arg, 0, sizeof(arg));
-	arg.handle = fence->handle;
-	arg.op = drm_fence_signaled;
-	if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	    return -errno;
-	fence->class = arg.class;
-	fence->type = arg.type;
-	fence->signaled = arg.signaled;
-	return 0;
+    arg.handle = fence->handle;
+    arg.op = drm_fence_signaled;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->signaled = arg.signaled;
+    return 0;
 }
 
 int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, 
@@ -2493,7 +2493,6 @@ void drmBOFreeList(drmBOList *list)
 {
     drmBONode *node;
     drmMMListHead *l;
-    int ret = 0;
 
     l = list->list.next;
     while(l != &list->list) {
@@ -2975,7 +2974,6 @@ int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,
 		       int *newItem)
 {
     drmBONode *node, *cur;
-    unsigned oldFlags, newFlags;
     drmMMListHead *l;
 
     *newItem = 0;
@@ -3146,7 +3144,7 @@ int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle)
 	  return -EFAULT;
       if (rep->ret)
 	  return rep->ret;
-      drmBOCopyReply(rep, buf);
+      drmBOCopyReply(rep, node->buf);
   }
 
   return 0;

commit decacb2e6415029fe87a3680c8f967483ba05281
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Fri Oct 27 13:08:31 2006 +0200

    Reserve the new IOCTLs also for *bsd.
    Bump libdrm version number to 2.2.0

diff --git a/configure.ac b/configure.ac
index b5d7945..224f43a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,7 +19,7 @@
 #  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 AC_PREREQ(2.57)
-AC_INIT([libdrm], 2.1.2-mm, [dri-devel@lists.sourceforge.net], libdrm)
+AC_INIT([libdrm], 2.2.0, [dri-devel@lists.sourceforge.net], libdrm)
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2])
 
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index ebf3f83..df41d77 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -717,7 +717,7 @@ drmVersionPtr drmGetLibVersion(int fd)
      *   revision 1.2.x = added drmSetInterfaceVersion
      *                    modified drmOpen to handle both busid and name
      */
-    version->version_major      = 1;
+    version->version_major      = 2;
     version->version_minor      = 2;
     version->version_patchlevel = 0;
 
@@ -2257,7 +2257,6 @@ int drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data,
     return 0;
 }
 
-#ifdef __linux__
 
 /*
  * Valid flags are 
@@ -3216,6 +3215,3 @@ int drmMMUnlock(int fd, unsigned memType)
     
     return ret;	
 }
-
-
-#endif
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 330aa3f..16e8626 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -660,7 +660,6 @@ typedef struct drm_set_version {
 	int drm_dd_minor;
 } drm_set_version_t;
 
-#ifdef __linux__
 
 #define DRM_FENCE_FLAG_EMIT                0x00000001
 #define DRM_FENCE_FLAG_SHAREABLE           0x00000002
@@ -844,8 +843,6 @@ typedef union drm_mm_init_arg{
 		unsigned expand_pad[8]; /*Future expansion */
 	} rep;
 } drm_mm_init_arg_t;
-#endif
-
 
 /**
  * \name Ioctls Definitions
@@ -912,11 +909,9 @@ typedef union drm_mm_init_arg{
 
 #define DRM_IOCTL_WAIT_VBLANK		DRM_IOWR(0x3a, drm_wait_vblank_t)
 
-#ifdef __linux__
 #define DRM_IOCTL_FENCE                 DRM_IOWR(0x3b, drm_fence_arg_t)
 #define DRM_IOCTL_BUFOBJ                DRM_IOWR(0x3d, drm_bo_arg_t)
 #define DRM_IOCTL_MM_INIT               DRM_IOWR(0x3e, drm_mm_init_arg_t)
-#endif
 
 #define DRM_IOCTL_UPDATE_DRAW           DRM_IOW(0x3f, drm_update_draw_t)
 

commit f6d5fecdd20b9fd9e8744d8f43fa276b73a1da78
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Fri Oct 27 11:28:37 2006 +0200

    Last minute changes to support multi-page size buffer offset alignments.
    This will come in very handy for tiled buffers on intel hardware.
    Also add some padding to interface structures to allow future binary backwards
    compatible changes.

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 9047c8d..ebf3f83 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2613,12 +2613,14 @@ static void drmBOCopyReply(const drm_bo_arg_reply_t *rep,
     buf->start = rep->buffer_start;
     buf->fenceFlags = rep->fence_flags;
     buf->replyFlags = rep->rep_flags;
+    buf->pageAlignment = rep->page_alignment;
 }
     
     
 
-int drmBOCreate(int fd, void *ttm, unsigned long start, unsigned long size,
-		void *user_buffer, drm_bo_type_t type, unsigned mask,
+int drmBOCreate(int fd, unsigned long start, unsigned long size, 
+		unsigned pageAlignment, void *user_buffer, drm_bo_type_t type, 
+		unsigned mask,
 		unsigned hint, drmBO *buf)
 {
     drm_bo_arg_t arg;
@@ -2632,6 +2634,7 @@ int drmBOCreate(int fd, void *ttm, unsigned long start, unsigned long size,
     req->hint = hint;
     req->size = size;
     req->type = type;
+    req->page_alignment = pageAlignment;
 
     buf->virtual = NULL;
 
diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h
index da868fe..bd0d281 100644
--- a/libdrm/xf86mm.h
+++ b/libdrm/xf86mm.h
@@ -99,6 +99,7 @@ typedef struct _drmFence{
         unsigned type; 
         unsigned flags;
         unsigned signaled;
+        unsigned pad[4]; /* for future expansion */
 } drmFence;
 
 typedef struct _drmBO{
@@ -113,9 +114,11 @@ typedef struct _drmBO{
     unsigned long start;
     unsigned replyFlags;
     unsigned fenceFlags;
+    unsigned pageAlignment;
     void *virtual;
     void *mapVirtual;
     int mapCount;
+    unsigned pad[8];     /* for future expansion */
 } drmBO;
 
 
@@ -168,9 +171,10 @@ extern int drmBOCreateList(int numTarget, drmBOList *list);
  * Buffer object functions.
  */
 
-extern int drmBOCreate(int fd, void *ttm, unsigned long start, unsigned long size,
-			      void *user_buffer, drm_bo_type_t type, unsigned mask,
-		unsigned hint, drmBO *buf);
+extern int drmBOCreate(int fd, unsigned long start, unsigned long size,
+		       unsigned pageAlignment,void *user_buffer, 
+		       drm_bo_type_t type, unsigned mask,
+		       unsigned hint, drmBO *buf);
 extern int drmBODestroy(int fd, drmBO *buf);
 extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
 extern int drmBOUnReference(int fd, drmBO *buf);
diff --git a/linux-core/drmP.h b/linux-core/drmP.h
index 1ed20b0..d02184c 100644
--- a/linux-core/drmP.h
+++ b/linux-core/drmP.h
@@ -1016,7 +1016,7 @@ typedef struct drm_buffer_object{
         unsigned long buffer_start;
         drm_bo_type_t type;
         unsigned long offset;
-
+        uint32_t page_alignment;
 	atomic_t mapped;
 	uint32_t flags;
 	uint32_t mask;
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
index 954b7a0..65e24fb 100644
--- a/linux-core/drm_bo.c
+++ b/linux-core/drm_bo.c
@@ -571,7 +571,7 @@ int drm_bo_alloc_space(drm_buffer_object_t * buf, unsigned mem_type,
 
 	mutex_lock(&dev->struct_mutex);
 	do {
-		node = drm_mm_search_free(mm, size, 0, 1);
+		node = drm_mm_search_free(mm, size, buf->page_alignment, 1);
 		if (node)
 			break;
 
@@ -599,7 +599,7 @@ int drm_bo_alloc_space(drm_buffer_object_t * buf, unsigned mem_type,
 		return -ENOMEM;
 	}
 
-	node = drm_mm_get_block(node, size, 0);
+	node = drm_mm_get_block(node, size, buf->page_alignment);
 	mutex_unlock(&dev->struct_mutex);
 	BUG_ON(!node);
 	node->private = (void *)buf;
@@ -959,6 +959,7 @@ static void drm_bo_fill_rep_arg(drm_buffer_object_t * bo,
 	rep->buffer_start = bo->buffer_start;
 	rep->fence_flags = bo->fence_type;
 	rep->rep_flags = 0;
+	rep->page_alignment = bo->page_alignment;
 
 	if ((bo->priv_flags & _DRM_BO_FLAG_UNFENCED) || drm_bo_quick_busy(bo)) {
 		DRM_FLAG_MASKED(rep->rep_flags, DRM_BO_REP_BUSY,
@@ -1387,6 +1388,7 @@ int drm_buffer_object_create(drm_file_t * priv,
 			     drm_bo_type_t type,
 			     uint32_t mask,
 			     uint32_t hint,
+			     uint32_t page_alignment,
 			     unsigned long buffer_start,
 			     drm_buffer_object_t ** buf_obj)
 {
@@ -1426,6 +1428,7 @@ int drm_buffer_object_create(drm_file_t * priv,
 	bo->num_pages = num_pages;
 	bo->node_card = NULL;
 	bo->node_ttm = NULL;
+	bo->page_alignment = page_alignment;
 	if (bo->type == drm_bo_type_fake) {
 		bo->offset = buffer_start;
 		bo->buffer_start = 0;
@@ -1516,6 +1519,7 @@ int drm_bo_ioctl(DRM_IOCTL_ARGS)
 						     req->type,
 						     req->mask,
 						     req->hint,
+						     req->page_alignment,
 						     req->buffer_start, &entry);
 			if (rep.ret)
 				break;
diff --git a/linux-core/drm_mm.c b/linux-core/drm_mm.c
index dcd5520..a5566b2 100644
--- a/linux-core/drm_mm.c
+++ b/linux-core/drm_mm.c
@@ -147,7 +147,10 @@ drm_mm_node_t *drm_mm_get_block(drm_mm_node_t * parent,
 
 	drm_mm_node_t *align_splitoff = NULL;
 	drm_mm_node_t *child;
-	unsigned tmp = size % alignment;
+	unsigned tmp = 0;
+
+	if (alignment)
+		tmp = size % alignment;
 	
 	if (tmp) {
 		align_splitoff = drm_mm_split_at_start(parent, alignment - tmp);
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 5784e59..330aa3f 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -770,6 +770,7 @@ typedef struct drm_bo_arg_request {
 	drm_bo_type_t type;
 	unsigned arg_handle;
 	drm_u64_t buffer_start;
+        unsigned page_alignment;
 	unsigned expand_pad[4]; /*Future expansion */
 	enum {
 		drm_bo_create,
@@ -804,6 +805,7 @@ typedef struct drm_bo_arg_reply {
         drm_u64_t buffer_start;
         unsigned fence_flags;
         unsigned rep_flags;
+        unsigned page_alignment;
 	unsigned expand_pad[4]; /*Future expansion */
 }drm_bo_arg_reply_t;
 	

commit e09544a2d3f44e96d01ed2bdcb4a4eb8eec26225
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Thu Oct 26 21:20:34 2006 +0200

    New mm function names. Update header.

diff --git a/linux-core/drmP.h b/linux-core/drmP.h
index 4ce5a3e..1ed20b0 100644
--- a/linux-core/drmP.h
+++ b/linux-core/drmP.h
@@ -1368,7 +1368,11 @@ extern drm_mm_node_t *drm_mm_search_free(const drm_mm_t *mm, unsigned long size,
 extern int drm_mm_init(drm_mm_t *mm, unsigned long start, unsigned long size);
 extern void drm_mm_takedown(drm_mm_t *mm);
 extern int drm_mm_clean(drm_mm_t *mm);
-static inline drm_mm_t *drm_get_mm(drm_mm_node_t *block) 
+extern unsigned long drm_mm_tail_space(drm_mm_t *mm);
+extern int drm_mm_remove_space_from_tail(drm_mm_t *mm, unsigned long size);
+extern int drm_mm_add_space_to_tail(drm_mm_t *mm, unsigned long size);
+
+static inline drm_mm_t *drm_get_mm(drm_mm_node_t *block)
 {
 	return block->mm;
 }
diff --git a/linux-core/drm_mm.c b/linux-core/drm_mm.c
index 5e0ba5e..dcd5520 100644
--- a/linux-core/drm_mm.c
+++ b/linux-core/drm_mm.c
@@ -44,7 +44,7 @@
 #include "drmP.h"
 #include <linux/slab.h>
 
-unsigned long tail_space(drm_mm_t *mm)
+unsigned long drm_mm_tail_space(drm_mm_t *mm)
 {
 	struct list_head *tail_node;
 	drm_mm_node_t *entry;
@@ -57,7 +57,7 @@ unsigned long tail_space(drm_mm_t *mm)
 	return entry->size;
 }
 
-int remove_space_from_tail(drm_mm_t *mm, unsigned long size)
+int drm_mm_remove_space_from_tail(drm_mm_t *mm, unsigned long size)
 {
 	struct list_head *tail_node;
 	drm_mm_node_t *entry;
@@ -99,7 +99,7 @@ static int drm_mm_create_tail_node(drm_mm_t *mm,
 }
 	
 
-int add_space_to_tail(drm_mm_t *mm, unsigned long size)
+int drm_mm_add_space_to_tail(drm_mm_t *mm, unsigned long size)
 {
 	struct list_head *tail_node;
 	drm_mm_node_t *entry;

commit 47dbfc4e4a3e8ce2ec468bc3874f74f7e2b13476
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Thu Oct 26 21:17:43 2006 +0200

    Add improved alignment functionality to the core memory manager.
    This makes an allocated block actually align itself and returns any
    wasted space to the manager.
    
    Also add some functions to grow and shrink the managed area.
    This will be used in the future to manage the buffer object swap cache.

diff --git a/linux-core/drm_mm.c b/linux-core/drm_mm.c
index 4af33bd..5e0ba5e 100644
--- a/linux-core/drm_mm.c
+++ b/linux-core/drm_mm.c
@@ -44,39 +44,132 @@
 #include "drmP.h"
 #include <linux/slab.h>
 
-drm_mm_node_t *drm_mm_get_block(drm_mm_node_t * parent,
-				unsigned long size, unsigned alignment)
+unsigned long tail_space(drm_mm_t *mm)
 {
+	struct list_head *tail_node;
+	drm_mm_node_t *entry;
+
+	tail_node = mm->root_node.ml_entry.prev;
+	entry = list_entry(tail_node, drm_mm_node_t, ml_entry);
+	if (!entry->free)
+		return 0;
+	
+	return entry->size;
+}
+
+int remove_space_from_tail(drm_mm_t *mm, unsigned long size)
+{
+	struct list_head *tail_node;
+	drm_mm_node_t *entry;



Reply to: