diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2012-04-28 17:35:24 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-05-01 05:58:14 -0400 |
commit | c6543a6e64ad8e456674a1c4a01dd024e38b665f (patch) | |
tree | f38a7cc6154a2ed4fb52a567b04cbe33f72b6059 | |
parent | af0b57436d9f601bb697457bba292febabd6e90e (diff) |
drm/radeon/kms/hdmi: use relative offsets, official regs
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Tested-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Christian König <deathsimple@vodafone.de>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_hdmi.c | 90 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_reg.h | 39 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 7 |
4 files changed, 66 insertions, 98 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index ba637d95965b..8f84bd67ce7f 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2968,10 +2968,10 @@ static void r600_disable_interrupt_state(struct radeon_device *rdev) | |||
2968 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 2968 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
2969 | tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY; | 2969 | tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY; |
2970 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 2970 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
2971 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET0) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; | 2971 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; |
2972 | WREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET0, tmp); | 2972 | WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, tmp); |
2973 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET1) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; | 2973 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; |
2974 | WREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET1, tmp); | 2974 | WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, tmp); |
2975 | } else { | 2975 | } else { |
2976 | tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; | 2976 | tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; |
2977 | WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp); | 2977 | WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp); |
@@ -3110,8 +3110,8 @@ int r600_irq_set(struct radeon_device *rdev) | |||
3110 | if (ASIC_IS_DCE32(rdev)) { | 3110 | if (ASIC_IS_DCE32(rdev)) { |
3111 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; | 3111 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; |
3112 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; | 3112 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; |
3113 | hdmi0 = RREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET0) & ~AFMT_AZ_FORMAT_WTRIG_MASK; | 3113 | hdmi0 = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
3114 | hdmi1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET1) & ~AFMT_AZ_FORMAT_WTRIG_MASK; | 3114 | hdmi1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1) & ~AFMT_AZ_FORMAT_WTRIG_MASK; |
3115 | } else { | 3115 | } else { |
3116 | hdmi0 = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; | 3116 | hdmi0 = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; |
3117 | hdmi1 = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; | 3117 | hdmi1 = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK; |
@@ -3189,8 +3189,8 @@ int r600_irq_set(struct radeon_device *rdev) | |||
3189 | if (ASIC_IS_DCE32(rdev)) { | 3189 | if (ASIC_IS_DCE32(rdev)) { |
3190 | WREG32(DC_HPD5_INT_CONTROL, hpd5); | 3190 | WREG32(DC_HPD5_INT_CONTROL, hpd5); |
3191 | WREG32(DC_HPD6_INT_CONTROL, hpd6); | 3191 | WREG32(DC_HPD6_INT_CONTROL, hpd6); |
3192 | WREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET0, hdmi0); | 3192 | WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, hdmi0); |
3193 | WREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET1, hdmi1); | 3193 | WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, hdmi1); |
3194 | } else { | 3194 | } else { |
3195 | WREG32(HDMI0_AUDIO_PACKET_CONTROL, hdmi0); | 3195 | WREG32(HDMI0_AUDIO_PACKET_CONTROL, hdmi0); |
3196 | WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, hdmi1); | 3196 | WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, hdmi1); |
@@ -3215,8 +3215,8 @@ static void r600_irq_ack(struct radeon_device *rdev) | |||
3215 | rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE); | 3215 | rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE); |
3216 | rdev->irq.stat_regs.r600.disp_int_cont2 = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE2); | 3216 | rdev->irq.stat_regs.r600.disp_int_cont2 = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE2); |
3217 | if (ASIC_IS_DCE32(rdev)) { | 3217 | if (ASIC_IS_DCE32(rdev)) { |
3218 | rdev->irq.stat_regs.r600.hdmi0_status = RREG32(AFMT_STATUS + HDMI_OFFSET0); | 3218 | rdev->irq.stat_regs.r600.hdmi0_status = RREG32(AFMT_STATUS + DCE3_HDMI_OFFSET0); |
3219 | rdev->irq.stat_regs.r600.hdmi1_status = RREG32(AFMT_STATUS + HDMI_OFFSET1); | 3219 | rdev->irq.stat_regs.r600.hdmi1_status = RREG32(AFMT_STATUS + DCE3_HDMI_OFFSET1); |
3220 | } else { | 3220 | } else { |
3221 | rdev->irq.stat_regs.r600.hdmi0_status = RREG32(HDMI0_STATUS); | 3221 | rdev->irq.stat_regs.r600.hdmi0_status = RREG32(HDMI0_STATUS); |
3222 | rdev->irq.stat_regs.r600.hdmi1_status = RREG32(DCE3_HDMI1_STATUS); | 3222 | rdev->irq.stat_regs.r600.hdmi1_status = RREG32(DCE3_HDMI1_STATUS); |
@@ -3293,14 +3293,14 @@ static void r600_irq_ack(struct radeon_device *rdev) | |||
3293 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 3293 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
3294 | } | 3294 | } |
3295 | if (rdev->irq.stat_regs.r600.hdmi0_status & AFMT_AZ_FORMAT_WTRIG) { | 3295 | if (rdev->irq.stat_regs.r600.hdmi0_status & AFMT_AZ_FORMAT_WTRIG) { |
3296 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET0); | 3296 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0); |
3297 | tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; | 3297 | tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; |
3298 | WREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET0, tmp); | 3298 | WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, tmp); |
3299 | } | 3299 | } |
3300 | if (rdev->irq.stat_regs.r600.hdmi1_status & AFMT_AZ_FORMAT_WTRIG) { | 3300 | if (rdev->irq.stat_regs.r600.hdmi1_status & AFMT_AZ_FORMAT_WTRIG) { |
3301 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET1); | 3301 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1); |
3302 | tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; | 3302 | tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; |
3303 | WREG32(AFMT_AUDIO_PACKET_CONTROL + HDMI_OFFSET1, tmp); | 3303 | WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, tmp); |
3304 | } | 3304 | } |
3305 | } else { | 3305 | } else { |
3306 | if (rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG) { | 3306 | if (rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG) { |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index ba3b65ce9c30..c6de0022c070 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include "radeon_drm.h" | 27 | #include "radeon_drm.h" |
28 | #include "radeon.h" | 28 | #include "radeon.h" |
29 | #include "radeon_asic.h" | 29 | #include "radeon_asic.h" |
30 | #include "r600d.h" | ||
30 | #include "atom.h" | 31 | #include "atom.h" |
31 | 32 | ||
32 | /* | 33 | /* |
@@ -108,20 +109,20 @@ static void r600_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t clock) | |||
108 | CTS = r600_hdmi_ACR[i].CTS_32kHz; | 109 | CTS = r600_hdmi_ACR[i].CTS_32kHz; |
109 | N = r600_hdmi_ACR[i].N_32kHz; | 110 | N = r600_hdmi_ACR[i].N_32kHz; |
110 | r600_hdmi_calc_CTS(clock, &CTS, N, 32000); | 111 | r600_hdmi_calc_CTS(clock, &CTS, N, 32000); |
111 | WREG32(offset+R600_HDMI_32kHz_CTS, CTS << 12); | 112 | WREG32(HDMI0_ACR_32_0 + offset, HDMI0_ACR_CTS_32(CTS)); |
112 | WREG32(offset+R600_HDMI_32kHz_N, N); | 113 | WREG32(HDMI0_ACR_32_1 + offset, N); |
113 | 114 | ||
114 | CTS = r600_hdmi_ACR[i].CTS_44_1kHz; | 115 | CTS = r600_hdmi_ACR[i].CTS_44_1kHz; |
115 | N = r600_hdmi_ACR[i].N_44_1kHz; | 116 | N = r600_hdmi_ACR[i].N_44_1kHz; |
116 | r600_hdmi_calc_CTS(clock, &CTS, N, 44100); | 117 | r600_hdmi_calc_CTS(clock, &CTS, N, 44100); |
117 | WREG32(offset+R600_HDMI_44_1kHz_CTS, CTS << 12); | 118 | WREG32(HDMI0_ACR_44_0 + offset, HDMI0_ACR_CTS_44(CTS)); |
118 | WREG32(offset+R600_HDMI_44_1kHz_N, N); | 119 | WREG32(HDMI0_ACR_44_1 + offset, N); |
119 | 120 | ||
120 | CTS = r600_hdmi_ACR[i].CTS_48kHz; | 121 | CTS = r600_hdmi_ACR[i].CTS_48kHz; |
121 | N = r600_hdmi_ACR[i].N_48kHz; | 122 | N = r600_hdmi_ACR[i].N_48kHz; |
122 | r600_hdmi_calc_CTS(clock, &CTS, N, 48000); | 123 | r600_hdmi_calc_CTS(clock, &CTS, N, 48000); |
123 | WREG32(offset+R600_HDMI_48kHz_CTS, CTS << 12); | 124 | WREG32(HDMI0_ACR_48_0 + offset, HDMI0_ACR_CTS_48(CTS)); |
124 | WREG32(offset+R600_HDMI_48kHz_N, N); | 125 | WREG32(HDMI0_ACR_48_1 + offset, N); |
125 | } | 126 | } |
126 | 127 | ||
127 | /* | 128 | /* |
@@ -204,13 +205,13 @@ static void r600_hdmi_videoinfoframe( | |||
204 | * workaround this issue. */ | 205 | * workaround this issue. */ |
205 | frame[0x0] += 2; | 206 | frame[0x0] += 2; |
206 | 207 | ||
207 | WREG32(offset+R600_HDMI_VIDEOINFOFRAME_0, | 208 | WREG32(HDMI0_AVI_INFO0 + offset, |
208 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); | 209 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); |
209 | WREG32(offset+R600_HDMI_VIDEOINFOFRAME_1, | 210 | WREG32(HDMI0_AVI_INFO1 + offset, |
210 | frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24)); | 211 | frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24)); |
211 | WREG32(offset+R600_HDMI_VIDEOINFOFRAME_2, | 212 | WREG32(HDMI0_AVI_INFO2 + offset, |
212 | frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24)); | 213 | frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24)); |
213 | WREG32(offset+R600_HDMI_VIDEOINFOFRAME_3, | 214 | WREG32(HDMI0_AVI_INFO3 + offset, |
214 | frame[0xC] | (frame[0xD] << 8)); | 215 | frame[0xC] | (frame[0xD] << 8)); |
215 | } | 216 | } |
216 | 217 | ||
@@ -249,9 +250,9 @@ static void r600_hdmi_audioinfoframe( | |||
249 | 250 | ||
250 | r600_hdmi_infoframe_checksum(0x84, 0x01, 0x0A, frame); | 251 | r600_hdmi_infoframe_checksum(0x84, 0x01, 0x0A, frame); |
251 | 252 | ||
252 | WREG32(offset+R600_HDMI_AUDIOINFOFRAME_0, | 253 | WREG32(HDMI0_AUDIO_INFO0 + offset, |
253 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); | 254 | frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); |
254 | WREG32(offset+R600_HDMI_AUDIOINFOFRAME_1, | 255 | WREG32(HDMI0_AUDIO_INFO1 + offset, |
255 | frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x8] << 24)); | 256 | frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x8] << 24)); |
256 | } | 257 | } |
257 | 258 | ||
@@ -264,7 +265,7 @@ static int r600_hdmi_is_audio_buffer_filled(struct drm_encoder *encoder) | |||
264 | struct radeon_device *rdev = dev->dev_private; | 265 | struct radeon_device *rdev = dev->dev_private; |
265 | uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; | 266 | uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset; |
266 | 267 | ||
267 | return (RREG32(offset+R600_HDMI_STATUS) & 0x10) != 0; | 268 | return (RREG32(HDMI0_STATUS + offset) & 0x10) != 0; |
268 | } | 269 | } |
269 | 270 | ||
270 | /* | 271 | /* |
@@ -302,11 +303,11 @@ void r600_hdmi_audio_workaround(struct drm_encoder *encoder) | |||
302 | r600_hdmi_is_audio_buffer_filled(encoder)) { | 303 | r600_hdmi_is_audio_buffer_filled(encoder)) { |
303 | 304 | ||
304 | /* disable audio workaround */ | 305 | /* disable audio workaround */ |
305 | WREG32_P(offset+R600_HDMI_CNTL, 0x00000001, ~0x00001001); | 306 | WREG32_P(HDMI0_AUDIO_PACKET_CONTROL + offset, 0x0001, ~0x1001); |
306 | 307 | ||
307 | } else { | 308 | } else { |
308 | /* enable audio workaround */ | 309 | /* enable audio workaround */ |
309 | WREG32_P(offset+R600_HDMI_CNTL, 0x00001001, ~0x00001001); | 310 | WREG32_P(HDMI0_AUDIO_PACKET_CONTROL + offset, 0x1001, ~0x1001); |
310 | } | 311 | } |
311 | } | 312 | } |
312 | 313 | ||
@@ -328,29 +329,29 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
328 | 329 | ||
329 | r600_audio_set_clock(encoder, mode->clock); | 330 | r600_audio_set_clock(encoder, mode->clock); |
330 | 331 | ||
331 | WREG32(offset+R600_HDMI_UNKNOWN_0, 0x1000); | 332 | WREG32(HDMI0_AUDIO_CRC_CONTROL + offset, 0x1000); |
332 | WREG32(offset+R600_HDMI_UNKNOWN_1, 0x0); | 333 | WREG32(HDMI0_GC + offset, 0x0); |
333 | WREG32(offset+R600_HDMI_UNKNOWN_2, 0x1000); | 334 | WREG32(HDMI0_ACR_PACKET_CONTROL + offset, 0x1000); |
334 | 335 | ||
335 | r600_hdmi_update_ACR(encoder, mode->clock); | 336 | r600_hdmi_update_ACR(encoder, mode->clock); |
336 | 337 | ||
337 | WREG32(offset+R600_HDMI_VIDEOCNTL, 0x13); | 338 | WREG32(HDMI0_INFOFRAME_CONTROL0 + offset, 0x13); |
338 | 339 | ||
339 | WREG32(offset+R600_HDMI_VERSION, 0x202); | 340 | WREG32(HDMI0_INFOFRAME_CONTROL1 + offset, 0x202); |
340 | 341 | ||
341 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, | 342 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, |
342 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | 343 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); |
343 | 344 | ||
344 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ | 345 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |
345 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); | 346 | WREG32(HDMI0_RAMP_CONTROL0 + offset, 0x00FFFFFF); |
346 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); | 347 | WREG32(HDMI0_RAMP_CONTROL1 + offset, 0x007FFFFF); |
347 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); | 348 | WREG32(HDMI0_RAMP_CONTROL2 + offset, 0x00000001); |
348 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_3, 0x00000001); | 349 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); |
349 | 350 | ||
350 | r600_hdmi_audio_workaround(encoder); | 351 | r600_hdmi_audio_workaround(encoder); |
351 | 352 | ||
352 | /* audio packets per line, does anyone know how to calc this ? */ | 353 | /* audio packets per line, does anyone know how to calc this ? */ |
353 | WREG32_P(offset+R600_HDMI_CNTL, 0x00040000, ~0x001F0000); | 354 | WREG32_P(HDMI0_AUDIO_PACKET_CONTROL + offset, 0x00040000, ~0x001F0000); |
354 | } | 355 | } |
355 | 356 | ||
356 | /* | 357 | /* |
@@ -401,7 +402,7 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder) | |||
401 | case 192000: iec |= 0xe << 24; break; | 402 | case 192000: iec |= 0xe << 24; break; |
402 | } | 403 | } |
403 | 404 | ||
404 | WREG32(offset+R600_HDMI_IEC60958_1, iec); | 405 | WREG32(HDMI0_60958_0 + offset, iec); |
405 | 406 | ||
406 | iec = 0; | 407 | iec = 0; |
407 | switch (bps) { | 408 | switch (bps) { |
@@ -412,10 +413,10 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder) | |||
412 | if (status_bits & AUDIO_STATUS_V) | 413 | if (status_bits & AUDIO_STATUS_V) |
413 | iec |= 0x5 << 16; | 414 | iec |= 0x5 << 16; |
414 | 415 | ||
415 | WREG32_P(offset+R600_HDMI_IEC60958_2, iec, ~0x5000f); | 416 | WREG32_P(HDMI0_60958_1 + offset, iec, ~0x5000f); |
416 | 417 | ||
417 | /* 0x021 or 0x031 sets the audio frame length */ | 418 | /* 0x021 or 0x031 sets the audio frame length */ |
418 | WREG32(offset+R600_HDMI_AUDIOCNTL, 0x31); | 419 | WREG32(HDMI0_VBI_PACKET_CONTROL + offset, 0x31); |
419 | r600_hdmi_audioinfoframe(encoder, channels-1, 0, 0, 0, 0, 0, 0, 0); | 420 | r600_hdmi_audioinfoframe(encoder, channels-1, 0, 0, 0, 0, 0, 0, 0); |
420 | 421 | ||
421 | r600_hdmi_audio_workaround(encoder); | 422 | r600_hdmi_audio_workaround(encoder); |
@@ -449,19 +450,22 @@ static void r600_hdmi_assign_block(struct drm_encoder *encoder) | |||
449 | dev_err(rdev->dev, "Enabling HDMI on unknown dig\n"); | 450 | dev_err(rdev->dev, "Enabling HDMI on unknown dig\n"); |
450 | return; | 451 | return; |
451 | } | 452 | } |
452 | radeon_encoder->hdmi_offset = EVERGREEN_HDMI_BASE + | 453 | radeon_encoder->hdmi_offset = eg_offsets[dig->dig_encoder]; |
453 | eg_offsets[dig->dig_encoder]; | 454 | /* Temp hack for Evergreen until we split r600_hdmi.c |
455 | * Evergreen first block is 0x7030 instead of 0x7400. | ||
456 | */ | ||
457 | radeon_encoder->hdmi_offset -= 0x3d0; | ||
454 | } else if (ASIC_IS_DCE3(rdev)) { | 458 | } else if (ASIC_IS_DCE3(rdev)) { |
455 | radeon_encoder->hdmi_offset = dig->dig_encoder ? | 459 | radeon_encoder->hdmi_offset = dig->dig_encoder ? |
456 | R600_HDMI_BLOCK3 : R600_HDMI_BLOCK1; | 460 | DCE3_HDMI_OFFSET1 : DCE3_HDMI_OFFSET0; |
457 | } else if (rdev->family >= CHIP_R600) { | 461 | } else if (rdev->family >= CHIP_R600) { |
458 | /* 2 routable blocks, but using dig_encoder should be fine */ | 462 | /* 2 routable blocks, but using dig_encoder should be fine */ |
459 | radeon_encoder->hdmi_offset = dig->dig_encoder ? | 463 | radeon_encoder->hdmi_offset = dig->dig_encoder ? |
460 | R600_HDMI_BLOCK2 : R600_HDMI_BLOCK1; | 464 | DCE2_HDMI_OFFSET1 : DCE2_HDMI_OFFSET0; |
461 | } else if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690 || | 465 | } else if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690 || |
462 | rdev->family == CHIP_RS740) { | 466 | rdev->family == CHIP_RS740) { |
463 | /* Only 1 routable block */ | 467 | /* Only 1 routable block */ |
464 | radeon_encoder->hdmi_offset = R600_HDMI_BLOCK1; | 468 | radeon_encoder->hdmi_offset = DCE2_HDMI_OFFSET0; |
465 | } | 469 | } |
466 | radeon_encoder->hdmi_enabled = true; | 470 | radeon_encoder->hdmi_enabled = true; |
467 | } | 471 | } |
@@ -492,9 +496,9 @@ void r600_hdmi_enable(struct drm_encoder *encoder) | |||
492 | if (ASIC_IS_DCE5(rdev)) { | 496 | if (ASIC_IS_DCE5(rdev)) { |
493 | /* TODO */ | 497 | /* TODO */ |
494 | } else if (ASIC_IS_DCE4(rdev)) { | 498 | } else if (ASIC_IS_DCE4(rdev)) { |
495 | WREG32_P(radeon_encoder->hdmi_offset + EVERGREEN_AUDIO_PACKET_CNTL, 0x1, ~0x1); | 499 | WREG32_P(0x74fc + radeon_encoder->hdmi_offset, 0x1, ~0x1); |
496 | } else if (ASIC_IS_DCE32(rdev)) { | 500 | } else if (ASIC_IS_DCE32(rdev)) { |
497 | WREG32_P(radeon_encoder->hdmi_offset + R600_HDMI_AUDIO_PACKET_CNTL, 0x1, ~0x1); | 501 | WREG32_P(AFMT_AUDIO_PACKET_CONTROL + radeon_encoder->hdmi_offset, 0x1, ~0x1); |
498 | } else if (ASIC_IS_DCE3(rdev)) { | 502 | } else if (ASIC_IS_DCE3(rdev)) { |
499 | /* TODO */ | 503 | /* TODO */ |
500 | } else if (rdev->family >= CHIP_R600) { | 504 | } else if (rdev->family >= CHIP_R600) { |
@@ -502,12 +506,12 @@ void r600_hdmi_enable(struct drm_encoder *encoder) | |||
502 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | 506 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: |
503 | WREG32_P(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN, | 507 | WREG32_P(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN, |
504 | ~AVIVO_TMDSA_CNTL_HDMI_EN); | 508 | ~AVIVO_TMDSA_CNTL_HDMI_EN); |
505 | WREG32(offset + R600_HDMI_ENABLE, 0x101); | 509 | WREG32(HDMI0_CONTROL + offset, 0x101); |
506 | break; | 510 | break; |
507 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | 511 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: |
508 | WREG32_P(AVIVO_LVTMA_CNTL, AVIVO_LVTMA_CNTL_HDMI_EN, | 512 | WREG32_P(AVIVO_LVTMA_CNTL, AVIVO_LVTMA_CNTL_HDMI_EN, |
509 | ~AVIVO_LVTMA_CNTL_HDMI_EN); | 513 | ~AVIVO_LVTMA_CNTL_HDMI_EN); |
510 | WREG32(offset + R600_HDMI_ENABLE, 0x105); | 514 | WREG32(HDMI0_CONTROL + offset, 0x105); |
511 | break; | 515 | break; |
512 | default: | 516 | default: |
513 | dev_err(rdev->dev, "Unknown HDMI output type\n"); | 517 | dev_err(rdev->dev, "Unknown HDMI output type\n"); |
@@ -517,7 +521,7 @@ void r600_hdmi_enable(struct drm_encoder *encoder) | |||
517 | 521 | ||
518 | if (rdev->irq.installed) { | 522 | if (rdev->irq.installed) { |
519 | /* if irq is available use it */ | 523 | /* if irq is available use it */ |
520 | rdev->irq.afmt[offset == R600_HDMI_BLOCK1 ? 0 : 1] = true; | 524 | rdev->irq.afmt[offset == 0 ? 0 : 1] = true; |
521 | radeon_irq_set(rdev); | 525 | radeon_irq_set(rdev); |
522 | } | 526 | } |
523 | 527 | ||
@@ -548,27 +552,27 @@ void r600_hdmi_disable(struct drm_encoder *encoder) | |||
548 | offset, radeon_encoder->encoder_id); | 552 | offset, radeon_encoder->encoder_id); |
549 | 553 | ||
550 | /* disable irq */ | 554 | /* disable irq */ |
551 | rdev->irq.afmt[offset == R600_HDMI_BLOCK1 ? 0 : 1] = false; | 555 | rdev->irq.afmt[offset == 0 ? 0 : 1] = false; |
552 | radeon_irq_set(rdev); | 556 | radeon_irq_set(rdev); |
553 | 557 | ||
554 | 558 | ||
555 | if (ASIC_IS_DCE5(rdev)) { | 559 | if (ASIC_IS_DCE5(rdev)) { |
556 | /* TODO */ | 560 | /* TODO */ |
557 | } else if (ASIC_IS_DCE4(rdev)) { | 561 | } else if (ASIC_IS_DCE4(rdev)) { |
558 | WREG32_P(radeon_encoder->hdmi_offset + EVERGREEN_AUDIO_PACKET_CNTL, 0, ~0x1); | 562 | WREG32_P(0x74fc + radeon_encoder->hdmi_offset, 0, ~0x1); |
559 | } else if (ASIC_IS_DCE32(rdev)) { | 563 | } else if (ASIC_IS_DCE32(rdev)) { |
560 | WREG32_P(radeon_encoder->hdmi_offset + R600_HDMI_AUDIO_PACKET_CNTL, 0, ~0x1); | 564 | WREG32_P(AFMT_AUDIO_PACKET_CONTROL + radeon_encoder->hdmi_offset, 0, ~0x1); |
561 | } else if (rdev->family >= CHIP_R600 && !ASIC_IS_DCE3(rdev)) { | 565 | } else if (rdev->family >= CHIP_R600 && !ASIC_IS_DCE3(rdev)) { |
562 | switch (radeon_encoder->encoder_id) { | 566 | switch (radeon_encoder->encoder_id) { |
563 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | 567 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: |
564 | WREG32_P(AVIVO_TMDSA_CNTL, 0, | 568 | WREG32_P(AVIVO_TMDSA_CNTL, 0, |
565 | ~AVIVO_TMDSA_CNTL_HDMI_EN); | 569 | ~AVIVO_TMDSA_CNTL_HDMI_EN); |
566 | WREG32(offset + R600_HDMI_ENABLE, 0); | 570 | WREG32(HDMI0_CONTROL + offset, 0); |
567 | break; | 571 | break; |
568 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | 572 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: |
569 | WREG32_P(AVIVO_LVTMA_CNTL, 0, | 573 | WREG32_P(AVIVO_LVTMA_CNTL, 0, |
570 | ~AVIVO_LVTMA_CNTL_HDMI_EN); | 574 | ~AVIVO_LVTMA_CNTL_HDMI_EN); |
571 | WREG32(offset + R600_HDMI_ENABLE, 0); | 575 | WREG32(HDMI0_CONTROL + offset, 0); |
572 | break; | 576 | break; |
573 | default: | 577 | default: |
574 | dev_err(rdev->dev, "Unknown HDMI output type\n"); | 578 | dev_err(rdev->dev, "Unknown HDMI output type\n"); |
diff --git a/drivers/gpu/drm/radeon/r600_reg.h b/drivers/gpu/drm/radeon/r600_reg.h index 24c94123d7ce..c44304ad8bda 100644 --- a/drivers/gpu/drm/radeon/r600_reg.h +++ b/drivers/gpu/drm/radeon/r600_reg.h | |||
@@ -156,43 +156,4 @@ | |||
156 | #define R600_AUDIO_PIN_WIDGET_CNTL 0x73d4 | 156 | #define R600_AUDIO_PIN_WIDGET_CNTL 0x73d4 |
157 | #define R600_AUDIO_STATUS_BITS 0x73d8 | 157 | #define R600_AUDIO_STATUS_BITS 0x73d8 |
158 | 158 | ||
159 | /* HDMI base register addresses */ | ||
160 | #define R600_HDMI_BLOCK1 0x7400 | ||
161 | #define R600_HDMI_BLOCK2 0x7700 | ||
162 | #define R600_HDMI_BLOCK3 0x7800 | ||
163 | |||
164 | /* HDMI registers */ | ||
165 | #define R600_HDMI_ENABLE 0x00 | ||
166 | #define R600_HDMI_STATUS 0x04 | ||
167 | # define R600_HDMI_INT_PENDING (1 << 29) | ||
168 | #define R600_HDMI_CNTL 0x08 | ||
169 | # define R600_HDMI_INT_EN (1 << 28) | ||
170 | # define R600_HDMI_INT_ACK (1 << 29) | ||
171 | #define R600_HDMI_UNKNOWN_0 0x0C | ||
172 | #define R600_HDMI_AUDIOCNTL 0x10 | ||
173 | #define R600_HDMI_VIDEOCNTL 0x14 | ||
174 | #define R600_HDMI_VERSION 0x18 | ||
175 | #define R600_HDMI_UNKNOWN_1 0x28 | ||
176 | #define R600_HDMI_VIDEOINFOFRAME_0 0x54 | ||
177 | #define R600_HDMI_VIDEOINFOFRAME_1 0x58 | ||
178 | #define R600_HDMI_VIDEOINFOFRAME_2 0x5c | ||
179 | #define R600_HDMI_VIDEOINFOFRAME_3 0x60 | ||
180 | #define R600_HDMI_32kHz_CTS 0xac | ||
181 | #define R600_HDMI_32kHz_N 0xb0 | ||
182 | #define R600_HDMI_44_1kHz_CTS 0xb4 | ||
183 | #define R600_HDMI_44_1kHz_N 0xb8 | ||
184 | #define R600_HDMI_48kHz_CTS 0xbc | ||
185 | #define R600_HDMI_48kHz_N 0xc0 | ||
186 | #define R600_HDMI_AUDIOINFOFRAME_0 0xcc | ||
187 | #define R600_HDMI_AUDIOINFOFRAME_1 0xd0 | ||
188 | #define R600_HDMI_IEC60958_1 0xd4 | ||
189 | #define R600_HDMI_IEC60958_2 0xd8 | ||
190 | #define R600_HDMI_UNKNOWN_2 0xdc | ||
191 | #define R600_HDMI_AUDIO_DEBUG_0 0xe0 | ||
192 | #define R600_HDMI_AUDIO_DEBUG_1 0xe4 | ||
193 | #define R600_HDMI_AUDIO_DEBUG_2 0xe8 | ||
194 | #define R600_HDMI_AUDIO_DEBUG_3 0xec | ||
195 | #define R600_HDMI_AUDIO_PACKET_CNTL 0x204 | ||
196 | #define EVERGREEN_AUDIO_PACKET_CNTL 0xfc | ||
197 | |||
198 | #endif | 159 | #endif |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 426e5a7de778..a9652be93b66 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -1056,9 +1056,12 @@ | |||
1056 | # define AFMT_AZ_FORMAT_WTRIG_MASK (1 << 28) | 1056 | # define AFMT_AZ_FORMAT_WTRIG_MASK (1 << 28) |
1057 | # define AFMT_AZ_FORMAT_WTRIG_ACK (1 << 29) | 1057 | # define AFMT_AZ_FORMAT_WTRIG_ACK (1 << 29) |
1058 | # define AFMT_AZ_AUDIO_ENABLE_CHG_ACK (1 << 30) | 1058 | # define AFMT_AZ_AUDIO_ENABLE_CHG_ACK (1 << 30) |
1059 | |||
1060 | #define DCE2_HDMI_OFFSET0 (0x7400 - 0x7400) | ||
1061 | #define DCE2_HDMI_OFFSET1 (0x7700 - 0x7400) | ||
1059 | /* DCE3.2 second instance starts at 0x7800 */ | 1062 | /* DCE3.2 second instance starts at 0x7800 */ |
1060 | #define HDMI_OFFSET0 (0x7400 - 0x7400) | 1063 | #define DCE3_HDMI_OFFSET0 (0x7400 - 0x7400) |
1061 | #define HDMI_OFFSET1 (0x7800 - 0x7400) | 1064 | #define DCE3_HDMI_OFFSET1 (0x7800 - 0x7400) |
1062 | 1065 | ||
1063 | /* | 1066 | /* |
1064 | * PM4 | 1067 | * PM4 |