diff options
| author | Dave Airlie <airlied@redhat.com> | 2017-11-24 04:33:29 +0300 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2017-11-24 04:33:29 +0300 | 
| commit | c209101fc1c91a318422733a3721ff6a9ff7899f (patch) | |
| tree | bc00b2251b9b031db4cf9e72220f56ae72757e58 | |
| parent | 0576178f5012f30c5be12905f5628bb597bc91c6 (diff) | |
| parent | 9271c0ca573e02a360b636ecd8cb408852f4e9f6 (diff) | |
| download | linux-c209101fc1c91a318422733a3721ff6a9ff7899f.tar.xz | |
Merge tag 'drm-misc-fixes-2017-11-20' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
4.15 merge window fixes 1
* tag 'drm-misc-fixes-2017-11-20' of git://anongit.freedesktop.org/drm/drm-misc:
  drm/edid: Don't send non-zero YQ in AVI infoframe for HDMI 1.x sinks
  drm/vc4: Account for interrupts in flight
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_hdmi.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_irq.c | 6 | ||||
| -rw-r--r-- | include/drm/drm_edid.h | 3 | 
5 files changed, 22 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 2e8fb51282ef..5dfe14763871 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -4831,7 +4831,8 @@ void  drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,  				   const struct drm_display_mode *mode,  				   enum hdmi_quantization_range rgb_quant_range, -				   bool rgb_quant_range_selectable) +				   bool rgb_quant_range_selectable, +				   bool is_hdmi2_sink)  {  	/*  	 * CEA-861: @@ -4855,8 +4856,15 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,  	 *  YQ-field to match the RGB Quantization Range being transmitted  	 *  (e.g., when Limited Range RGB, set YQ=0 or when Full Range RGB,  	 *  set YQ=1) and the Sink shall ignore the YQ-field." +	 * +	 * Unfortunate certain sinks (eg. VIZ Model 67/E261VA) get confused +	 * by non-zero YQ when receiving RGB. There doesn't seem to be any +	 * good way to tell which version of CEA-861 the sink supports, so +	 * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based +	 * on on CEA-861-F.  	 */ -	if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) +	if (!is_hdmi2_sink || +	    rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED)  		frame->ycc_quantization_range =  			HDMI_YCC_QUANTIZATION_RANGE_LIMITED;  	else diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 5132dc814788..4dea833f9d1b 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -487,7 +487,8 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,  					   crtc_state->limited_color_range ?  					   HDMI_QUANTIZATION_RANGE_LIMITED :  					   HDMI_QUANTIZATION_RANGE_FULL, -					   intel_hdmi->rgb_quant_range_selectable); +					   intel_hdmi->rgb_quant_range_selectable, +					   is_hdmi2_sink);  	/* TODO: handle pixel repetition for YCBCR420 outputs */  	intel_write_infoframe(encoder, crtc_state, &frame); diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index fa37a1c07cf6..0b2088264039 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -424,7 +424,8 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)  					   vc4_encoder->limited_rgb_range ?  					   HDMI_QUANTIZATION_RANGE_LIMITED :  					   HDMI_QUANTIZATION_RANGE_FULL, -					   vc4_encoder->rgb_range_selectable); +					   vc4_encoder->rgb_range_selectable, +					   false);  	vc4_hdmi_write_infoframe(encoder, &frame);  } diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c index 7d7af3a93d94..61b2e5377993 100644 --- a/drivers/gpu/drm/vc4/vc4_irq.c +++ b/drivers/gpu/drm/vc4/vc4_irq.c @@ -208,6 +208,9 @@ vc4_irq_postinstall(struct drm_device *dev)  {  	struct vc4_dev *vc4 = to_vc4_dev(dev); +	/* Undo the effects of a previous vc4_irq_uninstall. */ +	enable_irq(dev->irq); +  	/* Enable both the render done and out of memory interrupts. */  	V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS); @@ -225,6 +228,9 @@ vc4_irq_uninstall(struct drm_device *dev)  	/* Clear any pending interrupts we might have left. */  	V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS); +	/* Finish any interrupt handler still in flight. */ +	disable_irq(dev->irq); +  	cancel_work_sync(&vc4->overflow_mem_work);  } diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index 6f35909b8add..2ec41d032e56 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -362,7 +362,8 @@ void  drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,  				   const struct drm_display_mode *mode,  				   enum hdmi_quantization_range rgb_quant_range, -				   bool rgb_quant_range_selectable); +				   bool rgb_quant_range_selectable, +				   bool is_hdmi2_sink);  /**   * drm_eld_mnl - Get ELD monitor name length in bytes.  | 
