diff options
author | Daniel Stone <daniels@collabora.com> | 2018-03-30 10:11:36 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-04-11 14:07:55 -0400 |
commit | a110dfe3ab28fd4c52f785a7b80131ef5e8b61fb (patch) | |
tree | 2e0ac76fcca3dc5ec79d7101cf6d48d7d54cd34b | |
parent | c99c7d6ef9f610145308577ae5845cd6e14051e2 (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.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fb.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 1 |
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 | ||
1288 | static 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 | |||
1297 | static 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 | |||
1306 | static const struct drm_framebuffer_funcs radeon_fb_funcs = { | 1289 | static 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 | ||
1311 | int | 1294 | int |
@@ -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); |
428 | retry: | 428 | retry: |
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 | ||
577 | struct radeon_framebuffer { | 577 | struct 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) || \ |