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