rpms/kernel/F-12 drm-nouveau.patch, 1.72, 1.73 kernel.spec, 1.1958, 1.1959

Ben Skeggs bskeggs at fedoraproject.org
Mon Dec 21 04:26:27 UTC 2009


Author: bskeggs

Update of /cvs/pkgs/rpms/kernel/F-12
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv2630

Modified Files:
	drm-nouveau.patch kernel.spec 
Log Message:
* Mon Dec 21 2009 Ben Skeggs <bskeggs at redhat.com> 2.6.31.9-173
- nouveau: fix dim panel issues on certain laptops (rh#547554)
- nouveau: fix some issues when running without ctxprogs
- nouveau: fix error handling in init paths
- nouveau: add vga arbitration hooks
- nouveau: fix nv04 sw methods



drm-nouveau.patch:
 drivers/gpu/drm/Kconfig                     |   56 
 drivers/gpu/drm/Makefile                    |    2 
 drivers/gpu/drm/i2c/Makefile                |    4 
 drivers/gpu/drm/i2c/ch7006_drv.c            |  536 
 drivers/gpu/drm/i2c/ch7006_mode.c           |  468 
 drivers/gpu/drm/i2c/ch7006_priv.h           |  344 
 drivers/gpu/drm/nouveau/Makefile            |   30 
 drivers/gpu/drm/nouveau/nouveau_acpi.c      |  125 
 drivers/gpu/drm/nouveau/nouveau_backlight.c |  155 
 drivers/gpu/drm/nouveau/nouveau_bios.c      | 6050 ++++++
 drivers/gpu/drm/nouveau/nouveau_bios.h      |  289 
 drivers/gpu/drm/nouveau/nouveau_bo.c        |  661 
 drivers/gpu/drm/nouveau/nouveau_calc.c      |  478 
 drivers/gpu/drm/nouveau/nouveau_channel.c   |  468 
 drivers/gpu/drm/nouveau/nouveau_connector.c |  812 
 drivers/gpu/drm/nouveau/nouveau_connector.h |   54 
 drivers/gpu/drm/nouveau/nouveau_crtc.h      |   95 
 drivers/gpu/drm/nouveau/nouveau_debugfs.c   |  155 
 drivers/gpu/drm/nouveau/nouveau_display.c   |  115 
 drivers/gpu/drm/nouveau/nouveau_dma.c       |  206 
 drivers/gpu/drm/nouveau/nouveau_dma.h       |  157 
 drivers/gpu/drm/nouveau/nouveau_drv.c       |  413 
 drivers/gpu/drm/nouveau/nouveau_drv.h       | 1270 +
 drivers/gpu/drm/nouveau/nouveau_encoder.h   |   66 
 drivers/gpu/drm/nouveau/nouveau_fb.h        |   47 
 drivers/gpu/drm/nouveau/nouveau_fbcon.c     |  382 
 drivers/gpu/drm/nouveau/nouveau_fbcon.h     |   47 
 drivers/gpu/drm/nouveau/nouveau_fence.c     |  262 
 drivers/gpu/drm/nouveau/nouveau_gem.c       |  976 +
 drivers/gpu/drm/nouveau/nouveau_hw.c        | 1080 +
 drivers/gpu/drm/nouveau/nouveau_hw.h        |  455 
 drivers/gpu/drm/nouveau/nouveau_i2c.c       |  257 
 drivers/gpu/drm/nouveau/nouveau_i2c.h       |   45 
 drivers/gpu/drm/nouveau/nouveau_ioc32.c     |   72 
 drivers/gpu/drm/nouveau/nouveau_irq.c       |  702 
 drivers/gpu/drm/nouveau/nouveau_mem.c       |  583 
 drivers/gpu/drm/nouveau/nouveau_notifier.c  |  196 
 drivers/gpu/drm/nouveau/nouveau_object.c    | 1294 +
 drivers/gpu/drm/nouveau/nouveau_reg.h       |  788 
 drivers/gpu/drm/nouveau/nouveau_sgdma.c     |  321 
 drivers/gpu/drm/nouveau/nouveau_state.c     |  919 
 drivers/gpu/drm/nouveau/nouveau_ttm.c       |  131 
 drivers/gpu/drm/nouveau/nv04_crtc.c         | 1002 +
 drivers/gpu/drm/nouveau/nv04_cursor.c       |   70 
 drivers/gpu/drm/nouveau/nv04_dac.c          |  528 
 drivers/gpu/drm/nouveau/nv04_dfp.c          |  621 
 drivers/gpu/drm/nouveau/nv04_display.c      |  293 
 drivers/gpu/drm/nouveau/nv04_fb.c           |   21 
 drivers/gpu/drm/nouveau/nv04_fbcon.c        |  316 
 drivers/gpu/drm/nouveau/nv04_fifo.c         |  271 
 drivers/gpu/drm/nouveau/nv04_graph.c        |  579 
 drivers/gpu/drm/nouveau/nv04_instmem.c      |  208 
 drivers/gpu/drm/nouveau/nv04_mc.c           |   20 
 drivers/gpu/drm/nouveau/nv04_timer.c        |   51 
 drivers/gpu/drm/nouveau/nv04_tv.c           |  305 
 drivers/gpu/drm/nouveau/nv10_fb.c           |   24 
 drivers/gpu/drm/nouveau/nv10_fifo.c         |  260 
 drivers/gpu/drm/nouveau/nv10_graph.c        |  892 
 drivers/gpu/drm/nouveau/nv17_gpio.c         |   92 
 drivers/gpu/drm/nouveau/nv17_tv.c           |  681 
 drivers/gpu/drm/nouveau/nv17_tv.h           |  156 
 drivers/gpu/drm/nouveau/nv17_tv_modes.c     |  583 
 drivers/gpu/drm/nouveau/nv20_graph.c        |  780 
 drivers/gpu/drm/nouveau/nv40_fb.c           |   62 
 drivers/gpu/drm/nouveau/nv40_fifo.c         |  314 
 drivers/gpu/drm/nouveau/nv40_graph.c        | 2915 +++
 drivers/gpu/drm/nouveau/nv40_mc.c           |   38 
 drivers/gpu/drm/nouveau/nv50_crtc.c         |  769 
 drivers/gpu/drm/nouveau/nv50_cursor.c       |  156 
 drivers/gpu/drm/nouveau/nv50_dac.c          |  304 
 drivers/gpu/drm/nouveau/nv50_display.c      | 1012 +
 drivers/gpu/drm/nouveau/nv50_display.h      |   46 
 drivers/gpu/drm/nouveau/nv50_evo.h          |  113 
 drivers/gpu/drm/nouveau/nv50_fbcon.c        |  273 
 drivers/gpu/drm/nouveau/nv50_fifo.c         |  494 
 drivers/gpu/drm/nouveau/nv50_graph.c        |  470 
 drivers/gpu/drm/nouveau/nv50_grctx.h        |26832 ++++++++++++++++++++++++++++
 drivers/gpu/drm/nouveau/nv50_instmem.c      |  509 
 drivers/gpu/drm/nouveau/nv50_mc.c           |   40 
 drivers/gpu/drm/nouveau/nv50_sor.c          |  269 
 drivers/gpu/drm/nouveau/nvreg.h             |  535 
 drivers/gpu/drm/ttm/ttm_bo.c                |    4 
 include/drm/Kbuild                          |    1 
 include/drm/i2c/ch7006.h                    |   86 
 include/drm/nouveau_drm.h                   |  220 
 85 files changed, 64781 insertions(+)

Index: drm-nouveau.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-12/drm-nouveau.patch,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -p -r1.72 -r1.73
--- drm-nouveau.patch	17 Dec 2009 03:03:24 -0000	1.72
+++ drm-nouveau.patch	21 Dec 2009 04:26:25 -0000	1.73
@@ -84,10 +84,10 @@ index 0000000..6d2abaf
 +obj-$(CONFIG_DRM_I2C_CH7006) += ch7006.o
 diff --git a/drivers/gpu/drm/i2c/ch7006_drv.c b/drivers/gpu/drm/i2c/ch7006_drv.c
 new file mode 100644
-index 0000000..9422a74
+index 0000000..81681a0
 --- /dev/null
 +++ b/drivers/gpu/drm/i2c/ch7006_drv.c
-@@ -0,0 +1,531 @@
+@@ -0,0 +1,536 @@
 +/*
 + * Copyright (C) 2009 Francisco Jerez.
 + * All Rights Reserved.
@@ -498,6 +498,11 @@ index 0000000..9422a74
 +
 +	ch7006_info(client, "Detected version ID: %x\n", val);
 +
++	/* I don't know what this is for, but otherwise I get no
++	 * signal.
++	 */
++	ch7006_write(client, 0x3d, 0x0);
++
 +	return 0;
 +
 +fail:
@@ -621,10 +626,10 @@ index 0000000..9422a74
 +module_exit(ch7006_exit);
 diff --git a/drivers/gpu/drm/i2c/ch7006_mode.c b/drivers/gpu/drm/i2c/ch7006_mode.c
 new file mode 100644
-index 0000000..87f5445
+index 0000000..e447dfb
 --- /dev/null
 +++ b/drivers/gpu/drm/i2c/ch7006_mode.c
-@@ -0,0 +1,473 @@
+@@ -0,0 +1,468 @@
 +/*
 + * Copyright (C) 2009 Francisco Jerez.
 + * All Rights Reserved.
@@ -1054,11 +1059,6 @@ index 0000000..87f5445
 +	ch7006_load_reg(client, state, CH7006_SUBC_INC7);
 +	ch7006_load_reg(client, state, CH7006_PLL_CONTROL);
 +	ch7006_load_reg(client, state, CH7006_CALC_SUBC_INC0);
-+
-+	/* I don't know what this is for, but otherwise I get no
-+	 * signal.
-+	 */
-+	ch7006_write(client, 0x3d, 0x0);
 +}
 +
 +void ch7006_state_save(struct i2c_client *client,
@@ -8129,10 +8129,10 @@ index 0000000..1d5f10b
 +#endif
 diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
 new file mode 100644
-index 0000000..8d1383a
+index 0000000..f067fc3
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
-@@ -0,0 +1,663 @@
+@@ -0,0 +1,661 @@
 +/*
 + * Copyright 2007 Dave Airlied
 + * All Rights Reserved.
@@ -8572,11 +8572,8 @@ index 0000000..8d1383a
 +	int ret;
 +
 +	chan = nvbo->channel;
-+	if (!chan || nvbo->tile_flags || nvbo->no_vm) {
++	if (!chan || nvbo->tile_flags || nvbo->no_vm)
 +		chan = dev_priv->channel;
-+		if (!chan)
-+			return -EINVAL;
-+	}
 +
 +	src_offset = old_mem->mm_node->start << PAGE_SHIFT;
 +	dst_offset = new_mem->mm_node->start << PAGE_SHIFT;
@@ -8733,7 +8730,8 @@ index 0000000..8d1383a
 +			return ret;
 +	}
 +
-+	if (dev_priv->init_state != NOUVEAU_CARD_INIT_DONE)
++	if (dev_priv->init_state != NOUVEAU_CARD_INIT_DONE ||
++	    !dev_priv->channel)
 +		return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem);
 +
 +	if (old_mem->mem_type == TTM_PL_SYSTEM && !bo->ttm) {
@@ -11392,7 +11390,7 @@ index 0000000..04e85d8
 +#endif
 diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
 new file mode 100644
-index 0000000..d8de3f6
+index 0000000..e0e8e84
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
 @@ -0,0 +1,413 @@
@@ -11675,7 +11673,7 @@ index 0000000..d8de3f6
 +
 +		for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
 +			chan = dev_priv->fifos[i];
-+			if (!chan)
++			if (!chan || !chan->pushbuf_bo)
 +				continue;
 +
 +			for (j = 0; j < NOUVEAU_DMA_SKIPS; j++)
@@ -13212,10 +13210,10 @@ index 0000000..4a3f31a
 +#endif /* __NOUVEAU_FB_H__ */
 diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
 new file mode 100644
-index 0000000..36e8c5e
+index 0000000..d860bdc
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
-@@ -0,0 +1,380 @@
+@@ -0,0 +1,382 @@
 +/*
 + * Copyright © 2007 David Airlie
 + *
@@ -13276,7 +13274,7 @@ index 0000000..36e8c5e
 +	struct nouveau_channel *chan = dev_priv->channel;
 +	int ret, i;
 +
-+	if (!chan->accel_done ||
++	if (!chan || !chan->accel_done ||
 +	    info->state != FBINFO_STATE_RUNNING ||
 +	    info->flags & FBINFO_HWACCEL_DISABLED)
 +		return 0;
@@ -13536,14 +13534,16 @@ index 0000000..36e8c5e
 +	par->nouveau_fb = nouveau_fb;
 +	par->dev = dev;
 +
-+	switch (dev_priv->card_type) {
-+	case NV_50:
-+		nv50_fbcon_accel_init(info);
-+		break;
-+	default:
-+		nv04_fbcon_accel_init(info);
-+		break;
-+	};
++	if (dev_priv->channel) {
++		switch (dev_priv->card_type) {
++		case NV_50:
++			nv50_fbcon_accel_init(info);
++			break;
++		default:
++			nv04_fbcon_accel_init(info);
++			break;
++		};
++	}
 +
 +	nouveau_fbcon_zfill(dev);
 +
@@ -20760,10 +20760,10 @@ index 0000000..4c7f1e4
 +}
 diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
 new file mode 100644
-index 0000000..0de87b8
+index 0000000..27c4d48
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nouveau_state.c
-@@ -0,0 +1,865 @@
+@@ -0,0 +1,919 @@
 +/*
 + * Copyright 2005 Stephane Marchesin
 + * Copyright 2008 Stuart Bennett
@@ -20790,11 +20790,12 @@ index 0000000..0de87b8
 + */
 +
 +#include <linux/swab.h>
-+
 +#include "drmP.h"
 +#include "drm.h"
 +#include "drm_sarea.h"
 +#include "drm_crtc_helper.h"
++#include <linux/vgaarb.h>
++
 +#include "nouveau_drv.h"
 +#include "nouveau_drm.h"
 +#include "nv50_display.h"
@@ -21098,12 +21099,67 @@ index 0000000..0de87b8
 +	return 0;
 +}
 +
++static unsigned int
++nouveau_vga_set_decode(void *priv, bool state)
++{
++	if (state)
++		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
++		       VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
++	else
++		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
++}
++
++static int
++nouveau_card_init_channel(struct drm_device *dev)
++{
++	struct drm_nouveau_private *dev_priv = dev->dev_private;
++	struct nouveau_gpuobj *gpuobj;
++	int ret;
++
++	ret = nouveau_channel_alloc(dev, &dev_priv->channel,
++				    (struct drm_file *)-2,
++				    NvDmaFB, NvDmaTT);
++	if (ret)
++		return ret;
++
++	gpuobj = NULL;
++	ret = nouveau_gpuobj_dma_new(dev_priv->channel, NV_CLASS_DMA_IN_MEMORY,
++				     0, nouveau_mem_fb_amount(dev),
++				     NV_DMA_ACCESS_RW, NV_DMA_TARGET_VIDMEM,
++				     &gpuobj);
++	if (ret)
++		goto out_err;
++
++	ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, NvDmaVRAM,
++				     gpuobj, NULL);
++	if (ret)
++		goto out_err;
++
++	gpuobj = NULL;
++	ret = nouveau_gpuobj_gart_dma_new(dev_priv->channel, 0,
++					  dev_priv->gart_info.aper_size,
++					  NV_DMA_ACCESS_RW, &gpuobj, NULL);
++	if (ret)
++		goto out_err;
++
++	ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, NvDmaGART,
++				     gpuobj, NULL);
++	if (ret)
++		goto out_err;
++
++	return 0;
++out_err:
++	nouveau_gpuobj_del(dev, &gpuobj);
++	nouveau_channel_free(dev_priv->channel);
++	dev_priv->channel = NULL;
++	return ret;
++}
++
 +int
 +nouveau_card_init(struct drm_device *dev)
 +{
 +	struct drm_nouveau_private *dev_priv = dev->dev_private;
 +	struct nouveau_engine *engine;
-+	struct nouveau_gpuobj *gpuobj;
 +	int ret;
 +
 +	NV_DEBUG(dev, "prev state = %d\n", dev_priv->init_state);
@@ -21111,10 +21167,12 @@ index 0000000..0de87b8
 +	if (dev_priv->init_state == NOUVEAU_CARD_INIT_DONE)
 +		return 0;
 +
++	vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode);
++
 +	/* Initialise internal driver API hooks */
 +	ret = nouveau_init_engine_ptrs(dev);
 +	if (ret)
-+		return ret;
++		goto out;
 +	engine = &dev_priv->engine;
 +	dev_priv->init_state = NOUVEAU_CARD_INIT_FAILED;
 +
@@ -21122,12 +21180,12 @@ index 0000000..0de87b8
 +	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
 +		ret = nouveau_bios_init(dev);
 +		if (ret)
-+			return ret;
++			goto out;
 +	}
 +
 +	ret = nouveau_gpuobj_early_init(dev);
 +	if (ret)
-+		return ret;
++		goto out_bios;
 +
 +	/* Initialise instance memory, must happen before mem_init so we
 +	 * know exactly how much VRAM we're able to use for "normal"
@@ -21135,100 +21193,68 @@ index 0000000..0de87b8
 +	 */
 +	ret = engine->instmem.init(dev);
 +	if (ret)
-+		return ret;
++		goto out_gpuobj_early;
 +
 +	/* Setup the memory manager */
 +	ret = nouveau_mem_init(dev);
 +	if (ret)
-+		return ret;
++		goto out_instmem;
 +
 +	ret = nouveau_gpuobj_init(dev);
 +	if (ret)
-+		return ret;
++		goto out_mem;
 +
 +	/* PMC */
 +	ret = engine->mc.init(dev);
 +	if (ret)
-+		return ret;
++		goto out_gpuobj;
 +
 +	/* PTIMER */
 +	ret = engine->timer.init(dev);
 +	if (ret)
-+		return ret;
++		goto out_mc;
 +
 +	/* PFB */
 +	ret = engine->fb.init(dev);
 +	if (ret)
-+		return ret;
++		goto out_timer;
 +
 +	/* PGRAPH */
 +	ret = engine->graph.init(dev);
 +	if (ret)
-+		return ret;
++		goto out_fb;
 +
 +	/* PFIFO */
 +	ret = engine->fifo.init(dev);
 +	if (ret)
-+		return ret;
++		goto out_graph;
 +
 +	/* this call irq_preinstall, register irq handler and
 +	 * call irq_postinstall
 +	 */
 +	ret = drm_irq_install(dev);
 +	if (ret)
-+		return ret;
++		goto out_fifo;
 +
 +	ret = drm_vblank_init(dev, 0);
 +	if (ret)
-+		return ret;
++		goto out_irq;
 +
 +	/* what about PVIDEO/PCRTC/PRAMDAC etc? */
 +
-+	ret = nouveau_channel_alloc(dev, &dev_priv->channel,
-+				    (struct drm_file *)-2,
-+				    NvDmaFB, NvDmaTT);
-+	if (ret)
-+		return ret;
-+
-+	gpuobj = NULL;
-+	ret = nouveau_gpuobj_dma_new(dev_priv->channel, NV_CLASS_DMA_IN_MEMORY,
-+				     0, nouveau_mem_fb_amount(dev),
-+				     NV_DMA_ACCESS_RW, NV_DMA_TARGET_VIDMEM,
-+				     &gpuobj);
-+	if (ret)
-+		return ret;
-+
-+	ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, NvDmaVRAM,
-+				     gpuobj, NULL);
-+	if (ret) {
-+		nouveau_gpuobj_del(dev, &gpuobj);
-+		return ret;
-+	}
-+
-+	gpuobj = NULL;
-+	ret = nouveau_gpuobj_gart_dma_new(dev_priv->channel, 0,
-+					  dev_priv->gart_info.aper_size,
-+					  NV_DMA_ACCESS_RW, &gpuobj, NULL);
-+	if (ret)
-+		return ret;
-+
-+	ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, NvDmaGART,
-+				     gpuobj, NULL);
-+	if (ret) {
-+		nouveau_gpuobj_del(dev, &gpuobj);
-+		return ret;
++	if (!engine->graph.accel_blocked) {
++		ret = nouveau_card_init_channel(dev);
++		if (ret)
++			goto out_irq;
 +	}
 +
 +	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-+		if (dev_priv->card_type >= NV_50) {
++		if (dev_priv->card_type >= NV_50)
 +			ret = nv50_display_create(dev);
-+			if (ret)
-+				return ret;
-+		} else {
++		else
 +			ret = nv04_display_create(dev);
-+			if (ret)
-+				return ret;
-+		}
++		if (ret)
++			goto out_irq;
 +	}
 +
 +	ret = nouveau_backlight_init(dev);
