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: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20191024081404.6978-4-tzimmermann@suse.de
This commit is contained in:
parent
eddc0acfed
commit
ecad80f086
|
@ -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,
|
||||||
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 = {
|
||||||
};
|
};
|
||||||
|
|
||||||
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,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue