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>
This commit is contained in:
parent
c99c7d6ef9
commit
a110dfe3ab
|
@ -1176,7 +1176,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
/* If atomic, assume fb object is pinned & idle & fenced and
|
||||
* just update base pointers
|
||||
*/
|
||||
obj = radeon_fb->obj;
|
||||
obj = radeon_fb->base.obj[0];
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
|
@ -1442,7 +1442,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
|
||||
if (!atomic && fb && fb != crtc->primary->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
@ -1490,7 +1490,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
target_fb = crtc->primary->fb;
|
||||
}
|
||||
|
||||
obj = radeon_fb->obj;
|
||||
obj = radeon_fb->base.obj[0];
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
|
@ -1642,7 +1642,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
|
||||
if (!atomic && fb && fb != crtc->primary->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
@ -2153,7 +2153,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
|
|||
struct radeon_bo *rbo;
|
||||
|
||||
radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->base.obj[0]);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r))
|
||||
DRM_ERROR("failed to reserve rbo before unpin\n");
|
||||
|
|
|
@ -1599,10 +1599,10 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend,
|
|||
}
|
||||
}
|
||||
|
||||
if (rfb == NULL || rfb->obj == NULL) {
|
||||
if (rfb == NULL || rfb->base.obj[0] == NULL) {
|
||||
continue;
|
||||
}
|
||||
robj = gem_to_radeon_bo(rfb->obj);
|
||||
robj = gem_to_radeon_bo(rfb->base.obj[0]);
|
||||
/* don't unpin kernel fb objects */
|
||||
if (!radeon_fbdev_robj_is_fb(rdev, robj)) {
|
||||
r = radeon_bo_reserve(robj, false);
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_plane_helper.h>
|
||||
#include <drm/drm_edid.h>
|
||||
|
@ -502,14 +503,14 @@ static int radeon_crtc_page_flip_target(struct drm_crtc *crtc,
|
|||
|
||||
/* schedule unpin of the old buffer */
|
||||
old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
|
||||
obj = old_radeon_fb->obj;
|
||||
obj = old_radeon_fb->base.obj[0];
|
||||
|
||||
/* take a reference to the old object */
|
||||
drm_gem_object_get(obj);
|
||||
work->old_rbo = gem_to_radeon_bo(obj);
|
||||
|
||||
new_radeon_fb = to_radeon_framebuffer(fb);
|
||||
obj = new_radeon_fb->obj;
|
||||
obj = new_radeon_fb->base.obj[0];
|
||||
new_rbo = gem_to_radeon_bo(obj);
|
||||
|
||||
/* pin the new buffer */
|
||||
|
@ -1285,27 +1286,9 @@ void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
|||
|
||||
}
|
||||
|
||||
static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
|
||||
{
|
||||
struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
|
||||
|
||||
drm_gem_object_put_unlocked(radeon_fb->obj);
|
||||
drm_framebuffer_cleanup(fb);
|
||||
kfree(radeon_fb);
|
||||
}
|
||||
|
||||
static int radeon_user_framebuffer_create_handle(struct drm_framebuffer *fb,
|
||||
struct drm_file *file_priv,
|
||||
unsigned int *handle)
|
||||
{
|
||||
struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
|
||||
|
||||
return drm_gem_handle_create(file_priv, radeon_fb->obj, handle);
|
||||
}
|
||||
|
||||
static const struct drm_framebuffer_funcs radeon_fb_funcs = {
|
||||
.destroy = radeon_user_framebuffer_destroy,
|
||||
.create_handle = radeon_user_framebuffer_create_handle,
|
||||
.destroy = drm_gem_fb_destroy,
|
||||
.create_handle = drm_gem_fb_create_handle,
|
||||
};
|
||||
|
||||
int
|
||||
|
@ -1315,11 +1298,11 @@ radeon_framebuffer_init(struct drm_device *dev,
|
|||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
rfb->obj = obj;
|
||||
rfb->base.obj[0] = obj;
|
||||
drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
|
||||
ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs);
|
||||
if (ret) {
|
||||
rfb->obj = NULL;
|
||||
rfb->base.obj[0] = NULL;
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -312,9 +312,9 @@ static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfb
|
|||
|
||||
drm_fb_helper_unregister_fbi(&rfbdev->helper);
|
||||
|
||||
if (rfb->obj) {
|
||||
radeonfb_destroy_pinned_object(rfb->obj);
|
||||
rfb->obj = NULL;
|
||||
if (rfb->base.obj[0]) {
|
||||
radeonfb_destroy_pinned_object(rfb->base.obj[0]);
|
||||
rfb->base.obj[0] = NULL;
|
||||
drm_framebuffer_unregister_private(&rfb->base);
|
||||
drm_framebuffer_cleanup(&rfb->base);
|
||||
}
|
||||
|
@ -400,7 +400,7 @@ bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj)
|
|||
if (!rdev->mode_info.rfbdev)
|
||||
return false;
|
||||
|
||||
if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj))
|
||||
if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.base.obj[0]))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -423,7 +423,7 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
}
|
||||
|
||||
/* Pin framebuffer & get tilling informations */
|
||||
obj = radeon_fb->obj;
|
||||
obj = radeon_fb->base.obj[0];
|
||||
rbo = gem_to_radeon_bo(obj);
|
||||
retry:
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
|
@ -451,7 +451,7 @@ retry:
|
|||
struct radeon_bo *old_rbo;
|
||||
unsigned long nsize, osize;
|
||||
|
||||
old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
|
||||
old_rbo = gem_to_radeon_bo(fb->obj[0]);
|
||||
osize = radeon_bo_size(old_rbo);
|
||||
nsize = radeon_bo_size(rbo);
|
||||
if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
|
||||
|
@ -558,8 +558,7 @@ retry:
|
|||
WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
|
||||
|
||||
if (!atomic && fb && fb != crtc->primary->fb) {
|
||||
radeon_fb = to_radeon_framebuffer(fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
rbo = gem_to_radeon_bo(fb->obj[0]);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
|
@ -1093,11 +1092,9 @@ static void radeon_crtc_disable(struct drm_crtc *crtc)
|
|||
radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
|
||||
if (crtc->primary->fb) {
|
||||
int r;
|
||||
struct radeon_framebuffer *radeon_fb;
|
||||
struct radeon_bo *rbo;
|
||||
|
||||
radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
rbo = gem_to_radeon_bo(crtc->primary->fb->obj[0]);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r))
|
||||
DRM_ERROR("failed to reserve rbo before unpin\n");
|
||||
|
|
|
@ -576,7 +576,6 @@ struct radeon_connector {
|
|||
|
||||
struct radeon_framebuffer {
|
||||
struct drm_framebuffer base;
|
||||
struct drm_gem_object *obj;
|
||||
};
|
||||
|
||||
#define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \
|
||||
|
|
Loading…
Reference in New Issue