aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2013-04-18 09:23:12 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-04-22 10:39:12 -0400
commitd3418eacad403033e95e49dc14afa37c2112c134 (patch)
tree58781b82934fbbe63a1ed262c47abebdd08c54dd
parentd5169fc4ccfecbfdf3b882be0d2cdf8b057b2eae (diff)
drm/radeon/evergreen: setup HDMI before enabling it
Closed source driver fglrx seems to enable infoframes and audio packets at the end, which makes sense, do the same. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c15
-rw-r--r--drivers/gpu/drm/radeon/evergreend.h1
2 files changed, 12 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 4fdecc2b4040..0879355815d9 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -116,7 +116,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
116 HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ 116 HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */
117 117
118 WREG32(AFMT_AUDIO_PACKET_CONTROL + offset, 118 WREG32(AFMT_AUDIO_PACKET_CONTROL + offset,
119 AFMT_AUDIO_SAMPLE_SEND | /* send audio packets */
120 AFMT_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ 119 AFMT_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */
121 120
122 WREG32(HDMI_ACR_PACKET_CONTROL + offset, 121 WREG32(HDMI_ACR_PACKET_CONTROL + offset,
@@ -129,8 +128,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
129 HDMI_GC_CONT); /* send general control packets every frame */ 128 HDMI_GC_CONT); /* send general control packets every frame */
130 129
131 WREG32(HDMI_INFOFRAME_CONTROL0 + offset, 130 WREG32(HDMI_INFOFRAME_CONTROL0 + offset,
132 HDMI_AVI_INFO_SEND | /* enable AVI info frames */
133 HDMI_AVI_INFO_CONT | /* send AVI info frames every frame/field */
134 HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ 131 HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */
135 HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ 132 HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */
136 133
@@ -138,7 +135,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
138 AFMT_AUDIO_INFO_UPDATE); /* required for audio info values to be updated */ 135 AFMT_AUDIO_INFO_UPDATE); /* required for audio info values to be updated */
139 136
140 WREG32(HDMI_INFOFRAME_CONTROL1 + offset, 137 WREG32(HDMI_INFOFRAME_CONTROL1 + offset,
141 HDMI_AVI_INFO_LINE(2) | /* anything other than 0 */
142 HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */ 138 HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */
143 139
144 WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ 140 WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */
@@ -158,6 +154,17 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
158 evergreen_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer)); 154 evergreen_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer));
159 evergreen_hdmi_update_ACR(encoder, mode->clock); 155 evergreen_hdmi_update_ACR(encoder, mode->clock);
160 156
157 WREG32_OR(HDMI_INFOFRAME_CONTROL0 + offset,
158 HDMI_AVI_INFO_SEND | /* enable AVI info frames */
159 HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */
160
161 WREG32_P(HDMI_INFOFRAME_CONTROL1 + offset,
162 HDMI_AVI_INFO_LINE(2), /* anything other than 0 */
163 ~HDMI_AVI_INFO_LINE_MASK);
164
165 WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + offset,
166 AFMT_AUDIO_SAMPLE_SEND); /* send audio packets */
167
161 /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ 168 /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */
162 WREG32(AFMT_RAMP_CONTROL0 + offset, 0x00FFFFFF); 169 WREG32(AFMT_RAMP_CONTROL0 + offset, 0x00FFFFFF);
163 WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); 170 WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF);
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
index eabf92af84e5..d9a005431087 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -234,6 +234,7 @@
234# define HDMI_MPEG_INFO_CONT (1 << 9) 234# define HDMI_MPEG_INFO_CONT (1 << 9)
235#define HDMI_INFOFRAME_CONTROL1 0x7048 235#define HDMI_INFOFRAME_CONTROL1 0x7048
236# define HDMI_AVI_INFO_LINE(x) (((x) & 0x3f) << 0) 236# define HDMI_AVI_INFO_LINE(x) (((x) & 0x3f) << 0)
237# define HDMI_AVI_INFO_LINE_MASK (0x3f << 0)
237# define HDMI_AUDIO_INFO_LINE(x) (((x) & 0x3f) << 8) 238# define HDMI_AUDIO_INFO_LINE(x) (((x) & 0x3f) << 8)
238# define HDMI_MPEG_INFO_LINE(x) (((x) & 0x3f) << 16) 239# define HDMI_MPEG_INFO_LINE(x) (((x) & 0x3f) << 16)
239#define HDMI_GENERIC_PACKET_CONTROL 0x704c 240#define HDMI_GENERIC_PACKET_CONTROL 0x704c