|
@@ -227,6 +227,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
|
|
|
|
|
info = drm_fb_helper_alloc_fbi(helper);
|
|
info = drm_fb_helper_alloc_fbi(helper);
|
|
if (IS_ERR(info)) {
|
|
if (IS_ERR(info)) {
|
|
|
|
+ DRM_ERROR("Failed to allocate fb_info\n");
|
|
ret = PTR_ERR(info);
|
|
ret = PTR_ERR(info);
|
|
goto out_unpin;
|
|
goto out_unpin;
|
|
}
|
|
}
|
|
@@ -253,6 +254,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
|
ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
|
|
ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
|
|
size);
|
|
size);
|
|
if (!info->screen_base) {
|
|
if (!info->screen_base) {
|
|
|
|
+ DRM_ERROR("Failed to remap framebuffer into virtual memory\n");
|
|
ret = -ENOSPC;
|
|
ret = -ENOSPC;
|
|
goto out_destroy_fbi;
|
|
goto out_destroy_fbi;
|
|
}
|
|
}
|
|
@@ -285,7 +287,6 @@ out_destroy_fbi:
|
|
drm_fb_helper_release_fbi(helper);
|
|
drm_fb_helper_release_fbi(helper);
|
|
out_unpin:
|
|
out_unpin:
|
|
i915_gem_object_ggtt_unpin(obj);
|
|
i915_gem_object_ggtt_unpin(obj);
|
|
- drm_gem_object_unreference(&obj->base);
|
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -713,7 +714,9 @@ static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
|
|
struct intel_fbdev *ifbdev = dev_priv->fbdev;
|
|
struct intel_fbdev *ifbdev = dev_priv->fbdev;
|
|
|
|
|
|
/* Due to peculiar init order wrt to hpd handling this is separate. */
|
|
/* Due to peculiar init order wrt to hpd handling this is separate. */
|
|
- drm_fb_helper_initial_config(&ifbdev->helper, ifbdev->preferred_bpp);
|
|
|
|
|
|
+ if (drm_fb_helper_initial_config(&ifbdev->helper,
|
|
|
|
+ ifbdev->preferred_bpp))
|
|
|
|
+ intel_fbdev_fini(dev_priv->dev);
|
|
}
|
|
}
|
|
|
|
|
|
void intel_fbdev_initial_config_async(struct drm_device *dev)
|
|
void intel_fbdev_initial_config_async(struct drm_device *dev)
|
|
@@ -729,7 +732,8 @@ void intel_fbdev_fini(struct drm_device *dev)
|
|
|
|
|
|
flush_work(&dev_priv->fbdev_suspend_work);
|
|
flush_work(&dev_priv->fbdev_suspend_work);
|
|
|
|
|
|
- async_synchronize_full();
|
|
|
|
|
|
+ if (!current_is_async())
|
|
|
|
+ async_synchronize_full();
|
|
intel_fbdev_destroy(dev, dev_priv->fbdev);
|
|
intel_fbdev_destroy(dev, dev_priv->fbdev);
|
|
kfree(dev_priv->fbdev);
|
|
kfree(dev_priv->fbdev);
|
|
dev_priv->fbdev = NULL;
|
|
dev_priv->fbdev = NULL;
|