diff options
Diffstat (limited to 'drivers/gpu/drm/tiny/gm12u320.c')
| -rw-r--r-- | drivers/gpu/drm/tiny/gm12u320.c | 28 | 
1 files changed, 13 insertions, 15 deletions
| diff --git a/drivers/gpu/drm/tiny/gm12u320.c b/drivers/gpu/drm/tiny/gm12u320.c index 23866a54e3f9..a233c86d428b 100644 --- a/drivers/gpu/drm/tiny/gm12u320.c +++ b/drivers/gpu/drm/tiny/gm12u320.c @@ -16,8 +16,9 @@  #include <drm/drm_file.h>  #include <drm/drm_format_helper.h>  #include <drm/drm_fourcc.h> -#include <drm/drm_gem_shmem_helper.h> +#include <drm/drm_gem_atomic_helper.h>  #include <drm/drm_gem_framebuffer_helper.h> +#include <drm/drm_gem_shmem_helper.h>  #include <drm/drm_ioctl.h>  #include <drm/drm_managed.h>  #include <drm/drm_modeset_helper_vtables.h> @@ -95,6 +96,7 @@ struct gm12u320_device {  		struct drm_rect          rect;  		int frame;  		int draw_status_timeout; +		struct dma_buf_map src_map;  	} fb_update;  }; @@ -251,7 +253,6 @@ static void gm12u320_copy_fb_to_blocks(struct gm12u320_device *gm12u320)  {  	int block, dst_offset, len, remain, ret, x1, x2, y1, y2;  	struct drm_framebuffer *fb; -	struct dma_buf_map map;  	void *vaddr;  	u8 *src; @@ -265,20 +266,14 @@ static void gm12u320_copy_fb_to_blocks(struct gm12u320_device *gm12u320)  	x2 = gm12u320->fb_update.rect.x2;  	y1 = gm12u320->fb_update.rect.y1;  	y2 = gm12u320->fb_update.rect.y2; - -	ret = drm_gem_shmem_vmap(fb->obj[0], &map); -	if (ret) { -		GM12U320_ERR("failed to vmap fb: %d\n", ret); -		goto put_fb; -	} -	vaddr = map.vaddr; /* TODO: Use mapping abstraction properly */ +	vaddr = gm12u320->fb_update.src_map.vaddr; /* TODO: Use mapping abstraction properly */  	if (fb->obj[0]->import_attach) {  		ret = dma_buf_begin_cpu_access(  			fb->obj[0]->import_attach->dmabuf, DMA_FROM_DEVICE);  		if (ret) {  			GM12U320_ERR("dma_buf_begin_cpu_access err: %d\n", ret); -			goto vunmap; +			goto put_fb;  		}  	} @@ -322,8 +317,6 @@ static void gm12u320_copy_fb_to_blocks(struct gm12u320_device *gm12u320)  		if (ret)  			GM12U320_ERR("dma_buf_end_cpu_access err: %d\n", ret);  	} -vunmap: -	drm_gem_shmem_vunmap(fb->obj[0], &map);  put_fb:  	drm_framebuffer_put(fb);  	gm12u320->fb_update.fb = NULL; @@ -411,7 +404,7 @@ err:  		GM12U320_ERR("Frame update error: %d\n", ret);  } -static void gm12u320_fb_mark_dirty(struct drm_framebuffer *fb, +static void gm12u320_fb_mark_dirty(struct drm_framebuffer *fb, const struct dma_buf_map *map,  				   struct drm_rect *dirty)  {  	struct gm12u320_device *gm12u320 = to_gm12u320(fb->dev); @@ -425,6 +418,7 @@ static void gm12u320_fb_mark_dirty(struct drm_framebuffer *fb,  		drm_framebuffer_get(fb);  		gm12u320->fb_update.fb = fb;  		gm12u320->fb_update.rect = *dirty; +		gm12u320->fb_update.src_map = *map;  		wakeup = true;  	} else {  		struct drm_rect *rect = &gm12u320->fb_update.rect; @@ -453,6 +447,7 @@ static void gm12u320_stop_fb_update(struct gm12u320_device *gm12u320)  	mutex_lock(&gm12u320->fb_update.lock);  	old_fb = gm12u320->fb_update.fb;  	gm12u320->fb_update.fb = NULL; +	dma_buf_map_clear(&gm12u320->fb_update.src_map);  	mutex_unlock(&gm12u320->fb_update.lock);  	drm_framebuffer_put(old_fb); @@ -565,9 +560,10 @@ static void gm12u320_pipe_enable(struct drm_simple_display_pipe *pipe,  {  	struct drm_rect rect = { 0, 0, GM12U320_USER_WIDTH, GM12U320_HEIGHT };  	struct gm12u320_device *gm12u320 = to_gm12u320(pipe->crtc.dev); +	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);  	gm12u320->fb_update.draw_status_timeout = FIRST_FRAME_TIMEOUT; -	gm12u320_fb_mark_dirty(plane_state->fb, &rect); +	gm12u320_fb_mark_dirty(plane_state->fb, &shadow_plane_state->map[0], &rect);  }  static void gm12u320_pipe_disable(struct drm_simple_display_pipe *pipe) @@ -581,16 +577,18 @@ static void gm12u320_pipe_update(struct drm_simple_display_pipe *pipe,  				 struct drm_plane_state *old_state)  {  	struct drm_plane_state *state = pipe->plane.state; +	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(state);  	struct drm_rect rect;  	if (drm_atomic_helper_damage_merged(old_state, state, &rect)) -		gm12u320_fb_mark_dirty(pipe->plane.state->fb, &rect); +		gm12u320_fb_mark_dirty(state->fb, &shadow_plane_state->map[0], &rect);  }  static const struct drm_simple_display_pipe_funcs gm12u320_pipe_funcs = {  	.enable	    = gm12u320_pipe_enable,  	.disable    = gm12u320_pipe_disable,  	.update	    = gm12u320_pipe_update, +	DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS,  };  static const uint32_t gm12u320_pipe_formats[] = { | 
