From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 1/3] drm/i915: Add enum aux_ch and clean up the aux init to use it
Date: Tue, 20 Feb 2018 11:31:09 -0800 [thread overview]
Message-ID: <20180220193109.GE27433@intel.com> (raw)
In-Reply-To: <20180220170524.12303-1-ville.syrjala@linux.intel.com>
On Tue, Feb 20, 2018 at 07:05:22PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> 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@linux.intel.com>
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@intel.com>
> ---
> 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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2018-02-20 19:31 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-20 17:05 [PATCH 1/3] drm/i915: Add enum aux_ch and clean up the aux init to use it Ville Syrjala
2018-02-20 17:05 ` [PATCH 2/3] drm/i915: Nuke aux regs from intel_dp Ville Syrjala
2018-02-20 17:30 ` Chris Wilson
2018-02-20 17:49 ` Ville Syrjälä
2018-02-20 17:57 ` Chris Wilson
2018-02-20 19:00 ` [PATCH v2 " Ville Syrjala
2018-02-22 7:16 ` Pandiyan, Dhinakaran
2018-02-22 12:43 ` Ville Syrjälä
2018-02-22 20:38 ` Pandiyan, Dhinakaran
2018-02-20 17:05 ` [PATCH 3/3] drm/i915: Collect aux ch vfunc setup into intel_dp_aux_init() Ville Syrjala
2018-02-20 17:25 ` Chris Wilson
2018-02-20 19:35 ` Rodrigo Vivi
2018-02-20 17:28 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/3] drm/i915: Add enum aux_ch and clean up the aux init to use it Patchwork
2018-02-20 17:43 ` ✓ Fi.CI.BAT: success " Patchwork
2018-02-20 17:47 ` [PATCH 1/3] " Chris Wilson
2018-02-20 19:31 ` Rodrigo Vivi [this message]
2018-02-22 7:25 ` Pandiyan, Dhinakaran
2018-02-22 12:48 ` Ville Syrjälä
2018-02-22 16:29 ` Ville Syrjälä
2018-02-22 6:12 ` Pandiyan, Dhinakaran
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180220193109.GE27433@intel.com \
--to=rodrigo.vivi@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).