0903551
From a75a3c793e2cd3e7648597f2c77d87453f520f31 Mon Sep 17 00:00:00 2001
0903551
From: Fedora Kernel Team <kernel-team@fedoraproject.org>
0903551
Date: Mon, 20 Jun 2016 11:13:23 +0200
0903551
Subject: [PATCH 04/17] drm/i915/gen9: Allow calculation of data rate for
0903551
 in-flight state (v2)
0903551
0903551
Upstream: since drm-intel-next-2016-05-22
0903551
commit 9c74d82621c553f0da1f41bd5d90f5eab5659fdb
0903551
0903551
Author:     Matt Roper <matthew.d.roper@intel.com>
0903551
AuthorDate: Thu May 12 07:05:58 2016 -0700
0903551
Commit:     Matt Roper <matthew.d.roper@intel.com>
0903551
CommitDate: Fri May 13 07:32:49 2016 -0700
0903551
0903551
    drm/i915/gen9: Allow calculation of data rate for in-flight state (v2)
0903551
0903551
    Our skl_get_total_relative_data_rate() function gets passed a crtc state
0903551
    object to calculate the data rate for, but it currently always looks
0903551
    up the committed plane states that correspond to that CRTC.  Let's
0903551
    check whether the CRTC state is an in-flight state (meaning
0903551
    cstate->state is non-NULL) and if so, use the corresponding in-flight
0903551
    plane states.
0903551
0903551
    We'll soon be using this function exclusively for in-flight states; at
0903551
    that time we'll be able to simplify the function a bit, but for now we
0903551
    allow it to be used in either mode.
0903551
0903551
    v2:
0903551
     - Rebase on top of changes to cache plane data rates.
0903551
0903551
    Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
0903551
    Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
0903551
    Link: http://patchwork.freedesktop.org/patch/msgid/1463061971-19638-5-git-send-email-matthew.d.roper@intel.com
0903551
---
0903551
 drivers/gpu/drm/i915/intel_pm.c | 74 +++++++++++++++++++++++++++++++++--------
0903551
 1 file changed, 60 insertions(+), 14 deletions(-)
0903551
0903551
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
0903551
index 854f0a4..b863bfc 100644
0903551
--- a/drivers/gpu/drm/i915/intel_pm.c
0903551
+++ b/drivers/gpu/drm/i915/intel_pm.c
0903551
@@ -2914,25 +2914,69 @@ skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,
0903551
  *   3 * 4096 * 8192  * 4 < 2^32
0903551
  */
0903551
 static unsigned int
0903551
-skl_get_total_relative_data_rate(struct intel_crtc_state *cstate)
0903551
+skl_get_total_relative_data_rate(struct intel_crtc_state *intel_cstate)
0903551
 {
0903551
-	struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
0903551
-	struct drm_device *dev = intel_crtc->base.dev;
0903551
+	struct drm_crtc_state *cstate = &intel_cstate->base;
0903551
+	struct drm_atomic_state *state = cstate->state;
0903551
+	struct drm_crtc *crtc = cstate->crtc;
0903551
+	struct drm_device *dev = crtc->dev;
0903551
+	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
0903551
 	const struct intel_plane *intel_plane;
0903551
 	unsigned int rate, total_data_rate = 0;
0903551
+	int id;
0903551
 
0903551
 	/* Calculate and cache data rate for each plane */
0903551
-	for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
0903551
-		const struct drm_plane_state *pstate = intel_plane->base.state;
0903551
-		int id = skl_wm_plane_id(intel_plane);
0903551
+	/*
0903551
+	 * FIXME: At the moment this function can be called on either an
0903551
+	 * in-flight or a committed state object.  If it's in-flight then we
0903551
+	 * only want to re-calculate the plane data rate for planes that are
0903551
+	 * part of the transaction (i.e., we don't want to grab any additional
0903551
+	 * plane states if we don't have to).  If we're operating on committed
0903551
+	 * state, we'll just go ahead and recalculate the plane data rate for
0903551
+	 * all planes.
0903551
+	 *
0903551
+	 * Once we finish moving our DDB allocation to the atomic check phase,
0903551
+	 * we'll only be calling this function on in-flight state objects, so
0903551
+	 * the 'else' branch here will go away.
0903551
+	 */
0903551
+	if (state) {
0903551
+		struct drm_plane *plane;
0903551
+		struct drm_plane_state *pstate;
0903551
+		int i;
0903551
+
0903551
+		for_each_plane_in_state(state, plane, pstate, i) {
0903551
+			intel_plane = to_intel_plane(plane);
0903551
+			id = skl_wm_plane_id(intel_plane);
0903551
+
0903551
+			if (intel_plane->pipe != intel_crtc->pipe)
0903551
+				continue;
0903551
+
0903551
+			/* packed/uv */
0903551
+			rate = skl_plane_relative_data_rate(intel_cstate,
0903551
+							    pstate, 0);
0903551
+			intel_cstate->wm.skl.plane_data_rate[id] = rate;
0903551
+
0903551
+			/* y-plane */
0903551
+			rate = skl_plane_relative_data_rate(intel_cstate,
0903551
+							    pstate, 1);
0903551
+			intel_cstate->wm.skl.plane_y_data_rate[id] = rate;
0903551
+		}
0903551
+	} else {
0903551
+		for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
0903551
+			const struct drm_plane_state *pstate =
0903551
+				intel_plane->base.state;
0903551
+			int id = skl_wm_plane_id(intel_plane);
0903551
 
0903551
-		/* packed/uv */
0903551
-		rate = skl_plane_relative_data_rate(cstate, pstate, 0);
0903551
-		cstate->wm.skl.plane_data_rate[id] = rate;
0903551
+			/* packed/uv */
0903551
+			rate = skl_plane_relative_data_rate(intel_cstate,
0903551
+							    pstate, 0);
0903551
+			intel_cstate->wm.skl.plane_data_rate[id] = rate;
0903551
 
0903551
-		/* y-plane */
0903551
-		rate = skl_plane_relative_data_rate(cstate, pstate, 1);
0903551
-		cstate->wm.skl.plane_y_data_rate[id] = rate;
0903551
+			/* y-plane */
0903551
+			rate = skl_plane_relative_data_rate(intel_cstate,
0903551
+							    pstate, 1);
0903551
+			intel_cstate->wm.skl.plane_y_data_rate[id] = rate;
0903551
+		}
0903551
 	}
0903551
 
0903551
 	/* Calculate CRTC's total data rate from cached values */
0903551
@@ -2940,10 +2984,12 @@ skl_get_total_relative_data_rate(struct intel_crtc_state *cstate)
0903551
 		int id = skl_wm_plane_id(intel_plane);
0903551
 
0903551
 		/* packed/uv */
0903551
-		total_data_rate += cstate->wm.skl.plane_data_rate[id];
0903551
-		total_data_rate += cstate->wm.skl.plane_y_data_rate[id];
0903551
+		total_data_rate += intel_cstate->wm.skl.plane_data_rate[id];
0903551
+		total_data_rate += intel_cstate->wm.skl.plane_y_data_rate[id];
0903551
 	}
0903551
 
0903551
+	WARN_ON(cstate->plane_mask && total_data_rate == 0);
0903551
+
0903551
 	return total_data_rate;
0903551
 }
0903551
 
0903551
-- 
0903551
2.7.4
0903551