@@ -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+
26112652static 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