All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ander Conselvan De Oliveira <conselvan2@gmail.com>
To: Imre Deak <imre.deak@intel.com>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v2 5/5] drm/i915: Add power well SW/HW state verification
Date: Mon, 20 Feb 2017 11:32:31 +0200	[thread overview]
Message-ID: <1487583151.4385.6.camel@gmail.com> (raw)
In-Reply-To: <1487345986-26511-6-git-send-email-imre.deak@intel.com>

On Fri, 2017-02-17 at 17:39 +0200, Imre Deak wrote:
> Verify that the refcount of all power wells match their HW enabled
> state at the end of modeset HW state readout.
> 
> Also add documentation on how the reference count for each power well is
> supposed to be acquired during initialization and HW state readout.
> 
> Suggested by Ander.
> 
> Cc: Ander Conselvan de Oliveira <conselvan2@gmail.com>
> Cc: David Weinehall <david.weinehall@linux.intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>

Reviewed-by: Ander Conselvan de Oliveira <conselvan2@gmail.com>

> ---
>  drivers/gpu/drm/i915/intel_display.c    |  2 +
>  drivers/gpu/drm/i915/intel_drv.h        |  1 +
>  drivers/gpu/drm/i915/intel_runtime_pm.c | 85 ++++++++++++++++++++++++++++++++-
>  3 files changed, 87 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 88b7d96..00c3fd8 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -15572,6 +15572,8 @@ intel_modeset_setup_hw_state(struct drm_device *dev)
>  	}
>  	intel_display_set_init_power(dev_priv, false);
>  
> +	intel_power_domains_verify_state(dev_priv);
> +
>  	intel_fbc_init_pipe_state(dev_priv);
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 6e37fba..50c9329 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1695,6 +1695,7 @@ int intel_power_domains_init(struct drm_i915_private *);
>  void intel_power_domains_fini(struct drm_i915_private *);
>  void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
>  void intel_power_domains_suspend(struct drm_i915_private *dev_priv);
> +void intel_power_domains_verify_state(struct drm_i915_private *dev_priv);
>  void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume);
>  void bxt_display_core_uninit(struct drm_i915_private *dev_priv);
>  void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 44d4da3..6b52258 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -2683,7 +2683,10 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
>   * @resume: Called from resume code paths or not
>   *
>   * This function initializes the hardware power domain state and enables all
> - * power domains using intel_display_set_init_power().
> + * power wells belonging to the INIT power domain. Power wells in other
> + * domains (and not in the INIT domain) are referenced or disabled during the
> + * modeset state HW readout. After that the reference count of each power well
> + * must match its HW enabled state, see intel_power_domains_verify_state().
>   */
>  void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
>  {
> @@ -2736,6 +2739,86 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv)
>  		bxt_display_core_uninit(dev_priv);
>  }
>  
> +static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv)
> +{
> +	struct i915_power_domains *power_domains = &dev_priv->power_domains;
> +	struct i915_power_well *power_well;
> +
> +	for_each_power_well(dev_priv, power_well) {
> +		enum intel_display_power_domain domain;
> +
> +		DRM_DEBUG_DRIVER("%-25s %d\n",
> +				 power_well->name, power_well->count);
> +
> +		for_each_power_domain(domain, power_well->domains)
> +			DRM_DEBUG_DRIVER("  %-23s %d\n",
> +					 intel_display_power_domain_str(domain),
> +					 power_domains->domain_use_count[domain]);
> +	}
> +}
> +
> +/**
> + * intel_power_domains_verify_state - verify the HW/SW state for all power wells
> + * @dev_priv: i915 device instance
> + *
> + * Verify if the reference count of each power well matches its HW enabled
> + * state and the total refcount of the domains it belongs to. This must be
> + * called after modeset HW state sanitization, which is responsible for
> + * acquiring reference counts for any power wells in use and disabling the
> + * ones left on by BIOS but not required by any active output.
> + */
> +void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
> +{
> +	struct i915_power_domains *power_domains = &dev_priv->power_domains;
> +	struct i915_power_well *power_well;
> +	bool dump_domain_info;
> +
> +	mutex_lock(&power_domains->lock);
> +
> +	dump_domain_info = false;
> +	for_each_power_well(dev_priv, power_well) {
> +		enum intel_display_power_domain domain;
> +		int domains_count;
> +		bool enabled;
> +
> +		/*
> +		 * Power wells not belonging to any domain (like the MISC_IO
> +		 * and PW1 power wells) are under FW control, so ignore them,
> +		 * since their state can change asynchronously.
> +		 */
> +		if (!power_well->domains)
> +			continue;
> +
> +		enabled = power_well->ops->is_enabled(dev_priv, power_well);
> +		if ((power_well->count || power_well->always_on) != enabled)
> +			DRM_ERROR("power well %s state mismatch (refcount %d/enabled %d)",
> +				  power_well->name, power_well->count, enabled);
> +
> +		domains_count = 0;
> +		for_each_power_domain(domain, power_well->domains)
> +			domains_count += power_domains->domain_use_count[domain];
> +
> +		if (power_well->count != domains_count) {
> +			DRM_ERROR("power well %s refcount/domain refcount mismatch "
> +				  "(refcount %d/domains refcount %d)\n",
> +				  power_well->name, power_well->count,
> +				  domains_count);
> +			dump_domain_info = true;
> +		}
> +	}
> +
> +	if (dump_domain_info) {
> +		static bool dumped;
> +
> +		if (!dumped) {
> +			intel_power_domains_dump_info(dev_priv);
> +			dumped = true;
> +		}
> +	}
> +
> +	mutex_unlock(&power_domains->lock);
> +}
> +
>  /**
>   * intel_runtime_pm_get - grab a runtime pm reference
>   * @dev_priv: i915 device instance
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2017-02-20  9:32 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-17 15:39 [PATCH v2 0/5] drm/i915: Fix clearing of BIOS power well requests Imre Deak
2017-02-17 15:39 ` [PATCH v2 1/5] drm/i915: Remove redundant toggling from the power well sync_hw hooks Imre Deak
2017-02-17 15:39 ` [PATCH v2 2/5] drm/i915: Call the sync_hw hook for power wells without a domain Imre Deak
2017-02-20  8:55   ` Ander Conselvan De Oliveira
2017-02-17 15:39 ` [PATCH v2 3/5] drm/i915/gen9: Fix clearing of the BIOS power well request register Imre Deak
2017-02-17 15:39 ` [PATCH v2 4/5] drm/i915: Preserve the state of power wells not explicitly enabled Imre Deak
2017-02-20  9:28   ` Ander Conselvan De Oliveira
2017-02-17 15:39 ` [PATCH v2 5/5] drm/i915: Add power well SW/HW state verification Imre Deak
2017-02-20  9:32   ` Ander Conselvan De Oliveira [this message]
2017-02-17 19:52 ` ✓ Fi.CI.BAT: success for drm/i915: Fix clearing of BIOS power well requests (rev2) Patchwork
2017-02-20 12:57   ` Imre Deak

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=1487583151.4385.6.camel@gmail.com \
    --to=conselvan2@gmail.com \
    --cc=imre.deak@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.