summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChí-Thanh Christopher Nguyễn <chithanh@gentoo.org>2009-02-28 23:45:54 +0000
committerChí-Thanh Christopher Nguyễn <chithanh@gentoo.org>2009-02-28 23:45:54 +0000
commit8cc6bb3ee19f61da6aae78f7c94bf1564f8ce01e (patch)
tree41afa44d81338341b159546ee16b05c672247dcf /x11-libs/libdrm_nouveau
parentgames-fps/bloodfrontier: Updated to -r1, improved the ebuild (diff)
downloadsunrise-8cc6bb3ee19f61da6aae78f7c94bf1564f8ce01e.tar.gz
sunrise-8cc6bb3ee19f61da6aae78f7c94bf1564f8ce01e.tar.bz2
sunrise-8cc6bb3ee19f61da6aae78f7c94bf1564f8ce01e.zip
x11-libs/libdrm_nouveau: new ebuild for bug 253705
svn path=/sunrise/; revision=7975
Diffstat (limited to 'x11-libs/libdrm_nouveau')
-rw-r--r--x11-libs/libdrm_nouveau/ChangeLog9
-rw-r--r--x11-libs/libdrm_nouveau/Manifest5
-rw-r--r--x11-libs/libdrm_nouveau/files/libdrm-2.4.5-nouveau.patch379
-rw-r--r--x11-libs/libdrm_nouveau/libdrm_nouveau-2.4.5.ebuild47
-rw-r--r--x11-libs/libdrm_nouveau/metadata.xml5
5 files changed, 445 insertions, 0 deletions
diff --git a/x11-libs/libdrm_nouveau/ChangeLog b/x11-libs/libdrm_nouveau/ChangeLog
new file mode 100644
index 000000000..08b7a2b69
--- /dev/null
+++ b/x11-libs/libdrm_nouveau/ChangeLog
@@ -0,0 +1,9 @@
+# ChangeLog for x11-libs/libdrm_nouveau
+# Copyright 1999-2009 Gentoo Foundation; Distributed under the GPL v2
+# $Header: $
+
+ 28 Feb 2009; Chi-Thanh Christopher Nguyen (chithead)
+ <chithanh@cs.tu-berlin.de> +libdrm_nouveau-2.4.5.ebuild,
+ +files/libdrm-2.4.5-nouveau.patch, +metadata.xml:
+ new ebuild for bug 253705
+
diff --git a/x11-libs/libdrm_nouveau/Manifest b/x11-libs/libdrm_nouveau/Manifest
new file mode 100644
index 000000000..79767e343
--- /dev/null
+++ b/x11-libs/libdrm_nouveau/Manifest
@@ -0,0 +1,5 @@
+AUX libdrm-2.4.5-nouveau.patch 11195 RMD160 efc11ec89378a734d0fe8d46135c1b0bb16b32ac SHA1 91b1bcbd006c6e512be7ba7f1aa555070e1728c1 SHA256 d349fb017f89439a7d7358efbc877d1849fbb1966e1af321082ed1deb376fb01
+DIST libdrm-2.4.5.tar.gz 563395 RMD160 11a512368c32fb6ed3fa17d7d728e244d61547db SHA1 9e919c4cda6454118ebd288edc3bc65fc6779a51 SHA256 4ada5afa0ac774b9affce9762e703d0a98bfcb3537a5230ef12955b0068259d1
+EBUILD libdrm_nouveau-2.4.5.ebuild 1333 RMD160 a7566439c30a97e2f604f21e33ff3f435fa07715 SHA1 9602735b753e253b4c0d8715d8283350a0d7b541 SHA256 ee1319eb4670346ea9bfa1652194d889c8b977cfa412cb2de86e9bd919fc5876
+MISC ChangeLog 319 RMD160 7ee36d5aeff4bf333772db83c9331ffdc5acc975 SHA1 bc00978e46cc8d683b322cb576ee163052e4ec0d SHA256 ebad56cb90dc306bc059df15d25e1f93ae0e80109d2b1e1f12804cb37b5e1ca6
+MISC metadata.xml 170 RMD160 645927a396fdc21cdeb089fe42c5397332420ea6 SHA1 ac7f48a14fec325926f9ce1be8fbf1f311b4f2e4 SHA256 d797a2ec6f9dc516c9f9c1a758ee87ad3e8c43101b5dc76c2f872d5bd4639b42
diff --git a/x11-libs/libdrm_nouveau/files/libdrm-2.4.5-nouveau.patch b/x11-libs/libdrm_nouveau/files/libdrm-2.4.5-nouveau.patch
new file mode 100644
index 000000000..4803e1088
--- /dev/null
+++ b/x11-libs/libdrm_nouveau/files/libdrm-2.4.5-nouveau.patch
@@ -0,0 +1,379 @@
+diff -urN a/libdrm/nouveau/Makefile.am b/libdrm/nouveau/Makefile.am
+--- a/libdrm/nouveau/Makefile.am 2009-02-11 01:09:35.000000000 +0100
++++ b/libdrm/nouveau/Makefile.am 2009-02-25 11:41:25.074352257 +0100
+@@ -19,7 +19,9 @@
+ nouveau_bo.c \
+ nouveau_resource.c \
+ nouveau_dma.c \
+- nouveau_fence.c
++ nouveau_fence.c \
++ nouveau_dma.h \
++ nouveau_private.h
+
+ libdrm_nouveaucommonincludedir = ${includedir}/nouveau
+ libdrm_nouveaucommoninclude_HEADERS = \
+diff -urN a/libdrm/nouveau/nouveau_dma.h b/libdrm/nouveau/nouveau_dma.h
+--- a/libdrm/nouveau/nouveau_dma.h 1970-01-01 01:00:00.000000000 +0100
++++ b/libdrm/nouveau/nouveau_dma.h 2009-02-25 11:49:50.000000000 +0100
+@@ -0,0 +1,154 @@
++/*
++ * 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_DMA_H__
++#define __NOUVEAU_DMA_H__
++
++#include <string.h>
++#include "nouveau_private.h"
++
++//#define NOUVEAU_DMA_DEBUG
++//#define NOUVEAU_DMA_TRACE
++//#define NOUVEAU_DMA_DUMP_POSTRELOC_PUSHBUF
++#if defined(__amd64__)
++#define NOUVEAU_DMA_BARRIER asm volatile("lock; addl $0,0(%%rsp)" ::: "memory")
++#elif defined(__i386__)
++#define NOUVEAU_DMA_BARRIER asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
++#else
++#define NOUVEAU_DMA_BARRIER
++#endif
++#define NOUVEAU_DMA_TIMEOUT 2000
++#define NOUVEAU_TIME_MSEC() 0
++#define RING_SKIPS 8
++
++extern int nouveau_dma_wait(struct nouveau_channel *chan, unsigned size);
++extern void nouveau_dma_subc_bind(struct nouveau_grobj *);
++extern void nouveau_dma_channel_init(struct nouveau_channel *);
++extern void nouveau_dma_kickoff(struct nouveau_channel *);
++
++#ifdef NOUVEAU_DMA_DEBUG
++static char faulty[1024];
++#endif
++
++static inline void
++nouveau_dma_out(struct nouveau_channel *chan, uint32_t data)
++{
++ struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
++ struct nouveau_dma_priv *dma = nvchan->dma;
++
++#ifdef NOUVEAU_DMA_DEBUG
++ if (dma->push_free == 0) {
++ printf("No space left in packet at %s\n", faulty);
++ return;
++ }
++ dma->push_free--;
++#endif
++#ifdef NOUVEAU_DMA_TRACE
++ {
++ uint32_t offset = (dma->cur << 2) + dma->base;
++ printf("\tOUT_RING %d/0x%08x -> 0x%08x\n",
++ nvchan->drm.channel, offset, data);
++ }
++#endif
++ nvchan->pushbuf[dma->cur + (dma->base - nvchan->drm.put_base)/4] = data;
++ dma->cur++;
++}
++
++static inline void
++nouveau_dma_outp(struct nouveau_channel *chan, uint32_t *ptr, int size)
++{
++ struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
++ struct nouveau_dma_priv *dma = nvchan->dma;
++ (void)dma;
++
++#ifdef NOUVEAU_DMA_DEBUG
++ if (dma->push_free < size) {
++ printf("Packet too small. Free=%d, Need=%d\n",
++ dma->push_free, size);
++ return;
++ }
++#endif
++#ifdef NOUVEAU_DMA_TRACE
++ while (size--) {
++ nouveau_dma_out(chan, *ptr);
++ ptr++;
++ }
++#else
++ memcpy(&nvchan->pushbuf[dma->cur], ptr, size << 2);
++#ifdef NOUVEAU_DMA_DEBUG
++ dma->push_free -= size;
++#endif
++ dma->cur += size;
++#endif
++}
++
++static inline void
++nouveau_dma_space(struct nouveau_channel *chan, unsigned size)
++{
++ struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
++ struct nouveau_dma_priv *dma = nvchan->dma;
++
++ if (dma->free < size) {
++ if (nouveau_dma_wait(chan, size) && chan->hang_notify)
++ chan->hang_notify(chan);
++ }
++ dma->free -= size;
++#ifdef NOUVEAU_DMA_DEBUG
++ dma->push_free = size;
++#endif
++}
++
++static inline void
++nouveau_dma_begin(struct nouveau_channel *chan, struct nouveau_grobj *grobj,
++ int method, int size, const char* file, int line)
++{
++ struct nouveau_channel_priv *nvchan = nouveau_channel(chan);
++ struct nouveau_dma_priv *dma = nvchan->dma;
++ (void)dma;
++
++#ifdef NOUVEAU_DMA_TRACE
++ printf("BEGIN_RING %d/%08x/%d/0x%04x/%d\n", nvchan->drm.channel,
++ grobj->handle, grobj->subc, method, size);
++#endif
++
++#ifdef NOUVEAU_DMA_DEBUG
++ if (dma->push_free) {
++ printf("Previous packet incomplete: %d left at %s\n",
++ dma->push_free, faulty);
++ return;
++ }
++ sprintf(faulty,"%s:%d",file,line);
++#endif
++
++ nouveau_dma_space(chan, (size + 1));
++ nouveau_dma_out(chan, (size << 18) | (grobj->subc << 13) | method);
++}
++
++#define RING_SPACE_CH(ch,sz) nouveau_dma_space((ch), (sz))
++#define BEGIN_RING_CH(ch,gr,m,sz) nouveau_dma_begin((ch), (gr), (m), (sz), __FUNCTION__, __LINE__ )
++#define OUT_RING_CH(ch, data) nouveau_dma_out((ch), (data))
++#define OUT_RINGp_CH(ch,ptr,dwords) nouveau_dma_outp((ch), (void*)(ptr), \
++ (dwords))
++#define FIRE_RING_CH(ch) nouveau_dma_kickoff((ch))
++#define WAIT_RING_CH(ch,sz) nouveau_dma_wait((ch), (sz))
++
++#endif
+diff -urN a/libdrm/nouveau/nouveau_private.h b/libdrm/nouveau/nouveau_private.h
+--- a/libdrm/nouveau/nouveau_private.h 1970-01-01 01:00:00.000000000 +0100
++++ b/libdrm/nouveau/nouveau_private.h 2009-02-25 11:50:03.000000000 +0100
+@@ -0,0 +1,203 @@
++/*
++ * 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_PRIVATE_H__
++#define __NOUVEAU_PRIVATE_H__
++
++#include <stdint.h>
++#include <xf86drm.h>
++#include <nouveau_drm.h>
++
++#include "nouveau_drmif.h"
++#include "nouveau_device.h"
++#include "nouveau_channel.h"
++#include "nouveau_grobj.h"
++#include "nouveau_notifier.h"
++#include "nouveau_bo.h"
++#include "nouveau_resource.h"
++#include "nouveau_pushbuf.h"
++
++#define NOUVEAU_PUSHBUF_MAX_BUFFERS 1024
++#define NOUVEAU_PUSHBUF_MAX_RELOCS 1024
++struct nouveau_pushbuf_priv {
++ struct nouveau_pushbuf base;
++
++ int use_cal;
++ struct nouveau_bo *buffer;
++
++ unsigned *pushbuf;
++ unsigned size;
++
++ struct drm_nouveau_gem_pushbuf_bo *buffers;
++ unsigned nr_buffers;
++ struct drm_nouveau_gem_pushbuf_reloc *relocs;
++ unsigned nr_relocs;
++
++ /*XXX: nomm */
++ struct nouveau_fence *fence;
++};
++#define nouveau_pushbuf(n) ((struct nouveau_pushbuf_priv *)(n))
++
++#define pbbo_to_ptr(o) ((uint64_t)(unsigned long)(o))
++#define ptr_to_pbbo(h) ((struct nouveau_pushbuf_bo *)(unsigned long)(h))
++#define pbrel_to_ptr(o) ((uint64_t)(unsigned long)(o))
++#define ptr_to_pbrel(h) ((struct nouveau_pushbuf_reloc *)(unsigned long)(h))
++#define bo_to_ptr(o) ((uint64_t)(unsigned long)(o))
++#define ptr_to_bo(h) ((struct nouveau_bo_priv *)(unsigned long)(h))
++
++int
++nouveau_pushbuf_init(struct nouveau_channel *);
++
++struct nouveau_dma_priv {
++ uint32_t base;
++ uint32_t max;
++ uint32_t cur;
++ uint32_t put;
++ uint32_t free;
++
++ int push_free;
++} dma;
++
++struct nouveau_channel_priv {
++ struct nouveau_channel base;
++
++ struct drm_nouveau_channel_alloc drm;
++
++ void *notifier_block;
++
++ struct nouveau_pushbuf_priv pb;
++
++ /*XXX: nomm */
++ volatile uint32_t *user, *put, *get, *ref_cnt;
++ uint32_t *pushbuf;
++ struct nouveau_dma_priv struct_dma;
++ struct nouveau_dma_priv *dma;
++ struct nouveau_fence *fence_head;
++ struct nouveau_fence *fence_tail;
++ uint32_t fence_sequence;
++ struct nouveau_grobj *fence_grobj;
++ struct nouveau_notifier *fence_ntfy;
++};
++#define nouveau_channel(n) ((struct nouveau_channel_priv *)(n))
++
++struct nouveau_fence {
++ struct nouveau_channel *channel;
++};
++
++struct nouveau_fence_cb {
++ struct nouveau_fence_cb *next;
++ void (*func)(void *);
++ void *priv;
++};
++
++struct nouveau_fence_priv {
++ struct nouveau_fence base;
++ int refcount;
++
++ struct nouveau_fence *next;
++ struct nouveau_fence_cb *signal_cb;
++
++ uint32_t sequence;
++ int emitted;
++ int signalled;
++};
++#define nouveau_fence(n) ((struct nouveau_fence_priv *)(n))
++
++int
++nouveau_fence_new(struct nouveau_channel *, struct nouveau_fence **);
++
++int
++nouveau_fence_ref(struct nouveau_fence *, struct nouveau_fence **);
++
++int
++nouveau_fence_signal_cb(struct nouveau_fence *, void (*)(void *), void *);
++
++void
++nouveau_fence_emit(struct nouveau_fence *);
++
++int
++nouveau_fence_wait(struct nouveau_fence **);
++
++void
++nouveau_fence_flush(struct nouveau_channel *);
++
++struct nouveau_grobj_priv {
++ struct nouveau_grobj base;
++};
++#define nouveau_grobj(n) ((struct nouveau_grobj_priv *)(n))
++
++struct nouveau_notifier_priv {
++ struct nouveau_notifier base;
++
++ struct drm_nouveau_notifierobj_alloc drm;
++ volatile void *map;
++};
++#define nouveau_notifier(n) ((struct nouveau_notifier_priv *)(n))
++
++struct nouveau_bo_priv {
++ struct nouveau_bo base;
++ int refcount;
++
++ /* Buffer configuration + usage hints */
++ unsigned flags;
++ unsigned size;
++ unsigned align;
++ int user;
++
++ /* Tracking */
++ struct drm_nouveau_gem_pushbuf_bo *pending;
++ struct nouveau_channel *pending_channel;
++ int write_marker;
++
++ /* Userspace object */
++ void *sysmem;
++
++ /* Kernel object */
++ uint32_t global_handle;
++ unsigned handle;
++ void *map;
++
++ /* Last known information from kernel on buffer status */
++ int pinned;
++ uint64_t offset;
++ uint32_t domain;
++
++ /*XXX: nomm stuff */
++ struct nouveau_fence *fence;
++ struct nouveau_fence *wr_fence;
++};
++#define nouveau_bo(n) ((struct nouveau_bo_priv *)(n))
++
++int
++nouveau_bo_init(struct nouveau_device *);
++
++void
++nouveau_bo_takedown(struct nouveau_device *);
++
++struct drm_nouveau_gem_pushbuf_bo *
++nouveau_bo_emit_buffer(struct nouveau_channel *, struct nouveau_bo *);
++
++int
++nouveau_bo_validate_nomm(struct nouveau_bo_priv *, uint32_t);
++
++#include "nouveau_dma.h"
++#endif
diff --git a/x11-libs/libdrm_nouveau/libdrm_nouveau-2.4.5.ebuild b/x11-libs/libdrm_nouveau/libdrm_nouveau-2.4.5.ebuild
new file mode 100644
index 000000000..834e369e9
--- /dev/null
+++ b/x11-libs/libdrm_nouveau/libdrm_nouveau-2.4.5.ebuild
@@ -0,0 +1,47 @@
+# Copyright 1999-2009 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/x11-libs/libdrm/libdrm-2.4.4.ebuild,v 1.2 2009/02/05 13:33:40 remi Exp $
+
+EAPI="2"
+
+# Must be before x-modular eclass is inherited
+#SNAPSHOT="yes"
+
+inherit x-modular
+
+DRM_P="${P/_nouveau/}"
+
+DESCRIPTION="X.Org libdrm nouveau library"
+HOMEPAGE="http://dri.freedesktop.org/"
+SRC_URI="http://dri.freedesktop.org/libdrm/${DRM_P}.tar.gz"
+
+LICENSE="libdrm"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+RESTRICT="test" # see bug #236845
+
+RDEPEND="dev-libs/libpthread-stubs
+ !x11-libs/libdrm[video_cards_nouveau]
+ ~x11-libs/libdrm-${PV}"
+DEPEND="${RDEPEND}"
+
+S="${WORKDIR}/${DRM_P}"
+PATCHES="${FILESDIR}/${DRM_P}-nouveau.patch"
+CONFIGURE_OPTIONS="--enable-udev --enable-nouveau-experimental-api"
+
+# FIXME, we should try to see how we can fit the --enable-udev configure flag
+
+src_install() {
+ x-modular_src_install
+ # do not install files already installed by libdrm
+ find "${D}" \( -type f -o -type l \) \! -name "*nouveau*" -exec rm '{}' \;
+ rm "${D}"/usr/include/drm/nouveau_drm.h
+}
+
+pkg_postinst() {
+ x-modular_pkg_postinst
+
+ ewarn "libdrm's ABI may have changed without change in library name"
+ ewarn "Please rebuild media-libs/mesa, x11-base/xorg-server and"
+ ewarn "your video drivers in x11-drivers/*."
+}
diff --git a/x11-libs/libdrm_nouveau/metadata.xml b/x11-libs/libdrm_nouveau/metadata.xml
new file mode 100644
index 000000000..7e3286984
--- /dev/null
+++ b/x11-libs/libdrm_nouveau/metadata.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<herd>maintainer-wanted</herd>
+</pkgmetadata>