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; > }