diff options
| author | Nicholas Kazlauskas <[email protected]> | 2021-11-02 14:27:30 -0400 | 
|---|---|---|
| committer | Alex Deucher <[email protected]> | 2021-11-22 14:45:01 -0500 | 
| commit | a53b554b56e0326edb2ddbbf8c76743191f7819c (patch) | |
| tree | 9be0deedd1d747c27c284b8a606493a09e553854 /drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | |
| parent | c09bb36dd1230838d49a5ebf409df804a5ebfdaa (diff) | |
drm/amd/display: Only flush delta from last command execution
[Why]
We're currently flushing commands that had been previously been
flushed or are currently being processed by the DMCUB when we don't
immediately wait for idle after command execution.
[How]
Avoiding reflushing the data by keeping track of the last wptr.
We'll treat this as the actual rptr by creating a copy of the inbox
and modifying the copy's rptr.
Reviewed-by: Eric Yang <[email protected]>
Acked-by: Wayne Lin <[email protected]>
Signed-off-by: Nicholas Kazlauskas <[email protected]>
Tested-by: Daniel Wheeler <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 9 | 
1 files changed, 8 insertions, 1 deletions
| 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;  } |