linux/drivers/gpu/drm/i915
Paulo Zanoni 4d3b3d5fd7 drm/i915: fix how we mask PMIMR when adding work to the queue
It seems we've been doing this ever since we started processing the
RPS events on a work queue, on commit "drm/i915: move gen6 rps
handling to workqueue", 4912d04193.

The problem is: when we add work to the queue, instead of just masking
the bits we queued and leaving all the others on their current state,
we mask the bits we queued and unmask all the others. This basically
means we'll be unmasking a bunch of interrupts we're not going to
process. And if you look at gen6_pm_rps_work, we unmask back only
GEN6_PM_RPS_EVENTS, which means the bits we unmasked when adding work
to the queue will remain unmasked after we process the queue.

Notice that even though we unmask those unrelated interrupts, we never
enable them on IER, so they don't fire our interrupt handler, they
just stay there on IIR waiting to be cleared when something else
triggers the interrupt handler.

So this patch does what seems to make more sense: mask only the bits
we add to the queue, without unmasking anything else, and so we'll
unmask them after we process the queue.

As a side effect we also have to remove that WARN, because it is not
only making sure we don't mask useful interrupts, it is also making
sure we do unmask useless interrupts! That piece of code should not be
responsible for knowing which bits should be unmasked, so just don't
assert anything, and trust that snb_disable_pm_irq should be doing the
right thing.

With i915.enable_pc8=1 I was getting ocasional "GEN6_PMIIR is not 0"
error messages due to the fact that we unmask those unrelated
interrupts but don't enable them.

Note: if bugs start bisecting to this patch, then it probably means
someone was relying on the fact that we unmask everything by accident,
then we should fix gen5_gt_irq_postinstall or whoever needs the
accidentally unmasked interrupts. Or maybe I was just wrong and we
need to revert this patch :)

Note: This started to be a more real issue with the addition of the
VEBOX support since now we do enable more than just the minimal set of
RPS interrupts in the IER register. Which means after the first rps
interrupt has happened we will never mask the VEBOX user interrupts
again and so will blow through cpu time needlessly when running video
workloads.

Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
[danvet: Add note that this started to matter with VEBOX much more.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2013-08-23 14:52:30 +02:00
..
dvo_ch7xxx.c drm/i915: dvo_ch7xxx: fix vsync polarity setting 2013-07-25 16:10:22 +02:00
dvo_ch7017.c
dvo_ivch.c
dvo_ns2501.c
dvo_sil164.c
dvo_tfp410.c
dvo.h
i915_debugfs.c drm/i915: Expose energy counter on SNB+ through debugfs 2013-08-23 14:52:25 +02:00
i915_dma.c drm/i915: enable the power well before module unload 2013-08-22 13:31:50 +02:00
i915_drv.c i915: Add a Kconfig option to turn on i915.preliminary_hw_support by default 2013-08-22 13:31:51 +02:00
i915_drv.h drm/i915: add dev_priv->pm_irq_mask 2013-08-23 14:52:28 +02:00
i915_gem_context.c drm/i915: mm_list is per VMA 2013-08-08 14:06:58 +02:00
i915_gem_debug.c drm/i915: Fix #endif comment 2013-08-09 10:45:52 +02:00
i915_gem_dmabuf.c drm/i915: explicit store base gem object in dma_buf->priv 2013-08-22 13:31:49 +02:00
i915_gem_evict.c drm/i915/vma: Correct use after free in eviction 2013-08-23 14:52:21 +02:00
i915_gem_execbuffer.c drm/i915: Only do a chipset flush after a clflush 2013-08-22 13:31:34 +02:00
i915_gem_gtt.c drm/i915: Use Write-Through cacheing for the display plane on Iris 2013-08-22 13:31:38 +02:00
i915_gem_stolen.c drm/i915: clarify error paths in create_stolen_for_preallocated 2013-08-22 13:31:43 +02:00
i915_gem_tiling.c drm/i915: plumb VM into bind/unbind code 2013-08-08 14:04:20 +02:00
i915_gem.c drm/i915: prepare bind_to_vm for preallocated vma 2013-08-22 13:31:53 +02:00
i915_gpu_error.c drm/i915: Get VECS semaphore info on error 2013-08-22 13:31:43 +02:00
i915_ioc32.c
i915_irq.c drm/i915: fix how we mask PMIMR when adding work to the queue 2013-08-23 14:52:30 +02:00
i915_reg.h drm/i915: Expose energy counter on SNB+ through debugfs 2013-08-23 14:52:25 +02:00
i915_suspend.c Linux 3.10 2013-07-18 12:03:29 +02:00
i915_sysfs.c
i915_trace_points.c
i915_trace.h drm/i915: plumb VM into bind/unbind code 2013-08-08 14:04:20 +02:00
i915_ums.c
intel_acpi.c i915: fix ACPI _DSM warning 2013-08-05 19:04:05 +02:00
intel_bios.c
intel_bios.h
intel_crt.c drm/i915/crt: use native encoder->mode_set callback 2013-08-04 21:25:23 +02:00
intel_ddi.c drm/i915: add the FCLK case to intel_ddi_get_cdclk_freq 2013-08-23 14:52:25 +02:00
intel_display.c drm/i915: make IVB FDI training match spec v3 2013-08-23 14:52:21 +02:00
intel_dp.c drm/i915: remove set but unused variables 2013-08-22 13:31:39 +02:00
intel_drv.h drm/i915: wrap GEN6_PMIMR changes 2013-08-23 14:52:26 +02:00
intel_dvo.c drm/i915/dvo: use native encoder ->mode_set callback 2013-08-04 21:25:21 +02:00
intel_fb.c drm/i915: Export intel_framebuffer_fini 2013-08-06 20:08:50 +02:00
intel_hdmi.c drm/i915: remove set but unused variables 2013-08-22 13:31:39 +02:00
intel_i2c.c
intel_lvds.c drm/i915/lvds: use the native encoder ->mode_set callback 2013-08-04 21:25:25 +02:00
intel_modes.c
intel_opregion.c
intel_overlay.c drm/i915: Add VM to pin 2013-08-05 19:04:09 +02:00
intel_panel.c drm/i915: clean up crtc timings computation 2013-08-04 21:25:27 +02:00
intel_pm.c drm/i915: wrap GEN6_PMIMR changes 2013-08-23 14:52:26 +02:00
intel_ringbuffer.c drm/i915: wrap GEN6_PMIMR changes 2013-08-23 14:52:26 +02:00
intel_ringbuffer.h drm/i915: Remove I915_READ_{NOPID, SYNC_0, SYNC_1})() 2013-08-23 14:52:24 +02:00
intel_sdvo_regs.h
intel_sdvo.c i915: Fix SDVO potentially turning off randomly 2013-08-22 13:31:36 +02:00
intel_sideband.c
intel_sprite.c drm/i915: Always call intel_update_sprite_watermarks() when disabling a plane 2013-08-08 14:11:15 +02:00
intel_tv.c drm/i915/tv: Use native encoder->mode_set callback 2013-08-04 21:25:22 +02:00
intel_uncore.c drm/i915: Convert the register access tracepoint to be conditional 2013-07-25 15:22:07 +02:00
Makefile drm/i915: Colocate all GT access routines in the same file 2013-07-25 15:21:50 +02:00