[kernel] r19254 - in dists/sid/linux/debian: . patches patches/features/all/fermi-accel

Ben Hutchings benh at alioth.debian.org
Sun Jul 15 22:16:22 UTC 2012


Author: benh
Date: Sun Jul 15 22:16:20 2012
New Revision: 19254

Log:
nouveau: Update to support Fermi (NVC0+) acceleration (Closes: #679566)

Added:
   dists/sid/linux/debian/patches/features/all/fermi-accel/
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-bump-version-to-1.0.0.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-inform-userspace-of-relaxed-kernel-subch.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-move-fence-sequence-check-to-start-of-lo.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-oops-increase-channel-dispc_vma-to-4.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-remove-m2mf-creation-on-userspace-channe.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-remove-subchannel-names-from-places-wher.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-ttm-always-do-buffer-moves-on-kernel-cha.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nvc0-disp-reimplement-flip-completion-method-as-.patch
   dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nvd0-disp-ignore-clock-set-if-no-pclk.patch
Modified:
   dists/sid/linux/debian/changelog
   dists/sid/linux/debian/patches/series

Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog	Sat Jul 14 22:09:58 2012	(r19253)
+++ dists/sid/linux/debian/changelog	Sun Jul 15 22:16:20 2012	(r19254)
@@ -34,6 +34,9 @@
   * udf: Improve table length check to avoid possible overflow
   * CIFS: Respect negotiated MaxMpxCount (deferred from 3.2.14)
   * epoll: clear the tfile_check_list on -ELOOP (CVE-2012-3375)
+  * nouveau: Update to support Fermi (NVC0+) acceleration (Closes: #679566)
+    - Refactor sub-channel use
+    - Bump version to 1.0.0
 
  -- Ben Hutchings <ben at decadent.org.uk>  Fri, 29 Jun 2012 15:01:22 +0100
 

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-bump-version-to-1.0.0.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-bump-version-to-1.0.0.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,42 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Fri, 16 Mar 2012 12:44:34 +1000
+Subject: [9/9] drm/nouveau: bump version to 1.0.0
+
+commit f887c425f9eeed8ffbca64c8be45da62b07096c0 upstream.
+
+The time has come to get a proper version number that we can change to
+indicate new features etc, rather than the lock-step 0.0.XX that we
+previously had.
+
+libdrm has recognised this version as compatible with 0.0.16 since 2.4.22,
+so hopefully any breakage people see should be very minimal.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_drv.h |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index c1e9a6a..211d800 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -26,15 +26,15 @@
+ #define __NOUVEAU_DRV_H__
+ 
+ #define DRIVER_AUTHOR		"Stephane Marchesin"
+-#define DRIVER_EMAIL		"dri-devel at lists.sourceforge.net"
++#define DRIVER_EMAIL		"nouveau at lists.freedesktop.org"
+ 
+ #define DRIVER_NAME		"nouveau"
+ #define DRIVER_DESC		"nVidia Riva/TNT/GeForce"
+-#define DRIVER_DATE		"20090420"
++#define DRIVER_DATE		"20120316"
+ 
+-#define DRIVER_MAJOR		0
++#define DRIVER_MAJOR		1
+ #define DRIVER_MINOR		0
+-#define DRIVER_PATCHLEVEL	16
++#define DRIVER_PATCHLEVEL	0
+ 
+ #define NOUVEAU_FAMILY   0x0000FFFF
+ #define NOUVEAU_FLAGS    0xFFFF0000

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-inform-userspace-of-relaxed-kernel-subch.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-inform-userspace-of-relaxed-kernel-subch.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,37 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Thu, 29 Mar 2012 20:24:34 +1000
+Subject: [6/9] drm/nouveau: inform userspace of relaxed kernel subchannel
+ requirements
+
+commit 02bfc2881e0d5b23147211bb6420798d946a7b5c upstream.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_channel.c |   11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c
+index 337e228..846afb0 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_channel.c
++++ b/drivers/gpu/drm/nouveau/nouveau_channel.c
+@@ -436,18 +436,11 @@ nouveau_ioctl_fifo_alloc(struct drm_device *dev, void *data,
+ 	}
+ 
+ 	if (dev_priv->card_type < NV_C0) {
+-		init->subchan[0].handle = NvM2MF;
+-		if (dev_priv->card_type < NV_50)
+-			init->subchan[0].grclass = 0x0039;
+-		else
+-			init->subchan[0].grclass = 0x5039;
++		init->subchan[0].handle = 0x00000000;
++		init->subchan[0].grclass = 0x0000;
+ 		init->subchan[1].handle = NvSw;
+ 		init->subchan[1].grclass = NV_SW;
+ 		init->nr_subchan = 2;
+-	} else {
+-		init->subchan[0].handle  = 0x9039;
+-		init->subchan[0].grclass = 0x9039;
+-		init->nr_subchan = 1;
+ 	}
+ 
+ 	/* Named memory object area */

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-move-fence-sequence-check-to-start-of-lo.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-move-fence-sequence-check-to-start-of-lo.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,47 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Wed, 21 Mar 2012 13:51:03 +1000
+Subject: [3/9] drm/nouveau: move fence sequence check to start of loop
+
+commit b08abd4e9a11d637d3c2ff52b2ebbc1b3f686d06 upstream.
+
+I want to be able to use REF_CNT from other places in the kernel without
+pushing a fence object onto the list of emitted fences.
+
+The current code makes an assumption that every time the acked sequence is
+bumped that there's at least one fence on the list that'll be signalled.
+
+This will no longer be true in the near future.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_fence.c |   11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
+index f676ecd..c1dc20f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
++++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
+@@ -93,18 +93,17 @@ nouveau_fence_update(struct nouveau_channel *chan)
+ 	}
+ 
+ 	list_for_each_entry_safe(fence, tmp, &chan->fence.pending, entry) {
+-		sequence = fence->sequence;
++		if (fence->sequence > chan->fence.sequence_ack)
++			break;
++
+ 		fence->signalled = true;
+ 		list_del(&fence->entry);
+-
+-		if (unlikely(fence->work))
++		if (fence->work)
+ 			fence->work(fence->priv, true);
+ 
+ 		kref_put(&fence->refcount, nouveau_fence_del);
+-
+-		if (sequence == chan->fence.sequence_ack)
+-			break;
+ 	}
++
+ out:
+ 	spin_unlock(&chan->fence.lock);
+ }

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-oops-increase-channel-dispc_vma-to-4.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-oops-increase-channel-dispc_vma-to-4.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,24 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Fri, 16 Mar 2012 13:45:09 +1000
+Subject: [7/9] drm/nouveau: oops, increase channel dispc_vma to 4
+
+commit 27100ac95a8eee0b083e46bfa67b229ac641d28c upstream.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_drv.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index 2d6032e..c1e9a6a 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -294,7 +294,7 @@ struct nouveau_channel {
+ 
+ 	uint32_t sw_subchannel[8];
+ 
+-	struct nouveau_vma dispc_vma[2];
++	struct nouveau_vma dispc_vma[4];
+ 	struct {
+ 		struct nouveau_gpuobj *vblsem;
+ 		uint32_t vblsem_head;

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-remove-m2mf-creation-on-userspace-channe.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-remove-m2mf-creation-on-userspace-channe.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,274 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Sun, 18 Mar 2012 00:40:41 +1000
+Subject: [5/9] drm/nouveau: remove m2mf creation on userspace channels
+
+commit 48aca13f0167ae78c28c6b48d82a157a6692eecb upstream.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+[mlankhorst: Backported to 3.2:
+Conflicts:
+
+	drivers/gpu/drm/nouveau/nouveau_state.c
+]
+---
+ drivers/gpu/drm/nouveau/nouveau_channel.c |   19 ++++--
+ drivers/gpu/drm/nouveau/nouveau_dma.c     |   61 +------------------
+ drivers/gpu/drm/nouveau/nouveau_drv.h     |    3 +-
+ drivers/gpu/drm/nouveau/nouveau_state.c   |   91 ++++++++++++++++++++++++-----
+ 4 files changed, 93 insertions(+), 81 deletions(-)
+
+--- a/drivers/gpu/drm/nouveau/nouveau_channel.c
++++ b/drivers/gpu/drm/nouveau/nouveau_channel.c
+@@ -122,7 +122,7 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
+ 	struct nouveau_fpriv *fpriv = nouveau_fpriv(file_priv);
+ 	struct nouveau_channel *chan;
+ 	unsigned long flags;
+-	int ret;
++	int ret, i;
+ 
+ 	/* allocate and lock channel structure */
+ 	chan = kzalloc(sizeof(*chan), GFP_KERNEL);
+@@ -184,7 +184,7 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
+ 		return ret;
+ 	}
+ 
+-	nouveau_dma_pre_init(chan);
++	nouveau_dma_init(chan);
+ 	chan->user_put = 0x40;
+ 	chan->user_get = 0x44;
+ 
+@@ -200,9 +200,18 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
+ 
+ 	pfifo->reassign(dev, true);
+ 
+-	ret = nouveau_dma_init(chan);
+-	if (!ret)
+-		ret = nouveau_fence_channel_init(chan);
++	/* Insert NOPs for NOUVEAU_DMA_SKIPS */
++	ret = RING_SPACE(chan, NOUVEAU_DMA_SKIPS);
++	if (ret) {
++		nouveau_channel_put(&chan);
++		return ret;
++	}
++
++	for (i = 0; i < NOUVEAU_DMA_SKIPS; i++)
++		OUT_RING  (chan, 0x00000000);
++	FIRE_RING(chan);
++
++	ret = nouveau_fence_channel_init(chan);
+ 	if (ret) {
+ 		nouveau_channel_put(&chan);
+ 		return ret;
+--- a/drivers/gpu/drm/nouveau/nouveau_dma.c
++++ b/drivers/gpu/drm/nouveau/nouveau_dma.c
+@@ -31,7 +31,7 @@
+ #include "nouveau_ramht.h"
+ 
+ void
+-nouveau_dma_pre_init(struct nouveau_channel *chan)
++nouveau_dma_init(struct nouveau_channel *chan)
+ {
+ 	struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
+ 	struct nouveau_bo *pushbuf = chan->pushbuf_bo;
+@@ -54,65 +54,6 @@ nouveau_dma_pre_init(struct nouveau_channel *chan)
+ 	chan->dma.free = chan->dma.max - chan->dma.cur;
+ }
+ 
+-int
+-nouveau_dma_init(struct nouveau_channel *chan)
+-{
+-	struct drm_device *dev = chan->dev;
+-	struct drm_nouveau_private *dev_priv = dev->dev_private;
+-	int ret, i;
+-
+-	if (dev_priv->card_type >= NV_C0) {
+-		ret = nouveau_gpuobj_gr_new(chan, 0x9039, 0x9039);
+-		if (ret)
+-			return ret;
+-
+-		ret = RING_SPACE(chan, 2);
+-		if (ret)
+-			return ret;
+-
+-		BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0000, 1);
+-		OUT_RING  (chan, 0x00009039);
+-		FIRE_RING (chan);
+-		return 0;
+-	}
+-
+-	/* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */
+-	ret = nouveau_gpuobj_gr_new(chan, NvM2MF, dev_priv->card_type < NV_50 ?
+-				    0x0039 : 0x5039);
+-	if (ret)
+-		return ret;
+-
+-	/* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */
+-	ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfe0, 0x1000,
+-				     &chan->m2mf_ntfy);
+-	if (ret)
+-		return ret;
+-
+-	/* Insert NOPS for NOUVEAU_DMA_SKIPS */
+-	ret = RING_SPACE(chan, NOUVEAU_DMA_SKIPS);
+-	if (ret)
+-		return ret;
+-
+-	for (i = 0; i < NOUVEAU_DMA_SKIPS; i++)
+-		OUT_RING(chan, 0);
+-
+-	/* Initialise NV_MEMORY_TO_MEMORY_FORMAT */
+-	ret = RING_SPACE(chan, 6);
+-	if (ret)
+-		return ret;
+-	BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NAME, 1);
+-	OUT_RING  (chan, NvM2MF);
+-	BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 3);
+-	OUT_RING  (chan, NvNotify0);
+-	OUT_RING  (chan, chan->vram_handle);
+-	OUT_RING  (chan, chan->gart_handle);
+-
+-	/* Sit back and pray the channel works.. */
+-	FIRE_RING(chan);
+-
+-	return 0;
+-}
+-
+ void
+ OUT_RINGp(struct nouveau_channel *chan, const void *data, unsigned nr_dwords)
+ {
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -1030,8 +1030,7 @@ nouveau_debugfs_channel_fini(struct nouveau_channel *chan)
+ #endif
+ 
+ /* nouveau_dma.c */
+-extern void nouveau_dma_pre_init(struct nouveau_channel *);
+-extern int  nouveau_dma_init(struct nouveau_channel *);
++extern void nouveau_dma_init(struct nouveau_channel *);
+ extern int  nouveau_dma_wait(struct nouveau_channel *, int slots, int size);
+ 
+ /* nouveau_acpi.c */
+--- a/drivers/gpu/drm/nouveau/nouveau_state.c
++++ b/drivers/gpu/drm/nouveau/nouveau_state.c
+@@ -547,6 +547,75 @@ static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev)
+ 	return can_switch;
+ }
+ 
++static void
++nouveau_card_channel_fini(struct drm_device *dev)
++{
++	struct drm_nouveau_private *dev_priv = dev->dev_private;
++
++	if (dev_priv->channel)
++		nouveau_channel_put_unlocked(&dev_priv->channel);
++}
++
++static int
++nouveau_card_channel_init(struct drm_device *dev)
++{
++	struct drm_nouveau_private *dev_priv = dev->dev_private;
++	struct nouveau_channel *chan;
++	int ret, oclass;
++
++	ret = nouveau_channel_alloc(dev, &chan, NULL, NvDmaFB, NvDmaTT);
++	dev_priv->channel = chan;
++	if (ret)
++		return ret;
++
++	mutex_unlock(&dev_priv->channel->mutex);
++
++	if (dev_priv->card_type <= NV_50) {
++		if (dev_priv->card_type < NV_50)
++			oclass = 0x0039;
++		else
++			oclass = 0x5039;
++
++		ret = nouveau_gpuobj_gr_new(chan, NvM2MF, oclass);
++		if (ret)
++			goto error;
++
++		ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfe0, 0x1000,
++					     &chan->m2mf_ntfy);
++		if (ret)
++			goto error;
++
++		ret = RING_SPACE(chan, 6);
++		if (ret)
++			goto error;
++
++		BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NAME, 1);
++		OUT_RING  (chan, NvM2MF);
++		BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 3);
++		OUT_RING  (chan, NvNotify0);
++		OUT_RING  (chan, chan->vram_handle);
++		OUT_RING  (chan, chan->gart_handle);
++	} else
++	if (dev_priv->card_type <= NV_C0) {
++		ret = nouveau_gpuobj_gr_new(chan, 0x9039, 0x9039);
++		if (ret)
++			goto error;
++
++		ret = RING_SPACE(chan, 2);
++		if (ret)
++			goto error;
++
++		BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0000, 1);
++		OUT_RING  (chan, 0x00009039);
++	}
++
++	FIRE_RING (chan);
++error:
++	if (ret)
++		nouveau_card_channel_fini(dev);
++	return ret;
++}
++
+ int
+ nouveau_card_init(struct drm_device *dev)
+ {
+@@ -738,17 +807,14 @@ nouveau_card_init(struct drm_device *dev)
+ 
+ 	nouveau_backlight_init(dev);
+ 
+-	if (dev_priv->eng[NVOBJ_ENGINE_GR]) {
+-		ret = nouveau_fence_init(dev);
+-		if (ret)
+-			goto out_disp;
++	ret = nouveau_fence_init(dev);
++	if (ret)
++		goto out_disp;
+ 
+-		ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL,
+-					    NvDmaFB, NvDmaTT);
++	if (!dev_priv->noaccel) {
++		ret = nouveau_card_channel_init(dev);
+ 		if (ret)
+ 			goto out_fence;
+-
+-		mutex_unlock(&dev_priv->channel->mutex);
+ 	}
+ 
+ 	if (dev->mode_config.num_crtc) {
+@@ -763,7 +829,7 @@ nouveau_card_init(struct drm_device *dev)
+ 	return 0;
+ 
+ out_chan:
+-	nouveau_channel_put_unlocked(&dev_priv->channel);
++	nouveau_card_channel_fini(dev);
+ out_fence:
+ 	nouveau_fence_fini(dev);
+ out_disp:
+@@ -823,11 +889,8 @@ static void nouveau_card_takedown(struct drm_device *dev)
+ 		drm_vblank_cleanup(dev);
+ 	}
+ 
+-	if (dev_priv->channel) {
+-		nouveau_channel_put_unlocked(&dev_priv->channel);
+-		nouveau_fence_fini(dev);
+-	}
+-
++	nouveau_card_channel_fini(dev);
++	nouveau_fence_fini(dev);
+ 	nouveau_backlight_exit(dev);
+ 	engine->display.destroy(dev);
+ 	drm_mode_config_cleanup(dev);

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-remove-subchannel-names-from-places-wher.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-remove-subchannel-names-from-places-wher.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,179 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Fri, 16 Mar 2012 00:09:54 +1000
+Subject: [2/9] drm/nouveau: remove subchannel names from places where it
+ doesn't matter
+
+commit b5b2e5988bd18a2f6e3f192adf7439599de00d3f upstream.
+
+These are FIFO methods, it doesn't matter what subchannel is being used.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+[mlankhorst: Backported to 3.2:
+Resolved conflict by reverting, since it's not used yet in nvd0_display.c
+Conflicts:
+	drivers/gpu/drm/nouveau/nvd0_display.c
+]
+---
+ drivers/gpu/drm/nouveau/nouveau_drv.h   |   23 ++++++++++++++++++-----
+ drivers/gpu/drm/nouveau/nouveau_fence.c |   24 ++++++++++++------------
+ drivers/gpu/drm/nouveau/nv50_display.c  |   12 ++++++------
+ 3 files changed, 36 insertions(+), 23 deletions(-)
+
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -1660,13 +1660,26 @@ nv44_graph_class(struct drm_device *dev)
+ #define NV_MEM_TYPE_VM 0x7f
+ #define NV_MEM_COMP_VM 0x03
+ 
++/* FIFO methods */
++#define NV01_SUBCHAN_OBJECT                                          0x00000000
++#define NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH                          0x00000010
++#define NV84_SUBCHAN_SEMAPHORE_ADDRESS_LOW                           0x00000014
++#define NV84_SUBCHAN_SEMAPHORE_SEQUENCE                              0x00000018
++#define NV84_SUBCHAN_SEMAPHORE_TRIGGER                               0x0000001c
++#define NV84_SUBCHAN_SEMAPHORE_TRIGGER_ACQUIRE_EQUAL                 0x00000001
++#define NV84_SUBCHAN_SEMAPHORE_TRIGGER_WRITE_LONG                    0x00000002
++#define NV84_SUBCHAN_SEMAPHORE_TRIGGER_ACQUIRE_GEQUAL                0x00000004
++#define NV84_SUBCHAN_NOTIFY_INTR                                     0x00000020
++#define NV84_SUBCHAN_WRCACHE_FLUSH                                   0x00000024
++#define NV10_SUBCHAN_REF_CNT                                         0x00000050
++#define NV11_SUBCHAN_DMA_SEMAPHORE                                   0x00000060
++#define NV11_SUBCHAN_SEMAPHORE_OFFSET                                0x00000064
++#define NV11_SUBCHAN_SEMAPHORE_ACQUIRE                               0x00000068
++#define NV11_SUBCHAN_SEMAPHORE_RELEASE                               0x0000006c
++#define NV40_SUBCHAN_YIELD                                           0x00000080
++
+ /* NV_SW object class */
+ #define NV_SW                                                        0x0000506e
+-#define NV_SW_DMA_SEMAPHORE                                          0x00000060
+-#define NV_SW_SEMAPHORE_OFFSET                                       0x00000064
+-#define NV_SW_SEMAPHORE_ACQUIRE                                      0x00000068
+-#define NV_SW_SEMAPHORE_RELEASE                                      0x0000006c
+-#define NV_SW_YIELD                                                  0x00000080
+ #define NV_SW_DMA_VBLSEM                                             0x0000018c
+ #define NV_SW_VBLSEM_OFFSET                                          0x00000400
+ #define NV_SW_VBLSEM_RELEASE_VALUE                                   0x00000404
+--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
++++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
+@@ -165,9 +165,9 @@ nouveau_fence_emit(struct nouveau_fence *fence)
+ 
+ 	if (USE_REFCNT(dev)) {
+ 		if (dev_priv->card_type < NV_C0)
+-			BEGIN_RING(chan, NvSubSw, 0x0050, 1);
++			BEGIN_RING(chan, 0, NV10_SUBCHAN_REF_CNT, 1);
+ 		else
+-			BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0050, 1);
++			BEGIN_NVC0(chan, 2, 0, NV10_SUBCHAN_REF_CNT, 1);
+ 	} else {
+ 		BEGIN_RING(chan, NvSubSw, 0x0150, 1);
+ 	}
+@@ -344,7 +344,7 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 3);
++		BEGIN_RING(chan, 0, NV11_SUBCHAN_DMA_SEMAPHORE, 3);
+ 		OUT_RING  (chan, NvSema);
+ 		OUT_RING  (chan, offset);
+ 		OUT_RING  (chan, 1);
+@@ -354,9 +354,9 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
++		BEGIN_RING(chan, 0, NV11_SUBCHAN_DMA_SEMAPHORE, 1);
+ 		OUT_RING  (chan, chan->vram_handle);
+-		BEGIN_RING(chan, NvSubSw, 0x0010, 4);
++		BEGIN_RING(chan, 0, NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH, 4);
+ 		OUT_RING  (chan, upper_32_bits(offset));
+ 		OUT_RING  (chan, lower_32_bits(offset));
+ 		OUT_RING  (chan, 1);
+@@ -366,7 +366,7 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++		BEGIN_NVC0(chan, 2, 0, NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH, 4);
+ 		OUT_RING  (chan, upper_32_bits(offset));
+ 		OUT_RING  (chan, lower_32_bits(offset));
+ 		OUT_RING  (chan, 1);
+@@ -397,10 +397,10 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 2);
++		BEGIN_RING(chan, 0, NV11_SUBCHAN_DMA_SEMAPHORE, 2);
+ 		OUT_RING  (chan, NvSema);
+ 		OUT_RING  (chan, offset);
+-		BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1);
++		BEGIN_RING(chan, 0, NV11_SUBCHAN_SEMAPHORE_RELEASE, 1);
+ 		OUT_RING  (chan, 1);
+ 	} else
+ 	if (dev_priv->chipset < 0xc0) {
+@@ -408,9 +408,9 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
++		BEGIN_RING(chan, 0, NV11_SUBCHAN_DMA_SEMAPHORE, 1);
+ 		OUT_RING  (chan, chan->vram_handle);
+-		BEGIN_RING(chan, NvSubSw, 0x0010, 4);
++		BEGIN_RING(chan, 0, NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH, 4);
+ 		OUT_RING  (chan, upper_32_bits(offset));
+ 		OUT_RING  (chan, lower_32_bits(offset));
+ 		OUT_RING  (chan, 1);
+@@ -420,7 +420,7 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++		BEGIN_NVC0(chan, 2, 0, NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH, 4);
+ 		OUT_RING  (chan, upper_32_bits(offset));
+ 		OUT_RING  (chan, lower_32_bits(offset));
+ 		OUT_RING  (chan, 1);
+@@ -510,7 +510,7 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
+ 		if (ret)
+ 			return ret;
+ 
+-		BEGIN_RING(chan, NvSubSw, 0, 1);
++		BEGIN_RING(chan, NvSubSw, NV01_SUBCHAN_OBJECT, 1);
+ 		OUT_RING  (chan, NvSw);
+ 		FIRE_RING (chan);
+ 	}
+--- a/drivers/gpu/drm/nouveau/nv50_display.c
++++ b/drivers/gpu/drm/nouveau/nv50_display.c
+@@ -413,15 +413,15 @@ nv50_display_flip_next(struct drm_crtc *crtc, struct drm_framebuffer *fb,
+ 		}
+ 
+ 		if (dev_priv->chipset < 0xc0) {
+-			BEGIN_RING(chan, NvSubSw, 0x0060, 2);
++			BEGIN_RING(chan, 0, 0x0060, 2);
+ 			OUT_RING  (chan, NvEvoSema0 + nv_crtc->index);
+ 			OUT_RING  (chan, dispc->sem.offset);
+-			BEGIN_RING(chan, NvSubSw, 0x006c, 1);
++			BEGIN_RING(chan, 0, 0x006c, 1);
+ 			OUT_RING  (chan, 0xf00d0000 | dispc->sem.value);
+-			BEGIN_RING(chan, NvSubSw, 0x0064, 2);
++			BEGIN_RING(chan, 0, 0x0064, 2);
+ 			OUT_RING  (chan, dispc->sem.offset ^ 0x10);
+ 			OUT_RING  (chan, 0x74b1e000);
+-			BEGIN_RING(chan, NvSubSw, 0x0060, 1);
++			BEGIN_RING(chan, 0, 0x0060, 1);
+ 			if (dev_priv->chipset < 0x84)
+ 				OUT_RING  (chan, NvSema);
+ 			else
+@@ -429,12 +429,12 @@ nv50_display_flip_next(struct drm_crtc *crtc, struct drm_framebuffer *fb,
+ 		} else {
+ 			u64 offset = chan->dispc_vma[nv_crtc->index].offset;
+ 			offset += dispc->sem.offset;
+-			BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++			BEGIN_NVC0(chan, 2, 0, 0x0010, 4);
+ 			OUT_RING  (chan, upper_32_bits(offset));
+ 			OUT_RING  (chan, lower_32_bits(offset));
+ 			OUT_RING  (chan, 0xf00d0000 | dispc->sem.value);
+ 			OUT_RING  (chan, 0x1002);
+-			BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
++			BEGIN_NVC0(chan, 2, 0, 0x0010, 4);
+ 			OUT_RING  (chan, upper_32_bits(offset));
+ 			OUT_RING  (chan, lower_32_bits(offset ^ 0x10));
+ 			OUT_RING  (chan, 0x74b1e000);

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-ttm-always-do-buffer-moves-on-kernel-cha.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nouveau-ttm-always-do-buffer-moves-on-kernel-cha.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,99 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Fri, 16 Mar 2012 12:40:17 +1000
+Subject: [1/9] drm/nouveau/ttm: always do buffer moves on kernel channel
+
+commit accf94969f226ddfe7dd3a6a76ce093ace839b26 upstream.
+
+There was once good reasons for wanting the drm to be able to use M2MF etc
+on user channels, but they're not relevant anymore.  For the general
+buffer move case, we've already lost by transferring between vram/sysmem
+already so the context switching overhead is minimal in comparison.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_bo.c  |   11 +++--------
+ drivers/gpu/drm/nouveau/nouveau_drv.h |    2 --
+ drivers/gpu/drm/nouveau/nouveau_gem.c |   10 +---------
+ 3 files changed, 4 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
+index ec54364..7d15a77 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
++++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
+@@ -693,16 +693,12 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
+ 		     struct ttm_mem_reg *new_mem)
+ {
+ 	struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
++	struct nouveau_channel *chan = chan = dev_priv->channel;
+ 	struct nouveau_bo *nvbo = nouveau_bo(bo);
+ 	struct ttm_mem_reg *old_mem = &bo->mem;
+-	struct nouveau_channel *chan;
+ 	int ret;
+ 
+-	chan = nvbo->channel;
+-	if (!chan) {
+-		chan = dev_priv->channel;
+-		mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX);
+-	}
++	mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX);
+ 
+ 	/* create temporary vmas for the transfer and attach them to the
+ 	 * old nouveau_mem node, these will get cleaned up after ttm has
+@@ -734,8 +730,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
+ 	}
+ 
+ out:
+-	if (chan == dev_priv->channel)
+-		mutex_unlock(&chan->mutex);
++	mutex_unlock(&chan->mutex);
+ 	return ret;
+ }
+ 
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index a184ba3..0df2175 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -113,8 +113,6 @@ struct nouveau_bo {
+ 	int pbbo_index;
+ 	bool validate_mapped;
+ 
+-	struct nouveau_channel *channel;
+-
+ 	struct list_head vma_list;
+ 	unsigned page_shift;
+ 
+diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
+index 7ce3fde..ed52a6f 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
++++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
+@@ -426,9 +426,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
+ 			return ret;
+ 		}
+ 
+-		nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan;
+ 		ret = nouveau_bo_validate(nvbo, true, false, false);
+-		nvbo->channel = NULL;
+ 		if (unlikely(ret)) {
+ 			if (ret != -ERESTARTSYS)
+ 				NV_ERROR(dev, "fail ttm_validate\n");
+@@ -678,19 +676,13 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
+ 		return PTR_ERR(bo);
+ 	}
+ 
+-	/* Mark push buffers as being used on PFIFO, the validation code
+-	 * will then make sure that if the pushbuf bo moves, that they
+-	 * happen on the kernel channel, which will in turn cause a sync
+-	 * to happen before we try and submit the push buffer.
+-	 */
++	/* Ensure all push buffers are on validate list */
+ 	for (i = 0; i < req->nr_push; i++) {
+ 		if (push[i].bo_index >= req->nr_buffers) {
+ 			NV_ERROR(dev, "push %d buffer not in list\n", i);
+ 			ret = -EINVAL;
+ 			goto out_prevalid;
+ 		}
+-
+-		bo[push[i].bo_index].read_domains |= (1 << 31);
+ 	}
+ 
+ 	/* Validate buffer list */

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nvc0-disp-reimplement-flip-completion-method-as-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nvc0-disp-reimplement-flip-completion-method-as-.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,140 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Wed, 21 Mar 2012 13:53:49 +1000
+Subject: [4/9] drm/nvc0-/disp: reimplement flip completion method as fifo
+ method
+
+commit d5316e251230c4e54a157349a362229c3d4daa32 upstream.
+
+Removes need for M2MF subchannel usage on NVC0+.
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nouveau_display.c |   14 +++++++----
+ drivers/gpu/drm/nouveau/nouveau_drv.h     |    1 +
+ drivers/gpu/drm/nouveau/nvc0_fifo.c       |   36 +++++++++++++++++++++++++----
+ drivers/gpu/drm/nouveau/nvc0_graph.c      |    9 --------
+ 4 files changed, 42 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
+index 35acc92..ab44727 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_display.c
++++ b/drivers/gpu/drm/nouveau/nouveau_display.c
+@@ -438,15 +438,19 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
+ 		goto fail;
+ 
+ 	/* Emit the pageflip */
+-	ret = RING_SPACE(chan, 2);
++	ret = RING_SPACE(chan, 3);
+ 	if (ret)
+ 		goto fail;
+ 
+-	if (dev_priv->card_type < NV_C0)
++	if (dev_priv->card_type < NV_C0) {
+ 		BEGIN_RING(chan, NvSubSw, NV_SW_PAGE_FLIP, 1);
+-	else
+-		BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0500, 1);
+-	OUT_RING  (chan, 0);
++		OUT_RING  (chan, 0x00000000);
++		OUT_RING  (chan, 0x00000000);
++	} else {
++		BEGIN_NVC0(chan, 2, 0, NV10_SUBCHAN_REF_CNT, 1);
++		OUT_RING  (chan, ++chan->fence.sequence);
++		BEGIN_NVC0(chan, 8, 0, NVSW_SUBCHAN_PAGE_FLIP, 0x0000);
++	}
+ 	FIRE_RING (chan);
+ 
+ 	ret = nouveau_fence_new(chan, pfence, true);
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index eaf9872..3dd620fc 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -1775,6 +1775,7 @@ nv44_graph_class(struct drm_device *dev)
+ #define NV84_SUBCHAN_NOTIFY_INTR                                     0x00000020
+ #define NV84_SUBCHAN_WRCACHE_FLUSH                                   0x00000024
+ #define NV10_SUBCHAN_REF_CNT                                         0x00000050
++#define NVSW_SUBCHAN_PAGE_FLIP                                       0x00000054
+ #define NV11_SUBCHAN_DMA_SEMAPHORE                                   0x00000060
+ #define NV11_SUBCHAN_SEMAPHORE_OFFSET                                0x00000064
+ #define NV11_SUBCHAN_SEMAPHORE_ACQUIRE                               0x00000068
+diff --git a/drivers/gpu/drm/nouveau/nvc0_fifo.c b/drivers/gpu/drm/nouveau/nvc0_fifo.c
+index dcbe0d5..50d68a7 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_fifo.c
++++ b/drivers/gpu/drm/nouveau/nvc0_fifo.c
+@@ -436,6 +436,24 @@ nvc0_fifo_isr_vm_fault(struct drm_device *dev, int unit)
+ 	printk(" on channel 0x%010llx\n", (u64)inst << 12);
+ }
+ 
++static int
++nvc0_fifo_page_flip(struct drm_device *dev, u32 chid)
++{
++	struct drm_nouveau_private *dev_priv = dev->dev_private;
++	struct nouveau_channel *chan = NULL;
++	unsigned long flags;
++	int ret = -EINVAL;
++
++	spin_lock_irqsave(&dev_priv->channels.lock, flags);
++	if (likely(chid >= 0 && chid < dev_priv->engine.fifo.channels)) {
++		chan = dev_priv->channels.ptr[chid];
++		if (likely(chan))
++			ret = nouveau_finish_page_flip(chan, NULL);
++	}
++	spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
++	return ret;
++}
++
+ static void
+ nvc0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit)
+ {
+@@ -445,11 +463,21 @@ nvc0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit)
+ 	u32 chid = nv_rd32(dev, 0x040120 + (unit * 0x2000)) & 0x7f;
+ 	u32 subc = (addr & 0x00070000);
+ 	u32 mthd = (addr & 0x00003ffc);
++	u32 show = stat;
+ 
+-	NV_INFO(dev, "PSUBFIFO %d:", unit);
+-	nouveau_bitfield_print(nvc0_fifo_subfifo_intr, stat);
+-	NV_INFO(dev, "PSUBFIFO %d: ch %d subc %d mthd 0x%04x data 0x%08x\n",
+-		unit, chid, subc, mthd, data);
++	if (stat & 0x00200000) {
++		if (mthd == 0x0054) {
++			if (!nvc0_fifo_page_flip(dev, chid))
++				show &= ~0x00200000;
++		}
++	}
++
++	if (show) {
++		NV_INFO(dev, "PFIFO%d:", unit);
++		nouveau_bitfield_print(nvc0_fifo_subfifo_intr, show);
++		NV_INFO(dev, "PFIFO%d: ch %d subc %d mthd 0x%04x data 0x%08x\n",
++			     unit, chid, subc, mthd, data);
++	}
+ 
+ 	nv_wr32(dev, 0x0400c0 + (unit * 0x2000), 0x80600008);
+ 	nv_wr32(dev, 0x040108 + (unit * 0x2000), stat);
+diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.c b/drivers/gpu/drm/nouveau/nvc0_graph.c
+index 8ee3963..9066102 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_graph.c
++++ b/drivers/gpu/drm/nouveau/nvc0_graph.c
+@@ -333,14 +333,6 @@ nvc0_graph_fini(struct drm_device *dev, int engine, bool suspend)
+ 	return 0;
+ }
+ 
+-static int
+-nvc0_graph_mthd_page_flip(struct nouveau_channel *chan,
+-			  u32 class, u32 mthd, u32 data)
+-{
+-	nouveau_finish_page_flip(chan, NULL);
+-	return 0;
+-}
+-
+ static void
+ nvc0_graph_init_obj418880(struct drm_device *dev)
+ {
+@@ -889,7 +881,6 @@ nvc0_graph_create(struct drm_device *dev)
+ 
+ 	NVOBJ_CLASS(dev, 0x902d, GR); /* 2D */
+ 	NVOBJ_CLASS(dev, 0x9039, GR); /* M2MF */
+-	NVOBJ_MTHD (dev, 0x9039, 0x0500, nvc0_graph_mthd_page_flip);
+ 	NVOBJ_CLASS(dev, 0x9097, GR); /* 3D */
+ 	if (fermi >= 0x9197)
+ 		NVOBJ_CLASS(dev, 0x9197, GR); /* 3D (NVC1-) */

Added: dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nvd0-disp-ignore-clock-set-if-no-pclk.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/fermi-accel/drm-nvd0-disp-ignore-clock-set-if-no-pclk.patch	Sun Jul 15 22:16:20 2012	(r19254)
@@ -0,0 +1,31 @@
+From: Ben Skeggs <bskeggs at redhat.com>
+Date: Fri, 16 Mar 2012 15:32:16 +1000
+Subject: [8/9] drm/nvd0/disp: ignore clock set if no pclk
+
+commit dd62608bcc8a629c4c583fb50b90003fd5213516 upstream.
+
+This happens somehow during init on a machine I have, and leads to a
+divide-by-zero.
+
+Lets avoid that...
+
+Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
+---
+ drivers/gpu/drm/nouveau/nvd0_display.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/nouveau/nvd0_display.c b/drivers/gpu/drm/nouveau/nvd0_display.c
+index 5e2b79b..421d301 100644
+--- a/drivers/gpu/drm/nouveau/nvd0_display.c
++++ b/drivers/gpu/drm/nouveau/nvd0_display.c
+@@ -1661,7 +1661,9 @@ nvd0_display_unk2_handler(struct drm_device *dev, u32 crtc, u32 mask)
+ 	}
+ 
+ 	pclk = nv_rd32(dev, 0x660450 + (crtc * 0x300)) / 1000;
+-	if (mask & 0x00010000) {
++	NV_DEBUG_KMS(dev, "PDISP: crtc %d pclk %d mask 0x%08x\n",
++			  crtc, pclk, mask);
++	if (pclk && (mask & 0x00010000)) {
+ 		nv50_crtc_set_clock(dev, crtc, pclk);
+ 	}
+ 

Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series	Sat Jul 14 22:09:58 2012	(r19253)
+++ dists/sid/linux/debian/patches/series	Sun Jul 15 22:16:20 2012	(r19254)
@@ -368,3 +368,14 @@
 bugfix/all/scsi-Silence-unnecessary-warnings-about-ioctl-to-par.patch
 bugfix/all/udf-Improve-table-length-check-to-avoid-possible-underflow.patch
 bugfix/all/epoll-clear-the-tfile_check_list-on-eloop.patch
+
+# nouveau update to support Fermi (NVC0+) acceleration
+features/all/fermi-accel/drm-nouveau-ttm-always-do-buffer-moves-on-kernel-cha.patch
+features/all/fermi-accel/drm-nouveau-remove-subchannel-names-from-places-wher.patch
+features/all/fermi-accel/drm-nouveau-move-fence-sequence-check-to-start-of-lo.patch
+features/all/fermi-accel/drm-nvc0-disp-reimplement-flip-completion-method-as-.patch
+features/all/fermi-accel/drm-nouveau-remove-m2mf-creation-on-userspace-channe.patch
+features/all/fermi-accel/drm-nouveau-inform-userspace-of-relaxed-kernel-subch.patch
+features/all/fermi-accel/drm-nouveau-oops-increase-channel-dispc_vma-to-4.patch
+features/all/fermi-accel/drm-nvd0-disp-ignore-clock-set-if-no-pclk.patch
+features/all/fermi-accel/drm-nouveau-bump-version-to-1.0.0.patch



More information about the Kernel-svn-changes mailing list