diff mbox

[05/16] drm/i915/gen9: Allow calculation of data rate for in-flight state

Message ID 1459475198-30094-6-git-send-email-matthew.d.roper@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Matt Roper April 1, 2016, 1:46 a.m. UTC
Our skl_get_total_relative_data_rate() function gets passed a crtc state
object to calculate the data rate for, but it currently always looks
up the committed plane states that correspond to that CRTC.  Let's
check whether the CRTC state is an in-flight state (meaning
cstate->state is non-NULL) and if so, use the corresponding in-flight
plane states.

We'll soon be using this function exclusively for in-flight states; at
that time we'll be able to simplify the function a bit, but for now we
allow it to be used in either mode.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
---
 drivers/gpu/drm/i915/intel_pm.c | 36 ++++++++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 8 deletions(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 1c3f772..e92513e 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2969,18 +2969,36 @@  skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,
 static unsigned int
 skl_get_total_relative_data_rate(const struct intel_crtc_state *cstate)
 {
-	struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
-	struct drm_device *dev = intel_crtc->base.dev;
-	const struct intel_plane *intel_plane;
+	struct drm_atomic_state *state = cstate->base.state;
+	struct drm_crtc *crtc = cstate->base.crtc;
+	struct drm_device *dev = crtc->dev;
+	struct drm_plane *plane;
 	unsigned int total_data_rate = 0;
 
-	for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
-		const struct drm_plane_state *pstate = intel_plane->base.state;
+	drm_for_each_plane_mask(plane, dev, cstate->base.plane_mask) {
+		struct drm_plane_state *pstate;
 
-		if (pstate->fb == NULL)
-			continue;
+		/*
+		 * FIXME: At the moment this function can be called on either
+		 * an in-flight or a committed state object.  If it's in-flight
+		 * we want to also use the in-flight plane state; otherwise
+		 * use the committed plane state.
+		 *
+		 * Once we finish moving our DDB allocation to the atomic check
+		 * phase, we'll only be calling this function on in-flight
+		 * state objects and should never see a NULL state here.
+		 */
+		if (state) {
+			pstate = drm_atomic_get_plane_state(state, plane);
+			if (IS_ERR(pstate))
+				return PTR_ERR(pstate);
+		} else {
+			pstate = plane->state;
+		}
 
-		if (intel_plane->base.type == DRM_PLANE_TYPE_CURSOR)
+		if (!to_intel_plane_state(pstate)->visible)
+			continue;
+		if (plane->type == DRM_PLANE_TYPE_CURSOR)
 			continue;
 
 		/* packed/uv */
@@ -2995,6 +3013,8 @@  skl_get_total_relative_data_rate(const struct intel_crtc_state *cstate)
 									1);
 	}
 
+	WARN_ON(cstate->base.plane_mask && total_data_rate == 0);
+
 	return total_data_rate;
 }