diff options
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 15 | 
2 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index a828e90602b..7637824c6a7 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -1794,6 +1794,10 @@  /* Video Data Island Packet control */  #define VIDEO_DIP_DATA		0x61178 +/* Read the description of VIDEO_DIP_DATA (before Haswel) or VIDEO_DIP_ECC + * (Haswell and newer) to see which VIDEO_DIP_DATA byte corresponds to each byte + * of the infoframe structure specified by CEA-861. */ +#define   VIDEO_DIP_DATA_SIZE	32  #define VIDEO_DIP_CTL		0x61170  /* Pre HSW: */  #define   VIDEO_DIP_ENABLE		(1 << 31) diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index f9fb47cd177..08f2b63d740 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -151,6 +151,9 @@ static void g4x_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(VIDEO_DIP_DATA, *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(VIDEO_DIP_DATA, 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -186,6 +189,9 @@ static void ibx_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -224,6 +230,9 @@ static void cpt_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -259,6 +268,9 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);  	mmiowb();  	val |= g4x_infoframe_enable(frame); @@ -292,6 +304,9 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,  		I915_WRITE(data_reg + i, *data);  		data++;  	} +	/* Write every possible data byte to force correct ECC calculation. */ +	for (; i < VIDEO_DIP_DATA_SIZE; i += 4) +		I915_WRITE(data_reg + i, 0);  	mmiowb();  	val |= hsw_infoframe_enable(frame);  |