aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorjimqu <Jim.Qu@amd.com>2016-09-07 05:09:12 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-09-12 18:12:18 -0400
commit74b0b157845748e5817cae56c891b05d98da5f47 (patch)
treefe59c506c6a985084130a6e525904af1d78e5558 /drivers/gpu/drm/amd/amdgpu
parent3aecd24c65b9539b6faac2a52a9aaa7bc90f4677 (diff)
drm/amd/amdgpu: S4 issue for amdgpu (v2)
reset the asic if adapter is not powerdown when doing freeze() thaw() and restore(), in order to get a valid state of adapter. v2: squash in warning fix from Rex Signed-off-by: JimQu <Jim.Qu@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Tested By: Shawn Starr <shawn.starr@rogers.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c23
2 files changed, 35 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 1aa0364d7961..d324a079fe9b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1895,6 +1895,10 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
1895 /* Shut down the device */ 1895 /* Shut down the device */
1896 pci_disable_device(dev->pdev); 1896 pci_disable_device(dev->pdev);
1897 pci_set_power_state(dev->pdev, PCI_D3hot); 1897 pci_set_power_state(dev->pdev, PCI_D3hot);
1898 } else {
1899 r = amdgpu_asic_reset(adev);
1900 if (r)
1901 DRM_ERROR("amdgpu asic reset failed\n");
1898 } 1902 }
1899 1903
1900 if (fbcon) { 1904 if (fbcon) {
@@ -1925,22 +1929,26 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
1925 dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) 1929 dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
1926 return 0; 1930 return 0;
1927 1931
1928 if (fbcon) { 1932 if (fbcon)
1929 console_lock(); 1933 console_lock();
1930 } 1934
1931 if (resume) { 1935 if (resume) {
1932 pci_set_power_state(dev->pdev, PCI_D0); 1936 pci_set_power_state(dev->pdev, PCI_D0);
1933 pci_restore_state(dev->pdev); 1937 pci_restore_state(dev->pdev);
1934 if (pci_enable_device(dev->pdev)) { 1938 r = pci_enable_device(dev->pdev);
1939 if (r) {
1935 if (fbcon) 1940 if (fbcon)
1936 console_unlock(); 1941 console_unlock();
1937 return -1; 1942 return r;
1938 } 1943 }
1939 } 1944 }
1940 1945
1941 /* post card */ 1946 /* post card */
1942 if (!amdgpu_card_posted(adev)) 1947 if (!amdgpu_card_posted(adev) || !resume) {
1943 amdgpu_atom_asic_init(adev->mode_info.atom_context); 1948 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
1949 if (r)
1950 DRM_ERROR("amdgpu asic init failed\n");
1951 }
1944 1952
1945 r = amdgpu_resume(adev); 1953 r = amdgpu_resume(adev);
1946 if (r) 1954 if (r)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index ea54e3044787..3bbc0faf48c8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -487,6 +487,7 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
487static int amdgpu_pmops_suspend(struct device *dev) 487static int amdgpu_pmops_suspend(struct device *dev)
488{ 488{
489 struct pci_dev *pdev = to_pci_dev(dev); 489 struct pci_dev *pdev = to_pci_dev(dev);
490
490 struct drm_device *drm_dev = pci_get_drvdata(pdev); 491 struct drm_device *drm_dev = pci_get_drvdata(pdev);
491 return amdgpu_device_suspend(drm_dev, true, true); 492 return amdgpu_device_suspend(drm_dev, true, true);
492} 493}
@@ -509,6 +510,7 @@ static int amdgpu_pmops_resume(struct device *dev)
509static int amdgpu_pmops_freeze(struct device *dev) 510static int amdgpu_pmops_freeze(struct device *dev)
510{ 511{
511 struct pci_dev *pdev = to_pci_dev(dev); 512 struct pci_dev *pdev = to_pci_dev(dev);
513
512 struct drm_device *drm_dev = pci_get_drvdata(pdev); 514 struct drm_device *drm_dev = pci_get_drvdata(pdev);
513 return amdgpu_device_suspend(drm_dev, false, true); 515 return amdgpu_device_suspend(drm_dev, false, true);
514} 516}
@@ -516,6 +518,23 @@ static int amdgpu_pmops_freeze(struct device *dev)
516static int amdgpu_pmops_thaw(struct device *dev) 518static int amdgpu_pmops_thaw(struct device *dev)
517{ 519{
518 struct pci_dev *pdev = to_pci_dev(dev); 520 struct pci_dev *pdev = to_pci_dev(dev);
521
522 struct drm_device *drm_dev = pci_get_drvdata(pdev);
523 return amdgpu_device_resume(drm_dev, false, true);
524}
525
526static int amdgpu_pmops_poweroff(struct device *dev)
527{
528 struct pci_dev *pdev = to_pci_dev(dev);
529
530 struct drm_device *drm_dev = pci_get_drvdata(pdev);
531 return amdgpu_device_suspend(drm_dev, true, true);
532}
533
534static int amdgpu_pmops_restore(struct device *dev)
535{
536 struct pci_dev *pdev = to_pci_dev(dev);
537
519 struct drm_device *drm_dev = pci_get_drvdata(pdev); 538 struct drm_device *drm_dev = pci_get_drvdata(pdev);
520 return amdgpu_device_resume(drm_dev, false, true); 539 return amdgpu_device_resume(drm_dev, false, true);
521} 540}
@@ -622,8 +641,8 @@ static const struct dev_pm_ops amdgpu_pm_ops = {
622 .resume = amdgpu_pmops_resume, 641 .resume = amdgpu_pmops_resume,
623 .freeze = amdgpu_pmops_freeze, 642 .freeze = amdgpu_pmops_freeze,
624 .thaw = amdgpu_pmops_thaw, 643 .thaw = amdgpu_pmops_thaw,
625 .poweroff = amdgpu_pmops_freeze, 644 .poweroff = amdgpu_pmops_poweroff,
626 .restore = amdgpu_pmops_resume, 645 .restore = amdgpu_pmops_restore,
627 .runtime_suspend = amdgpu_pmops_runtime_suspend, 646 .runtime_suspend = amdgpu_pmops_runtime_suspend,
628 .runtime_resume = amdgpu_pmops_runtime_resume, 647 .runtime_resume = amdgpu_pmops_runtime_resume,
629 .runtime_idle = amdgpu_pmops_runtime_idle, 648 .runtime_idle = amdgpu_pmops_runtime_idle,