aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2012-04-28 17:35:24 -0400
committerDave Airlie <airlied@redhat.com>2012-05-01 05:58:14 -0400
commitc6543a6e64ad8e456674a1c4a01dd024e38b665f (patch)
treef38a7cc6154a2ed4fb52a567b04cbe33f72b6059
parentaf0b57436d9f601bb697457bba292febabd6e90e (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.c28
-rw-r--r--drivers/gpu/drm/radeon/r600_hdmi.c90
-rw-r--r--drivers/gpu/drm/radeon/r600_reg.h39
-rw-r--r--drivers/gpu/drm/radeon/r600d.h7
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