Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: enable irqs earlier when resuming

We need it to restore the ilk rc6 context, since the gpu wait no
requires interrupts. But in general having interrupts around should
help in code sanity, since more and more stuff is interrupt driven.

This regression has been introduced in

commit 3e9605018ab3e333d51cc90fccfde2031886763b
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date: Tue Nov 27 16:22:54 2012 +0000

drm/i915: Rearrange code to only have a single method for waiting upon the ring

Like in the driver load code we need to make sure that hotplug
interrupts don't cause havoc with our modeset state, hence block them
with the existing infrastructure. Again we ignore races where we might
loose hotplug interrupts ...

Note that the driver load part of the regression has already been
fixed in

commit 52d7ecedac3f96fb562cb482c139015372728638
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date: Sat Dec 1 21:03:22 2012 +0100

drm/i915: reorder setup sequence to have irqs for output setup

v2: Add a note to the commit message about which patch fixed the
driver load part of the regression. Stable kernels need to backport
both patches.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=54691
Cc: stable@vger.kernel.org (for 3.8 only, plese backport
52d7ecedac3f96fb5 first)
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Reported-and-Tested-by: Ilya Tumaykin <itumaykin@gmail.com>
Reviewed-by: Chris wilson <chris@chris-wilson.co.uk> (v1)
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>

+12 -1
+12 -1
drivers/gpu/drm/i915/i915_drv.c
··· 495 495 intel_modeset_disable(dev); 496 496 497 497 drm_irq_uninstall(dev); 498 + dev_priv->enable_hotplug_processing = false; 498 499 } 499 500 500 501 i915_save_state(dev); ··· 569 568 error = i915_gem_init_hw(dev); 570 569 mutex_unlock(&dev->struct_mutex); 571 570 571 + /* We need working interrupts for modeset enabling ... */ 572 + drm_irq_install(dev); 573 + 572 574 intel_modeset_init_hw(dev); 573 575 intel_modeset_setup_hw_state(dev, false); 574 - drm_irq_install(dev); 576 + 577 + /* 578 + * ... but also need to make sure that hotplug processing 579 + * doesn't cause havoc. Like in the driver load code we don't 580 + * bother with the tiny race here where we might loose hotplug 581 + * notifications. 582 + * */ 575 583 intel_hpd_init(dev); 584 + dev_priv->enable_hotplug_processing = true; 576 585 } 577 586 578 587 intel_opregion_init(dev);