goto out;
        }
 
-       /* Flush everything out, we'll be doing GTT only from now on */
-       ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL);
-       if (ret) {
-               DRM_ERROR("failed to pin obj: %d\n", ret);
-               goto out;
-       }
-
        mutex_unlock(&dev->struct_mutex);
 
        ifbdev->fb = to_intel_framebuffer(fb);
 
        mutex_lock(&dev->struct_mutex);
 
+       /* Pin the GGTT vma for our access via info->screen_base.
+        * This also validates that any existing fb inherited from the
+        * BIOS is suitable for own access.
+        */
+       ret = intel_pin_and_fence_fb_obj(NULL, &ifbdev->fb->base, NULL);
+       if (ret)
+               goto out_unlock;
+
        info = drm_fb_helper_alloc_fbi(helper);
        if (IS_ERR(info)) {
                DRM_ERROR("Failed to allocate fb_info\n");
        drm_fb_helper_release_fbi(helper);
 out_unpin:
        i915_gem_object_ggtt_unpin(obj);
+out_unlock:
        mutex_unlock(&dev->struct_mutex);
        return ret;
 }
 static void intel_fbdev_destroy(struct drm_device *dev,
                                struct intel_fbdev *ifbdev)
 {
+       /* We rely on the object-free to release the VMA pinning for
+        * the info->screen_base mmaping. Leaking the VMA is simpler than
+        * trying to rectify all the possible error paths leading here.
+        */
 
        drm_fb_helper_unregister_fbi(&ifbdev->helper);
        drm_fb_helper_release_fbi(&ifbdev->helper);