Skip to content

Commit ffac972

Browse files
committed
drm/display/dp_mst: Don't open code modeset checks for releasing time slots
I'm not sure why, but at the time I originally wrote the find/release time slot helpers I thought we should avoid keeping modeset tracking out of the MST helpers. In retrospect though there's no actual good reason to do this, and the logic has ended up being identical across all the drivers using the helpers. Also, it needs to be fixed anyway so we don't break things when going atomic-only with MST. So, let's just move this code into drm_dp_atomic_release_time_slots() and stop open coding it. Signed-off-by: Lyude Paul <[email protected]> Cc: Wayne Lin <[email protected]> Cc: Ville Syrjälä <[email protected]> Cc: Fangzhi Zuo <[email protected]> Cc: Jani Nikula <[email protected]> Cc: Imre Deak <[email protected]> Cc: Daniel Vetter <[email protected]> Cc: Sean Paul <[email protected]> Acked-by: Jani Nikula <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent a5c2c0d commit ffac972

File tree

4 files changed

+23
-72
lines changed

4 files changed

+23
-72
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -447,34 +447,13 @@ dm_dp_mst_detect(struct drm_connector *connector,
447447
}
448448

449449
static int dm_dp_mst_atomic_check(struct drm_connector *connector,
450-
struct drm_atomic_state *state)
450+
struct drm_atomic_state *state)
451451
{
452-
struct drm_connector_state *new_conn_state =
453-
drm_atomic_get_new_connector_state(state, connector);
454-
struct drm_connector_state *old_conn_state =
455-
drm_atomic_get_old_connector_state(state, connector);
456452
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
457-
struct drm_crtc_state *new_crtc_state;
458-
struct drm_dp_mst_topology_mgr *mst_mgr;
459-
struct drm_dp_mst_port *mst_port;
453+
struct drm_dp_mst_topology_mgr *mst_mgr = &aconnector->mst_port->mst_mgr;
454+
struct drm_dp_mst_port *mst_port = aconnector->port;
460455

461-
mst_port = aconnector->port;
462-
mst_mgr = &aconnector->mst_port->mst_mgr;
463-
464-
if (!old_conn_state->crtc)
465-
return 0;
466-
467-
if (new_conn_state->crtc) {
468-
new_crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
469-
if (!new_crtc_state ||
470-
!drm_atomic_crtc_needs_modeset(new_crtc_state) ||
471-
new_crtc_state->enable)
472-
return 0;
473-
}
474-
475-
return drm_dp_atomic_release_time_slots(state,
476-
mst_mgr,
477-
mst_port);
456+
return drm_dp_atomic_release_time_slots(state, mst_mgr, mst_port);
478457
}
479458

