Skip to content

Commit aeda5f4

Browse files
committed
drm/i915/dpio: Program bxt/glk PHY TX registers per-lane
Program each bxt/glk PHY TX lane with its own settings instead of blasting them all with the same stuff via group access. Signed-off-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Reviewed-by: Jani Nikula <[email protected]>
1 parent ba07c3e commit aeda5f4

File tree

1 file changed

+22
-13
lines changed

1 file changed

+22
-13
lines changed

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,10 @@ void bxt_dpio_phy_set_signal_levels(struct intel_encoder *encoder,
292292
const struct intel_crtc_state *crtc_state)
293293
{
294294
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
295-
int level = intel_ddi_level(encoder, crtc_state, 0);
296295
const struct intel_ddi_buf_trans *trans;
297296
enum dpio_channel ch;
298297
enum dpio_phy phy;
299-
int n_entries;
300-
u32 val;
298+
int lane, n_entries;
301299

302300
trans = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
303301
if (drm_WARN_ON_ONCE(&dev_priv->drm, !trans))
@@ -313,26 +311,37 @@ void bxt_dpio_phy_set_signal_levels(struct intel_encoder *encoder,
313311
BXT_PORT_PCS_DW10_GRP(phy, ch),
314312
TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT, 0);
315313

316-
bxt_dpio_phy_rmw_grp(dev_priv, BXT_PORT_TX_DW2_LN(phy, ch, 0),
317-
BXT_PORT_TX_DW2_GRP(phy, ch),
314+
for (lane = 0; lane < crtc_state->lane_count; lane++) {
315+
int level = intel_ddi_level(encoder, crtc_state, lane);
316+
317+
intel_de_rmw(dev_priv, BXT_PORT_TX_DW2_LN(phy, ch, lane),
318318
MARGIN_000_MASK | UNIQ_TRANS_SCALE_MASK,
319319
MARGIN_000(trans->entries[level].bxt.margin) |
320320
UNIQ_TRANS_SCALE(trans->entries[level].bxt.scale));
321+
}
322+
323+
for (lane = 0; lane < crtc_state->lane_count; lane++) {
324+
int level = intel_ddi_level(encoder, crtc_state, lane);
325+
u32 val;
321326

322-
bxt_dpio_phy_rmw_grp(dev_priv, BXT_PORT_TX_DW3_LN(phy, ch, 0),
323-
BXT_PORT_TX_DW3_GRP(phy, ch),
327+
intel_de_rmw(dev_priv, BXT_PORT_TX_DW3_LN(phy, ch, lane),
324328
SCALE_DCOMP_METHOD,
325329
trans->entries[level].bxt.enable ?
326330
SCALE_DCOMP_METHOD : 0);
327331

328-
val = intel_de_read(dev_priv, BXT_PORT_TX_DW3_LN(phy, ch, 0));
329-
if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
330-
drm_err(&dev_priv->drm,
331-
"Disabled scaling while ouniqetrangenmethod was set");
332+
val = intel_de_read(dev_priv, BXT_PORT_TX_DW3_LN(phy, ch, lane));
333+
if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
334+
drm_err(&dev_priv->drm,
335+
"Disabled scaling while ouniqetrangenmethod was set");
336+
}
337+
338+
for (lane = 0; lane < crtc_state->lane_count; lane++) {
339+
int level = intel_ddi_level(encoder, crtc_state, lane);
332340

333-
bxt_dpio_phy_rmw_grp(dev_priv, BXT_PORT_TX_DW4_LN(phy, ch, 0),
334-
BXT_PORT_TX_DW4_GRP(phy, ch), DE_EMPHASIS_MASK,
341+
intel_de_rmw(dev_priv, BXT_PORT_TX_DW4_LN(phy, ch, lane),
342+
DE_EMPHASIS_MASK,
335343
DE_EMPHASIS(trans->entries[level].bxt.deemphasis));
344+
}
336345

337346
bxt_dpio_phy_rmw_grp(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch),
338347
BXT_PORT_PCS_DW10_GRP(phy, ch),

0 commit comments

Comments
 (0)