[kernel] r7622 - in dists/trunk/linux-2.6/debian: . patches/features patches/series

maximilian attems maks-guest at costa.debian.org
Tue Oct 17 12:44:11 UTC 2006


Author: maks-guest
Date: Tue Oct 17 12:44:10 2006
New Revision: 7622

Added:
   dists/trunk/linux-2.6/debian/patches/features/drm-i965.patch
Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/series/3

Log:
add drm i965 fedora backport


Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	(original)
+++ dists/trunk/linux-2.6/debian/changelog	Tue Oct 17 12:44:10 2006
@@ -108,6 +108,7 @@
   * Fix serial_cs resume handling.
   * Fix oops when removing suspended serial port.
   * Check if DLC is still attached to the TTY.
+  * Add fedora backport of i965 DRM support.
 
   [ dann frazier ]
   * [ia64]: Fix booting on HP cell systems, thanks to Troy Heber
@@ -127,7 +128,7 @@
   [ Kyle McMartin ]
   * [hppa] Force CROSS_COMPILE=hppa64-linux-gnu- (closes: #389296)
 
- -- maximilian attems <maks at sternwelten.at>  Tue, 17 Oct 2006 13:58:07 +0200
+ -- maximilian attems <maks at sternwelten.at>  Tue, 17 Oct 2006 14:29:24 +0200
 
 linux-2.6 (2.6.18-2) unstable; urgency=low
 

Added: dists/trunk/linux-2.6/debian/patches/features/drm-i965.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/drm-i965.patch	Tue Oct 17 12:44:10 2006
@@ -0,0 +1,221 @@
+
+commit 48cb9aceed782a4e9c557f30429e65f845dd777d
+Author: Alan Hourihane <alanh at tungstengraphics.com>
+Date:   Tue Aug 8 15:05:54 2006 -0700
+
+    Add drm support for Intel i965G chipsets.
+    
+    This is a patch prepared by Guangdeng Liao based off of Tungsten Graphics's
+    final code drop.
+
+    backport taken from fedora tree. -maks
+
+---
+ drivers/char/drm/drm_pciids.h |    4 	4 +	0 -	0 !
+ drivers/char/drm/i915_dma.c   |   47 	35 +	12 -	0 !
+ drivers/char/drm/i915_drm.h   |    6 	6 +	0 -	0 !
+ drivers/char/drm/i915_drv.h   |   14 	8 +	6 -	0 !
+ drivers/char/drm/i915_irq.c   |   18 	14 +	4 -	0 !
+ 5 files changed, 67 insertions(+), 22 deletions(-)
+
+Index: linux-2.6.17/drivers/char/drm/i915_dma.c
+===================================================================
+--- linux-2.6.17.orig/drivers/char/drm/i915_dma.c	2006-08-10 11:43:30.000000000 +0200
++++ linux-2.6.17/drivers/char/drm/i915_dma.c	2006-08-10 11:50:44.000000000 +0200
+@@ -31,6 +31,12 @@
+ #include "i915_drm.h"
+ #include "i915_drv.h"
+ 
++#define IS_I965G(dev)  (dev->pdev->device == 0x2972 || \
++			dev->pdev->device == 0x2982 || \
++			dev->pdev->device == 0x2992 || \
++			dev->pdev->device == 0x29A2)
++
++
+ /* Really want an OS-independent resettable timer.  Would like to have
+  * this loop run for (eg) 3 sec, but have the timer reset every time
+  * the head pointer changes, so that EBUSY only happens if the ring
+@@ -347,14 +353,15 @@ static int i915_emit_cmds(drm_device_t *
+ 	if ((dwords+1) * sizeof(int) >= dev_priv->ring.Size - 8)
+ 		return DRM_ERR(EINVAL);
+ 
+-	BEGIN_LP_RING(((dwords+1)&~1));
++	BEGIN_LP_RING((dwords+1)&~1);
+ 
+ 	for (i = 0; i < dwords;) {
+ 		int cmd, sz;
+ 
+-		if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd)))
+-			return DRM_ERR(EINVAL);
++		if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd))) {
+ 
++			return DRM_ERR(EINVAL);
++		}
+ 		if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords)
+ 			return DRM_ERR(EINVAL);
+ 
+@@ -395,24 +402,40 @@ static int i915_emit_box(drm_device_t * 
+ 		return DRM_ERR(EINVAL);
+ 	}
+ 
+-	BEGIN_LP_RING(6);
+-	OUT_RING(GFX_OP_DRAWRECT_INFO);
+-	OUT_RING(DR1);
+-	OUT_RING((box.x1 & 0xffff) | (box.y1 << 16));
+-	OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16));
+-	OUT_RING(DR4);
+-	OUT_RING(0);
+-	ADVANCE_LP_RING();
++	if (IS_I965G(dev)) {
++		BEGIN_LP_RING(4);
++		OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
++		OUT_RING((box.x1 & 0xffff) | (box.y1 << 16));
++		OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16));
++		OUT_RING(DR4);
++		ADVANCE_LP_RING();
++	} else {
++		BEGIN_LP_RING(6);
++		OUT_RING(GFX_OP_DRAWRECT_INFO);
++		OUT_RING(DR1);
++		OUT_RING((box.x1 & 0xffff) | (box.y1 << 16));
++		OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16));
++		OUT_RING(DR4);
++		OUT_RING(0);
++		ADVANCE_LP_RING();
++	}
+ 
+ 	return 0;
+ }
+ 
++/* XXX: Emitting the counter should really be moved to part of the IRQ
++ * emit.  For now, do it in both places:
++ */
++
+ static void i915_emit_breadcrumb(drm_device_t *dev)
+ {
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+ 	RING_LOCALS;
+ 
+-	dev_priv->sarea_priv->last_enqueue = dev_priv->counter++;
++	dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
++
++	if (dev_priv->counter > 0x7FFFFFFFUL)
++		dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
+ 
+ 	BEGIN_LP_RING(4);
+ 	OUT_RING(CMD_STORE_DWORD_IDX);
+Index: linux-2.6.17/drivers/char/drm/i915_drm.h
+===================================================================
+--- linux-2.6.17.orig/drivers/char/drm/i915_drm.h	2006-08-10 11:43:30.000000000 +0200
++++ linux-2.6.17/drivers/char/drm/i915_drm.h	2006-08-10 11:46:31.000000000 +0200
+@@ -98,6 +98,12 @@ typedef struct _drm_i915_sarea {
+ 	int rotated_size;
+ 	int rotated_pitch;
+ 	int virtualX, virtualY;
++
++	unsigned int front_tiled;
++	unsigned int back_tiled;
++	unsigned int depth_tiled;
++	unsigned int rotated_tiled;
++	unsigned int rotated2_tiled;
+ } drm_i915_sarea_t;
+ 
+ /* Flags for perf_boxes
+Index: linux-2.6.17/drivers/char/drm/i915_drv.h
+===================================================================
+--- linux-2.6.17.orig/drivers/char/drm/i915_drv.h	2006-08-10 11:43:30.000000000 +0200
++++ linux-2.6.17/drivers/char/drm/i915_drv.h	2006-08-10 11:50:44.000000000 +0200
+@@ -137,14 +137,14 @@ extern void i915_mem_release(drm_device_
+ #define I915_VERBOSE 0
+ 
+ #define RING_LOCALS	unsigned int outring, ringmask, outcount; \
+-                        volatile char *virt;
++			volatile char *virt;
+ 
+ #define BEGIN_LP_RING(n) do {				\
+ 	if (I915_VERBOSE)				\
+ 		DRM_DEBUG("BEGIN_LP_RING(%d) in %s\n",	\
+-			  n, __FUNCTION__);		\
+-	if (dev_priv->ring.space < n*4)			\
+-		i915_wait_ring(dev, n*4, __FUNCTION__);		\
++			(n), __FUNCTION__);           \
++	if (dev_priv->ring.space < (n)*4)                      \
++		i915_wait_ring(dev, (n)*4, __FUNCTION__);      \
+ 	outcount = 0;					\
+ 	outring = dev_priv->ring.tail;			\
+ 	ringmask = dev_priv->ring.tail_mask;		\
+@@ -153,8 +153,8 @@ extern void i915_mem_release(drm_device_
+ 
+ #define OUT_RING(n) do {					\
+ 	if (I915_VERBOSE) DRM_DEBUG("   OUT_RING %x\n", (int)(n));	\
+-	*(volatile unsigned int *)(virt + outring) = n;		\
+-        outcount++;						\
++	*(volatile unsigned int *)(virt + outring) = (n);		\
++	outcount++;						\
+ 	outring += 4;						\
+ 	outring &= ringmask;					\
+ } while (0)
+@@ -250,6 +250,8 @@ extern int i915_wait_ring(drm_device_t *
+ #define GFX_OP_DESTBUFFER_VARS   ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0)
+ #define GFX_OP_DRAWRECT_INFO     ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3))
+ 
++#define GFX_OP_DRAWRECT_INFO_I965  ((0x7900<<16)|0x2)
++
+ #define MI_BATCH_BUFFER 	((0x30<<23)|1)
+ #define MI_BATCH_BUFFER_START 	(0x31<<23)
+ #define MI_BATCH_BUFFER_END 	(0xA<<23)
+Index: linux-2.6.17/drivers/char/drm/i915_irq.c
+===================================================================
+--- linux-2.6.17.orig/drivers/char/drm/i915_irq.c	2006-08-10 11:43:30.000000000 +0200
++++ linux-2.6.17/drivers/char/drm/i915_irq.c	2006-08-10 11:50:54.000000000 +0200
+@@ -69,22 +69,32 @@ irqreturn_t i915_driver_irq_handler(DRM_
+ 
+ static int i915_emit_irq(drm_device_t * dev)
+ {
++
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+-	u32 ret;
+ 	RING_LOCALS;
+ 
+ 	i915_kernel_lost_context(dev);
+ 
+ 	DRM_DEBUG("%s\n", __FUNCTION__);
+ 
+-	ret = dev_priv->counter;
++	dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
++
++	if (dev_priv->counter > 0x7FFFFFFFUL)
++		 dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
+ 
+-	BEGIN_LP_RING(2);
++	BEGIN_LP_RING(6);
++	OUT_RING(CMD_STORE_DWORD_IDX);
++	OUT_RING(20);
++	OUT_RING(dev_priv->counter);
++
++	OUT_RING(0);
+ 	OUT_RING(0);
+ 	OUT_RING(GFX_OP_USER_INTERRUPT);
+ 	ADVANCE_LP_RING();
+ 
+-	return ret;
++	return dev_priv->counter;
++
++
+ }
+ 
+ static int i915_wait_irq(drm_device_t * dev, int irq_nr)
+Index: linux-2.6.17/drivers/char/drm/drm_pciids.h
+===================================================================
+--- linux-2.6.17.orig/drivers/char/drm/drm_pciids.h	2006-06-18 03:49:35.000000000 +0200
++++ linux-2.6.17/drivers/char/drm/drm_pciids.h	2006-08-10 11:48:36.000000000 +0200
+@@ -285,5 +285,9 @@
+ 	{0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+ 	{0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+ 	{0x8086, 0x27a2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++	{0x8086, 0x2972, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++	{0x8086, 0x2982, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++	{0x8086, 0x2992, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++	{0x8086, 0x29a2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+ 	{0, 0, 0}
+ 

Modified: dists/trunk/linux-2.6/debian/patches/series/3
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/3	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/3	Tue Oct 17 12:44:10 2006
@@ -26,3 +26,4 @@
 + bugfix/serial_cs-resume.patch
 + bugfix/serial_core-suspend_oops.patch
 + bugfix/bluetooth_rfcomm_oops.patch
++ features/drm-i965.patch



More information about the Kernel-svn-changes mailing list