提交 d18ea1b5 编写于 作者: D Daniel Vetter

drm/i915: unify PM interrupt preinstall sequence

Since the addition of VECS we have a slightly different enable
sequence for PM interrupts on ivb/hsw vs snb and vlv. Usually that
will end up in hard to track down surprises.

Hence unifiy things and since we have copies of this code in 3 places
now, extract it into its own little helper.

Note that this changes the irq preinstall sequence a bit for snb and
vlv: We now also clear the PM registers in the preinstall hook, in
addition to the PM register clearing/setup already done when actually
enabling rps. So this doesn't fix a bug but simply unifies the code
across all platforms. After the postinstall hook is similarly unified
we can rip out the then redundant PM interrupt setup from the rps
code.

v3: Rebase on top of the retained double-GTIIR clearing. Also
resurrect the masking/disabling of the gen6+ PM interrupts as spotted
by Ben Widaswky.

v4: Move the DE interrupt reset code out of gen5_gt_irq_preinstall
back to ironlake_irq_preinstall where it really belongs. Spotted by
Paulo.

v3: Improve the commit message to more clearly spell out why we want
to unify the code and what exactly changes.

Cc: Paulo Zanoni <przanoni@gmail.com>
Reviewed-by: NBen Widawsky <ben@bwidawsk.net>
[danvet: s/GT/PM/ to fix up a comment which Ben spotted while
reviewing.]
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 63573eb7
...@@ -2054,6 +2054,23 @@ static void ibx_irq_preinstall(struct drm_device *dev) ...@@ -2054,6 +2054,23 @@ static void ibx_irq_preinstall(struct drm_device *dev)
POSTING_READ(SDEIER); POSTING_READ(SDEIER);
} }
static void gen5_gt_irq_preinstall(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
/* and GT */
I915_WRITE(GTIMR, 0xffffffff);
I915_WRITE(GTIER, 0x0);
POSTING_READ(GTIER);
if (INTEL_INFO(dev)->gen >= 6) {
/* and PM */
I915_WRITE(GEN6_PMIMR, 0xffffffff);
I915_WRITE(GEN6_PMIER, 0x0);
POSTING_READ(GEN6_PMIER);
}
}
/* drm_dma.h hooks /* drm_dma.h hooks
*/ */
static void ironlake_irq_preinstall(struct drm_device *dev) static void ironlake_irq_preinstall(struct drm_device *dev)
...@@ -2064,16 +2081,11 @@ static void ironlake_irq_preinstall(struct drm_device *dev) ...@@ -2064,16 +2081,11 @@ static void ironlake_irq_preinstall(struct drm_device *dev)
I915_WRITE(HWSTAM, 0xeffe); I915_WRITE(HWSTAM, 0xeffe);
/* XXX hotplug from PCH */
I915_WRITE(DEIMR, 0xffffffff); I915_WRITE(DEIMR, 0xffffffff);
I915_WRITE(DEIER, 0x0); I915_WRITE(DEIER, 0x0);
POSTING_READ(DEIER); POSTING_READ(DEIER);
/* and GT */ gen5_gt_irq_preinstall(dev);
I915_WRITE(GTIMR, 0xffffffff);
I915_WRITE(GTIER, 0x0);
POSTING_READ(GTIER);
ibx_irq_preinstall(dev); ibx_irq_preinstall(dev);
} }
...@@ -2092,15 +2104,7 @@ static void ivybridge_irq_preinstall(struct drm_device *dev) ...@@ -2092,15 +2104,7 @@ static void ivybridge_irq_preinstall(struct drm_device *dev)
I915_WRITE(DEIER, 0x0); I915_WRITE(DEIER, 0x0);
POSTING_READ(DEIER); POSTING_READ(DEIER);
/* and GT */ gen5_gt_irq_preinstall(dev);
I915_WRITE(GTIMR, 0xffffffff);
I915_WRITE(GTIER, 0x0);
POSTING_READ(GTIER);
/* Power management */
I915_WRITE(GEN6_PMIMR, 0xffffffff);
I915_WRITE(GEN6_PMIER, 0x0);
POSTING_READ(GEN6_PMIER);
ibx_irq_preinstall(dev); ibx_irq_preinstall(dev);
} }
...@@ -2121,9 +2125,8 @@ static void valleyview_irq_preinstall(struct drm_device *dev) ...@@ -2121,9 +2125,8 @@ static void valleyview_irq_preinstall(struct drm_device *dev)
/* and GT */ /* and GT */
I915_WRITE(GTIIR, I915_READ(GTIIR)); I915_WRITE(GTIIR, I915_READ(GTIIR));
I915_WRITE(GTIIR, I915_READ(GTIIR)); I915_WRITE(GTIIR, I915_READ(GTIIR));
I915_WRITE(GTIMR, 0xffffffff);
I915_WRITE(GTIER, 0x0); gen5_gt_irq_preinstall(dev);
POSTING_READ(GTIER);
I915_WRITE(DPINVGTT, 0xff); I915_WRITE(DPINVGTT, 0xff);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册