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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2013/9/3 Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx>:
> 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@xxxxxxxxx>
>
> On Wed, Aug 28, 2013 at 12:45 PM, Paulo Zanoni <przanoni@xxxxxxxxx> wrote:
>> From: Paulo Zanoni <paulo.r.zanoni@xxxxxxxxx>
>>
>> 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@xxxxxxxxx>
>> ---
>>  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@xxxxxxxxxxxxxxxxxxxxx
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
>
>
> --
> Rodrigo Vivi
> Blog: http://blog.vivi.eng.br



-- 
Paulo Zanoni
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux