linux/drivers/gpu/drm/i915
Daniel Vetter 0a9a8c91a5 drm/i915: unify GT/PM irq postinstall code
Again extract a common helper. For the postinstall hook things are a
bit more complicated since we have more cases on ilk-hsw/vlv here.

But since vlv was clearly broken by failing to initialize
dev_priv->gt_irq_mask correctly the shared code is clearly justified.

Also kill the PMIER setting in the async rps enable work. I should
have been save, but also clearly looked rather fragile. PMIER setup is
now all down in the irq pre/postinstall hooks.

With this we now have the usual interrupt register sequence for GT/PM
irq registers:

- IER is setup once with all the interrupts we ever need in the
  postinstall hook and never touched again. Exceptions are SDEIER,
  which is touched in the preinstall hook (when the irq handler isn't
  enabled) and then only from the irq handler. And DEIER/VLV_IER with
  is used in the irq handler but also written to once in the
  postinstall hook. But since that write is essentially what enables
  the interrupt and we should always have MSI interrupts we should be
  save. In case we ever have non-MSI interrupts we'd be screwed.

- IIR is cleared in the postinstall hook before we enable/unmask the
  respective interrupt sources. Hence we can't steal an interrupt
  event an accidentally trigger the spurious interrupt logic in the
  core kernel. Note that after some discussion with Ben Widawsky we
  think that we actually should clear the IIR registers in the
  preinstall hook. But doing that is a much larger patch series.

- IMR regs are (usually) all masked off. Those are the only regs
  changed at runtime, which is all protected by dev_priv->irq_lock.

This unification also kills the cargo-culted read-modify-write PM
register setup for VECS. Interrupt setup is done without userspace
being able to interfere, so we better know what values we want to put
into those registers. RMW cycles otoh are really good at papering over
races, until stuff magically blows up and no one has a clue why.

v2: Touch the gen6+ PM interrupt registers only on gen6+.

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

Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Paulo Zanoni <przanoni@gmail.com>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
[danvet: Add a comment to explain why the l3 parity interrupt is
special.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-07-16 08:58:12 +02:00
..
dvo_ch7xxx.c drm/i915: add support for dvo Chrontel 7010B 2013-05-20 22:02:49 +02:00
dvo_ch7017.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ivch.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ns2501.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_sil164.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_tfp410.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo.h Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
i915_debugfs.c drm/i915: debugfs entries for [e]LLC 2013-07-16 08:09:12 +02:00
i915_dma.c drm/i915: store eLLC size 2013-07-16 08:08:21 +02:00
i915_drv.c drm/i915: don't frob mm.suspended when not using ums 2013-07-10 14:30:25 +02:00
i915_drv.h drm/i915: store eLLC size 2013-07-16 08:08:21 +02:00
i915_gem_context.c drm/i915: Getter/setter for object attributes 2013-07-08 22:04:34 +02:00
i915_gem_debug.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
i915_gem_dmabuf.c drm/i915: fix dmabuf vmap support 2013-05-01 16:09:31 +10:00
i915_gem_evict.c drm/i915: Embed drm_mm_node in i915 gem obj 2013-07-08 22:04:36 +02:00
i915_gem_execbuffer.c drm/i915: don't frob mm.suspended when not using ums 2013-07-10 14:30:25 +02:00
i915_gem_gtt.c drm/i915: Use eLLC/LLC by default when available 2013-07-16 08:08:39 +02:00
i915_gem_stolen.c drm/i915: WARN if the bios reserved range is bigger than stolen size 2013-07-09 16:53:24 +02:00
i915_gem_tiling.c drm/i915: Getter/setter for object attributes 2013-07-08 22:04:34 +02:00
i915_gem.c drm/i915: store eLLC size 2013-07-16 08:08:21 +02:00
i915_gpu_error.c drm/i915: move error state to own compilation unit 2013-07-12 18:53:13 +02:00
i915_ioc32.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
i915_irq.c drm/i915: unify GT/PM irq postinstall code 2013-07-16 08:58:12 +02:00
i915_reg.h drm/i915: Define some of the eLLC magic 2013-07-16 08:00:52 +02:00
i915_suspend.c drm/i915: protect backlight registers and data with a spinlock 2013-04-25 14:10:10 +02:00
i915_sysfs.c drm/i915: add error_state sysfs entry 2013-07-01 19:39:31 +02:00
i915_trace_points.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
i915_trace.h drm/i915: Getter/setter for object attributes 2013-07-08 22:04:34 +02:00
i915_ums.c drm/i915: scrap register address storage 2013-06-10 19:54:14 +02:00
intel_acpi.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
intel_bios.c drm/i915: Organize VBT stuff inside drm_i915_private 2013-05-10 21:56:46 +02:00
intel_bios.h drm/i915: set CPT FDI RX polarity bits based on VBT 2013-04-18 09:43:31 +02:00
intel_crt.c drm/i915: document why dvo/sdvo/crt need a special dpms function 2013-05-31 20:54:04 +02:00
intel_ddi.c drm/i915: fix the "ghost eDP" encoder unwind path 2013-06-28 14:14:19 +02:00
intel_display.c drm/i915: clear DPLL reg when disabling i9xx dplls 2013-07-12 18:54:02 +02:00
intel_dp.c drm/i915: get mode clock when reading the pipe config v9 2013-07-01 19:37:53 +02:00
intel_drv.h drm/i915: Move fbc members out of line 2013-07-01 11:28:00 +02:00
intel_dvo.c drm/i915: fix dvo DPLL regression 2013-07-08 22:04:37 +02:00
intel_fb.c drm/i915: Getter/setter for object attributes 2013-07-08 22:04:34 +02:00
intel_hdmi.c Revert "drm/i915: Don't use the HDMI port color range bit on Valleyview" 2013-07-01 11:14:53 +02:00
intel_i2c.c drm/i915: avoid premature DP AUX timeouts 2013-05-22 13:51:26 +02:00
intel_lvds.c drm/i915: s/pre_pll/pre/ on the lvds port enable function 2013-07-01 11:27:54 +02:00
intel_modes.c drm/i915: Add "Automatic" mode for the "Broadcast RGB" property 2013-01-20 13:09:44 +01:00
intel_opregion.c drm/i915: tune down DIDL warning about too many outputs 2013-07-01 11:14:42 +02:00
intel_overlay.c drm/i915: move error state to own compilation unit 2013-07-12 18:53:13 +02:00
intel_panel.c drm/i915: Fix WARN_ON() on UP machines 2013-05-23 12:51:30 +02:00
intel_pm.c drm/i915: unify GT/PM irq postinstall code 2013-07-16 08:58:12 +02:00
intel_ringbuffer.c drm/i915: don't enable PM_VEBOX_CS_ERROR_INTERRUPT 2013-07-11 14:37:00 +02:00
intel_ringbuffer.h drm/i915: unify ring irq refcounts (again) 2013-07-11 14:36:49 +02:00
intel_sdvo_regs.h drm/i915: clear the entire sdvo infoframe buffer 2012-10-24 15:12:48 +02:00
intel_sdvo.c drm/i915: Don't attempt to read an unitialized stack value 2013-07-12 17:33:21 +02:00
intel_sideband.c drm/i915: change VLV IOSF sideband accessors to not return error code 2013-05-23 23:25:42 +02:00
intel_sprite.c drm/i915: Getter/setter for object attributes 2013-07-08 22:04:34 +02:00
intel_tv.c drm/i915: consolidate and tighten encoder cloning checks 2013-06-05 12:33:14 +02:00
Makefile drm/i915: move error state to own compilation unit 2013-07-12 18:53:13 +02:00