aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_fb.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/radeon/radeon_fb.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_fb.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c23
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
65static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled) 67int 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
89static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj) 91static 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
411bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) 414bool 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}