[PATCH] radeon: workaround pining failure on low ram gpu
Alex Deucher
alexdeucher at gmail.com
Thu Nov 14 07:38:08 PST 2013
On Tue, Nov 12, 2013 at 10:51 AM, <j.glisse at gmail.com> wrote:
> From: Jerome Glisse <jglisse at redhat.com>
>
> GPU with low amount of ram can fails at pining new framebuffer before
> unpining old one. On such failure, retry with unping old one before
> pining new one allowing to work around the issue. This is somewhat
> ugly but only affect those old GPU we care about.
>
> Signed-off-by: Jerome Glisse <jglisse at redhat.com>
Added to my queue and added stable cc.
Thanks!
> ---
> drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 28 ++++++++++++++++++++++++++++
> 1 file changed, 28 insertions(+)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
> index 0c7b8c6..0b158f9 100644
> --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
> +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
> @@ -422,6 +422,7 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc,
> /* Pin framebuffer & get tilling informations */
> obj = radeon_fb->obj;
> rbo = gem_to_radeon_bo(obj);
> +retry:
> r = radeon_bo_reserve(rbo, false);
> if (unlikely(r != 0))
> return r;
> @@ -430,6 +431,33 @@ int radeon_crtc_do_set_base(struct drm_crtc *crtc,
> &base);
> if (unlikely(r != 0)) {
> radeon_bo_unreserve(rbo);
> +
> + /* On old GPU like RN50 with little vram pining can fails because
> + * current fb is taking all space needed. So instead of unpining
> + * the old buffer after pining the new one, first unpin old one
> + * and then retry pining new one.
> + *
> + * As only master can set mode only master can pin and it is
> + * unlikely the master client will race with itself especialy
> + * on those old gpu with single crtc.
> + *
> + * We don't shutdown the display controller because new buffer
> + * will end up in same spot.
> + */
> + if (!atomic && fb && fb != crtc->fb) {
> + struct radeon_bo *old_rbo;
> + unsigned long nsize, osize;
> +
> + old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
> + osize = radeon_bo_size(old_rbo);
> + nsize = radeon_bo_size(rbo);
> + if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
> + radeon_bo_unpin(old_rbo);
> + radeon_bo_unreserve(old_rbo);
> + fb = NULL;
> + goto retry;
> + }
> + }
> return -EINVAL;
> }
> radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
> --
> 1.8.3.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list