[Intel-gfx] [PATCH] drm/i915: only hook up hpd pulse for DP setups.

Chris Wilson chris at chris-wilson.co.uk
Sat Aug 2 08:06:27 CEST 2014


On Sat, Aug 02, 2014 at 06:47:10AM +1000, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> On HSW/BDW the VBT can tell us if we need to have DP support for a port,
> if we don't have DP this caused an oops in the hpd handling.
> 
> Don't hook up the DP hpd handling if we don't have a DP port.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81856
> Reported-by: Intel QA Team.
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  drivers/gpu/drm/i915/intel_ddi.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index 9b1542f..42d4dce 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -1557,11 +1557,13 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
>  	intel_encoder->cloneable = 0;
>  	intel_encoder->hot_plug = intel_ddi_hot_plug;
>  
> -	intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
> -	dev_priv->hpd_irq_port[port] = intel_dig_port;
> +	if (init_dp) {
> +		/* only hook up hpd processing for DP */
> +		intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
> +		dev_priv->hpd_irq_port[port] = intel_dig_port;
>  
> -	if (init_dp)
>  		dp_connector = intel_ddi_init_dp_connector(intel_dig_port);
> +	}

The (lack of) allocation error handling here will lead to the same oops.

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index a6024de17d34..3634575534b4 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1557,15 +1557,13 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
        struct intel_digital_port *intel_dig_port;
        struct intel_encoder *intel_encoder;
        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_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible\n",
+               DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n",
                              port_name(port));
                init_hdmi = true;
                init_dp = true;
@@ -1595,23 +1593,28 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
                                           DDI_A_4_LANES);
 
        intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
-       intel_encoder->crtc_mask =  (1 << 0) | (1 << 1) | (1 << 2);
+       intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
        intel_encoder->cloneable = 0;
        intel_encoder->hot_plug = intel_ddi_hot_plug;
 
-       intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
-       dev_priv->hpd_irq_port[port] = intel_dig_port;
+       if (init_dp) {
+               if (!intel_ddi_init_dp_connector(intel_dig_port))
+                       goto err;
 
-       if (init_dp)
-               dp_connector = intel_ddi_init_dp_connector(intel_dig_port);
+               intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
+               dev_priv->hpd_irq_port[port] = intel_dig_port;
+       }
 
        /* 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 = intel_ddi_init_hdmi_connector(intel_dig_port);
-
-       if (!dp_connector && !hdmi_connector) {
-               drm_encoder_cleanup(encoder);
-               kfree(intel_dig_port);
+       if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
+               if (!intel_ddi_init_hdmi_connector(intel_dig_port))
+                       goto err;
        }
+
+       return;
+
+err:
+       drm_encoder_cleanup(encoder);
+       kfree(intel_dig_port);


-- 
Chris Wilson, Intel Open Source Technology Centre



More information about the Intel-gfx mailing list