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;