Skip to content

Commit b14e726

Browse files
Harry Wentlandgregkh
authored andcommitted
drm/amd/display: Don't treat wb connector as physical in create_validate_stream_for_sink
[ Upstream commit cbf4890 ] Don't try to operate on a drm_wb_connector as an amdgpu_dm_connector. While dereferencing aconnector->base will "work" it's wrong and might lead to unknown bad things. Just... don't. Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Roman Li <roman.li@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent cee5d56 commit b14e726

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7399,12 +7399,12 @@ static enum dc_status dm_validate_stream_and_context(struct dc *dc,
73997399
}
74007400

74017401
struct dc_stream_state *
7402-
create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
7402+
create_validate_stream_for_sink(struct drm_connector *connector,
74037403
const struct drm_display_mode *drm_mode,
74047404
const struct dm_connector_state *dm_state,
74057405
const struct dc_stream_state *old_stream)
74067406
{
7407-
struct drm_connector *connector = &aconnector->base;
7407+
struct amdgpu_dm_connector *aconnector = NULL;
74087408
struct amdgpu_device *adev = drm_to_adev(connector->dev);
74097409
struct dc_stream_state *stream;
74107410
const struct drm_connector_state *drm_state = dm_state ? &dm_state->base : NULL;
@@ -7415,8 +7415,12 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
74157415
if (!dm_state)
74167416
return NULL;
74177417

7418-
if (aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
7419-
aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER)
7418+
if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
7419+
aconnector = to_amdgpu_dm_connector(connector);
7420+
7421+
if (aconnector &&
7422+
(aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
7423+
aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER))
74207424
bpc_limit = 8;
74217425

74227426
do {
@@ -7428,10 +7432,11 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
74287432
break;
74297433
}
74307434

7431-
if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
7435+
dc_result = dc_validate_stream(adev->dm.dc, stream);
7436+
7437+
if (!aconnector) /* writeback connector */
74327438
return stream;
74337439

7434-
dc_result = dc_validate_stream(adev->dm.dc, stream);
74357440
if (dc_result == DC_OK && stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
74367441
dc_result = dm_dp_mst_is_port_support_mode(aconnector, stream);
74377442

@@ -7461,7 +7466,7 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
74617466
__func__, __LINE__);
74627467

74637468
aconnector->force_yuv420_output = true;
7464-
stream = create_validate_stream_for_sink(aconnector, drm_mode,
7469+
stream = create_validate_stream_for_sink(connector, drm_mode,
74657470
dm_state, old_stream);
74667471
aconnector->force_yuv420_output = false;
74677472
}
@@ -7476,6 +7481,9 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec
74767481
struct dc_sink *dc_sink;
74777482
/* TODO: Unhardcode stream count */
74787483
struct dc_stream_state *stream;
7484+
/* we always have an amdgpu_dm_connector here since we got
7485+
* here via the amdgpu_dm_connector_helper_funcs
7486+
*/
74797487
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
74807488

74817489
if ((mode->flags & DRM_MODE_FLAG_INTERLACE) ||
@@ -7500,7 +7508,7 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec
75007508

75017509
drm_mode_set_crtcinfo(mode, 0);
75027510

7503-
stream = create_validate_stream_for_sink(aconnector, mode,
7511+
stream = create_validate_stream_for_sink(connector, mode,
75047512
to_dm_connector_state(connector->state),
75057513
NULL);
75067514
if (stream) {
@@ -10520,7 +10528,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
1052010528
if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
1052110529
goto skip_modeset;
1052210530

10523-
new_stream = create_validate_stream_for_sink(aconnector,
10531+
new_stream = create_validate_stream_for_sink(connector,
1052410532
&new_crtc_state->mode,
1052510533
dm_new_conn_state,
1052610534
dm_old_crtc_state->stream);

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ int amdgpu_dm_process_dmub_set_config_sync(struct dc_context *ctx, unsigned int
987987
struct set_config_cmd_payload *payload, enum set_config_status *operation_result);
988988

989989
struct dc_stream_state *
990-
create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
990+
create_validate_stream_for_sink(struct drm_connector *connector,
991991
const struct drm_display_mode *drm_mode,
992992
const struct dm_connector_state *dm_state,
993993
const struct dc_stream_state *old_stream);

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,23 +1646,21 @@ int pre_validate_dsc(struct drm_atomic_state *state,
16461646

16471647
if (ind >= 0) {
16481648
struct drm_connector *connector;
1649-
struct amdgpu_dm_connector *aconnector;
16501649
struct drm_connector_state *drm_new_conn_state;
16511650
struct dm_connector_state *dm_new_conn_state;
16521651
struct dm_crtc_state *dm_old_crtc_state;
16531652

16541653
connector =
16551654
amdgpu_dm_find_first_crtc_matching_connector(state,
16561655
state->crtcs[ind].ptr);
1657-
aconnector = to_amdgpu_dm_connector(connector);
16581656
drm_new_conn_state =
16591657
drm_atomic_get_new_connector_state(state,
1660-
&aconnector->base);
1658+
connector);
16611659
dm_new_conn_state = to_dm_connector_state(drm_new_conn_state);
16621660
dm_old_crtc_state = to_dm_crtc_state(state->crtcs[ind].old_state);
16631661

16641662
local_dc_state->streams[i] =
1665-
create_validate_stream_for_sink(aconnector,
1663+
create_validate_stream_for_sink(connector,
16661664
&state->crtcs[ind].new_state->mode,
16671665
dm_new_conn_state,
16681666
dm_old_crtc_state->stream);

0 commit comments

Comments
 (0)