@@ -21241,6 +21267,32 @@ index 0000000..0de87b8
 +		drm_helper_initial_config(dev);
 +
 +	return 0;
++
++out_irq:
++	drm_irq_uninstall(dev);
++out_fifo:
++	engine->fifo.takedown(dev);
++out_graph:
++	engine->graph.takedown(dev);
++out_fb:
++	engine->fb.takedown(dev);
++out_timer:
++	engine->timer.takedown(dev);
++out_mc:
++	engine->mc.takedown(dev);
++out_gpuobj:
++	nouveau_gpuobj_takedown(dev);
++out_mem:
++	nouveau_mem_close(dev);
++out_instmem:
++	engine->instmem.takedown(dev);
++out_gpuobj_early:
++	nouveau_gpuobj_late_takedown(dev);
++out_bios:
++	nouveau_bios_takedown(dev);
++out:
++	vga_client_register(dev->pdev, NULL, NULL, NULL);
++	return ret;
 +}
 +
 +static void nouveau_card_takedown(struct drm_device *dev)
@@ -21279,6 +21331,8 @@ index 0000000..0de87b8
 +		nouveau_gpuobj_late_takedown(dev);
 +		nouveau_bios_takedown(dev);
 +
++		vga_client_register(dev->pdev, NULL, NULL, NULL);
++
 +		dev_priv->init_state = NOUVEAU_CARD_INIT_DOWN;
 +	}
 +}
