rpms/kernel/F-9 linux-2.6-drm-modesetting-oops-fixes.patch, NONE, 1.1 kernel.spec, 1.626, 1.627

Dave Airlie (airlied) fedora-extras-commits at redhat.com
Wed Apr 23 06:49:17 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/kernel/F-9
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv26973

Modified Files:
	kernel.spec 
Added Files:
	linux-2.6-drm-modesetting-oops-fixes.patch 
Log Message:
* Wed Apr 23 2008 Dave Airlie <airlied at redhat.com>
- drm fixup oops in modesetting code and stable fixes for i915 code from upstream


linux-2.6-drm-modesetting-oops-fixes.patch:

--- NEW FILE linux-2.6-drm-modesetting-oops-fixes.patch ---
diff --git a/drivers/char/drm/drm_edid.c b/drivers/char/drm/drm_edid.c
index 41aa8f5..338a5f5 100644
--- a/drivers/char/drm/drm_edid.c
+++ b/drivers/char/drm/drm_edid.c
@@ -251,8 +251,10 @@ static int add_standard_modes(struct drm_output *output, struct edid *edid)
 			continue;
 
 		newmode = drm_mode_std(dev, &edid->standard_timings[i]);
-		drm_mode_probed_add(output, newmode);
-		modes++;
+		if (newmode) {
+			drm_mode_probed_add(output, newmode);
+			modes++;
+		}
 	}
 
 	return modes;
@@ -282,12 +284,14 @@ static int add_detailed_info(struct drm_output *output, struct edid *edid)
 		/* Detailed mode timing */
 		if (timing->pixel_clock) {
 			newmode = drm_mode_detailed(dev, timing);
-			/* First detailed mode is preferred */
-			if (i == 0 && edid->preferred_timing)
-				newmode->type |= DRM_MODE_TYPE_PREFERRED;
-			drm_mode_probed_add(output, newmode);
+			if (newmode) {
+				/* First detailed mode is preferred */
+				if (i == 0 && edid->preferred_timing)
+					newmode->type |= DRM_MODE_TYPE_PREFERRED;
+				drm_mode_probed_add(output, newmode);
 				     
-			modes++;
+				modes++;
+			}
 			continue;
 		}
 
@@ -312,8 +316,10 @@ static int add_detailed_info(struct drm_output *output, struct edid *edid)
 
 				std = &data->data.timings[j];
 				newmode = drm_mode_std(dev, std);
-				drm_mode_probed_add(output, newmode);
-				modes++;
+				if (newmode) {
+					drm_mode_probed_add(output, newmode);
+					modes++;
+				}
 			}
 			break;
 		default:
diff --git a/drivers/char/drm/i915_drv.h b/drivers/char/drm/i915_drv.h
index 9e4631a..98a0056 100644
--- a/drivers/char/drm/i915_drv.h
+++ b/drivers/char/drm/i915_drv.h
@@ -770,6 +770,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
 #define XY_MONO_SRC_COPY_IMM_BLT	((2<<29)|(0x71<<22)|5)
 #define XY_SRC_COPY_BLT_WRITE_ALPHA	(1<<21)
 #define XY_SRC_COPY_BLT_WRITE_RGB	(1<<20)
+#define XY_SRC_COPY_BLT_SRC_TILED      (1<<15)
+#define XY_SRC_COPY_BLT_DST_TILED      (1<<11)
 #define   BLT_DEPTH_8			(0<<24)
 #define   BLT_DEPTH_16_565		(1<<24)
 #define   BLT_DEPTH_16_1555		(2<<24)
diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c
index a0c747a..7c7e233 100644
--- a/drivers/char/drm/i915_irq.c
+++ b/drivers/char/drm/i915_irq.c
@@ -122,7 +122,7 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 				XY_SRC_COPY_BLT_WRITE_ALPHA |
 				XY_SRC_COPY_BLT_WRITE_RGB)
 			     : XY_SRC_COPY_BLT_CMD;
-	u32 pitchropcpp;
+	u32 ropcpp, src_pitch, dst_pitch;
 	RING_LOCALS;
 
 	DRM_DEBUG("\n");
@@ -147,12 +147,6 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 		if ((counter[pipe] - vbl_swap->sequence) > (1<<23))
 			continue;
 
-		master_priv = vbl_swap->minor->master->driver_priv;
-		sarea_priv = master_priv->sarea_priv;
-		
-		pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) |
-			(cpp << 23) | (1 << 24);
-
 		list_del(list);
 		dev_priv->swaps_pending--;
 
@@ -198,16 +192,6 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 
 	i915_kernel_lost_context(dev);
 
-	upper[0] = upper[1] = 0;
-	slice[0] = max(sarea_priv->planeA_h / nhits, 1);
-	slice[1] = max(sarea_priv->planeB_h / nhits, 1);
-	lower[0] = sarea_priv->planeA_y + slice[0];
-	lower[1] = sarea_priv->planeB_y + slice[0];
-
-	offsets[0] = sarea_priv->front_offset;
-	offsets[1] = sarea_priv->back_offset;
-	offsets[2] = sarea_priv->third_offset;
-	num_pages = sarea_priv->third_handle ? 3 : 2;
 
 	spin_lock(&dev->drw_lock);
 
@@ -221,8 +205,6 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 	     upper[1] = lower[1], lower[1] += slice[1]) {
 		int init_drawrect = 1;
 
-		if (i == nhits)
-			lower[0] = lower[1] = sarea_priv->height;
 
 		list_for_each(hit, &hits) {
 			drm_i915_vbl_swap_t *swap_hit =
@@ -236,24 +218,65 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 			if (!drw)
 				continue;
 
-			plane = swap_hit->plane;
-
 			if (swap_hit->flip) {
 				i915_dispatch_vsync_flip(dev, drw, plane);
 				continue;
 			}
 
-			if (init_drawrect) {
-				BEGIN_LP_RING(6);
+			master_priv = swap_hit->minor->master->driver_priv;
+			sarea_priv = master_priv->sarea_priv;
 
-				OUT_RING(GFX_OP_DRAWRECT_INFO);
-				OUT_RING(0);
-				OUT_RING(0);
-				OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-				OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-				OUT_RING(0);
+			src_pitch = sarea_priv->pitch * cpp;
+			dst_pitch = sarea_priv->pitch * cpp;
 
-				ADVANCE_LP_RING();
+			if (sarea_priv->front_tiled) {
+				cmd |= XY_SRC_COPY_BLT_DST_TILED;
+				dst_pitch >>=2;
+			}
+
+			if (sarea_priv->back_tiled) {
+				cmd |= XY_SRC_COPY_BLT_SRC_TILED;
+				src_pitch >>=2;
+			}
+
+			upper[0] = upper[1] = 0;
+			slice[0] = max(sarea_priv->planeA_h / nhits, 1);
+			slice[1] = max(sarea_priv->planeB_h / nhits, 1);
+			lower[0] = sarea_priv->planeA_y + slice[0];
+			lower[1] = sarea_priv->planeB_y + slice[0];
+
+			offsets[0] = sarea_priv->front_offset;
+			offsets[1] = sarea_priv->back_offset;
+			offsets[2] = sarea_priv->third_offset;
+			num_pages = sarea_priv->third_handle ? 3 : 2;
+			if (i == nhits)
+				lower[0] = lower[1] = sarea_priv->height;
+
+			ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
+
+			plane = swap_hit->plane;
+
+			if (init_drawrect) {
+				if (IS_I965G(dev)) {
+					BEGIN_LP_RING(4);
+
+					OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
+					OUT_RING(0);
+					OUT_RING(((sarea_priv->width - 1) & 0xffff) | ((sarea_priv->height - 1) << 16));
+					OUT_RING(0);
+					ADVANCE_LP_RING();
+				} else {
+					BEGIN_LP_RING(6);
+
+					OUT_RING(GFX_OP_DRAWRECT_INFO);
+					OUT_RING(0);
+					OUT_RING(0);
+					OUT_RING(sarea_priv->width | sarea_priv->height << 16);
+					OUT_RING(sarea_priv->width | sarea_priv->height << 16);
+					OUT_RING(0);
+
+					ADVANCE_LP_RING();
+				}
 
 				sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;
 
@@ -268,6 +291,8 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 				 (2 * plane)) & 0x3;
 			back = (front + 1) % num_pages;
 
+		
+
 			for (num_rects = drw->num_rects; num_rects--; rect++) {
 				int y1 = max(rect->y1, top);
 				int y2 = min(rect->y2, bottom);
@@ -278,12 +303,12 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 				BEGIN_LP_RING(8);
 
 				OUT_RING(cmd);
-				OUT_RING(pitchropcpp);
+				OUT_RING(ropcpp | dst_pitch);
 				OUT_RING((y1 << 16) | rect->x1);
 				OUT_RING((y2 << 16) | rect->x2);
 				OUT_RING(offsets[front]);
 				OUT_RING((y1 << 16) | rect->x1);
-				OUT_RING(pitchropcpp & 0xffff);
+				OUT_RING(src_pitch);
 				OUT_RING(offsets[back]);
 
 				ADVANCE_LP_RING();
@@ -709,6 +734,7 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
 	vbl_swap->plane = plane;
 	vbl_swap->sequence = swap->sequence;
 	vbl_swap->flip = (swap->seqtype & _DRM_VBLANK_FLIP);
+	vbl_swap->minor = file_priv->minor;
 
 	if (vbl_swap->flip)
 		swap->sequence++;
diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
index dd9bb45..33c6b72 100644
--- a/drivers/char/drm/radeon_cp.c
+++ b/drivers/char/drm/radeon_cp.c
@@ -1278,15 +1278,17 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
 	tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
 	RADEON_WRITE(RADEON_BUS_CNTL, tmp);
 
-	dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0;
-	RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
+	if (dev_priv->sarea_priv) {
+		dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0;
+		RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
 
-	dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0;
-	RADEON_WRITE(RADEON_LAST_DISPATCH_REG,
-		     dev_priv->sarea_priv->last_dispatch);
+		dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0;
+		RADEON_WRITE(RADEON_LAST_DISPATCH_REG,
+			     dev_priv->sarea_priv->last_dispatch);
 
-	dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0;
-	RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear);
+		dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0;
+		RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear);
+	}
 
 	radeon_do_wait_for_idle(dev_priv);
 


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-9/kernel.spec,v
retrieving revision 1.626
retrieving revision 1.627
diff -u -r1.626 -r1.627
--- kernel.spec	23 Apr 2008 00:35:58 -0000	1.626
+++ kernel.spec	23 Apr 2008 06:48:40 -0000	1.627
@@ -631,6 +631,7 @@
 Patch1806: linux-2.6-drm-i915-modeset.patch
 Patch1807: linux-2.6-drm-radeon-fix-oops.patch
 Patch1808: linux-2.6-drm-radeon-fix-oops2.patch
+Patch1809: linux-2.6-drm-modesetting-oops-fixes.patch
 
 # kludge to make ich9 e1000 work
 Patch2000: linux-2.6-e1000-ich9.patch
@@ -1166,6 +1167,7 @@
 ApplyPatch linux-2.6-drm-i915-modeset.patch
 ApplyPatch linux-2.6-drm-radeon-fix-oops.patch
 ApplyPatch linux-2.6-drm-radeon-fix-oops2.patch
+ApplyPatch linux-2.6-drm-modesetting-oops-fixes.patch
 
 # ext4dev stable patch queue, slated for 2.6.25
 #ApplyPatch linux-2.6-ext4-stable-queue.patch
@@ -1781,6 +1783,9 @@
 %kernel_variant_files -a /%{image_install_path}/xen*-%{KVERREL}.xen -e /etc/ld.so.conf.d/kernelcap-%{KVERREL}.xen.conf %{with_xen} xen
 
 %changelog
+* Wed Apr 23 2008 Dave Airlie <airlied at redhat.com>
+- drm fixup oops in modesetting code and stable fixes for i915 code from upstream
+
 * Tue Apr 22 2008 Chuck Ebbert <cebbert at redhat.com> 2.6.25-7
 - Enable machine check exception handling on x86_64.
 




More information about the fedora-extras-commits mailing list