Merge branch 'drm-intel-next' of git://anongit.freedesktop.org/drm-intel into drm...
[cascardo/linux.git] / drivers / gpu / drm / i915 / intel_fbdev.c
index ab8d09a..99e2753 100644 (file)
@@ -150,10 +150,10 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
        if (size * 2 < ggtt->stolen_usable_size)
                obj = i915_gem_object_create_stolen(dev, size);
        if (obj == NULL)
-               obj = i915_gem_alloc_object(dev, size);
-       if (!obj) {
+               obj = i915_gem_object_create(dev, size);
+       if (IS_ERR(obj)) {
                DRM_ERROR("failed to allocate framebuffer\n");
-               ret = -ENOMEM;
+               ret = PTR_ERR(obj);
                goto out;
        }
 
@@ -186,9 +186,11 @@ static int intelfb_create(struct drm_fb_helper *helper,
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct fb_info *info;
        struct drm_framebuffer *fb;
+       struct i915_vma *vma;
        struct drm_i915_gem_object *obj;
-       int size, ret;
        bool prealloc = false;
+       void *vaddr;
+       int ret;
 
        if (intel_fb &&
            (sizes->fb_width > intel_fb->base.width ||
@@ -214,7 +216,6 @@ static int intelfb_create(struct drm_fb_helper *helper,
        }
 
        obj = intel_fb->obj;
-       size = obj->base.size;
 
        mutex_lock(&dev->struct_mutex);
 
@@ -244,22 +245,23 @@ static int intelfb_create(struct drm_fb_helper *helper,
        info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
        info->fbops = &intelfb_ops;
 
+       vma = i915_gem_obj_to_ggtt(obj);
+
        /* setup aperture base/size for vesafb takeover */
        info->apertures->ranges[0].base = dev->mode_config.fb_base;
        info->apertures->ranges[0].size = ggtt->mappable_end;
 
-       info->fix.smem_start = dev->mode_config.fb_base + i915_gem_obj_ggtt_offset(obj);
-       info->fix.smem_len = size;
+       info->fix.smem_start = dev->mode_config.fb_base + vma->node.start;
+       info->fix.smem_len = vma->node.size;
 
-       info->screen_base =
-               ioremap_wc(ggtt->mappable_base + i915_gem_obj_ggtt_offset(obj),
-                          size);
-       if (!info->screen_base) {
+       vaddr = i915_vma_pin_iomap(vma);
+       if (IS_ERR(vaddr)) {
                DRM_ERROR("Failed to remap framebuffer into virtual memory\n");
-               ret = -ENOSPC;
+               ret = PTR_ERR(vaddr);
                goto out_destroy_fbi;
        }
-       info->screen_size = size;
+       info->screen_base = vaddr;
+       info->screen_size = vma->node.size;
 
        /* This driver doesn't need a VT switch to restore the mode on resume */
        info->skip_vt_switch = true;
@@ -287,7 +289,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
 out_destroy_fbi:
        drm_fb_helper_release_fbi(helper);
 out_unpin:
-       i915_gem_object_ggtt_unpin(obj);
+       intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
 out_unlock:
        mutex_unlock(&dev->struct_mutex);
        return ret;
@@ -551,6 +553,11 @@ static void intel_fbdev_destroy(struct drm_device *dev,
 
        if (ifbdev->fb) {
                drm_framebuffer_unregister_private(&ifbdev->fb->base);
+
+               mutex_lock(&dev->struct_mutex);
+               intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
+               mutex_unlock(&dev->struct_mutex);
+
                drm_framebuffer_remove(&ifbdev->fb->base);
        }
 }