aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen_hdmi.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-06-07 10:41:03 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-07-25 17:07:41 -0400
commit9f7fbcd61507b130afb4ec6418ce8513295d4df4 (patch)
tree69425328f3c9b3fb6bf83040a4ba20a97cc00cd7 /drivers/gpu/drm/radeon/evergreen_hdmi.c
parentef0cfe2f8ee92be33f891c238d310abfaca7e0e3 (diff)
drm/radeon: fix AVI infoframe generation
commit f100380ecd8287b0909d3c5694784adc46e78a4a upstream. - remove adding 2 to checksum, this is incorrect. This was incorrectly introduced in: 92db7f6c860b8190571a9dc1fcbc16d003422fe8 http://lists.freedesktop.org/archives/dri-devel/2011-December/017717.html However, the off by 2 was due to adding the version twice. From the examples in the URL above: [Rafał Miłecki][RV620] fglrx: 0x7454: 00 A8 5E 79 R600_HDMI_VIDEOINFOFRAME_0 0x7458: 00 28 00 10 R600_HDMI_VIDEOINFOFRAME_1 0x745C: 00 48 00 28 R600_HDMI_VIDEOINFOFRAME_2 0x7460: 02 00 00 48 R600_HDMI_VIDEOINFOFRAME_3 =================== (0x82 + 0x2 + 0xD) + 0x1F8 = 0x289 -0x289 = 0x77 However, the payload sum is not 0x1f8, it's 0x1f6. 00 + A8 + 5E + 00 + 00 + 28 + 00 + 10 + 00 + 48 + 00 + 28 + 00 + 48 = 0x1f6 Bits 25:24 of HDMI_VIDEOINFOFRAME_3 are the packet version, not part of the payload. So the total would be: (0x82 + 0x2 + 0xD) + 0x1f6 = 0x287 -0x287 = 0x79 - properly emit the AVI infoframe version. This was not being emitted previous which is probably what caused the issue above. This should fix blank screen when HDMI audio is enabled on certain monitors. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen_hdmi.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c11
1 files changed, 2 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index ed7c8a768092..b9c6f7675e59 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -128,14 +128,7 @@ static void evergreen_hdmi_update_avi_infoframe(struct drm_encoder *encoder,
128 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 128 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
129 uint32_t offset = dig->afmt->offset; 129 uint32_t offset = dig->afmt->offset;
130 uint8_t *frame = buffer + 3; 130 uint8_t *frame = buffer + 3;
131 131 uint8_t *header = buffer;
132 /* Our header values (type, version, length) should be alright, Intel
133 * is using the same. Checksum function also seems to be OK, it works
134 * fine for audio infoframe. However calculated value is always lower
135 * by 2 in comparison to fglrx. It breaks displaying anything in case
136 * of TVs that strictly check the checksum. Hack it manually here to
137 * workaround this issue. */
138 frame[0x0] += 2;
139 132
140 WREG32(AFMT_AVI_INFO0 + offset, 133 WREG32(AFMT_AVI_INFO0 + offset,
141 frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); 134 frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24));
@@ -144,7 +137,7 @@ static void evergreen_hdmi_update_avi_infoframe(struct drm_encoder *encoder,
144 WREG32(AFMT_AVI_INFO2 + offset, 137 WREG32(AFMT_AVI_INFO2 + offset,
145 frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24)); 138 frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24));
146 WREG32(AFMT_AVI_INFO3 + offset, 139 WREG32(AFMT_AVI_INFO3 + offset,
147 frame[0xC] | (frame[0xD] << 8)); 140 frame[0xC] | (frame[0xD] << 8) | (header[1] << 24));
148} 141}
149 142
150static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock) 143static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock)