desc->priority = client->priority;
 }
 
+static int guc_stage_desc_pool_create(struct intel_guc *guc)
+{
+       struct i915_vma *vma;
+       void *vaddr;
+
+       vma = intel_guc_allocate_vma(guc,
+                                    PAGE_ALIGN(sizeof(struct guc_stage_desc) *
+                                    GUC_MAX_STAGE_DESCRIPTORS));
+       if (IS_ERR(vma))
+               return PTR_ERR(vma);
+
+       vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
+       if (IS_ERR(vaddr)) {
+               i915_vma_unpin_and_release(&vma);
+               return PTR_ERR(vaddr);
+       }
+
+       guc->stage_desc_pool = vma;
+       guc->stage_desc_pool_vaddr = vaddr;
+       ida_init(&guc->stage_ids);
+
+       return 0;
+}
+
+static void guc_stage_desc_pool_destroy(struct intel_guc *guc)
+{
+       ida_destroy(&guc->stage_ids);
+       i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
+       i915_vma_unpin_and_release(&guc->stage_desc_pool);
+}
+
 /*
  * Initialise/clear the stage descriptor shared with the GuC firmware.
  *
 int i915_guc_submission_init(struct drm_i915_private *dev_priv)
 {
        struct intel_guc *guc = &dev_priv->guc;
-       struct i915_vma *vma;
-       void *vaddr;
        int ret;
 
        if (guc->stage_desc_pool)
                return 0;
 
-       vma = intel_guc_allocate_vma(guc,
-                               PAGE_ALIGN(sizeof(struct guc_stage_desc) *
-                                       GUC_MAX_STAGE_DESCRIPTORS));
-       if (IS_ERR(vma))
-               return PTR_ERR(vma);
-
-       guc->stage_desc_pool = vma;
-
-       vaddr = i915_gem_object_pin_map(guc->stage_desc_pool->obj, I915_MAP_WB);
-       if (IS_ERR(vaddr)) {
-               ret = PTR_ERR(vaddr);
-               goto err_vma;
-       }
-
-       guc->stage_desc_pool_vaddr = vaddr;
+       ret = guc_stage_desc_pool_create(guc);
+       if (ret)
+               return ret;
 
        ret = intel_guc_log_create(guc);
        if (ret < 0)
-               goto err_vaddr;
+               goto err_stage_desc_pool;
 
        ret = guc_ads_create(guc);
        if (ret < 0)
                goto err_log;
 
-       ida_init(&guc->stage_ids);
-
        return 0;
 
 err_log:
        intel_guc_log_destroy(guc);
-err_vaddr:
-       i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
-err_vma:
-       i915_vma_unpin_and_release(&guc->stage_desc_pool);
+err_stage_desc_pool:
+       guc_stage_desc_pool_destroy(guc);
        return ret;
 }
 
 {
        struct intel_guc *guc = &dev_priv->guc;
 
-       ida_destroy(&guc->stage_ids);
        guc_ads_destroy(guc);
        intel_guc_log_destroy(guc);
-       i915_gem_object_unpin_map(guc->stage_desc_pool->obj);
-       i915_vma_unpin_and_release(&guc->stage_desc_pool);
+       guc_stage_desc_pool_destroy(guc);
 }
 
 static void guc_interrupts_capture(struct drm_i915_private *dev_priv)