Skip to content

Commit 64546cf

Browse files
committed
drm/i915/display: UHBR rates for Thunderbolt
tbt-alt mode is missing uhbr rates 10G and 20G. This requires requires pll clock rates 312.5 MHz and 625 MHz to be added, respectively. The uhbr rates are supported only form PTL+ platforms. v2: Add drm_WARN_ON() to check if port clock is not supported by the platform (Imre) Combine forward ungate with mask parameter (Imre) Rename XE3LPDP_* to XE3D_* (Imre) Signed-off-by: Mika Kahola <mika.kahola@intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241217143440.572308-1-mika.kahola@intel.com
1 parent 1460bb1 commit 64546cf

2 files changed

Lines changed: 39 additions & 4 deletions

File tree

drivers/gpu/drm/i915/display/intel_cx0_phy.c

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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));

drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,18 @@
187187
#define XELPDP_TBT_CLOCK_REQUEST REG_BIT(19)
188188
#define XELPDP_TBT_CLOCK_ACK REG_BIT(18)
189189
#define XELPDP_DDI_CLOCK_SELECT_MASK REG_GENMASK(15, 12)
190+
#define XE3_DDI_CLOCK_SELECT_MASK REG_GENMASK(16, 12)
190191
#define XELPDP_DDI_CLOCK_SELECT(val) REG_FIELD_PREP(XELPDP_DDI_CLOCK_SELECT_MASK, val)
192+
#define XE3_DDI_CLOCK_SELECT(val) REG_FIELD_PREP(XE3_DDI_CLOCK_SELECT_MASK, val)
191193
#define XELPDP_DDI_CLOCK_SELECT_NONE 0x0
192194
#define XELPDP_DDI_CLOCK_SELECT_MAXPCLK 0x8
193195
#define XELPDP_DDI_CLOCK_SELECT_DIV18CLK 0x9
194196
#define XELPDP_DDI_CLOCK_SELECT_TBT_162 0xc
195197
#define XELPDP_DDI_CLOCK_SELECT_TBT_270 0xd
196198
#define XELPDP_DDI_CLOCK_SELECT_TBT_540 0xe
197199
#define XELPDP_DDI_CLOCK_SELECT_TBT_810 0xf
200+
#define XELPDP_DDI_CLOCK_SELECT_TBT_312_5 0x18
201+
#define XELPDP_DDI_CLOCK_SELECT_TBT_625 0x19
198202
#define XELPDP_FORWARD_CLOCK_UNGATE REG_BIT(10)
199203
#define XELPDP_LANE1_PHY_CLOCK_SELECT REG_BIT(8)
200204
#define XELPDP_SSC_ENABLE_PLLA REG_BIT(1)

0 commit comments

Comments
 (0)