aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2012-04-13 15:31:41 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-03 05:25:22 -0400
commitc846b6194dbe02d9f4fc8c0471e799babc1c3f47 (patch)
tree4772058300008230c3f4f652c5d3d22f827b6a0a
parent0aa534df05b9f44795e2cac7383d5c68fdd11440 (diff)
drm/i915: make DBLCLK modes work
They require an AVI InfoFrame with a proper Pixel Repetition field. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45729 Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c8
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 3205a774ec4b..d9ffe381c723 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -234,6 +234,8 @@ struct cxsr_latency {
234#define DIP_TYPE_AVI 0x82 234#define DIP_TYPE_AVI 0x82
235#define DIP_VERSION_AVI 0x2 235#define DIP_VERSION_AVI 0x2
236#define DIP_LEN_AVI 13 236#define DIP_LEN_AVI 13
237#define DIP_AVI_PR_1 0
238#define DIP_AVI_PR_2 1
237 239
238#define DIP_TYPE_SPD 0x83 240#define DIP_TYPE_SPD 0x83
239#define DIP_VERSION_SPD 0x1 241#define DIP_VERSION_SPD 0x1
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 7de2d3b85b32..8d2501704182 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -220,7 +220,8 @@ static void intel_set_infoframe(struct drm_encoder *encoder,
220 intel_hdmi->write_infoframe(encoder, frame); 220 intel_hdmi->write_infoframe(encoder, frame);
221} 221}
222 222
223static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder) 223static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
224 struct drm_display_mode *adjusted_mode)
224{ 225{
225 struct dip_infoframe avi_if = { 226 struct dip_infoframe avi_if = {
226 .type = DIP_TYPE_AVI, 227 .type = DIP_TYPE_AVI,
@@ -228,6 +229,9 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
228 .len = DIP_LEN_AVI, 229 .len = DIP_LEN_AVI,
229 }; 230 };
230 231
232 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
233 avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
234
231 intel_set_infoframe(encoder, &avi_if); 235 intel_set_infoframe(encoder, &avi_if);
232} 236}
233 237
@@ -290,7 +294,7 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder,
290 I915_WRITE(intel_hdmi->sdvox_reg, sdvox); 294 I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
291 POSTING_READ(intel_hdmi->sdvox_reg); 295 POSTING_READ(intel_hdmi->sdvox_reg);
292 296
293 intel_hdmi_set_avi_infoframe(encoder); 297 intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
294 intel_hdmi_set_spd_infoframe(encoder); 298 intel_hdmi_set_spd_infoframe(encoder);
295} 299}
296 300