@@ -24938,7 +24992,7 @@ index 0000000..0c3cd53
 +
 diff --git a/drivers/gpu/drm/nouveau/nv04_graph.c b/drivers/gpu/drm/nouveau/nv04_graph.c
 new file mode 100644
-index 0000000..396ee92
+index 0000000..d561d77
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nv04_graph.c
 @@ -0,0 +1,579 @@
@@ -25487,7 +25541,7 @@ index 0000000..396ee92
 +
 +	nv_wi32(dev, instance, tmp);
 +	nv_wr32(dev, NV04_PGRAPH_CTX_SWITCH1, tmp);
-+	nv_wr32(dev, NV04_PGRAPH_CTX_CACHE1 + subc, tmp);
++	nv_wr32(dev, NV04_PGRAPH_CTX_CACHE1 + (subc<<2), tmp);
 +	return 0;
 +}
 +
@@ -34247,10 +34301,10 @@ index 0000000..fb5838e
 +
 diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
 new file mode 100644
-index 0000000..dd4bff2
+index 0000000..281e65c
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nv50_display.c
-@@ -0,0 +1,998 @@
+@@ -0,0 +1,1012 @@
 +/*
 + * Copyright (C) 2008 Maarten Maathuis.
 + * All Rights Reserved.
@@ -34872,11 +34926,8 @@ index 0000000..dd4bff2
 +	 */
 +	NV_DEBUG(dev, "0x610030: 0x%08x\n", unk30);
 +	head = ffs((unk30 >> 9) & 3) - 1;
