Commit 1a45d681 authored by Andrzej Hajda's avatar Andrzej Hajda Committed by Jani Nikula

drm/i915/display/dsi: use intel_de_rmw if possible

The helper makes the code more compact and readable.
Signed-off-by: default avatarAndrzej Hajda <andrzej.hajda@intel.com>
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221219130844.2914001-1-andrzej.hajda@intel.com
parent 28cbe92b
...@@ -207,7 +207,7 @@ void icl_dsi_frame_update(struct intel_crtc_state *crtc_state) ...@@ -207,7 +207,7 @@ void icl_dsi_frame_update(struct intel_crtc_state *crtc_state)
{ {
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
u32 tmp, mode_flags; u32 mode_flags;
enum port port; enum port port;
mode_flags = crtc_state->mode_flags; mode_flags = crtc_state->mode_flags;
...@@ -224,9 +224,7 @@ void icl_dsi_frame_update(struct intel_crtc_state *crtc_state) ...@@ -224,9 +224,7 @@ void icl_dsi_frame_update(struct intel_crtc_state *crtc_state)
else else
return; return;
tmp = intel_de_read(dev_priv, DSI_CMD_FRMCTL(port)); intel_de_rmw(dev_priv, DSI_CMD_FRMCTL(port), 0, DSI_FRAME_UPDATE_REQUEST);
tmp |= DSI_FRAME_UPDATE_REQUEST;
intel_de_write(dev_priv, DSI_CMD_FRMCTL(port), tmp);
} }
static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder) static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder)
...@@ -234,7 +232,7 @@ static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder) ...@@ -234,7 +232,7 @@ static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder)
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum phy phy; enum phy phy;
u32 tmp; u32 tmp, mask, val;
int lane; int lane;
for_each_dsi_phy(phy, intel_dsi->phys) { for_each_dsi_phy(phy, intel_dsi->phys) {
...@@ -242,56 +240,35 @@ static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder) ...@@ -242,56 +240,35 @@ static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder)
* Program voltage swing and pre-emphasis level values as per * Program voltage swing and pre-emphasis level values as per
* table in BSPEC under DDI buffer programing * table in BSPEC under DDI buffer programing
*/ */
mask = SCALING_MODE_SEL_MASK | RTERM_SELECT_MASK;
val = SCALING_MODE_SEL(0x2) | TAP2_DISABLE | TAP3_DISABLE |
RTERM_SELECT(0x6);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy)); tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy));
tmp &= ~(SCALING_MODE_SEL_MASK | RTERM_SELECT_MASK); tmp &= ~mask;
tmp |= SCALING_MODE_SEL(0x2); tmp |= val;
tmp |= TAP2_DISABLE | TAP3_DISABLE;
tmp |= RTERM_SELECT(0x6);
intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), tmp); intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), tmp);
intel_de_rmw(dev_priv, ICL_PORT_TX_DW5_AUX(phy), mask, val);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_AUX(phy)); mask = SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK |
tmp &= ~(SCALING_MODE_SEL_MASK | RTERM_SELECT_MASK); RCOMP_SCALAR_MASK;
tmp |= SCALING_MODE_SEL(0x2); val = SWING_SEL_UPPER(0x2) | SWING_SEL_LOWER(0x2) |
tmp |= TAP2_DISABLE | TAP3_DISABLE; RCOMP_SCALAR(0x98);
tmp |= RTERM_SELECT(0x6);
intel_de_write(dev_priv, ICL_PORT_TX_DW5_AUX(phy), tmp);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW2_LN(0, phy)); tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW2_LN(0, phy));
tmp &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK | tmp &= ~mask;
RCOMP_SCALAR_MASK); tmp |= val;
tmp |= SWING_SEL_UPPER(0x2);
tmp |= SWING_SEL_LOWER(0x2);
tmp |= RCOMP_SCALAR(0x98);
intel_de_write(dev_priv, ICL_PORT_TX_DW2_GRP(phy), tmp); intel_de_write(dev_priv, ICL_PORT_TX_DW2_GRP(phy), tmp);
intel_de_rmw(dev_priv, ICL_PORT_TX_DW2_AUX(phy), mask, val);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW2_AUX(phy)); mask = POST_CURSOR_1_MASK | POST_CURSOR_2_MASK |
tmp &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK | CURSOR_COEFF_MASK;
RCOMP_SCALAR_MASK); val = POST_CURSOR_1(0x0) | POST_CURSOR_2(0x0) |
tmp |= SWING_SEL_UPPER(0x2); CURSOR_COEFF(0x3f);
tmp |= SWING_SEL_LOWER(0x2); intel_de_rmw(dev_priv, ICL_PORT_TX_DW4_AUX(phy), mask, val);
tmp |= RCOMP_SCALAR(0x98);
intel_de_write(dev_priv, ICL_PORT_TX_DW2_AUX(phy), tmp); /* Bspec: must not use GRP register for write */
for (lane = 0; lane <= 3; lane++)
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW4_AUX(phy)); intel_de_rmw(dev_priv, ICL_PORT_TX_DW4_LN(lane, phy),
tmp &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK | mask, val);
CURSOR_COEFF_MASK);
tmp |= POST_CURSOR_1(0x0);
tmp |= POST_CURSOR_2(0x0);
tmp |= CURSOR_COEFF(0x3f);
intel_de_write(dev_priv, ICL_PORT_TX_DW4_AUX(phy), tmp);
for (lane = 0; lane <= 3; lane++) {
/* Bspec: must not use GRP register for write */
tmp = intel_de_read(dev_priv,
ICL_PORT_TX_DW4_LN(lane, phy));
tmp &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK |
CURSOR_COEFF_MASK);
tmp |= POST_CURSOR_1(0x0);
tmp |= POST_CURSOR_2(0x0);
tmp |= CURSOR_COEFF(0x3f);
intel_de_write(dev_priv,
ICL_PORT_TX_DW4_LN(lane, phy), tmp);
}
} }
} }
...@@ -310,7 +287,6 @@ static void configure_dual_link_mode(struct intel_encoder *encoder, ...@@ -310,7 +287,6 @@ static void configure_dual_link_mode(struct intel_encoder *encoder,
if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) { if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
const struct drm_display_mode *adjusted_mode = const struct drm_display_mode *adjusted_mode =
&pipe_config->hw.adjusted_mode; &pipe_config->hw.adjusted_mode;
u32 dss_ctl2;
u16 hactive = adjusted_mode->crtc_hdisplay; u16 hactive = adjusted_mode->crtc_hdisplay;
u16 dl_buffer_depth; u16 dl_buffer_depth;
...@@ -323,10 +299,8 @@ static void configure_dual_link_mode(struct intel_encoder *encoder, ...@@ -323,10 +299,8 @@ static void configure_dual_link_mode(struct intel_encoder *encoder,
dss_ctl1 &= ~LEFT_DL_BUF_TARGET_DEPTH_MASK; dss_ctl1 &= ~LEFT_DL_BUF_TARGET_DEPTH_MASK;
dss_ctl1 |= LEFT_DL_BUF_TARGET_DEPTH(dl_buffer_depth); dss_ctl1 |= LEFT_DL_BUF_TARGET_DEPTH(dl_buffer_depth);
dss_ctl2 = intel_de_read(dev_priv, DSS_CTL2); intel_de_rmw(dev_priv, DSS_CTL2, RIGHT_DL_BUF_TARGET_DEPTH_MASK,
dss_ctl2 &= ~RIGHT_DL_BUF_TARGET_DEPTH_MASK; RIGHT_DL_BUF_TARGET_DEPTH(dl_buffer_depth));
dss_ctl2 |= RIGHT_DL_BUF_TARGET_DEPTH(dl_buffer_depth);
intel_de_write(dev_priv, DSS_CTL2, dss_ctl2);
} else { } else {
/* Interleave */ /* Interleave */
dss_ctl1 |= DUAL_LINK_MODE_INTERLEAVE; dss_ctl1 |= DUAL_LINK_MODE_INTERLEAVE;
...@@ -412,13 +386,10 @@ static void gen11_dsi_enable_io_power(struct intel_encoder *encoder) ...@@ -412,13 +386,10 @@ static void gen11_dsi_enable_io_power(struct intel_encoder *encoder)
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum port port; enum port port;
u32 tmp;
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports)
tmp = intel_de_read(dev_priv, ICL_DSI_IO_MODECTL(port)); intel_de_rmw(dev_priv, ICL_DSI_IO_MODECTL(port),
tmp |= COMBO_PHY_MODE_DSI; 0, COMBO_PHY_MODE_DSI);
intel_de_write(dev_priv, ICL_DSI_IO_MODECTL(port), tmp);
}
get_dsi_io_power_domains(dev_priv, intel_dsi); get_dsi_io_power_domains(dev_priv, intel_dsi);
} }
...@@ -444,26 +415,16 @@ static void gen11_dsi_config_phy_lanes_sequence(struct intel_encoder *encoder) ...@@ -444,26 +415,16 @@ static void gen11_dsi_config_phy_lanes_sequence(struct intel_encoder *encoder)
/* Step 4b(i) set loadgen select for transmit and aux lanes */ /* Step 4b(i) set loadgen select for transmit and aux lanes */
for_each_dsi_phy(phy, intel_dsi->phys) { for_each_dsi_phy(phy, intel_dsi->phys) {
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW4_AUX(phy)); intel_de_rmw(dev_priv, ICL_PORT_TX_DW4_AUX(phy), LOADGEN_SELECT, 0);
tmp &= ~LOADGEN_SELECT; for (lane = 0; lane <= 3; lane++)
intel_de_write(dev_priv, ICL_PORT_TX_DW4_AUX(phy), tmp); intel_de_rmw(dev_priv, ICL_PORT_TX_DW4_LN(lane, phy),
for (lane = 0; lane <= 3; lane++) { LOADGEN_SELECT, lane != 2 ? LOADGEN_SELECT : 0);
tmp = intel_de_read(dev_priv,
ICL_PORT_TX_DW4_LN(lane, phy));
tmp &= ~LOADGEN_SELECT;
if (lane != 2)
tmp |= LOADGEN_SELECT;
intel_de_write(dev_priv,
ICL_PORT_TX_DW4_LN(lane, phy), tmp);
}
} }
/* Step 4b(ii) set latency optimization for transmit and aux lanes */ /* Step 4b(ii) set latency optimization for transmit and aux lanes */
for_each_dsi_phy(phy, intel_dsi->phys) { for_each_dsi_phy(phy, intel_dsi->phys) {
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW2_AUX(phy)); intel_de_rmw(dev_priv, ICL_PORT_TX_DW2_AUX(phy),
tmp &= ~FRC_LATENCY_OPTIM_MASK; FRC_LATENCY_OPTIM_MASK, FRC_LATENCY_OPTIM_VAL(0x5));
tmp |= FRC_LATENCY_OPTIM_VAL(0x5);
intel_de_write(dev_priv, ICL_PORT_TX_DW2_AUX(phy), tmp);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW2_LN(0, phy)); tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW2_LN(0, phy));
tmp &= ~FRC_LATENCY_OPTIM_MASK; tmp &= ~FRC_LATENCY_OPTIM_MASK;
tmp |= FRC_LATENCY_OPTIM_VAL(0x5); tmp |= FRC_LATENCY_OPTIM_VAL(0x5);
...@@ -471,12 +432,8 @@ static void gen11_dsi_config_phy_lanes_sequence(struct intel_encoder *encoder) ...@@ -471,12 +432,8 @@ static void gen11_dsi_config_phy_lanes_sequence(struct intel_encoder *encoder)
/* For EHL, TGL, set latency optimization for PCS_DW1 lanes */ /* For EHL, TGL, set latency optimization for PCS_DW1 lanes */
if (IS_JSL_EHL(dev_priv) || (DISPLAY_VER(dev_priv) >= 12)) { if (IS_JSL_EHL(dev_priv) || (DISPLAY_VER(dev_priv) >= 12)) {
tmp = intel_de_read(dev_priv, intel_de_rmw(dev_priv, ICL_PORT_PCS_DW1_AUX(phy),
ICL_PORT_PCS_DW1_AUX(phy)); LATENCY_OPTIM_MASK, LATENCY_OPTIM_VAL(0));
tmp &= ~LATENCY_OPTIM_MASK;
tmp |= LATENCY_OPTIM_VAL(0);
intel_de_write(dev_priv, ICL_PORT_PCS_DW1_AUX(phy),
tmp);
tmp = intel_de_read(dev_priv, tmp = intel_de_read(dev_priv,
ICL_PORT_PCS_DW1_LN(0, phy)); ICL_PORT_PCS_DW1_LN(0, phy));
...@@ -501,9 +458,7 @@ static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder) ...@@ -501,9 +458,7 @@ static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder)
tmp = intel_de_read(dev_priv, ICL_PORT_PCS_DW1_LN(0, phy)); tmp = intel_de_read(dev_priv, ICL_PORT_PCS_DW1_LN(0, phy));
tmp &= ~COMMON_KEEPER_EN; tmp &= ~COMMON_KEEPER_EN;
intel_de_write(dev_priv, ICL_PORT_PCS_DW1_GRP(phy), tmp); intel_de_write(dev_priv, ICL_PORT_PCS_DW1_GRP(phy), tmp);
tmp = intel_de_read(dev_priv, ICL_PORT_PCS_DW1_AUX(phy)); intel_de_rmw(dev_priv, ICL_PORT_PCS_DW1_AUX(phy), COMMON_KEEPER_EN, 0);
tmp &= ~COMMON_KEEPER_EN;
intel_de_write(dev_priv, ICL_PORT_PCS_DW1_AUX(phy), tmp);
} }
/* /*
...@@ -511,20 +466,15 @@ static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder) ...@@ -511,20 +466,15 @@ static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder)
* Note: loadgen select program is done * Note: loadgen select program is done
* as part of lane phy sequence configuration * as part of lane phy sequence configuration
*/ */
for_each_dsi_phy(phy, intel_dsi->phys) { for_each_dsi_phy(phy, intel_dsi->phys)
tmp = intel_de_read(dev_priv, ICL_PORT_CL_DW5(phy)); intel_de_rmw(dev_priv, ICL_PORT_CL_DW5(phy), 0, SUS_CLOCK_CONFIG);
tmp |= SUS_CLOCK_CONFIG;
intel_de_write(dev_priv, ICL_PORT_CL_DW5(phy), tmp);
}
/* Clear training enable to change swing values */ /* Clear training enable to change swing values */
for_each_dsi_phy(phy, intel_dsi->phys) { for_each_dsi_phy(phy, intel_dsi->phys) {
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy)); tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy));
tmp &= ~TX_TRAINING_EN; tmp &= ~TX_TRAINING_EN;
intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), tmp); intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), tmp);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_AUX(phy)); intel_de_rmw(dev_priv, ICL_PORT_TX_DW5_AUX(phy), TX_TRAINING_EN, 0);
tmp &= ~TX_TRAINING_EN;
intel_de_write(dev_priv, ICL_PORT_TX_DW5_AUX(phy), tmp);
} }
/* Program swing and de-emphasis */ /* Program swing and de-emphasis */
...@@ -535,9 +485,7 @@ static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder) ...@@ -535,9 +485,7 @@ static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder)
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy)); tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_LN(0, phy));
tmp |= TX_TRAINING_EN; tmp |= TX_TRAINING_EN;
intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), tmp); intel_de_write(dev_priv, ICL_PORT_TX_DW5_GRP(phy), tmp);
tmp = intel_de_read(dev_priv, ICL_PORT_TX_DW5_AUX(phy)); intel_de_rmw(dev_priv, ICL_PORT_TX_DW5_AUX(phy), 0, TX_TRAINING_EN);
tmp |= TX_TRAINING_EN;
intel_de_write(dev_priv, ICL_PORT_TX_DW5_AUX(phy), tmp);
} }
} }
...@@ -545,13 +493,10 @@ static void gen11_dsi_enable_ddi_buffer(struct intel_encoder *encoder) ...@@ -545,13 +493,10 @@ static void gen11_dsi_enable_ddi_buffer(struct intel_encoder *encoder)
{ {
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
u32 tmp;
enum port port; enum port port;
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
tmp = intel_de_read(dev_priv, DDI_BUF_CTL(port)); intel_de_rmw(dev_priv, DDI_BUF_CTL(port), 0, DDI_BUF_CTL_ENABLE);
tmp |= DDI_BUF_CTL_ENABLE;
intel_de_write(dev_priv, DDI_BUF_CTL(port), tmp);
if (wait_for_us(!(intel_de_read(dev_priv, DDI_BUF_CTL(port)) & if (wait_for_us(!(intel_de_read(dev_priv, DDI_BUF_CTL(port)) &
DDI_BUF_IS_IDLE), DDI_BUF_IS_IDLE),
...@@ -567,17 +512,13 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder, ...@@ -567,17 +512,13 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder,
{ {
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
u32 tmp;
enum port port; enum port port;
enum phy phy; enum phy phy;
/* Program T-INIT master registers */ /* Program T-INIT master registers */
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports)
tmp = intel_de_read(dev_priv, ICL_DSI_T_INIT_MASTER(port)); intel_de_rmw(dev_priv, ICL_DSI_T_INIT_MASTER(port),
tmp &= ~DSI_T_INIT_MASTER_MASK; DSI_T_INIT_MASTER_MASK, intel_dsi->init_count);
tmp |= intel_dsi->init_count;
intel_de_write(dev_priv, ICL_DSI_T_INIT_MASTER(port), tmp);
}
/* Program DPHY clock lanes timings */ /* Program DPHY clock lanes timings */
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
...@@ -608,31 +549,22 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder, ...@@ -608,31 +549,22 @@ gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder,
if (DISPLAY_VER(dev_priv) == 11) { if (DISPLAY_VER(dev_priv) == 11) {
if (afe_clk(encoder, crtc_state) <= 800000) { if (afe_clk(encoder, crtc_state) <= 800000) {
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
tmp = intel_de_read(dev_priv, intel_de_rmw(dev_priv, DPHY_TA_TIMING_PARAM(port),
DPHY_TA_TIMING_PARAM(port)); TA_SURE_MASK,
tmp &= ~TA_SURE_MASK; TA_SURE_OVERRIDE | TA_SURE(0));
tmp |= TA_SURE_OVERRIDE | TA_SURE(0);
intel_de_write(dev_priv,
DPHY_TA_TIMING_PARAM(port),
tmp);
/* shadow register inside display core */ /* shadow register inside display core */
tmp = intel_de_read(dev_priv, intel_de_rmw(dev_priv, DSI_TA_TIMING_PARAM(port),
DSI_TA_TIMING_PARAM(port)); TA_SURE_MASK,
tmp &= ~TA_SURE_MASK; TA_SURE_OVERRIDE | TA_SURE(0));
tmp |= TA_SURE_OVERRIDE | TA_SURE(0);
intel_de_write(dev_priv,
DSI_TA_TIMING_PARAM(port), tmp);
} }
} }
} }
if (IS_JSL_EHL(dev_priv)) { if (IS_JSL_EHL(dev_priv)) {
for_each_dsi_phy(phy, intel_dsi->phys) { for_each_dsi_phy(phy, intel_dsi->phys)
tmp = intel_de_read(dev_priv, ICL_DPHY_CHKN(phy)); intel_de_rmw(dev_priv, ICL_DPHY_CHKN(phy),
tmp |= ICL_DPHY_CHKN_AFE_OVER_PPI_STRAP; 0, ICL_DPHY_CHKN_AFE_OVER_PPI_STRAP);
intel_de_write(dev_priv, ICL_DPHY_CHKN(phy), tmp);
}
} }
} }
...@@ -824,11 +756,8 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder, ...@@ -824,11 +756,8 @@ gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
if (intel_dsi->dual_link) { if (intel_dsi->dual_link) {
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
dsi_trans = dsi_port_to_transcoder(port); dsi_trans = dsi_port_to_transcoder(port);
tmp = intel_de_read(dev_priv, intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL2(dsi_trans),
TRANS_DDI_FUNC_CTL2(dsi_trans)); 0, PORT_SYNC_MODE_ENABLE);
tmp |= PORT_SYNC_MODE_ENABLE;
intel_de_write(dev_priv,
TRANS_DDI_FUNC_CTL2(dsi_trans), tmp);
} }
/* configure stream splitting */ /* configure stream splitting */
...@@ -1044,13 +973,10 @@ static void gen11_dsi_enable_transcoder(struct intel_encoder *encoder) ...@@ -1044,13 +973,10 @@ static void gen11_dsi_enable_transcoder(struct intel_encoder *encoder)
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum port port; enum port port;
enum transcoder dsi_trans; enum transcoder dsi_trans;
u32 tmp;
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
dsi_trans = dsi_port_to_transcoder(port); dsi_trans = dsi_port_to_transcoder(port);
tmp = intel_de_read(dev_priv, PIPECONF(dsi_trans)); intel_de_rmw(dev_priv, PIPECONF(dsi_trans), 0, PIPECONF_ENABLE);
tmp |= PIPECONF_ENABLE;
intel_de_write(dev_priv, PIPECONF(dsi_trans), tmp);
/* wait for transcoder to be enabled */ /* wait for transcoder to be enabled */
if (intel_de_wait_for_set(dev_priv, PIPECONF(dsi_trans), if (intel_de_wait_for_set(dev_priv, PIPECONF(dsi_trans),
...@@ -1067,7 +993,7 @@ static void gen11_dsi_setup_timeouts(struct intel_encoder *encoder, ...@@ -1067,7 +993,7 @@ static void gen11_dsi_setup_timeouts(struct intel_encoder *encoder,
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum port port; enum port port;
enum transcoder dsi_trans; enum transcoder dsi_trans;
u32 tmp, hs_tx_timeout, lp_rx_timeout, ta_timeout, divisor, mul; u32 hs_tx_timeout, lp_rx_timeout, ta_timeout, divisor, mul;
/* /*
* escape clock count calculation: * escape clock count calculation:
...@@ -1087,26 +1013,23 @@ static void gen11_dsi_setup_timeouts(struct intel_encoder *encoder, ...@@ -1087,26 +1013,23 @@ static void gen11_dsi_setup_timeouts(struct intel_encoder *encoder,
dsi_trans = dsi_port_to_transcoder(port); dsi_trans = dsi_port_to_transcoder(port);
/* program hst_tx_timeout */ /* program hst_tx_timeout */
tmp = intel_de_read(dev_priv, DSI_HSTX_TO(dsi_trans)); intel_de_rmw(dev_priv, DSI_HSTX_TO(dsi_trans),
tmp &= ~HSTX_TIMEOUT_VALUE_MASK; HSTX_TIMEOUT_VALUE_MASK,
tmp |= HSTX_TIMEOUT_VALUE(hs_tx_timeout); HSTX_TIMEOUT_VALUE(hs_tx_timeout));
intel_de_write(dev_priv, DSI_HSTX_TO(dsi_trans), tmp);
/* FIXME: DSI_CALIB_TO */ /* FIXME: DSI_CALIB_TO */
/* program lp_rx_host timeout */ /* program lp_rx_host timeout */
tmp = intel_de_read(dev_priv, DSI_LPRX_HOST_TO(dsi_trans)); intel_de_rmw(dev_priv, DSI_LPRX_HOST_TO(dsi_trans),
tmp &= ~LPRX_TIMEOUT_VALUE_MASK; LPRX_TIMEOUT_VALUE_MASK,
tmp |= LPRX_TIMEOUT_VALUE(lp_rx_timeout); LPRX_TIMEOUT_VALUE(lp_rx_timeout));
intel_de_write(dev_priv, DSI_LPRX_HOST_TO(dsi_trans), tmp);
/* FIXME: DSI_PWAIT_TO */ /* FIXME: DSI_PWAIT_TO */
/* program turn around timeout */ /* program turn around timeout */
tmp = intel_de_read(dev_priv, DSI_TA_TO(dsi_trans)); intel_de_rmw(dev_priv, DSI_TA_TO(dsi_trans),
tmp &= ~TA_TIMEOUT_VALUE_MASK; TA_TIMEOUT_VALUE_MASK,
tmp |= TA_TIMEOUT_VALUE(ta_timeout); TA_TIMEOUT_VALUE(ta_timeout));
intel_de_write(dev_priv, DSI_TA_TO(dsi_trans), tmp);
} }
} }
...@@ -1310,15 +1233,12 @@ static void gen11_dsi_disable_transcoder(struct intel_encoder *encoder) ...@@ -1310,15 +1233,12 @@ static void gen11_dsi_disable_transcoder(struct intel_encoder *encoder)
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum port port; enum port port;
enum transcoder dsi_trans; enum transcoder dsi_trans;
u32 tmp;
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
dsi_trans = dsi_port_to_transcoder(port); dsi_trans = dsi_port_to_transcoder(port);
/* disable transcoder */ /* disable transcoder */
tmp = intel_de_read(dev_priv, PIPECONF(dsi_trans)); intel_de_rmw(dev_priv, PIPECONF(dsi_trans), PIPECONF_ENABLE, 0);
tmp &= ~PIPECONF_ENABLE;
intel_de_write(dev_priv, PIPECONF(dsi_trans), tmp);
/* wait for transcoder to be disabled */ /* wait for transcoder to be disabled */
if (intel_de_wait_for_clear(dev_priv, PIPECONF(dsi_trans), if (intel_de_wait_for_clear(dev_priv, PIPECONF(dsi_trans),
...@@ -1350,11 +1270,9 @@ static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder) ...@@ -1350,11 +1270,9 @@ static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder)
/* disable periodic update mode */ /* disable periodic update mode */
if (is_cmd_mode(intel_dsi)) { if (is_cmd_mode(intel_dsi)) {
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports)
tmp = intel_de_read(dev_priv, DSI_CMD_FRMCTL(port)); intel_de_rmw(dev_priv, DSI_CMD_FRMCTL(port),
tmp &= ~DSI_PERIODIC_FRAME_UPDATE_ENABLE; DSI_PERIODIC_FRAME_UPDATE_ENABLE, 0);
intel_de_write(dev_priv, DSI_CMD_FRMCTL(port), tmp);
}
} }
/* put dsi link in ULPS */ /* put dsi link in ULPS */
...@@ -1374,20 +1292,16 @@ static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder) ...@@ -1374,20 +1292,16 @@ static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder)
/* disable ddi function */ /* disable ddi function */
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
dsi_trans = dsi_port_to_transcoder(port); dsi_trans = dsi_port_to_transcoder(port);
tmp = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(dsi_trans)); intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL(dsi_trans),
tmp &= ~TRANS_DDI_FUNC_ENABLE; TRANS_DDI_FUNC_ENABLE, 0);
intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(dsi_trans), tmp);
} }
/* disable port sync mode if dual link */ /* disable port sync mode if dual link */
if (intel_dsi->dual_link) { if (intel_dsi->dual_link) {
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
dsi_trans = dsi_port_to_transcoder(port); dsi_trans = dsi_port_to_transcoder(port);
tmp = intel_de_read(dev_priv, intel_de_rmw(dev_priv, TRANS_DDI_FUNC_CTL2(dsi_trans),
TRANS_DDI_FUNC_CTL2(dsi_trans)); PORT_SYNC_MODE_ENABLE, 0);
tmp &= ~PORT_SYNC_MODE_ENABLE;
intel_de_write(dev_priv,
TRANS_DDI_FUNC_CTL2(dsi_trans), tmp);
} }
} }
} }
...@@ -1396,14 +1310,11 @@ static void gen11_dsi_disable_port(struct intel_encoder *encoder) ...@@ -1396,14 +1310,11 @@ static void gen11_dsi_disable_port(struct intel_encoder *encoder)
{ {
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
u32 tmp;
enum port port; enum port port;
gen11_dsi_ungate_clocks(encoder); gen11_dsi_ungate_clocks(encoder);
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
tmp = intel_de_read(dev_priv, DDI_BUF_CTL(port)); intel_de_rmw(dev_priv, DDI_BUF_CTL(port), DDI_BUF_CTL_ENABLE, 0);
tmp &= ~DDI_BUF_CTL_ENABLE;
intel_de_write(dev_priv, DDI_BUF_CTL(port), tmp);
if (wait_for_us((intel_de_read(dev_priv, DDI_BUF_CTL(port)) & if (wait_for_us((intel_de_read(dev_priv, DDI_BUF_CTL(port)) &
DDI_BUF_IS_IDLE), DDI_BUF_IS_IDLE),
...@@ -1420,7 +1331,6 @@ static void gen11_dsi_disable_io_power(struct intel_encoder *encoder) ...@@ -1420,7 +1331,6 @@ static void gen11_dsi_disable_io_power(struct intel_encoder *encoder)
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum port port; enum port port;
u32 tmp;
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports) {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
...@@ -1434,11 +1344,9 @@ static void gen11_dsi_disable_io_power(struct intel_encoder *encoder) ...@@ -1434,11 +1344,9 @@ static void gen11_dsi_disable_io_power(struct intel_encoder *encoder)
} }
/* set mode to DDI */ /* set mode to DDI */
for_each_dsi_port(port, intel_dsi->ports) { for_each_dsi_port(port, intel_dsi->ports)
tmp = intel_de_read(dev_priv, ICL_DSI_IO_MODECTL(port)); intel_de_rmw(dev_priv, ICL_DSI_IO_MODECTL(port),
tmp &= ~COMBO_PHY_MODE_DSI; COMBO_PHY_MODE_DSI, 0);
intel_de_write(dev_priv, ICL_DSI_IO_MODECTL(port), tmp);
}
} }
static void gen11_dsi_disable(struct intel_atomic_state *state, static void gen11_dsi_disable(struct intel_atomic_state *state,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment