* [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
@ 2016-02-19 18:47 ville.syrjala
2016-02-19 18:47 ` [PATCH 2/2] drm/i915: Add for_each_pipe_masked() ville.syrjala
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: ville.syrjala @ 2016-02-19 18:47 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Starting from BDW the DE_PIPE interrupts for pipe B and C belong to the
relevant display power well. So we should make sure we've finished
processing them before turning off the power well.
The pipe interrupts shouldn't really happen at this point anymore since
we've already shut down the planes/pipes/whatnot, but being a bit
paranoid shouldn't hurt.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/i915_irq.c | 16 ++++++++++++++++
drivers/gpu/drm/i915/intel_drv.h | 2 ++
drivers/gpu/drm/i915/intel_runtime_pm.c | 19 +++++++++++++++++++
3 files changed, 37 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d56c261ad867..a9048e1b96e5 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -3366,6 +3366,22 @@ void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
spin_unlock_irq(&dev_priv->irq_lock);
}
+void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
+ unsigned int pipe_mask)
+{
+ spin_lock_irq(&dev_priv->irq_lock);
+ if (pipe_mask & 1 << PIPE_A)
+ GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_A);
+ if (pipe_mask & 1 << PIPE_B)
+ GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_B);
+ if (pipe_mask & 1 << PIPE_C)
+ GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_C);
+ spin_unlock_irq(&dev_priv->irq_lock);
+
+ /* make sure we're done processing display irqs */
+ synchronize_irq(dev_priv->dev->irq);
+}
+
static void cherryview_irq_preinstall(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 285b0570be9c..2618e3026e8b 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -993,6 +993,8 @@ static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
int intel_get_crtc_scanline(struct intel_crtc *crtc);
void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
unsigned int pipe_mask);
+void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
+ unsigned int pipe_mask);
/* intel_crt.c */
void intel_crt_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 59e9222223c9..1afa00855ed8 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -284,6 +284,13 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
1 << PIPE_C | 1 << PIPE_B);
}
+static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv)
+{
+ if (IS_BROADWELL(dev_priv))
+ gen8_irq_power_well_pre_disable(dev_priv,
+ 1 << PIPE_C | 1 << PIPE_B);
+}
+
static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
struct i915_power_well *power_well)
{
@@ -309,6 +316,14 @@ static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
}
}
+static void skl_power_well_pre_disable(struct drm_i915_private *dev_priv,
+ struct i915_power_well *power_well)
+{
+ if (power_well->data == SKL_DISP_PW_2)
+ gen8_irq_power_well_pre_disable(dev_priv,
+ 1 << PIPE_C | 1 << PIPE_B);
+}
+
static void hsw_set_power_well(struct drm_i915_private *dev_priv,
struct i915_power_well *power_well, bool enable)
{
@@ -334,6 +349,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
} else {
if (enable_requested) {
+ hsw_power_well_pre_disable(dev_priv);
I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
POSTING_READ(HSW_PWR_WELL_DRIVER);
DRM_DEBUG_KMS("Requesting to disable the power well\n");
@@ -663,6 +679,9 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
state_mask = SKL_POWER_WELL_STATE(power_well->data);
is_enabled = tmp & state_mask;
+ if (!enable && enable_requested)
+ skl_power_well_pre_disable(dev_priv, power_well);
+
if (enable) {
if (!enable_requested) {
WARN((tmp & state_mask) &&
--
2.4.10
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] drm/i915: Add for_each_pipe_masked()
2016-02-19 18:47 [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ ville.syrjala
@ 2016-02-19 18:47 ` ville.syrjala
2016-02-22 14:18 ` Imre Deak
2016-02-22 11:18 ` ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ Patchwork
2016-02-22 13:59 ` [PATCH 1/2] " Imre Deak
2 siblings, 1 reply; 8+ messages in thread
From: ville.syrjala @ 2016-02-19 18:47 UTC (permalink / raw)
To: intel-gfx
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
for_each_pipe_masked() can be used to iterate over the pipes
included in the user provided pipe mask. Removes a few lines of
duplicated code.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 3 +++
drivers/gpu/drm/i915/i915_irq.c | 27 +++++++++------------------
2 files changed, 12 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 6644c2e354c1..00ab9c0e18e0 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -261,6 +261,9 @@ struct i915_hotplug {
#define for_each_pipe(__dev_priv, __p) \
for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes; (__p)++)
+#define for_each_pipe_masked(__dev_priv, __p, __mask) \
+ for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes; (__p)++) \
+ for_each_if ((__mask) & (1 << (__p)))
#define for_each_plane(__dev_priv, __pipe, __p) \
for ((__p) = 0; \
(__p) < INTEL_INFO(__dev_priv)->num_sprites[(__pipe)] + 1; \
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a9048e1b96e5..d1a46ef5ab3f 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -3349,33 +3349,24 @@ void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
unsigned int pipe_mask)
{
uint32_t extra_ier = GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN;
+ enum pipe pipe;
spin_lock_irq(&dev_priv->irq_lock);
- if (pipe_mask & 1 << PIPE_A)
- GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_A,
- dev_priv->de_irq_mask[PIPE_A],
- ~dev_priv->de_irq_mask[PIPE_A] | extra_ier);
- if (pipe_mask & 1 << PIPE_B)
- GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_B,
- dev_priv->de_irq_mask[PIPE_B],
- ~dev_priv->de_irq_mask[PIPE_B] | extra_ier);
- if (pipe_mask & 1 << PIPE_C)
- GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_C,
- dev_priv->de_irq_mask[PIPE_C],
- ~dev_priv->de_irq_mask[PIPE_C] | extra_ier);
+ for_each_pipe_masked(dev_priv, pipe, pipe_mask)
+ GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
+ dev_priv->de_irq_mask[pipe],
+ ~dev_priv->de_irq_mask[pipe] | extra_ier);
spin_unlock_irq(&dev_priv->irq_lock);
}
void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
unsigned int pipe_mask)
{
+ enum pipe pipe;
+
spin_lock_irq(&dev_priv->irq_lock);
- if (pipe_mask & 1 << PIPE_A)
- GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_A);
- if (pipe_mask & 1 << PIPE_B)
- GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_B);
- if (pipe_mask & 1 << PIPE_C)
- GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_C);
+ for_each_pipe_masked(dev_priv, pipe, pipe_mask)
+ GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
spin_unlock_irq(&dev_priv->irq_lock);
/* make sure we're done processing display irqs */
--
2.4.10
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 8+ messages in thread
* ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
2016-02-19 18:47 [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ ville.syrjala
2016-02-19 18:47 ` [PATCH 2/2] drm/i915: Add for_each_pipe_masked() ville.syrjala
@ 2016-02-22 11:18 ` Patchwork
2016-02-22 14:59 ` Ville Syrjälä
2016-02-22 13:59 ` [PATCH 1/2] " Imre Deak
2 siblings, 1 reply; 8+ messages in thread
From: Patchwork @ 2016-02-22 11:18 UTC (permalink / raw)
To: ville.syrjala; +Cc: intel-gfx
== Summary ==
Series 3639v1 Series without cover letter
http://patchwork.freedesktop.org/api/1.0/series/3639/revisions/1/mbox/
Test kms_force_connector_basic:
Subgroup force-load-detect:
dmesg-fail -> FAIL (snb-x220t)
fail -> DMESG-FAIL (snb-dellxps)
Test kms_pipe_crc_basic:
Subgroup suspend-read-crc-pipe-b:
dmesg-warn -> PASS (skl-i5k-2) UNSTABLE
Subgroup suspend-read-crc-pipe-c:
pass -> DMESG-WARN (skl-i5k-2) UNSTABLE
bdw-nuci7 total:165 pass:154 dwarn:0 dfail:0 fail:0 skip:11
bdw-ultra total:168 pass:154 dwarn:0 dfail:0 fail:0 skip:14
bsw-nuc-2 total:168 pass:136 dwarn:1 dfail:0 fail:1 skip:30
byt-nuc total:168 pass:143 dwarn:0 dfail:0 fail:0 skip:25
hsw-gt2 total:168 pass:157 dwarn:0 dfail:1 fail:0 skip:10
ivb-t430s total:168 pass:153 dwarn:0 dfail:0 fail:1 skip:14
skl-i5k-2 total:168 pass:151 dwarn:1 dfail:0 fail:0 skip:16
snb-dellxps total:168 pass:145 dwarn:0 dfail:1 fail:0 skip:22
snb-x220t total:168 pass:145 dwarn:0 dfail:0 fail:2 skip:21
Results at /archive/results/CI_IGT_test/Patchwork_1451/
c278ff791cc73f90079c86f343be16214a0038b7 drm-intel-nightly: 2016y-02m-22d-09h-17m-11s UTC integration manifest
e01691f3763e01e8b842c36a5ec6ac29c0993c21 drm/i915: Add for_each_pipe_masked()
c305df268afa66201880d8ff7aa8c56ce4b4046c drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
2016-02-19 18:47 [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ ville.syrjala
2016-02-19 18:47 ` [PATCH 2/2] drm/i915: Add for_each_pipe_masked() ville.syrjala
2016-02-22 11:18 ` ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ Patchwork
@ 2016-02-22 13:59 ` Imre Deak
2016-02-22 14:16 ` Ville Syrjälä
2 siblings, 1 reply; 8+ messages in thread
From: Imre Deak @ 2016-02-22 13:59 UTC (permalink / raw)
To: ville.syrjala, intel-gfx
On pe, 2016-02-19 at 20:47 +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Starting from BDW the DE_PIPE interrupts for pipe B and C belong to the
> relevant display power well. So we should make sure we've finished
> processing them before turning off the power well.
>
> The pipe interrupts shouldn't really happen at this point anymore since
> we've already shut down the planes/pipes/whatnot, but being a bit
> paranoid shouldn't hurt.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_irq.c | 16 ++++++++++++++++
> drivers/gpu/drm/i915/intel_drv.h | 2 ++
> drivers/gpu/drm/i915/intel_runtime_pm.c | 19 +++++++++++++++++++
> 3 files changed, 37 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index d56c261ad867..a9048e1b96e5 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -3366,6 +3366,22 @@ void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
> spin_unlock_irq(&dev_priv->irq_lock);
> }
>
> +void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
> + unsigned int pipe_mask)
> +{
> + spin_lock_irq(&dev_priv->irq_lock);
> + if (pipe_mask & 1 << PIPE_A)
> + GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_A);
> + if (pipe_mask & 1 << PIPE_B)
> + GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_B);
> + if (pipe_mask & 1 << PIPE_C)
> + GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_C);
> + spin_unlock_irq(&dev_priv->irq_lock);
> +
> + /* make sure we're done processing display irqs */
> + synchronize_irq(dev_priv->dev->irq);
> +}
> +
> static void cherryview_irq_preinstall(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 285b0570be9c..2618e3026e8b 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -993,6 +993,8 @@ static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
> int intel_get_crtc_scanline(struct intel_crtc *crtc);
> void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
> unsigned int pipe_mask);
> +void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
> + unsigned int pipe_mask);
>
> /* intel_crt.c */
> void intel_crt_init(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 59e9222223c9..1afa00855ed8 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -284,6 +284,13 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
> 1 << PIPE_C | 1 << PIPE_B);
> }
>
> +static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv)
> +{
> + if (IS_BROADWELL(dev_priv))
> + gen8_irq_power_well_pre_disable(dev_priv,
> + 1 << PIPE_C | 1 << PIPE_B);
> +}
> +
> static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
> struct i915_power_well *power_well)
> {
> @@ -309,6 +316,14 @@ static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
> }
> }
>
> +static void skl_power_well_pre_disable(struct drm_i915_private *dev_priv,
> + struct i915_power_well *power_well)
> +{
> + if (power_well->data == SKL_DISP_PW_2)
> + gen8_irq_power_well_pre_disable(dev_priv,
> + 1 << PIPE_C | 1 << PIPE_B);
> +}
> +
> static void hsw_set_power_well(struct drm_i915_private *dev_priv,
> struct i915_power_well *power_well, bool enable)
> {
> @@ -334,6 +349,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
>
> } else {
> if (enable_requested) {
> + hsw_power_well_pre_disable(dev_priv);
> I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
> POSTING_READ(HSW_PWR_WELL_DRIVER);
> DRM_DEBUG_KMS("Requesting to disable the power well\n");
> @@ -663,6 +679,9 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
> state_mask = SKL_POWER_WELL_STATE(power_well->data);
> is_enabled = tmp & state_mask;
>
> + if (!enable && enable_requested)
> + skl_power_well_pre_disable(dev_priv, power_well);
> +
Why not putting this in the existing if branch? Either way:
Reviewed-by: Imre Deak <imre.deak@intel.com>
> if (enable) {
> if (!enable_requested) {
> WARN((tmp & state_mask) &&
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
2016-02-22 13:59 ` [PATCH 1/2] " Imre Deak
@ 2016-02-22 14:16 ` Ville Syrjälä
0 siblings, 0 replies; 8+ messages in thread
From: Ville Syrjälä @ 2016-02-22 14:16 UTC (permalink / raw)
To: Imre Deak; +Cc: intel-gfx
On Mon, Feb 22, 2016 at 03:59:28PM +0200, Imre Deak wrote:
> On pe, 2016-02-19 at 20:47 +0200, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Starting from BDW the DE_PIPE interrupts for pipe B and C belong to the
> > relevant display power well. So we should make sure we've finished
> > processing them before turning off the power well.
> >
> > The pipe interrupts shouldn't really happen at this point anymore since
> > we've already shut down the planes/pipes/whatnot, but being a bit
> > paranoid shouldn't hurt.
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > drivers/gpu/drm/i915/i915_irq.c | 16 ++++++++++++++++
> > drivers/gpu/drm/i915/intel_drv.h | 2 ++
> > drivers/gpu/drm/i915/intel_runtime_pm.c | 19 +++++++++++++++++++
> > 3 files changed, 37 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > index d56c261ad867..a9048e1b96e5 100644
> > --- a/drivers/gpu/drm/i915/i915_irq.c
> > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > @@ -3366,6 +3366,22 @@ void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
> > spin_unlock_irq(&dev_priv->irq_lock);
> > }
> >
> > +void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
> > + unsigned int pipe_mask)
> > +{
> > + spin_lock_irq(&dev_priv->irq_lock);
> > + if (pipe_mask & 1 << PIPE_A)
> > + GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_A);
> > + if (pipe_mask & 1 << PIPE_B)
> > + GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_B);
> > + if (pipe_mask & 1 << PIPE_C)
> > + GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_C);
> > + spin_unlock_irq(&dev_priv->irq_lock);
> > +
> > + /* make sure we're done processing display irqs */
> > + synchronize_irq(dev_priv->dev->irq);
> > +}
> > +
> > static void cherryview_irq_preinstall(struct drm_device *dev)
> > {
> > struct drm_i915_private *dev_priv = dev->dev_private;
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index 285b0570be9c..2618e3026e8b 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -993,6 +993,8 @@ static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
> > int intel_get_crtc_scanline(struct intel_crtc *crtc);
> > void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
> > unsigned int pipe_mask);
> > +void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
> > + unsigned int pipe_mask);
> >
> > /* intel_crt.c */
> > void intel_crt_init(struct drm_device *dev);
> > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > index 59e9222223c9..1afa00855ed8 100644
> > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> > @@ -284,6 +284,13 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
> > 1 << PIPE_C | 1 << PIPE_B);
> > }
> >
> > +static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv)
> > +{
> > + if (IS_BROADWELL(dev_priv))
> > + gen8_irq_power_well_pre_disable(dev_priv,
> > + 1 << PIPE_C | 1 << PIPE_B);
> > +}
> > +
> > static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
> > struct i915_power_well *power_well)
> > {
> > @@ -309,6 +316,14 @@ static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
> > }
> > }
> >
> > +static void skl_power_well_pre_disable(struct drm_i915_private *dev_priv,
> > + struct i915_power_well *power_well)
> > +{
> > + if (power_well->data == SKL_DISP_PW_2)
> > + gen8_irq_power_well_pre_disable(dev_priv,
> > + 1 << PIPE_C | 1 << PIPE_B);
> > +}
> > +
> > static void hsw_set_power_well(struct drm_i915_private *dev_priv,
> > struct i915_power_well *power_well, bool enable)
> > {
> > @@ -334,6 +349,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
> >
> > } else {
> > if (enable_requested) {
> > + hsw_power_well_pre_disable(dev_priv);
> > I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
> > POSTING_READ(HSW_PWR_WELL_DRIVER);
> > DRM_DEBUG_KMS("Requesting to disable the power well\n");
> > @@ -663,6 +679,9 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
> > state_mask = SKL_POWER_WELL_STATE(power_well->data);
> > is_enabled = tmp & state_mask;
> >
> > + if (!enable && enable_requested)
> > + skl_power_well_pre_disable(dev_priv, power_well);
> > +
>
> Why not putting this in the existing if branch? Either way:
> Reviewed-by: Imre Deak <imre.deak@intel.com>
I figured it's better if it mirrors the way the post_enable is done.
>
> > if (enable) {
> > if (!enable_requested) {
> > WARN((tmp & state_mask) &&
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] drm/i915: Add for_each_pipe_masked()
2016-02-19 18:47 ` [PATCH 2/2] drm/i915: Add for_each_pipe_masked() ville.syrjala
@ 2016-02-22 14:18 ` Imre Deak
2016-02-22 17:47 ` Ville Syrjälä
0 siblings, 1 reply; 8+ messages in thread
From: Imre Deak @ 2016-02-22 14:18 UTC (permalink / raw)
To: ville.syrjala, intel-gfx
On pe, 2016-02-19 at 20:47 +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> for_each_pipe_masked() can be used to iterate over the pipes
> included in the user provided pipe mask. Removes a few lines of
> duplicated code.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 3 +++
> drivers/gpu/drm/i915/i915_irq.c | 27 +++++++++------------------
> 2 files changed, 12 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h
> b/drivers/gpu/drm/i915/i915_drv.h
> index 6644c2e354c1..00ab9c0e18e0 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -261,6 +261,9 @@ struct i915_hotplug {
>
> #define for_each_pipe(__dev_priv, __p) \
> for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes;
> (__p)++)
> +#define for_each_pipe_masked(__dev_priv, __p, __mask) \
> + for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes;
> (__p)++) \
> + for_each_if ((__mask) & (1 << (__p)))
> #define for_each_plane(__dev_priv, __pipe, __p)
> \
> for ((__p) = 0;
> \
> (__p) < INTEL_INFO(__dev_priv)->num_sprites[(__pipe)] +
> 1; \
> diff --git a/drivers/gpu/drm/i915/i915_irq.c
> b/drivers/gpu/drm/i915/i915_irq.c
> index a9048e1b96e5..d1a46ef5ab3f 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -3349,33 +3349,24 @@ void gen8_irq_power_well_post_enable(struct
> drm_i915_private *dev_priv,
> unsigned int pipe_mask)
> {
> uint32_t extra_ier = GEN8_PIPE_VBLANK |
> GEN8_PIPE_FIFO_UNDERRUN;
> + enum pipe pipe;
>
> spin_lock_irq(&dev_priv->irq_lock);
> - if (pipe_mask & 1 << PIPE_A)
> - GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_A,
> - dev_priv->de_irq_mask[PIPE_A],
> - ~dev_priv->de_irq_mask[PIPE_A] |
> extra_ier);
> - if (pipe_mask & 1 << PIPE_B)
> - GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_B,
> - dev_priv->de_irq_mask[PIPE_B],
> - ~dev_priv->de_irq_mask[PIPE_B] |
> extra_ier);
> - if (pipe_mask & 1 << PIPE_C)
> - GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_C,
> - dev_priv->de_irq_mask[PIPE_C],
> - ~dev_priv->de_irq_mask[PIPE_C] |
> extra_ier);
> + for_each_pipe_masked(dev_priv, pipe, pipe_mask)
> + GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
> + dev_priv->de_irq_mask[pipe],
> + ~dev_priv->de_irq_mask[pipe] |
> extra_ier);
> spin_unlock_irq(&dev_priv->irq_lock);
> }
>
> void gen8_irq_power_well_pre_disable(struct drm_i915_private
> *dev_priv,
> unsigned int pipe_mask)
> {
> + enum pipe pipe;
> +
> spin_lock_irq(&dev_priv->irq_lock);
> - if (pipe_mask & 1 << PIPE_A)
> - GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_A);
> - if (pipe_mask & 1 << PIPE_B)
> - GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_B);
> - if (pipe_mask & 1 << PIPE_C)
> - GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_C);
> + for_each_pipe_masked(dev_priv, pipe, pipe_mask)
> + GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
> spin_unlock_irq(&dev_priv->irq_lock);
>
> /* make sure we're done processing display irqs */
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
2016-02-22 11:18 ` ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ Patchwork
@ 2016-02-22 14:59 ` Ville Syrjälä
0 siblings, 0 replies; 8+ messages in thread
From: Ville Syrjälä @ 2016-02-22 14:59 UTC (permalink / raw)
To: intel-gfx
On Mon, Feb 22, 2016 at 11:18:21AM -0000, Patchwork wrote:
> == Summary ==
>
> Series 3639v1 Series without cover letter
> http://patchwork.freedesktop.org/api/1.0/series/3639/revisions/1/mbox/
>
> Test kms_force_connector_basic:
> Subgroup force-load-detect:
> dmesg-fail -> FAIL (snb-x220t)
> fail -> DMESG-FAIL (snb-dellxps)
Maarten broke something I think.
> Test kms_pipe_crc_basic:
> Subgroup suspend-read-crc-pipe-b:
> dmesg-warn -> PASS (skl-i5k-2) UNSTABLE
> Subgroup suspend-read-crc-pipe-c:
> pass -> DMESG-WARN (skl-i5k-2) UNSTABLE
The usual cpu_hotplug lockdep fail.
>
> bdw-nuci7 total:165 pass:154 dwarn:0 dfail:0 fail:0 skip:11
> bdw-ultra total:168 pass:154 dwarn:0 dfail:0 fail:0 skip:14
> bsw-nuc-2 total:168 pass:136 dwarn:1 dfail:0 fail:1 skip:30
> byt-nuc total:168 pass:143 dwarn:0 dfail:0 fail:0 skip:25
> hsw-gt2 total:168 pass:157 dwarn:0 dfail:1 fail:0 skip:10
> ivb-t430s total:168 pass:153 dwarn:0 dfail:0 fail:1 skip:14
> skl-i5k-2 total:168 pass:151 dwarn:1 dfail:0 fail:0 skip:16
> snb-dellxps total:168 pass:145 dwarn:0 dfail:1 fail:0 skip:22
> snb-x220t total:168 pass:145 dwarn:0 dfail:0 fail:2 skip:21
>
> Results at /archive/results/CI_IGT_test/Patchwork_1451/
>
> c278ff791cc73f90079c86f343be16214a0038b7 drm-intel-nightly: 2016y-02m-22d-09h-17m-11s UTC integration manifest
> e01691f3763e01e8b842c36a5ec6ac29c0993c21 drm/i915: Add for_each_pipe_masked()
> c305df268afa66201880d8ff7aa8c56ce4b4046c drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] drm/i915: Add for_each_pipe_masked()
2016-02-22 14:18 ` Imre Deak
@ 2016-02-22 17:47 ` Ville Syrjälä
0 siblings, 0 replies; 8+ messages in thread
From: Ville Syrjälä @ 2016-02-22 17:47 UTC (permalink / raw)
To: Imre Deak; +Cc: intel-gfx
On Mon, Feb 22, 2016 at 04:18:33PM +0200, Imre Deak wrote:
> On pe, 2016-02-19 at 20:47 +0200, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > for_each_pipe_masked() can be used to iterate over the pipes
> > included in the user provided pipe mask. Removes a few lines of
> > duplicated code.
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Reviewed-by: Imre Deak <imre.deak@intel.com>
Series pushed to dinq. Thanks for the review.
>
> > ---
> > drivers/gpu/drm/i915/i915_drv.h | 3 +++
> > drivers/gpu/drm/i915/i915_irq.c | 27 +++++++++------------------
> > 2 files changed, 12 insertions(+), 18 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h
> > index 6644c2e354c1..00ab9c0e18e0 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -261,6 +261,9 @@ struct i915_hotplug {
> >
> > #define for_each_pipe(__dev_priv, __p) \
> > for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes;
> > (__p)++)
> > +#define for_each_pipe_masked(__dev_priv, __p, __mask) \
> > + for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes;
> > (__p)++) \
> > + for_each_if ((__mask) & (1 << (__p)))
> > #define for_each_plane(__dev_priv, __pipe, __p)
> > \
> > for ((__p) = 0;
> > \
> > (__p) < INTEL_INFO(__dev_priv)->num_sprites[(__pipe)] +
> > 1; \
> > diff --git a/drivers/gpu/drm/i915/i915_irq.c
> > b/drivers/gpu/drm/i915/i915_irq.c
> > index a9048e1b96e5..d1a46ef5ab3f 100644
> > --- a/drivers/gpu/drm/i915/i915_irq.c
> > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > @@ -3349,33 +3349,24 @@ void gen8_irq_power_well_post_enable(struct
> > drm_i915_private *dev_priv,
> > unsigned int pipe_mask)
> > {
> > uint32_t extra_ier = GEN8_PIPE_VBLANK |
> > GEN8_PIPE_FIFO_UNDERRUN;
> > + enum pipe pipe;
> >
> > spin_lock_irq(&dev_priv->irq_lock);
> > - if (pipe_mask & 1 << PIPE_A)
> > - GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_A,
> > - dev_priv->de_irq_mask[PIPE_A],
> > - ~dev_priv->de_irq_mask[PIPE_A] |
> > extra_ier);
> > - if (pipe_mask & 1 << PIPE_B)
> > - GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_B,
> > - dev_priv->de_irq_mask[PIPE_B],
> > - ~dev_priv->de_irq_mask[PIPE_B] |
> > extra_ier);
> > - if (pipe_mask & 1 << PIPE_C)
> > - GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_C,
> > - dev_priv->de_irq_mask[PIPE_C],
> > - ~dev_priv->de_irq_mask[PIPE_C] |
> > extra_ier);
> > + for_each_pipe_masked(dev_priv, pipe, pipe_mask)
> > + GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
> > + dev_priv->de_irq_mask[pipe],
> > + ~dev_priv->de_irq_mask[pipe] |
> > extra_ier);
> > spin_unlock_irq(&dev_priv->irq_lock);
> > }
> >
> > void gen8_irq_power_well_pre_disable(struct drm_i915_private
> > *dev_priv,
> > unsigned int pipe_mask)
> > {
> > + enum pipe pipe;
> > +
> > spin_lock_irq(&dev_priv->irq_lock);
> > - if (pipe_mask & 1 << PIPE_A)
> > - GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_A);
> > - if (pipe_mask & 1 << PIPE_B)
> > - GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_B);
> > - if (pipe_mask & 1 << PIPE_C)
> > - GEN8_IRQ_RESET_NDX(DE_PIPE, PIPE_C);
> > + for_each_pipe_masked(dev_priv, pipe, pipe_mask)
> > + GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
> > spin_unlock_irq(&dev_priv->irq_lock);
> >
> > /* make sure we're done processing display irqs */
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-02-22 17:47 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-19 18:47 [PATCH 1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ ville.syrjala
2016-02-19 18:47 ` [PATCH 2/2] drm/i915: Add for_each_pipe_masked() ville.syrjala
2016-02-22 14:18 ` Imre Deak
2016-02-22 17:47 ` Ville Syrjälä
2016-02-22 11:18 ` ✓ Fi.CI.BAT: success for series starting with [1/2] drm/i915: Make sure pipe interrupts are processed before turning off power well on BDW+ Patchwork
2016-02-22 14:59 ` Ville Syrjälä
2016-02-22 13:59 ` [PATCH 1/2] " Imre Deak
2016-02-22 14:16 ` Ville Syrjälä
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).