From: Ville Syrjälä <ville.syrj...@linux.intel.com>

There is a bunch of global state that needs to be considered when
checking watermarks for validity. Move most of that to a new
structure intel_wm_config, to avoid having to pass around so
many variables.

One notable thing left out is the DDB partitioning information,
since we often anyway need to check the same watermarks against
both 1/2 and 5/6 DDB partitioning layouts.

Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_pm.c | 48 +++++++++++++++++++++--------------------
 1 file changed, 25 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2bdb0ae..43d05db 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2174,6 +2174,14 @@ struct hsw_wm_values {
        bool enable_fbc_wm;
 };
 
+/* used in computing the new watermarks state */
+struct intel_wm_config {
+       unsigned int pipes_active;
+       bool sprites_enabled;
+       bool sprites_scaled;
+       bool fbc_wm_enabled;
+};
+
 /* For both WM_PIPE and WM_LP. */
 static uint32_t ilk_compute_pri_wm(struct hsw_pipe_wm_parameters *params,
                                   uint32_t mem_value,
@@ -2258,8 +2266,7 @@ static unsigned int ilk_display_fifo_size(const struct 
drm_device *dev)
 /* Calculate the maximum primary/sprite plane watermark */
 static unsigned int ilk_plane_wm_max(const struct drm_device *dev,
                                     int level,
-                                    unsigned int pipes_active,
-                                    bool sprite_enabled,
+                                    const struct intel_wm_config *config,
                                     enum intel_ddb_partitioning 
ddb_partitioning,
                                     bool is_sprite)
 {
@@ -2267,11 +2274,11 @@ static unsigned int ilk_plane_wm_max(const struct 
drm_device *dev,
        unsigned int max;
 
        /* if sprites aren't enabled, sprites get nothing */
-       if (is_sprite && !sprite_enabled)
+       if (is_sprite && !config->sprites_enabled)
                return 0;
 
        /* HSW allows LP1+ watermarks even with multiple pipes */
-       if (level == 0 || pipes_active > 1) {
+       if (level == 0 || config->pipes_active > 1) {
                fifo_size /= INTEL_INFO(dev)->num_pipes;
 
                /*
@@ -2283,7 +2290,7 @@ static unsigned int ilk_plane_wm_max(const struct 
drm_device *dev,
                        fifo_size /= 2;
        }
 
-       if (sprite_enabled) {
+       if (config->sprites_enabled) {
                /* level 0 is always calculated with 1:1 split */
                if (level > 0 && ddb_partitioning == INTEL_DDB_PART_5_6) {
                        if (is_sprite)
@@ -2310,10 +2317,11 @@ static unsigned int ilk_plane_wm_max(const struct 
drm_device *dev,
 
 /* Calculate the maximum cursor plane watermark */
 static unsigned int ilk_cursor_wm_max(const struct drm_device *dev,
-                                     int level, unsigned int pipes_active)
+                                     int level,
+                                     const struct intel_wm_config *config)
 {
        /* HSW LP1+ watermarks w/ multiple pipes */
-       if (level > 0 && pipes_active > 1)
+       if (level > 0 && config->pipes_active > 1)
                return 64;
 
        /* othwewise just report max that registers can hold */
@@ -2332,16 +2340,13 @@ static unsigned int ilk_fbc_wm_max(void)
 
 static void ilk_wm_max(struct drm_device *dev,
                       int level,
-                      unsigned int pipes_active,
-                      bool sprite_enabled,
+                      const struct intel_wm_config *config,
                       enum intel_ddb_partitioning ddb_partitioning,
                       struct hsw_wm_maximums *max)
 {
-       max->pri = ilk_plane_wm_max(dev, level, pipes_active,
-                                   sprite_enabled, ddb_partitioning, false);
-       max->spr = ilk_plane_wm_max(dev, level, pipes_active,
-                                   sprite_enabled, ddb_partitioning, true);
-       max->cur = ilk_cursor_wm_max(dev, level, pipes_active);
+       max->pri = ilk_plane_wm_max(dev, level, config, ddb_partitioning, 
false);
+       max->spr = ilk_plane_wm_max(dev, level, config, ddb_partitioning, true);
+       max->cur = ilk_cursor_wm_max(dev, level, config);
        max->fbc = ilk_fbc_wm_max();
 }
 
@@ -2567,7 +2572,7 @@ static void hsw_compute_wm_parameters(struct drm_device 
*dev,
        struct drm_crtc *crtc;
        struct drm_plane *plane;
        enum pipe pipe;
-       int pipes_active = 0, sprites_enabled = 0;
+       struct intel_wm_config config = {};
 
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -2580,7 +2585,7 @@ static void hsw_compute_wm_parameters(struct drm_device 
*dev,
                if (!p->active)
                        continue;
 
-               pipes_active++;
+               config.pipes_active++;
 
                p->pipe_htotal = intel_crtc->config.adjusted_mode.htotal;
                p->pixel_rate = ilk_pipe_pixel_rate(dev, crtc);
@@ -2602,17 +2607,14 @@ static void hsw_compute_wm_parameters(struct drm_device 
*dev,
                p->spr_bytes_per_pixel = intel_plane->wm.bytes_per_pixel;
                p->spr_horiz_pixels = intel_plane->wm.horiz_pixels;
 
-               if (p->sprite_enabled)
-                       sprites_enabled++;
+               config.sprites_enabled |= p->sprite_enabled;
        }
 
-       ilk_wm_max(dev, 1, pipes_active, sprites_enabled,
-                  INTEL_DDB_PART_1_2, lp_max_1_2);
+       ilk_wm_max(dev, 1, &config, INTEL_DDB_PART_1_2, lp_max_1_2);
 
        /* 5/6 split only in single pipe config on IVB+ */
-       if (INTEL_INFO(dev)->gen >= 7 && pipes_active <= 1)
-               ilk_wm_max(dev, 1, pipes_active, sprites_enabled,
-                          INTEL_DDB_PART_5_6, lp_max_5_6);
+       if (INTEL_INFO(dev)->gen >= 7 && config.pipes_active <= 1)
+               ilk_wm_max(dev, 1, &config, INTEL_DDB_PART_5_6, lp_max_5_6);
        else
                *lp_max_5_6 = *lp_max_1_2;
 }
-- 
1.8.1.5

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

Reply via email to