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

Commit 9c928d16 authored by Jesse Barnes's avatar Jesse Barnes Committed by Eric Anholt
Browse files

drm/i915: disable FBC when more than one pipe is active

We're really supposed to do this to avoid trouble with underflows when
multiple planes are active.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=26987

.

Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Tested-by: default avatarfangxun <xunx.fang@intel.com>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent 127bd2ac
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -605,6 +605,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
		case FBC_NOT_TILED:
			seq_printf(m, "scanout buffer not tiled");
			break;
		case FBC_MULTIPLE_PIPES:
			seq_printf(m, "multiple pipes are enabled");
			break;
		default:
			seq_printf(m, "unknown reason");
		}
+1 −0
Original line number Diff line number Diff line
@@ -215,6 +215,7 @@ enum no_fbc_reason {
	FBC_MODE_TOO_LARGE, /* mode too large for compression */
	FBC_BAD_PLANE, /* fbc not supported on plane */
	FBC_NOT_TILED, /* buffer not tiled */
	FBC_MULTIPLE_PIPES, /* more than one pipe active */
};

enum intel_pch {
+15 −0
Original line number Diff line number Diff line
@@ -1180,8 +1180,12 @@ static void intel_update_fbc(struct drm_crtc *crtc,
	struct drm_framebuffer *fb = crtc->fb;
	struct intel_framebuffer *intel_fb;
	struct drm_i915_gem_object *obj_priv;
	struct drm_crtc *tmp_crtc;
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
	int plane = intel_crtc->plane;
	int crtcs_enabled = 0;

	DRM_DEBUG_KMS("\n");

	if (!i915_powersave)
		return;
@@ -1199,10 +1203,21 @@ static void intel_update_fbc(struct drm_crtc *crtc,
	 * If FBC is already on, we just have to verify that we can
	 * keep it that way...
	 * Need to disable if:
	 *   - more than one pipe is active
	 *   - changing FBC params (stride, fence, mode)
	 *   - new fb is too large to fit in compressed buffer
	 *   - going to an unsupported config (interlace, pixel multiply, etc.)
	 */
	list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) {
		if (tmp_crtc->enabled)
			crtcs_enabled++;
	}
	DRM_DEBUG_KMS("%d pipes active\n", crtcs_enabled);
	if (crtcs_enabled > 1) {
		DRM_DEBUG_KMS("more than one pipe active, disabling compression\n");
		dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES;
		goto out_disable;
	}
	if (intel_fb->obj->size > dev_priv->cfb_size) {
		DRM_DEBUG_KMS("framebuffer too large, disabling "
				"compression\n");