diff options
| -rw-r--r-- | drivers/gpu/drm/amd/display/dmub/dmub_srv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 9 | 
2 files changed, 9 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h index 90065a09e76a..83855b8a32e9 100644 --- a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h +++ b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h @@ -411,6 +411,7 @@ struct dmub_srv {  	struct dmub_srv_base_funcs funcs;  	struct dmub_srv_hw_funcs hw_funcs;  	struct dmub_rb inbox1_rb; +	uint32_t inbox1_last_wptr;  	/**  	 * outbox1_rb is accessed without locks (dal & dc)  	 * and to be used only in dmub_srv_stat_get_notification() diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c index 56a03328e8e6..6cc897dacd92 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c @@ -609,6 +609,8 @@ enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub,  enum dmub_status dmub_srv_cmd_execute(struct dmub_srv *dmub)  { +	struct dmub_rb flush_rb; +  	if (!dmub->hw_init)  		return DMUB_STATUS_INVALID; @@ -617,9 +619,14 @@ enum dmub_status dmub_srv_cmd_execute(struct dmub_srv *dmub)  	 * been flushed to framebuffer memory. Otherwise DMCUB might  	 * read back stale, fully invalid or partially invalid data.  	 */ -	dmub_rb_flush_pending(&dmub->inbox1_rb); +	flush_rb = dmub->inbox1_rb; +	flush_rb.rptr = dmub->inbox1_last_wptr; +	dmub_rb_flush_pending(&flush_rb);  		dmub->hw_funcs.set_inbox1_wptr(dmub, dmub->inbox1_rb.wrpt); + +	dmub->inbox1_last_wptr = dmub->inbox1_rb.wrpt; +  	return DMUB_STATUS_OK;  } |