diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2012-11-02 14:14:02 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-11-11 17:51:42 -0500 |
commit | 1abd02e2dd7e0bd577000301fb2fd47780637387 (patch) | |
tree | 9f0029d3410fe4b6c96253ce467e6071ad0db7c6 /drivers/gpu/drm/i915 | |
parent | 4fc688ce79772496503d22263d61b071a8fb596e (diff) |
drm/i915: don't rewrite the GTT on resume v4
The BIOS shouldn't be touching this memory across suspend/resume, so
just leave it alone. This saves us ~6ms on resume on my T420 (retested
with write combined PTEs).
v2: change gtt restore default on pre-gen4 (Chris)
move needs_gtt_restore flag into dev_priv
v3: make sure we restore GTT on resume from hibernate (Daniel)
use opregion support as the cutoff for restore from resume (Chris)
v4: use a better check for opregion (Chris)
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
[danvet: Kill the needs_gtt_restore indirection and check directly for
OpRegion. Also explain in a comment what's going on.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 43 |
2 files changed, 33 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 4f3c9337df90..ff06e3239ada 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1594,7 +1594,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1594 | intel_setup_gmbus(dev); | 1594 | intel_setup_gmbus(dev); |
1595 | intel_opregion_setup(dev); | 1595 | intel_opregion_setup(dev); |
1596 | 1596 | ||
1597 | /* Make sure the bios did its job and set up vital registers */ | ||
1598 | intel_setup_bios(dev); | 1597 | intel_setup_bios(dev); |
1599 | 1598 | ||
1600 | i915_gem_load(dev); | 1599 | i915_gem_load(dev); |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 577858bd0809..f8ba5feb9277 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -537,19 +537,11 @@ void intel_console_resume(struct work_struct *work) | |||
537 | console_unlock(); | 537 | console_unlock(); |
538 | } | 538 | } |
539 | 539 | ||
540 | static int i915_drm_thaw(struct drm_device *dev) | 540 | static int __i915_drm_thaw(struct drm_device *dev) |
541 | { | 541 | { |
542 | struct drm_i915_private *dev_priv = dev->dev_private; | 542 | struct drm_i915_private *dev_priv = dev->dev_private; |
543 | int error = 0; | 543 | int error = 0; |
544 | 544 | ||
545 | intel_gt_reset(dev); | ||
546 | |||
547 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
548 | mutex_lock(&dev->struct_mutex); | ||
549 | i915_gem_restore_gtt_mappings(dev); | ||
550 | mutex_unlock(&dev->struct_mutex); | ||
551 | } | ||
552 | |||
553 | i915_restore_state(dev); | 545 | i915_restore_state(dev); |
554 | intel_opregion_setup(dev); | 546 | intel_opregion_setup(dev); |
555 | 547 | ||
@@ -588,8 +580,26 @@ static int i915_drm_thaw(struct drm_device *dev) | |||
588 | return error; | 580 | return error; |
589 | } | 581 | } |
590 | 582 | ||
583 | static int i915_drm_thaw(struct drm_device *dev) | ||
584 | { | ||
585 | int error = 0; | ||
586 | |||
587 | intel_gt_reset(dev); | ||
588 | |||
589 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | ||
590 | mutex_lock(&dev->struct_mutex); | ||
591 | i915_gem_restore_gtt_mappings(dev); | ||
592 | mutex_unlock(&dev->struct_mutex); | ||
593 | } | ||
594 | |||
595 | __i915_drm_thaw(dev); | ||
596 | |||
597 | return error; | ||
598 | } | ||
599 | |||
591 | int i915_resume(struct drm_device *dev) | 600 | int i915_resume(struct drm_device *dev) |
592 | { | 601 | { |
602 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
593 | int ret; | 603 | int ret; |
594 | 604 | ||
595 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) | 605 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
@@ -600,7 +610,20 @@ int i915_resume(struct drm_device *dev) | |||
600 | 610 | ||
601 | pci_set_master(dev->pdev); | 611 | pci_set_master(dev->pdev); |
602 | 612 | ||
603 | ret = i915_drm_thaw(dev); | 613 | intel_gt_reset(dev); |
614 | |||
615 | /* | ||
616 | * Platforms with opregion should have sane BIOS, older ones (gen3 and | ||
617 | * earlier) need this since the BIOS might clear all our scratch PTEs. | ||
618 | */ | ||
619 | if (drm_core_check_feature(dev, DRIVER_MODESET) && | ||
620 | !dev_priv->opregion.header) { | ||
621 | mutex_lock(&dev->struct_mutex); | ||
622 | i915_gem_restore_gtt_mappings(dev); | ||
623 | mutex_unlock(&dev->struct_mutex); | ||
624 | } | ||
625 | |||
626 | ret = __i915_drm_thaw(dev); | ||
604 | if (ret) | 627 | if (ret) |
605 | return ret; | 628 | return ret; |
606 | 629 | ||