--- /dev/null
+From fd0fe6acf1dd88aabfbf383f7e4c16315387a7b7 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+Date: Wed, 4 Nov 2015 21:25:32 +0200
+Subject: drm/i915: get runtime PM reference around GEM set_caching IOCTL
+
+From: Imre Deak <imre.deak@intel.com>
+
+commit fd0fe6acf1dd88aabfbf383f7e4c16315387a7b7 upstream.
+
+After Damien's D3 fix I started to get runtime suspend residency for the
+first time and that revealed a breakage on the set_caching IOCTL path
+that accesses the HW but doesn't take an RPM ref. Fix this up.
+
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/1446665132-22491-1-git-send-email-imre.deak@intel.com
+Signed-off-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/i915/i915_gem.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -3655,6 +3655,7 @@ unlock:
+ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file)
+ {
++ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct drm_i915_gem_caching *args = data;
+ struct drm_i915_gem_object *obj;
+ enum i915_cache_level level;
+@@ -3674,9 +3675,11 @@ int i915_gem_set_caching_ioctl(struct dr
+ return -EINVAL;
+ }
+
++ intel_runtime_pm_get(dev_priv);
++
+ ret = i915_mutex_lock_interruptible(dev);
+ if (ret)
+- return ret;
++ goto rpm_put;
+
+ obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+ if (&obj->base == NULL) {
+@@ -3689,6 +3692,9 @@ int i915_gem_set_caching_ioctl(struct dr
+ drm_gem_object_unreference(&obj->base);
+ unlock:
+ mutex_unlock(&dev->struct_mutex);
++rpm_put:
++ intel_runtime_pm_put(dev_priv);
++
+ return ret;
+ }
+