On Tue, Feb 20, 2018 at 07:05:22PM +0200, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Since we no longer have a 1:1 correspondence between ports and AUX > channels, let's give AUX channels their own enum. Makes it easier > to tell the apples from the oranges, and we get rid of the > port E AUX power domain FIXME since we now derive the power domain > from the actual AUX CH. Beautiful clean-up. I had this in a todo list years ago and after staying on the bottom for so long I had removed it from there... > > v2: Rebase due to AUX F sorry and thanks! :) > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> I wondered if at least aux_power_domain part could be in a separated patch because by the end I was a bit confused... But in the end I could put all pieces together and it made sense again. So one patch for easy back porting seems better. Reviewed-by: Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_reg.h | 8 +- > drivers/gpu/drm/i915/intel_display.h | 11 ++ > drivers/gpu/drm/i915/intel_dp.c | 240 +++++++++++++++++------------------ > drivers/gpu/drm/i915/intel_drv.h | 1 + > 4 files changed, 131 insertions(+), 129 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index 1412abcb27d4..39d624083a17 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -5347,8 +5347,8 @@ enum { > #define _DPF_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64520) > #define _DPF_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64524) > > -#define DP_AUX_CH_CTL(port) _MMIO_PORT(port, _DPA_AUX_CH_CTL, _DPB_AUX_CH_CTL) > -#define DP_AUX_CH_DATA(port, i) _MMIO(_PORT(port, _DPA_AUX_CH_DATA1, _DPB_AUX_CH_DATA1) + (i) * 4) /* 5 registers */ > +#define DP_AUX_CH_CTL(aux_ch) _MMIO_PORT(aux_ch, _DPA_AUX_CH_CTL, _DPB_AUX_CH_CTL) > +#define DP_AUX_CH_DATA(aux_ch, i) _MMIO(_PORT(aux_ch, _DPA_AUX_CH_DATA1, _DPB_AUX_CH_DATA1) + (i) * 4) /* 5 registers */ > > #define DP_AUX_CH_CTL_SEND_BUSY (1 << 31) > #define DP_AUX_CH_CTL_DONE (1 << 30) > @@ -7875,8 +7875,8 @@ enum { > #define _PCH_DPD_AUX_CH_DATA4 0xe4320 > #define _PCH_DPD_AUX_CH_DATA5 0xe4324 > > -#define PCH_DP_AUX_CH_CTL(port) _MMIO_PORT((port) - PORT_B, _PCH_DPB_AUX_CH_CTL, _PCH_DPC_AUX_CH_CTL) > -#define PCH_DP_AUX_CH_DATA(port, i) _MMIO(_PORT((port) - PORT_B, _PCH_DPB_AUX_CH_DATA1, _PCH_DPC_AUX_CH_DATA1) + (i) * 4) /* 5 registers */ > +#define PCH_DP_AUX_CH_CTL(aux_ch) _MMIO_PORT((aux_ch) - AUX_CH_B, _PCH_DPB_AUX_CH_CTL, _PCH_DPC_AUX_CH_CTL) > +#define PCH_DP_AUX_CH_DATA(aux_ch, i) _MMIO(_PORT((aux_ch) - AUX_CH_B, _PCH_DPB_AUX_CH_DATA1, _PCH_DPC_AUX_CH_DATA1) + (i) * 4) /* 5 registers */ > > /* CPT */ > #define PORT_TRANS_A_SEL_CPT 0 > diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h > index c4042e342f50..f5733a2576e7 100644 > --- a/drivers/gpu/drm/i915/intel_display.h > +++ b/drivers/gpu/drm/i915/intel_display.h > @@ -139,6 +139,17 @@ enum dpio_phy { > > #define I915_NUM_PHYS_VLV 2 > > +enum aux_ch { > + AUX_CH_A, > + AUX_CH_B, > + AUX_CH_C, > + AUX_CH_D, > + _AUX_CH_E, /* does not exist */ > + AUX_CH_F, > +}; > + > +#define aux_ch_name(a) ((a) + 'A') > + > enum intel_display_power_domain { > POWER_DOMAIN_PIPE_A, > POWER_DOMAIN_PIPE_B, > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index f20b25f98e5a..eeb8a026fd08 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -1331,171 +1331,194 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) > return ret; > } > > -static enum port intel_aux_port(struct drm_i915_private *dev_priv, > - enum port port) > +static enum aux_ch intel_aux_ch(struct intel_dp *intel_dp) > { > + struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; > + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); > + enum port port = encoder->port; > const struct ddi_vbt_port_info *info = > &dev_priv->vbt.ddi_port_info[port]; > - enum port aux_port; > + enum aux_ch aux_ch; > > if (!info->alternate_aux_channel) { > + aux_ch = (enum aux_ch) port; > + > DRM_DEBUG_KMS("using AUX %c for port %c (platform default)\n", > - port_name(port), port_name(port)); > - return port; > + aux_ch_name(aux_ch), port_name(port)); > + return aux_ch; > } > > switch (info->alternate_aux_channel) { > case DP_AUX_A: > - aux_port = PORT_A; > + aux_ch = AUX_CH_A; > break; > case DP_AUX_B: > - aux_port = PORT_B; > + aux_ch = AUX_CH_B; > break; > case DP_AUX_C: > - aux_port = PORT_C; > + aux_ch = AUX_CH_C; > break; > case DP_AUX_D: > - aux_port = PORT_D; > + aux_ch = AUX_CH_D; > break; > case DP_AUX_F: > - aux_port = PORT_F; > + aux_ch = AUX_CH_F; > break; > default: > MISSING_CASE(info->alternate_aux_channel); > - aux_port = PORT_A; > + aux_ch = AUX_CH_A; > break; > } > > DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n", > - port_name(aux_port), port_name(port)); > + aux_ch_name(aux_ch), port_name(port)); > > - return aux_port; > + return aux_ch; > +} > + > +static enum intel_display_power_domain > +intel_aux_power_domain(struct intel_dp *intel_dp) > +{ > + switch (intel_dp->aux_ch) { > + case AUX_CH_A: > + return POWER_DOMAIN_AUX_A; > + case AUX_CH_B: > + return POWER_DOMAIN_AUX_B; > + case AUX_CH_C: > + return POWER_DOMAIN_AUX_C; > + case AUX_CH_D: > + return POWER_DOMAIN_AUX_D; > + case AUX_CH_F: > + return POWER_DOMAIN_AUX_F; > + default: > + MISSING_CASE(intel_dp->aux_ch); > + return POWER_DOMAIN_AUX_A; > + } > } > > static i915_reg_t g4x_aux_ctl_reg(struct drm_i915_private *dev_priv, > - enum port port) > + enum aux_ch aux_ch) > { > - switch (port) { > - case PORT_B: > - case PORT_C: > - case PORT_D: > - return DP_AUX_CH_CTL(port); > + switch (aux_ch) { > + case AUX_CH_B: > + case AUX_CH_C: > + case AUX_CH_D: > + return DP_AUX_CH_CTL(aux_ch); > default: > - MISSING_CASE(port); > - return DP_AUX_CH_CTL(PORT_B); > + MISSING_CASE(aux_ch); > + return DP_AUX_CH_CTL(AUX_CH_B); > } > } > > static i915_reg_t g4x_aux_data_reg(struct drm_i915_private *dev_priv, > - enum port port, int index) > + enum aux_ch aux_ch, int index) > { > - switch (port) { > - case PORT_B: > - case PORT_C: > - case PORT_D: > - return DP_AUX_CH_DATA(port, index); > + switch (aux_ch) { > + case AUX_CH_B: > + case AUX_CH_C: > + case AUX_CH_D: > + return DP_AUX_CH_DATA(aux_ch, index); > default: > - MISSING_CASE(port); > - return DP_AUX_CH_DATA(PORT_B, index); > + MISSING_CASE(aux_ch); > + return DP_AUX_CH_DATA(AUX_CH_B, index); > } > } > > static i915_reg_t ilk_aux_ctl_reg(struct drm_i915_private *dev_priv, > - enum port port) > -{ > - switch (port) { > - case PORT_A: > - return DP_AUX_CH_CTL(port); > - case PORT_B: > - case PORT_C: > - case PORT_D: > - return PCH_DP_AUX_CH_CTL(port); > + enum aux_ch aux_ch) > +{ > + switch (aux_ch) { > + case AUX_CH_A: > + return DP_AUX_CH_CTL(aux_ch); > + case AUX_CH_B: > + case AUX_CH_C: > + case AUX_CH_D: > + return PCH_DP_AUX_CH_CTL(aux_ch); > default: > - MISSING_CASE(port); > - return DP_AUX_CH_CTL(PORT_A); > + MISSING_CASE(aux_ch); > + return DP_AUX_CH_CTL(AUX_CH_A); > } > } > > static i915_reg_t ilk_aux_data_reg(struct drm_i915_private *dev_priv, > - enum port port, int index) > -{ > - switch (port) { > - case PORT_A: > - return DP_AUX_CH_DATA(port, index); > - case PORT_B: > - case PORT_C: > - case PORT_D: > - return PCH_DP_AUX_CH_DATA(port, index); > + enum aux_ch aux_ch, int index) > +{ > + switch (aux_ch) { > + case AUX_CH_A: > + return DP_AUX_CH_DATA(aux_ch, index); > + case AUX_CH_B: > + case AUX_CH_C: > + case AUX_CH_D: > + return PCH_DP_AUX_CH_DATA(aux_ch, index); > default: > - MISSING_CASE(port); > - return DP_AUX_CH_DATA(PORT_A, index); > + MISSING_CASE(aux_ch); > + return DP_AUX_CH_DATA(AUX_CH_A, index); > } > } > > static i915_reg_t skl_aux_ctl_reg(struct drm_i915_private *dev_priv, > - enum port port) > -{ > - switch (port) { > - case PORT_A: > - case PORT_B: > - case PORT_C: > - case PORT_D: > - case PORT_F: > - return DP_AUX_CH_CTL(port); > + enum aux_ch aux_ch) > +{ > + switch (aux_ch) { > + case AUX_CH_A: > + case AUX_CH_B: > + case AUX_CH_C: > + case AUX_CH_D: > + case AUX_CH_F: > + return DP_AUX_CH_CTL(aux_ch); > default: > - MISSING_CASE(port); > - return DP_AUX_CH_CTL(PORT_A); > + MISSING_CASE(aux_ch); > + return DP_AUX_CH_CTL(AUX_CH_A); > } > } > > static i915_reg_t skl_aux_data_reg(struct drm_i915_private *dev_priv, > - enum port port, int index) > -{ > - switch (port) { > - case PORT_A: > - case PORT_B: > - case PORT_C: > - case PORT_D: > - case PORT_F: > - return DP_AUX_CH_DATA(port, index); > + enum aux_ch aux_ch, int index) > +{ > + switch (aux_ch) { > + case AUX_CH_A: > + case AUX_CH_B: > + case AUX_CH_C: > + case AUX_CH_D: > + case AUX_CH_F: > + return DP_AUX_CH_DATA(aux_ch, index); > default: > - MISSING_CASE(port); > - return DP_AUX_CH_DATA(PORT_A, index); > + MISSING_CASE(aux_ch); > + return DP_AUX_CH_DATA(AUX_CH_A, index); > } > } > > static i915_reg_t intel_aux_ctl_reg(struct drm_i915_private *dev_priv, > - enum port port) > + enum aux_ch aux_ch) > { > if (INTEL_GEN(dev_priv) >= 9) > - return skl_aux_ctl_reg(dev_priv, port); > + return skl_aux_ctl_reg(dev_priv, aux_ch); > else if (HAS_PCH_SPLIT(dev_priv)) > - return ilk_aux_ctl_reg(dev_priv, port); > + return ilk_aux_ctl_reg(dev_priv, aux_ch); > else > - return g4x_aux_ctl_reg(dev_priv, port); > + return g4x_aux_ctl_reg(dev_priv, aux_ch); > } > > static i915_reg_t intel_aux_data_reg(struct drm_i915_private *dev_priv, > - enum port port, int index) > + enum aux_ch aux_ch, int index) > { > if (INTEL_GEN(dev_priv) >= 9) > - return skl_aux_data_reg(dev_priv, port, index); > + return skl_aux_data_reg(dev_priv, aux_ch, index); > else if (HAS_PCH_SPLIT(dev_priv)) > - return ilk_aux_data_reg(dev_priv, port, index); > + return ilk_aux_data_reg(dev_priv, aux_ch, index); > else > - return g4x_aux_data_reg(dev_priv, port, index); > + return g4x_aux_data_reg(dev_priv, aux_ch, index); > } > > static void intel_aux_reg_init(struct intel_dp *intel_dp) > { > struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp)); > - enum port port = intel_aux_port(dev_priv, > - dp_to_dig_port(intel_dp)->base.port); > + enum aux_ch aux_ch = intel_dp->aux_ch; > int i; > > - intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, port); > + intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, aux_ch); > for (i = 0; i < ARRAY_SIZE(intel_dp->aux_ch_data_reg); i++) > - intel_dp->aux_ch_data_reg[i] = intel_aux_data_reg(dev_priv, port, i); > + intel_dp->aux_ch_data_reg[i] = intel_aux_data_reg(dev_priv, aux_ch, i); > } > > static void > @@ -1507,14 +1530,17 @@ intel_dp_aux_fini(struct intel_dp *intel_dp) > static void > intel_dp_aux_init(struct intel_dp *intel_dp) > { > - struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); > - enum port port = intel_dig_port->base.port; > + struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; > + > + intel_dp->aux_ch = intel_aux_ch(intel_dp); > + intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp); > > intel_aux_reg_init(intel_dp); > drm_dp_aux_init(&intel_dp->aux); > > /* Failure to allocate our preferred name is not critical */ > - intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port)); > + intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", > + port_name(encoder->port)); > intel_dp->aux.transfer = intel_dp_aux_transfer; > } > > @@ -6266,42 +6292,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, > return false; > } > > -/* Set up the hotplug pin and aux power domain. */ > -static void > -intel_dp_init_connector_port_info(struct intel_digital_port *intel_dig_port) > -{ > - struct intel_encoder *encoder = &intel_dig_port->base; > - struct intel_dp *intel_dp = &intel_dig_port->dp; > - struct intel_encoder *intel_encoder = &intel_dig_port->base; > - struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); > - > - encoder->hpd_pin = intel_hpd_pin_default(dev_priv, encoder->port); > - > - switch (encoder->port) { > - case PORT_A: > - intel_dp->aux_power_domain = POWER_DOMAIN_AUX_A; > - break; > - case PORT_B: > - intel_dp->aux_power_domain = POWER_DOMAIN_AUX_B; > - break; > - case PORT_C: > - intel_dp->aux_power_domain = POWER_DOMAIN_AUX_C; > - break; > - case PORT_D: > - intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D; > - break; > - case PORT_E: > - /* FIXME: Check VBT for actual wiring of PORT E */ > - intel_dp->aux_power_domain = POWER_DOMAIN_AUX_D; > - break; > - case PORT_F: > - intel_dp->aux_power_domain = POWER_DOMAIN_AUX_F; > - break; > - default: > - MISSING_CASE(encoder->port); > - } > -} > - > static void intel_dp_modeset_retry_work_fn(struct work_struct *work) > { > struct intel_connector *intel_connector; > @@ -6407,7 +6397,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, > connector->interlace_allowed = true; > connector->doublescan_allowed = 0; > > - intel_dp_init_connector_port_info(intel_dig_port); > + intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port); > > intel_dp_aux_init(intel_dp); > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 898064e8bea7..7f6a7f592fe6 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -1049,6 +1049,7 @@ struct intel_dp { > bool detect_done; > bool channel_eq_status; > bool reset_link_params; > + enum aux_ch aux_ch; > uint8_t dpcd[DP_RECEIVER_CAP_SIZE]; > uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE]; > uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; > -- > 2.13.6 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx