Module Name: src
Committed By: snj
Date: Tue Aug 4 17:18:40 UTC 2015
Modified Files:
src/sys/external/bsd/drm2/dist/drm/i915 [netbsd-7]: i915_gem.c
Log Message:
Pull up following revision(s) (requested by tsutsui in ticket #931):
sys/external/bsd/drm2/dist/drm/i915/i915_gem.c: revision 1.32
Pull upstream fix to avoid kernel panic on starting X on Intel 855GM machines.
Reported in PR kern/49875, and ok'ed to commit by riastradh@.
To generate a diff of this commit:
cvs rdiff -u -r1.14.2.10 -r1.14.2.11 \
src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.14.2.10 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.14.2.11
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.14.2.10 Thu Jul 30 15:38:39 2015
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Tue Aug 4 17:18:39 2015
@@ -4390,6 +4390,15 @@ unlock:
static bool is_pin_display(struct drm_i915_gem_object *obj)
{
+ struct i915_vma *vma;
+
+ if (list_empty(&obj->vma_list))
+ return false;
+
+ vma = i915_gem_obj_to_ggtt(obj);
+ if (!vma)
+ return false;
+
/* There are 3 sources that pin objects:
* 1. The display engine (scanouts, sprites, cursors);
* 2. Reservations for execbuffer;
@@ -4401,7 +4410,7 @@ static bool is_pin_display(struct drm_i9
* subtracting the potential reference by the user, any pin_count
* remains, it must be due to another use by the display engine.
*/
- return i915_gem_obj_to_ggtt(obj)->pin_count - !!obj->user_pin_count;
+ return vma->pin_count - !!obj->user_pin_count;
}
/*
@@ -4415,6 +4424,7 @@ i915_gem_object_pin_to_display_plane(str
struct intel_ring_buffer *pipelined)
{
u32 old_read_domains, old_write_domain;
+ bool was_pin_display;
int ret;
if (pipelined != obj->ring) {
@@ -4426,6 +4436,7 @@ i915_gem_object_pin_to_display_plane(str
/* Mark the pin_display early so that we account for the
* display coherency whilst setting up the cache domains.
*/
+ was_pin_display = obj->pin_display;
obj->pin_display = true;
/* The display engine is not coherent with the LLC cache on gen6. As
@@ -4468,7 +4479,8 @@ i915_gem_object_pin_to_display_plane(str
return 0;
err_unpin_display:
- obj->pin_display = is_pin_display(obj);
+ WARN_ON(was_pin_display != is_pin_display(obj));
+ obj->pin_display = was_pin_display;
return ret;
}
@@ -5684,6 +5696,9 @@ struct i915_vma *i915_gem_obj_to_ggtt(st
{
struct i915_vma *vma;
+ /* This WARN has probably outlived its usefulness (callers already
+ * WARN if they don't find the GGTT vma they expect). When removing,
+ * remember to remove the pre-check in is_pin_display() as well */
if (WARN_ON(list_empty(&obj->vma_list)))
return NULL;