}
 
        list_for_each_entry(tmp_adev, reset_device_list, reset_list) {
+               amdgpu_set_init_level(tmp_adev,
+                               AMDGPU_INIT_LEVEL_RESET_RECOVERY);
                dev_info(tmp_adev->dev,
                         "GPU reset succeeded, trying to resume\n");
                r = aldebaran_mode2_restore_ip(tmp_adev);
                                                        tmp_adev);
 
                if (!r) {
+                       amdgpu_set_init_level(tmp_adev,
+                                             AMDGPU_INIT_LEVEL_DEFAULT);
                        amdgpu_irq_gpu_reset_resume_helper(tmp_adev);
 
                        r = amdgpu_ib_ring_tests(tmp_adev);
 
        .hwini_ip_block_mask = AMDGPU_IP_BLK_MASK_ALL,
 };
 
+struct amdgpu_init_level amdgpu_init_recovery = {
+       .level = AMDGPU_INIT_LEVEL_RESET_RECOVERY,
+       .hwini_ip_block_mask = AMDGPU_IP_BLK_MASK_ALL,
+};
+
 /*
  * Minimal blocks needed to be initialized before a XGMI hive can be reset. This
  * is used for cases like reset on initialization where the entire hive needs to
        case AMDGPU_INIT_LEVEL_MINIMAL_XGMI:
                adev->init_lvl = &amdgpu_init_minimal_xgmi;
                break;
+       case AMDGPU_INIT_LEVEL_RESET_RECOVERY:
+               adev->init_lvl = &amdgpu_init_recovery;
+               break;
        case AMDGPU_INIT_LEVEL_DEFAULT:
                fallthrough;
        default:
        struct list_head *device_list_handle;
        bool full_reset, vram_lost = false;
        struct amdgpu_device *tmp_adev;
-       int r;
+       int r, init_level;
 
        device_list_handle = reset_context->reset_device_list;
 
 
        full_reset = test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
 
+       /**
+        * If it's reset on init, it's default init level, otherwise keep level
+        * as recovery level.
+        */
+       if (reset_context->method == AMD_RESET_METHOD_ON_INIT)
+                       init_level = AMDGPU_INIT_LEVEL_DEFAULT;
+       else
+                       init_level = AMDGPU_INIT_LEVEL_RESET_RECOVERY;
+
        r = 0;
        list_for_each_entry(tmp_adev, device_list_handle, reset_list) {
-               /* After reset, it's default init level */
-               amdgpu_set_init_level(tmp_adev, AMDGPU_INIT_LEVEL_DEFAULT);
+               amdgpu_set_init_level(tmp_adev, init_level);
                if (full_reset) {
                        /* post card */
                        amdgpu_ras_set_fed(tmp_adev, false);
 
 out:
                if (!r) {
+                       /* IP init is complete now, set level as default */
+                       amdgpu_set_init_level(tmp_adev,
+                                             AMDGPU_INIT_LEVEL_DEFAULT);
                        amdgpu_irq_gpu_reset_resume_helper(tmp_adev);
                        r = amdgpu_ib_ring_tests(tmp_adev);
                        if (r) {
 
        int r;
        struct amdgpu_device *tmp_adev = (struct amdgpu_device *)reset_ctl->handle;
 
+       amdgpu_set_init_level(tmp_adev, AMDGPU_INIT_LEVEL_RESET_RECOVERY);
        dev_info(tmp_adev->dev,
                        "GPU reset succeeded, trying to resume\n");
        r = sienna_cichlid_mode2_restore_ip(tmp_adev);
 
        amdgpu_irq_gpu_reset_resume_helper(tmp_adev);
 
+       amdgpu_set_init_level(tmp_adev, AMDGPU_INIT_LEVEL_DEFAULT);
        r = amdgpu_ib_ring_tests(tmp_adev);
        if (r) {
                dev_err(tmp_adev->dev,
 
        int r;
        struct amdgpu_device *tmp_adev = (struct amdgpu_device *)reset_ctl->handle;
 
+       amdgpu_set_init_level(tmp_adev, AMDGPU_INIT_LEVEL_RESET_RECOVERY);
        dev_info(tmp_adev->dev,
                        "GPU reset succeeded, trying to resume\n");
        r = smu_v13_0_10_mode2_restore_ip(tmp_adev);
 
        amdgpu_irq_gpu_reset_resume_helper(tmp_adev);
 
+       amdgpu_set_init_level(tmp_adev, AMDGPU_INIT_LEVEL_DEFAULT);
        r = amdgpu_ib_ring_tests(tmp_adev);
        if (r) {
                dev_err(tmp_adev->dev,