{
struct drm_device *dev = pci_get_drvdata(pdev);
struct amdgpu_device *adev = drm_to_adev(dev);
- int r;
+ int r, i;
bool vram_lost;
+ u32 memsize;
DRM_INFO("PCI error: slot reset callback!!\n");
+ /* wait for asic to come out of reset */
+ msleep(500);
+
pci_restore_state(pdev);
- adev->in_pci_err_recovery = true;
+ /* confirm ASIC came out of reset */
+ for (i = 0; i < adev->usec_timeout; i++) {
+ memsize = amdgpu_asic_get_config_memsize(adev);
+
+ if (memsize != 0xffffffff)
+ break;
+ udelay(1);
+ }
+ if (memsize == 0xffffffff) {
+ r = -ETIME;
+ goto out;
+ }
+
+ /* TODO Call amdgpu_pre_asic_reset instead */
+ adev->in_pci_err_recovery = true;
r = amdgpu_device_ip_suspend(adev);
adev->in_pci_err_recovery = false;
if (r)