Note that we rename them to 'target' since 'active' isn't really an
accurate term given that we're precomputing these well before they get
committed and become active.

Since we allocate a few CRTC states on the stack, also switch the 'wm'
struct here to be a union so that we're not wasting stack space with
other platforms' watermark values.

Signed-off-by: Matt Roper <matthew.d.ro...@intel.com>
---
 drivers/gpu/drm/i915/intel_drv.h | 44 ++++++++++++++++++++--------------------
 drivers/gpu/drm/i915/intel_pm.c  | 33 ++++++++++++++++++------------
 2 files changed, 42 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ea67093..4ae109c 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -319,6 +319,21 @@ struct intel_crtc_scaler_state {
        int scaler_id;
 };
 
+struct intel_pipe_wm {
+       struct intel_wm_level wm[5];
+       uint32_t linetime;
+       bool fbc_wm_enabled;
+       bool pipe_enabled;
+       bool sprites_enabled;
+       bool sprites_scaled;
+};
+
+struct skl_pipe_wm {
+       struct skl_wm_level wm[8];
+       struct skl_wm_level trans_wm;
+       uint32_t linetime;
+};
+
 struct intel_crtc_state {
        struct drm_crtc_state base;
 
@@ -447,15 +462,14 @@ struct intel_crtc_state {
        int pbn;
 
        struct intel_crtc_scaler_state scaler_state;
-};
 
-struct intel_pipe_wm {
-       struct intel_wm_level wm[5];
-       uint32_t linetime;
-       bool fbc_wm_enabled;
-       bool pipe_enabled;
-       bool sprites_enabled;
-       bool sprites_scaled;
+       struct {
+               /* final, target watermarks for state */
+               union {
+                       struct intel_pipe_wm ilk;
+                       struct skl_pipe_wm skl;
+               } target;
+       } wm;
 };
 
 struct intel_mmio_flip {
@@ -464,12 +478,6 @@ struct intel_mmio_flip {
        struct intel_crtc *crtc;
 };
 
-struct skl_pipe_wm {
-       struct skl_wm_level wm[8];
-       struct skl_wm_level trans_wm;
-       uint32_t linetime;
-};
-
 /*
  * Tracking of operations that need to be performed at the beginning/end of an
  * atomic commit, outside the atomic section where interrupts are disabled.
@@ -536,14 +544,6 @@ struct intel_crtc {
        bool cpu_fifo_underrun_disabled;
        bool pch_fifo_underrun_disabled;
 
-       /* per-pipe watermark state */
-       struct {
-               /* watermarks currently being used  */
-               struct intel_pipe_wm active;
-               /* SKL wm values currently in use */
-               struct skl_pipe_wm skl_active;
-       } wm;
-
        int scanline_offset;
 
        struct intel_crtc_atomic_commit atomic;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index c3b9f99..789b4fe 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2058,7 +2058,9 @@ static void ilk_compute_wm_config(struct drm_device *dev,
 
        /* Compute the currently _active_ config */
        for_each_intel_crtc(dev, intel_crtc) {
-               const struct intel_pipe_wm *wm = &intel_crtc->wm.active;
+               const struct intel_crtc_state *cstate =
+                       to_intel_crtc_state(intel_crtc->base.state);
+               const struct intel_pipe_wm *wm = &cstate->wm.target.ilk;
 
                if (!wm->pipe_enabled)
                        continue;
@@ -2198,7 +2200,9 @@ static void ilk_merge_wm_level(struct drm_device *dev,
        ret_wm->enable = true;
 
        for_each_intel_crtc(dev, intel_crtc) {
-               const struct intel_pipe_wm *active = &intel_crtc->wm.active;
+               const struct intel_crtc_state *cstate =
+                       to_intel_crtc_state(intel_crtc->base.state);
+               const struct intel_pipe_wm *active = &cstate->wm.target.ilk;
                const struct intel_wm_level *wm = &active->wm[level];
 
                if (!active->pipe_enabled)
@@ -2344,14 +2348,15 @@ static void ilk_compute_wm_results(struct drm_device 
*dev,
 
        /* LP0 register values */
        for_each_intel_crtc(dev, intel_crtc) {
+               const struct intel_crtc_state *cstate =
+                       to_intel_crtc_state(intel_crtc->base.state);
                enum pipe pipe = intel_crtc->pipe;
-               const struct intel_wm_level *r =
-                       &intel_crtc->wm.active.wm[0];
+               const struct intel_wm_level *r = &cstate->wm.target.ilk.wm[0];
 
                if (WARN_ON(!r->enable))
                        continue;
 
-               results->wm_linetime[pipe] = intel_crtc->wm.active.linetime;
+               results->wm_linetime[pipe] = cstate->wm.target.ilk.linetime;
 
                results->wm_pipe[pipe] =
                        (r->pri_val << WM0_PIPE_PLANE_SHIFT) |
@@ -3344,16 +3349,16 @@ static bool skl_update_pipe_wm(struct drm_crtc *crtc,
                               struct skl_ddb_allocation *ddb, /* out */
                               struct skl_pipe_wm *pipe_wm /* out */)
 {
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
 
        skl_compute_wm_pipe_parameters(crtc, params);
        skl_allocate_pipe_ddb(crtc, config, params, ddb);
        skl_compute_pipe_wm(crtc, ddb, params, pipe_wm);
 
-       if (!memcmp(&intel_crtc->wm.skl_active, pipe_wm, sizeof(*pipe_wm)))
+       if (!memcmp(&cstate->wm.target.skl, pipe_wm, sizeof(*pipe_wm)))
                return false;
 
-       intel_crtc->wm.skl_active = *pipe_wm;
+       cstate->wm.target.skl = *pipe_wm;
 
        return true;
 }
@@ -3505,15 +3510,15 @@ static void ilk_program_watermarks(struct 
drm_i915_private *dev_priv)
 static void ilk_update_wm(struct drm_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = to_i915(crtc->dev);
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
        struct intel_pipe_wm pipe_wm = {};
 
        ilk_compute_pipe_wm(crtc, NULL, &pipe_wm);
 
-       if (!memcmp(&intel_crtc->wm.active, &pipe_wm, sizeof(pipe_wm)))
+       if (!memcmp(&cstate->wm.target.ilk, &pipe_wm, sizeof(pipe_wm)))
                return;
 
-       intel_crtc->wm.active = pipe_wm;
+       cstate->wm.target.ilk = pipe_wm;
 
        ilk_program_watermarks(dev_priv);
 }
@@ -3590,7 +3595,8 @@ static void skl_pipe_wm_get_hw_state(struct drm_crtc 
*crtc)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct skl_wm_values *hw = &dev_priv->wm.skl_hw;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct skl_pipe_wm *active = &intel_crtc->wm.skl_active;
+       struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
+       struct skl_pipe_wm *active = &cstate->wm.target.skl;
        enum pipe pipe = intel_crtc->pipe;
        int level, i, max_level;
        uint32_t temp;
@@ -3653,7 +3659,8 @@ static void ilk_pipe_wm_get_hw_state(struct drm_crtc 
*crtc)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct ilk_wm_values *hw = &dev_priv->wm.hw;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_pipe_wm *active = &intel_crtc->wm.active;
+       struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
+       struct intel_pipe_wm *active = &cstate->wm.target.ilk;
        enum pipe pipe = intel_crtc->pipe;
        static const unsigned int wm0_pipe_reg[] = {
                [PIPE_A] = WM0_PIPEA_ILK,
-- 
1.8.5.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to