From patchwork Wed Mar 17 16:36:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jani Nikula X-Patchwork-Id: 12146431 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C75C6C433E0 for ; Wed, 17 Mar 2021 16:38:14 +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 83A7764F4D for ; Wed, 17 Mar 2021 16:38:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 83A7764F4D 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 14E956E846; Wed, 17 Mar 2021 16:38:14 +0000 (UTC) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id E7A2C6E844 for ; Wed, 17 Mar 2021 16:38:12 +0000 (UTC) IronPort-SDR: Nb55I0NCeeyU/BbNUrYlLOiPEnGoqRfKV1YglSZrTVcWtPNt/YKYfBHCHK2HtlYhObvfejwen8 +8aMzFjqjCFg== X-IronPort-AV: E=McAfee;i="6000,8403,9926"; a="250858967" X-IronPort-AV: E=Sophos;i="5.81,256,1610438400"; d="scan'208";a="250858967" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Mar 2021 09:38:12 -0700 IronPort-SDR: 9O7jCm5aE19+IcU7DiAy5fLMOOj6ihZy+qOmedcWZaRvfOso/11GiM1cvaRY1LkKO7t36iq052 Fa6NnIvT3MOA== X-IronPort-AV: E=Sophos;i="5.81,256,1610438400"; d="scan'208";a="388900300" Received: from jpferrer-mobl1.ger.corp.intel.com (HELO localhost) ([10.249.46.99]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Mar 2021 09:38:10 -0700 From: Jani Nikula To: intel-gfx@lists.freedesktop.org Date: Wed, 17 Mar 2021 18:36:51 +0200 Message-Id: <061df32a012ff640060920fcd730fb23f8717ee8.1615998927.git.jani.nikula@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH v2 12/14] drm/i915/bios: start using the intel_bios_encoder_data directly 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: , Cc: jani.nikula@intel.com, lucas.demarchi@intel.com Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Start using struct intel_bios_encoder_data directly. We'll start sanitizing the child device data directly as well, instead of the cached data in ddi_port_info[]. The one downside here is having to store a non-const pointer back to intel_bios_encoder_data. Eventually we'll be able to have a direct pointer from encoder to intel_bios_encoder_data, removing the need to go through the ddi_port_info[] array altogether. And we'll be able to remove all the cached data in ddi_port_info[]. v2: - Remove supports_dp and supports_edp from ddi_port_info too - Add devdata != NULL check in intel_bios_is_port_edp() Cc: Lucas De Marchi Cc: Ville Syrjälä Reviewed-by: Lucas De Marchi # v1 Signed-off-by: Jani Nikula --- drivers/gpu/drm/i915/display/intel_bios.c | 52 +++++++++++------------ drivers/gpu/drm/i915/display/intel_bios.h | 10 +++-- drivers/gpu/drm/i915/display/intel_ddi.c | 15 +++++-- drivers/gpu/drm/i915/i915_drv.h | 6 +-- 4 files changed, 44 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index db13637d0ab9..818da9cf50aa 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -1524,6 +1524,7 @@ static void sanitize_ddc_pin(struct drm_i915_private *i915, enum port port) { struct ddi_vbt_port_info *info = &i915->vbt.ddi_port_info[port]; + struct child_device_config *child; enum port p; p = get_port_by_ddc_pin(i915, info->alternate_ddc_pin); @@ -1546,9 +1547,11 @@ static void sanitize_ddc_pin(struct drm_i915_private *i915, * port A and port E with the same AUX ch and we must pick port E :( */ info = &i915->vbt.ddi_port_info[p]; + child = &info->devdata->child; + + child->device_type &= ~DEVICE_TYPE_TMDS_DVI_SIGNALING; + child->device_type |= DEVICE_TYPE_NOT_HDMI_OUTPUT; - info->supports_dvi = false; - info->supports_hdmi = false; info->alternate_ddc_pin = 0; } @@ -1574,6 +1577,7 @@ static void sanitize_aux_ch(struct drm_i915_private *i915, enum port port) { struct ddi_vbt_port_info *info = &i915->vbt.ddi_port_info[port]; + struct child_device_config *child; enum port p; p = get_port_by_aux_ch(i915, info->alternate_aux_channel); @@ -1596,8 +1600,9 @@ static void sanitize_aux_ch(struct drm_i915_private *i915, * port A and port E with the same AUX ch and we must pick port E :( */ info = &i915->vbt.ddi_port_info[p]; + child = &info->devdata->child; - info->supports_dp = false; + child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT; info->alternate_aux_channel = 0; } @@ -1822,20 +1827,20 @@ intel_bios_encoder_supports_crt(const struct intel_bios_encoder_data *devdata) return devdata->child.device_type & DEVICE_TYPE_ANALOG_OUTPUT; } -static bool +bool intel_bios_encoder_supports_dvi(const struct intel_bios_encoder_data *devdata) { return devdata->child.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; } -static bool +bool intel_bios_encoder_supports_hdmi(const struct intel_bios_encoder_data *devdata) { return intel_bios_encoder_supports_dvi(devdata) && (devdata->child.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0; } -static bool +bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdata) { return devdata->child.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT; @@ -1877,11 +1882,6 @@ static void parse_ddi_port(struct drm_i915_private *i915, is_hdmi = intel_bios_encoder_supports_hdmi(devdata); is_edp = intel_bios_encoder_supports_edp(devdata); - info->supports_dvi = is_dvi; - info->supports_hdmi = is_hdmi; - info->supports_dp = is_dp; - info->supports_edp = is_edp; - if (i915->vbt.version >= 195) info->supports_typec_usb = child->dp_usb_type_c; @@ -2557,8 +2557,13 @@ bool intel_bios_is_port_edp(struct drm_i915_private *i915, enum port port) [PORT_F] = DVO_PORT_DPF, }; - if (HAS_DDI(i915)) - return i915->vbt.ddi_port_info[port].supports_edp; + if (HAS_DDI(i915)) { + const struct intel_bios_encoder_data *devdata; + + devdata = intel_bios_encoder_data_lookup(i915, port); + + return devdata && intel_bios_encoder_supports_edp(devdata); + } list_for_each_entry(devdata, &i915->vbt.display_devices, node) { child = &devdata->child; @@ -2930,21 +2935,6 @@ int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder) return i915->vbt.ddi_port_info[encoder->port].alternate_ddc_pin; } -bool intel_bios_port_supports_dvi(struct drm_i915_private *i915, enum port port) -{ - return i915->vbt.ddi_port_info[port].supports_dvi; -} - -bool intel_bios_port_supports_hdmi(struct drm_i915_private *i915, enum port port) -{ - return i915->vbt.ddi_port_info[port].supports_hdmi; -} - -bool intel_bios_port_supports_dp(struct drm_i915_private *i915, enum port port) -{ - return i915->vbt.ddi_port_info[port].supports_dp; -} - bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port) { @@ -2955,3 +2945,9 @@ bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port) { return i915->vbt.ddi_port_info[port].supports_tbt; } + +const struct intel_bios_encoder_data * +intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port) +{ + return i915->vbt.ddi_port_info[port].devdata; +} diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h index 6591cf7758f2..18b5c2976bd4 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.h +++ b/drivers/gpu/drm/i915/display/intel_bios.h @@ -254,10 +254,14 @@ int intel_bios_dp_boost_level(struct intel_encoder *encoder); int intel_bios_hdmi_boost_level(struct intel_encoder *encoder); int intel_bios_dp_max_link_rate(struct intel_encoder *encoder); int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder); -bool intel_bios_port_supports_dvi(struct drm_i915_private *i915, enum port port); -bool intel_bios_port_supports_hdmi(struct drm_i915_private *i915, enum port port); -bool intel_bios_port_supports_dp(struct drm_i915_private *i915, enum port port); bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port); bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port); +const struct intel_bios_encoder_data * +intel_bios_encoder_data_lookup(struct drm_i915_private *i915, enum port port); + +bool intel_bios_encoder_supports_dvi(const struct intel_bios_encoder_data *devdata); +bool intel_bios_encoder_supports_hdmi(const struct intel_bios_encoder_data *devdata); +bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdata); + #endif /* _INTEL_BIOS_H_ */ diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 64a952db8528..d74cfdcabca5 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -4426,6 +4426,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) { struct intel_digital_port *dig_port; struct intel_encoder *encoder; + const struct intel_bios_encoder_data *devdata; bool init_hdmi, init_dp; enum phy phy = intel_port_to_phy(dev_priv, port); @@ -4441,9 +4442,17 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port) return; } - init_hdmi = intel_bios_port_supports_dvi(dev_priv, port) || - intel_bios_port_supports_hdmi(dev_priv, port); - init_dp = intel_bios_port_supports_dp(dev_priv, port); + devdata = intel_bios_encoder_data_lookup(dev_priv, port); + if (!devdata) { + drm_dbg_kms(&dev_priv->drm, + "VBT says port %c is not present\n", + port_name(port)); + return; + } + + init_hdmi = intel_bios_encoder_supports_dvi(devdata) || + intel_bios_encoder_supports_hdmi(devdata); + init_dp = intel_bios_encoder_supports_dp(devdata); if (intel_bios_is_lspcon_present(dev_priv, port)) { /* diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 412c3d973279..3e5bbc1d5ad9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -584,7 +584,7 @@ i915_fence_timeout(const struct drm_i915_private *i915) struct ddi_vbt_port_info { /* Non-NULL if port present. */ - const struct intel_bios_encoder_data *devdata; + struct intel_bios_encoder_data *devdata; int max_tmds_clock; @@ -592,10 +592,6 @@ struct ddi_vbt_port_info { u8 hdmi_level_shift; u8 hdmi_level_shift_set:1; - u8 supports_dvi:1; - u8 supports_hdmi:1; - u8 supports_dp:1; - u8 supports_edp:1; u8 supports_typec_usb:1; u8 supports_tbt:1;