diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_fb.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fb.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 40b0c087b592..0b7b486c97e8 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -59,10 +59,12 @@ static struct fb_ops radeonfb_ops = { | |||
59 | .fb_pan_display = drm_fb_helper_pan_display, | 59 | .fb_pan_display = drm_fb_helper_pan_display, |
60 | .fb_blank = drm_fb_helper_blank, | 60 | .fb_blank = drm_fb_helper_blank, |
61 | .fb_setcmap = drm_fb_helper_setcmap, | 61 | .fb_setcmap = drm_fb_helper_setcmap, |
62 | .fb_debug_enter = drm_fb_helper_debug_enter, | ||
63 | .fb_debug_leave = drm_fb_helper_debug_leave, | ||
62 | }; | 64 | }; |
63 | 65 | ||
64 | 66 | ||
65 | static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled) | 67 | int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled) |
66 | { | 68 | { |
67 | int aligned = width; | 69 | int aligned = width; |
68 | int align_large = (ASIC_IS_AVIVO(rdev)) || tiled; | 70 | int align_large = (ASIC_IS_AVIVO(rdev)) || tiled; |
@@ -88,7 +90,7 @@ static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bo | |||
88 | 90 | ||
89 | static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj) | 91 | static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj) |
90 | { | 92 | { |
91 | struct radeon_bo *rbo = gobj->driver_private; | 93 | struct radeon_bo *rbo = gem_to_radeon_bo(gobj); |
92 | int ret; | 94 | int ret; |
93 | 95 | ||
94 | ret = radeon_bo_reserve(rbo, false); | 96 | ret = radeon_bo_reserve(rbo, false); |
@@ -111,11 +113,14 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev, | |||
111 | u32 tiling_flags = 0; | 113 | u32 tiling_flags = 0; |
112 | int ret; | 114 | int ret; |
113 | int aligned_size, size; | 115 | int aligned_size, size; |
116 | int height = mode_cmd->height; | ||
114 | 117 | ||
115 | /* need to align pitch with crtc limits */ | 118 | /* need to align pitch with crtc limits */ |
116 | mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8); | 119 | mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8); |
117 | 120 | ||
118 | size = mode_cmd->pitch * mode_cmd->height; | 121 | if (rdev->family >= CHIP_R600) |
122 | height = ALIGN(mode_cmd->height, 8); | ||
123 | size = mode_cmd->pitch * height; | ||
119 | aligned_size = ALIGN(size, PAGE_SIZE); | 124 | aligned_size = ALIGN(size, PAGE_SIZE); |
120 | ret = radeon_gem_object_create(rdev, aligned_size, 0, | 125 | ret = radeon_gem_object_create(rdev, aligned_size, 0, |
121 | RADEON_GEM_DOMAIN_VRAM, | 126 | RADEON_GEM_DOMAIN_VRAM, |
@@ -126,7 +131,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev, | |||
126 | aligned_size); | 131 | aligned_size); |
127 | return -ENOMEM; | 132 | return -ENOMEM; |
128 | } | 133 | } |
129 | rbo = gobj->driver_private; | 134 | rbo = gem_to_radeon_bo(gobj); |
130 | 135 | ||
131 | if (fb_tiled) | 136 | if (fb_tiled) |
132 | tiling_flags = RADEON_TILING_MACRO; | 137 | tiling_flags = RADEON_TILING_MACRO; |
@@ -200,7 +205,7 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
200 | mode_cmd.depth = sizes->surface_depth; | 205 | mode_cmd.depth = sizes->surface_depth; |
201 | 206 | ||
202 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); | 207 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); |
203 | rbo = gobj->driver_private; | 208 | rbo = gem_to_radeon_bo(gobj); |
204 | 209 | ||
205 | /* okay we have an object now allocate the framebuffer */ | 210 | /* okay we have an object now allocate the framebuffer */ |
206 | info = framebuffer_alloc(0, device); | 211 | info = framebuffer_alloc(0, device); |
@@ -243,10 +248,8 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
243 | goto out_unref; | 248 | goto out_unref; |
244 | } | 249 | } |
245 | info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base; | 250 | info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base; |
246 | info->apertures->ranges[0].size = rdev->mc.real_vram_size; | 251 | info->apertures->ranges[0].size = rdev->mc.aper_size; |
247 | 252 | ||
248 | info->fix.mmio_start = 0; | ||
249 | info->fix.mmio_len = 0; | ||
250 | info->pixmap.size = 64*1024; | 253 | info->pixmap.size = 64*1024; |
251 | info->pixmap.buf_align = 8; | 254 | info->pixmap.buf_align = 8; |
252 | info->pixmap.access_align = 32; | 255 | info->pixmap.access_align = 32; |
@@ -403,14 +406,14 @@ int radeon_fbdev_total_size(struct radeon_device *rdev) | |||
403 | struct radeon_bo *robj; | 406 | struct radeon_bo *robj; |
404 | int size = 0; | 407 | int size = 0; |
405 | 408 | ||
406 | robj = rdev->mode_info.rfbdev->rfb.obj->driver_private; | 409 | robj = gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj); |
407 | size += radeon_bo_size(robj); | 410 | size += radeon_bo_size(robj); |
408 | return size; | 411 | return size; |
409 | } | 412 | } |
410 | 413 | ||
411 | bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) | 414 | bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) |
412 | { | 415 | { |
413 | if (robj == rdev->mode_info.rfbdev->rfb.obj->driver_private) | 416 | if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj)) |
414 | return true; | 417 | return true; |
415 | return false; | 418 | return false; |
416 | } | 419 | } |