aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2018-03-30 10:11:36 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-04-11 14:07:55 -0400
commita110dfe3ab28fd4c52f785a7b80131ef5e8b61fb (patch)
tree2e0ac76fcca3dc5ec79d7101cf6d48d7d54cd34b
parentc99c7d6ef9f610145308577ae5845cd6e14051e2 (diff)
drm/radeon: Move GEM BO to drm_framebuffer
Since drm_framebuffer can now store GEM objects directly, place them there rather than in our own subclass. As this makes the framebuffer create_handle and destroy functions the same as the GEM framebuffer helper, we can reuse those. Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Daniel Stone <daniels@collabora.com> Cc: Alex Deucher <alexander.deucher@amd.com> Cc: Christian König <christian.koenig@amd.com> Cc: David (ChunMing) Zhou <David1.Zhou@amd.com> Cc: amd-gfx@lists.freedesktop.org Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c31
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_crtc.c11
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
6 files changed, 22 insertions, 43 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 02baaaf20e9d..028a811c1462 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -1176,7 +1176,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
1176 /* If atomic, assume fb object is pinned & idle & fenced and 1176 /* If atomic, assume fb object is pinned & idle & fenced and
1177 * just update base pointers 1177 * just update base pointers
1178 */ 1178 */
1179 obj = radeon_fb->obj; 1179 obj = radeon_fb->base.obj[0];
1180 rbo = gem_to_radeon_bo(obj); 1180 rbo = gem_to_radeon_bo(obj);
1181 r = radeon_bo_reserve(rbo, false); 1181 r = radeon_bo_reserve(rbo, false);
1182 if (unlikely(r != 0)) 1182 if (unlikely(r != 0))
@@ -1442,7 +1442,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
1442 1442
1443 if (!atomic && fb && fb != crtc->primary->fb) { 1443 if (!atomic && fb && fb != crtc->primary->fb) {
1444 radeon_fb = to_radeon_framebuffer(fb); 1444 radeon_fb = to_radeon_framebuffer(fb);
1445 rbo = gem_to_radeon_bo(radeon_fb->obj); 1445 rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
1446 r = radeon_bo_reserve(rbo, false); 1446 r = radeon_bo_reserve(rbo, false);
1447 if (unlikely(r != 0)) 1447 if (unlikely(r != 0))
1448 return r; 1448 return r;
@@ -1490,7 +1490,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
1490 target_fb = crtc->primary->fb; 1490 target_fb = crtc->primary->fb;
1491 } 1491 }
1492 1492
1493 obj = radeon_fb->obj; 1493 obj = radeon_fb->base.obj[0];
1494 rbo = gem_to_radeon_bo(obj); 1494 rbo = gem_to_radeon_bo(obj);
1495 r = radeon_bo_reserve(rbo, false); 1495 r = radeon_bo_reserve(rbo, false);
1496 if (unlikely(r != 0)) 1496 if (unlikely(r != 0))
@@ -1642,7 +1642,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
1642 1642
1643 if (!atomic && fb && fb != crtc->primary->fb) { 1643 if (!atomic && fb && fb != crtc->primary->fb) {
1644 radeon_fb = to_radeon_framebuffer(fb); 1644 radeon_fb = to_radeon_framebuffer(fb);
1645 rbo = gem_to_radeon_bo(radeon_fb->obj); 1645 rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
1646 r = radeon_bo_reserve(rbo, false); 1646 r = radeon_bo_reserve(rbo, false);
1647 if (unlikely(r != 0)) 1647 if (unlikely(r != 0))
1648 return r; 1648 return r;
@@ -2153,7 +2153,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
2153 struct radeon_bo *rbo; 2153 struct radeon_bo *rbo;
2154 2154
2155 radeon_fb = to_radeon_framebuffer(crtc->primary->fb); 2155 radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
2156 rbo = gem_to_radeon_bo(radeon_fb->obj); 2156 rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
2157 r = radeon_bo_reserve(rbo, false); 2157 r = radeon_bo_reserve(rbo, false);
2158 if (unlikely(r)) 2158 if (unlikely(r))
2159 DRM_ERROR("failed to reserve rbo before unpin\n"); 2159 DRM_ERROR("failed to reserve rbo before unpin\n");
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index e415d2c097a7..30c5bc20a60b 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1599,10 +1599,10 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend,
1599 } 1599 }
1600 } 1600 }
1601 1601
1602 if (rfb == NULL || rfb->obj == NULL) { 1602 if (rfb == NULL || rfb->base.obj[0] == NULL) {
1603 continue; 1603 continue;
1604 } 1604 }
1605 robj = gem_to_radeon_bo(rfb->obj); 1605 robj = gem_to_radeon_bo(rfb->base.obj[0]);
1606 /* don't unpin kernel fb objects */ 1606 /* don't unpin kernel fb objects */
1607 if (!radeon_fbdev_robj_is_fb(rdev, robj)) { 1607 if (!radeon_fbdev_robj_is_fb(rdev, robj)) {
1608 r = radeon_bo_reserve(robj, false); 1608 r = radeon_bo_reserve(robj, false);
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 26129b2b082d..dc300128283d 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -32,6 +32,7 @@
32 32
33#include <linux/pm_runtime.h> 33#include <linux/pm_runtime.h>
34#include <drm/drm_crtc_helper.h> 34#include <drm/drm_crtc_helper.h>
35#include <drm/drm_gem_framebuffer_helper.h>
35#include <drm/drm_fb_helper.h> 36#include <drm/drm_fb_helper.h>
36#include <drm/drm_plane_helper.h> 37#include <drm/drm_plane_helper.h>
37#include <drm/drm_edid.h> 38#include <drm/drm_edid.h>
@@ -502,14 +503,14 @@ static int radeon_crtc_page_flip_target(struct drm_crtc *crtc,
502 503
503 /* schedule unpin of the old buffer */ 504 /* schedule unpin of the old buffer */
504 old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb); 505 old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
505 obj = old_radeon_fb->obj; 506 obj = old_radeon_fb->base.obj[0];
506 507
507 /* take a reference to the old object */ 508 /* take a reference to the old object */
508 drm_gem_object_get(obj); 509 drm_gem_object_get(obj);
509 work->old_rbo = gem_to_radeon_bo(obj); 510 work->old_rbo = gem_to_radeon_bo(obj);
510 511
511 new_radeon_fb = to_radeon_framebuffer(fb); 512 new_radeon_fb = to_radeon_framebuffer(fb);
512 obj = new_radeon_fb->obj; 513 obj = new_radeon_fb->base.obj[0];
513 new_rbo = gem_to_radeon_bo(obj); 514 new_rbo = gem_to_radeon_bo(obj);
514 515
515 /* pin the new buffer */ 516 /* pin the new buffer */
@@ -1285,27 +1286,9 @@ void radeon_compute_pll_legacy(struct radeon_pll *pll,
1285 1286
1286} 1287}
1287 1288
1288static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
1289{
1290 struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
1291
1292 drm_gem_object_put_unlocked(radeon_fb->obj);
1293 drm_framebuffer_cleanup(fb);
1294 kfree(radeon_fb);
1295}
1296
1297static int radeon_user_framebuffer_create_handle(struct drm_framebuffer *fb,
1298 struct drm_file *file_priv,
1299 unsigned int *handle)
1300{
1301 struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
1302
1303 return drm_gem_handle_create(file_priv, radeon_fb->obj, handle);
1304}
1305
1306static const struct drm_framebuffer_funcs radeon_fb_funcs = { 1289static const struct drm_framebuffer_funcs radeon_fb_funcs = {
1307 .destroy = radeon_user_framebuffer_destroy, 1290 .destroy = drm_gem_fb_destroy,
1308 .create_handle = radeon_user_framebuffer_create_handle, 1291 .create_handle = drm_gem_fb_create_handle,
1309}; 1292};
1310 1293
1311int 1294int
@@ -1315,11 +1298,11 @@ radeon_framebuffer_init(struct drm_device *dev,
1315 struct drm_gem_object *obj) 1298 struct drm_gem_object *obj)
1316{ 1299{
1317 int ret; 1300 int ret;
1318 rfb->obj = obj; 1301 rfb->base.obj[0] = obj;
1319 drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd); 1302 drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
1320 ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); 1303 ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
1321 if (ret) { 1304 if (ret) {
1322 rfb->obj = NULL; 1305 rfb->base.obj[0] = NULL;
1323 return ret; 1306 return ret;
1324 } 1307 }
1325 return 0; 1308 return 0;
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index 57c5404a1654..6cd99f6a4305 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -312,9 +312,9 @@ static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfb
312 312
313 drm_fb_helper_unregister_fbi(&rfbdev->helper); 313 drm_fb_helper_unregister_fbi(&rfbdev->helper);
314 314
315 if (rfb->obj) { 315 if (rfb->base.obj[0]) {
316 radeonfb_destroy_pinned_object(rfb->obj); 316 radeonfb_destroy_pinned_object(rfb->base.obj[0]);
317 rfb->obj = NULL; 317 rfb->base.obj[0] = NULL;
318 drm_framebuffer_unregister_private(&rfb->base); 318 drm_framebuffer_unregister_private(&rfb->base);
319 drm_framebuffer_cleanup(&rfb->base); 319 drm_framebuffer_cleanup(&rfb->base);
320 } 320 }
@@ -400,7 +400,7 @@ bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj)
400 if (!rdev->mode_info.rfbdev) 400 if (!rdev->mode_info.rfbdev)
401 return false; 401 return false;
402 402
403 if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj)) 403 if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.base.obj[0]))
404 return true; 404 return true;
405 return false; 405 return false;
406} 406}
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index 1f1856e0b1e0..50b3f556845a 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -423,7 +423,7 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc,
423 } 423 }
424 424
425 /* Pin framebuffer & get tilling informations */ 425 /* Pin framebuffer & get tilling informations */
426 obj = radeon_fb->obj; 426 obj = radeon_fb->base.obj[0];
427 rbo = gem_to_radeon_bo(obj); 427 rbo = gem_to_radeon_bo(obj);
428retry: 428retry:
429 r = radeon_bo_reserve(rbo, false); 429 r = radeon_bo_reserve(rbo, false);
@@ -451,7 +451,7 @@ retry:
451 struct radeon_bo *old_rbo; 451 struct radeon_bo *old_rbo;
452 unsigned long nsize, osize; 452 unsigned long nsize, osize;
453 453
454 old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj); 454 old_rbo = gem_to_radeon_bo(fb->obj[0]);
455 osize = radeon_bo_size(old_rbo); 455 osize = radeon_bo_size(old_rbo);
456 nsize = radeon_bo_size(rbo); 456 nsize = radeon_bo_size(rbo);
457 if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) { 457 if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
@@ -558,8 +558,7 @@ retry:
558 WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch); 558 WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
559 559
560 if (!atomic && fb && fb != crtc->primary->fb) { 560 if (!atomic && fb && fb != crtc->primary->fb) {
561 radeon_fb = to_radeon_framebuffer(fb); 561 rbo = gem_to_radeon_bo(fb->obj[0]);
562 rbo = gem_to_radeon_bo(radeon_fb->obj);
563 r = radeon_bo_reserve(rbo, false); 562 r = radeon_bo_reserve(rbo, false);
564 if (unlikely(r != 0)) 563 if (unlikely(r != 0))
565 return r; 564 return r;
@@ -1093,11 +1092,9 @@ static void radeon_crtc_disable(struct drm_crtc *crtc)
1093 radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); 1092 radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1094 if (crtc->primary->fb) { 1093 if (crtc->primary->fb) {
1095 int r; 1094 int r;
1096 struct radeon_framebuffer *radeon_fb;
1097 struct radeon_bo *rbo; 1095 struct radeon_bo *rbo;
1098 1096
1099 radeon_fb = to_radeon_framebuffer(crtc->primary->fb); 1097 rbo = gem_to_radeon_bo(crtc->primary->fb->obj[0]);
1100 rbo = gem_to_radeon_bo(radeon_fb->obj);
1101 r = radeon_bo_reserve(rbo, false); 1098 r = radeon_bo_reserve(rbo, false);
1102 if (unlikely(r)) 1099 if (unlikely(r))
1103 DRM_ERROR("failed to reserve rbo before unpin\n"); 1100 DRM_ERROR("failed to reserve rbo before unpin\n");
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 3243e5e01432..cd93c80332f7 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -576,7 +576,6 @@ struct radeon_connector {
576 576
577struct radeon_framebuffer { 577struct radeon_framebuffer {
578 struct drm_framebuffer base; 578 struct drm_framebuffer base;
579 struct drm_gem_object *obj;
580}; 579};
581 580
582#define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \ 581#define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \