drm/i915: sanity check IER at wait_request time

We might sleep here anyway so I hope an extra uncached read is ok to
add.

In #20896 we found that vbetool clobbers the IER. In KMS mode this is
particularly bad since we don't set the interrupt regs late (in
EnterVT), so we'd fail to get *any* interrupts at all after X started
(since some distros have scripts that call vbetool at X startup
apparently).

So this patch checks IER at wait_request time, and re-enables
interrupts if it's been clobbered. In a proper config this check
should never be triggered.

This is really a distro issue, but having a sanity check is nice, as
long as it doesn't have a real performance hit.

Tested-by: Mateusz Kaduk <mateusz.kaduk@gmail.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
[anholt: Moved the check inside of the sleeping case to avoid perf cost]
Signed-off-by: Eric Anholt <eric@anholt.net>

authored by Jesse Barnes and committed by Eric Anholt 802c7eb6 0ba0e9e1

+9
+9
drivers/gpu/drm/i915/i915_gem.c
··· 1691 1691 i915_wait_request(struct drm_device *dev, uint32_t seqno) 1692 1692 { 1693 1693 drm_i915_private_t *dev_priv = dev->dev_private; 1694 + u32 ier; 1694 1695 int ret = 0; 1695 1696 1696 1697 BUG_ON(seqno == 0); 1697 1698 1698 1699 if (!i915_seqno_passed(i915_get_gem_seqno(dev), seqno)) { 1700 + ier = I915_READ(IER); 1701 + if (!ier) { 1702 + DRM_ERROR("something (likely vbetool) disabled " 1703 + "interrupts, re-enabling\n"); 1704 + i915_driver_irq_preinstall(dev); 1705 + i915_driver_irq_postinstall(dev); 1706 + } 1707 + 1699 1708 dev_priv->mm.waiting_gem_seqno = seqno; 1700 1709 i915_user_irq_get(dev); 1701 1710 ret = wait_event_interruptible(dev_priv->irq_queue,