Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 060e645a authored by Li Peng's avatar Li Peng Committed by Eric Anholt
Browse files

drm/i915: Fix OGLC performance regression on 945

He Shuang reported an OGLC performance regression introduced in the patch
"enable memory self refresh on 9xx", In that patch, SR on 945 is disabled
everytime when calling intel_mark_busy(), while too much of such operation
will impact performance. Actually disable SR is necessary only when GPU and
Crtc changing from idle to busy. This patch make such optimization.

It fixes upstream bug
http://bugs.freedesktop.org/show_bug.cgi?id=26422



Signed-off-by: default avatarLi Peng <peng.li@intel.com>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent b5b72e89
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -4060,6 +4060,7 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj)
	if (!drm_core_check_feature(dev, DRIVER_MODESET))
		return;

	if (!dev_priv->busy) {
		if (IS_I945G(dev) || IS_I945GM(dev)) {
			u32 fw_blc_self;

@@ -4068,10 +4069,8 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj)
			fw_blc_self &= ~FW_BLC_SELF_EN;
			I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK);
		}

	if (!dev_priv->busy)
		dev_priv->busy = true;
	else
	} else
		mod_timer(&dev_priv->idle_timer, jiffies +
			  msecs_to_jiffies(GPU_IDLE_TIMEOUT));

@@ -4083,6 +4082,14 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj)
		intel_fb = to_intel_framebuffer(crtc->fb);
		if (intel_fb->obj == obj) {
			if (!intel_crtc->busy) {
				if (IS_I945G(dev) || IS_I945GM(dev)) {
					u32 fw_blc_self;

					DRM_DEBUG_DRIVER("disable memory self refresh on 945\n");
					fw_blc_self = I915_READ(FW_BLC_SELF);
					fw_blc_self &= ~FW_BLC_SELF_EN;
					I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK);
				}
				/* Non-busy -> busy, upclock */
				intel_increase_pllclock(crtc, true);
				intel_crtc->busy = true;