Commit ecad80f0 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/hisilicon/hibmc: Use GEM VRAM's prepare_fb() and cleanup_fb() helpers

This patch implements prepare_fb() and cleanup_fb() in hibmc with the
GEM VRAM helpers. In the current code, pinning the BO is performed by
hibmc_plane_atomic_update(), where the operation does not belong.

This patch also fixes a bug where the pinned BO was never unpinned.
Pinning multiple BOs would have exhaused the available VRAM and further
pin operations would have failed, leaving the display in a corrupt
state.
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20191024081404.6978-4-tzimmermann@suse.de
parent eddc0acf
...@@ -96,7 +96,6 @@ static void hibmc_plane_atomic_update(struct drm_plane *plane, ...@@ -96,7 +96,6 @@ static void hibmc_plane_atomic_update(struct drm_plane *plane,
{ {
struct drm_plane_state *state = plane->state; struct drm_plane_state *state = plane->state;
u32 reg; u32 reg;
int ret;
s64 gpu_addr = 0; s64 gpu_addr = 0;
unsigned int line_l; unsigned int line_l;
struct hibmc_drm_private *priv = plane->dev->dev_private; struct hibmc_drm_private *priv = plane->dev->dev_private;
...@@ -109,16 +108,9 @@ static void hibmc_plane_atomic_update(struct drm_plane *plane, ...@@ -109,16 +108,9 @@ static void hibmc_plane_atomic_update(struct drm_plane *plane,
hibmc_fb = to_hibmc_framebuffer(state->fb); hibmc_fb = to_hibmc_framebuffer(state->fb);
gbo = drm_gem_vram_of_gem(hibmc_fb->obj); gbo = drm_gem_vram_of_gem(hibmc_fb->obj);
ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM);
if (ret) {
DRM_ERROR("failed to pin bo: %d", ret);
return;
}
gpu_addr = drm_gem_vram_offset(gbo); gpu_addr = drm_gem_vram_offset(gbo);
if (gpu_addr < 0) { if (WARN_ON_ONCE(gpu_addr < 0))
drm_gem_vram_unpin(gbo); return; /* Bug: we didn't pin the BO to VRAM in prepare_fb. */
return;
}
writel(gpu_addr, priv->mmio + HIBMC_CRT_FB_ADDRESS); writel(gpu_addr, priv->mmio + HIBMC_CRT_FB_ADDRESS);
...@@ -157,6 +149,8 @@ static struct drm_plane_funcs hibmc_plane_funcs = { ...@@ -157,6 +149,8 @@ static struct drm_plane_funcs hibmc_plane_funcs = {
}; };
static const struct drm_plane_helper_funcs hibmc_plane_helper_funcs = { static const struct drm_plane_helper_funcs hibmc_plane_helper_funcs = {
.prepare_fb = drm_gem_vram_plane_helper_prepare_fb,
.cleanup_fb = drm_gem_vram_plane_helper_cleanup_fb,
.atomic_check = hibmc_plane_atomic_check, .atomic_check = hibmc_plane_atomic_check,
.atomic_update = hibmc_plane_atomic_update, .atomic_update = hibmc_plane_atomic_update,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment