From 12e43568cb3f3b7e337ad84a2b9a229676ed5ab7 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Wed, 9 Nov 2011 10:03:01 +1000 Subject: [PATCH] --- yaml --- r: 282615 b: refs/heads/master c: 50a01fe06e25b271661c6691bc0907ad5ca2c718 h: refs/heads/master i: 282613: 73a236190f2ba2fdd69f07e05898af76461cc9d0 282611: 5bed2def260fef6ee336297d4cdc27ee1cf5599a 282607: fb65e9f2f648e53602e5d4d34b9a1686daed8c85 v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/nouveau/nouveau_hdmi.c | 27 +++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 1f306a874799..d97796c34663 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9e7f96aa3a4b26db4a0ac49a96a9b55f1685e8b2 +refs/heads/master: 50a01fe06e25b271661c6691bc0907ad5ca2c718 diff --git a/trunk/drivers/gpu/drm/nouveau/nouveau_hdmi.c b/trunk/drivers/gpu/drm/nouveau/nouveau_hdmi.c index 3b4120f0626a..59ea1c14eca0 100644 --- a/trunk/drivers/gpu/drm/nouveau/nouveau_hdmi.c +++ b/trunk/drivers/gpu/drm/nouveau/nouveau_hdmi.c @@ -219,6 +219,8 @@ nouveau_hdmi_mode_set(struct drm_encoder *encoder, { struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); struct nouveau_connector *nv_connector; + struct drm_device *dev = encoder->dev; + u32 max_ac_packet, rekey; nv_connector = nouveau_encoder_connector_get(nv_encoder); if (!mode || !nv_connector || !nv_connector->edid || @@ -227,11 +229,30 @@ nouveau_hdmi_mode_set(struct drm_encoder *encoder, return; } - /* enable hdmi */ - hdmi_mask(encoder, 0x0a4, 0x40000000, 0x40000000); - nouveau_hdmi_video_infoframe(encoder, mode); nouveau_hdmi_audio_infoframe(encoder, mode); + hdmi_mask(encoder, 0x0d0, 0x00070001, 0x00010001); /* SPARE, HW_CTS */ + hdmi_mask(encoder, 0x068, 0x00010101, 0x00000000); /* ACR_CTRL, ?? */ + hdmi_mask(encoder, 0x078, 0x80000000, 0x80000000); /* ACR_0441_ENABLE */ + + nv_mask(dev, 0x61733c, 0x00100000, 0x00100000); /* RESETF */ + nv_mask(dev, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ + nv_mask(dev, 0x61733c, 0x00100000, 0x00000000); /* !RESETF */ + + /* value matches nvidia binary driver, and tegra constant */ + rekey = 56; + + max_ac_packet = mode->htotal - mode->hdisplay; + max_ac_packet -= rekey; + max_ac_packet -= 18; /* constant from tegra */ + max_ac_packet /= 32; + + /* enable hdmi */ + hdmi_mask(encoder, 0x0a4, 0x5f1f003f, 0x40000000 | /* enable */ + 0x1f000000 | /* unknown */ + max_ac_packet << 16 | + rekey); + nouveau_audio_mode_set(encoder, mode); }