From patchwork Mon Dec 23 19:58:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308737 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9E65213B6 for ; Mon, 23 Dec 2019 19:59:17 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 87106206B7 for ; Mon, 23 Dec 2019 19:59:17 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 87106206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 07D306E0D9; Mon, 23 Dec 2019 19:59:15 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id B61BB6E0CB for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598187" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:42 -0800 Message-Id: <20191223195850.25997-2-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 1/9] drm/i915/display: nuke skl workaround for pre-production hw X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" According to intel_detect_preproduction_hw(), the SKL steeping D0 is still pre-production so we can nuke the additional workaround. While at it, nuke dangling new line. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_display.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 1860da0a493e..3b9011fd086c 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16280,14 +16280,8 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) if (intel_ddi_crt_present(dev_priv)) intel_crt_init(dev_priv); - /* - * Haswell uses DDI functions to detect digital outputs. - * On SKL pre-D0 the strap isn't connected, so we assume - * it's there. - */ found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED; - /* WaIgnoreDDIAStrap: skl */ - if (found || IS_GEN9_BC(dev_priv)) + if (found) intel_ddi_init(dev_priv, PORT_A); /* DDI B, C, D, and F detection is indicated by the SFUSE_STRAP @@ -16308,7 +16302,6 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) if (IS_GEN9_BC(dev_priv) && intel_bios_is_port_present(dev_priv, PORT_E)) intel_ddi_init(dev_priv, PORT_E); - } else if (HAS_PCH_SPLIT(dev_priv)) { int found; From patchwork Mon Dec 23 19:58:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308739 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C8AD4109A for ; Mon, 23 Dec 2019 19:59:18 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B0F6F206B7 for ; Mon, 23 Dec 2019 19:59:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B0F6F206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 76E506E2EF; Mon, 23 Dec 2019 19:59:15 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8CEE06E0D9 for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598190" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:43 -0800 Message-Id: <20191223195850.25997-3-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 2/9] drm/i915/display: remove alias to dig_port X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" We don't need intel_dig_port and dig_port to refer to the same thing. Prefer the latter. Signed-off-by: Lucas De Marchi Reviewed-by: Matt Roper --- drivers/gpu/drm/i915/display/intel_ddi.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index c9ba7d7f3787..f054c82214c0 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -3674,12 +3674,11 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state, const struct drm_connector_state *conn_state) { - struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base); - struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi; + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); + struct intel_hdmi *intel_hdmi = &dig_port->hdmi; struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); enum port port = encoder->port; int level = intel_ddi_hdmi_level(dev_priv, port); - struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); intel_dp_dual_mode_set_tmds_output(intel_hdmi, true); intel_ddi_clk_select(encoder, crtc_state); @@ -3709,9 +3708,8 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder, intel_ddi_enable_pipe_clock(crtc_state); - intel_dig_port->set_infoframes(encoder, - crtc_state->has_infoframe, - crtc_state, conn_state); + dig_port->set_infoframes(encoder, crtc_state->has_infoframe, + crtc_state, conn_state); } static void intel_ddi_pre_enable(struct intel_encoder *encoder, From patchwork Mon Dec 23 19:58:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308751 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6BB7913B6 for ; Mon, 23 Dec 2019 19:59:32 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 54281206B7 for ; Mon, 23 Dec 2019 19:59:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 54281206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id EC0A96E2EA; Mon, 23 Dec 2019 19:59:31 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 82BD56E0CE for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598193" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:44 -0800 Message-Id: <20191223195850.25997-4-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 3/9] drm/i915/display: prefer the more common dig_port name X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" intel_ddi.c uses a mix of dport and dig_port as variable for intel_digital_port, with the latter being more frequent. In some cases we were also using intel_dport to make it worse. intel_dpio_phy.c had standardized on dport, but overall dig_port is much more common. Standardize on dig_port. This is the only place in the driver where we refer to a intel_digital_port as intel_dport. Let's use the same name everywhere: dig_port. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_ddi.c | 30 +++++++-------- drivers/gpu/drm/i915/display/intel_display.c | 6 +-- drivers/gpu/drm/i915/display/intel_display.h | 2 +- .../drm/i915/display/intel_display_power.c | 4 +- .../drm/i915/display/intel_display_types.h | 8 ++-- drivers/gpu/drm/i915/display/intel_dpio_phy.c | 38 +++++++++---------- drivers/gpu/drm/i915/display/intel_hdmi.c | 20 +++++----- 7 files changed, 54 insertions(+), 54 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index f054c82214c0..1bdf63845472 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -2900,9 +2900,9 @@ static u32 intel_ddi_dp_level(struct intel_dp *intel_dp) u32 bxt_signal_levels(struct intel_dp *intel_dp) { - struct intel_digital_port *dport = dp_to_dig_port(intel_dp); - struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev); - struct intel_encoder *encoder = &dport->base; + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); + struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); + struct intel_encoder *encoder = &dig_port->base; int level = intel_ddi_dp_level(intel_dp); if (INTEL_GEN(dev_priv) >= 12) @@ -2921,9 +2921,9 @@ u32 bxt_signal_levels(struct intel_dp *intel_dp) u32 ddi_signal_levels(struct intel_dp *intel_dp) { - struct intel_digital_port *dport = dp_to_dig_port(intel_dp); - struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev); - struct intel_encoder *encoder = &dport->base; + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); + struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); + struct intel_encoder *encoder = &dig_port->base; int level = intel_ddi_dp_level(intel_dp); if (IS_GEN9_BC(dev_priv)) @@ -4721,14 +4721,14 @@ intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port) return connector; } -static bool intel_ddi_a_force_4_lanes(struct intel_digital_port *dport) +static bool intel_ddi_a_force_4_lanes(struct intel_digital_port *dig_port) { - struct drm_i915_private *dev_priv = to_i915(dport->base.base.dev); + struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); - if (dport->base.port != PORT_A) + if (dig_port->base.port != PORT_A) return false; - if (dport->saved_port_bits & DDI_A_4_LANES) + if (dig_port->saved_port_bits & DDI_A_4_LANES) return false; /* Broxton/Geminilake: Bspec says that DDI_A_4_LANES is the only @@ -4750,10 +4750,10 @@ static bool intel_ddi_a_force_4_lanes(struct intel_digital_port *dport) } static int -intel_ddi_max_lanes(struct intel_digital_port *intel_dport) +intel_ddi_max_lanes(struct intel_digital_port *dig_port) { - struct drm_i915_private *dev_priv = to_i915(intel_dport->base.base.dev); - enum port port = intel_dport->base.port; + struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); + enum port port = dig_port->base.port; int max_lanes = 4; if (INTEL_GEN(dev_priv) >= 11) @@ -4772,9 +4772,9 @@ intel_ddi_max_lanes(struct intel_digital_port *intel_dport) * wasn't lit up at boot. Force this bit set when needed * so we use the proper lane count for our calculations. */ - if (intel_ddi_a_force_4_lanes(intel_dport)) { + if (intel_ddi_a_force_4_lanes(dig_port)) { DRM_DEBUG_KMS("Forcing DDI_A_4_LANES for port A\n"); - intel_dport->saved_port_bits |= DDI_A_4_LANES; + dig_port->saved_port_bits |= DDI_A_4_LANES; max_lanes = 4; } diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 3b9011fd086c..04819b0bd494 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -1606,13 +1606,13 @@ static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) } void vlv_wait_port_ready(struct drm_i915_private *dev_priv, - struct intel_digital_port *dport, + struct intel_digital_port *dig_port, unsigned int expected_mask) { u32 port_mask; i915_reg_t dpll_reg; - switch (dport->base.port) { + switch (dig_port->base.port) { case PORT_B: port_mask = DPLL_PORTB_READY_MASK; dpll_reg = DPLL(0); @@ -1633,7 +1633,7 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv, if (intel_de_wait_for_register(dev_priv, dpll_reg, port_mask, expected_mask, 1000)) WARN(1, "timed out waiting for [ENCODER:%d:%s] port ready: got 0x%x, expected 0x%x\n", - dport->base.base.base.id, dport->base.base.name, + dig_port->base.base.base.id, dig_port->base.base.name, I915_READ(dpll_reg) & port_mask, expected_mask); } diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h index 0fef9263cddc..05d68bd393dc 100644 --- a/drivers/gpu/drm/i915/display/intel_display.h +++ b/drivers/gpu/drm/i915/display/intel_display.h @@ -523,7 +523,7 @@ void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state); int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp); void vlv_wait_port_ready(struct drm_i915_private *dev_priv, - struct intel_digital_port *dport, + struct intel_digital_port *dig_port, unsigned int expected_mask); int intel_get_load_detect_pipe(struct drm_connector *connector, struct intel_load_detect_pipe *old, diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c index 679457156797..e6f33e50d6fb 100644 --- a/drivers/gpu/drm/i915/display/intel_display_power.c +++ b/drivers/gpu/drm/i915/display/intel_display_power.c @@ -1664,8 +1664,8 @@ void chv_phy_powergate_lanes(struct intel_encoder *encoder, { struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct i915_power_domains *power_domains = &dev_priv->power_domains; - enum dpio_phy phy = vlv_dport_to_phy(enc_to_dig_port(&encoder->base)); - enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base)); + enum dpio_phy phy = vlv_dig_port_to_phy(enc_to_dig_port(&encoder->base)); + enum dpio_channel ch = vlv_dig_port_to_channel(enc_to_dig_port(&encoder->base)); mutex_lock(&power_domains->lock); diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 83ea04149b77..a3a067dacf84 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1377,9 +1377,9 @@ struct intel_dp_mst_encoder { }; static inline enum dpio_channel -vlv_dport_to_channel(struct intel_digital_port *dport) +vlv_dig_port_to_channel(struct intel_digital_port *dig_port) { - switch (dport->base.port) { + switch (dig_port->base.port) { case PORT_B: case PORT_D: return DPIO_CH0; @@ -1391,9 +1391,9 @@ vlv_dport_to_channel(struct intel_digital_port *dport) } static inline enum dpio_phy -vlv_dport_to_phy(struct intel_digital_port *dport) +vlv_dig_port_to_phy(struct intel_digital_port *dig_port) { - switch (dport->base.port) { + switch (dig_port->base.port) { case PORT_B: case PORT_C: return DPIO_PHY0; diff --git a/drivers/gpu/drm/i915/display/intel_dpio_phy.c b/drivers/gpu/drm/i915/display/intel_dpio_phy.c index 704f38681c4b..f784fe8f6c21 100644 --- a/drivers/gpu/drm/i915/display/intel_dpio_phy.c +++ b/drivers/gpu/drm/i915/display/intel_dpio_phy.c @@ -642,9 +642,9 @@ void chv_set_phy_signal_level(struct intel_encoder *encoder, bool uniq_trans_scale) { struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); - enum dpio_channel ch = vlv_dport_to_channel(dport); + enum dpio_channel ch = vlv_dig_port_to_channel(dig_port); enum pipe pipe = intel_crtc->pipe; u32 val; int i; @@ -738,7 +738,7 @@ void chv_data_lane_soft_reset(struct intel_encoder *encoder, bool reset) { struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base)); + enum dpio_channel ch = vlv_dig_port_to_channel(enc_to_dig_port(&encoder->base)); struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); enum pipe pipe = crtc->pipe; u32 val; @@ -781,10 +781,10 @@ void chv_data_lane_soft_reset(struct intel_encoder *encoder, void chv_phy_pre_pll_enable(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state) { - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); - enum dpio_channel ch = vlv_dport_to_channel(dport); + enum dpio_channel ch = vlv_dig_port_to_channel(dig_port); enum pipe pipe = crtc->pipe; unsigned int lane_mask = intel_dp_unused_lane_mask(crtc_state->lane_count); @@ -795,7 +795,7 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder, * Otherwise we can't even access the PLL. */ if (ch == DPIO_CH0 && pipe == PIPE_B) - dport->release_cl2_override = + dig_port->release_cl2_override = !chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, true); chv_phy_powergate_lanes(encoder, true, lane_mask); @@ -862,10 +862,10 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state) { struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); - struct intel_digital_port *dport = dp_to_dig_port(intel_dp); + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); - enum dpio_channel ch = vlv_dport_to_channel(dport); + enum dpio_channel ch = vlv_dig_port_to_channel(dig_port); enum pipe pipe = crtc->pipe; int data, i, stagger; u32 val; @@ -940,12 +940,12 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder, void chv_phy_release_cl2_override(struct intel_encoder *encoder) { - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - if (dport->release_cl2_override) { + if (dig_port->release_cl2_override) { chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, false); - dport->release_cl2_override = false; + dig_port->release_cl2_override = false; } } @@ -989,8 +989,8 @@ void vlv_set_phy_signal_level(struct intel_encoder *encoder, { struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); - enum dpio_channel port = vlv_dport_to_channel(dport); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); + enum dpio_channel port = vlv_dig_port_to_channel(dig_port); enum pipe pipe = intel_crtc->pipe; vlv_dpio_get(dev_priv); @@ -1014,10 +1014,10 @@ void vlv_set_phy_signal_level(struct intel_encoder *encoder, void vlv_phy_pre_pll_enable(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state) { - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); - enum dpio_channel port = vlv_dport_to_channel(dport); + enum dpio_channel port = vlv_dig_port_to_channel(dig_port); enum pipe pipe = crtc->pipe; /* Program Tx lane resets to default */ @@ -1044,10 +1044,10 @@ void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state) { struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); - struct intel_digital_port *dport = dp_to_dig_port(intel_dp); + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); - enum dpio_channel port = vlv_dport_to_channel(dport); + enum dpio_channel port = vlv_dig_port_to_channel(dig_port); enum pipe pipe = crtc->pipe; u32 val; @@ -1073,10 +1073,10 @@ void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder, void vlv_phy_reset_lanes(struct intel_encoder *encoder, const struct intel_crtc_state *old_crtc_state) { - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc); - enum dpio_channel port = vlv_dport_to_channel(dport); + enum dpio_channel port = vlv_dig_port_to_channel(dig_port); enum pipe pipe = crtc->pipe; vlv_dpio_get(dev_priv); diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c index 685589064d10..69fc31df4978 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -2676,7 +2676,7 @@ static void vlv_hdmi_pre_enable(struct intel_encoder *encoder, const struct intel_crtc_state *pipe_config, const struct drm_connector_state *conn_state) { - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); vlv_phy_pre_encoder_enable(encoder, pipe_config); @@ -2685,13 +2685,13 @@ static void vlv_hdmi_pre_enable(struct intel_encoder *encoder, vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a, 0x2b247878); - dport->set_infoframes(encoder, - pipe_config->has_infoframe, - pipe_config, conn_state); + dig_port->set_infoframes(encoder, + pipe_config->has_infoframe, + pipe_config, conn_state); g4x_enable_hdmi(encoder, pipe_config, conn_state); - vlv_wait_port_ready(dev_priv, dport, 0x0); + vlv_wait_port_ready(dev_priv, dig_port, 0x0); } static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder, @@ -2746,7 +2746,7 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder, const struct intel_crtc_state *pipe_config, const struct drm_connector_state *conn_state) { - struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); + struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); struct drm_device *dev = encoder->base.dev; struct drm_i915_private *dev_priv = to_i915(dev); @@ -2756,13 +2756,13 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder, /* Use 800mV-0dB */ chv_set_phy_signal_level(encoder, 128, 102, false); - dport->set_infoframes(encoder, - pipe_config->has_infoframe, - pipe_config, conn_state); + dig_port->set_infoframes(encoder, + pipe_config->has_infoframe, + pipe_config, conn_state); g4x_enable_hdmi(encoder, pipe_config, conn_state); - vlv_wait_port_ready(dev_priv, dport, 0x0); + vlv_wait_port_ready(dev_priv, dig_port, 0x0); /* Second common lane will stay alive on its own now */ chv_phy_release_cl2_override(encoder); From patchwork Mon Dec 23 19:58:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308745 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B2DF5109A for ; Mon, 23 Dec 2019 19:59:21 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B85B206B7 for ; Mon, 23 Dec 2019 19:59:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B85B206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D06CF6E42B; Mon, 23 Dec 2019 19:59:15 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5BFB96E0CB for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598196" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:45 -0800 Message-Id: <20191223195850.25997-5-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 4/9] drm/i915/display: start description-based ddi initialization X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" For the latest platforms we can share the logic to initialize the the ddi, so start moving the most trivial ones to a new setup_outputs_desc() function that will be responsible for initialization according to a static const table. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_display.c | 96 +++++++++++++------ .../drm/i915/display/intel_display_types.h | 4 + 2 files changed, 73 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 04819b0bd494..b3fb1e03cb0b 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16221,6 +16221,72 @@ static void intel_pps_init(struct drm_i915_private *dev_priv) intel_pps_unlock_regs_wa(dev_priv); } +struct intel_output { + /* Initialize DSI if present */ + void (*dsi_init)(struct drm_i915_private *i915); + struct intel_ddi_port_info ddi_ports[]; +}; + +static const struct intel_output tgl_output = { + .dsi_init = icl_dsi_init, + .ddi_ports = { + { .port = PORT_A }, + { .port = PORT_B }, + { .port = PORT_D }, + { .port = PORT_E }, + { .port = PORT_F }, + { .port = PORT_G }, + { .port = PORT_H }, + { .port = PORT_I }, + { .port = PORT_NONE } + } +}; + +static const struct intel_output ehl_output = { + .dsi_init = icl_dsi_init, + .ddi_ports = { + { .port = PORT_A }, + { .port = PORT_B }, + { .port = PORT_C }, + { .port = PORT_D }, + { .port = PORT_NONE } + } +}; + +static const struct intel_output gen9lp_output = { + .dsi_init = vlv_dsi_init, + .ddi_ports = { + { .port = PORT_A }, + { .port = PORT_B }, + { .port = PORT_C }, + { .port = PORT_NONE } + }, +}; + +/* + * Use a description-based approach for platforms that can be supported with a + * static table + */ +static void setup_ddi_outputs_desc(struct drm_i915_private *i915) +{ + const struct intel_output *output; + const struct intel_ddi_port_info *port_info; + + if (INTEL_GEN(i915) >= 12) + output = &tgl_output; + else if (IS_ELKHARTLAKE(i915)) + output = &ehl_output; + else if (IS_GEN9_LP(i915)) + output = &gen9lp_output; + + for (port_info = output->ddi_ports; + port_info->port != PORT_NONE; port_info++) + intel_ddi_init(i915, port_info->port); + + if (output->dsi_init) + output->dsi_init(i915); +} + static void intel_setup_outputs(struct drm_i915_private *dev_priv) { struct intel_encoder *encoder; @@ -16231,22 +16297,9 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv)) return; - if (INTEL_GEN(dev_priv) >= 12) { - intel_ddi_init(dev_priv, PORT_A); - intel_ddi_init(dev_priv, PORT_B); - intel_ddi_init(dev_priv, PORT_D); - intel_ddi_init(dev_priv, PORT_E); - intel_ddi_init(dev_priv, PORT_F); - intel_ddi_init(dev_priv, PORT_G); - intel_ddi_init(dev_priv, PORT_H); - intel_ddi_init(dev_priv, PORT_I); - icl_dsi_init(dev_priv); - } else if (IS_ELKHARTLAKE(dev_priv)) { - intel_ddi_init(dev_priv, PORT_A); - intel_ddi_init(dev_priv, PORT_B); - intel_ddi_init(dev_priv, PORT_C); - intel_ddi_init(dev_priv, PORT_D); - icl_dsi_init(dev_priv); + if (INTEL_GEN(dev_priv) >= 12 || IS_ELKHARTLAKE(dev_priv) || + IS_GEN9_LP(dev_priv)) { + setup_ddi_outputs_desc(dev_priv); } else if (IS_GEN(dev_priv, 11)) { intel_ddi_init(dev_priv, PORT_A); intel_ddi_init(dev_priv, PORT_B); @@ -16263,17 +16316,6 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) intel_ddi_init(dev_priv, PORT_F); icl_dsi_init(dev_priv); - } else if (IS_GEN9_LP(dev_priv)) { - /* - * FIXME: Broxton doesn't support port detection via the - * DDI_BUF_CTL_A or SFUSE_STRAP registers, find another way to - * detect the ports. - */ - intel_ddi_init(dev_priv, PORT_A); - intel_ddi_init(dev_priv, PORT_B); - intel_ddi_init(dev_priv, PORT_C); - - vlv_dsi_init(dev_priv); } else if (HAS_DDI(dev_priv)) { int found; diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index a3a067dacf84..4d2f4ee35812 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1376,6 +1376,10 @@ struct intel_dp_mst_encoder { struct intel_connector *connector; }; +struct intel_ddi_port_info { + enum port port; +}; + static inline enum dpio_channel vlv_dig_port_to_channel(struct intel_digital_port *dig_port) { From patchwork Mon Dec 23 19:58:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308733 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id ED374109A for ; Mon, 23 Dec 2019 19:59:13 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C9C60206B7 for ; Mon, 23 Dec 2019 19:59:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C9C60206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5A8C86E0CB; Mon, 23 Dec 2019 19:59:11 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 31CF66E0CE for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598199" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:46 -0800 Message-Id: <20191223195850.25997-6-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 5/9] drm/i915/display: move icl to description-based ddi init X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" By adding a hook that determines if a port is present, we are able to support Ice Lake in the new description-based DDI initialization. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_display.c | 61 ++++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index b3fb1e03cb0b..6b4d320ff92c 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16224,9 +16224,28 @@ static void intel_pps_init(struct drm_i915_private *dev_priv) struct intel_output { /* Initialize DSI if present */ void (*dsi_init)(struct drm_i915_private *i915); + + /* + * Check if port is present before trying to initialize; if not provided + * it's assumed the port is present (or we can't check and fail + * gracefully + */ + bool (*is_port_present)(struct drm_i915_private *i915, + const struct intel_ddi_port_info *port_info); + struct intel_ddi_port_info ddi_ports[]; }; +static bool icl_is_port_present(struct drm_i915_private *i915, + const struct intel_ddi_port_info *port_info) +{ + if (port_info->port != PORT_F) + return true; + + return IS_ICL_WITH_PORT_F(i915) && + intel_bios_is_port_present(i915, PORT_F); +} + static const struct intel_output tgl_output = { .dsi_init = icl_dsi_init, .ddi_ports = { @@ -16242,6 +16261,20 @@ static const struct intel_output tgl_output = { } }; +static const struct intel_output icl_output = { + .dsi_init = icl_dsi_init, + .is_port_present = icl_is_port_present, + .ddi_ports = { + { .port = PORT_A }, + { .port = PORT_B }, + { .port = PORT_C }, + { .port = PORT_D }, + { .port = PORT_E }, + { .port = PORT_F }, + { .port = PORT_NONE } + } +}; + static const struct intel_output ehl_output = { .dsi_init = icl_dsi_init, .ddi_ports = { @@ -16276,12 +16309,19 @@ static void setup_ddi_outputs_desc(struct drm_i915_private *i915) output = &tgl_output; else if (IS_ELKHARTLAKE(i915)) output = &ehl_output; + else if (IS_GEN(i915, 11)) + output = &icl_output; else if (IS_GEN9_LP(i915)) output = &gen9lp_output; for (port_info = output->ddi_ports; - port_info->port != PORT_NONE; port_info++) + port_info->port != PORT_NONE; port_info++) { + if (output->is_port_present && + !output->is_port_present(i915, port_info)) + continue; + intel_ddi_init(i915, port_info->port); + } if (output->dsi_init) output->dsi_init(i915); @@ -16297,25 +16337,8 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) if (!HAS_DISPLAY(dev_priv) || !INTEL_DISPLAY_ENABLED(dev_priv)) return; - if (INTEL_GEN(dev_priv) >= 12 || IS_ELKHARTLAKE(dev_priv) || - IS_GEN9_LP(dev_priv)) { + if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) { setup_ddi_outputs_desc(dev_priv); - } else if (IS_GEN(dev_priv, 11)) { - intel_ddi_init(dev_priv, PORT_A); - intel_ddi_init(dev_priv, PORT_B); - intel_ddi_init(dev_priv, PORT_C); - intel_ddi_init(dev_priv, PORT_D); - intel_ddi_init(dev_priv, PORT_E); - /* - * On some ICL SKUs port F is not present. No strap bits for - * this, so rely on VBT. - * Work around broken VBTs on SKUs known to have no port F. - */ - if (IS_ICL_WITH_PORT_F(dev_priv) && - intel_bios_is_port_present(dev_priv, PORT_F)) - intel_ddi_init(dev_priv, PORT_F); - - icl_dsi_init(dev_priv); } else if (HAS_DDI(dev_priv)) { int found; From patchwork Mon Dec 23 19:58:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308749 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F36F014F6 for ; Mon, 23 Dec 2019 19:59:28 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DC203206CB for ; Mon, 23 Dec 2019 19:59:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DC203206CB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 710466E442; Mon, 23 Dec 2019 19:59:28 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 075496E0CB for ; Mon, 23 Dec 2019 19:59:09 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598202" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:47 -0800 Message-Id: <20191223195850.25997-7-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 6/9] drm/i915/display: description-based initialization for remaining ddi platforms X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Support remaining platforms under HAS_DDI() by providing a slightly more complex is_port_present() hook. The downside is that now we call I915_READ(SFUSE_STRAP) for each port being initialized, but that's only on initialization: a few more mmio reads won't hurt. Alternatives would be to provide one hook per port, or to have a "pre_init()" hook that takes care of the mmio read. However I think this is simpler - we may need to adapt if future platforms don't follow the same initialization "template". Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_display.c | 72 +++++++++++++------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 6b4d320ff92c..ad85cf75c815 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16246,6 +16246,34 @@ static bool icl_is_port_present(struct drm_i915_private *i915, intel_bios_is_port_present(i915, PORT_F); } +static bool ddi_is_port_present(struct drm_i915_private *i915, + const struct intel_ddi_port_info *port_info) +{ + /* keep I915_READ() happy */ + struct drm_i915_private *dev_priv = i915; + + if (port_info->port == PORT_A) + return I915_READ(DDI_BUF_CTL(PORT_A)) + & DDI_INIT_DISPLAY_DETECTED; + + if (port_info->port == PORT_E) + return IS_GEN9_BC(dev_priv) && + intel_bios_is_port_present(i915, PORT_E); + + switch (port_info->port) { + case PORT_B: + return I915_READ(SFUSE_STRAP) & SFUSE_STRAP_DDIB_DETECTED; + case PORT_C: + return I915_READ(SFUSE_STRAP) & SFUSE_STRAP_DDIC_DETECTED; + case PORT_D: + return I915_READ(SFUSE_STRAP) & SFUSE_STRAP_DDID_DETECTED; + case PORT_F: + return I915_READ(SFUSE_STRAP) & SFUSE_STRAP_DDIF_DETECTED; + default: + return false; + } +} + static const struct intel_output tgl_output = { .dsi_init = icl_dsi_init, .ddi_ports = { @@ -16296,11 +16324,24 @@ static const struct intel_output gen9lp_output = { }, }; +static const struct intel_output ddi_output = { + .is_port_present = ddi_is_port_present, + .ddi_ports = { + { .port = PORT_A }, + { .port = PORT_B }, + { .port = PORT_C }, + { .port = PORT_D }, + { .port = PORT_E }, + { .port = PORT_F }, + { .port = PORT_NONE } + } +}; + /* * Use a description-based approach for platforms that can be supported with a * static table */ -static void setup_ddi_outputs_desc(struct drm_i915_private *i915) +static void setup_ddi_outputs(struct drm_i915_private *i915) { const struct intel_output *output; const struct intel_ddi_port_info *port_info; @@ -16313,6 +16354,8 @@ static void setup_ddi_outputs_desc(struct drm_i915_private *i915) output = &icl_output; else if (IS_GEN9_LP(i915)) output = &gen9lp_output; + else + output = &ddi_output; for (port_info = output->ddi_ports; port_info->port != PORT_NONE; port_info++) { @@ -16338,35 +16381,12 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) return; if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) { - setup_ddi_outputs_desc(dev_priv); + setup_ddi_outputs(dev_priv); } else if (HAS_DDI(dev_priv)) { - int found; - if (intel_ddi_crt_present(dev_priv)) intel_crt_init(dev_priv); - found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED; - if (found) - intel_ddi_init(dev_priv, PORT_A); - - /* DDI B, C, D, and F detection is indicated by the SFUSE_STRAP - * register */ - found = I915_READ(SFUSE_STRAP); - - if (found & SFUSE_STRAP_DDIB_DETECTED) - intel_ddi_init(dev_priv, PORT_B); - if (found & SFUSE_STRAP_DDIC_DETECTED) - intel_ddi_init(dev_priv, PORT_C); - if (found & SFUSE_STRAP_DDID_DETECTED) - intel_ddi_init(dev_priv, PORT_D); - if (found & SFUSE_STRAP_DDIF_DETECTED) - intel_ddi_init(dev_priv, PORT_F); - /* - * On SKL we don't have a way to detect DDI-E so we rely on VBT. - */ - if (IS_GEN9_BC(dev_priv) && - intel_bios_is_port_present(dev_priv, PORT_E)) - intel_ddi_init(dev_priv, PORT_E); + setup_ddi_outputs(dev_priv); } else if (HAS_PCH_SPLIT(dev_priv)) { int found; From patchwork Mon Dec 23 19:58:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308741 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D853F13B6 for ; Mon, 23 Dec 2019 19:59:19 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C1122206B7 for ; Mon, 23 Dec 2019 19:59:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C1122206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B87C16E429; Mon, 23 Dec 2019 19:59:15 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id D11486E0CE for ; Mon, 23 Dec 2019 19:59:09 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598205" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:08 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:48 -0800 Message-Id: <20191223195850.25997-8-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 7/9] drm/i915/display: add phy, vbt and ddi indexes X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Identify 3 possible cases in which the index numbers can be different from the "port" and add them to the description-based ddi initialization table. This can be used in place of additional functions mapping from on to the other. Right now we already cover part of this by creating kind of virtual phy numbering, but that comes with downsides: a) there's not really a "phy numbering" in the spec, this is purely a software thing; hardware uses whatever they want thinking mapping from one to the other arbitrarily is easy in software. b) currently the mapping occurs on "leaf" functions, making the decision based on the platform. With this new table the approach will be: the port as defined by the enum port is purely a driver convention and won't be used anymore to define the register offset or register bits. For that we have the other 3 indexes, identified as being possibly different from the current usage of register bits: ddi, vbt and phy. The phy type is also added here, meant to replace the checks for combo vs tc (although the helper functions can remain so we may differentiate between, e.g. Dekel and MG phys). While at it, also give names to the ports so they can be easily identified. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_display.c | 54 +++++++++---------- drivers/gpu/drm/i915/display/intel_display.h | 7 +++ .../drm/i915/display/intel_display_types.h | 5 ++ 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index ad85cf75c815..219f180fa395 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16277,14 +16277,14 @@ static bool ddi_is_port_present(struct drm_i915_private *i915, static const struct intel_output tgl_output = { .dsi_init = icl_dsi_init, .ddi_ports = { - { .port = PORT_A }, - { .port = PORT_B }, - { .port = PORT_D }, - { .port = PORT_E }, - { .port = PORT_F }, - { .port = PORT_G }, - { .port = PORT_H }, - { .port = PORT_I }, + { .name = "DDI A", .port = PORT_A, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x0, .phy_idx = 0x0, .vbt_idx = 0x0, }, + { .name = "DDI B", .port = PORT_B, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x1, .phy_idx = 0x1, .vbt_idx = 0x1, }, + { .name = "DDI TC1", .port = PORT_D, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x3, .phy_idx = 0x0, .vbt_idx = 0x2, }, + { .name = "DDI TC2", .port = PORT_E, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x4, .phy_idx = 0x1, .vbt_idx = 0x3, }, + { .name = "DDI TC3", .port = PORT_F, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x5, .phy_idx = 0x2, .vbt_idx = 0x4, }, + { .name = "DDI TC4", .port = PORT_G, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x6, .phy_idx = 0x3, .vbt_idx = 0x5, }, + { .name = "DDI TC5", .port = PORT_H, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x7, .phy_idx = 0x4, .vbt_idx = 0x6, }, + { .name = "DDI TC6", .port = PORT_I, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x8, .phy_idx = 0x5, .vbt_idx = 0x7, }, { .port = PORT_NONE } } }; @@ -16293,12 +16293,12 @@ static const struct intel_output icl_output = { .dsi_init = icl_dsi_init, .is_port_present = icl_is_port_present, .ddi_ports = { - { .port = PORT_A }, - { .port = PORT_B }, - { .port = PORT_C }, - { .port = PORT_D }, - { .port = PORT_E }, - { .port = PORT_F }, + { .name = "DDI A", .port = PORT_A, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x0, .phy_idx = 0x0, .vbt_idx = 0x0, }, + { .name = "DDI B", .port = PORT_B, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x1, .phy_idx = 0x1, .vbt_idx = 0x1, }, + { .name = "DDI TC1", .port = PORT_C, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x2, .phy_idx = 0x0, .vbt_idx = 0x2, }, + { .name = "DDI TC2", .port = PORT_D, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x3, .phy_idx = 0x1, .vbt_idx = 0x3, }, + { .name = "DDI TC3", .port = PORT_E, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x4, .phy_idx = 0x2, .vbt_idx = 0x4, }, + { .name = "DDI TC4", .port = PORT_F, .phy_type = PHY_TYPE_TC, .ddi_idx = 0x5, .phy_idx = 0x3, .vbt_idx = 0x5, }, { .port = PORT_NONE } } }; @@ -16306,10 +16306,10 @@ static const struct intel_output icl_output = { static const struct intel_output ehl_output = { .dsi_init = icl_dsi_init, .ddi_ports = { - { .port = PORT_A }, - { .port = PORT_B }, - { .port = PORT_C }, - { .port = PORT_D }, + { .name = "DDI A", .port = PORT_A, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x0, .phy_idx = 0x0, .vbt_idx = 0x0, }, + { .name = "DDI B", .port = PORT_B, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x1, .phy_idx = 0x1, .vbt_idx = 0x1, }, + { .name = "DDI C", .port = PORT_C, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x2, .phy_idx = 0x2, .vbt_idx = 0x2, }, + { .name = "DDI D", .port = PORT_D, .phy_type = PHY_TYPE_COMBO, .ddi_idx = 0x3, .phy_idx = 0x0, .vbt_idx = 0x3, }, { .port = PORT_NONE } } }; @@ -16317,9 +16317,9 @@ static const struct intel_output ehl_output = { static const struct intel_output gen9lp_output = { .dsi_init = vlv_dsi_init, .ddi_ports = { - { .port = PORT_A }, - { .port = PORT_B }, - { .port = PORT_C }, + { .name = "DDI A", .port = PORT_A, .ddi_idx = 0x0, .phy_idx = 0x0, .vbt_idx = 0x0 }, + { .name = "DDI B", .port = PORT_B, .ddi_idx = 0x1, .phy_idx = 0x1, .vbt_idx = 0x1 }, + { .name = "DDI C", .port = PORT_C, .ddi_idx = 0x2, .phy_idx = 0x2, .vbt_idx = 0x2 }, { .port = PORT_NONE } }, }; @@ -16327,12 +16327,12 @@ static const struct intel_output gen9lp_output = { static const struct intel_output ddi_output = { .is_port_present = ddi_is_port_present, .ddi_ports = { - { .port = PORT_A }, - { .port = PORT_B }, - { .port = PORT_C }, - { .port = PORT_D }, - { .port = PORT_E }, - { .port = PORT_F }, + { .name = "DDI A", .port = PORT_A, .ddi_idx = 0x0, .phy_idx = 0x0, .vbt_idx = 0x0 }, + { .name = "DDI B", .port = PORT_B, .ddi_idx = 0x1, .phy_idx = 0x1, .vbt_idx = 0x1 }, + { .name = "DDI C", .port = PORT_C, .ddi_idx = 0x2, .phy_idx = 0x2, .vbt_idx = 0x2 }, + { .name = "DDI D", .port = PORT_D, .ddi_idx = 0x3, .phy_idx = 0x3, .vbt_idx = 0x3 }, + { .name = "DDI E", .port = PORT_E, .ddi_idx = 0x4, .phy_idx = 0x4, .vbt_idx = 0x4 }, + { .name = "DDI F", .port = PORT_F, .ddi_idx = 0x5, .phy_idx = 0x5, .vbt_idx = 0x5 }, { .port = PORT_NONE } } }; diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h index 05d68bd393dc..db19e5eee248 100644 --- a/drivers/gpu/drm/i915/display/intel_display.h +++ b/drivers/gpu/drm/i915/display/intel_display.h @@ -303,6 +303,13 @@ enum phy { I915_MAX_PHYS }; +enum phy_type { + PHY_TYPE_NONE = 0, + + PHY_TYPE_COMBO, + PHY_TYPE_TC, +}; + #define phy_name(a) ((a) + 'A') enum phy_fia { diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 4d2f4ee35812..23a885895803 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1377,7 +1377,12 @@ struct intel_dp_mst_encoder { }; struct intel_ddi_port_info { + const char *name; enum port port; + s8 phy_type; + u8 ddi_idx; + u8 phy_idx; + u8 vbt_idx; }; static inline enum dpio_channel From patchwork Mon Dec 23 19:58:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308743 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D251813B6 for ; Mon, 23 Dec 2019 19:59:20 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BB063206B7 for ; Mon, 23 Dec 2019 19:59:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BB063206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AC8836E2F2; Mon, 23 Dec 2019 19:59:15 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id B80A46E2EA for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598208" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:09 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:49 -0800 Message-Id: <20191223195850.25997-9-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 8/9] drm/i915/display: refer to vbt info as vbt_port_info X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Now that we maintain our static port info, rename the places that refer to the port_info from vbt to use the vbt prefix. This is just a preparation step for a following change in which we will use the port_info variable name. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_ddi.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 1bdf63845472..a1b7075ea6be 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -902,7 +902,8 @@ icl_get_combo_buf_trans(struct drm_i915_private *dev_priv, int type, int rate, static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port port) { - struct ddi_vbt_port_info *port_info = &dev_priv->vbt.ddi_port_info[port]; + struct ddi_vbt_port_info *vbt_port_info = + &dev_priv->vbt.ddi_port_info[port]; int n_entries, level, default_entry; enum phy phy = intel_port_to_phy(dev_priv, port); @@ -943,8 +944,8 @@ static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port por if (WARN_ON_ONCE(n_entries == 0)) return 0; - if (port_info->hdmi_level_shift_set) - level = port_info->hdmi_level_shift; + if (vbt_port_info->hdmi_level_shift_set) + level = vbt_port_info->hdmi_level_shift; else level = default_entry; @@ -4783,15 +4784,15 @@ intel_ddi_max_lanes(struct intel_digital_port *dig_port) void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) { - struct ddi_vbt_port_info *port_info = + struct ddi_vbt_port_info *vbt_port_info = &dev_priv->vbt.ddi_port_info[port]; struct intel_digital_port *intel_dig_port; struct intel_encoder *encoder; bool init_hdmi, init_dp, init_lspcon = false; enum phy phy = intel_port_to_phy(dev_priv, port); - init_hdmi = port_info->supports_dvi || port_info->supports_hdmi; - init_dp = port_info->supports_dp; + init_hdmi = vbt_port_info->supports_dvi || vbt_port_info->supports_hdmi; + init_dp = vbt_port_info->supports_dp; if (intel_bios_is_lspcon_present(dev_priv, port)) { /* @@ -4852,8 +4853,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port); if (intel_phy_is_tc(dev_priv, phy)) { - bool is_legacy = !port_info->supports_typec_usb && - !port_info->supports_tbt; + bool is_legacy = !vbt_port_info->supports_typec_usb && + !vbt_port_info->supports_tbt; intel_tc_port_init(intel_dig_port, is_legacy); From patchwork Mon Dec 23 19:58:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas De Marchi X-Patchwork-Id: 11308747 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 833FC109A for ; Mon, 23 Dec 2019 19:59:22 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6BF35206B7 for ; Mon, 23 Dec 2019 19:59:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6BF35206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 63A576E440; Mon, 23 Dec 2019 19:59:16 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id E020C6E0CE for ; Mon, 23 Dec 2019 19:59:10 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Dec 2019 11:59:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,348,1571727600"; d="scan'208";a="219598210" Received: from ldmartin1-desk.jf.intel.com ([10.165.21.151]) by orsmga003.jf.intel.com with ESMTP; 23 Dec 2019 11:59:09 -0800 From: Lucas De Marchi To: intel-gfx@lists.freedesktop.org Date: Mon, 23 Dec 2019 11:58:50 -0800 Message-Id: <20191223195850.25997-10-lucas.demarchi@intel.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191223195850.25997-1-lucas.demarchi@intel.com> References: <20191223195850.25997-1-lucas.demarchi@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH 9/9] drm/i915/display: use port_info on intel_ddi_init X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Now that we have tables for all platforms using ddi, keep the port_info around so we can use it for decisions like "what phy does it have?" instead of keep checking the platform/gen everywhere. Signed-off-by: Lucas De Marchi --- drivers/gpu/drm/i915/display/intel_ddi.c | 36 ++++++++++++------- drivers/gpu/drm/i915/display/intel_ddi.h | 8 ++++- drivers/gpu/drm/i915/display/intel_display.c | 2 +- .../drm/i915/display/intel_display_types.h | 3 ++ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index a1b7075ea6be..9d06a34f5f8e 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -4782,14 +4782,25 @@ intel_ddi_max_lanes(struct intel_digital_port *dig_port) return max_lanes; } -void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) +bool __pure intel_ddi_has_tc_phy(const struct intel_digital_port *dig_port) { + return dig_port->port_info->phy_type == PHY_TYPE_TC; +} + +bool __pure intel_ddi_has_combo_phy(const struct intel_digital_port *dig_port) +{ + return dig_port->port_info->phy_type == PHY_TYPE_COMBO; +} + +void intel_ddi_init(struct drm_i915_private *dev_priv, + const struct intel_ddi_port_info *port_info) +{ + enum port port = port_info->port; struct ddi_vbt_port_info *vbt_port_info = &dev_priv->vbt.ddi_port_info[port]; struct intel_digital_port *intel_dig_port; struct intel_encoder *encoder; bool init_hdmi, init_dp, init_lspcon = false; - enum phy phy = intel_port_to_phy(dev_priv, port); init_hdmi = vbt_port_info->supports_dvi || vbt_port_info->supports_hdmi; init_dp = vbt_port_info->supports_dp; @@ -4803,12 +4814,12 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) init_dp = true; init_lspcon = true; init_hdmi = false; - DRM_DEBUG_KMS("VBT says port %c has lspcon\n", port_name(port)); + DRM_DEBUG_KMS("VBT says port %s has lspcon\n", port_info->name); } if (!init_dp && !init_hdmi) { - DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, respect it\n", - port_name(port)); + DRM_DEBUG_KMS("VBT says %s is not DVI/HDMI/DP compatible, respect it\n", + port_info->name); return; } @@ -4819,7 +4830,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) encoder = &intel_dig_port->base; drm_encoder_init(&dev_priv->drm, &encoder->base, &intel_ddi_funcs, - DRM_MODE_ENCODER_TMDS, "DDI %c", port_name(port)); + DRM_MODE_ENCODER_TMDS, port_info->name); encoder->hotplug = intel_ddi_hotplug; encoder->compute_output_type = intel_ddi_compute_output_type; @@ -4837,7 +4848,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) encoder->type = INTEL_OUTPUT_DDI; encoder->power_domain = intel_port_to_power_domain(port); - encoder->port = port; + encoder->port = port_info->port; encoder->cloneable = 0; encoder->pipe_mask = ~0; @@ -4851,8 +4862,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) intel_dig_port->dp.output_reg = INVALID_MMIO_REG; intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port); intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port); + intel_dig_port->port_info = port_info; - if (intel_phy_is_tc(dev_priv, phy)) { + if (intel_ddi_has_tc_phy(intel_dig_port)) { bool is_legacy = !vbt_port_info->supports_typec_usb && !vbt_port_info->supports_tbt; @@ -4883,15 +4895,15 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) if (init_lspcon) { if (lspcon_init(intel_dig_port)) /* TODO: handle hdmi info frame part */ - DRM_DEBUG_KMS("LSPCON init success on port %c\n", - port_name(port)); + DRM_DEBUG_KMS("LSPCON init success on port %s\n", + port_info->name); else /* * LSPCON init faied, but DP init was success, so * lets try to drive as DP++ port. */ - DRM_ERROR("LSPCON init failed on port %c\n", - port_name(port)); + DRM_ERROR("LSPCON init failed on port %s\n", + port_info->name); } intel_infoframe_init(intel_dig_port); diff --git a/drivers/gpu/drm/i915/display/intel_ddi.h b/drivers/gpu/drm/i915/display/intel_ddi.h index 167c6579d972..c500d473963e 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.h +++ b/drivers/gpu/drm/i915/display/intel_ddi.h @@ -15,6 +15,7 @@ struct drm_i915_private; struct intel_connector; struct intel_crtc; struct intel_crtc_state; +struct intel_ddi_port_info; struct intel_dp; struct intel_dpll_hw_state; struct intel_encoder; @@ -24,7 +25,8 @@ void intel_ddi_fdi_post_disable(struct intel_encoder *intel_encoder, const struct drm_connector_state *old_conn_state); void hsw_fdi_link_train(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state); -void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port); +void intel_ddi_init(struct drm_i915_private *dev_priv, + const struct intel_ddi_port_info *port_info); bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe); void intel_ddi_enable_transcoder_func(const struct intel_crtc_state *crtc_state); void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state); @@ -50,4 +52,8 @@ void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder); int cnl_calc_wrpll_link(struct drm_i915_private *dev_priv, struct intel_dpll_hw_state *state); + +bool __pure intel_ddi_has_tc_phy(const struct intel_digital_port *dig_port); +bool __pure intel_ddi_has_combo_phy(const struct intel_digital_port *dig_port); + #endif /* __INTEL_DDI_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 219f180fa395..96207dc83fac 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16363,7 +16363,7 @@ static void setup_ddi_outputs(struct drm_i915_private *i915) !output->is_port_present(i915, port_info)) continue; - intel_ddi_init(i915, port_info->port); + intel_ddi_init(i915, port_info); } if (output->dsi_init) diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 23a885895803..c54b0178e885 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1346,6 +1346,9 @@ struct intel_digital_port { enum intel_display_power_domain ddi_io_power_domain; struct mutex tc_lock; /* protects the TypeC port mode */ intel_wakeref_t tc_lock_wakeref; + + const struct intel_ddi_port_info *port_info; + int tc_link_refcount; bool tc_legacy_port:1; char tc_port_name[8];