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

Matt Roper
2016-04-01T01:47:47Z

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 --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;