@@ -3070,7 +3070,10 @@ int intel_mtl_tbt_calc_port_clock(struct intel_encoder *encoder)
30703070
30713071 val = intel_de_read (display , XELPDP_PORT_CLOCK_CTL (display , encoder -> port ));
30723072
3073- clock = REG_FIELD_GET (XELPDP_DDI_CLOCK_SELECT_MASK , val );
3073+ if (DISPLAY_VER (display ) >= 30 )
3074+ clock = REG_FIELD_GET (XE3_DDI_CLOCK_SELECT_MASK , val );
3075+ else
3076+ clock = REG_FIELD_GET (XELPDP_DDI_CLOCK_SELECT_MASK , val );
30743077
30753078 drm_WARN_ON (display -> drm , !(val & XELPDP_FORWARD_CLOCK_UNGATE ));
30763079 drm_WARN_ON (display -> drm , !(val & XELPDP_TBT_CLOCK_REQUEST ));
@@ -3085,13 +3088,18 @@ int intel_mtl_tbt_calc_port_clock(struct intel_encoder *encoder)
30853088 return 540000 ;
30863089 case XELPDP_DDI_CLOCK_SELECT_TBT_810 :
30873090 return 810000 ;
3091+ case XELPDP_DDI_CLOCK_SELECT_TBT_312_5 :
3092+ return 1000000 ;
3093+ case XELPDP_DDI_CLOCK_SELECT_TBT_625 :
3094+ return 2000000 ;
30883095 default :
30893096 MISSING_CASE (clock );
30903097 return 162000 ;
30913098 }
30923099}
30933100
3094- static int intel_mtl_tbt_clock_select (int clock )
3101+ static int intel_mtl_tbt_clock_select (struct intel_display * display ,
3102+ int clock )
30953103{
30963104 switch (clock ) {
30973105 case 162000 :
@@ -3102,6 +3110,18 @@ static int intel_mtl_tbt_clock_select(int clock)
31023110 return XELPDP_DDI_CLOCK_SELECT_TBT_540 ;
31033111 case 810000 :
31043112 return XELPDP_DDI_CLOCK_SELECT_TBT_810 ;
3113+ case 1000000 :
3114+ if (DISPLAY_VER (display ) < 30 ) {
3115+ drm_WARN_ON (display -> drm , "UHBR10 not supported for the platform\n" );
3116+ return XELPDP_DDI_CLOCK_SELECT_TBT_162 ;
3117+ }
3118+ return XELPDP_DDI_CLOCK_SELECT_TBT_312_5 ;
3119+ case 2000000 :
3120+ if (DISPLAY_VER (display ) < 30 ) {
3121+ drm_WARN_ON (display -> drm , "UHBR20 not supported for the platform\n" );
3122+ return XELPDP_DDI_CLOCK_SELECT_TBT_162 ;
3123+ }
3124+ return XELPDP_DDI_CLOCK_SELECT_TBT_625 ;
31053125 default :
31063126 MISSING_CASE (clock );
31073127 return XELPDP_DDI_CLOCK_SELECT_TBT_162 ;
@@ -3114,15 +3134,26 @@ static void intel_mtl_tbt_pll_enable(struct intel_encoder *encoder,
31143134 struct intel_display * display = to_intel_display (encoder );
31153135 enum phy phy = intel_encoder_to_phy (encoder );
31163136 u32 val = 0 ;
3137+ u32 mask ;
31173138
31183139 /*
31193140 * 1. Program PORT_CLOCK_CTL REGISTER to configure
31203141 * clock muxes, gating and SSC
31213142 */
3122- val |= XELPDP_DDI_CLOCK_SELECT (intel_mtl_tbt_clock_select (crtc_state -> port_clock ));
3143+
3144+ if (DISPLAY_VER (display ) >= 30 ) {
3145+ mask = XE3_DDI_CLOCK_SELECT_MASK ;
3146+ val |= XE3_DDI_CLOCK_SELECT (intel_mtl_tbt_clock_select (display , crtc_state -> port_clock ));
3147+ } else {
3148+ mask = XELPDP_DDI_CLOCK_SELECT_MASK ;
3149+ val |= XELPDP_DDI_CLOCK_SELECT (intel_mtl_tbt_clock_select (display , crtc_state -> port_clock ));
3150+ }
3151+
3152+ mask |= XELPDP_FORWARD_CLOCK_UNGATE ;
31233153 val |= XELPDP_FORWARD_CLOCK_UNGATE ;
3154+
31243155 intel_de_rmw (display , XELPDP_PORT_CLOCK_CTL (display , encoder -> port ),
3125- XELPDP_DDI_CLOCK_SELECT_MASK | XELPDP_FORWARD_CLOCK_UNGATE , val );
3156+ mask , val );
31263157
31273158 /* 2. Read back PORT_CLOCK_CTL REGISTER */
31283159 val = intel_de_read (display , XELPDP_PORT_CLOCK_CTL (display , encoder -> port ));
0 commit comments