diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 99f158e1baff..42d1a22c1199 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -55,6 +55,7 @@ static const char *amdgpu_asic_name[] = { | |||
55 | "MULLINS", | 55 | "MULLINS", |
56 | "TOPAZ", | 56 | "TOPAZ", |
57 | "TONGA", | 57 | "TONGA", |
58 | "FIJI", | ||
58 | "CARRIZO", | 59 | "CARRIZO", |
59 | "LAST", | 60 | "LAST", |
60 | }; | 61 | }; |
@@ -63,7 +64,7 @@ bool amdgpu_device_is_px(struct drm_device *dev) | |||
63 | { | 64 | { |
64 | struct amdgpu_device *adev = dev->dev_private; | 65 | struct amdgpu_device *adev = dev->dev_private; |
65 | 66 | ||
66 | if (adev->flags & AMDGPU_IS_PX) | 67 | if (adev->flags & AMD_IS_PX) |
67 | return true; | 68 | return true; |
68 | return false; | 69 | return false; |
69 | } | 70 | } |
@@ -1160,6 +1161,7 @@ static int amdgpu_early_init(struct amdgpu_device *adev) | |||
1160 | switch (adev->asic_type) { | 1161 | switch (adev->asic_type) { |
1161 | case CHIP_TOPAZ: | 1162 | case CHIP_TOPAZ: |
1162 | case CHIP_TONGA: | 1163 | case CHIP_TONGA: |
1164 | case CHIP_FIJI: | ||
1163 | case CHIP_CARRIZO: | 1165 | case CHIP_CARRIZO: |
1164 | if (adev->asic_type == CHIP_CARRIZO) | 1166 | if (adev->asic_type == CHIP_CARRIZO) |
1165 | adev->family = AMDGPU_FAMILY_CZ; | 1167 | adev->family = AMDGPU_FAMILY_CZ; |
@@ -1377,7 +1379,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, | |||
1377 | adev->ddev = ddev; | 1379 | adev->ddev = ddev; |
1378 | adev->pdev = pdev; | 1380 | adev->pdev = pdev; |
1379 | adev->flags = flags; | 1381 | adev->flags = flags; |
1380 | adev->asic_type = flags & AMDGPU_ASIC_MASK; | 1382 | adev->asic_type = flags & AMD_ASIC_MASK; |
1381 | adev->is_atom_bios = false; | 1383 | adev->is_atom_bios = false; |
1382 | adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT; | 1384 | adev->usec_timeout = AMDGPU_MAX_USEC_TIMEOUT; |
1383 | adev->mc.gtt_size = 512 * 1024 * 1024; | 1385 | adev->mc.gtt_size = 512 * 1024 * 1024; |
@@ -1523,6 +1525,11 @@ int amdgpu_device_init(struct amdgpu_device *adev, | |||
1523 | return r; | 1525 | return r; |
1524 | } | 1526 | } |
1525 | 1527 | ||
1528 | r = amdgpu_ctx_init(adev, true, &adev->kernel_ctx); | ||
1529 | if (r) { | ||
1530 | dev_err(adev->dev, "failed to create kernel context (%d).\n", r); | ||
1531 | return r; | ||
1532 | } | ||
1526 | r = amdgpu_ib_ring_tests(adev); | 1533 | r = amdgpu_ib_ring_tests(adev); |
1527 | if (r) | 1534 | if (r) |
1528 | DRM_ERROR("ib ring test failed (%d).\n", r); | 1535 | DRM_ERROR("ib ring test failed (%d).\n", r); |
@@ -1584,6 +1591,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev) | |||
1584 | adev->shutdown = true; | 1591 | adev->shutdown = true; |
1585 | /* evict vram memory */ | 1592 | /* evict vram memory */ |
1586 | amdgpu_bo_evict_vram(adev); | 1593 | amdgpu_bo_evict_vram(adev); |
1594 | amdgpu_ctx_fini(&adev->kernel_ctx); | ||
1587 | amdgpu_ib_pool_fini(adev); | 1595 | amdgpu_ib_pool_fini(adev); |
1588 | amdgpu_fence_driver_fini(adev); | 1596 | amdgpu_fence_driver_fini(adev); |
1589 | amdgpu_fbdev_fini(adev); | 1597 | amdgpu_fbdev_fini(adev); |
@@ -1627,8 +1635,7 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon) | |||
1627 | struct amdgpu_device *adev; | 1635 | struct amdgpu_device *adev; |
1628 | struct drm_crtc *crtc; | 1636 | struct drm_crtc *crtc; |
1629 | struct drm_connector *connector; | 1637 | struct drm_connector *connector; |
1630 | int i, r; | 1638 | int r; |
1631 | bool force_completion = false; | ||
1632 | 1639 | ||
1633 | if (dev == NULL || dev->dev_private == NULL) { | 1640 | if (dev == NULL || dev->dev_private == NULL) { |
1634 | return -ENODEV; | 1641 | return -ENODEV; |
@@ -1667,21 +1674,7 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon) | |||
1667 | /* evict vram memory */ | 1674 | /* evict vram memory */ |
1668 | amdgpu_bo_evict_vram(adev); | 1675 | amdgpu_bo_evict_vram(adev); |
1669 | 1676 | ||
1670 | /* wait for gpu to finish processing current batch */ | 1677 | amdgpu_fence_driver_suspend(adev); |
1671 | for (i = 0; i < AMDGPU_MAX_RINGS; i++) { | ||
1672 | struct amdgpu_ring *ring = adev->rings[i]; | ||
1673 | if (!ring) | ||
1674 | continue; | ||
1675 | |||
1676 | r = amdgpu_fence_wait_empty(ring); | ||
1677 | if (r) { | ||
1678 | /* delay GPU reset to resume */ | ||
1679 | force_completion = true; | ||
1680 | } | ||
1681 | } | ||
1682 | if (force_completion) { | ||
1683 | amdgpu_fence_driver_force_completion(adev); | ||
1684 | } | ||
1685 | 1678 | ||
1686 | r = amdgpu_suspend(adev); | 1679 | r = amdgpu_suspend(adev); |
1687 | 1680 | ||
@@ -1739,6 +1732,8 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | |||
1739 | 1732 | ||
1740 | r = amdgpu_resume(adev); | 1733 | r = amdgpu_resume(adev); |
1741 | 1734 | ||
1735 | amdgpu_fence_driver_resume(adev); | ||
1736 | |||
1742 | r = amdgpu_ib_ring_tests(adev); | 1737 | r = amdgpu_ib_ring_tests(adev); |
1743 | if (r) | 1738 | if (r) |
1744 | DRM_ERROR("ib ring test failed (%d).\n", r); | 1739 | DRM_ERROR("ib ring test failed (%d).\n", r); |