480459
static const struct drm_connector_helper_funcs dm_dp_mst_connector_helper_funcs = {

drivers/gpu/drm/display/drm_dp_mst_topology.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4473,14 +4473,29 @@ int drm_dp_atomic_release_time_slots(struct drm_atomic_state *state,
44734473
{
44744474
struct drm_dp_mst_topology_state *topology_state;
44754475
struct drm_dp_mst_atomic_payload *payload;
4476-
struct drm_connector_state *conn_state;
4476+
struct drm_connector_state *old_conn_state, *new_conn_state;
4477+
4478+
old_conn_state = drm_atomic_get_old_connector_state(state, port->connector);
4479+
if (!old_conn_state->crtc)
4480+
return 0;
4481+
4482+
/* If the CRTC isn't disabled by this state, don't release it's payload */
4483+
new_conn_state = drm_atomic_get_new_connector_state(state, port->connector);
4484+
if (new_conn_state->crtc) {
4485+
struct drm_crtc_state *crtc_state =
4486+
drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
4487+
4488+
if (!crtc_state ||
4489+
!drm_atomic_crtc_needs_modeset(crtc_state) ||
4490+
crtc_state->enable)
4491+
return 0;
4492+
}
44774493

44784494
topology_state = drm_atomic_get_mst_topology_state(state, mgr);
44794495
if (IS_ERR(topology_state))
44804496
return PTR_ERR(topology_state);
44814497

4482-
conn_state = drm_atomic_get_old_connector_state(state, port->connector);
4483-
topology_state->pending_crtc_mask |= drm_crtc_mask(conn_state->crtc);
4498+
topology_state->pending_crtc_mask |= drm_crtc_mask(old_conn_state->crtc);
44844499

44854500
payload = drm_atomic_get_mst_payload_state(topology_state, port);
44864501
if (WARN_ON(!payload)) {

drivers/gpu/drm/i915/display/intel_dp_mst.c

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -308,13 +308,10 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
308308
struct drm_atomic_state *_state)
309309
{
310310
struct intel_atomic_state *state = to_intel_atomic_state(_state);
311-
struct drm_connector_state *new_conn_state =
312-
drm_atomic_get_new_connector_state(&state->base, connector);
313311
struct drm_connector_state *old_conn_state =
314312
drm_atomic_get_old_connector_state(&state->base, connector);
315313
struct intel_connector *intel_connector =
316314
to_intel_connector(connector);
317-
struct drm_crtc *new_crtc = new_conn_state->crtc;
318315
struct drm_dp_mst_topology_mgr *mgr;
319316
int ret;
320317

@@ -326,27 +323,8 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
326323
if (ret)
327324
return ret;
328325

329-
if (!old_conn_state->crtc)
330-
return 0;
331-
332-
/* We only want to free VCPI if this state disables the CRTC on this
333-
* connector
334-
*/
335-
if (new_crtc) {
336-
struct intel_crtc *crtc = to_intel_crtc(new_crtc);
337-
struct intel_crtc_state *crtc_state =
338-
intel_atomic_get_new_crtc_state(state, crtc);
339-
340-
if (!crtc_state ||
341-
!drm_atomic_crtc_needs_modeset(&crtc_state->uapi) ||
342-
crtc_state->uapi.enable)
343-
return 0;
344-
}
345-
346326
mgr = &enc_to_mst(to_intel_encoder(old_conn_state->best_encoder))->primary->dp.mst_mgr;
347-
ret = drm_dp_atomic_release_time_slots(&state->base, mgr, intel_connector->port);
348-
349-
return ret;
327+
return drm_dp_atomic_release_time_slots(&state->base, mgr, intel_connector->port);
350328
}
351329

352330
static void clear_act_sent(struct intel_encoder *encoder,

drivers/gpu/drm/nouveau/dispnv50/disp.c

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,27 +1255,6 @@ nv50_mstc_atomic_check(struct drm_connector *connector,
12551255
{
12561256
struct nv50_mstc *mstc = nv50_mstc(connector);
12571257
struct drm_dp_mst_topology_mgr *mgr = &mstc->mstm->mgr;
1258-
struct drm_connector_state *new_conn_state =
1259-
drm_atomic_get_new_connector_state(state, connector);
1260-
struct drm_connector_state *old_conn_state =
1261-
drm_atomic_get_old_connector_state(state, connector);
1262-
struct drm_crtc_state *crtc_state;
1263-
struct drm_crtc *new_crtc = new_conn_state->crtc;
1264-
1265-
if (!old_conn_state->crtc)
1266-
return 0;
1267-
1268-
/* We only want to free VCPI if this state disables the CRTC on this
1269-
* connector
1270-
*/
1271-
if (new_crtc) {
1272-
crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc);
1273-
1274-
if (!crtc_state ||
1275-
!drm_atomic_crtc_needs_modeset(crtc_state) ||
1276-
crtc_state->enable)
1277-
return 0;
1278-
}
12791258

12801259
return drm_dp_atomic_release_time_slots(state, mgr, mstc->port);
12811260
}

0 commit comments

Comments
 (0)