From c8a24cd00235a4ccb501e2cdea606730e166c572 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 30 Dec 2008 17:15:49 +0000 Subject: meta-moblin: Add initial menlow support --- .../conf/distro/include/moblin-fixed-revisions.inc | 3 + meta-moblin/conf/machine/menlow.conf | 43 + meta-moblin/packages/drm/files/menlow-config | 84 + .../packages/drm/files/poulsbo_libdrm_update.patch | 63492 +++++++++++++++++++ meta-moblin/packages/drm/libdrm-psb_git.bb | 25 + .../packages/drm/linux-psb-modules_2.6.24.bb | 26 + .../linux/linux-mid-2.6.24/defconfig-menlow | 2955 + meta-moblin/packages/linux/linux-mid_2.6.24.bb | 11 + .../linux/linux-moblin-2.6.27/defconfig-menlow | 2403 + meta-moblin/packages/linux/linux-moblin.inc | 3 +- meta-moblin/packages/linux/linux-moblin_2.6.27.bb | 1 + .../xorg-driver/files/104_disable_locks.diff | 23 + .../packages/xorg-driver/xf86-driver-common.inc | 32 + .../packages/xorg-driver/xf86-video-common.inc | 4 + .../packages/xorg-driver/xf86-video-psb_git.bb | 20 + .../packages/xorg-xserver/xserver-xf86-common.inc | 45 + .../xserver-xf86-lite-psb/drmfix.patch | 13 + .../libdri-xinerama-symbol.patch | 50 + .../xserver-xf86-lite-psb/macro_tweak.patch | 30 + .../xorg-xserver/xserver-xf86-lite-psb/xorg.conf | 87 + .../xorg-xserver/xserver-xf86-lite-psb_1.4.bb | 7 + .../packages/xorg-xserver/xserver-xf86-lite.inc | 37 + meta/packages/rt2860/rt2860_1.7.0.0.bb | 2 +- 23 files changed, 69393 insertions(+), 3 deletions(-) create mode 100644 meta-moblin/conf/machine/menlow.conf create mode 100644 meta-moblin/packages/drm/files/menlow-config create mode 100644 meta-moblin/packages/drm/files/poulsbo_libdrm_update.patch create mode 100644 meta-moblin/packages/drm/libdrm-psb_git.bb create mode 100644 meta-moblin/packages/drm/linux-psb-modules_2.6.24.bb create mode 100644 meta-moblin/packages/linux/linux-mid-2.6.24/defconfig-menlow create mode 100644 meta-moblin/packages/linux/linux-mid_2.6.24.bb create mode 100644 meta-moblin/packages/linux/linux-moblin-2.6.27/defconfig-menlow create mode 100644 meta-moblin/packages/xorg-driver/files/104_disable_locks.diff create mode 100644 meta-moblin/packages/xorg-driver/xf86-driver-common.inc create mode 100644 meta-moblin/packages/xorg-driver/xf86-video-common.inc create mode 100644 meta-moblin/packages/xorg-driver/xf86-video-psb_git.bb create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-common.inc create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-lite-psb/drmfix.patch create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-lite-psb/libdri-xinerama-symbol.patch create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-lite-psb/macro_tweak.patch create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-lite-psb/xorg.conf create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-lite-psb_1.4.bb create mode 100644 meta-moblin/packages/xorg-xserver/xserver-xf86-lite.inc diff --git a/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc b/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc index 6efbcc2d60..99bfd6f813 100644 --- a/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc +++ b/meta-moblin/conf/distro/include/moblin-fixed-revisions.inc @@ -12,3 +12,6 @@ PREFERRED_VERSION_atk ?= "1.24.0" PREFERRED_VERSION_pixman ?= "0.12.0" PREFERRED_VERSION_cairo ?= "1.8.2" PREFERRED_VERSION_pango ?= "1.22.2" +SRCREV_pn-xf86-video-psb ?= "b6b3bba06fe5a3fe0b1bd6e31a7369dd83812bab" +SRCREV_pn-libdrm-psb = "aa96c0bbbba11d5bab28bb421a67c2264fad953a" +SRCREV_pn-linux-mid ?= "cb29ee2997ba598028e1ad4bbdd073deac2d057d" \ No newline at end of file diff --git a/meta-moblin/conf/machine/menlow.conf b/meta-moblin/conf/machine/menlow.conf new file mode 100644 index 0000000000..dcd5717108 --- /dev/null +++ b/meta-moblin/conf/machine/menlow.conf @@ -0,0 +1,43 @@ +#@TYPE: Machine +#@NAME: Netbook + +#@DESCRIPTION: Machine configuration for Menlow platforms. Currently supported machines are the Compal JAX10 + +TARGET_ARCH = "i586" +PACKAGE_EXTRA_ARCHS = "x86" + +include conf/machine/include/tune-atom.inc + +MACHINE_FEATURES = "kernel26 screen keyboard pci usbhost ext2 ext3 x86 wifi \ + acpi" + +KERNEL_IMAGETYPE = "bzImage" + +PREFERRED_PROVIDER_virtual/kernel ?= "linux-mid" +PREFERRED_PROVIDER_virtual/libx11 ?= "libx11-trim" +PREFERRED_PROVIDER_virtual/libgl ?= "mesa" +PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xf86-lite-psb" +PREFERRED_PROVIDER_virtual/xserver-xf86 ?= "xserver-xf86-lite-psb" +XSERVER ?= "xserver-xf86-lite-psb \ + xf86-input-mouse \ + xf86-input-keyboard \ + xf86-input-synaptics \ + xf86-video-psb" +# mesa-dri-driver-i915" + +#MACHINE_EXTRA_RDEPENDS = "rt2860" + +MACHINE_EXTRA_RRECOMMENDS = "kernel-modules eee-acpi-scripts" + +GUI_MACHINE_CLASS = "bigscreen" + +IMAGE_ROOTFS_SIZE_ext3 = "500000" + +IMAGE_FSTYPES ?= "ext3 jffs2 cpio.gz" + +APPEND += "video=intelfb:mode=800x600,accel=0,hwcursor=0 vga=788 usbcore.autosuspend=1" + +GLIBC_ADDONS = "nptl" +GLIBC_EXTRA_OECONF = "--with-tls" + +EXTRA_OECONF_append_pn-matchbox-panel-2 = " --with-battery=acpi" diff --git a/meta-moblin/packages/drm/files/menlow-config b/meta-moblin/packages/drm/files/menlow-config new file mode 100644 index 0000000000..3a699b587b --- /dev/null +++ b/meta-moblin/packages/drm/files/menlow-config @@ -0,0 +1,84 @@ +# Ubuntu config + + +CONFIG_BLK_DEV_GNBD=m + +# Requires some headers from drivers/md +#CONFIG_BLK_DEV_DM_BBR=m + +CONFIG_SND_BTSCO=m + +CONFIG_INPUT_ACERHK=m +CONFIG_AVERATEC_5100P=m +CONFIG_PACKARDBELL_E5=m +CONFIG_LMPCM_USB=m +CONFIG_NOZOMI=m + +CONFIG_NDISWRAPPER=m + CONFIG_NDISWRAPPER_WQ=y + +#CONFIG_MOL=m + +CONFIG_ASFS_FS=m + +# Uses unexported functions from gfs2 +CONFIG_GFS_FS=m + +CONFIG_SQUASHFS=m +# CONFIG_UNION_FS is not set + +CONFIG_USB_APPLEIR=m + +CONFIG_GSPCA=m + +CONFIG_USB_OV511_NEW=m +CONFIG_QUICKCAM=m +CONFIG_USB_UVCCAM=m + +CONFIG_NET_ACX=m +CONFIG_IPW3945=m +CONFIG_IWLWIFI=m +CONFIG_USB_ATMEL=m +CONFIG_PRISM2_USB=m + + +CONFIG_IPW2100_FS_AMILO_M7400=m + + +CONFIG_LIRC_DEV=m +CONFIG_LIRC_ATIUSB=m +CONFIG_LIRC_BT829=m +CONFIG_LIRC_CMDIR=m +#CONFIG_LIRC_GPIO=m +CONFIG_LIRC_I2C=m +CONFIG_LIRC_IGORPLUGUSB=m +CONFIG_LIRC_IMON=m +CONFIG_LIRC_IT87=m +CONFIG_LIRC_MCEUSB=m +CONFIG_LIRC_MCEUSB2=m +#CONFIG_LIRC_PARALLEL=m +CONFIG_LIRC_PVR150=m +CONFIG_LIRC_SASEM=m +CONFIG_LIRC_SERIAL=m +CONFIG_LIRC_SERIAL_IGOR=m +CONFIG_LIRC_SIR=m +CONFIG_LIRC_STREAMZAP=m +CONFIG_LIRC_TTUSBIR=m + + +CONFIG_DRM_PSB=m + + +CONFIG_AMT_HECI=m + + +CONFIG_ET131X=m + + +CONFIG_STK11XX=m + +CONFIG_MMC_SD8686=m +CONFIG_MMC_SD8688=m + +CONFIG_WIMAX_I2400M=m +# CONFIG_DVB_SIANO_SMS1XXX is not set diff --git a/meta-moblin/packages/drm/files/poulsbo_libdrm_update.patch b/meta-moblin/packages/drm/files/poulsbo_libdrm_update.patch new file mode 100644 index 0000000000..5fb84302aa --- /dev/null +++ b/meta-moblin/packages/drm/files/poulsbo_libdrm_update.patch @@ -0,0 +1,63492 @@ +From eea94c0cd2198bd46ae4417b7eb7ab5f45df0c3c Mon Sep 17 00:00:00 2001 +From: Inuka Gunawardana +Date: Sun, 20 Jan 2008 00:46:32 -0800 +Subject: [PATCH] added changes + +--- + configure.ac | 2 +- + libdrm/Makefile.am | 4 +- + libdrm/xf86drm.c | 1194 ++--- + libdrm/xf86drm.h | 4 +- + libdrm/xf86drmHash.c | 20 +- + libdrm/xf86drmMode.c | 465 ++ + libdrm/xf86drmMode.h | 226 + + libdrm/xf86drmRandom.c | 20 +- + libdrm/xf86drmSL.c | 23 +- + libdrm/xf86mm.h | 120 +- + shared-core/Makefile.am | 7 +- + shared-core/Makefile.in | 5 +- + shared-core/drm.h | 908 ++-- + shared-core/drm_pciids.txt | 744 +++ + shared-core/drm_sarea.h | 30 +- + shared-core/i915_dma.c | 968 ++++ + shared-core/i915_drm.h | 131 +- + shared-core/i915_drv.h | 676 +++ + shared-core/i915_irq.c | 752 +++ + shared-core/i915_mem.c | 386 ++ + shared-core/imagine_drv.h | 43 + + shared-core/mach64_dma.c | 1532 ++++++ + shared-core/mach64_drm.h | 4 +- + shared-core/mach64_drv.h | 1058 ++++ + shared-core/mach64_irq.c | 136 + + shared-core/mach64_state.c | 897 ++++ + shared-core/mga_dma.c | 1164 ++++ + shared-core/mga_drm.h | 22 +- + shared-core/mga_drv.h | 688 +++ + shared-core/mga_irq.c | 150 + + shared-core/mga_state.c | 1143 ++++ + shared-core/mga_ucode.h |11645 ++++++++++++++++++++++++++++++++++++++++ + shared-core/mga_warp.c | 198 + + shared-core/nouveau_drm.h | 164 + + shared-core/nouveau_drv.h | 584 ++ + shared-core/nouveau_fifo.c | 554 ++ + shared-core/nouveau_irq.c | 430 ++ + shared-core/nouveau_mem.c | 608 +++ + shared-core/nouveau_notifier.c | 173 + + shared-core/nouveau_object.c | 1148 ++++ + shared-core/nouveau_reg.h | 550 ++ + shared-core/nouveau_state.c | 566 ++ + shared-core/nv04_fb.c | 24 + + shared-core/nv04_fifo.c | 129 + + shared-core/nv04_graph.c | 474 ++ + shared-core/nv04_mc.c | 23 + + shared-core/nv04_timer.c | 45 + + shared-core/nv10_fb.c | 26 + + shared-core/nv10_fifo.c | 160 + + shared-core/nv10_graph.c | 872 +++ + shared-core/nv20_graph.c | 249 + + shared-core/nv30_graph.c | 2912 ++++++++++ + shared-core/nv40_fb.c | 56 + + shared-core/nv40_fifo.c | 208 + + shared-core/nv40_graph.c | 2055 +++++++ + shared-core/nv40_mc.c | 39 + + shared-core/nv50_fifo.c | 327 ++ + shared-core/nv50_graph.c | 316 ++ + shared-core/nv50_mc.c | 43 + + shared-core/nv_drv.h | 52 + + shared-core/psb_drm.h | 359 ++ + shared-core/psb_drv.h | 786 +++ + shared-core/psb_reg.h | 555 ++ + shared-core/r128_cce.c | 932 ++++ + shared-core/r128_drm.h | 22 +- + shared-core/r128_drv.h | 523 ++ + shared-core/r128_irq.c | 101 + + shared-core/r128_state.c | 1682 ++++++ + shared-core/r300_cmdbuf.c | 954 ++++ + shared-core/r300_reg.h | 1078 +++-- + shared-core/radeon_cp.c | 2316 ++++++++ + shared-core/radeon_drm.h | 29 +- + shared-core/radeon_drv.h | 1269 +++++ + shared-core/radeon_irq.c | 321 ++ + shared-core/radeon_mem.c | 302 ++ + shared-core/radeon_state.c | 3240 +++++++++++ + shared-core/savage_bci.c | 1095 ++++ + shared-core/savage_drm.h | 4 +- + shared-core/savage_drv.h | 575 ++ + shared-core/savage_state.c | 1165 ++++ + shared-core/sis_drv.h | 92 + + shared-core/sis_ds.c | 299 + + shared-core/sis_ds.h | 146 + + shared-core/sis_mm.c | 386 ++ + shared-core/tdfx_drv.h | 47 + + shared-core/via_dma.c | 719 +++ + shared-core/via_drm.h | 40 +- + shared-core/via_drv.c | 161 + + shared-core/via_drv.h | 219 + + shared-core/via_ds.c | 274 + + shared-core/via_ds.h | 104 + + shared-core/via_irq.c | 393 ++ + shared-core/via_map.c | 143 + + shared-core/via_mm.c | 347 ++ + shared-core/via_mm.h | 40 + + shared-core/via_verifier.c | 1121 ++++ + shared-core/via_verifier.h | 64 + + shared-core/via_video.c | 93 + + 98 files changed, 58391 insertions(+), 1757 deletions(-) + create mode 100644 libdrm/xf86drmMode.c + create mode 100644 libdrm/xf86drmMode.h + create mode 100644 shared-core/drm_pciids.txt + create mode 100644 shared-core/i915_dma.c + create mode 100644 shared-core/i915_drv.h + create mode 100644 shared-core/i915_irq.c + create mode 100644 shared-core/i915_mem.c + create mode 100644 shared-core/imagine_drv.h + create mode 100644 shared-core/mach64_dma.c + create mode 100644 shared-core/mach64_drv.h + create mode 100644 shared-core/mach64_irq.c + create mode 100644 shared-core/mach64_state.c + create mode 100644 shared-core/mga_dma.c + create mode 100644 shared-core/mga_drv.h + create mode 100644 shared-core/mga_irq.c + create mode 100644 shared-core/mga_state.c + create mode 100644 shared-core/mga_ucode.h + create mode 100644 shared-core/mga_warp.c + create mode 100644 shared-core/nouveau_drm.h + create mode 100644 shared-core/nouveau_drv.h + create mode 100644 shared-core/nouveau_fifo.c + create mode 100644 shared-core/nouveau_irq.c + create mode 100644 shared-core/nouveau_mem.c + create mode 100644 shared-core/nouveau_notifier.c + create mode 100644 shared-core/nouveau_object.c + create mode 100644 shared-core/nouveau_reg.h + create mode 100644 shared-core/nouveau_state.c + create mode 100644 shared-core/nv04_fb.c + create mode 100644 shared-core/nv04_fifo.c + create mode 100644 shared-core/nv04_graph.c + create mode 100644 shared-core/nv04_mc.c + create mode 100644 shared-core/nv04_timer.c + create mode 100644 shared-core/nv10_fb.c + create mode 100644 shared-core/nv10_fifo.c + create mode 100644 shared-core/nv10_graph.c + create mode 100644 shared-core/nv20_graph.c + create mode 100644 shared-core/nv30_graph.c + create mode 100644 shared-core/nv40_fb.c + create mode 100644 shared-core/nv40_fifo.c + create mode 100644 shared-core/nv40_graph.c + create mode 100644 shared-core/nv40_mc.c + create mode 100644 shared-core/nv50_fifo.c + create mode 100644 shared-core/nv50_graph.c + create mode 100644 shared-core/nv50_mc.c + create mode 100644 shared-core/nv_drv.h + create mode 100644 shared-core/psb_drm.h + create mode 100644 shared-core/psb_drv.h + create mode 100644 shared-core/psb_reg.h + create mode 100644 shared-core/r128_cce.c + create mode 100644 shared-core/r128_drv.h + create mode 100644 shared-core/r128_irq.c + create mode 100644 shared-core/r128_state.c + create mode 100644 shared-core/r300_cmdbuf.c + create mode 100644 shared-core/radeon_cp.c + create mode 100644 shared-core/radeon_drv.h + create mode 100644 shared-core/radeon_irq.c + create mode 100644 shared-core/radeon_mem.c + create mode 100644 shared-core/radeon_state.c + create mode 100644 shared-core/savage_bci.c + create mode 100644 shared-core/savage_drv.h + create mode 100644 shared-core/savage_state.c + create mode 100644 shared-core/sis_drv.h + create mode 100644 shared-core/sis_ds.c + create mode 100644 shared-core/sis_ds.h + create mode 100644 shared-core/sis_mm.c + create mode 100644 shared-core/tdfx_drv.h + create mode 100644 shared-core/via_dma.c + create mode 100644 shared-core/via_drv.c + create mode 100644 shared-core/via_drv.h + create mode 100644 shared-core/via_ds.c + create mode 100644 shared-core/via_ds.h + create mode 100644 shared-core/via_irq.c + create mode 100644 shared-core/via_map.c + create mode 100644 shared-core/via_mm.c + create mode 100644 shared-core/via_mm.h + create mode 100644 shared-core/via_verifier.c + create mode 100644 shared-core/via_verifier.h + create mode 100644 shared-core/via_video.c + +Index: git/configure.ac +=================================================================== +--- git.orig/configure.ac 2008-12-12 17:20:14.000000000 +0000 ++++ git/configure.ac 2008-12-12 17:35:22.000000000 +0000 +@@ -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.3.0, [dri-devel@lists.sourceforge.net], libdrm) ++AC_INIT([libdrm], 2.3.1, [dri-devel@lists.sourceforge.net], libdrm) + AC_CONFIG_SRCDIR([Makefile.am]) + AM_INIT_AUTOMAKE([dist-bzip2]) + +Index: git/libdrm/Makefile.am +=================================================================== +--- git.orig/libdrm/Makefile.am 2008-12-12 17:20:14.000000000 +0000 ++++ git/libdrm/Makefile.am 2008-12-12 17:35:22.000000000 +0000 +@@ -23,9 +23,9 @@ + 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 ++libdrm_la_SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c xf86drmMode.c + + libdrmincludedir = ${includedir} +-libdrminclude_HEADERS = xf86drm.h xf86mm.h ++libdrminclude_HEADERS = xf86drm.h xf86mm.h xf86drmMode.h + + EXTRA_DIST = ChangeLog TODO +Index: git/libdrm/xf86drm.c +=================================================================== +--- git.orig/libdrm/xf86drm.c 2008-12-12 17:20:14.000000000 +0000 ++++ git/libdrm/xf86drm.c 2008-12-12 17:35:22.000000000 +0000 +@@ -31,10 +31,6 @@ + * DEALINGS IN THE SOFTWARE. + */ + +-#ifdef HAVE_XORG_CONFIG_H +-#include +-#endif +- + #ifdef HAVE_CONFIG_H + # include + #endif +@@ -53,7 +49,6 @@ + #include + #include + #include +-#include "drm.h" + + /* Not all systems have MAP_FAILED defined */ + #ifndef MAP_FAILED +@@ -96,7 +91,7 @@ + + void drmSetServerInfo(drmServerInfoPtr info) + { +- drm_server_info = info; ++ drm_server_info = info; + } + + /** +@@ -110,7 +105,7 @@ + + static int drmDebugPrint(const char *format, va_list ap) + { +- return vfprintf(stderr, format, ap); ++ return vfprintf(stderr, format, ap); + } + + static int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint; +@@ -135,26 +130,28 @@ + void + drmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap)) + { +- drm_debug_print = debug_msg_ptr; ++ drm_debug_print = debug_msg_ptr; + } + + static void *drmHashTable = NULL; /* Context switch callbacks */ + + void *drmGetHashTable(void) + { +- return drmHashTable; ++ return drmHashTable; + } + + void *drmMalloc(int size) + { + void *pt; +- if ((pt = malloc(size))) memset(pt, 0, size); ++ if ((pt = malloc(size))) ++ memset(pt, 0, size); + return pt; + } + + void drmFree(void *pt) + { +- if (pt) free(pt); ++ if (pt) ++ free(pt); + } + + /* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */ +@@ -190,7 +187,8 @@ + void *value; + drmHashEntry *entry; + +- if (!drmHashTable) drmHashTable = drmHashCreate(); ++ if (!drmHashTable) ++ drmHashTable = drmHashCreate(); + + if (drmHashLookup(drmHashTable, key, &value)) { + entry = drmMalloc(sizeof(*entry)); +@@ -280,14 +278,15 @@ + drmMsg("drmOpenDevice: node name is %s\n", buf); + + 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; ++ 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; ++ if (!isroot) ++ return DRM_ERR_NOT_ROOT; + mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); + chown(DRM_DIR_NAME, 0, 0); /* root:root */ + chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); +@@ -295,37 +294,41 @@ + + /* Check if the device node exists and create it if necessary. */ + if (stat(buf, &st)) { +- if (!isroot) return DRM_ERR_NOT_ROOT; ++ if (!isroot) ++ return DRM_ERR_NOT_ROOT; + remove(buf); + mknod(buf, S_IFCHR | devmode, dev); + } + + if (drm_server_info) { +- chown(buf, user, group); +- chmod(buf, devmode); ++ chown(buf, user, group); ++ chmod(buf, devmode); + } + + fd = open(buf, O_RDWR, 0); + drmMsg("drmOpenDevice: open result is %d, (%s)\n", + fd, fd < 0 ? strerror(errno) : "OK"); +- if (fd >= 0) return fd; ++ if (fd >= 0) ++ return fd; + + /* Check if the device node is not what we expect it to be, and recreate it + * and try again if so. + */ + if (st.st_rdev != dev) { +- if (!isroot) return DRM_ERR_NOT_ROOT; ++ if (!isroot) ++ return DRM_ERR_NOT_ROOT; + remove(buf); + mknod(buf, S_IFCHR | devmode, dev); + if (drm_server_info) { +- chown(buf, user, group); +- chmod(buf, devmode); ++ chown(buf, user, group); ++ chmod(buf, devmode); + } + } + fd = open(buf, O_RDWR, 0); + drmMsg("drmOpenDevice: open result is %d, (%s)\n", + fd, fd < 0 ? strerror(errno) : "OK"); +- if (fd >= 0) return fd; ++ if (fd >= 0) ++ return fd; + + drmMsg("drmOpenDevice: Open failed\n"); + remove(buf); +@@ -350,10 +353,12 @@ + int fd; + char buf[64]; + +- if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor); ++ if (create) ++ return drmOpenDevice(makedev(DRM_MAJOR, minor), minor); + + sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor); +- if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd; ++ if ((fd = open(buf, O_RDWR, 0)) >= 0) ++ return fd; + return -errno; + } + +@@ -377,7 +382,8 @@ + if ((fd = drmOpenMinor(0, 1)) < 0) { + #ifdef __linux__ + /* Try proc for backward Linux compatibility */ +- if (!access("/proc/dri/0", R_OK)) return 1; ++ if (!access("/proc/dri/0", R_OK)) ++ return 1; + #endif + return 0; + } +@@ -428,7 +434,8 @@ + drmFreeBusid(buf); + return fd; + } +- if (buf) drmFreeBusid(buf); ++ if (buf) ++ drmFreeBusid(buf); + close(fd); + } + } +@@ -458,16 +465,16 @@ + char * id; + + if (!drmAvailable()) { +- if (!drm_server_info) +- return -1; +- else { +- /* try to load the kernel module now */ +- if (!drm_server_info->load_module(name)) { +- drmMsg("[drm] failed to load kernel module \"%s\"\n", +- name); +- return -1; +- } +- } ++ if (!drm_server_info) { ++ return -1; ++ } ++ else { ++ /* try to load the kernel module now */ ++ if (!drm_server_info->load_module(name)) { ++ drmMsg("[drm] failed to load kernel module \"%s\"\n", name); ++ return -1; ++ } ++ } + } + + /* +@@ -552,16 +559,13 @@ + if (!drmAvailable() && name != NULL && drm_server_info) { + /* try to load the kernel */ + if (!drm_server_info->load_module(name)) { +- drmMsg("[drm] failed to load kernel module \"%s\"\n", +- name); ++ drmMsg("[drm] failed to load kernel module \"%s\"\n", name); + return -1; + } + } + + if (busid) { +- int fd; +- +- fd = drmOpenByBusid(busid); ++ int fd = drmOpenByBusid(busid); + if (fd >= 0) + return fd; + } +@@ -584,10 +588,11 @@ + */ + void drmFreeVersion(drmVersionPtr v) + { +- if (!v) return; +- if (v->name) drmFree(v->name); +- if (v->date) drmFree(v->date); +- if (v->desc) drmFree(v->desc); ++ if (!v) ++ return; ++ drmFree(v->name); ++ drmFree(v->date); ++ drmFree(v->desc); + drmFree(v); + } + +@@ -603,10 +608,11 @@ + */ + static void drmFreeKernelVersion(drm_version_t *v) + { +- if (!v) return; +- if (v->name) drmFree(v->name); +- if (v->date) drmFree(v->date); +- if (v->desc) drmFree(v->desc); ++ if (!v) ++ return; ++ drmFree(v->name); ++ drmFree(v->date); ++ drmFree(v->desc); + drmFree(v); + } + +@@ -760,9 +766,11 @@ + u.unique_len = 0; + u.unique = NULL; + +- if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL; ++ if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) ++ return NULL; + u.unique = drmMalloc(u.unique_len + 1); +- if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL; ++ if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) ++ return NULL; + u.unique[u.unique_len] = '\0'; + + return u.unique; +@@ -799,7 +807,8 @@ + drm_auth_t auth; + + *magic = 0; +- if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) ++ return -errno; + *magic = auth.magic; + return 0; + } +@@ -809,7 +818,8 @@ + drm_auth_t auth; + + auth.magic = magic; +- if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) ++ return -errno; + return 0; + } + +@@ -873,8 +883,10 @@ + map.handle = 0; + map.type = type; + map.flags = flags; +- if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno; +- if (handle) *handle = (drm_handle_t)map.handle; ++ if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) ++ return -errno; ++ if (handle) ++ *handle = (drm_handle_t)map.handle; + return 0; + } + +@@ -884,7 +896,8 @@ + + map.handle = (void *)handle; + +- if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) return -errno; ++ if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) ++ return -errno; + return 0; + } + +@@ -916,7 +929,8 @@ + request.flags = flags; + request.agp_start = agp_offset; + +- if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) ++ return -errno; + return request.count; + } + +@@ -928,9 +942,11 @@ + info.count = 0; + info.list = NULL; + +- if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL; ++ if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) ++ return -EINVAL; + +- if (!info.count) return -EINVAL; ++ if (!info.count) ++ return -EINVAL; + + if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) + return -ENOMEM; +@@ -976,7 +992,8 @@ + + request.count = count; + request.list = list; +- if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) ++ return -errno; + return 0; + } + +@@ -1024,7 +1041,8 @@ + { + static unsigned long pagesize_mask = 0; + +- if (fd < 0) return -EINVAL; ++ if (fd < 0) ++ return -EINVAL; + + if (!pagesize_mask) + pagesize_mask = getpagesize() - 1; +@@ -1032,7 +1050,8 @@ + size = (size + pagesize_mask) & ~pagesize_mask; + + *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); +- if (*address == MAP_FAILED) return -errno; ++ if (*address == MAP_FAILED) ++ return -errno; + return 0; + } + +@@ -1062,7 +1081,8 @@ + info.count = 0; + info.list = NULL; + +- if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return NULL; ++ if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) ++ return NULL; + + if (info.count) { + if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) +@@ -1112,9 +1132,11 @@ + bufs.count = 0; + bufs.list = NULL; + bufs.virtual = NULL; +- if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL; ++ if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) ++ return NULL; + +- if (!bufs.count) return NULL; ++ if (!bufs.count) ++ return NULL; + + if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) + return NULL; +@@ -1269,20 +1291,25 @@ + + res.count = 0; + res.contexts = NULL; +- if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL; ++ if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) ++ return NULL; + +- if (!res.count) return NULL; ++ if (!res.count) ++ return NULL; + +- if (!(list = drmMalloc(res.count * sizeof(*list)))) return NULL; ++ if (!(list = drmMalloc(res.count * sizeof(*list)))) ++ return NULL; + if (!(retval = drmMalloc(res.count * sizeof(*retval)))) { + drmFree(list); + return NULL; + } + + res.contexts = list; +- if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL; ++ if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) ++ return NULL; + +- for (i = 0; i < res.count; i++) retval[i] = list[i].handle; ++ for (i = 0; i < res.count; i++) ++ retval[i] = list[i].handle; + drmFree(list); + + *count = res.count; +@@ -1317,7 +1344,8 @@ + drm_ctx_t ctx; + + ctx.flags = 0; /* Modified with functions below */ +- if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) ++ return -errno; + *handle = ctx.handle; + return 0; + } +@@ -1327,7 +1355,8 @@ + drm_ctx_t ctx; + + ctx.handle = context; +- if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) ++ return -errno; + return 0; + } + +@@ -1343,9 +1372,12 @@ + */ + ctx.handle = context; + ctx.flags = 0; +- if (flags & DRM_CONTEXT_PRESERVED) ctx.flags |= _DRM_CONTEXT_PRESERVED; +- if (flags & DRM_CONTEXT_2DONLY) ctx.flags |= _DRM_CONTEXT_2DONLY; +- if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) return -errno; ++ if (flags & DRM_CONTEXT_PRESERVED) ++ ctx.flags |= _DRM_CONTEXT_PRESERVED; ++ if (flags & DRM_CONTEXT_2DONLY) ++ ctx.flags |= _DRM_CONTEXT_2DONLY; ++ if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) ++ return -errno; + return 0; + } + +@@ -1355,10 +1387,13 @@ + drm_ctx_t ctx; + + ctx.handle = context; +- if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) ++ return -errno; + *flags = 0; +- if (ctx.flags & _DRM_CONTEXT_PRESERVED) *flags |= DRM_CONTEXT_PRESERVED; +- if (ctx.flags & _DRM_CONTEXT_2DONLY) *flags |= DRM_CONTEXT_2DONLY; ++ if (ctx.flags & _DRM_CONTEXT_PRESERVED) ++ *flags |= DRM_CONTEXT_PRESERVED; ++ if (ctx.flags & _DRM_CONTEXT_2DONLY) ++ *flags |= DRM_CONTEXT_2DONLY; + return 0; + } + +@@ -1383,14 +1418,16 @@ + { + drm_ctx_t ctx; + ctx.handle = handle; +- if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) ++ return -errno; + return 0; + } + + int drmCreateDrawable(int fd, drm_drawable_t *handle) + { + drm_draw_t draw; +- if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) ++ return -errno; + *handle = draw.handle; + return 0; + } +@@ -1399,7 +1436,8 @@ + { + drm_draw_t draw; + draw.handle = handle; +- if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) ++ return -errno; + return 0; + } + +@@ -1414,7 +1452,8 @@ + update.num = num; + update.data = (unsigned long long)(unsigned long)data; + +- if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) ++ return -errno; + + return 0; + } +@@ -1433,7 +1472,8 @@ + */ + int drmAgpAcquire(int fd) + { +- if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) ++ return -errno; + return 0; + } + +@@ -1450,7 +1490,8 @@ + */ + int drmAgpRelease(int fd) + { +- if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) ++ return -errno; + return 0; + } + +@@ -1472,7 +1513,8 @@ + drm_agp_mode_t m; + + m.mode = mode; +- if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) ++ return -errno; + return 0; + } + +@@ -1502,8 +1544,10 @@ + b.size = size; + b.handle = 0; + b.type = type; +- if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return -errno; +- if (address != 0UL) *address = b.physical; ++ if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) ++ return -errno; ++ if (address != 0UL) ++ *address = b.physical; + *handle = b.handle; + return 0; + } +@@ -1527,7 +1571,8 @@ + + b.size = 0; + b.handle = handle; +- if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) ++ return -errno; + return 0; + } + +@@ -1551,7 +1596,8 @@ + + b.handle = handle; + b.offset = offset; +- if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) ++ return -errno; + return 0; + } + +@@ -1574,7 +1620,8 @@ + + b.handle = handle; + b.offset = 0; +- if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) ++ return -errno; + return 0; + } + +@@ -1594,7 +1641,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return -errno; + return i.agp_version_major; + } + +@@ -1614,7 +1662,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return -errno; + return i.agp_version_minor; + } + +@@ -1634,7 +1683,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.mode; + } + +@@ -1654,7 +1704,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.aperture_base; + } + +@@ -1674,7 +1725,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.aperture_size; + } + +@@ -1694,7 +1746,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.memory_used; + } + +@@ -1714,7 +1767,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.memory_allowed; + } + +@@ -1734,7 +1788,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.id_vendor; + } + +@@ -1754,7 +1809,8 @@ + { + drm_agp_info_t i; + +- if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; ++ if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) ++ return 0; + return i.id_device; + } + +@@ -1765,7 +1821,8 @@ + *handle = 0; + sg.size = size; + sg.handle = 0; +- if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) ++ return -errno; + *handle = sg.handle; + return 0; + } +@@ -1776,7 +1833,8 @@ + + sg.size = 0; + sg.handle = handle; +- if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) ++ return -errno; + return 0; + } + +@@ -1806,12 +1864,21 @@ + int drmError(int err, const char *label) + { + switch (err) { +- case DRM_ERR_NO_DEVICE: fprintf(stderr, "%s: no device\n", label); break; +- case DRM_ERR_NO_ACCESS: fprintf(stderr, "%s: no access\n", label); break; +- case DRM_ERR_NOT_ROOT: fprintf(stderr, "%s: not root\n", label); break; +- case DRM_ERR_INVALID: fprintf(stderr, "%s: invalid args\n", label);break; ++ case DRM_ERR_NO_DEVICE: ++ fprintf(stderr, "%s: no device\n", label); ++ break; ++ case DRM_ERR_NO_ACCESS: ++ fprintf(stderr, "%s: no access\n", label); ++ break; ++ case DRM_ERR_NOT_ROOT: ++ fprintf(stderr, "%s: not root\n", label); ++ break; ++ case DRM_ERR_INVALID: ++ fprintf(stderr, "%s: invalid args\n", label); ++ break; + default: +- if (err < 0) err = -err; ++ if (err < 0) ++ err = -err; + fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) ); + break; + } +@@ -1837,7 +1904,8 @@ + + ctl.func = DRM_INST_HANDLER; + ctl.irq = irq; +- if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) ++ return -errno; + return 0; + } + +@@ -1859,7 +1927,8 @@ + + ctl.func = DRM_UNINST_HANDLER; + ctl.irq = 0; +- if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) ++ return -errno; + return 0; + } + +@@ -1875,7 +1944,8 @@ + if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; + if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; + if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; +- if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) ++ return -errno; + return 0; + } + +@@ -1900,7 +1970,8 @@ + p.busnum = busnum; + p.devnum = devnum; + p.funcnum = funcnum; +- if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) ++ return -errno; + return p.irq; + } + +@@ -1927,7 +1998,8 @@ + drmHashEntry *entry = drmGetEntry(fd); + void *value; + +- if (drmHashLookup(entry->tagTable, context, &value)) return NULL; ++ if (drmHashLookup(entry->tagTable, context, &value)) ++ return NULL; + + return value; + } +@@ -1940,7 +2012,8 @@ + map.ctx_id = ctx_id; + map.handle = (void *)handle; + +- if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) ++ return -errno; + return 0; + } + +@@ -1951,8 +2024,10 @@ + + map.ctx_id = ctx_id; + +- if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) return -errno; +- if (handle) *handle = (drm_handle_t)map.handle; ++ if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) ++ return -errno; ++ if (handle) ++ *handle = (drm_handle_t)map.handle; + + return 0; + } +@@ -1964,7 +2039,8 @@ + drm_map_t map; + + map.offset = idx; +- if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) ++ return -errno; + *offset = map.offset; + *size = map.size; + *type = map.type; +@@ -1980,7 +2056,8 @@ + drm_client_t client; + + client.idx = idx; +- if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) ++ return -errno; + *auth = client.auth; + *pid = client.pid; + *uid = client.uid; +@@ -1994,7 +2071,8 @@ + drm_stats_t s; + int i; + +- if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno; ++ if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) ++ return -errno; + + stats->count = 0; + memset(stats, 0, sizeof(*stats)); +@@ -2267,19 +2345,20 @@ + * DRM_FENCE_MASK_DRIVER + */ + +-int drmFenceCreate(int fd, unsigned flags, int class,unsigned type, ++int drmFenceCreate(int fd, unsigned flags, int fence_class, unsigned type, + drmFence *fence) + { + drm_fence_arg_t arg; +- ++ + memset(&arg, 0, sizeof(arg)); ++ arg.flags = flags; + arg.type = type; +- arg.class = class; +- arg.op = drm_fence_create; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) ++ arg.fence_class = fence_class; ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_CREATE, &arg)) + return -errno; + fence->handle = arg.handle; +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->flags = arg.flags; + fence->signaled = 0; +@@ -2292,46 +2371,36 @@ + * DRM_FENCE_MASK_DRIVER + */ + +-int drmFenceBuffers(int fd, unsigned flags, drmFence *fence) ++int drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence) + { + drm_fence_arg_t arg; +- ++ + memset(&arg, 0, sizeof(arg)); + arg.flags = flags; +- arg.op = drm_fence_buffers; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) ++ arg.fence_class = fence_class; ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_BUFFERS, &arg)) + return -errno; + fence->handle = arg.handle; +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->flags = arg.flags; ++ fence->sequence = arg.sequence; + fence->signaled = 0; + return 0; + } +- +-int drmFenceDestroy(int fd, const drmFence *fence) +-{ +- drm_fence_arg_t arg; +- +- memset(&arg, 0, sizeof(arg)); +- arg.handle = fence->handle; +- arg.op = drm_fence_destroy; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) +- return -errno; +- return 0; +-} + + int drmFenceReference(int fd, unsigned handle, drmFence *fence) + { + drm_fence_arg_t arg; +- ++ + memset(&arg, 0, sizeof(arg)); + arg.handle = handle; +- arg.op = drm_fence_reference; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_REFERENCE, &arg)) + return -errno; + fence->handle = arg.handle; +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->flags = arg.flags; + fence->signaled = arg.signaled; +@@ -2341,11 +2410,11 @@ + int drmFenceUnreference(int fd, const drmFence *fence) + { + drm_fence_arg_t arg; +- ++ + memset(&arg, 0, sizeof(arg)); + arg.handle = fence->handle; +- arg.op = drm_fence_unreference; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_UNREFERENCE, &arg)) + return -errno; + return 0; + } +@@ -2353,29 +2422,29 @@ + int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type) + { + drm_fence_arg_t arg; +- ++ + memset(&arg, 0, sizeof(arg)); + arg.handle = fence->handle; + arg.type = flush_type; +- arg.op = drm_fence_flush; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_FLUSH, &arg)) + return -errno; +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->signaled = arg.signaled; +- return 0; ++ return arg.error; + } + + int drmFenceUpdate(int fd, drmFence *fence) + { +- drm_fence_arg_t arg; +- ++ 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)) ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_SIGNALED, &arg)) + return -errno; +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->signaled = arg.signaled; + return 0; +@@ -2384,13 +2453,9 @@ + int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, + int *signaled) + { +- int +- ret; +- + if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) || + ((fenceType & fence->signaled) != fenceType)) { +- +- ret = drmFenceFlush(fd, fence, fenceType); ++ int ret = drmFenceFlush(fd, fence, fenceType); + if (ret) + return ret; + } +@@ -2410,17 +2475,19 @@ + int drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type) + { + drm_fence_arg_t arg; +- ++ + memset(&arg, 0, sizeof(arg)); ++ arg.fence_class = fence->fence_class; + arg.flags = flags; + arg.handle = fence->handle; + arg.type = emit_type; +- arg.op = drm_fence_emit; +- if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) ++ ++ if (ioctl(fd, DRM_IOCTL_FENCE_EMIT, &arg)) + return -errno; +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->signaled = arg.signaled; ++ fence->sequence = arg.sequence; + return 0; + } + +@@ -2429,7 +2496,50 @@ + * DRM_FENCE_FLAG_WAIT_LAZY + * DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS + */ ++ ++#define DRM_IOCTL_TIMEOUT_USEC 3000000UL ++ ++static unsigned long ++drmTimeDiff(struct timeval *now, struct timeval *then) ++{ ++ uint64_t val; ++ ++ val = now->tv_sec - then->tv_sec; ++ val *= 1000000LL; ++ val += now->tv_usec; ++ val -= then->tv_usec; ++ ++ return (unsigned long) val; ++} ++ ++static int ++drmIoctlTimeout(int fd, unsigned long request, void *argp) ++{ ++ int haveThen = 0; ++ struct timeval then, now; ++ int ret; ++ ++ do { ++ ret = ioctl(fd, request, argp); ++ if (ret != 0 && errno == EAGAIN) { ++ if (!haveThen) { ++ gettimeofday(&then, NULL); ++ haveThen = 1; ++ } ++ gettimeofday(&now, NULL); ++ } ++ } while (ret != 0 && errno == EAGAIN && ++ drmTimeDiff(&now, &then) < DRM_IOCTL_TIMEOUT_USEC); ++ ++ if (ret != 0) ++ return ((errno == EAGAIN) ? -EBUSY : -errno); ++ ++ return 0; ++} + ++ ++ ++ + int drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type) + { + drm_fence_arg_t arg; +@@ -2449,160 +2559,19 @@ + arg.handle = fence->handle; + arg.type = flush_type; + arg.flags = flags; +- arg.op = drm_fence_wait; +- do { +- ret = ioctl(fd, DRM_IOCTL_FENCE, &arg); +- } while (ret != 0 && errno == EAGAIN); + ++ ++ ret = drmIoctlTimeout(fd, DRM_IOCTL_FENCE_WAIT, &arg); + if (ret) +- return -errno; ++ return ret; + +- fence->class = arg.class; ++ fence->fence_class = arg.fence_class; + fence->type = arg.type; + fence->signaled = arg.signaled; +- return 0; ++ return arg.error; + } + +-static int drmAdjustListNodes(drmBOList *list) +-{ +- drmBONode *node; +- drmMMListHead *l; +- int ret = 0; +- +- while(list->numCurrent < list->numTarget) { +- node = (drmBONode *) malloc(sizeof(*node)); +- if (!node) { +- ret = -ENOMEM; +- break; +- } +- list->numCurrent++; +- DRMLISTADD(&node->head, &list->free); +- } +- +- while(list->numCurrent > list->numTarget) { +- l = list->free.next; +- if (l == &list->free) +- break; +- DRMLISTDEL(l); +- node = DRMLISTENTRY(drmBONode, l, head); +- free(node); +- list->numCurrent--; +- } +- return ret; +-} +- +-void drmBOFreeList(drmBOList *list) +-{ +- drmBONode *node; +- drmMMListHead *l; +- +- l = list->list.next; +- while(l != &list->list) { +- DRMLISTDEL(l); +- node = DRMLISTENTRY(drmBONode, l, head); +- free(node); +- l = list->free.next; +- list->numCurrent--; +- list->numOnList--; +- } +- +- l = list->free.next; +- while(l != &list->free) { +- DRMLISTDEL(l); +- node = DRMLISTENTRY(drmBONode, l, head); +- free(node); +- l = list->free.next; +- list->numCurrent--; +- } +-} +- +-int drmBOResetList(drmBOList *list) { +- +- drmMMListHead *l; +- int ret; +- +- ret = drmAdjustListNodes(list); +- if (ret) +- return ret; +- +- l = list->list.next; +- while(l != &list->list) { +- DRMLISTDEL(l); +- DRMLISTADD(l, &list->free); +- list->numOnList--; +- l = list->list.next; +- } +- return drmAdjustListNodes(list); +-} +- +-static drmBONode *drmAddListItem(drmBOList *list, drmBO *item, +- unsigned long arg0, +- unsigned long arg1) +-{ +- drmBONode *node; +- drmMMListHead *l; +- +- l = list->free.next; +- if (l == &list->free) { +- node = (drmBONode *) malloc(sizeof(*node)); +- if (!node) { +- return NULL; +- } +- list->numCurrent++; +- } else { +- DRMLISTDEL(l); +- node = DRMLISTENTRY(drmBONode, l, head); +- } +- node->buf = item; +- node->arg0 = arg0; +- node->arg1 = arg1; +- DRMLISTADD(&node->head, &list->list); +- list->numOnList++; +- return node; +-} +- +-void *drmBOListIterator(drmBOList *list) +-{ +- void *ret = list->list.next; +- +- if (ret == &list->list) +- return NULL; +- return ret; +-} +- +-void *drmBOListNext(drmBOList *list, void *iterator) +-{ +- void *ret; +- +- drmMMListHead *l = (drmMMListHead *) iterator; +- ret = l->next; +- if (ret == &list->list) +- return NULL; +- return ret; +-} +- +-drmBO *drmBOListBuf(void *iterator) +-{ +- drmBONode *node; +- drmMMListHead *l = (drmMMListHead *) iterator; +- node = DRMLISTENTRY(drmBONode, l, head); +- +- return node->buf; +-} +- +- +-int drmBOCreateList(int numTarget, drmBOList *list) +-{ +- DRMINITLISTHEAD(&list->list); +- DRMINITLISTHEAD(&list->free); +- list->numTarget = numTarget; +- list->numCurrent = 0; +- list->numOnList = 0; +- return drmAdjustListNodes(list); +-} +- +-static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, +- drmBO *buf) ++static void drmBOCopyReply(const struct drm_bo_info_rep *rep, drmBO *buf) + { + buf->handle = rep->handle; + buf->flags = rep->flags; +@@ -2614,18 +2583,21 @@ + buf->fenceFlags = rep->fence_flags; + buf->replyFlags = rep->rep_flags; + buf->pageAlignment = rep->page_alignment; ++ buf->tileInfo = rep->tile_info; ++ buf->hwTileStride = rep->hw_tile_stride; ++ buf->desiredTileStride = rep->desired_tile_stride; + } +- +- + +-int drmBOCreate(int fd, unsigned long start, unsigned long size, +- unsigned pageAlignment, void *user_buffer, drm_bo_type_t type, +- unsigned mask, ++ ++ ++int drmBOCreate(int fd, unsigned long size, ++ unsigned pageAlignment, void *user_buffer, ++ uint64_t mask, + unsigned hint, drmBO *buf) + { +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ struct drm_bo_create_arg arg; ++ struct drm_bo_create_req *req = &arg.d.req; ++ struct drm_bo_info_rep *rep = &arg.d.rep; + int ret; + + memset(buf, 0, sizeof(*buf)); +@@ -2633,99 +2605,35 @@ + req->mask = mask; + req->hint = hint; + req->size = size; +- req->type = type; + req->page_alignment = pageAlignment; ++ req->buffer_start = (unsigned long) user_buffer; + + buf->virtual = NULL; + +- switch(type) { +- case drm_bo_type_dc: +- req->buffer_start = start; +- break; +- case drm_bo_type_user: +- req->buffer_start = (unsigned long) user_buffer; +- buf->virtual = user_buffer; +- break; +- case drm_bo_type_fake: +- req->buffer_start = start; +- break; +- default: +- return -EINVAL; +- } +- req->op = drm_bo_create; +- +- do { +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +- } while (ret != 0 && errno == EAGAIN); +- ++ ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_CREATE, &arg); + if (ret) +- return -errno; +- if (!arg.handled) { +- return -EFAULT; +- } +- if (rep->ret) { +- fprintf(stderr, "Error %d\n", rep->ret); +- return rep->ret; +- } +- ++ return ret; ++ + drmBOCopyReply(rep, buf); +- buf->mapVirtual = NULL; ++ buf->virtual = user_buffer; + buf->mapCount = 0; + + return 0; + } + +-int drmBODestroy(int fd, drmBO *buf) +-{ +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; +- +- if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) { +- (void) drmUnmap(buf->mapVirtual, buf->start + buf->size); +- buf->mapVirtual = NULL; +- buf->virtual = NULL; +- } +- +- memset(&arg, 0, sizeof(arg)); +- req->handle = buf->handle; +- req->op = drm_bo_destroy; +- +- if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) +- return -errno; +- if (!arg.handled) { +- return -EFAULT; +- } +- if (rep->ret) { +- return rep->ret; +- } +- +- buf->handle = 0; +- return 0; +-} +- + int drmBOReference(int fd, unsigned handle, drmBO *buf) + { +- +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ struct drm_bo_reference_info_arg arg; ++ struct drm_bo_handle_arg *req = &arg.d.req; ++ struct drm_bo_info_rep *rep = &arg.d.rep; + + memset(&arg, 0, sizeof(arg)); + req->handle = handle; +- req->op = drm_bo_reference; + +- if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) ++ if (ioctl(fd, DRM_IOCTL_BO_REFERENCE, &arg)) + return -errno; +- if (!arg.handled) { +- return -EFAULT; +- } +- if (rep->ret) { +- return rep->ret; +- } + + drmBOCopyReply(rep, buf); +- buf->type = drm_bo_type_dc; + buf->mapVirtual = NULL; + buf->mapCount = 0; + buf->virtual = NULL; +@@ -2733,36 +2641,27 @@ + return 0; + } + +-int drmBOUnReference(int fd, drmBO *buf) ++int drmBOUnreference(int fd, drmBO *buf) + { +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; +- ++ struct drm_bo_handle_arg arg; + +- if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) { ++ if (buf->mapVirtual && buf->mapHandle) { + (void) munmap(buf->mapVirtual, buf->start + buf->size); + buf->mapVirtual = NULL; + buf->virtual = NULL; + } + + memset(&arg, 0, sizeof(arg)); +- req->handle = buf->handle; +- req->op = drm_bo_unreference; ++ arg.handle = buf->handle; + +- if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) ++ if (ioctl(fd, DRM_IOCTL_BO_UNREFERENCE, &arg)) + return -errno; +- if (!arg.handled) { +- return -EFAULT; +- } +- if (rep->ret) { +- return rep->ret; +- } + + buf->handle = 0; + return 0; + } + ++ + /* + * Flags can be DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together + * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the +@@ -2772,17 +2671,16 @@ + int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint, + void **address) + { +- +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ struct drm_bo_map_wait_idle_arg arg; ++ struct drm_bo_info_req *req = &arg.d.req; ++ struct drm_bo_info_rep *rep = &arg.d.rep; + int ret = 0; + + /* + * Make sure we have a virtual address of the buffer. + */ + +- if (!buf->virtual && buf->type != drm_bo_type_fake) { ++ if (!buf->virtual) { + drmAddress virtual; + virtual = mmap(0, buf->size + buf->start, + PROT_READ | PROT_WRITE, MAP_SHARED, +@@ -2800,23 +2698,15 @@ + req->handle = buf->handle; + req->mask = mapFlags; + req->hint = mapHint; +- req->op = drm_bo_map; + + /* + * May hang if the buffer object is busy. + * This IOCTL synchronizes the buffer. + */ + +- do { +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +- } while (ret != 0 && errno == EAGAIN); +- +- if (ret) ++ ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_MAP, &arg); ++ if (ret) + return ret; +- if (!arg.handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; + + drmBOCopyReply(rep, buf); + buf->mapFlags = mapFlags; +@@ -2826,130 +2716,85 @@ + return 0; + } + ++ + int drmBOUnmap(int fd, drmBO *buf) + { +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ struct drm_bo_handle_arg arg; + +- + memset(&arg, 0, sizeof(arg)); +- req->handle = buf->handle; +- req->op = drm_bo_unmap; ++ arg.handle = buf->handle; + +- if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) { ++ if (ioctl(fd, DRM_IOCTL_BO_UNMAP, &arg)) { + return -errno; + } +- if (!arg.handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; +- ++ buf->mapCount--; + return 0; + } +- +-int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask, +- unsigned hint) ++ ++int drmBOSetStatus(int fd, drmBO *buf, ++ uint64_t flags, uint64_t mask, ++ unsigned int hint, ++ unsigned int desired_tile_stride, ++ unsigned int tile_info) + { +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ ++ struct drm_bo_map_wait_idle_arg arg; ++ struct drm_bo_info_req *req = &arg.d.req; ++ struct drm_bo_info_rep *rep = &arg.d.rep; + int ret = 0; + + memset(&arg, 0, sizeof(arg)); ++ req->mask = mask; ++ req->flags = flags; + req->handle = buf->handle; +- req->mask = flags; + req->hint = hint; +- req->arg_handle = mask; /* Encode mask in the arg_handle field :/ */ +- req->op = drm_bo_validate; +- +- do{ +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +- } while (ret && errno == EAGAIN); ++ req->desired_tile_stride = desired_tile_stride; ++ req->tile_info = tile_info; + ++ ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_SETSTATUS, &arg); + if (ret) +- return ret; +- if (!arg.handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; ++ return ret; + + drmBOCopyReply(rep, buf); + return 0; + } + + +-int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle) +-{ +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; +- int ret = 0; +- +- memset(&arg, 0, sizeof(arg)); +- req->handle = buf->handle; +- req->mask = flags; +- req->arg_handle = fenceHandle; +- req->op = drm_bo_validate; +- +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +- +- if (ret) +- return ret; +- if (!arg.handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; +- return 0; +-} +- + int drmBOInfo(int fd, drmBO *buf) + { +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ struct drm_bo_reference_info_arg arg; ++ struct drm_bo_handle_arg *req = &arg.d.req; ++ struct drm_bo_info_rep *rep = &arg.d.rep; + int ret = 0; + + memset(&arg, 0, sizeof(arg)); + req->handle = buf->handle; +- req->op = drm_bo_info; + +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +- ++ ret = ioctl(fd, DRM_IOCTL_BO_INFO, &arg); + if (ret) +- return ret; +- if (!arg.handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; ++ return -errno; ++ + drmBOCopyReply(rep, buf); + return 0; + } + + int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint) + { +- drm_bo_arg_t arg; +- drm_bo_arg_request_t *req = &arg.d.req; +- drm_bo_arg_reply_t *rep = &arg.d.rep; ++ struct drm_bo_map_wait_idle_arg arg; ++ struct drm_bo_info_req *req = &arg.d.req; ++ struct drm_bo_info_rep *rep = &arg.d.rep; + int ret = 0; + + if ((buf->flags & DRM_BO_FLAG_SHAREABLE) || + (buf->replyFlags & DRM_BO_REP_BUSY)) { + memset(&arg, 0, sizeof(arg)); + req->handle = buf->handle; +- req->op = drm_bo_wait_idle; + req->hint = hint; + +- do { +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +- } while (ret && errno == EAGAIN); +- ++ ret = drmIoctlTimeout(fd, DRM_IOCTL_BO_WAIT_IDLE, &arg); + if (ret) + return ret; +- if (!arg.handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; ++ + drmBOCopyReply(rep, buf); + } + return 0; +@@ -2961,7 +2806,8 @@ + !(buf->replyFlags & DRM_BO_REP_BUSY)) { + *busy = 0; + return 0; +- } else { ++ } ++ else { + int ret = drmBOInfo(fd, buf); + if (ret) + return ret; +@@ -2970,257 +2816,95 @@ + } + } + +- +-int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags, +- unsigned mask, +- int *newItem) +-{ +- drmBONode *node, *cur; +- drmMMListHead *l; +- +- *newItem = 0; +- cur = NULL; +- +- for (l = list->list.next; l != &list->list; l = l->next) { +- node = DRMLISTENTRY(drmBONode, l, head); +- if (node->buf == buf) { +- cur = node; +- break; +- } +- } +- if (!cur) { +- cur = drmAddListItem(list, buf, flags, mask); +- if (!cur) { +- drmMsg("Out of memory creating validate list node.\n"); +- return -ENOMEM; +- } +- *newItem = 1; +- cur->arg0 = flags; +- cur->arg1 = mask; +- } else { +- unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM; +- unsigned memFlags = cur->arg0 & flags & memMask; +- +- if (!memFlags) { +- drmMsg("Incompatible memory location requests " +- "on validate list.\n"); +- drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n", +- cur->arg0, cur->arg1); +- drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n", +- flags, mask); +- return -EINVAL; +- } +- if (mask & cur->arg1 & ~DRM_BO_MASK_MEM & (cur->arg0 ^ flags)) { +- drmMsg("Incompatible buffer flag requests " +- "on validate list.\n"); +- drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n", +- cur->arg0, cur->arg1); +- drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n", +- flags, mask); +- return -EINVAL; +- } +- cur->arg1 |= mask; +- cur->arg0 = memFlags | ((cur->arg0 | flags) & +- cur->arg1 & ~DRM_BO_MASK_MEM); +- } +- return 0; +-} +- +- +-int drmBOValidateList(int fd, drmBOList *list) +-{ +- +- drmBONode *node; +- drmMMListHead *l; +- drm_bo_arg_t *arg, *first; +- drm_bo_arg_request_t *req; +- drm_bo_arg_reply_t *rep; +- drm_u64_t *prevNext = NULL; +- drmBO *buf; +- int ret; +- +- first = NULL; +- +- for (l = list->list.next; l != &list->list; l = l->next) { +- node = DRMLISTENTRY(drmBONode, l, head); +- +- arg = &node->bo_arg; +- req = &arg->d.req; +- +- if (!first) +- first = arg; +- +- if (prevNext) +- *prevNext = (unsigned long) arg; +- +- memset(arg, 0, sizeof(*arg)); +- prevNext = &arg->next; +- req->handle = node->buf->handle; +- req->op = drm_bo_validate; +- req->mask = node->arg0; +- req->hint = 0; +- req->arg_handle = node->arg1; +- } +- +- if (!first) +- return 0; +- +- do{ +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first); +- } while (ret && errno == EAGAIN); +- +- +- if (ret) +- return -errno; +- +- for (l = list->list.next; l != &list->list; l = l->next) { +- node = DRMLISTENTRY(drmBONode, l, head); +- arg = &node->bo_arg; +- rep = &arg->d.rep; +- +- if (!arg->handled) { +- drmMsg("Unhandled request\n"); +- return -EFAULT; +- } +- if (rep->ret) +- return rep->ret; +- +- buf = node->buf; +- drmBOCopyReply(rep, buf); +- } +- +- return 0; +-} +- +- +-int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle) +-{ +- +- drmBONode *node; +- drmMMListHead *l; +- drm_bo_arg_t *arg, *first; +- drm_bo_arg_request_t *req; +- drm_bo_arg_reply_t *rep; +- drm_u64_t *prevNext = NULL; +- drmBO *buf; +- unsigned fence_flags; +- int ret; +- +- first = NULL; +- +- for (l = list->list.next; l != &list->list; l = l->next) { +- node = DRMLISTENTRY(drmBONode, l, head); +- +- arg = &node->bo_arg; +- req = &arg->d.req; +- +- if (!first) +- first = arg; +- +- if (prevNext) +- *prevNext = (unsigned long) arg; +- +- memset(arg, 0, sizeof(*arg)); +- prevNext = &arg->next; +- req->handle = node->buf->handle; +- req->op = drm_bo_fence; +- req->mask = node->arg0; +- req->arg_handle = fenceHandle; +- } +- +- if (!first) +- return 0; +- +- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first); +- +- if (ret) +- return -errno; +- +- for (l = list->list.next; l != &list->list; l = l->next) { +- node = DRMLISTENTRY(drmBONode, l, head); +- +- arg = &node->bo_arg; +- rep = &arg->d.rep; +- +- if (!arg->handled) +- return -EFAULT; +- if (rep->ret) +- return rep->ret; +- drmBOCopyReply(rep, node->buf); +- } +- +- return 0; +-} +- + int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize, + unsigned memType) + { +- drm_mm_init_arg_t arg; +- ++ struct drm_mm_init_arg arg; ++ + memset(&arg, 0, sizeof(arg)); +- arg.req.op = mm_init; +- arg.req.p_offset = pOffset; +- arg.req.p_size = pSize; +- arg.req.mem_type = memType; ++ ++ arg.magic = DRM_BO_INIT_MAGIC; ++ arg.major = DRM_BO_INIT_MAJOR; ++ arg.minor = DRM_BO_INIT_MINOR; ++ arg.p_offset = pOffset; ++ arg.p_size = pSize; ++ arg.mem_type = memType; + + if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg)) + return -errno; +- + return 0; + } + + int drmMMTakedown(int fd, unsigned memType) + { +- drm_mm_init_arg_t arg; +- ++ struct drm_mm_type_arg arg; + + memset(&arg, 0, sizeof(arg)); +- arg.req.op = mm_takedown; +- arg.req.mem_type = memType; ++ arg.mem_type = memType; + +- if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg)) ++ if (ioctl(fd, DRM_IOCTL_MM_TAKEDOWN, &arg)) + return -errno; +- + return 0; + } + +-int drmMMLock(int fd, unsigned memType) ++/* ++ * If this function returns an error, and lockBM was set to 1, ++ * the buffer manager is NOT locked. ++ */ ++ ++int drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict) + { +- drm_mm_init_arg_t arg; +- int ret; ++ struct drm_mm_type_arg arg; + + memset(&arg, 0, sizeof(arg)); +- arg.req.op = mm_lock; +- arg.req.mem_type = memType; ++ arg.mem_type = memType; ++ arg.lock_flags |= (lockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0; ++ arg.lock_flags |= (ignoreNoEvict) ? DRM_BO_LOCK_IGNORE_NO_EVICT : 0; + +- do{ +- ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg); +- } while (ret && errno == EAGAIN); ++ return drmIoctlTimeout(fd, DRM_IOCTL_MM_LOCK, &arg); ++} ++ ++int drmMMUnlock(int fd, unsigned memType, int unlockBM) ++{ ++ struct drm_mm_type_arg arg; ++ ++ memset(&arg, 0, sizeof(arg)); + +- return ret; ++ arg.mem_type = memType; ++ arg.lock_flags |= (unlockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0; ++ ++ return drmIoctlTimeout(fd, DRM_IOCTL_MM_UNLOCK, &arg); + } + +-int drmMMUnlock(int fd, unsigned memType) ++int drmBOVersion(int fd, unsigned int *major, ++ unsigned int *minor, ++ unsigned int *patchlevel) + { +- drm_mm_init_arg_t arg; ++ struct drm_bo_version_arg arg; + int ret; + + memset(&arg, 0, sizeof(arg)); +- arg.req.op = mm_unlock; +- arg.req.mem_type = memType; ++ ret = ioctl(fd, DRM_IOCTL_BO_VERSION, &arg); ++ if (ret) ++ return -errno; + +- do{ +- ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg); +- } while (ret && errno == EAGAIN); +- +- return ret; ++ if (major) ++ *major = arg.major; ++ if (minor) ++ *minor = arg.minor; ++ if (patchlevel) ++ *patchlevel = arg.patchlevel; ++ ++ return 0; + } + ++ ++ + #define DRM_MAX_FDS 16 + static struct { +- char *BusID; +- int fd; +- int refcount; ++ char *BusID; ++ int fd; ++ int refcount; + } connection[DRM_M