diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2011-12-23 14:32:18 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-01-03 04:40:10 -0500 |
commit | 92db7f6c860b8190571a9dc1fcbc16d003422fe8 (patch) | |
tree | 8576bf61619850ba81eee0e0b1d020e7836c6ca5 /drivers/gpu/drm/radeon/r600_hdmi.c | |
parent | f83d926aca3f1c087f43979edad1e3789498840d (diff) |
drm/radeon/kms: workaround invalid AVI infoframe checksum issue
This change was verified to fix both issues with no video I've
investigated. I've also checked checksum calculation with fglrx on:
RV620, HD54xx, HD5450, HD6310, HD6320.
Cc: stable@vger.kernel.org
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_hdmi.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 5c805f7fea39..2c70a85e72c6 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -196,6 +196,13 @@ static void r600_hdmi_videoinfoframe( | |||
196 | frame[0xD] = (right_bar >> 8); | 196 | frame[0xD] = (right_bar >> 8); |
197 | 197 | ||
198 | r600_hdmi_infoframe_checksum(0x82, 0x02, 0x0D, frame); | 198 | r600_hdmi_infoframe_checksum(0x82, 0x02, 0x0D, frame); |
199 | /* Our header values (type, version, length) should be alright, Intel | ||
200 | * is using the same. Checksum function also seems to be OK, it works | ||
201 | * fine for audio infoframe. However calculated value is always lower | ||
202 | * by 2 in comparison to fglrx. It breaks displaying anything in case | ||
203 | * of TVs that strictly check the checksum. Hack it manually here to | ||
204 | * workaround this issue. */ | ||
205 | frame[0x0] += 2; | ||
199 | 206 | ||
200 | WREG32(offset+R600_HDMI_VIDEOINFOFRAME_0, | 207 | WREG32(offset+R600_HDMI_VIDEOINFOFRAME_0, |
201 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); | 208 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); |