[Intel-gfx] [PATCH 3/3] drm/i915: don't init DP or HDMI when not supported by DDI port

Paulo Zanoni przanoni at gmail.com
Tue Sep 3 18:53:22 CEST 2013


2013/9/3 Rodrigo Vivi <rodrigo.vivi at gmail.com>:
> Do we really trust VBT that much?

We already trust it for some very important things, like eDP. Also, if
the VBT is wrong we'll start seeing all sorts of WARNs due to the
previous patches. Anyway, we can always revert...

Thanks for the reviews!

>
> Anyways,
> Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>
>
> On Wed, Aug 28, 2013 at 12:45 PM, Paulo Zanoni <przanoni at gmail.com> wrote:
>> From: Paulo Zanoni <paulo.r.zanoni at intel.com>
>>
>> There's no reason to init a DP connector if the encoder just supports
>> HDMI: we'll just waste hundreds and hundreds of cycles trying to do DP
>> AUX transactions to detect if there's something there. Same goes for a
>> DP connector that doesn't support HDMI, but I'm not sure these
>> actually exist.
>>
>> Signed-off-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_drv.h   |  3 +++
>>  drivers/gpu/drm/i915/intel_bios.c | 13 ++++++++++++-
>>  drivers/gpu/drm/i915/intel_ddi.c  | 30 ++++++++++++++++++++++--------
>>  3 files changed, 37 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>> index 645dd74..8720f31 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -1041,6 +1041,9 @@ enum modeset_restore {
>>
>>  struct ddi_vbt_port_info {
>>         uint8_t hdmi_level_shift;
>> +       bool supports_dvi;
>> +       bool supports_hdmi;
>> +       bool supports_dp;
>>  };
>>
>>  struct intel_vbt_data {
>> diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
>> index 4003dbf..cd823b9 100644
>> --- a/drivers/gpu/drm/i915/intel_bios.c
>> +++ b/drivers/gpu/drm/i915/intel_bios.c
>> @@ -608,6 +608,10 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
>>         is_hdmi = is_dvi && (child->common.device_type & (1 << 11)) == 0;
>>         is_edp = is_dp && (child->common.device_type & (1 << 12));
>>
>> +       info->supports_dvi = is_dvi;
>> +       info->supports_hdmi = is_hdmi;
>> +       info->supports_dp = is_dp;
>> +
>>         DRM_DEBUG_KMS("Port %c VBT info: DP:%d HDMI:%d DVI:%d EDP:%d CRT:%d\n",
>>                       port_name(port), is_dp, is_hdmi, is_dvi, is_edp, is_crt);
>>
>> @@ -762,8 +766,15 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
>>                 enum port port;
>>
>>                 for (port = PORT_A; port <= PORT_E; port++) {
>> +                       struct ddi_vbt_port_info *info =
>> +                               &dev_priv->vbt.ddi_port_info[port];
>> +
>>                         /* Recommended BSpec default: 800mV 0dB. */
>> -                       dev_priv->vbt.ddi_port_info[port].hdmi_level_shift = 6;
>> +                       info->hdmi_level_shift = 6;
>> +
>> +                       info->supports_dvi = (port != PORT_A && port != PORT_E);
>> +                       info->supports_hdmi = info->supports_dvi;
>> +                       info->supports_dp = (port != PORT_E);
>>                 }
>>         }
>>
>> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
>> index ece226d..d344977 100644
>> --- a/drivers/gpu/drm/i915/intel_ddi.c
>> +++ b/drivers/gpu/drm/i915/intel_ddi.c
>> @@ -1325,6 +1325,17 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
>>         struct drm_encoder *encoder;
>>         struct intel_connector *hdmi_connector = NULL;
>>         struct intel_connector *dp_connector = NULL;
>> +       bool init_hdmi, init_dp;
>> +
>> +       init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
>> +                    dev_priv->vbt.ddi_port_info[port].supports_hdmi);
>> +       init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
>> +       if (!init_dp && !init_hdmi) {
>> +               DRM_ERROR("VBT says port %c is not DVI/HDMI/DP compatible\n",
>> +                         port_name(port));
>> +               init_hdmi = true;
>> +               init_dp = true;
>> +       }
>>
>>         intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL);
>>         if (!intel_dig_port)
>> @@ -1362,19 +1373,22 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
>>         intel_encoder->cloneable = false;
>>         intel_encoder->hot_plug = intel_ddi_hot_plug;
>>
>> -       if (!intel_dp_init_connector(intel_dig_port, dp_connector)) {
>> -               drm_encoder_cleanup(encoder);
>> -               kfree(intel_dig_port);
>> -               kfree(dp_connector);
>> -               return;
>> +       if (init_dp) {
>> +               if (!intel_dp_init_connector(intel_dig_port, dp_connector)) {
>> +                       drm_encoder_cleanup(encoder);
>> +                       kfree(intel_dig_port);
>> +                       kfree(dp_connector);
>> +                       return;
>> +               }
>>         }
>>
>> -       if (intel_encoder->type != INTEL_OUTPUT_EDP) {
>> +       /* In theory we don't need the encoder->type check, but leave it just in
>> +        * case we have some really bad VBTs... */
>> +       if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
>>                 hdmi_connector = kzalloc(sizeof(struct intel_connector),
>>                                          GFP_KERNEL);
>> -               if (!hdmi_connector) {
>> +               if (!hdmi_connector)
>>                         return;
>> -               }
>>
>>                 intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
>>                 intel_hdmi_init_connector(intel_dig_port, hdmi_connector);
>> --
>> 1.8.1.2
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
>
>
> --
> Rodrigo Vivi
> Blog: http://blog.vivi.eng.br



-- 
Paulo Zanoni



More information about the Intel-gfx mailing list