* [PATCH 0/3] Additional radeon audio cleanups
@ 2013-04-18 15:35 alexdeucher
2013-04-18 15:35 ` [PATCH 1/3] drm/radeon: clean up audio supported check alexdeucher
` (3 more replies)
0 siblings, 4 replies; 12+ messages in thread
From: alexdeucher @ 2013-04-18 15:35 UTC (permalink / raw)
To: dri-devel; +Cc: Alex Deucher
From: Alex Deucher <alexander.deucher@amd.com>
This set of patches does some additional audio cleanups
and switches to per asic callbacks for audio.
Alex Deucher (3):
drm/radeon: clean up audio supported check
drm/radeon: clean up audio dto programming
drm/radeon: switch audio handling to use callbacks
drivers/gpu/drm/radeon/atombios_encoders.c | 17 ++--
drivers/gpu/drm/radeon/evergreen_hdmi.c | 43 +++++++++-
drivers/gpu/drm/radeon/r600_audio.c | 64 +-------------
drivers/gpu/drm/radeon/r600_hdmi.c | 135 ++++++++++++---------------
drivers/gpu/drm/radeon/radeon.h | 10 +-
drivers/gpu/drm/radeon/radeon_asic.c | 18 ++++
drivers/gpu/drm/radeon/radeon_asic.h | 5 +-
7 files changed, 138 insertions(+), 154 deletions(-)
--
1.7.7.5
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/3] drm/radeon: clean up audio supported check
2013-04-18 15:35 [PATCH 0/3] Additional radeon audio cleanups alexdeucher
@ 2013-04-18 15:35 ` alexdeucher
2013-04-19 6:13 ` Rafał Miłecki
2013-04-18 15:35 ` [PATCH 2/3] drm/radeon: clean up audio dto programming alexdeucher
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: alexdeucher @ 2013-04-18 15:35 UTC (permalink / raw)
To: dri-devel; +Cc: Alex Deucher
From: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/radeon/r600_audio.c | 5 +----
1 files changed, 1 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c
index cb03fe2..72561e4 100644
--- a/drivers/gpu/drm/radeon/r600_audio.c
+++ b/drivers/gpu/drm/radeon/r600_audio.c
@@ -57,10 +57,7 @@ static bool radeon_dig_encoder(struct drm_encoder *encoder)
*/
static int r600_audio_chipset_supported(struct radeon_device *rdev)
{
- return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE6(rdev))
- || rdev->family == CHIP_RS600
- || rdev->family == CHIP_RS690
- || rdev->family == CHIP_RS740;
+ return ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE6(rdev);
}
struct r600_audio r600_audio_status(struct radeon_device *rdev)
--
1.7.7.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/3] drm/radeon: clean up audio dto programming
2013-04-18 15:35 [PATCH 0/3] Additional radeon audio cleanups alexdeucher
2013-04-18 15:35 ` [PATCH 1/3] drm/radeon: clean up audio supported check alexdeucher
@ 2013-04-18 15:35 ` alexdeucher
2013-04-19 6:10 ` Rafał Miłecki
2013-04-18 15:35 ` [PATCH 3/3] drm/radeon: switch audio handling to use callbacks alexdeucher
2013-04-18 16:34 ` [PATCH 0/3] Additional radeon audio cleanups Christian König
3 siblings, 1 reply; 12+ messages in thread
From: alexdeucher @ 2013-04-18 15:35 UTC (permalink / raw)
To: dri-devel; +Cc: Alex Deucher
From: Alex Deucher <alexander.deucher@amd.com>
Split into DCE2/3 and DCE4/5 variants. Still todo is to
calculate the DTO dividers properly. Add proper formula
to the comments.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/radeon/evergreen_hdmi.c | 26 +++++++++++++-
drivers/gpu/drm/radeon/r600_audio.c | 59 -------------------------------
drivers/gpu/drm/radeon/r600_hdmi.c | 26 +++++++++++++-
drivers/gpu/drm/radeon/radeon_asic.h | 1 -
4 files changed, 50 insertions(+), 62 deletions(-)
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 380933b..9fc22ee 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -85,6 +85,30 @@ static void evergreen_hdmi_update_avi_infoframe(struct drm_encoder *encoder,
frame[0xC] | (frame[0xD] << 8));
}
+static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock)
+{
+ struct drm_device *dev = encoder->dev;
+ struct radeon_device *rdev = dev->dev_private;
+ struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
+ struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
+ u32 base_rate = 48000;
+
+ if (!dig || !dig->afmt)
+ return;
+
+ /* XXX: properly calculate this */
+ /* XXX two dtos; generally use dto0 for hdmi */
+ /* Express [24MHz / target pixel clock] as an exact rational
+ * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
+ * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
+ */
+ WREG32(DCCG_AUDIO_DTO0_PHASE, (base_rate*50) & 0xffffff);
+ WREG32(DCCG_AUDIO_DTO0_MODULE, (clock*100) & 0xffffff);
+ WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id));
+}
+
+
/*
* update the info frames with the data from the current display mode
*/
@@ -104,7 +128,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
return;
offset = dig->afmt->offset;
- r600_audio_set_clock(encoder, mode->clock);
+ evergreen_audio_set_dto(encoder, mode->clock);
WREG32(HDMI_VBI_PACKET_CONTROL + offset,
HDMI_NULL_SEND); /* send null packets when required */
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c
index 72561e4..c92eb86 100644
--- a/drivers/gpu/drm/radeon/r600_audio.c
+++ b/drivers/gpu/drm/radeon/r600_audio.c
@@ -181,65 +181,6 @@ int r600_audio_init(struct radeon_device *rdev)
}
/*
- * atach the audio codec to the clock source of the encoder
- */
-void r600_audio_set_clock(struct drm_encoder *encoder, int clock)
-{
- struct drm_device *dev = encoder->dev;
- struct radeon_device *rdev = dev->dev_private;
- struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
- struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
- struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
- int base_rate = 48000;
-
- switch (radeon_encoder->encoder_id) {
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
- WREG32_P(R600_AUDIO_TIMING, 0, ~0x301);
- break;
- case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
- case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
- case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
- WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
- break;
- default:
- dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
- radeon_encoder->encoder_id);
- return;
- }
-
- if (ASIC_IS_DCE4(rdev)) {
- /* TODO: other PLLs? */
- WREG32(EVERGREEN_AUDIO_PLL1_MUL, base_rate * 10);
- WREG32(EVERGREEN_AUDIO_PLL1_DIV, clock * 10);
- WREG32(EVERGREEN_AUDIO_PLL1_UNK, 0x00000071);
-
- /* Select DTO source */
- WREG32(0x5ac, radeon_crtc->crtc_id);
- } else {
- switch (dig->dig_encoder) {
- case 0:
- WREG32(R600_AUDIO_PLL1_MUL, base_rate * 50);
- WREG32(R600_AUDIO_PLL1_DIV, clock * 100);
- WREG32(R600_AUDIO_CLK_SRCSEL, 0);
- break;
-
- case 1:
- WREG32(R600_AUDIO_PLL2_MUL, base_rate * 50);
- WREG32(R600_AUDIO_PLL2_DIV, clock * 100);
- WREG32(R600_AUDIO_CLK_SRCSEL, 1);
- break;
- default:
- dev_err(rdev->dev,
- "Unsupported DIG on encoder 0x%02X\n",
- radeon_encoder->encoder_id);
- return;
- }
- }
-}
-
-/*
* release the audio timer
* TODO: How to do this correctly on SMP systems?
*/
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
index 95397b2..62721bf 100644
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
@@ -226,6 +226,30 @@ static void r600_hdmi_audio_workaround(struct drm_encoder *encoder)
value, ~HDMI0_AUDIO_TEST_EN);
}
+void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
+{
+ struct drm_device *dev = encoder->dev;
+ struct radeon_device *rdev = dev->dev_private;
+ struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
+ u32 base_rate = 48000;
+
+ if (!dig || !dig->afmt)
+ return;
+
+ /* there are two DTOs selected by DCCG_AUDIO_DTO_SELECT.
+ * doesn't matter which one you use. Just use the first one.
+ */
+ /* XXX: properly calculate this */
+ /* XXX two dtos; generally use dto0 for hdmi */
+ /* Express [24MHz / target pixel clock] as an exact rational
+ * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
+ * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
+ */
+ WREG32(DCCG_AUDIO_DTO0_PHASE, (base_rate*50) & 0xffffff);
+ WREG32(DCCG_AUDIO_DTO0_MODULE, (clock*100) & 0xffffff);
+ WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */
+}
/*
* update the info frames with the data from the current display mode
@@ -246,7 +270,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
return;
offset = dig->afmt->offset;
- r600_audio_set_clock(encoder, mode->clock);
+ r600_audio_set_dto(encoder, mode->clock);
WREG32(HDMI0_VBI_PACKET_CONTROL + offset,
HDMI0_NULL_SEND); /* send null packets when required */
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 2add526..fa8b8bf 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -374,7 +374,6 @@ void r600_disable_interrupts(struct radeon_device *rdev);
void r600_rlc_stop(struct radeon_device *rdev);
/* r600 audio */
int r600_audio_init(struct radeon_device *rdev);
-void r600_audio_set_clock(struct drm_encoder *encoder, int clock);
struct r600_audio r600_audio_status(struct radeon_device *rdev);
void r600_audio_fini(struct radeon_device *rdev);
int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
--
1.7.7.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/3] drm/radeon: switch audio handling to use callbacks
2013-04-18 15:35 [PATCH 0/3] Additional radeon audio cleanups alexdeucher
2013-04-18 15:35 ` [PATCH 1/3] drm/radeon: clean up audio supported check alexdeucher
2013-04-18 15:35 ` [PATCH 2/3] drm/radeon: clean up audio dto programming alexdeucher
@ 2013-04-18 15:35 ` alexdeucher
2013-04-21 19:51 ` Rafał Miłecki
2013-04-18 16:34 ` [PATCH 0/3] Additional radeon audio cleanups Christian König
3 siblings, 1 reply; 12+ messages in thread
From: alexdeucher @ 2013-04-18 15:35 UTC (permalink / raw)
To: dri-devel; +Cc: Alex Deucher
From: Alex Deucher <alexander.deucher@amd.com>
Register audio callbacks for asic where we support
audio. Cleans up the code and makes it easier to
add support for newer asics.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/radeon/atombios_encoders.c | 17 ++---
drivers/gpu/drm/radeon/evergreen_hdmi.c | 17 +++++
drivers/gpu/drm/radeon/r600_hdmi.c | 109 +++++++++-------------------
drivers/gpu/drm/radeon/radeon.h | 10 ++--
drivers/gpu/drm/radeon/radeon_asic.c | 18 +++++
drivers/gpu/drm/radeon/radeon_asic.h | 4 +
6 files changed, 87 insertions(+), 88 deletions(-)
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index 4552d4a..44a7da6 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -2150,13 +2150,10 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
atombios_apply_encoder_quirks(encoder, adjusted_mode);
if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
- r600_hdmi_enable(encoder);
- if (ASIC_IS_DCE6(rdev))
- ; /* TODO (use pointers instead of if-s?) */
- else if (ASIC_IS_DCE4(rdev))
- evergreen_hdmi_setmode(encoder, adjusted_mode);
- else
- r600_hdmi_setmode(encoder, adjusted_mode);
+ if (rdev->asic->display.hdmi_enable)
+ radeon_hdmi_enable(rdev, encoder, true);
+ if (rdev->asic->display.hdmi_setmode)
+ radeon_hdmi_setmode(rdev, encoder, adjusted_mode);
}
}
@@ -2413,8 +2410,10 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
disable_done:
if (radeon_encoder_is_digital(encoder)) {
- if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
- r600_hdmi_disable(encoder);
+ if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
+ if (rdev->asic->display.hdmi_enable)
+ radeon_hdmi_enable(rdev, encoder, false);
+ }
dig = radeon_encoder->enc_priv;
dig->dig_encoder = -1;
}
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 9fc22ee..e32fd2c 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -219,3 +219,20 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
WREG32(AFMT_RAMP_CONTROL2 + offset, 0x00000001);
WREG32(AFMT_RAMP_CONTROL3 + offset, 0x00000001);
}
+
+void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
+{
+ struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
+
+ /* Silent, r600_hdmi_enable will raise WARN for us */
+ if (enable && dig->afmt->enabled)
+ return;
+ if (!enable && !dig->afmt->enabled)
+ return;
+
+ dig->afmt->enabled = enable;
+
+ DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n",
+ enable ? "En" : "Dis", dig->afmt->offset, radeon_encoder->encoder_id);
+}
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
index 62721bf..2e15888 100644
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
@@ -439,112 +439,73 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder)
/*
* enable the HDMI engine
*/
-void r600_hdmi_enable(struct drm_encoder *encoder)
+void r600_hdmi_enable(struct drm_encoder *encoder, bool enable)
{
struct drm_device *dev = encoder->dev;
struct radeon_device *rdev = dev->dev_private;
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
- uint32_t offset;
- u32 hdmi;
-
- if (ASIC_IS_DCE6(rdev))
- return;
+ u32 hdmi = HDMI0_ERROR_ACK;
/* Silent, r600_hdmi_enable will raise WARN for us */
- if (dig->afmt->enabled)
+ if (enable && dig->afmt->enabled)
+ return;
+ if (!enable && !dig->afmt->enabled)
return;
- offset = dig->afmt->offset;
/* Older chipsets require setting HDMI and routing manually */
- if (ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE3(rdev)) {
- hdmi = HDMI0_ERROR_ACK | HDMI0_ENABLE;
+ if (!ASIC_IS_DCE3(rdev)) {
+ if (enable)
+ hdmi |= HDMI0_ENABLE;
switch (radeon_encoder->encoder_id) {
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- WREG32_OR(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN);
- hdmi |= HDMI0_STREAM(HDMI0_STREAM_TMDSA);
+ if (enable) {
+ WREG32_OR(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN);
+ hdmi |= HDMI0_STREAM(HDMI0_STREAM_TMDSA);
+ } else {
+ WREG32_AND(AVIVO_TMDSA_CNTL, ~AVIVO_TMDSA_CNTL_HDMI_EN);
+ }
break;
case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
- WREG32_OR(AVIVO_LVTMA_CNTL, AVIVO_LVTMA_CNTL_HDMI_EN);
- hdmi |= HDMI0_STREAM(HDMI0_STREAM_LVTMA);
+ if (enable) {
+ WREG32_OR(AVIVO_LVTMA_CNTL, AVIVO_LVTMA_CNTL_HDMI_EN);
+ hdmi |= HDMI0_STREAM(HDMI0_STREAM_LVTMA);
+ } else {
+ WREG32_AND(AVIVO_LVTMA_CNTL, ~AVIVO_LVTMA_CNTL_HDMI_EN);
+ }
break;
case ENCODER_OBJECT_ID_INTERNAL_DDI:
- WREG32_OR(DDIA_CNTL, DDIA_HDMI_EN);
- hdmi |= HDMI0_STREAM(HDMI0_STREAM_DDIA);
+ if (enable) {
+ WREG32_OR(DDIA_CNTL, DDIA_HDMI_EN);
+ hdmi |= HDMI0_STREAM(HDMI0_STREAM_DDIA);
+ } else {
+ WREG32_AND(DDIA_CNTL, ~DDIA_HDMI_EN);
+ }
break;
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
- hdmi |= HDMI0_STREAM(HDMI0_STREAM_DVOA);
+ if (enable)
+ hdmi |= HDMI0_STREAM(HDMI0_STREAM_DVOA);
break;
default:
dev_err(rdev->dev, "Invalid encoder for HDMI: 0x%X\n",
radeon_encoder->encoder_id);
break;
}
- WREG32(HDMI0_CONTROL + offset, hdmi);
+ WREG32(HDMI0_CONTROL + dig->afmt->offset, hdmi);
}
if (rdev->irq.installed) {
/* if irq is available use it */
/* XXX: shouldn't need this on any asics. Double check DCE2/3 */
- if (!ASIC_IS_DCE4(rdev))
+ if (enable)
radeon_irq_kms_enable_afmt(rdev, dig->afmt->id);
+ else
+ radeon_irq_kms_disable_afmt(rdev, dig->afmt->id);
}
- dig->afmt->enabled = true;
+ dig->afmt->enabled = enable;
- DRM_DEBUG("Enabling HDMI interface @ 0x%04X for encoder 0x%x\n",
- offset, radeon_encoder->encoder_id);
+ DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n",
+ enable ? "En" : "Dis", dig->afmt->offset, radeon_encoder->encoder_id);
}
-/*
- * disable the HDMI engine
- */
-void r600_hdmi_disable(struct drm_encoder *encoder)
-{
- struct drm_device *dev = encoder->dev;
- struct radeon_device *rdev = dev->dev_private;
- struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
- struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
- uint32_t offset;
-
- if (ASIC_IS_DCE6(rdev))
- return;
-
- /* Called for ATOM_ENCODER_MODE_HDMI only */
- if (!dig || !dig->afmt) {
- return;
- }
- if (!dig->afmt->enabled)
- return;
- offset = dig->afmt->offset;
-
- DRM_DEBUG("Disabling HDMI interface @ 0x%04X for encoder 0x%x\n",
- offset, radeon_encoder->encoder_id);
-
- /* disable irq */
- radeon_irq_kms_disable_afmt(rdev, dig->afmt->id);
-
- /* Older chipsets not handled by AtomBIOS */
- if (ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE3(rdev)) {
- switch (radeon_encoder->encoder_id) {
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
- WREG32_AND(AVIVO_TMDSA_CNTL, ~AVIVO_TMDSA_CNTL_HDMI_EN);
- break;
- case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
- WREG32_AND(AVIVO_LVTMA_CNTL, ~AVIVO_LVTMA_CNTL_HDMI_EN);
- break;
- case ENCODER_OBJECT_ID_INTERNAL_DDI:
- WREG32_AND(DDIA_CNTL, ~DDIA_HDMI_EN);
- break;
- case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
- break;
- default:
- dev_err(rdev->dev, "Invalid encoder for HDMI: 0x%X\n",
- radeon_encoder->encoder_id);
- break;
- }
- WREG32(HDMI0_CONTROL + offset, HDMI0_ERROR_ACK);
- }
-
- dig->afmt->enabled = false;
-}
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 7935370..856a67d 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1270,6 +1270,9 @@ struct radeon_asic {
void (*set_backlight_level)(struct radeon_encoder *radeon_encoder, u8 level);
/* get backlight level */
u8 (*get_backlight_level)(struct radeon_encoder *radeon_encoder);
+ /* audio callbacks */
+ void (*hdmi_enable)(struct drm_encoder *encoder, bool enable);
+ void (*hdmi_setmode)(struct drm_encoder *encoder, struct drm_display_mode *mode);
} display;
/* copy functions for bo handling */
struct {
@@ -1878,6 +1881,8 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc))
#define radeon_set_backlight_level(rdev, e, l) (rdev)->asic->display.set_backlight_level((e), (l))
#define radeon_get_backlight_level(rdev, e) (rdev)->asic->display.get_backlight_level((e))
+#define radeon_hdmi_enable(rdev, e, b) (rdev)->asic->display.hdmi_enable((e), (b))
+#define radeon_hdmi_setmode(rdev, e, m) (rdev)->asic->display.hdmi_setmode((e), (m))
#define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)].emit_fence((rdev), (fence))
#define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)].emit_semaphore((rdev), (cp), (semaphore), (emit_wait))
#define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f))
@@ -2013,9 +2018,6 @@ struct radeon_hdmi_acr {
extern struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock);
-extern void r600_hdmi_enable(struct drm_encoder *encoder);
-extern void r600_hdmi_disable(struct drm_encoder *encoder);
-extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
extern u32 r6xx_remap_render_backend(struct radeon_device *rdev,
u32 tiling_pipe_num,
u32 max_rb_num,
@@ -2026,8 +2028,6 @@ extern u32 r6xx_remap_render_backend(struct radeon_device *rdev,
* evergreen functions used by radeon_encoder.c
*/
-extern void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
-
extern int ni_init_microcode(struct radeon_device *rdev);
extern int ni_mc_load_microcode(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index 48d0200..6417132 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -656,6 +656,8 @@ static struct radeon_asic rs600_asic = {
.wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &r600_hdmi_enable,
+ .hdmi_setmode = &r600_hdmi_setmode,
},
.copy = {
.blit = &r100_copy_blit,
@@ -732,6 +734,8 @@ static struct radeon_asic rs690_asic = {
.wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &r600_hdmi_enable,
+ .hdmi_setmode = &r600_hdmi_setmode,
},
.copy = {
.blit = &r100_copy_blit,
@@ -970,6 +974,8 @@ static struct radeon_asic r600_asic = {
.wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &r600_hdmi_enable,
+ .hdmi_setmode = &r600_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
@@ -1056,6 +1062,8 @@ static struct radeon_asic rs780_asic = {
.wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &r600_hdmi_enable,
+ .hdmi_setmode = &r600_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
@@ -1151,6 +1159,8 @@ static struct radeon_asic rv770_asic = {
.wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &r600_hdmi_enable,
+ .hdmi_setmode = &r600_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
@@ -1247,6 +1257,8 @@ static struct radeon_asic evergreen_asic = {
.wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &evergreen_hdmi_enable,
+ .hdmi_setmode = &evergreen_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
@@ -1343,6 +1355,8 @@ static struct radeon_asic sumo_asic = {
.wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &evergreen_hdmi_enable,
+ .hdmi_setmode = &evergreen_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
@@ -1439,6 +1453,8 @@ static struct radeon_asic btc_asic = {
.wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &evergreen_hdmi_enable,
+ .hdmi_setmode = &evergreen_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
@@ -1578,6 +1594,8 @@ static struct radeon_asic cayman_asic = {
.wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
+ .hdmi_enable = &evergreen_hdmi_enable,
+ .hdmi_setmode = &evergreen_hdmi_setmode,
},
.copy = {
.blit = &r600_copy_blit,
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index fa8b8bf..2c87365 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -378,6 +378,8 @@ struct r600_audio r600_audio_status(struct radeon_device *rdev);
void r600_audio_fini(struct radeon_device *rdev);
int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
+void r600_hdmi_enable(struct drm_encoder *encoder, bool enable);
+void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
/* r600 blit */
int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
struct radeon_fence **fence, struct radeon_sa_bo **vb,
@@ -476,6 +478,8 @@ int evergreen_copy_dma(struct radeon_device *rdev,
uint64_t src_offset, uint64_t dst_offset,
unsigned num_gpu_pages,
struct radeon_fence **fence);
+void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable);
+void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
/*
* cayman
--
1.7.7.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 0/3] Additional radeon audio cleanups
2013-04-18 15:35 [PATCH 0/3] Additional radeon audio cleanups alexdeucher
` (2 preceding siblings ...)
2013-04-18 15:35 ` [PATCH 3/3] drm/radeon: switch audio handling to use callbacks alexdeucher
@ 2013-04-18 16:34 ` Christian König
3 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2013-04-18 16:34 UTC (permalink / raw)
To: alexdeucher; +Cc: Alex Deucher, dri-devel
Am 18.04.2013 17:35, schrieb alexdeucher@gmail.com:
> From: Alex Deucher <alexander.deucher@amd.com>
>
> This set of patches does some additional audio cleanups
> and switches to per asic callbacks for audio.
>
> Alex Deucher (3):
> drm/radeon: clean up audio supported check
> drm/radeon: clean up audio dto programming
> drm/radeon: switch audio handling to use callbacks
Looks good to me and is:
Reviewed-by: Christian König <christian.koenig@amd.com>
>
> drivers/gpu/drm/radeon/atombios_encoders.c | 17 ++--
> drivers/gpu/drm/radeon/evergreen_hdmi.c | 43 +++++++++-
> drivers/gpu/drm/radeon/r600_audio.c | 64 +-------------
> drivers/gpu/drm/radeon/r600_hdmi.c | 135 ++++++++++++---------------
> drivers/gpu/drm/radeon/radeon.h | 10 +-
> drivers/gpu/drm/radeon/radeon_asic.c | 18 ++++
> drivers/gpu/drm/radeon/radeon_asic.h | 5 +-
> 7 files changed, 138 insertions(+), 154 deletions(-)
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] drm/radeon: clean up audio dto programming
2013-04-18 15:35 ` [PATCH 2/3] drm/radeon: clean up audio dto programming alexdeucher
@ 2013-04-19 6:10 ` Rafał Miłecki
2013-04-19 13:51 ` Alex Deucher
0 siblings, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2013-04-19 6:10 UTC (permalink / raw)
To: alexdeucher; +Cc: Alex Deucher, dri-devel
2013/4/18 <alexdeucher@gmail.com>:
> - switch (radeon_encoder->encoder_id) {
> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
> - case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
> - WREG32_P(R600_AUDIO_TIMING, 0, ~0x301);
> - break;
> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
> - WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
> - break;
> - default:
> - dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
> - radeon_encoder->encoder_id);
> - return;
> - }
Are you sure we can just drop that part?
I'd appreciate waiting with this patch until next week, I'll test it
over the weekend on my RV620.
--
Rafał
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] drm/radeon: clean up audio supported check
2013-04-18 15:35 ` [PATCH 1/3] drm/radeon: clean up audio supported check alexdeucher
@ 2013-04-19 6:13 ` Rafał Miłecki
0 siblings, 0 replies; 12+ messages in thread
From: Rafał Miłecki @ 2013-04-19 6:13 UTC (permalink / raw)
To: alexdeucher; +Cc: Alex Deucher, dri-devel
2013/4/18 <alexdeucher@gmail.com>:
> From: Alex Deucher <alexander.deucher@amd.com>
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/radeon/r600_audio.c | 5 +----
> 1 files changed, 1 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c
> index cb03fe2..72561e4 100644
> --- a/drivers/gpu/drm/radeon/r600_audio.c
> +++ b/drivers/gpu/drm/radeon/r600_audio.c
> @@ -57,10 +57,7 @@ static bool radeon_dig_encoder(struct drm_encoder *encoder)
> */
> static int r600_audio_chipset_supported(struct radeon_device *rdev)
> {
> - return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE6(rdev))
> - || rdev->family == CHIP_RS600
> - || rdev->family == CHIP_RS690
> - || rdev->family == CHIP_RS740;
> + return ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE6(rdev);
> }
>
> struct r600_audio r600_audio_status(struct radeon_device *rdev)
Looks fine :)
--
Rafał
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] drm/radeon: clean up audio dto programming
2013-04-19 6:10 ` Rafał Miłecki
@ 2013-04-19 13:51 ` Alex Deucher
2013-04-21 19:54 ` Rafał Miłecki
2013-04-22 5:43 ` Rafał Miłecki
0 siblings, 2 replies; 12+ messages in thread
From: Alex Deucher @ 2013-04-19 13:51 UTC (permalink / raw)
To: Rafał Miłecki; +Cc: dri-devel
On Fri, Apr 19, 2013 at 2:10 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
> 2013/4/18 <alexdeucher@gmail.com>:
>> - switch (radeon_encoder->encoder_id) {
>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
>> - case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
>> - WREG32_P(R600_AUDIO_TIMING, 0, ~0x301);
>> - break;
>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
>> - WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
>> - break;
>> - default:
>> - dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
>> - radeon_encoder->encoder_id);
>> - return;
>> - }
>
> Are you sure we can just drop that part?
Yes we should be able to drop that part. The only relevant bits are
9:8 which allows you to force which DTO is used by the audio block. 0
= auto, 1 = force dto0, 2 = force dto1. Additionally, that register
doesn't exist on evergreen and newer. On evergreen and newer there is
a DIG PHY register at the same offset which may explain the display
problems some people are experiencing.
>
> I'd appreciate waiting with this patch until next week, I'll test it
> over the weekend on my RV620.
Sounds good.
Alex
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/3] drm/radeon: switch audio handling to use callbacks
2013-04-18 15:35 ` [PATCH 3/3] drm/radeon: switch audio handling to use callbacks alexdeucher
@ 2013-04-21 19:51 ` Rafał Miłecki
0 siblings, 0 replies; 12+ messages in thread
From: Rafał Miłecki @ 2013-04-21 19:51 UTC (permalink / raw)
To: alexdeucher; +Cc: Alex Deucher, dri-devel
2013/4/18 <alexdeucher@gmail.com>:
> From: Alex Deucher <alexander.deucher@amd.com>
>
> Register audio callbacks for asic where we support
> audio. Cleans up the code and makes it easier to
> add support for newer asics.
Ack
--
Rafał
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] drm/radeon: clean up audio dto programming
2013-04-19 13:51 ` Alex Deucher
@ 2013-04-21 19:54 ` Rafał Miłecki
2013-04-22 5:43 ` Rafał Miłecki
1 sibling, 0 replies; 12+ messages in thread
From: Rafał Miłecki @ 2013-04-21 19:54 UTC (permalink / raw)
To: Alex Deucher; +Cc: dri-devel
2013/4/19 Alex Deucher <alexdeucher@gmail.com>:
> On Fri, Apr 19, 2013 at 2:10 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>> 2013/4/18 <alexdeucher@gmail.com>:
>>> - switch (radeon_encoder->encoder_id) {
>>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
>>> - case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
>>> - WREG32_P(R600_AUDIO_TIMING, 0, ~0x301);
>>> - break;
>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
>>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
>>> - WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
>>> - break;
>>> - default:
>>> - dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
>>> - radeon_encoder->encoder_id);
>>> - return;
>>> - }
>>
>> Are you sure we can just drop that part?
>
> Yes we should be able to drop that part. The only relevant bits are
> 9:8 which allows you to force which DTO is used by the audio block. 0
> = auto, 1 = force dto0, 2 = force dto1. Additionally, that register
> doesn't exist on evergreen and newer. On evergreen and newer there is
> a DIG PHY register at the same offset which may explain the display
> problems some people are experiencing.
>
>>
>> I'd appreciate waiting with this patch until next week, I'll test it
>> over the weekend on my RV620.
>
> Sounds good.
Due to problems with running fglrx I didn't manage to test that patch
over weekend.
As you see some docs and know that registers, I hope this patch is
fine. In case of problems we can always easy revert the problematic
part :)
--
Rafał
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] drm/radeon: clean up audio dto programming
2013-04-19 13:51 ` Alex Deucher
2013-04-21 19:54 ` Rafał Miłecki
@ 2013-04-22 5:43 ` Rafał Miłecki
2013-04-22 12:38 ` Alex Deucher
1 sibling, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2013-04-22 5:43 UTC (permalink / raw)
To: Alex Deucher; +Cc: dri-devel
2013/4/19 Alex Deucher <alexdeucher@gmail.com>:
> On Fri, Apr 19, 2013 at 2:10 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>> 2013/4/18 <alexdeucher@gmail.com>:
>>> - switch (radeon_encoder->encoder_id) {
>>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
>>> - case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
>>> - WREG32_P(R600_AUDIO_TIMING, 0, ~0x301);
>>> - break;
>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
>>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
>>> - WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
>>> - break;
>>> - default:
>>> - dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
>>> - radeon_encoder->encoder_id);
>>> - return;
>>> - }
>>
>> Are you sure we can just drop that part?
>
> Yes we should be able to drop that part. The only relevant bits are
> 9:8 which allows you to force which DTO is used by the audio block. 0
> = auto, 1 = force dto0, 2 = force dto1. Additionally, that register
> doesn't exist on evergreen and newer. On evergreen and newer there is
> a DIG PHY register at the same offset which may explain the display
> problems some people are experiencing.
For now I can only say that fglrx seems to be changing that 0x7344:
RREG32(0x00000534); -> 0x00000001 DCCG_AUDIO_DTO_SELECT
WREG32(0x00000534, 0x00000000); DCCG_AUDIO_DTO_SELECT
RREG32(0x00007344); -> 0x00000270
WREG32(0x00007344, 0x00000170);
RREG32(0x00000518); -> 0x00000000 DCCG_AUDIO_DTO0_MODULE
WREG32(0x00000518, 0x00e297d0); DCCG_AUDIO_DTO0_MODULE
RREG32(0x00000514); -> 0x00000000 DCCG_AUDIO_DTO0_PHASE
WREG32(0x00000514, 0x00249f00); DCCG_AUDIO_DTO0_PHASE
I can't say how well radeon is going to work without that, just
informing you about fglrx.
--
Rafał
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] drm/radeon: clean up audio dto programming
2013-04-22 5:43 ` Rafał Miłecki
@ 2013-04-22 12:38 ` Alex Deucher
0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2013-04-22 12:38 UTC (permalink / raw)
To: Rafał Miłecki; +Cc: dri-devel
On Mon, Apr 22, 2013 at 1:43 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
> 2013/4/19 Alex Deucher <alexdeucher@gmail.com>:
>> On Fri, Apr 19, 2013 at 2:10 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>>> 2013/4/18 <alexdeucher@gmail.com>:
>>>> - switch (radeon_encoder->encoder_id) {
>>>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
>>>> - case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
>>>> - WREG32_P(R600_AUDIO_TIMING, 0, ~0x301);
>>>> - break;
>>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
>>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
>>>> - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
>>>> - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
>>>> - WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);
>>>> - break;
>>>> - default:
>>>> - dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",
>>>> - radeon_encoder->encoder_id);
>>>> - return;
>>>> - }
>>>
>>> Are you sure we can just drop that part?
>>
>> Yes we should be able to drop that part. The only relevant bits are
>> 9:8 which allows you to force which DTO is used by the audio block. 0
>> = auto, 1 = force dto0, 2 = force dto1. Additionally, that register
>> doesn't exist on evergreen and newer. On evergreen and newer there is
>> a DIG PHY register at the same offset which may explain the display
>> problems some people are experiencing.
>
> For now I can only say that fglrx seems to be changing that 0x7344:
>
> RREG32(0x00000534); -> 0x00000001 DCCG_AUDIO_DTO_SELECT
> WREG32(0x00000534, 0x00000000); DCCG_AUDIO_DTO_SELECT
Selects DTO0.
>
> RREG32(0x00007344); -> 0x00000270
> WREG32(0x00007344, 0x00000170);
Force audio to use DTO0. I think "auto" should work, but I can add
this back for dce2/3 if you'd prefer.
>
> RREG32(0x00000518); -> 0x00000000 DCCG_AUDIO_DTO0_MODULE
> WREG32(0x00000518, 0x00e297d0); DCCG_AUDIO_DTO0_MODULE
> RREG32(0x00000514); -> 0x00000000 DCCG_AUDIO_DTO0_PHASE
> WREG32(0x00000514, 0x00249f00); DCCG_AUDIO_DTO0_PHASE
>
Set the DTO0 dividers.
> I can't say how well radeon is going to work without that, just
> informing you about fglrx.
There are two dtos, you can use either one. AUDIO_DTO_SELECT selects
whether you are using DTO0 or DTO1. The dtos determine how the audio
signal is encoded so that it can be reconstructed in the sink.
24Mhz / pixel clock = AUDIO_DTO0_PHASE / AUDIO_DTO0_MODULE
The current code needs to be updated to calculate this properly at some point.
Alex
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2013-04-22 12:38 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-18 15:35 [PATCH 0/3] Additional radeon audio cleanups alexdeucher
2013-04-18 15:35 ` [PATCH 1/3] drm/radeon: clean up audio supported check alexdeucher
2013-04-19 6:13 ` Rafał Miłecki
2013-04-18 15:35 ` [PATCH 2/3] drm/radeon: clean up audio dto programming alexdeucher
2013-04-19 6:10 ` Rafał Miłecki
2013-04-19 13:51 ` Alex Deucher
2013-04-21 19:54 ` Rafał Miłecki
2013-04-22 5:43 ` Rafał Miłecki
2013-04-22 12:38 ` Alex Deucher
2013-04-18 15:35 ` [PATCH 3/3] drm/radeon: switch audio handling to use callbacks alexdeucher
2013-04-21 19:51 ` Rafał Miłecki
2013-04-18 16:34 ` [PATCH 0/3] Additional radeon audio cleanups Christian König
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).