@@ -7399,12 +7399,12 @@ static enum dc_status dm_validate_stream_and_context(struct dc *dc,
73997399}
74007400
74017401struct 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 );
0 commit comments