Skip to content

Commit 78358b3

Browse files
gugulotmichalsimek
authored andcommitted
drm: xlnx: hdmi: Fix EDID parsing logic
Fix EDID parsing logic to set the trasport mode in FRL/TMDS and set max FRL rate supported by sink. Signed-off-by: Rajesh Gugulothu <rajesh.gugulothu@amd.com> Tested-by: Muddu Ramakant <muddu.ramakant@xilinx.com>
1 parent e91ce97 commit 78358b3

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

‎drivers/gpu/drm/xlnx/xlnx_hdmi.c‎

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2601,13 +2601,54 @@ xlnx_hdmi_get_edid_block(void *data, u8 *buf, unsigned int block,
26012601
}
26022602

26032603
memcpy(buf, buffer + block * 128, len);
2604-
if (buffer[HDMI_TX_DDC_EDID_SINK_BW] >> HDMI_TX_DDC_EDID_BW_SHIFT)
2605-
hdmi->stream.is_frl = 0;
26062604

26072605
kfree(buffer);
26082606
return 0;
26092607
}
26102608

2609+
/**
2610+
* xlnx_hdmi_set_frl_tmds_mode - Function sets the supported mode (FRL/TMDS)
2611+
* by the connectd sink device. Also gets the max_frl_rate supportd by sink.
2612+
*
2613+
* @hdmi: pointer to hdmi instance
2614+
*/
2615+
static void
2616+
xlnx_hdmi_set_frl_tmds_mode(struct drm_connector *connector)
2617+
{
2618+
struct xlnx_hdmi *hdmi = connector_to_hdmi(connector);
2619+
2620+
if (connector->display_info.hdmi.max_lanes != 0 &&
2621+
connector->display_info.hdmi.max_frl_rate_per_lane != 0) {
2622+
hdmi->stream.is_frl = 1;
2623+
switch (connector->display_info.hdmi.max_frl_rate_per_lane) {
2624+
case 3:
2625+
if (connector->display_info.hdmi.max_lanes == 3)
2626+
hdmi->config.max_frl_rate = 1;
2627+
break;
2628+
case 6:
2629+
if (connector->display_info.hdmi.max_lanes == 3)
2630+
hdmi->config.max_frl_rate = 2;
2631+
else if (connector->display_info.hdmi.max_lanes == 4)
2632+
hdmi->config.max_frl_rate = 3;
2633+
break;
2634+
case 8:
2635+
if (connector->display_info.hdmi.max_lanes == 4)
2636+
hdmi->config.max_frl_rate = 4;
2637+
break;
2638+
case 10:
2639+
if (connector->display_info.hdmi.max_lanes == 4)
2640+
hdmi->config.max_frl_rate = 5;
2641+
break;
2642+
case 12:
2643+
if (connector->display_info.hdmi.max_lanes == 4)
2644+
hdmi->config.max_frl_rate = 6;
2645+
break;
2646+
}
2647+
} else {
2648+
hdmi->stream.is_frl = 0;
2649+
}
2650+
}
2651+
26112652
static int xlnx_hdmi_connector_get_modes(struct drm_connector *connector)
26122653
{
26132654
struct xlnx_hdmi *hdmi = connector_to_hdmi(connector);
@@ -2619,6 +2660,9 @@ static int xlnx_hdmi_connector_get_modes(struct drm_connector *connector)
26192660

26202661
edid = drm_do_get_edid(connector, xlnx_hdmi_get_edid_block, hdmi);
26212662

2663+
/* Set HDMI FRL or TMDS Mode */
2664+
xlnx_hdmi_set_frl_tmds_mode(connector);
2665+
26222666
hdmi_mutex_unlock(&hdmi->hdmi_mutex);
26232667
if (!edid) {
26242668
dev_info(hdmi->dev, "no edid, assume <= 1024x768 works\n");

0 commit comments

Comments
 (0)