Re: [PATCH] drm/i915: Check encoder type in enc_to_dig_port()

Imre Deak
2017-02-24T15:34:39Z

On Fri, Feb 24, 2017 at 04:18:45PM +0200, Ander Conselvan de Oliveira wrote:
> Don't allow conversion from arbitraty encoder types to a digital port.
> Calling enc_to_dig_port() with the wrong encoder may seem far fetched,
> but certain paths of the ddi code may be called with hasell's analog
> encoder and the conversion is wrong for DP mst encoders too, so safe
> guard against it.
>
> v2: Warn if encoder type is unknown and device is not DDI. (Imre)
> v3: Remove stray hunk from rebase error. (Ander)
> Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>

Reviewed-by: Imre Deak <imre.deak@intel.com>

> ---
> drivers/gpu/drm/i915/intel_drv.h | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index c916338..97621a1 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1121,7 +1121,19 @@ intel_attached_encoder(struct drm_connector *connector)
> static inline struct intel_digital_port *
> enc_to_dig_port(struct drm_encoder *encoder)
> {
> - return container_of(encoder, struct intel_digital_port, base.base);
> + struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
> +
> + switch (intel_encoder->type) {
> + case INTEL_OUTPUT_UNKNOWN:
> + WARN_ON(!HAS_DDI(to_i915(encoder->dev)));
> + case INTEL_OUTPUT_DP:
> + case INTEL_OUTPUT_EDP:
> + case INTEL_OUTPUT_HDMI:
> + return container_of(encoder, struct intel_digital_port,
> + base.base);
> + default:
> + return NULL;
> + }
> }
>
> static inline struct intel_dp_mst_encoder *
> --
> 2.9.3
>