diff options
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 | 18 | 
1 files changed, 15 insertions, 3 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 e43e8d4bfe37..5d36f3e5dc2b 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c @@ -707,9 +707,16 @@ enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub)  		return DMUB_STATUS_INVALID;  	if (dmub->hw_funcs.get_inbox1_rptr && dmub->hw_funcs.get_inbox1_wptr) { -		dmub->inbox1_rb.rptr = dmub->hw_funcs.get_inbox1_rptr(dmub); -		dmub->inbox1_rb.wrpt = dmub->hw_funcs.get_inbox1_wptr(dmub); -		dmub->inbox1_last_wptr = dmub->inbox1_rb.wrpt; +		uint32_t rptr = dmub->hw_funcs.get_inbox1_rptr(dmub); +		uint32_t wptr = dmub->hw_funcs.get_inbox1_wptr(dmub); + +		if (rptr > dmub->inbox1_rb.capacity || wptr > dmub->inbox1_rb.capacity) { +			return DMUB_STATUS_HW_FAILURE; +		} else { +			dmub->inbox1_rb.rptr = rptr; +			dmub->inbox1_rb.wrpt = wptr; +			dmub->inbox1_last_wptr = dmub->inbox1_rb.wrpt; +		}  	}  	return DMUB_STATUS_OK; @@ -743,6 +750,11 @@ enum dmub_status dmub_srv_cmd_queue(struct dmub_srv *dmub,  	if (!dmub->hw_init)  		return DMUB_STATUS_INVALID; +	if (dmub->inbox1_rb.rptr > dmub->inbox1_rb.capacity || +	    dmub->inbox1_rb.wrpt > dmub->inbox1_rb.capacity) { +		return DMUB_STATUS_HW_FAILURE; +	} +  	if (dmub_rb_push_front(&dmub->inbox1_rb, cmd))  		return DMUB_STATUS_OK;  |