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;
 

Reply via email to