aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 4f8fb4ecde34..79fb302fb954 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3165,6 +3165,7 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
3165 3165
3166 /* No need to recover an evicted BO */ 3166 /* No need to recover an evicted BO */
3167 if (shadow->tbo.mem.mem_type != TTM_PL_TT || 3167 if (shadow->tbo.mem.mem_type != TTM_PL_TT ||
3168 shadow->tbo.mem.start == AMDGPU_BO_INVALID_OFFSET ||
3168 shadow->parent->tbo.mem.mem_type != TTM_PL_VRAM) 3169 shadow->parent->tbo.mem.mem_type != TTM_PL_VRAM)
3169 continue; 3170 continue;
3170 3171
@@ -3173,11 +3174,16 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
3173 break; 3174 break;
3174 3175
3175 if (fence) { 3176 if (fence) {
3176 r = dma_fence_wait_timeout(fence, false, tmo); 3177 tmo = dma_fence_wait_timeout(fence, false, tmo);
3177 dma_fence_put(fence); 3178 dma_fence_put(fence);
3178 fence = next; 3179 fence = next;
3179 if (r <= 0) 3180 if (tmo == 0) {
3181 r = -ETIMEDOUT;
3180 break; 3182 break;
3183 } else if (tmo < 0) {
3184 r = tmo;
3185 break;
3186 }
3181 } else { 3187 } else {
3182 fence = next; 3188 fence = next;
3183 } 3189 }
@@ -3188,8 +3194,8 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
3188 tmo = dma_fence_wait_timeout(fence, false, tmo); 3194 tmo = dma_fence_wait_timeout(fence, false, tmo);
3189 dma_fence_put(fence); 3195 dma_fence_put(fence);
3190 3196
3191 if (r <= 0 || tmo <= 0) { 3197 if (r < 0 || tmo <= 0) {
3192 DRM_ERROR("recover vram bo from shadow failed\n"); 3198 DRM_ERROR("recover vram bo from shadow failed, r is %ld, tmo is %ld\n", r, tmo);
3193 return -EIO; 3199 return -EIO;
3194 } 3200 }
3195 3201
@@ -3625,6 +3631,7 @@ static void amdgpu_device_get_min_pci_speed_width(struct amdgpu_device *adev,
3625 struct pci_dev *pdev = adev->pdev; 3631 struct pci_dev *pdev = adev->pdev;
3626 enum pci_bus_speed cur_speed; 3632 enum pci_bus_speed cur_speed;
3627 enum pcie_link_width cur_width; 3633 enum pcie_link_width cur_width;
3634 u32 ret = 1;
3628 3635
3629 *speed = PCI_SPEED_UNKNOWN; 3636 *speed = PCI_SPEED_UNKNOWN;
3630 *width = PCIE_LNK_WIDTH_UNKNOWN; 3637 *width = PCIE_LNK_WIDTH_UNKNOWN;
@@ -3632,6 +3639,10 @@ static void amdgpu_device_get_min_pci_speed_width(struct amdgpu_device *adev,
3632 while (pdev) { 3639 while (pdev) {
3633 cur_speed = pcie_get_speed_cap(pdev); 3640 cur_speed = pcie_get_speed_cap(pdev);
3634 cur_width = pcie_get_width_cap(pdev); 3641 cur_width = pcie_get_width_cap(pdev);
3642 ret = pcie_bandwidth_available(adev->pdev, NULL,
3643 NULL, &cur_width);
3644 if (!ret)
3645 cur_width = PCIE_LNK_WIDTH_RESRV;
3635 3646
3636 if (cur_speed != PCI_SPEED_UNKNOWN) { 3647 if (cur_speed != PCI_SPEED_UNKNOWN) {
3637 if (*speed == PCI_SPEED_UNKNOWN) 3648 if (*speed == PCI_SPEED_UNKNOWN)