aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2012-05-14 16:12:51 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-20 11:52:35 -0400
commit2da8af54059bd8c0d7bdf1f56b39cbec7f9c6f05 (patch)
tree1e5d38013cc33739788576eb27ddde114c5557be /drivers
parented517fbbbd3a01692a667ac18b4a413695513428 (diff)
drm/i915: implement hsw_write_infoframe
Both the control and data registers are completely different now. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Eugeni Dodonov <eugeni.dodonov@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h4
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c53
2 files changed, 52 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index fb76b19e32b2..2d49b9507ed0 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1697,6 +1697,7 @@
1697/* Video Data Island Packet control */ 1697/* Video Data Island Packet control */
1698#define VIDEO_DIP_DATA 0x61178 1698#define VIDEO_DIP_DATA 0x61178
1699#define VIDEO_DIP_CTL 0x61170 1699#define VIDEO_DIP_CTL 0x61170
1700/* Pre HSW: */
1700#define VIDEO_DIP_ENABLE (1 << 31) 1701#define VIDEO_DIP_ENABLE (1 << 31)
1701#define VIDEO_DIP_PORT_B (1 << 29) 1702#define VIDEO_DIP_PORT_B (1 << 29)
1702#define VIDEO_DIP_PORT_C (2 << 29) 1703#define VIDEO_DIP_PORT_C (2 << 29)
@@ -1713,6 +1714,9 @@
1713#define VIDEO_DIP_FREQ_VSYNC (1 << 16) 1714#define VIDEO_DIP_FREQ_VSYNC (1 << 16)
1714#define VIDEO_DIP_FREQ_2VSYNC (2 << 16) 1715#define VIDEO_DIP_FREQ_2VSYNC (2 << 16)
1715#define VIDEO_DIP_FREQ_MASK (3 << 16) 1716#define VIDEO_DIP_FREQ_MASK (3 << 16)
1717/* HSW and later: */
1718#define VIDEO_DIP_ENABLE_AVI_HSW (1 << 12)
1719#define VIDEO_DIP_ENABLE_SPD_HSW (1 << 0)
1716 1720
1717/* Panel power sequencing */ 1721/* Panel power sequencing */
1718#define PP_STATUS 0x61200 1722#define PP_STATUS 0x61200
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index cd5d9a9bdedc..2ead3bf7c21d 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -89,6 +89,32 @@ static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
89 } 89 }
90} 90}
91 91
92static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
93{
94 switch (frame->type) {
95 case DIP_TYPE_AVI:
96 return VIDEO_DIP_ENABLE_AVI_HSW;
97 case DIP_TYPE_SPD:
98 return VIDEO_DIP_ENABLE_SPD_HSW;
99 default:
100 DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
101 return 0;
102 }
103}
104
105static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame, enum pipe pipe)
106{
107 switch (frame->type) {
108 case DIP_TYPE_AVI:
109 return HSW_TVIDEO_DIP_AVI_DATA(pipe);
110 case DIP_TYPE_SPD:
111 return HSW_TVIDEO_DIP_SPD_DATA(pipe);
112 default:
113 DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
114 return 0;
115 }
116}
117
92static void g4x_write_infoframe(struct drm_encoder *encoder, 118static void g4x_write_infoframe(struct drm_encoder *encoder,
93 struct dip_infoframe *frame) 119 struct dip_infoframe *frame)
94{ 120{
@@ -251,13 +277,30 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,
251static void hsw_write_infoframe(struct drm_encoder *encoder, 277static void hsw_write_infoframe(struct drm_encoder *encoder,
252 struct dip_infoframe *frame) 278 struct dip_infoframe *frame)
253{ 279{
254 /* Not implemented yet, so avoid doing anything at all. 280 uint32_t *data = (uint32_t *)frame;
255 * This is the placeholder for Paulo Zanoni's infoframe writing patch 281 struct drm_device *dev = encoder->dev;
256 */ 282 struct drm_i915_private *dev_priv = dev->dev_private;
257 DRM_DEBUG_DRIVER("Attempting to write infoframe on Haswell, this is not implemented yet.\n"); 283 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
284 u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
285 u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->pipe);
286 unsigned int i, len = DIP_HEADER_SIZE + frame->len;
287 u32 val = I915_READ(ctl_reg);
258 288
259 return; 289 if (data_reg == 0)
290 return;
291
292 intel_wait_for_vblank(dev, intel_crtc->pipe);
293
294 val &= ~hsw_infoframe_enable(frame);
295 I915_WRITE(ctl_reg, val);
296
297 for (i = 0; i < len; i += 4) {
298 I915_WRITE(data_reg + i, *data);
299 data++;
300 }
260 301
302 val |= hsw_infoframe_enable(frame);
303 I915_WRITE(ctl_reg, val);
261} 304}
262 305
263static void intel_set_infoframe(struct drm_encoder *encoder, 306static void intel_set_infoframe(struct drm_encoder *encoder,