-+	if (head < 0) {
-+		NV_ERROR(dev, "no active heads: 0x%08x\n",
-+						nv_rd32(dev, 0x610030));
++	if (head < 0)
 +		return -EINVAL;
-+	}
 +
 +	/* This assumes CRTCs are never bound to multiple encoders, which
 +	 * should be the case.
@@ -34946,9 +34997,21 @@ index 0000000..dd4bff2
 +			   int pxclk)
 +{
 +	struct drm_nouveau_private *dev_priv = dev->dev_private;
++	struct nouveau_connector *nv_connector = NULL;
++	struct drm_encoder *encoder;
 +	struct nvbios *bios = &dev_priv->VBIOS;
 +	uint32_t mc, script = 0, or;
 +
++	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
++		struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
++
++		if (nv_encoder->dcb != dcbent)
++			continue;
++
++		nv_connector = nouveau_encoder_connector_get(nv_encoder);
++		break;
++	}
++
 +	or = ffs(dcbent->or) - 1;
 +	mc = nv50_display_mode_ctrl(dev, dcbent->type != OUTPUT_ANALOG, or);
 +	switch (dcbent->type) {
@@ -34967,6 +35030,11 @@ index 0000000..dd4bff2
 +			} else
 +			if (bios->fp.strapless_is_24bit & 1)
 +				script |= 0x0200;
++
++			if (nv_connector && nv_connector->edid &&
++			    (nv_connector->edid->revision >= 4) &&
++			    (nv_connector->edid->input & 0x70) >= 0x20)
++				script |= 0x0200;
 +		}
 +
 +		if (nouveau_uscript_lvds >= 0) {
@@ -35701,7 +35769,7 @@ index 0000000..6bcc6d3
 +
 diff --git a/drivers/gpu/drm/nouveau/nv50_fifo.c b/drivers/gpu/drm/nouveau/nv50_fifo.c
 new file mode 100644
-index 0000000..77ae1aa
+index 0000000..b728228
 --- /dev/null
 +++ b/drivers/gpu/drm/nouveau/nv50_fifo.c
 @@ -0,0 +1,494 @@
@@ -36123,7 +36191,7 @@ index 0000000..77ae1aa
 +	NV_DEBUG(dev, "\n");
 +
 +	chid = pfifo->channel_id(dev);
-+	if (chid < 0 || chid >= dev_priv->engine.fifo.channels)
++	if (chid < 1 || chid >= dev_priv->engine.fifo.channels - 1)
 +		return 0;
 +
 +	chan = dev_priv->fifos[chid];


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-12/kernel.spec,v
retrieving revision 1.1958
retrieving revision 1.1959
diff -u -p -r1.1958 -r1.1959
--- kernel.spec	19 Dec 2009 03:06:00 -0000	1.1958
+++ kernel.spec	21 Dec 2009 04:26:26 -0000	1.1959
@@ -2139,6 +2139,13 @@ fi
 # and build.
 
 %changelog
+* Mon Dec 21 2009 Ben Skeggs <bskeggs at redhat.com> 2.6.31.9-173
+- nouveau: fix dim panel issues on certain laptops (rh#547554)
+- nouveau: fix some issues when running without ctxprogs
+- nouveau: fix error handling in init paths
+- nouveau: add vga arbitration hooks
+- nouveau: fix nv04 sw methods
+
 * Fri Dec 18 2009 Kyle McMartin <kyle at redhat.com> 2.6.31.9-172
 - stable update 2.6.31.9
 




More information about the fedora-extras-commits mailing list