Mailinglist Archive: radeonhd (271 mails)
| < Previous | Next > |
[radeonhd] Re: Status of HDMI Audio on RV730 and RV710 Chipset (HD4550 and others)
- From: Christian König <deathsimple@xxxxxxxxxxx>
- Date: Sun, 29 Nov 2009 23:12:24 +0100
- Message-id: <1259532744.3441.125.camel@zweiundvierzig>
Hi everybody,
my tests with the RV790 chipset were quite unsuccessfully, the RV790
chipset works flawless out of the box. Initially I hoped that my fiend
has a RV730, but this doesn't proved to be true.
But since I promised a patch I summed up everything known about the
RV710 and RV730 chipset and stuff it together in one change. So the
attached patch is more a ugly hack than a real solution.
It should apply cleanly with "git apply test.patch" ontop of current
master, please give it a try and make a new dump of the 0x7000-0x7FFF
register range while audio is playing.
Happy testing,
Christian.
diff --git a/src/rhd_audio.c b/src/rhd_audio.c
index 5e3c4e2..442c979 100644
--- a/src/rhd_audio.c
+++ b/src/rhd_audio.c
@@ -239,6 +239,7 @@ RHDAudioSetClock(RHDPtr rhdPtr, struct rhdOutput* Output,
CARD32 Clock)
case RHD_OUTPUT_UNIPHYA:
case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYE:
case RHD_OUTPUT_KLDSKP_LVTMA:
RHDRegMask(Audio, AUDIO_TIMING, 0x100, 0x301);
break;
diff --git a/src/rhd_driver.c b/src/rhd_driver.c
index 2d7f803..075c3eb 100644
--- a/src/rhd_driver.c
+++ b/src/rhd_driver.c
@@ -2205,7 +2205,7 @@ rhdModeLayoutSelect(RHDPtr rhdPtr)
rhdOutputConnectorCheck(Connector);
}
- i = 0; /* counter for CRTCs */
+ i = 1; /* counter for CRTCs */
for (Output = rhdPtr->Outputs; Output; Output = Output->Next)
if (Output->Connector) {
struct rhdMonitor *Monitor = NULL;
diff --git a/src/rhd_hdmi.c b/src/rhd_hdmi.c
index c786fcd..6538d50 100644
--- a/src/rhd_hdmi.c
+++ b/src/rhd_hdmi.c
@@ -268,6 +268,7 @@ RHDHdmiInit(RHDPtr rhdPtr, struct rhdOutput* Output)
hdmi->Offset = HDMI_TMDS;
break;
+ case RHD_OUTPUT_UNIPHYE:
case RHD_OUTPUT_KLDSKP_LVTMA:
hdmi->Offset = HDMI_DIG;
break;
@@ -323,6 +324,10 @@ RHDHdmiSetMode(struct rhdHdmi *hdmi, DisplayModePtr Mode)
/* update? reset? don't realy know */
RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x14000000, 0x14000000);
+
+
+ if(RHDPTRI(hdmi)->ChipSet == RHD_RV710 || RHDPTRI(hdmi)->ChipSet ==
RHD_RV730)
+ RHDRegMask(hdmi, 0x7604, 0x00000001, 0x00000001);
}
/*
@@ -441,6 +446,10 @@ RHDHdmiEnable(struct rhdHdmi *hdmi, Bool Enable)
RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x110 : 0x0);
break;
+ case RHD_OUTPUT_UNIPHYE:
+ RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x011 : 0x0);
+ break;
+
default:
xf86DrvMsg(hdmi->scrnIndex, X_ERROR, "%s: unknown HDMI output
type\n", __func__);
break;
diff --git a/src/rhd_output.c b/src/rhd_output.c
index 0e33d4e..bbaa119 100644
--- a/src/rhd_output.c
+++ b/src/rhd_output.c
@@ -307,6 +307,7 @@ RHDOutputTmdsIndex(struct rhdOutput *Output)
break;
case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYE:
case RHD_OUTPUT_KLDSKP_LVTMA:
index=1;
break;
diff --git a/src/rhd_randr.c b/src/rhd_randr.c
index 36d783b..f1e84c8 100644
--- a/src/rhd_randr.c
+++ b/src/rhd_randr.c
@@ -1924,7 +1924,7 @@ RHDRandrPreInit(ScrnInfoPtr pScrn)
randr->RandrCrtc[i] = xf86CrtcCreate(pScrn, &rhdRRCrtcFuncs);
ASSERT(randr->RandrCrtc[i]);
randr->RandrCrtc[i]->driver_private = xnfcalloc(sizeof(struct
rhdRandrCrtc),1);
- ((struct rhdRandrCrtc*) randr->RandrCrtc[i]->driver_private)->rhdCrtc =
rhdPtr->Crtc[i]; /* TODO: not cleaning up correctly */
+ ((struct rhdRandrCrtc*) randr->RandrCrtc[i]->driver_private)->rhdCrtc =
rhdPtr->Crtc[i ^ 1]; /* TODO: not cleaning up correctly */
}
/* First count, then allocate */
my tests with the RV790 chipset were quite unsuccessfully, the RV790
chipset works flawless out of the box. Initially I hoped that my fiend
has a RV730, but this doesn't proved to be true.
But since I promised a patch I summed up everything known about the
RV710 and RV730 chipset and stuff it together in one change. So the
attached patch is more a ugly hack than a real solution.
It should apply cleanly with "git apply test.patch" ontop of current
master, please give it a try and make a new dump of the 0x7000-0x7FFF
register range while audio is playing.
Happy testing,
Christian.
diff --git a/src/rhd_audio.c b/src/rhd_audio.c
index 5e3c4e2..442c979 100644
--- a/src/rhd_audio.c
+++ b/src/rhd_audio.c
@@ -239,6 +239,7 @@ RHDAudioSetClock(RHDPtr rhdPtr, struct rhdOutput* Output,
CARD32 Clock)
case RHD_OUTPUT_UNIPHYA:
case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYE:
case RHD_OUTPUT_KLDSKP_LVTMA:
RHDRegMask(Audio, AUDIO_TIMING, 0x100, 0x301);
break;
diff --git a/src/rhd_driver.c b/src/rhd_driver.c
index 2d7f803..075c3eb 100644
--- a/src/rhd_driver.c
+++ b/src/rhd_driver.c
@@ -2205,7 +2205,7 @@ rhdModeLayoutSelect(RHDPtr rhdPtr)
rhdOutputConnectorCheck(Connector);
}
- i = 0; /* counter for CRTCs */
+ i = 1; /* counter for CRTCs */
for (Output = rhdPtr->Outputs; Output; Output = Output->Next)
if (Output->Connector) {
struct rhdMonitor *Monitor = NULL;
diff --git a/src/rhd_hdmi.c b/src/rhd_hdmi.c
index c786fcd..6538d50 100644
--- a/src/rhd_hdmi.c
+++ b/src/rhd_hdmi.c
@@ -268,6 +268,7 @@ RHDHdmiInit(RHDPtr rhdPtr, struct rhdOutput* Output)
hdmi->Offset = HDMI_TMDS;
break;
+ case RHD_OUTPUT_UNIPHYE:
case RHD_OUTPUT_KLDSKP_LVTMA:
hdmi->Offset = HDMI_DIG;
break;
@@ -323,6 +324,10 @@ RHDHdmiSetMode(struct rhdHdmi *hdmi, DisplayModePtr Mode)
/* update? reset? don't realy know */
RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x14000000, 0x14000000);
+
+
+ if(RHDPTRI(hdmi)->ChipSet == RHD_RV710 || RHDPTRI(hdmi)->ChipSet ==
RHD_RV730)
+ RHDRegMask(hdmi, 0x7604, 0x00000001, 0x00000001);
}
/*
@@ -441,6 +446,10 @@ RHDHdmiEnable(struct rhdHdmi *hdmi, Bool Enable)
RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x110 : 0x0);
break;
+ case RHD_OUTPUT_UNIPHYE:
+ RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x011 : 0x0);
+ break;
+
default:
xf86DrvMsg(hdmi->scrnIndex, X_ERROR, "%s: unknown HDMI output
type\n", __func__);
break;
diff --git a/src/rhd_output.c b/src/rhd_output.c
index 0e33d4e..bbaa119 100644
--- a/src/rhd_output.c
+++ b/src/rhd_output.c
@@ -307,6 +307,7 @@ RHDOutputTmdsIndex(struct rhdOutput *Output)
break;
case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYE:
case RHD_OUTPUT_KLDSKP_LVTMA:
index=1;
break;
diff --git a/src/rhd_randr.c b/src/rhd_randr.c
index 36d783b..f1e84c8 100644
--- a/src/rhd_randr.c
+++ b/src/rhd_randr.c
@@ -1924,7 +1924,7 @@ RHDRandrPreInit(ScrnInfoPtr pScrn)
randr->RandrCrtc[i] = xf86CrtcCreate(pScrn, &rhdRRCrtcFuncs);
ASSERT(randr->RandrCrtc[i]);
randr->RandrCrtc[i]->driver_private = xnfcalloc(sizeof(struct
rhdRandrCrtc),1);
- ((struct rhdRandrCrtc*) randr->RandrCrtc[i]->driver_private)->rhdCrtc =
rhdPtr->Crtc[i]; /* TODO: not cleaning up correctly */
+ ((struct rhdRandrCrtc*) randr->RandrCrtc[i]->driver_private)->rhdCrtc =
rhdPtr->Crtc[i ^ 1]; /* TODO: not cleaning up correctly */
}
/* First count, then allocate */
| < Previous | Next > |