aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2015-11-23 03:04:05 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-11-23 03:04:05 -0500
commit92907cbbef8625bb3998d1eb385fc88f23c97a3f (patch)
tree15626ff9287e37c3cb81c7286d6db5a7fd77c854 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
parent15fbfccfe92c62ae8d1ecc647c44157ed01ac02e (diff)
parent1ec218373b8ebda821aec00bb156a9c94fad9cd4 (diff)
Merge tag 'v4.4-rc2' into drm-intel-next-queued
Linux 4.4-rc2 Backmerge to get at commit 1b0e3a049efe471c399674fd954500ce97438d30 Author: Imre Deak <imre.deak@intel.com> Date: Thu Nov 5 23:04:11 2015 +0200 drm/i915/skl: disable display side power well support for now so that we can proplery re-eanble skl power wells in -next. Conflicts are just adjacent lines changed, except for intel_fbdev.c where we need to interleave the changs. Nothing nefarious. Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 6068d8207d10..d5b421330145 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -57,6 +57,7 @@ static const char *amdgpu_asic_name[] = {
57 "TONGA", 57 "TONGA",
58 "FIJI", 58 "FIJI",
59 "CARRIZO", 59 "CARRIZO",
60 "STONEY",
60 "LAST", 61 "LAST",
61}; 62};
62 63
@@ -1022,7 +1023,7 @@ static void amdgpu_check_arguments(struct amdgpu_device *adev)
1022 * amdgpu_switcheroo_set_state - set switcheroo state 1023 * amdgpu_switcheroo_set_state - set switcheroo state
1023 * 1024 *
1024 * @pdev: pci dev pointer 1025 * @pdev: pci dev pointer
1025 * @state: vga switcheroo state 1026 * @state: vga_switcheroo state
1026 * 1027 *
1027 * Callback for the switcheroo driver. Suspends or resumes the 1028 * Callback for the switcheroo driver. Suspends or resumes the
1028 * the asics before or after it is powered up using ACPI methods. 1029 * the asics before or after it is powered up using ACPI methods.
@@ -1165,7 +1166,8 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
1165 case CHIP_TONGA: 1166 case CHIP_TONGA:
1166 case CHIP_FIJI: 1167 case CHIP_FIJI:
1167 case CHIP_CARRIZO: 1168 case CHIP_CARRIZO:
1168 if (adev->asic_type == CHIP_CARRIZO) 1169 case CHIP_STONEY:
1170 if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY)
1169 adev->family = AMDGPU_FAMILY_CZ; 1171 adev->family = AMDGPU_FAMILY_CZ;
1170 else 1172 else
1171 adev->family = AMDGPU_FAMILY_VI; 1173 adev->family = AMDGPU_FAMILY_VI;
@@ -1418,7 +1420,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1418 mutex_init(&adev->gfx.gpu_clock_mutex); 1420 mutex_init(&adev->gfx.gpu_clock_mutex);
1419 mutex_init(&adev->srbm_mutex); 1421 mutex_init(&adev->srbm_mutex);
1420 mutex_init(&adev->grbm_idx_mutex); 1422 mutex_init(&adev->grbm_idx_mutex);
1421 init_rwsem(&adev->exclusive_lock);
1422 mutex_init(&adev->mn_lock); 1423 mutex_init(&adev->mn_lock);
1423 hash_init(adev->mn_hash); 1424 hash_init(adev->mn_hash);
1424 1425
@@ -1657,11 +1658,21 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1657 } 1658 }
1658 drm_modeset_unlock_all(dev); 1659 drm_modeset_unlock_all(dev);
1659 1660
1660 /* unpin the front buffers */ 1661 /* unpin the front buffers and cursors */
1661 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 1662 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1663 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1662 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb); 1664 struct amdgpu_framebuffer *rfb = to_amdgpu_framebuffer(crtc->primary->fb);
1663 struct amdgpu_bo *robj; 1665 struct amdgpu_bo *robj;
1664 1666
1667 if (amdgpu_crtc->cursor_bo) {
1668 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
1669 r = amdgpu_bo_reserve(aobj, false);
1670 if (r == 0) {
1671 amdgpu_bo_unpin(aobj);
1672 amdgpu_bo_unreserve(aobj);
1673 }
1674 }
1675
1665 if (rfb == NULL || rfb->obj == NULL) { 1676 if (rfb == NULL || rfb->obj == NULL) {
1666 continue; 1677 continue;
1667 } 1678 }
@@ -1713,6 +1724,7 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1713{ 1724{
1714 struct drm_connector *connector; 1725 struct drm_connector *connector;
1715 struct amdgpu_device *adev = dev->dev_private; 1726 struct amdgpu_device *adev = dev->dev_private;
1727 struct drm_crtc *crtc;
1716 int r; 1728 int r;
1717 1729
1718 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) 1730 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
@@ -1746,6 +1758,24 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1746 if (r) 1758 if (r)
1747 return r; 1759 return r;
1748 1760
1761 /* pin cursors */
1762 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1763 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1764
1765 if (amdgpu_crtc->cursor_bo) {
1766 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
1767 r = amdgpu_bo_reserve(aobj, false);
1768 if (r == 0) {
1769 r = amdgpu_bo_pin(aobj,
1770 AMDGPU_GEM_DOMAIN_VRAM,
1771 &amdgpu_crtc->cursor_addr);
1772 if (r != 0)
1773 DRM_ERROR("Failed to pin cursor BO (%d)\n", r);
1774 amdgpu_bo_unreserve(aobj);
1775 }
1776 }
1777 }
1778
1749 /* blat the mode back in */ 1779 /* blat the mode back in */
1750 if (fbcon) { 1780 if (fbcon) {
1751 drm_helper_resume_force_mode(dev); 1781 drm_helper_resume_force_mode(dev);
@@ -1785,14 +1815,6 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
1785 int i, r; 1815 int i, r;
1786 int resched; 1816 int resched;
1787 1817
1788 down_write(&adev->exclusive_lock);
1789
1790 if (!adev->needs_reset) {
1791 up_write(&adev->exclusive_lock);
1792 return 0;
1793 }
1794
1795 adev->needs_reset = false;
1796 atomic_inc(&adev->gpu_reset_counter); 1818 atomic_inc(&adev->gpu_reset_counter);
1797 1819
1798 /* block TTM */ 1820 /* block TTM */
@@ -1856,7 +1878,6 @@ retry:
1856 dev_info(adev->dev, "GPU reset failed\n"); 1878 dev_info(adev->dev, "GPU reset failed\n");
1857 } 1879 }
1858 1880
1859 up_write(&adev->exclusive_lock);
1860 return r; 1881 return r;
1861} 1882}
1862 1883