diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_fb.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_fb.c | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index af2a1dddc28..701e830d001 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c | |||
| @@ -65,10 +65,9 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 65 | struct fb_info *info; | 65 | struct fb_info *info; |
| 66 | struct drm_framebuffer *fb; | 66 | struct drm_framebuffer *fb; |
| 67 | struct drm_mode_fb_cmd mode_cmd; | 67 | struct drm_mode_fb_cmd mode_cmd; |
| 68 | struct drm_gem_object *fbo = NULL; | 68 | struct drm_i915_gem_object *obj; |
| 69 | struct drm_i915_gem_object *obj_priv; | ||
| 70 | struct device *device = &dev->pdev->dev; | 69 | struct device *device = &dev->pdev->dev; |
| 71 | int size, ret, mmio_bar = IS_GEN2(dev) ? 1 : 0; | 70 | int size, ret; |
| 72 | 71 | ||
| 73 | /* we don't do packed 24bpp */ | 72 | /* we don't do packed 24bpp */ |
| 74 | if (sizes->surface_bpp == 24) | 73 | if (sizes->surface_bpp == 24) |
| @@ -83,18 +82,17 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 83 | 82 | ||
| 84 | size = mode_cmd.pitch * mode_cmd.height; | 83 | size = mode_cmd.pitch * mode_cmd.height; |
| 85 | size = ALIGN(size, PAGE_SIZE); | 84 | size = ALIGN(size, PAGE_SIZE); |
| 86 | fbo = i915_gem_alloc_object(dev, size); | 85 | obj = i915_gem_alloc_object(dev, size); |
| 87 | if (!fbo) { | 86 | if (!obj) { |
| 88 | DRM_ERROR("failed to allocate framebuffer\n"); | 87 | DRM_ERROR("failed to allocate framebuffer\n"); |
| 89 | ret = -ENOMEM; | 88 | ret = -ENOMEM; |
| 90 | goto out; | 89 | goto out; |
| 91 | } | 90 | } |
| 92 | obj_priv = to_intel_bo(fbo); | ||
| 93 | 91 | ||
| 94 | mutex_lock(&dev->struct_mutex); | 92 | mutex_lock(&dev->struct_mutex); |
| 95 | 93 | ||
| 96 | /* Flush everything out, we'll be doing GTT only from now on */ | 94 | /* Flush everything out, we'll be doing GTT only from now on */ |
| 97 | ret = intel_pin_and_fence_fb_obj(dev, fbo, false); | 95 | ret = intel_pin_and_fence_fb_obj(dev, obj, false); |
| 98 | if (ret) { | 96 | if (ret) { |
| 99 | DRM_ERROR("failed to pin fb: %d\n", ret); | 97 | DRM_ERROR("failed to pin fb: %d\n", ret); |
| 100 | goto out_unref; | 98 | goto out_unref; |
| @@ -108,7 +106,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 108 | 106 | ||
| 109 | info->par = ifbdev; | 107 | info->par = ifbdev; |
| 110 | 108 | ||
| 111 | ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, fbo); | 109 | ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, obj); |
| 112 | if (ret) | 110 | if (ret) |
| 113 | goto out_unpin; | 111 | goto out_unpin; |
| 114 | 112 | ||
| @@ -134,11 +132,10 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 134 | else | 132 | else |
| 135 | info->apertures->ranges[0].size = pci_resource_len(dev->pdev, 0); | 133 | info->apertures->ranges[0].size = pci_resource_len(dev->pdev, 0); |
| 136 | 134 | ||
| 137 | info->fix.smem_start = dev->mode_config.fb_base + obj_priv->gtt_offset; | 135 | info->fix.smem_start = dev->mode_config.fb_base + obj->gtt_offset; |
| 138 | info->fix.smem_len = size; | 136 | info->fix.smem_len = size; |
| 139 | 137 | ||
| 140 | info->screen_base = ioremap_wc(dev->agp->base + obj_priv->gtt_offset, | 138 | info->screen_base = ioremap_wc(dev->agp->base + obj->gtt_offset, size); |
| 141 | size); | ||
| 142 | if (!info->screen_base) { | 139 | if (!info->screen_base) { |
| 143 | ret = -ENOSPC; | 140 | ret = -ENOSPC; |
| 144 | goto out_unpin; | 141 | goto out_unpin; |
| @@ -153,13 +150,8 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 153 | 150 | ||
| 154 | // memset(info->screen_base, 0, size); | 151 | // memset(info->screen_base, 0, size); |
| 155 | 152 | ||
| 156 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); | ||
| 157 | drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height); | 153 | drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height); |
| 158 | 154 | ||
| 159 | /* FIXME: we really shouldn't expose mmio space at all */ | ||
| 160 | info->fix.mmio_start = pci_resource_start(dev->pdev, mmio_bar); | ||
| 161 | info->fix.mmio_len = pci_resource_len(dev->pdev, mmio_bar); | ||
| 162 | |||
| 163 | info->pixmap.size = 64*1024; | 155 | info->pixmap.size = 64*1024; |
| 164 | info->pixmap.buf_align = 8; | 156 | info->pixmap.buf_align = 8; |
| 165 | info->pixmap.access_align = 32; | 157 | info->pixmap.access_align = 32; |
| @@ -168,7 +160,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 168 | 160 | ||
| 169 | DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n", | 161 | DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n", |
| 170 | fb->width, fb->height, | 162 | fb->width, fb->height, |
| 171 | obj_priv->gtt_offset, fbo); | 163 | obj->gtt_offset, obj); |
| 172 | 164 | ||
| 173 | 165 | ||
| 174 | mutex_unlock(&dev->struct_mutex); | 166 | mutex_unlock(&dev->struct_mutex); |
| @@ -176,9 +168,9 @@ static int intelfb_create(struct intel_fbdev *ifbdev, | |||
| 176 | return 0; | 168 | return 0; |
| 177 | 169 | ||
| 178 | out_unpin: | 170 | out_unpin: |
| 179 | i915_gem_object_unpin(fbo); | 171 | i915_gem_object_unpin(obj); |
| 180 | out_unref: | 172 | out_unref: |
| 181 | drm_gem_object_unreference(fbo); | 173 | drm_gem_object_unreference(&obj->base); |
| 182 | mutex_unlock(&dev->struct_mutex); | 174 | mutex_unlock(&dev->struct_mutex); |
| 183 | out: | 175 | out: |
| 184 | return ret; | 176 | return ret; |
| @@ -225,7 +217,7 @@ static void intel_fbdev_destroy(struct drm_device *dev, | |||
| 225 | 217 | ||
| 226 | drm_framebuffer_cleanup(&ifb->base); | 218 | drm_framebuffer_cleanup(&ifb->base); |
| 227 | if (ifb->obj) { | 219 | if (ifb->obj) { |
| 228 | drm_gem_object_unreference_unlocked(ifb->obj); | 220 | drm_gem_object_unreference_unlocked(&ifb->obj->base); |
| 229 | ifb->obj = NULL; | 221 | ifb->obj = NULL; |
| 230 | } | 222 | } |
| 231 | } | 223 | } |
