From: Clint Taylor <clinton.a.taylor@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 06/10] drm/i915: Use the memory latency based WM computation on VLV too
Date: Fri, 26 Jun 2015 13:23:27 -0700 [thread overview]
Message-ID: <558DB4BF.2000200@intel.com> (raw)
In-Reply-To: <1435172410-9834-7-git-send-email-ville.syrjala@linux.intel.com>
On 06/24/2015 12:00 PM, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> In order to get decnet memory self refresh residency on VLV, flip it
> over to the new CHV way of doing things. VLV doesn't do PM5 or DDR DVFS
> so it's a bit simpler.
>
> I'm not sure the currently memory latency used for CHV is really
> appropriate for VLV. Some further testing will probably be needed to
> figure that out.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_display.c | 2 +-
> drivers/gpu/drm/i915/intel_pm.c | 223 +----------------------------------
> drivers/gpu/drm/i915/intel_sprite.c | 6 -
> 3 files changed, 6 insertions(+), 225 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 1424320..d67b5f1 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -15476,7 +15476,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
> pll->on = false;
> }
>
> - if (IS_CHERRYVIEW(dev))
> + if (IS_VALLEYVIEW(dev))
> vlv_wm_get_hw_state(dev);
> else if (IS_GEN9(dev))
> skl_wm_get_hw_state(dev);
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index ffdca62..c7c90ce 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -931,77 +931,6 @@ static void vlv_write_wm_values(struct intel_crtc *crtc,
>
> #undef FW_WM_VLV
>
> -static uint8_t vlv_compute_drain_latency(struct drm_crtc *crtc,
> - struct drm_plane *plane)
> -{
> - struct drm_device *dev = crtc->dev;
> - struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> - int entries, prec_mult, drain_latency, pixel_size;
> - int clock = intel_crtc->config->base.adjusted_mode.crtc_clock;
> - const int high_precision = IS_CHERRYVIEW(dev) ? 16 : 64;
> -
> - /*
> - * FIXME the plane might have an fb
> - * but be invisible (eg. due to clipping)
> - */
> - if (!intel_crtc->active || !plane->state->fb)
> - return 0;
> -
> - if (WARN(clock == 0, "Pixel clock is zero!\n"))
> - return 0;
> -
> - pixel_size = drm_format_plane_cpp(plane->state->fb->pixel_format, 0);
> -
> - if (WARN(pixel_size == 0, "Pixel size is zero!\n"))
> - return 0;
> -
> - entries = DIV_ROUND_UP(clock, 1000) * pixel_size;
> -
> - prec_mult = high_precision;
> - drain_latency = 64 * prec_mult * 4 / entries;
> -
> - if (drain_latency > DRAIN_LATENCY_MASK) {
> - prec_mult /= 2;
> - drain_latency = 64 * prec_mult * 4 / entries;
> - }
> -
> - if (drain_latency > DRAIN_LATENCY_MASK)
> - drain_latency = DRAIN_LATENCY_MASK;
> -
> - return drain_latency | (prec_mult == high_precision ?
> - DDL_PRECISION_HIGH : DDL_PRECISION_LOW);
> -}
> -
> -static int vlv_compute_wm(struct intel_crtc *crtc,
> - struct intel_plane *plane,
> - int fifo_size)
> -{
> - int clock, entries, pixel_size;
> -
> - /*
> - * FIXME the plane might have an fb
> - * but be invisible (eg. due to clipping)
> - */
> - if (!crtc->active || !plane->base.state->fb)
> - return 0;
> -
> - pixel_size = drm_format_plane_cpp(plane->base.state->fb->pixel_format, 0);
> - clock = crtc->config->base.adjusted_mode.crtc_clock;
> -
> - entries = DIV_ROUND_UP(clock, 1000) * pixel_size;
> -
> - /*
> - * Set up the watermark such that we don't start issuing memory
> - * requests until we are within PND's max deadline value (256us).
> - * Idea being to be idle as long as possible while still taking
> - * advatange of PND's deadline scheduling. The limit of 8
> - * cachelines (used when the FIFO will anyway drain in less time
> - * than 256us) should match what we would be done if trickle
> - * feed were enabled.
> - */
> - return fifo_size - clamp(DIV_ROUND_UP(256 * entries, 64), 0, fifo_size - 8);
> -}
> -
> enum vlv_wm_level {
> VLV_WM_LEVEL_PM2,
> VLV_WM_LEVEL_PM5,
> @@ -1076,101 +1005,6 @@ static uint16_t vlv_compute_wm_level(struct intel_plane *plane,
> return min_t(int, wm, USHRT_MAX);
> }
>
> -static bool vlv_compute_sr_wm(struct drm_device *dev,
> - struct vlv_wm_values *wm)
> -{
> - struct drm_i915_private *dev_priv = to_i915(dev);
> - struct drm_crtc *crtc;
> - enum pipe pipe = INVALID_PIPE;
> - int num_planes = 0;
> - int fifo_size = 0;
> - struct intel_plane *plane;
> -
> - wm->sr.cursor = wm->sr.plane = 0;
> -
> - crtc = single_enabled_crtc(dev);
> - /* maxfifo not supported on pipe C */
> - if (crtc && to_intel_crtc(crtc)->pipe != PIPE_C) {
> - pipe = to_intel_crtc(crtc)->pipe;
> - num_planes = !!wm->pipe[pipe].primary +
> - !!wm->pipe[pipe].sprite[0] +
> - !!wm->pipe[pipe].sprite[1];
> - fifo_size = INTEL_INFO(dev_priv)->num_pipes * 512 - 1;
> - }
> -
> - if (fifo_size == 0 || num_planes > 1)
> - return false;
> -
> - wm->sr.cursor = vlv_compute_wm(to_intel_crtc(crtc),
> - to_intel_plane(crtc->cursor), 0x3f);
> -
> - list_for_each_entry(plane, &dev->mode_config.plane_list, base.head) {
> - if (plane->base.type == DRM_PLANE_TYPE_CURSOR)
> - continue;
> -
> - if (plane->pipe != pipe)
> - continue;
> -
> - wm->sr.plane = vlv_compute_wm(to_intel_crtc(crtc),
> - plane, fifo_size);
> - if (wm->sr.plane != 0)
> - break;
> - }
> -
> - return true;
> -}
> -
> -static void valleyview_update_wm(struct drm_crtc *crtc)
> -{
> - struct drm_device *dev = crtc->dev;
> - struct drm_i915_private *dev_priv = dev->dev_private;
> - struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> - enum pipe pipe = intel_crtc->pipe;
> - bool cxsr_enabled;
> - struct vlv_wm_values wm = dev_priv->wm.vlv;
> -
> - wm.ddl[pipe].primary = vlv_compute_drain_latency(crtc, crtc->primary);
> - wm.pipe[pipe].primary = vlv_compute_wm(intel_crtc,
> - to_intel_plane(crtc->primary),
> - vlv_get_fifo_size(dev, pipe, 0));
> -
> - wm.ddl[pipe].cursor = vlv_compute_drain_latency(crtc, crtc->cursor);
> - wm.pipe[pipe].cursor = vlv_compute_wm(intel_crtc,
> - to_intel_plane(crtc->cursor),
> - 0x3f);
> -
> - cxsr_enabled = vlv_compute_sr_wm(dev, &wm);
> -
> - if (memcmp(&wm, &dev_priv->wm.vlv, sizeof(wm)) == 0)
> - return;
> -
> - DRM_DEBUG_KMS("Setting FIFO watermarks - %c: plane=%d, cursor=%d, "
> - "SR: plane=%d, cursor=%d\n", pipe_name(pipe),
> - wm.pipe[pipe].primary, wm.pipe[pipe].cursor,
> - wm.sr.plane, wm.sr.cursor);
> -
> - /*
> - * FIXME DDR DVFS introduces massive memory latencies which
> - * are not known to system agent so any deadline specified
> - * by the display may not be respected. To support DDR DVFS
> - * the watermark code needs to be rewritten to essentially
> - * bypass deadline mechanism and rely solely on the
> - * watermarks. For now disable DDR DVFS.
> - */
> - if (IS_CHERRYVIEW(dev_priv))
> - chv_set_memory_dvfs(dev_priv, false);
> -
> - if (!cxsr_enabled)
> - intel_set_memory_cxsr(dev_priv, false);
> -
> - vlv_write_wm_values(intel_crtc, &wm);
> -
> - if (cxsr_enabled)
> - intel_set_memory_cxsr(dev_priv, true);
> -
> - dev_priv->wm.vlv = wm;
> -}
> -
> static void vlv_compute_fifo(struct intel_crtc *crtc)
> {
> struct drm_device *dev = crtc->base.dev;
> @@ -1272,7 +1106,7 @@ static void vlv_invert_wms(struct intel_crtc *crtc)
> }
> }
>
> -static void _vlv_compute_wm(struct intel_crtc *crtc)
> +static void vlv_compute_wm(struct intel_crtc *crtc)
> {
> struct drm_device *dev = crtc->base.dev;
> struct vlv_wm_state *wm_state = &crtc->wm_state;
> @@ -1518,7 +1352,7 @@ static void vlv_update_wm(struct drm_crtc *crtc)
> enum pipe pipe = intel_crtc->pipe;
> struct vlv_wm_values wm = {};
>
> - _vlv_compute_wm(intel_crtc);
> + vlv_compute_wm(intel_crtc);
> vlv_merge_wm(dev, &wm);
>
> if (memcmp(&dev_priv->wm.vlv, &wm, sizeof(wm)) == 0) {
> @@ -1567,54 +1401,6 @@ static void vlv_update_wm(struct drm_crtc *crtc)
> dev_priv->wm.vlv = wm;
> }
>
> -static void valleyview_update_sprite_wm(struct drm_plane *plane,
> - struct drm_crtc *crtc,
> - uint32_t sprite_width,
> - uint32_t sprite_height,
> - int pixel_size,
> - bool enabled, bool scaled)
> -{
> - struct drm_device *dev = crtc->dev;
> - struct drm_i915_private *dev_priv = dev->dev_private;
> - struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> - enum pipe pipe = intel_crtc->pipe;
> - int sprite = to_intel_plane(plane)->plane;
> - bool cxsr_enabled;
> - struct vlv_wm_values wm = dev_priv->wm.vlv;
> -
> - if (enabled) {
> - wm.ddl[pipe].sprite[sprite] =
> - vlv_compute_drain_latency(crtc, plane);
> -
> - wm.pipe[pipe].sprite[sprite] =
> - vlv_compute_wm(intel_crtc,
> - to_intel_plane(plane),
> - vlv_get_fifo_size(dev, pipe, sprite+1));
> - } else {
> - wm.ddl[pipe].sprite[sprite] = 0;
> - wm.pipe[pipe].sprite[sprite] = 0;
> - }
> -
> - cxsr_enabled = vlv_compute_sr_wm(dev, &wm);
> -
> - if (memcmp(&wm, &dev_priv->wm.vlv, sizeof(wm)) == 0)
> - return;
> -
> - DRM_DEBUG_KMS("Setting FIFO watermarks - %c: sprite %c=%d, "
> - "SR: plane=%d, cursor=%d\n", pipe_name(pipe),
> - sprite_name(pipe, sprite),
> - wm.pipe[pipe].sprite[sprite],
> - wm.sr.plane, wm.sr.cursor);
> -
> - if (!cxsr_enabled)
> - intel_set_memory_cxsr(dev_priv, false);
> -
> - vlv_write_wm_values(intel_crtc, &wm);
> -
> - if (cxsr_enabled)
> - intel_set_memory_cxsr(dev_priv, true);
> -}
> -
> #define single_plane_enabled(mask) is_power_of_2(mask)
>
> static void g4x_update_wm(struct drm_crtc *crtc)
> @@ -7289,8 +7075,9 @@ void intel_init_pm(struct drm_device *dev)
> dev_priv->display.init_clock_gating =
> cherryview_init_clock_gating;
> } else if (IS_VALLEYVIEW(dev)) {
> - dev_priv->display.update_wm = valleyview_update_wm;
> - dev_priv->display.update_sprite_wm = valleyview_update_sprite_wm;
> + vlv_setup_wm_latency(dev);
> +
> + dev_priv->display.update_wm = vlv_update_wm;
> dev_priv->display.init_clock_gating =
> valleyview_init_clock_gating;
> } else if (IS_PINEVIEW(dev)) {
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index 3806f83..d23269b 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -402,10 +402,6 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc *crtc,
> if (obj->tiling_mode != I915_TILING_NONE)
> sprctl |= SP_TILED;
>
> - intel_update_sprite_watermarks(dplane, crtc, src_w, src_h,
> - pixel_size, true,
> - src_w != crtc_w || src_h != crtc_h);
> -
> /* Sizes are 0 based */
> src_w--;
> src_h--;
> @@ -470,8 +466,6 @@ vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)
>
> I915_WRITE(SPSURF(pipe, plane), 0);
> POSTING_READ(SPSURF(pipe, plane));
> -
> - intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);
> }
>
> static void
>
Reviewed-by: Clint Taylor <Clinton.A.Taylor@intel.com>
Tested-by: Clint Taylor <Clinton.A.Taylor@intel.com>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-06-26 20:25 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-24 19:00 [PATCH 00/10] drm/i915: Another WM rewrite to enable DDR DVFS on CHV ville.syrjala
2015-06-24 19:00 ` [PATCH 01/10] drm/i915: POSTING_READ() in intel_set_memory_cxsr() ville.syrjala
2015-06-26 20:22 ` Clint Taylor
2015-06-24 19:00 ` [PATCH 02/10] drm/i915: Split atomic wm update to pre and post variants ville.syrjala
2015-06-26 20:22 ` Clint Taylor
2015-06-24 19:00 ` [PATCH 03/10] drm/i915: Read wm values from hardware at init on CHV ville.syrjala
2015-06-26 20:23 ` Clint Taylor
2015-06-24 19:00 ` [PATCH 04/10] drm/i915: CHV DDR DVFS support and another watermark rewrite ville.syrjala
2015-06-26 17:56 ` Clint Taylor
2015-06-26 19:48 ` Ville Syrjälä
2015-06-26 20:21 ` Clint Taylor
2015-06-29 8:03 ` Jani Nikula
2015-06-29 8:54 ` Daniel Vetter
2015-06-24 19:00 ` [PATCH 05/10] drm/i915: Compute display FIFO split dynamically for CHV ville.syrjala
2015-06-26 20:23 ` Clint Taylor
2015-06-24 19:00 ` [PATCH 06/10] drm/i915: Use the memory latency based WM computation on VLV too ville.syrjala
2015-06-26 20:23 ` Clint Taylor [this message]
2015-06-24 19:00 ` [PATCH 07/10] drm/i915: Try to make sure cxsr is disabled around plane enable/disable ville.syrjala
2015-06-26 20:23 ` Clint Taylor
2015-07-01 19:13 ` [PATCH v2 " ville.syrjala
2015-07-01 19:36 ` Paulo Zanoni
2015-07-01 20:38 ` Matt Roper
2015-06-24 19:00 ` [PATCH 08/10] drm/i915: Don't do PM5/DDR DVFS with multiple pipes ville.syrjala
2015-06-26 20:23 ` Clint Taylor
2015-06-24 19:00 ` [PATCH 09/10] drm/i915: Add debugfs knobs for VLVCHV memory latency values ville.syrjala
2015-06-26 20:24 ` Clint Taylor
2015-06-24 19:00 ` [PATCH 10/10] drm/i915: Zero unused WM1 watermarks on VLV/CHV ville.syrjala
2015-06-26 20:24 ` Clint Taylor
2015-06-29 9:00 ` Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=558DB4BF.2000200@intel.com \
--to=clinton.a.taylor@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox