Re: [PATCH 3/3] drm/mst: adjust the function drm_dp_remove_payload_part2()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Aug 04, 2023 at 02:20:29PM +0800, Wayne Lin wrote:
> [...]
> diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> index e04f87ff755a..4270178f95f6 100644
> --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> @@ -3382,8 +3382,7 @@ EXPORT_SYMBOL(drm_dp_remove_payload_part1);
>   * drm_dp_remove_payload_part2() - Remove an MST payload locally
>   * @mgr: Manager to use.
>   * @mst_state: The MST atomic state
> - * @old_payload: The payload with its old state
> - * @new_payload: The payload with its latest state
> + * @payload: The payload with its latest state
>   *
>   * Updates the starting time slots of all other payloads which would have been shifted towards
>   * the start of the payload ID table as a result of removing a payload. Driver should call this
> @@ -3392,25 +3391,36 @@ EXPORT_SYMBOL(drm_dp_remove_payload_part1);
>   */
>  void drm_dp_remove_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
>  				 struct drm_dp_mst_topology_state *mst_state,
> -				 const struct drm_dp_mst_atomic_payload *old_payload,
> -				 struct drm_dp_mst_atomic_payload *new_payload)
> +				 struct drm_dp_mst_atomic_payload *payload)
>  {
>  	struct drm_dp_mst_atomic_payload *pos;
> +	u8 time_slots_to_remove;
> +	u8 next_payload_vc_start = mgr->next_start_slot;
> +
> +	/* Find the current allocated time slot number of the payload */
> +	list_for_each_entry(pos, &mst_state->payloads, next) {
> +		if (pos != payload &&
> +		    pos->vc_start_slot > payload->vc_start_slot &&
> +		    pos->vc_start_slot < next_payload_vc_start)
> +			next_payload_vc_start = pos->vc_start_slot;
> +	}
> +
> +	time_slots_to_remove = next_payload_vc_start - payload->vc_start_slot;

Imo, the intuitive way would be to pass the old payload state to this
function - which already contains the required time_slots param - and
refactor things instead moving vc_start_slot from the payload state to
mgr suggested by Ville earlier.

--Imre

>  	/* Remove local payload allocation */
>  	list_for_each_entry(pos, &mst_state->payloads, next) {
> -		if (pos != new_payload && pos->vc_start_slot > new_payload->vc_start_slot)
> -			pos->vc_start_slot -= old_payload->time_slots;
> +		if (pos != payload && pos->vc_start_slot > payload->vc_start_slot)
> +			pos->vc_start_slot -= time_slots_to_remove;
>  	}
> -	new_payload->vc_start_slot = -1;
> +	payload->vc_start_slot = -1;
>  
>  	mgr->payload_count--;
> -	mgr->next_start_slot -= old_payload->time_slots;
> +	mgr->next_start_slot -= time_slots_to_remove;
>  
> -	if (new_payload->delete)
> -		drm_dp_mst_put_port_malloc(new_payload->port);
> +	if (payload->delete)
> +		drm_dp_mst_put_port_malloc(payload->port);
>  
> -	new_payload->payload_allocation_status = DRM_DP_MST_PAYLOAD_ALLOCATION_NONE;
> +	payload->payload_allocation_status = DRM_DP_MST_PAYLOAD_ALLOCATION_NONE;
>  }



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux