drm/amd/display: check dpcd read status of DP_DOWNSTREAM_PORT_0
[Why] For special DP convert VGA dongle, core_link_read_dpcd for DP_DOWNSTREAM_PORT_0 always return fail, then dongle_type will be set to DISPLAY_DONGLE_NONE, which will cause desktop resolution abnormal. [How] If dpcd for DP_DOWNSTREAM_PORT_0 read fail, skip set dongle_type = DISPLAY_DONGLE_NONE. Signed-off-by: jinlong zhang <jinlong.zhang@amd.com> Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com> Acked-by: Eryk Brol <eryk.brol@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
2705297c1a
commit
5aedc7bc40
|
@ -3097,62 +3097,63 @@ static void get_active_converter_info(
|
|||
uint8_t det_caps[16]; /* CTS 4.2.2.7 expects source to read Detailed Capabilities Info : 00080h-0008F.*/
|
||||
union dwnstream_port_caps_byte0 *port_caps =
|
||||
(union dwnstream_port_caps_byte0 *)det_caps;
|
||||
core_link_read_dpcd(link, DP_DOWNSTREAM_PORT_0,
|
||||
det_caps, sizeof(det_caps));
|
||||
if (core_link_read_dpcd(link, DP_DOWNSTREAM_PORT_0,
|
||||
det_caps, sizeof(det_caps)) == DC_OK) {
|
||||
|
||||
switch (port_caps->bits.DWN_STRM_PORTX_TYPE) {
|
||||
/*Handle DP case as DONGLE_NONE*/
|
||||
case DOWN_STREAM_DETAILED_DP:
|
||||
link->dpcd_caps.dongle_type = DISPLAY_DONGLE_NONE;
|
||||
break;
|
||||
case DOWN_STREAM_DETAILED_VGA:
|
||||
link->dpcd_caps.dongle_type =
|
||||
DISPLAY_DONGLE_DP_VGA_CONVERTER;
|
||||
break;
|
||||
case DOWN_STREAM_DETAILED_DVI:
|
||||
link->dpcd_caps.dongle_type =
|
||||
DISPLAY_DONGLE_DP_DVI_CONVERTER;
|
||||
break;
|
||||
case DOWN_STREAM_DETAILED_HDMI:
|
||||
case DOWN_STREAM_DETAILED_DP_PLUS_PLUS:
|
||||
/*Handle DP++ active converter case, process DP++ case as HDMI case according DP1.4 spec*/
|
||||
link->dpcd_caps.dongle_type =
|
||||
DISPLAY_DONGLE_DP_HDMI_CONVERTER;
|
||||
switch (port_caps->bits.DWN_STRM_PORTX_TYPE) {
|
||||
/*Handle DP case as DONGLE_NONE*/
|
||||
case DOWN_STREAM_DETAILED_DP:
|
||||
link->dpcd_caps.dongle_type = DISPLAY_DONGLE_NONE;
|
||||
break;
|
||||
case DOWN_STREAM_DETAILED_VGA:
|
||||
link->dpcd_caps.dongle_type =
|
||||
DISPLAY_DONGLE_DP_VGA_CONVERTER;
|
||||
break;
|
||||
case DOWN_STREAM_DETAILED_DVI:
|
||||
link->dpcd_caps.dongle_type =
|
||||
DISPLAY_DONGLE_DP_DVI_CONVERTER;
|
||||
break;
|
||||
case DOWN_STREAM_DETAILED_HDMI:
|
||||
case DOWN_STREAM_DETAILED_DP_PLUS_PLUS:
|
||||
/*Handle DP++ active converter case, process DP++ case as HDMI case according DP1.4 spec*/
|
||||
link->dpcd_caps.dongle_type =
|
||||
DISPLAY_DONGLE_DP_HDMI_CONVERTER;
|
||||
|
||||
link->dpcd_caps.dongle_caps.dongle_type = link->dpcd_caps.dongle_type;
|
||||
if (ds_port.fields.DETAILED_CAPS) {
|
||||
link->dpcd_caps.dongle_caps.dongle_type = link->dpcd_caps.dongle_type;
|
||||
if (ds_port.fields.DETAILED_CAPS) {
|
||||
|
||||
union dwnstream_port_caps_byte3_hdmi
|
||||
hdmi_caps = {.raw = det_caps[3] };
|
||||
union dwnstream_port_caps_byte2
|
||||
hdmi_color_caps = {.raw = det_caps[2] };
|
||||
link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz =
|
||||
det_caps[1] * 2500;
|
||||
union dwnstream_port_caps_byte3_hdmi
|
||||
hdmi_caps = {.raw = det_caps[3] };
|
||||
union dwnstream_port_caps_byte2
|
||||
hdmi_color_caps = {.raw = det_caps[2] };
|
||||
link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz =
|
||||
det_caps[1] * 2500;
|
||||
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_s3d_converter =
|
||||
hdmi_caps.bits.FRAME_SEQ_TO_FRAME_PACK;
|
||||
/*YCBCR capability only for HDMI case*/
|
||||
if (port_caps->bits.DWN_STRM_PORTX_TYPE
|
||||
== DOWN_STREAM_DETAILED_HDMI) {
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_pass_through =
|
||||
hdmi_caps.bits.YCrCr422_PASS_THROUGH;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_pass_through =
|
||||
hdmi_caps.bits.YCrCr420_PASS_THROUGH;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_converter =
|
||||
hdmi_caps.bits.YCrCr422_CONVERSION;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_converter =
|
||||
hdmi_caps.bits.YCrCr420_CONVERSION;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_s3d_converter =
|
||||
hdmi_caps.bits.FRAME_SEQ_TO_FRAME_PACK;
|
||||
/*YCBCR capability only for HDMI case*/
|
||||
if (port_caps->bits.DWN_STRM_PORTX_TYPE
|
||||
== DOWN_STREAM_DETAILED_HDMI) {
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_pass_through =
|
||||
hdmi_caps.bits.YCrCr422_PASS_THROUGH;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_pass_through =
|
||||
hdmi_caps.bits.YCrCr420_PASS_THROUGH;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr422_converter =
|
||||
hdmi_caps.bits.YCrCr422_CONVERSION;
|
||||
link->dpcd_caps.dongle_caps.is_dp_hdmi_ycbcr420_converter =
|
||||
hdmi_caps.bits.YCrCr420_CONVERSION;
|
||||
}
|
||||
|
||||
link->dpcd_caps.dongle_caps.dp_hdmi_max_bpc =
|
||||
translate_dpcd_max_bpc(
|
||||
hdmi_color_caps.bits.MAX_BITS_PER_COLOR_COMPONENT);
|
||||
|
||||
if (link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz != 0)
|
||||
link->dpcd_caps.dongle_caps.extendedCapValid = true;
|
||||
}
|
||||
|
||||
link->dpcd_caps.dongle_caps.dp_hdmi_max_bpc =
|
||||
translate_dpcd_max_bpc(
|
||||
hdmi_color_caps.bits.MAX_BITS_PER_COLOR_COMPONENT);
|
||||
|
||||
if (link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk_in_khz != 0)
|
||||
link->dpcd_caps.dongle_caps.extendedCapValid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue