rpms/kernel/F-11 drm-intel-i8xx-cursors.patch, NONE, 1.1 drm-intel-vmalloc.patch, NONE, 1.1 kernel.spec, 1.1616, 1.1617

Kristian Høgsberg krh at fedoraproject.org
Wed May 20 21:02:56 UTC 2009


Author: krh

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

Modified Files:
	kernel.spec 
Added Files:
	drm-intel-i8xx-cursors.patch drm-intel-vmalloc.patch 
Log Message:
* Wed May 20 2009  <krh at redhat.com> - 2.6.29.3-155
- Add drm-intel-i8xx-cursors.patch to fix cursors on i8xx desktop
  chipsets (#488980).
- Add drm-intel-vmalloc.patch as part of the fix for #498131.


drm-intel-i8xx-cursors.patch:

--- NEW FILE drm-intel-i8xx-cursors.patch ---
diff -up linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_reg.h.8xx-cursor linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_reg.h
--- linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_reg.h.8xx-cursor	2009-05-20 10:17:18.000000000 -0400
+++ linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_reg.h	2009-05-20 12:06:55.000000000 -0400
@@ -1409,9 +1409,25 @@
 
 /* Cursor A & B regs */
 #define CURACNTR		0x70080
+/* Old style CUR*CNTR flags (desktop 8xx) */
+#define   CURSOR_ENABLE		0x80000000
+#define   CURSOR_GAMMA_ENABLE	0x40000000
+#define   CURSOR_STRIDE_MASK	0x30000000
+#define   CURSOR_FORMAT_SHIFT	24
+#define   CURSOR_FORMAT_MASK	(0x07 << CURSOR_FORMAT_SHIFT)
+#define   CURSOR_FORMAT_2C	(0x00 << CURSOR_FORMAT_SHIFT)
+#define   CURSOR_FORMAT_3C	(0x01 << CURSOR_FORMAT_SHIFT)
+#define   CURSOR_FORMAT_4C	(0x02 << CURSOR_FORMAT_SHIFT)
+#define   CURSOR_FORMAT_ARGB	(0x04 << CURSOR_FORMAT_SHIFT)
+#define   CURSOR_FORMAT_XRGB	(0x05 << CURSOR_FORMAT_SHIFT)
+/* New style CUR*CNTR flags */
+#define   CURSOR_MODE		0x27
 #define   CURSOR_MODE_DISABLE   0x00
 #define   CURSOR_MODE_64_32B_AX 0x07
 #define   CURSOR_MODE_64_ARGB_AX ((1 << 5) | CURSOR_MODE_64_32B_AX)
+#define   MCURSOR_PIPE_SELECT	(1 << 28)
+#define   MCURSOR_PIPE_A	0x00
+#define   MCURSOR_PIPE_B	(1 << 28)
 #define   MCURSOR_GAMMA_ENABLE  (1 << 26)
 #define CURABASE		0x70084
 #define CURAPOS			0x70088
@@ -1419,6 +1435,7 @@
 #define   CURSOR_POS_SIGN       0x8000
 #define   CURSOR_X_SHIFT        0
 #define   CURSOR_Y_SHIFT        16
+#define CURSIZE			0x700a0
 #define CURBCNTR		0x700c0
 #define CURBBASE		0x700c4
 #define CURBPOS			0x700c8
diff -up linux-2.6.29.noarch/drivers/gpu/drm/i915/intel_display.c.8xx-cursor linux-2.6.29.noarch/drivers/gpu/drm/i915/intel_display.c
--- linux-2.6.29.noarch/drivers/gpu/drm/i915/intel_display.c.8xx-cursor	2009-05-20 10:17:18.000000000 -0400
+++ linux-2.6.29.noarch/drivers/gpu/drm/i915/intel_display.c	2009-05-20 12:09:46.000000000 -0400
@@ -1361,7 +1361,7 @@ static int intel_crtc_cursor_set(struct 
 	int pipe = intel_crtc->pipe;
 	uint32_t control = (pipe == 0) ? CURACNTR : CURBCNTR;
 	uint32_t base = (pipe == 0) ? CURABASE : CURBBASE;
-	uint32_t temp;
+	uint32_t temp = I915_READ(control);
 	size_t addr;
 	int ret;
 
@@ -1370,7 +1370,13 @@ static int intel_crtc_cursor_set(struct 
 	/* if we want to turn off the cursor ignore width and height */
 	if (!handle) {
 		DRM_DEBUG("cursor off\n");
-		temp = CURSOR_MODE_DISABLE;
+		if (IS_MOBILE(dev) || IS_I9XX(dev)) {
+			temp &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
+			temp |= CURSOR_MODE_DISABLE;
+		}
+		else {
+			temp &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE);
+		}
 		addr = 0;
 		bo = NULL;
 		mutex_lock(&dev->struct_mutex);
@@ -1413,10 +1419,20 @@ static int intel_crtc_cursor_set(struct 
 		addr = obj_priv->phys_obj->handle->busaddr;
 	}
 
-	temp = 0;
-	/* set the pipe for the cursor */
-	temp |= (pipe << 28);
-	temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
+	if (!IS_I9XX(dev))
+		I915_WRITE(CURSIZE, (height << 12) | width);
+
+	/* Hooray for CUR*CNTR differences */
+	if (IS_MOBILE(dev) || IS_I9XX(dev)) {
+		temp &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
+		temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
+		temp |= (pipe << 28); /* Connect to correct pipe */
+	}
+	else {
+		temp &= ~(CURSOR_FORMAT_MASK);
+		temp |= CURSOR_ENABLE;
+		temp |= CURSOR_FORMAT_ARGB | CURSOR_GAMMA_ENABLE;
+	}
 
  finish:
 	I915_WRITE(control, temp);

drm-intel-vmalloc.patch:

--- NEW FILE drm-intel-vmalloc.patch ---
diff -up linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_gem.c.drm-vmalloc linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_gem.c
--- linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_gem.c.drm-vmalloc	2009-05-20 10:04:32.000000000 -0400
+++ linux-2.6.29.noarch/drivers/gpu/drm/i915/i915_gem.c	2009-05-20 10:10:59.000000000 -0400
@@ -278,7 +278,7 @@ i915_gem_shmem_pread_slow(struct drm_dev
 	last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE;
 	num_pages = last_data_page - first_data_page + 1;
 
-	user_pages = kcalloc(num_pages, sizeof(struct page *), GFP_KERNEL);
+	user_pages = drm_calloc_large(num_pages, sizeof(struct page *));
 	if (user_pages == NULL)
 		return -ENOMEM;
 
@@ -347,7 +347,7 @@ fail_put_user_pages:
 		SetPageDirty(user_pages[i]);
 		page_cache_release(user_pages[i]);
 	}
-	kfree(user_pages);
+	drm_free_large(user_pages);
 
 	return ret;
 }
@@ -562,7 +562,7 @@ i915_gem_gtt_pwrite_slow(struct drm_devi
 	last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE;
 	num_pages = last_data_page - first_data_page + 1;
 
-	user_pages = kcalloc(num_pages, sizeof(struct page *), GFP_KERNEL);
+	user_pages = drm_calloc_large(num_pages, sizeof(struct page *));
 	if (user_pages == NULL)
 		return -ENOMEM;
 
@@ -632,7 +632,7 @@ out_unlock:
 out_unpin_pages:
 	for (i = 0; i < pinned_pages; i++)
 		page_cache_release(user_pages[i]);
-	kfree(user_pages);
+	drm_free_large(user_pages);
 
 	return ret;
 }
@@ -736,7 +736,7 @@ i915_gem_shmem_pwrite_slow(struct drm_de
 	last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE;
 	num_pages = last_data_page - first_data_page + 1;
 
-	user_pages = kcalloc(num_pages, sizeof(struct page *), GFP_KERNEL);
+	user_pages = drm_calloc_large(num_pages, sizeof(struct page *));
 	if (user_pages == NULL)
 		return -ENOMEM;
 
@@ -803,7 +803,7 @@ fail_unlock:
 fail_put_user_pages:
 	for (i = 0; i < pinned_pages; i++)
 		page_cache_release(user_pages[i]);
-	kfree(user_pages);
+	drm_free_large(user_pages);
 
 	return ret;
 }
@@ -1304,9 +1304,7 @@ i915_gem_object_put_pages(struct drm_gem
 		}
 	obj_priv->dirty = 0;
 
-	drm_free(obj_priv->pages,
-		 page_count * sizeof(struct page *),
-		 DRM_MEM_DRIVER);
+	drm_free_large(obj_priv->pages);
 	obj_priv->pages = NULL;
 }
 
@@ -1900,8 +1898,7 @@ i915_gem_object_get_pages(struct drm_gem
 	 */
 	page_count = obj->size / PAGE_SIZE;
 	BUG_ON(obj_priv->pages != NULL);
-	obj_priv->pages = drm_calloc(page_count, sizeof(struct page *),
-				     DRM_MEM_DRIVER);
+	obj_priv->pages = drm_calloc_large(page_count, sizeof(struct page *));
 	if (obj_priv->pages == NULL) {
 		DRM_ERROR("Faled to allocate page list\n");
 		obj_priv->pages_refcount--;
@@ -2983,7 +2980,7 @@ i915_gem_get_relocs_from_user(struct drm
 		reloc_count += exec_list[i].relocation_count;
 	}
 
-	*relocs = drm_calloc(reloc_count, sizeof(**relocs), DRM_MEM_DRIVER);
+	*relocs = drm_calloc_large(reloc_count, sizeof(**relocs));
 	if (*relocs == NULL)
 		return -ENOMEM;
 
@@ -2997,8 +2994,7 @@ i915_gem_get_relocs_from_user(struct drm
 				     exec_list[i].relocation_count *
 				     sizeof(**relocs));
 		if (ret != 0) {
-			drm_free(*relocs, reloc_count * sizeof(**relocs),
-				 DRM_MEM_DRIVER);
+			drm_free_large(*relocs);
 			*relocs = NULL;
 			return ret;
 		}
@@ -3032,7 +3028,7 @@ i915_gem_put_relocs_to_user(struct drm_i
 		reloc_count += exec_list[i].relocation_count;
 	}
 
-	drm_free(relocs, reloc_count * sizeof(*relocs), DRM_MEM_DRIVER);
+	drm_free_large(relocs);
 
 	return ret;
 }
@@ -3065,10 +3061,8 @@ i915_gem_execbuffer(struct drm_device *d
 		return -EINVAL;
 	}
 	/* Copy in the exec list from userland */
-	exec_list = drm_calloc(sizeof(*exec_list), args->buffer_count,
-			       DRM_MEM_DRIVER);
-	object_list = drm_calloc(sizeof(*object_list), args->buffer_count,
-				 DRM_MEM_DRIVER);
+	exec_list = drm_calloc_large(sizeof(*exec_list), args->buffer_count);
+	object_list = drm_calloc_large(sizeof(*object_list), args->buffer_count);
 	if (exec_list == NULL || object_list == NULL) {
 		DRM_ERROR("Failed to allocate exec or object list "
 			  "for %d buffers\n",
@@ -3332,10 +3326,8 @@ err:
 	}
 
 pre_mutex_err:
-	drm_free(object_list, sizeof(*object_list) * args->buffer_count,
-		 DRM_MEM_DRIVER);
-	drm_free(exec_list, sizeof(*exec_list) * args->buffer_count,
-		 DRM_MEM_DRIVER);
+	drm_free_large(object_list);
+	drm_free_large(exec_list);
 	drm_free(cliprects, sizeof(*cliprects) * args->num_cliprects,
 		 DRM_MEM_DRIVER);
 
diff -up linux-2.6.29.noarch/include/drm/drmP.h.drm-vmalloc linux-2.6.29.noarch/include/drm/drmP.h
--- linux-2.6.29.noarch/include/drm/drmP.h.drm-vmalloc	2009-05-20 10:04:32.000000000 -0400
+++ linux-2.6.29.noarch/include/drm/drmP.h	2009-05-20 10:09:10.000000000 -0400
@@ -1581,6 +1581,30 @@ static __inline__ void *drm_calloc(size_
 {
 	return kcalloc(nmemb, size, GFP_KERNEL);
 }
+
+static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
+{
+	u8 *addr;
+
+	if (size <= PAGE_SIZE)
+	    return kcalloc(nmemb, size, GFP_KERNEL);
+
+	addr = vmalloc(nmemb * size);
+	if (!addr)
+		return NULL;
+
+	memset(addr, 0, nmemb * size);
+
+	return addr;
+}
+
+static __inline void drm_free_large(void *ptr)
+{
+	if (!is_vmalloc_addr(ptr))
+		return kfree(ptr);
+
+	vfree(ptr);
+}
 #else
 extern void *drm_alloc(size_t size, int area);
 extern void drm_free(void *pt, size_t size, int area);


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-11/kernel.spec,v
retrieving revision 1.1616
retrieving revision 1.1617
diff -u -p -r1.1616 -r1.1617
--- kernel.spec	20 May 2009 14:20:00 -0000	1.1616
+++ kernel.spec	20 May 2009 21:02:25 -0000	1.1617
@@ -702,6 +702,8 @@ Patch1829: drm-edid-ignore-tiny-modes.pa
 Patch1830: linux-2.6.29.3-boot-vga.patch
 Patch1831: drm-intel-include-965gme-pci-id.patch
 Patch1832: drm-intel-gem-use-dma32-on-pae.patch
+Patch1833: drm-intel-i8xx-cursors.patch
+Patch1834: drm-intel-vmalloc.patch
 
 # kludge to make ich9 e1000 work
 Patch2000: linux-2.6-e1000-ich9.patch
@@ -1371,6 +1373,8 @@ ApplyPatch drm-edid-ignore-tiny-modes.pa
 ApplyPatch drm-intel-include-965gme-pci-id.patch
 ApplyPatch linux-2.6.29.3-boot-vga.patch
 ApplyPatch drm-intel-gem-use-dma32-on-pae.patch
+ApplyPatch drm-intel-i8xx-cursors.patch
+ApplyPatch drm-intel-vmalloc.patch
 
 # linux1394 git patches
 ApplyPatch linux-2.6-firewire-git-update.patch
@@ -1995,6 +1999,11 @@ fi
 # and build.
 
 %changelog
+* Wed May 20 2009  <krh at redhat.com> - 2.6.29.3-155
+- Add drm-intel-i8xx-cursors.patch to fix cursors on i8xx desktop
+  chipsets (#488980).
+- Add drm-intel-vmalloc.patch as part of the fix for #498131.
+
 * Wed May 20 2009 Kyle McMartin <kyle at redhat.com> 2.6.29.3-154
 - disable e820 backports, causes problems in some places, bz#499396.
   linux-2.6-e820-save-restore-edi-ebp.patch




More information about the scm-commits mailing list