|
@@ -1931,6 +1931,16 @@ static void ilk_compute_wm_maximums(const struct drm_device *dev,
|
|
|
max->fbc = ilk_fbc_wm_reg_max(dev);
|
|
|
}
|
|
|
|
|
|
+static void ilk_compute_wm_reg_maximums(struct drm_device *dev,
|
|
|
+ int level,
|
|
|
+ struct ilk_wm_maximums *max)
|
|
|
+{
|
|
|
+ max->pri = ilk_plane_wm_reg_max(dev, level, false);
|
|
|
+ max->spr = ilk_plane_wm_reg_max(dev, level, true);
|
|
|
+ max->cur = ilk_cursor_wm_reg_max(dev, level);
|
|
|
+ max->fbc = ilk_fbc_wm_reg_max(dev);
|
|
|
+}
|
|
|
+
|
|
|
static bool ilk_validate_wm_level(int level,
|
|
|
const struct ilk_wm_maximums *max,
|
|
|
struct intel_wm_level *result)
|
|
@@ -2188,9 +2198,6 @@ static bool intel_compute_pipe_wm(struct drm_crtc *crtc,
|
|
|
};
|
|
|
struct ilk_wm_maximums max;
|
|
|
|
|
|
- /* LP0 watermarks always use 1/2 DDB partitioning */
|
|
|
- ilk_compute_wm_maximums(dev, 0, &config, INTEL_DDB_PART_1_2, &max);
|
|
|
-
|
|
|
pipe_wm->pipe_enabled = params->active;
|
|
|
pipe_wm->sprites_enabled = params->spr.enabled;
|
|
|
pipe_wm->sprites_scaled = params->spr.scaled;
|
|
@@ -2203,15 +2210,37 @@ static bool intel_compute_pipe_wm(struct drm_crtc *crtc,
|
|
|
if (params->spr.scaled)
|
|
|
max_level = 0;
|
|
|
|
|
|
- for (level = 0; level <= max_level; level++)
|
|
|
- ilk_compute_wm_level(dev_priv, level, params,
|
|
|
- &pipe_wm->wm[level]);
|
|
|
+ ilk_compute_wm_level(dev_priv, 0, params, &pipe_wm->wm[0]);
|
|
|
|
|
|
if (IS_HASWELL(dev) || IS_BROADWELL(dev))
|
|
|
pipe_wm->linetime = hsw_compute_linetime_wm(dev, crtc);
|
|
|
|
|
|
+ /* LP0 watermarks always use 1/2 DDB partitioning */
|
|
|
+ ilk_compute_wm_maximums(dev, 0, &config, INTEL_DDB_PART_1_2, &max);
|
|
|
+
|
|
|
/* At least LP0 must be valid */
|
|
|
- return ilk_validate_wm_level(0, &max, &pipe_wm->wm[0]);
|
|
|
+ if (!ilk_validate_wm_level(0, &max, &pipe_wm->wm[0]))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ ilk_compute_wm_reg_maximums(dev, 1, &max);
|
|
|
+
|
|
|
+ for (level = 1; level <= max_level; level++) {
|
|
|
+ struct intel_wm_level wm = {};
|
|
|
+
|
|
|
+ ilk_compute_wm_level(dev_priv, level, params, &wm);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Disable any watermark level that exceeds the
|
|
|
+ * register maximums since such watermarks are
|
|
|
+ * always invalid.
|
|
|
+ */
|
|
|
+ if (!ilk_validate_wm_level(level, &max, &wm))
|
|
|
+ break;
|
|
|
+
|
|
|
+ pipe_wm->wm[level] = wm;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
/*
|