Commit df78f7f6 authored by Lyude Paul's avatar Lyude Paul

drm/display/dp_mst: Call them time slots, not VCPI slots

VCPI is only sort of the correct term here, originally the majority of this
code simply referred to timeslots vaguely as "slots" - and since I started
working on it and adding atomic functionality, the name "VCPI slots" has
been used to represent time slots.

Now that we actually have consistent access to the DisplayPort spec thanks
to VESA, I now know this isn't actually the proper term - as the
specification refers to these as time slots.

Since we're trying to make this code as easy to figure out as possible,
let's take this opportunity to correct this nomenclature and call them by
their proper name - timeslots. Likewise, we rename various functions
appropriately, along with replacing references in the kernel documentation
and various debugging messages.

It's important to note that this patch series leaves the legacy MST code
untouched for the most part, which is fine since we'll be removing it soon
anyhow. There should be no functional changes in this series.

v2:
* Add note that Wayne Lin from AMD suggested regarding slots being between
  the source DP Tx and the immediate downstream DP Rx
Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
Cc: Wayne Lin <Wayne.Lin@amd.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Fangzhi Zuo <Jerry.Zuo@amd.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Sean Paul <sean@poorly.run>
Acked-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220817193847.557945-5-lyude@redhat.com
parent 48b6b372
...@@ -6401,7 +6401,7 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder, ...@@ -6401,7 +6401,7 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,
clock = adjusted_mode->clock; clock = adjusted_mode->clock;
dm_new_connector_state->pbn = drm_dp_calc_pbn_mode(clock, bpp, false); dm_new_connector_state->pbn = drm_dp_calc_pbn_mode(clock, bpp, false);
} }
dm_new_connector_state->vcpi_slots = drm_dp_atomic_find_vcpi_slots(state, dm_new_connector_state->vcpi_slots = drm_dp_atomic_find_time_slots(state,
mst_mgr, mst_mgr,
mst_port, mst_port,
dm_new_connector_state->pbn, dm_new_connector_state->pbn,
......
...@@ -472,7 +472,7 @@ static int dm_dp_mst_atomic_check(struct drm_connector *connector, ...@@ -472,7 +472,7 @@ static int dm_dp_mst_atomic_check(struct drm_connector *connector,
return 0; return 0;
} }
return drm_dp_atomic_release_vcpi_slots(state, return drm_dp_atomic_release_time_slots(state,
mst_mgr, mst_mgr,
mst_port); mst_port);
} }
...@@ -785,7 +785,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state, ...@@ -785,7 +785,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state,
if (initial_slack[next_index] > fair_pbn_alloc) { if (initial_slack[next_index] > fair_pbn_alloc) {
vars[next_index].pbn += fair_pbn_alloc; vars[next_index].pbn += fair_pbn_alloc;
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[next_index].port->mgr, params[next_index].port->mgr,
params[next_index].port, params[next_index].port,
vars[next_index].pbn, vars[next_index].pbn,
...@@ -795,7 +795,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state, ...@@ -795,7 +795,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state,
vars[next_index].bpp_x16 = bpp_x16_from_pbn(params[next_index], vars[next_index].pbn); vars[next_index].bpp_x16 = bpp_x16_from_pbn(params[next_index], vars[next_index].pbn);
} else { } else {
vars[next_index].pbn -= fair_pbn_alloc; vars[next_index].pbn -= fair_pbn_alloc;
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[next_index].port->mgr, params[next_index].port->mgr,
params[next_index].port, params[next_index].port,
vars[next_index].pbn, vars[next_index].pbn,
...@@ -804,7 +804,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state, ...@@ -804,7 +804,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state,
} }
} else { } else {
vars[next_index].pbn += initial_slack[next_index]; vars[next_index].pbn += initial_slack[next_index];
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[next_index].port->mgr, params[next_index].port->mgr,
params[next_index].port, params[next_index].port,
vars[next_index].pbn, vars[next_index].pbn,
...@@ -814,7 +814,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state, ...@@ -814,7 +814,7 @@ static bool increase_dsc_bpp(struct drm_atomic_state *state,
vars[next_index].bpp_x16 = params[next_index].bw_range.max_target_bpp_x16; vars[next_index].bpp_x16 = params[next_index].bw_range.max_target_bpp_x16;
} else { } else {
vars[next_index].pbn -= initial_slack[next_index]; vars[next_index].pbn -= initial_slack[next_index];
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[next_index].port->mgr, params[next_index].port->mgr,
params[next_index].port, params[next_index].port,
vars[next_index].pbn, vars[next_index].pbn,
...@@ -872,7 +872,7 @@ static bool try_disable_dsc(struct drm_atomic_state *state, ...@@ -872,7 +872,7 @@ static bool try_disable_dsc(struct drm_atomic_state *state,
break; break;
vars[next_index].pbn = kbps_to_peak_pbn(params[next_index].bw_range.stream_kbps); vars[next_index].pbn = kbps_to_peak_pbn(params[next_index].bw_range.stream_kbps);
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[next_index].port->mgr, params[next_index].port->mgr,
params[next_index].port, params[next_index].port,
vars[next_index].pbn, vars[next_index].pbn,
...@@ -884,7 +884,7 @@ static bool try_disable_dsc(struct drm_atomic_state *state, ...@@ -884,7 +884,7 @@ static bool try_disable_dsc(struct drm_atomic_state *state,
vars[next_index].bpp_x16 = 0; vars[next_index].bpp_x16 = 0;
} else { } else {
vars[next_index].pbn = kbps_to_peak_pbn(params[next_index].bw_range.max_kbps); vars[next_index].pbn = kbps_to_peak_pbn(params[next_index].bw_range.max_kbps);
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[next_index].port->mgr, params[next_index].port->mgr,
params[next_index].port, params[next_index].port,
vars[next_index].pbn, vars[next_index].pbn,
...@@ -971,11 +971,11 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state, ...@@ -971,11 +971,11 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps); vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps);
vars[i + k].dsc_enabled = false; vars[i + k].dsc_enabled = false;
vars[i + k].bpp_x16 = 0; vars[i + k].bpp_x16 = 0;
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[i].port->mgr, params[i].port->mgr,
params[i].port, params[i].port,
vars[i + k].pbn, vars[i + k].pbn,
dm_mst_get_pbn_divider(dc_link)) < 0) dm_mst_get_pbn_divider(dc_link)) < 0)
return false; return false;
} }
if (!drm_dp_mst_atomic_check(state) && !debugfs_overwrite) { if (!drm_dp_mst_atomic_check(state) && !debugfs_overwrite) {
...@@ -989,7 +989,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state, ...@@ -989,7 +989,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.min_kbps); vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.min_kbps);
vars[i + k].dsc_enabled = true; vars[i + k].dsc_enabled = true;
vars[i + k].bpp_x16 = params[i].bw_range.min_target_bpp_x16; vars[i + k].bpp_x16 = params[i].bw_range.min_target_bpp_x16;
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[i].port->mgr, params[i].port->mgr,
params[i].port, params[i].port,
vars[i + k].pbn, vars[i + k].pbn,
...@@ -999,7 +999,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state, ...@@ -999,7 +999,7 @@ static bool compute_mst_dsc_configs_for_link(struct drm_atomic_state *state,
vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps); vars[i + k].pbn = kbps_to_peak_pbn(params[i].bw_range.stream_kbps);
vars[i + k].dsc_enabled = false; vars[i + k].dsc_enabled = false;
vars[i + k].bpp_x16 = 0; vars[i + k].bpp_x16 = 0;
if (drm_dp_atomic_find_vcpi_slots(state, if (drm_dp_atomic_find_time_slots(state,
params[i].port->mgr, params[i].port->mgr,
params[i].port, params[i].port,
vars[i + k].pbn, vars[i + k].pbn,
......
...@@ -4293,11 +4293,11 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_ ...@@ -4293,11 +4293,11 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
EXPORT_SYMBOL(drm_dp_mst_get_edid); EXPORT_SYMBOL(drm_dp_mst_get_edid);
/** /**
* drm_dp_find_vcpi_slots() - Find VCPI slots for this PBN value * drm_dp_find_vcpi_slots() - Find time slots for this PBN value
* @mgr: manager to use * @mgr: manager to use
* @pbn: payload bandwidth to convert into slots. * @pbn: payload bandwidth to convert into slots.
* *
* Calculate the number of VCPI slots that will be required for the given PBN * Calculate the number of time slots that will be required for the given PBN
* value. This function is deprecated, and should not be used in atomic * value. This function is deprecated, and should not be used in atomic
* drivers. * drivers.
* *
...@@ -4334,17 +4334,17 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, ...@@ -4334,17 +4334,17 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
} }
/** /**
* drm_dp_atomic_find_vcpi_slots() - Find and add VCPI slots to the state * drm_dp_atomic_find_time_slots() - Find and add time slots to the state
* @state: global atomic state * @state: global atomic state
* @mgr: MST topology manager for the port * @mgr: MST topology manager for the port
* @port: port to find vcpi slots for * @port: port to find time slots for
* @pbn: bandwidth required for the mode in PBN * @pbn: bandwidth required for the mode in PBN
* @pbn_div: divider for DSC mode that takes FEC into account * @pbn_div: divider for DSC mode that takes FEC into account
* *
* Allocates VCPI slots to @port, replacing any previous VCPI allocations it * Allocates time slots to @port, replacing any previous timeslot allocations it
* may have had. Any atomic drivers which support MST must call this function * may have had. Any atomic drivers which support MST must call this function
* in their &drm_encoder_helper_funcs.atomic_check() callback to change the * in their &drm_encoder_helper_funcs.atomic_check() callback to change the
* current VCPI allocation for the new state, but only when * current timeslot allocation for the new state, but only when
* &drm_crtc_state.mode_changed or &drm_crtc_state.connectors_changed is set * &drm_crtc_state.mode_changed or &drm_crtc_state.connectors_changed is set
* to ensure compatibility with userspace applications that still use the * to ensure compatibility with userspace applications that still use the
* legacy modesetting UAPI. * legacy modesetting UAPI.
...@@ -4354,17 +4354,17 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, ...@@ -4354,17 +4354,17 @@ static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
* *
* Additionally, it is OK to call this function multiple times on the same * Additionally, it is OK to call this function multiple times on the same
* @port as needed. It is not OK however, to call this function and * @port as needed. It is not OK however, to call this function and
* drm_dp_atomic_release_vcpi_slots() in the same atomic check phase. * drm_dp_atomic_release_time_slots() in the same atomic check phase.
* *
* See also: * See also:
* drm_dp_atomic_release_vcpi_slots() * drm_dp_atomic_release_time_slots()
* drm_dp_mst_atomic_check() * drm_dp_mst_atomic_check()
* *
* Returns: * Returns:
* Total slots in the atomic state assigned for this port, or a negative error * Total slots in the atomic state assigned for this port, or a negative error
* code if the port no longer exists * code if the port no longer exists
*/ */
int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state, int drm_dp_atomic_find_time_slots(struct drm_atomic_state *state,
struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_port *port, int pbn, struct drm_dp_mst_port *port, int pbn,
int pbn_div) int pbn_div)
...@@ -4381,17 +4381,17 @@ int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state, ...@@ -4381,17 +4381,17 @@ int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
list_for_each_entry(pos, &topology_state->payloads, next) { list_for_each_entry(pos, &topology_state->payloads, next) {
if (pos->port == port) { if (pos->port == port) {
payload = pos; payload = pos;
prev_slots = payload->vcpi; prev_slots = payload->time_slots;
prev_bw = payload->pbn; prev_bw = payload->pbn;
/* /*
* This should never happen, unless the driver tries * This should never happen, unless the driver tries
* releasing and allocating the same VCPI allocation, * releasing and allocating the same timeslot allocation,
* which is an error * which is an error
*/ */
if (WARN_ON(!prev_slots)) { if (WARN_ON(!prev_slots)) {
drm_err(mgr->dev, drm_err(mgr->dev,
"cannot allocate and release VCPI on [MST PORT:%p] in the same state\n", "cannot allocate and release time slots on [MST PORT:%p] in the same state\n",
port); port);
return -EINVAL; return -EINVAL;
} }
...@@ -4409,7 +4409,7 @@ int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state, ...@@ -4409,7 +4409,7 @@ int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
req_slots = DIV_ROUND_UP(pbn, pbn_div); req_slots = DIV_ROUND_UP(pbn, pbn_div);
drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] VCPI %d -> %d\n", drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] TU %d -> %d\n",
port->connector->base.id, port->connector->name, port->connector->base.id, port->connector->name,
port, prev_slots, req_slots); port, prev_slots, req_slots);
drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] PBN %d -> %d\n", drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] PBN %d -> %d\n",
...@@ -4426,20 +4426,20 @@ int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state, ...@@ -4426,20 +4426,20 @@ int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
payload->port = port; payload->port = port;
list_add(&payload->next, &topology_state->payloads); list_add(&payload->next, &topology_state->payloads);
} }
payload->vcpi = req_slots; payload->time_slots = req_slots;
payload->pbn = pbn; payload->pbn = pbn;
return req_slots; return req_slots;
} }
EXPORT_SYMBOL(drm_dp_atomic_find_vcpi_slots); EXPORT_SYMBOL(drm_dp_atomic_find_time_slots);
/** /**
* drm_dp_atomic_release_vcpi_slots() - Release allocated vcpi slots * drm_dp_atomic_release_time_slots() - Release allocated time slots
* @state: global atomic state * @state: global atomic state
* @mgr: MST topology manager for the port * @mgr: MST topology manager for the port
* @port: The port to release the VCPI slots from * @port: The port to release the time slots from
* *
* Releases any VCPI slots that have been allocated to a port in the atomic * Releases any time slots that have been allocated to a port in the atomic
* state. Any atomic drivers which support MST must call this function in * state. Any atomic drivers which support MST must call this function in
* their &drm_connector_helper_funcs.atomic_check() callback when the * their &drm_connector_helper_funcs.atomic_check() callback when the
* connector will no longer have VCPI allocated (e.g. because its CRTC was * connector will no longer have VCPI allocated (e.g. because its CRTC was
...@@ -4448,18 +4448,18 @@ EXPORT_SYMBOL(drm_dp_atomic_find_vcpi_slots); ...@@ -4448,18 +4448,18 @@ EXPORT_SYMBOL(drm_dp_atomic_find_vcpi_slots);
* It is OK to call this even if @port has been removed from the system. * It is OK to call this even if @port has been removed from the system.
* Additionally, it is OK to call this function multiple times on the same * Additionally, it is OK to call this function multiple times on the same
* @port as needed. It is not OK however, to call this function and * @port as needed. It is not OK however, to call this function and
* drm_dp_atomic_find_vcpi_slots() on the same @port in a single atomic check * drm_dp_atomic_find_time_slots() on the same @port in a single atomic check
* phase. * phase.
* *
* See also: * See also:
* drm_dp_atomic_find_vcpi_slots() * drm_dp_atomic_find_time_slots()
* drm_dp_mst_atomic_check() * drm_dp_mst_atomic_check()
* *
* Returns: * Returns:
* 0 if all slots for this port were added back to * 0 if all slots for this port were added back to
* &drm_dp_mst_topology_state.avail_slots or negative error code * &drm_dp_mst_topology_state.avail_slots or negative error code
*/ */
int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state, int drm_dp_atomic_release_time_slots(struct drm_atomic_state *state,
struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_port *port) struct drm_dp_mst_port *port)
{ {
...@@ -4483,16 +4483,16 @@ int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state, ...@@ -4483,16 +4483,16 @@ int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
return -EINVAL; return -EINVAL;
} }
drm_dbg_atomic(mgr->dev, "[MST PORT:%p] VCPI %d -> 0\n", port, pos->vcpi); drm_dbg_atomic(mgr->dev, "[MST PORT:%p] TU %d -> 0\n", port, pos->time_slots);
if (pos->vcpi) { if (pos->time_slots) {
drm_dp_mst_put_port_malloc(port); drm_dp_mst_put_port_malloc(port);
pos->vcpi = 0; pos->time_slots = 0;
pos->pbn = 0; pos->pbn = 0;
} }
return 0; return 0;
} }
EXPORT_SYMBOL(drm_dp_atomic_release_vcpi_slots); EXPORT_SYMBOL(drm_dp_atomic_release_time_slots);
/** /**
* drm_dp_mst_update_slots() - updates the slot info depending on the DP ecoding format * drm_dp_mst_update_slots() - updates the slot info depending on the DP ecoding format
...@@ -4546,7 +4546,7 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, ...@@ -4546,7 +4546,7 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots); ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn, slots);
if (ret) { if (ret) {
drm_dbg_kms(mgr->dev, "failed to init vcpi slots=%d ret=%d\n", drm_dbg_kms(mgr->dev, "failed to init time slots=%d ret=%d\n",
DIV_ROUND_UP(pbn, mgr->pbn_div), ret); DIV_ROUND_UP(pbn, mgr->pbn_div), ret);
drm_dp_mst_topology_put_port(port); drm_dp_mst_topology_put_port(port);
goto out; goto out;
...@@ -5071,8 +5071,8 @@ drm_dp_mst_duplicate_state(struct drm_private_obj *obj) ...@@ -5071,8 +5071,8 @@ drm_dp_mst_duplicate_state(struct drm_private_obj *obj)
INIT_LIST_HEAD(&state->payloads); INIT_LIST_HEAD(&state->payloads);
list_for_each_entry(pos, &old_state->payloads, next) { list_for_each_entry(pos, &old_state->payloads, next) {
/* Prune leftover freed VCPI allocations */ /* Prune leftover freed timeslot allocations */
if (!pos->vcpi) if (!pos->time_slots)
continue; continue;
payload = kmemdup(pos, sizeof(*payload), GFP_KERNEL); payload = kmemdup(pos, sizeof(*payload), GFP_KERNEL);
...@@ -5104,7 +5104,7 @@ static void drm_dp_mst_destroy_state(struct drm_private_obj *obj, ...@@ -5104,7 +5104,7 @@ static void drm_dp_mst_destroy_state(struct drm_private_obj *obj,
list_for_each_entry_safe(pos, tmp, &mst_state->payloads, next) { list_for_each_entry_safe(pos, tmp, &mst_state->payloads, next) {
/* We only keep references to ports with non-zero VCPIs */ /* We only keep references to ports with non-zero VCPIs */
if (pos->vcpi) if (pos->time_slots)
drm_dp_mst_put_port_malloc(pos->port); drm_dp_mst_put_port_malloc(pos->port);
kfree(pos); kfree(pos);
} }
...@@ -5230,28 +5230,28 @@ drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port, ...@@ -5230,28 +5230,28 @@ drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port,
} }
static inline int static inline int
drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr, drm_dp_mst_atomic_check_payload_alloc_limits(struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_topology_state *mst_state) struct drm_dp_mst_topology_state *mst_state)
{ {
struct drm_dp_mst_atomic_payload *payload; struct drm_dp_mst_atomic_payload *payload;
int avail_slots = mst_state->total_avail_slots, payload_count = 0; int avail_slots = mst_state->total_avail_slots, payload_count = 0;
list_for_each_entry(payload, &mst_state->payloads, next) { list_for_each_entry(payload, &mst_state->payloads, next) {
/* Releasing payloads is always OK-even if the port is gone */ /* Releasing payloads is always OK-even if the port is gone */
if (!payload->vcpi) { if (!payload->time_slots) {
drm_dbg_atomic(mgr->dev, "[MST PORT:%p] releases all VCPI slots\n", drm_dbg_atomic(mgr->dev, "[MST PORT:%p] releases all time slots\n",
payload->port); payload->port);
continue; continue;
} }
drm_dbg_atomic(mgr->dev, "[MST PORT:%p] requires %d vcpi slots\n", drm_dbg_atomic(mgr->dev, "[MST PORT:%p] requires %d time slots\n",
payload->port, payload->vcpi); payload->port, payload->time_slots);
avail_slots -= payload->vcpi; avail_slots -= payload->time_slots;
if (avail_slots < 0) { if (avail_slots < 0) {
drm_dbg_atomic(mgr->dev, drm_dbg_atomic(mgr->dev,
"[MST PORT:%p] not enough VCPI slots in mst state %p (avail=%d)\n", "[MST PORT:%p] not enough time slots in mst state %p (avail=%d)\n",
payload->port, mst_state, avail_slots + payload->vcpi); payload->port, mst_state, avail_slots + payload->time_slots);
return -ENOSPC; return -ENOSPC;
} }
...@@ -5262,7 +5262,7 @@ drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr, ...@@ -5262,7 +5262,7 @@ drm_dp_mst_atomic_check_vcpi_alloc_limit(struct drm_dp_mst_topology_mgr *mgr,
return -EINVAL; return -EINVAL;
} }
} }
drm_dbg_atomic(mgr->dev, "[MST MGR:%p] mst state %p VCPI avail=%d used=%d\n", drm_dbg_atomic(mgr->dev, "[MST MGR:%p] mst state %p TU avail=%d used=%d\n",
mgr, mst_state, avail_slots, mst_state->total_avail_slots - avail_slots); mgr, mst_state, avail_slots, mst_state->total_avail_slots - avail_slots);
return 0; return 0;
...@@ -5351,7 +5351,7 @@ int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state, ...@@ -5351,7 +5351,7 @@ int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state,
struct drm_dp_mst_topology_state *mst_state; struct drm_dp_mst_topology_state *mst_state;
struct drm_dp_mst_atomic_payload *pos; struct drm_dp_mst_atomic_payload *pos;
bool found = false; bool found = false;
int vcpi = 0; int time_slots = 0;
mst_state = drm_atomic_get_mst_topology_state(state, port->mgr); mst_state = drm_atomic_get_mst_topology_state(state, port->mgr);
...@@ -5367,30 +5367,30 @@ int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state, ...@@ -5367,30 +5367,30 @@ int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state,
if (!found) { if (!found) {
drm_dbg_atomic(state->dev, drm_dbg_atomic(state->dev,
"[MST PORT:%p] Couldn't find VCPI allocation in mst state %p\n", "[MST PORT:%p] Couldn't find payload in mst state %p\n",
port, mst_state); port, mst_state);
return -EINVAL; return -EINVAL;
} }
if (pos->dsc_enabled == enable) { if (pos->dsc_enabled == enable) {
drm_dbg_atomic(state->dev, drm_dbg_atomic(state->dev,
"[MST PORT:%p] DSC flag is already set to %d, returning %d VCPI slots\n", "[MST PORT:%p] DSC flag is already set to %d, returning %d time slots\n",
port, enable, pos->vcpi); port, enable, pos->time_slots);
vcpi = pos->vcpi; time_slots = pos->time_slots;
} }
if (enable) { if (enable) {
vcpi = drm_dp_atomic_find_vcpi_slots(state, port->mgr, port, pbn, pbn_div); time_slots = drm_dp_atomic_find_time_slots(state, port->mgr, port, pbn, pbn_div);
drm_dbg_atomic(state->dev, drm_dbg_atomic(state->dev,
"[MST PORT:%p] Enabling DSC flag, reallocating %d VCPI slots on the port\n", "[MST PORT:%p] Enabling DSC flag, reallocating %d time slots on the port\n",
port, vcpi); port, time_slots);
if (vcpi < 0) if (time_slots < 0)
return -EINVAL; return -EINVAL;
} }
pos->dsc_enabled = enable; pos->dsc_enabled = enable;
return vcpi; return time_slots;
} }
EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc); EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc);
/** /**
...@@ -5400,15 +5400,15 @@ EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc); ...@@ -5400,15 +5400,15 @@ EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc);
* *
* Checks the given topology state for an atomic update to ensure that it's * Checks the given topology state for an atomic update to ensure that it's
* valid. This includes checking whether there's enough bandwidth to support * valid. This includes checking whether there's enough bandwidth to support
* the new VCPI allocations in the atomic update. * the new timeslot allocations in the atomic update.
* *
* Any atomic drivers supporting DP MST must make sure to call this after * Any atomic drivers supporting DP MST must make sure to call this after
* checking the rest of their state in their * checking the rest of their state in their
* &drm_mode_config_funcs.atomic_check() callback. * &drm_mode_config_funcs.atomic_check() callback.
* *
* See also: * See also:
* drm_dp_atomic_find_vcpi_slots() * drm_dp_atomic_find_time_slots()
* drm_dp_atomic_release_vcpi_slots() * drm_dp_atomic_release_time_slots()
* *
* Returns: * Returns:
* *
...@@ -5424,7 +5424,7 @@ int drm_dp_mst_atomic_check(struct drm_atomic_state *state) ...@@ -5424,7 +5424,7 @@ int drm_dp_mst_atomic_check(struct drm_atomic_state *state)
if (!mgr->mst_state) if (!mgr->mst_state)
continue; continue;
ret = drm_dp_mst_atomic_check_vcpi_alloc_limit(mgr, mst_state); ret = drm_dp_mst_atomic_check_payload_alloc_limits(mgr, mst_state);
if (ret) if (ret)
break; break;
......
...@@ -70,7 +70,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder, ...@@ -70,7 +70,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
crtc_state->pipe_bpp, crtc_state->pipe_bpp,
false); false);
slots = drm_dp_atomic_find_vcpi_slots(state, &intel_dp->mst_mgr, slots = drm_dp_atomic_find_time_slots(state, &intel_dp->mst_mgr,
connector->port, connector->port,
crtc_state->pbn, crtc_state->pbn,
drm_dp_get_vc_payload_bw(&intel_dp->mst_mgr, drm_dp_get_vc_payload_bw(&intel_dp->mst_mgr,
...@@ -344,8 +344,7 @@ intel_dp_mst_atomic_check(struct drm_connector *connector, ...@@ -344,8 +344,7 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
} }
mgr = &enc_to_mst(to_intel_encoder(old_conn_state->best_encoder))->primary->dp.mst_mgr; mgr = &enc_to_mst(to_intel_encoder(old_conn_state->best_encoder))->primary->dp.mst_mgr;
ret = drm_dp_atomic_release_vcpi_slots(&state->base, mgr, ret = drm_dp_atomic_release_time_slots(&state->base, mgr, intel_connector->port);
intel_connector->port);
return ret; return ret;
} }
......
...@@ -1065,7 +1065,7 @@ nv50_msto_atomic_check(struct drm_encoder *encoder, ...@@ -1065,7 +1065,7 @@ nv50_msto_atomic_check(struct drm_encoder *encoder,
false); false);
} }
slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr, mstc->port, slots = drm_dp_atomic_find_time_slots(state, &mstm->mgr, mstc->port,
asyh->dp.pbn, 0); asyh->dp.pbn, 0);
if (slots < 0) if (slots < 0)
return slots; return slots;
...@@ -1277,7 +1277,7 @@ nv50_mstc_atomic_check(struct drm_connector *connector, ...@@ -1277,7 +1277,7 @@ nv50_mstc_atomic_check(struct drm_connector *connector,
return 0; return 0;
} }
return drm_dp_atomic_release_vcpi_slots(state, mgr, mstc->port); return drm_dp_atomic_release_time_slots(state, mgr, mstc->port);
} }
static int static int
......
...@@ -544,7 +544,13 @@ struct drm_dp_payload { ...@@ -544,7 +544,13 @@ struct drm_dp_payload {
struct drm_dp_mst_atomic_payload { struct drm_dp_mst_atomic_payload {
struct drm_dp_mst_port *port; struct drm_dp_mst_port *port;
int vcpi;
/**
* @time_slots:
* The number of timeslots allocated to this payload from the source DP Tx to
* the immediate downstream DP Rx
*/
int time_slots;
int pbn; int pbn;
bool dsc_enabled; bool dsc_enabled;
struct list_head next; struct list_head next;
...@@ -846,7 +852,7 @@ void drm_dp_mst_connector_early_unregister(struct drm_connector *connector, ...@@ -846,7 +852,7 @@ void drm_dp_mst_connector_early_unregister(struct drm_connector *connector,
struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_atomic_state *state, struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_atomic_state *state,
struct drm_dp_mst_topology_mgr *mgr); struct drm_dp_mst_topology_mgr *mgr);
int __must_check int __must_check
drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state, drm_dp_atomic_find_time_slots(struct drm_atomic_state *state,
struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_port *port, int pbn, struct drm_dp_mst_port *port, int pbn,
int pbn_div); int pbn_div);
...@@ -858,7 +864,7 @@ int __must_check ...@@ -858,7 +864,7 @@ int __must_check
drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state,
struct drm_dp_mst_topology_mgr *mgr); struct drm_dp_mst_topology_mgr *mgr);
int __must_check int __must_check
drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state, drm_dp_atomic_release_time_slots(struct drm_atomic_state *state,
struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_port *port); struct drm_dp_mst_port *port);
int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr, int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment