Commit 80203484 authored by Imre Deak's avatar Imre Deak

drm/i915: Track power references taken for enabled CRTCs

Add wakeref tracking for display power domain references taken for
enabled CRTCs.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20201130212200.2811939-4-imre.deak@intel.com
parent 6979cb9a
...@@ -7576,25 +7576,25 @@ modeset_get_crtc_power_domains(struct intel_crtc_state *crtc_state) ...@@ -7576,25 +7576,25 @@ modeset_get_crtc_power_domains(struct intel_crtc_state *crtc_state)
enum intel_display_power_domain domain; enum intel_display_power_domain domain;
u64 domains, new_domains, old_domains; u64 domains, new_domains, old_domains;
old_domains = crtc->enabled_power_domains; domains = get_crtc_power_domains(crtc_state);
crtc->enabled_power_domains = new_domains =
get_crtc_power_domains(crtc_state);
domains = new_domains & ~old_domains; new_domains = domains & ~crtc->enabled_power_domains.mask;
old_domains = crtc->enabled_power_domains.mask & ~domains;
for_each_power_domain(domain, domains) for_each_power_domain(domain, new_domains)
intel_display_power_get(dev_priv, domain); intel_display_power_get_in_set(dev_priv,
&crtc->enabled_power_domains,
domain);
return old_domains & ~new_domains; return old_domains;
} }
static void modeset_put_power_domains(struct drm_i915_private *dev_priv, static void modeset_put_crtc_power_domains(struct intel_crtc *crtc,
u64 domains) u64 domains)
{ {
enum intel_display_power_domain domain; intel_display_power_put_mask_in_set(to_i915(crtc->base.dev),
&crtc->enabled_power_domains,
for_each_power_domain(domain, domains) domains);
intel_display_power_put_unchecked(dev_priv, domain);
} }
static void valleyview_crtc_enable(struct intel_atomic_state *state, static void valleyview_crtc_enable(struct intel_atomic_state *state,
...@@ -7790,12 +7790,10 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, ...@@ -7790,12 +7790,10 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
to_intel_dbuf_state(dev_priv->dbuf.obj.state); to_intel_dbuf_state(dev_priv->dbuf.obj.state);
struct intel_crtc_state *crtc_state = struct intel_crtc_state *crtc_state =
to_intel_crtc_state(crtc->base.state); to_intel_crtc_state(crtc->base.state);
enum intel_display_power_domain domain;
struct intel_plane *plane; struct intel_plane *plane;
struct drm_atomic_state *state; struct drm_atomic_state *state;
struct intel_crtc_state *temp_crtc_state; struct intel_crtc_state *temp_crtc_state;
enum pipe pipe = crtc->pipe; enum pipe pipe = crtc->pipe;
u64 domains;
int ret; int ret;
if (!crtc_state->hw.active) if (!crtc_state->hw.active)
...@@ -7851,10 +7849,7 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc, ...@@ -7851,10 +7849,7 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
intel_update_watermarks(crtc); intel_update_watermarks(crtc);
intel_disable_shared_dpll(crtc_state); intel_disable_shared_dpll(crtc_state);
domains = crtc->enabled_power_domains; intel_display_power_put_all_in_set(dev_priv, &crtc->enabled_power_domains);
for_each_power_domain(domain, domains)
intel_display_power_put_unchecked(dev_priv, domain);
crtc->enabled_power_domains = 0;
dev_priv->active_pipes &= ~BIT(pipe); dev_priv->active_pipes &= ~BIT(pipe);
cdclk_state->min_cdclk[pipe] = 0; cdclk_state->min_cdclk[pipe] = 0;
...@@ -16343,8 +16338,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state) ...@@ -16343,8 +16338,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
intel_post_plane_update(state, crtc); intel_post_plane_update(state, crtc);
if (put_domains[crtc->pipe]) modeset_put_crtc_power_domains(crtc, put_domains[crtc->pipe]);
modeset_put_power_domains(dev_priv, put_domains[crtc->pipe]);
intel_modeset_verify_crtc(crtc, state, old_crtc_state, new_crtc_state); intel_modeset_verify_crtc(crtc, state, old_crtc_state, new_crtc_state);
...@@ -19562,7 +19556,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev, ...@@ -19562,7 +19556,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
put_domains = modeset_get_crtc_power_domains(crtc_state); put_domains = modeset_get_crtc_power_domains(crtc_state);
if (drm_WARN_ON(dev, put_domains)) if (drm_WARN_ON(dev, put_domains))
modeset_put_power_domains(dev_priv, put_domains); modeset_put_crtc_power_domains(crtc, put_domains);
} }
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref); intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
......
...@@ -1166,7 +1166,7 @@ struct intel_crtc { ...@@ -1166,7 +1166,7 @@ struct intel_crtc {
/* I915_MODE_FLAG_* */ /* I915_MODE_FLAG_* */
u8 mode_flags; u8 mode_flags;
unsigned long long enabled_power_domains; struct intel_display_power_domain_set enabled_power_domains;
struct intel_overlay *overlay; struct intel_overlay *overlay;
struct intel_crtc_state *config; struct intel_crtc_state *config;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment