Mailinglist Archive: radeonhd (365 mails)
| < Previous | Next > |
[radeonhd] Re: Update audio info in radeonhd man
- From: Christian König <deathsimple@xxxxxxxxxxx>
- Date: Wed, 04 Mar 2009 22:37:03 +0100
- Message-id: <1236202623.6203.103.camel@zweiundvierzig>
Hi guys,
attached are 5 patches, which as far as i can see can go into mainline.
The first 4 are laying around in my personal repository for quite some
time now, and the last is a small change to the hdmi stuff in the
manpage from Rafał Miłecki.
Can anybody please commit them?
Bye, Christian.
Date: Sat, 20 Dec 2008 23:03:22 +0100
Subject: [PATCH] Update RHDAudioInit to include RS600, RS690 and RS740
RHDAudioInit decides from the chipset type if there is an audio engine.
This commit changes this test to include more chipsets. It should be
removed entirely when i figure out how to get this information from
atombios.
---
src/rhd_audio.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/rhd_audio.c b/src/rhd_audio.c
index bd2d9a8..8d8a7d1 100644
--- a/src/rhd_audio.c
+++ b/src/rhd_audio.c
@@ -165,7 +165,7 @@ RHDAudioInit(RHDPtr rhdPtr)
{
RHDFUNC(rhdPtr);
- if (rhdPtr->ChipSet >= RHD_R600) {
+ if (rhdPtr->ChipSet >= RHD_RS600) {
struct rhdAudio *Audio = (struct rhdAudio *) xnfcalloc(sizeof(struct
rhdAudio), 1);
Audio->scrnIndex = rhdPtr->scrnIndex;
--
1.5.6.3
Date: Sat, 20 Dec 2008 23:05:27 +0100
Subject: [PATCH] Cleanup and include true/false as match in
RhdParseBooleanOption
Further improve RhdParseBooleanOption to include true/false as match,
since people seems to be used to it because of the behaviour of Boolean
options.
---
src/rhd_helper.c | 30 ++++++++++++++++++++++++------
1 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/src/rhd_helper.c b/src/rhd_helper.c
index 26f6774..0f47bba 100644
--- a/src/rhd_helper.c
+++ b/src/rhd_helper.c
@@ -120,9 +120,23 @@ RhdGetOptValString(const OptionInfoRec *table, int token,
enum rhdOptStatus
RhdParseBooleanOption(struct RHDOpt *Option, char *Name)
{
+ unsigned int i;
char* c;
char* str = strdup(Name);
+ const char* off[] = {
+ "false",
+ "off",
+ "no",
+ "0"
+ };
+ const char* on[] = {
+ "true",
+ "on",
+ "yes",
+ "1"
+ };
+
/* first fixup the name to match the randr names */
for (c = str; *c; c++)
if (isspace(*c))
@@ -146,12 +160,16 @@ RhdParseBooleanOption(struct RHDOpt *Option, char *Name)
if (isspace(*ptr) || *ptr == '=') {
ptr++;
}
- if (!strncasecmp("off",ptr,3) || !strncasecmp("0",ptr,1) ||
!strncasecmp("no",ptr,2)) {
- return RHD_OPTION_OFF;
- } else if (!strncasecmp("on",ptr,2) || !strncasecmp("1",ptr,1)
|| !strncasecmp("yes",ptr,3)) {
- return RHD_OPTION_ON;
- } else
- return RHD_OPTION_DEFAULT;
+
+ for(i=0; i<sizeof(on)/sizeof(char*); i++)
+ if (!strncasecmp(on[i],ptr,strlen(on[i])))
+ return RHD_OPTION_OFF;
+
+ for(i=0; i<sizeof(off)/sizeof(char*); i++)
+ if (!strncasecmp(off[i],ptr,strlen(off[i])))
+ return RHD_OPTION_ON;
+
+ return RHD_OPTION_DEFAULT;
} else
while (*ptr != '\0' && !isspace(*ptr))
ptr++;
--
1.5.6.3
Date: Sat, 20 Dec 2008 23:15:14 +0100
Subject: [PATCH] Randr HDMI property
Adds an HDMI property to randr and while we are at it rework the
property handling a bit. Also adds an RHDOutputAttachConnector function
which is called every time an output <-> connection relation is changed.
---
src/rhd.h | 3 +-
src/rhd_atomout.c | 147 +++++++++++++++++++++++++++++++++-------------------
src/rhd_dig.c | 87 +++++++++++++------------------
src/rhd_driver.c | 4 +-
src/rhd_lvtma.c | 62 ++++++++++++----------
src/rhd_output.c | 56 ++++++++++++++++++++
src/rhd_output.h | 4 +-
src/rhd_randr.c | 71 +++++++++++++++++++++-----
src/rhd_tmds.c | 52 +++++++++----------
9 files changed, 310 insertions(+), 176 deletions(-)
diff --git a/src/rhd.h b/src/rhd.h
index d3ab278..5a5ef53 100644
--- a/src/rhd.h
+++ b/src/rhd.h
@@ -122,7 +122,8 @@ enum RHD_TV_MODE {
enum rhdPropertyAction {
rhdPropertyCheck,
rhdPropertyGet,
- rhdPropertySet
+ rhdPropertySet,
+ rhdPropertyCommit
};
union rhdPropertyData
diff --git a/src/rhd_atomout.c b/src/rhd_atomout.c
index 600e055..5ebd0ce 100644
--- a/src/rhd_atomout.c
+++ b/src/rhd_atomout.c
@@ -278,13 +278,14 @@ atomSetBacklightFromBIOSScratch(struct rhdOutput *Output)
*
*/
static void
-atomSetBacklight(struct rhdOutput *Output, int value)
+atomSetBacklight(struct rhdOutput *Output)
{
RHDPtr rhdPtr = RHDPTRI(Output);
+ struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
RHDFUNC(Output);
- RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlSet, &value);
+ RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlSet, &Private->BlLevel);
atomSetBacklightFromBIOSScratch(Output);
}
@@ -352,6 +353,63 @@ rhdAtomOutputSet(struct rhdOutput *Output, DisplayModePtr
Mode)
/*
*
*/
+static Bool
+atomIsHdmiEnabled(struct rhdOutput *Output)
+{
+ struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
+ switch(Output->Id) {
+ case RHD_OUTPUT_TMDSA:
+ case RHD_OUTPUT_LVTMA:
+ return Private->EncoderConfig.u.lvds2.Hdmi;
+
+ case RHD_OUTPUT_UNIPHYA:
+ case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYC:
+ case RHD_OUTPUT_UNIPHYD:
+ case RHD_OUTPUT_UNIPHYE:
+ case RHD_OUTPUT_UNIPHYF:
+ case RHD_OUTPUT_KLDSKP_LVTMA:
+ return Private->TransmitterConfig.Mode == atomHDMI &&
+ Private->EncoderConfig.u.dig.EncoderMode == atomHDMI;
+
+ default:
+ return FALSE;
+ }
+}
+
+/*
+ *
+ */
+static void
+atomSetHdmiEnabled(struct rhdOutput *Output, Bool value)
+{
+ struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
+ switch(Output->Id) {
+ case RHD_OUTPUT_TMDSA:
+ case RHD_OUTPUT_LVTMA:
+ Private->EncoderConfig.u.lvds2.Hdmi = value;
+ break;
+
+ case RHD_OUTPUT_UNIPHYA:
+ case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYC:
+ case RHD_OUTPUT_UNIPHYD:
+ case RHD_OUTPUT_UNIPHYE:
+ case RHD_OUTPUT_UNIPHYF:
+ case RHD_OUTPUT_KLDSKP_LVTMA:
+ Private->TransmitterConfig.Mode =
+ Private->EncoderConfig.u.dig.EncoderMode =
+ value ? atomHDMI : atomDVI;
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*
+ *
+ */
static inline void
rhdAtomOutputPower(struct rhdOutput *Output, int Power)
{
@@ -359,39 +417,9 @@ rhdAtomOutputPower(struct rhdOutput *Output, int Power)
struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
struct atomEncoderConfig *EncoderConfig = &Private->EncoderConfig;
union AtomBiosArg data;
- Bool enableHDMI = FALSE;
RHDFUNC(Output);
- if(Output->Connector != NULL) {
- enableHDMI = RHDConnectorEnableHDMI(Output->Connector);
- switch(Output->Id) {
- case RHD_OUTPUT_TMDSA:
- case RHD_OUTPUT_LVTMA:
- if(enableHDMI && !Private->EncoderConfig.u.lvds2.Hdmi)
- Private->EncoderConfig.u.lvds2.Hdmi = TRUE;
- else if(!enableHDMI && Private->EncoderConfig.u.lvds2.Hdmi)
- Private->EncoderConfig.u.lvds2.Hdmi = FALSE;
- break;
-
- case RHD_OUTPUT_UNIPHYA:
- case RHD_OUTPUT_UNIPHYB:
- case RHD_OUTPUT_KLDSKP_LVTMA:
- if(enableHDMI && Private->TransmitterConfig.Mode == atomDVI) {
- Private->TransmitterConfig.Mode = atomHDMI;
- Private->EncoderConfig.u.dig.EncoderMode = atomHDMI;
-
- } else if(!enableHDMI && Private->TransmitterConfig.Mode ==
atomHDMI) {
- Private->TransmitterConfig.Mode = atomDVI;
- Private->EncoderConfig.u.dig.EncoderMode = atomDVI;
- }
- break;
-
- default:
- break;
- }
- }
-
data.Address = &Private->Save;
RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS,
ATOM_SET_REGISTER_LIST_LOCATION, &data);
@@ -423,7 +451,7 @@ rhdAtomOutputPower(struct rhdOutput *Output, int Power)
ERROR_MSG("rhdAtomOutputControl(atomOutputEnable)");
break;
}
- RHDHdmiEnable(Private->Hdmi, enableHDMI);
+ RHDHdmiEnable(Private->Hdmi, atomIsHdmiEnabled(Output));
break;
case RHD_POWER_RESET:
RHDDebug(Output->scrnIndex, "RHD_POWER_RESET\n");
@@ -656,7 +684,16 @@ atomLVDSPropertyControl(struct rhdOutput *Output,
return FALSE;
switch (Property) {
case RHD_OUTPUT_BACKLIGHT:
- atomSetBacklight(Output, val->integer);
+ Private->BlLevel = val->integer;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_BACKLIGHT:
+ atomSetBacklight(Output);
return TRUE;
default:
return FALSE;
@@ -678,17 +715,21 @@ atomTMDSPropertyControl(struct rhdOutput *Output,
RHDFUNC(Output);
switch (Action) {
case rhdPropertyCheck:
- switch (Property) {
- case RHD_OUTPUT_COHERENT:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
return TRUE;
- default:
- return FALSE;
- }
+ default:
+ return FALSE;
+ }
case rhdPropertyGet:
switch (Property) {
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = atomIsHdmiEnabled(Output);
+ return TRUE;
default:
return FALSE;
}
@@ -697,6 +738,18 @@ atomTMDSPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ atomSetHdmiEnabled(Output, val->Bool);
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -1004,23 +1057,9 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType
ConnectorType,
LVDSInfoRetrieve(rhdPtr, Private);
Private->Hdmi = NULL;
} else {
- int from = X_CONFIG;
TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode =
atomDVI;
TMDSInfoRetrieve(rhdPtr, Private);
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name))
{
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- Private->Coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- Private->Coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- Private->Coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to
%scoherent\n",Output->Name,Private->Coherent ? "" : "in");
+ Private->Coherent = FALSE;
Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
}
break;
diff --git a/src/rhd_dig.c b/src/rhd_dig.c
index a16e09c..fef54cc 100644
--- a/src/rhd_dig.c
+++ b/src/rhd_dig.c
@@ -162,14 +162,13 @@ LVTMATransmitterModeValid(struct rhdOutput *Output,
DisplayModePtr Mode)
}
static void
-LVDSSetBacklight(struct rhdOutput *Output, int level)
+LVDSSetBacklight(struct rhdOutput *Output)
{
struct DIGPrivate *Private = (struct DIGPrivate *) Output->Private;
+ int level = Private->BlLevel;
RHDFUNC(Output);
- Private->BlLevel = level;
-
RHDRegMask(Output, RV620_LVTMA_PWRSEQ_REF_DIV,
0x144 << LVTMA_BL_MOD_REF_DI_SHIFT,
0x7ff << LVTMA_BL_MOD_REF_DI_SHIFT);
@@ -215,7 +214,16 @@ LVDSTransmitterPropertyControl(struct rhdOutput *Output,
return FALSE;
switch (Property) {
case RHD_OUTPUT_BACKLIGHT:
- LVDSSetBacklight(Output, val->integer);
+ Private->BlLevel = val->integer;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_BACKLIGHT:
+ LVDSSetBacklight(Output);
return TRUE;
default:
return FALSE;
@@ -237,17 +245,21 @@ TMDSTransmitterPropertyControl(struct rhdOutput *Output,
RHDFUNC(Output);
switch (Action) {
case rhdPropertyCheck:
- switch (Property) {
- case RHD_OUTPUT_COHERENT:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
return TRUE;
- default:
- return FALSE;
- }
+ default:
+ return FALSE;
+ }
case rhdPropertyGet:
switch (Property) {
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = Private->EncoderMode == TMDS_HDMI;
+ return TRUE;
default:
return FALSE;
}
@@ -256,6 +268,18 @@ TMDSTransmitterPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ Private->EncoderMode = val->Bool ? TMDS_HDMI : TMDS_DVI;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -1397,20 +1421,10 @@ DigPower(struct rhdOutput *Output, int Power)
struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private;
struct transmitter *Transmitter = &Private->Transmitter;
struct encoder *Encoder = &Private->Encoder;
- Bool enableHDMI;
RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name,
rhdPowerString[Power]);
- if(Output->Connector != NULL) {
- /* check if attached monitor supports HDMI */
- enableHDMI = RHDConnectorEnableHDMI(Output->Connector);
- if (enableHDMI && Private->EncoderMode == TMDS_DVI)
- Private->EncoderMode = TMDS_HDMI;
- else if (!enableHDMI && Private->EncoderMode == TMDS_HDMI)
- Private->EncoderMode = TMDS_DVI;
- }
-
switch (Power) {
case RHD_POWER_ON:
Encoder->Power(Output, Power);
@@ -1444,6 +1458,7 @@ DigPropertyControl(struct rhdOutput *Output,
switch(Property) {
case RHD_OUTPUT_COHERENT:
case RHD_OUTPUT_BACKLIGHT:
+ case RHD_OUTPUT_HDMI:
{
if (!Private->Transmitter.Property)
return FALSE;
@@ -1629,34 +1644,6 @@ DigAllocFree(struct rhdOutput *Output, enum
rhdOutputAllocation Alloc)
/*
*
*/
-static Bool
-rhdDIGSetCoherent(RHDPtr rhdPtr,struct rhdOutput *Output)
-{
- Bool coherent = FALSE;
- int from = X_CONFIG;
-
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to %scoherent\n",
- Output->Name,coherent ? "" : "in");
-
- return coherent;
-}
-
-/*
- *
- */
#ifdef NOT_YET
static Bool
digTransmitterPropertyWrapper(struct rhdOutput *Output,
@@ -1729,7 +1716,7 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType,
CARD8 ConnectorType)
struct ATOMTransmitterPrivate *transPrivate =
(struct ATOMTransmitterPrivate
*)Private->Transmitter.Private;
struct atomTransmitterConfig *atc =
&transPrivate->atomTransmitterConfig;
- atc->Coherent = Private->Coherent = rhdDIGSetCoherent(rhdPtr,
Output);
+ atc->Coherent = Private->Coherent = FALSE;
atc->Link = atomTransLinkA;
atc->Encoder = atomEncoderNone;
if (RHDIsIGP(rhdPtr->ChipSet)) {
@@ -1774,7 +1761,7 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType,
CARD8 ConnectorType)
struct ATOMTransmitterPrivate *transPrivate =
(struct ATOMTransmitterPrivate
*)Private->Transmitter.Private;
struct atomTransmitterConfig *atc =
&transPrivate->atomTransmitterConfig;
- atc->Coherent = Private->Coherent = rhdDIGSetCoherent(rhdPtr,
Output);
+ atc->Coherent = Private->Coherent = FALSE;
atc->Link = atomTransLinkB;
atc->Encoder = atomEncoderNone;
if (RHDIsIGP(rhdPtr->ChipSet)) {
@@ -1803,7 +1790,7 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType,
CARD8 ConnectorType)
case RHD_OUTPUT_KLDSKP_LVTMA:
Output->Name = "UNIPHY_KLDSKP_LVTMA";
- Private->Coherent = rhdDIGSetCoherent(rhdPtr, Output);
+ Private->Coherent = FALSE;
Private->Transmitter.Private =
(struct LVTMATransmitterPrivate *)xnfcalloc(sizeof (struct
LVTMATransmitterPrivate), 1);
Private->Transmitter.Sense = NULL;
diff --git a/src/rhd_driver.c b/src/rhd_driver.c
index 4bd9bd9..859b99e 100644
--- a/src/rhd_driver.c
+++ b/src/rhd_driver.c
@@ -1987,7 +1987,7 @@ rhdOutputConnectorCheck(struct rhdConnector *Connector)
/* Do this before sensing as AtomBIOS sense needs this info */
if ((Output->SensedType = Output->Sense(Output, Connector)) !=
RHD_SENSED_NONE) {
RHDOutputPrintSensedType(Output);
- Output->Connector = Connector;
+ RHDOutputAttachConnector(Output, Connector);
break;
}
}
@@ -1999,7 +1999,7 @@ rhdOutputConnectorCheck(struct rhdConnector *Connector)
for (i = 0; i < 2; i++) {
Output = Connector->Output[i];
if (Output && !Output->Sense) {
- Output->Connector = Connector;
+ RHDOutputAttachConnector(Output, Connector);
break;
}
}
diff --git a/src/rhd_lvtma.c b/src/rhd_lvtma.c
index 57f384e..04acc3d 100644
--- a/src/rhd_lvtma.c
+++ b/src/rhd_lvtma.c
@@ -203,13 +203,12 @@ LVDSDebugBacklight(struct rhdOutput *Output)
*
*/
static void
-LVDSSetBacklight(struct rhdOutput *Output, int level)
+LVDSSetBacklight(struct rhdOutput *Output)
{
struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private;
+ int level = Private->BlLevel;
RHDPtr rhdPtr = RHDPTRI(Output);
- Private->BlLevel = level;
-
xf86DrvMsg(rhdPtr->scrnIndex, X_INFO,
"%s: trying to set BL_MOD_LEVEL to: %d\n",
__func__, level);
@@ -264,7 +263,18 @@ LVDSPropertyControl(struct rhdOutput *Output, enum
rhdPropertyAction Action,
case RHD_OUTPUT_BACKLIGHT:
if (Private->BlLevel < 0)
return FALSE;
- LVDSSetBacklight(Output, val->integer);
+ Private->BlLevel = val->integer;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_BACKLIGHT:
+ if (Private->BlLevel < 0)
+ return FALSE;
+ LVDSSetBacklight(Output);
break;
default:
return FALSE;
@@ -420,10 +430,7 @@ LVDSEnable(struct rhdOutput *Output)
__func__, i, (int) tmp);
}
if (Private->BlLevel >= 0) {
- union rhdPropertyData data;
- data.integer = Private->BlLevel;
- Output->Property(Output, rhdPropertySet, RHD_OUTPUT_BACKLIGHT,
- &data);
+ LVDSSetBacklight(Output);
}
}
@@ -728,6 +735,7 @@ LVDSDestroy(struct rhdOutput *Output)
struct rhdTMDSBPrivate {
Bool RunsDualLink;
Bool Coherent;
+ Bool HdmiEnabled;
DisplayModePtr Mode;
struct rhdHdmi *Hdmi;
@@ -1042,6 +1050,7 @@ TMDSBPropertyControl(struct rhdOutput *Output,
case rhdPropertyCheck:
switch (Property) {
case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
return TRUE;
default:
return FALSE;
@@ -1051,6 +1060,9 @@ TMDSBPropertyControl(struct rhdOutput *Output,
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = Private->HdmiEnabled;
+ return TRUE;
default:
return FALSE;
}
@@ -1059,6 +1071,18 @@ TMDSBPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ Private->HdmiEnabled = val->Bool;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -1177,10 +1201,7 @@ TMDSBPower(struct rhdOutput *Output, int Power)
RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001);
usleep(2);
RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000002);
- if(Output->Connector != NULL &&
RHDConnectorEnableHDMI(Output->Connector))
- RHDHdmiEnable(Private->Hdmi, TRUE);
- else
- RHDHdmiEnable(Private->Hdmi, FALSE);
+ RHDHdmiEnable(Private->Hdmi, Private->HdmiEnabled);
return;
case RHD_POWER_RESET:
RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x00003E3E);
@@ -1363,7 +1384,6 @@ RHDLVTMAInit(RHDPtr rhdPtr, CARD8 Type)
} else {
struct rhdTMDSBPrivate *Private = xnfcalloc(sizeof(struct
rhdTMDSBPrivate), 1);
- int from;
Output->Name = "TMDS B";
@@ -1379,21 +1399,7 @@ RHDLVTMAInit(RHDPtr rhdPtr, CARD8 Type)
Output->Private = Private;
Private->RunsDualLink = FALSE;
- from = X_CONFIG;
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- Private->Coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- Private->Coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- Private->Coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to
%scoherent\n",Output->Name,Private->Coherent ? "" : "in");
+ Private->Coherent = FALSE;
}
return Output;
diff --git a/src/rhd_output.c b/src/rhd_output.c
index 22804dc..7fe2ee9 100644
--- a/src/rhd_output.c
+++ b/src/rhd_output.c
@@ -205,3 +205,59 @@ RHDOutputPrintSensedType(struct rhdOutput *Output)
i++;
}
}
+
+/*
+ * Attach an connector to the specified output and set output properties
depending on the connector
+ */
+void
+RHDOutputAttachConnector(struct rhdOutput *Output, struct rhdConnector
*Connector)
+{
+ RHDPtr rhdPtr = RHDPTRI(Output);
+
+ if(Output->Connector == Connector)
+ return; /* output is allready attached to this connector -> nothing
todo */
+
+ Output->Connector = Connector;
+
+ if(!Output->Property) /* property controll available? */
+ return; /* no -> we are done here */
+
+ /* yes -> check if we need to set any properties */
+ if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_COHERENT, NULL))
{
+ union rhdPropertyData val;
+ switch(RhdParseBooleanOption(&rhdPtr->coherent, Connector->Name)) {
+ case RHD_OPTION_NOT_SET:
+ /* for compatibility with old implementation, test also output
name */
+ switch(RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
+ case RHD_OPTION_NOT_SET:
+ case RHD_OPTION_DEFAULT:
+ case RHD_OPTION_OFF:
+ val.Bool = FALSE;
+ break;
+ case RHD_OPTION_ON:
+ val.Bool = TRUE;
+ break;
+ }
+ break;
+ case RHD_OPTION_DEFAULT:
+ case RHD_OPTION_OFF:
+ val.Bool = FALSE;
+ break;
+ case RHD_OPTION_ON:
+ val.Bool = TRUE;
+ break;
+ }
+ if(Output->Property(Output, rhdPropertySet, RHD_OUTPUT_COHERENT, &val))
+ xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Setting %s to %scoherent\n",
Output->Name, val.Bool ? "" : "in");
+ else
+ xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Failed to set %s to
%scoherent\n", Output->Name, val.Bool ? "" : "in");
+ }
+
+ /* ask attached connector if EEDID or config options say we should enable
HDMI */
+ if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_HDMI, NULL)) {
+ union rhdPropertyData val;
+ val.Bool = RHDConnectorEnableHDMI(Connector);
+ if(!Output->Property(Output, rhdPropertySet, RHD_OUTPUT_HDMI, &val))
+ xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Failed to %s HDMI on
%s\n", val.Bool ? "disable" : "enable", Output->Name);
+ }
+}
diff --git a/src/rhd_output.h b/src/rhd_output.h
index 66ace35..22edfe9 100644
--- a/src/rhd_output.h
+++ b/src/rhd_output.h
@@ -58,7 +58,8 @@ typedef enum rhdSensedOutput {
enum rhdOutputProperty {
RHD_OUTPUT_BACKLIGHT,
- RHD_OUTPUT_COHERENT
+ RHD_OUTPUT_COHERENT,
+ RHD_OUTPUT_HDMI
};
enum rhdOutputAllocation {
@@ -113,6 +114,7 @@ void RHDOutputsSave(RHDPtr rhdPtr);
void RHDOutputsRestore(RHDPtr rhdPtr);
void RHDOutputsDestroy(RHDPtr rhdPtr);
void RHDOutputPrintSensedType(struct rhdOutput *Output);
+void RHDOutputAttachConnector(struct rhdOutput *Output, struct rhdConnector
*Connector);
/* output local functions. */
struct rhdOutput *RHDDACAInit(RHDPtr rhdPtr);
diff --git a/src/rhd_randr.c b/src/rhd_randr.c
index 954afe9..0493dfc 100644
--- a/src/rhd_randr.c
+++ b/src/rhd_randr.c
@@ -118,9 +118,11 @@ struct rhdRandrCrtc {
#define ATOM_PANNING_AREA "_PanningArea"
#define ATOM_BACKLIGHT "_Backlight"
#define ATOM_COHERENT "_Coherent"
+#define ATOM_HDMI "_HDMI"
static Atom atom_SignalFormat, atom_ConnectorType, atom_ConnectorNumber,
- atom_OutputNumber, atom_PanningArea, atom_Backlight, atom_Coherent;
+ atom_OutputNumber, atom_PanningArea, atom_Backlight, atom_Coherent,
+ atom_HdmiProperty;
static Atom atom_unknown, atom_VGA, atom_TMDS, atom_LVDS, atom_DisplayPort,
atom_TV;
static Atom atom_DVI, atom_DVII, atom_DVID, atom_DVIA, atom_HDMI, atom_Panel;
@@ -660,6 +662,31 @@ rhdRROutputCreateResources(xf86OutputPtr out)
__func__, err);
}
}
+ if (rout->Output->Property(rout->Output, rhdPropertyCheck,
RHD_OUTPUT_HDMI, NULL)) {
+ atom_HdmiProperty = MakeAtom(ATOM_HDMI, sizeof(ATOM_HDMI)-1, TRUE);
+
+ range[0] = 0;
+ range[1] = 1;
+ err = RRConfigureOutputProperty(out->randr_output,
atom_HdmiProperty,
+ FALSE, TRUE, FALSE, 2, range);
+ if (err != 0)
+ xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR,
+ "RRConfigureOutputProperty error: %d\n", err);
+ else {
+ union rhdPropertyData val;
+
+ if (!rout->Output->Property(rout->Output, rhdPropertyGet,
RHD_OUTPUT_HDMI, &val))
+ val.Bool = 1;
+ err = RRChangeOutputProperty(out->randr_output,
atom_HdmiProperty,
+ XA_INTEGER, 32, PropModeReplace,
+ 1, &val.Bool, FALSE, FALSE);
+ if (err != 0)
+ xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR,
+ "In %s RRChangeOutputProperty error: %d\n",
+ __func__, err);
+ }
+ }
+
}
}
@@ -998,7 +1025,7 @@ rhdRROutputCommit(xf86OutputPtr out)
ASSERT(rhdCrtc == rout->Output->Crtc);
rout->Output->Active = TRUE;
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */
rout->Output->Power(rout->Output, RHD_POWER_ON);
/* Some outputs may have physical protocol changes (e.g. TV) */
@@ -1058,7 +1085,7 @@ rhdRROutputDetect(xf86OutputPtr output)
/* Assume that a panel is always connected */
if (rout->Connector->Type == RHD_CONNECTOR_PANEL) {
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */
return XF86OutputStatusConnected;
} else if (rout->Connector->Type == RHD_CONNECTOR_TV) /* until TV_OUT is
fixed we bail here */
return XF86OutputStatusDisconnected;
@@ -1074,7 +1101,7 @@ rhdRROutputDetect(xf86OutputPtr output)
= rout->Output->Sense(rout->Output,
rout->Connector)) !=
RHD_SENSED_NONE) {
RHDOutputPrintSensedType(rout->Output);
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /*
@@@ */
return XF86OutputStatusConnected;
} else
return XF86OutputStatusDisconnected;
@@ -1086,7 +1113,7 @@ rhdRROutputDetect(xf86OutputPtr output)
* is attached to this one */
if (rhdRROtherOutputOnConnectorHelper(rhdPtr, rout))
return XF86OutputStatusDisconnected;
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@
*/
return XF86OutputStatusConnected;
}
} else {
@@ -1103,8 +1130,8 @@ rhdRROutputDetect(xf86OutputPtr output)
= rout->Output->Sense(rout->Output,
rout->Connector);
if (rout->Output->SensedType != RHD_SENSED_NONE) {
- rout->Output->Connector = rout->Connector; /* @@@ */
RHDOutputPrintSensedType(rout->Output);
+ RHDOutputAttachConnector(rout->Output,
rout->Connector); /* @@@ */
return XF86OutputStatusConnected;
}
}
@@ -1119,8 +1146,8 @@ rhdRROutputDetect(xf86OutputPtr output)
rout->Output->SensedType
= rout->Output->Sense(rout->Output, rout->Connector);
if (rout->Output->SensedType != RHD_SENSED_NONE) {
- rout->Output->Connector = rout->Connector; /* @@@ */
RHDOutputPrintSensedType(rout->Output);
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /*
@@@ */
return XF86OutputStatusConnected;
} else
return XF86OutputStatusDisconnected;
@@ -1140,7 +1167,7 @@ rhdRROutputDetect(xf86OutputPtr output)
rout_tmp->Output->Name);
return XF86OutputStatusDisconnected;
}
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@
*/
return XF86OutputStatusConnected;
} else {
RHDDebug(rout->Output->scrnIndex, "DDC Probing for Output %s
returned disconnected\n",
@@ -1148,7 +1175,7 @@ rhdRROutputDetect(xf86OutputPtr output)
return XF86OutputStatusDisconnected;
}
}
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */
return XF86OutputStatusUnknown;
}
}
@@ -1313,8 +1340,10 @@ rhdRROutputSetProperty(xf86OutputPtr out, Atom property,
if (rout->Output->Property) {
union rhdPropertyData val;
val.integer = *(int*)(value->data);
- return rout->Output->Property(rout->Output, rhdPropertySet,
- RHD_OUTPUT_BACKLIGHT, &val);
+ if(rout->Output->Property(rout->Output, rhdPropertySet,
+ RHD_OUTPUT_BACKLIGHT, &val))
+ return rout->Output->Property(rout->Output, rhdPropertyCommit,
+ RHD_OUTPUT_BACKLIGHT, NULL);
}
return FALSE;
} else if (property == atom_Coherent) {
@@ -1325,8 +1354,24 @@ rhdRROutputSetProperty(xf86OutputPtr out, Atom property,
if (rout->Output->Property) {
union rhdPropertyData val;
val.Bool = *(int*)(value->data);
- return rout->Output->Property(rout->Output, rhdPropertySet,
- RHD_OUTPUT_COHERENT, &val);
+ if(rout->Output->Property(rout->Output, rhdPropertySet,
+ RHD_OUTPUT_COHERENT, &val))
+ return rout->Output->Property(rout->Output, rhdPropertyCommit,
+ RHD_OUTPUT_COHERENT, NULL);
+ }
+ return FALSE;
+ } else if (property == atom_HdmiProperty) {
+ if (value->type != XA_INTEGER || value->format != 32) {
+ xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: wrong value\n",
__func__);
+ return FALSE;
+ }
+ if (rout->Output->Property) {
+ union rhdPropertyData val;
+ val.Bool = *(int*)(value->data);
+ if(rout->Output->Property(rout->Output, rhdPropertySet,
+ RHD_OUTPUT_HDMI, &val))
+ return rout->Output->Property(rout->Output, rhdPropertyCommit,
+ RHD_OUTPUT_HDMI, NULL);
}
return FALSE;
}
diff --git a/src/rhd_tmds.c b/src/rhd_tmds.c
index 0e3124e..8540969 100644
--- a/src/rhd_tmds.c
+++ b/src/rhd_tmds.c
@@ -56,6 +56,7 @@ struct rhdTMDSPrivate {
Bool RunsDualLink;
DisplayModePtr Mode;
Bool Coherent;
+ Bool HdmiEnabled;
int PowerState;
struct rhdHdmi *Hdmi;
@@ -242,18 +243,21 @@ TMDSAPropertyControl(struct rhdOutput *Output,
RHDFUNC(Output);
switch (Action) {
case rhdPropertyCheck:
- switch (Property) {
- case RHD_OUTPUT_COHERENT:
- return TRUE;
- default:
- return FALSE;
- }
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
+ return TRUE;
+ default:
+ return FALSE;
+ }
case rhdPropertyGet:
switch (Property) {
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
- break;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = Private->HdmiEnabled;
+ return TRUE;
default:
return FALSE;
}
@@ -262,6 +266,18 @@ TMDSAPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ Private->HdmiEnabled = val->Bool;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -391,10 +407,7 @@ TMDSAPower(struct rhdOutput *Output, int Power)
} else
RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x0000001F,
0x00001F1F);
- if(Output->Connector != NULL &&
RHDConnectorEnableHDMI(Output->Connector))
- RHDHdmiEnable(Private->Hdmi, TRUE);
- else
- RHDHdmiEnable(Private->Hdmi, FALSE);
+ RHDHdmiEnable(Private->Hdmi, Private->HdmiEnabled);
Private->PowerState = RHD_POWER_ON;
return;
@@ -519,7 +532,6 @@ RHDTMDSAInit(RHDPtr rhdPtr)
{
struct rhdOutput *Output;
struct rhdTMDSPrivate *Private;
- int from;
RHDFUNC(rhdPtr);
@@ -540,21 +552,7 @@ RHDTMDSAInit(RHDPtr rhdPtr)
Private = xnfcalloc(sizeof(struct rhdTMDSPrivate), 1);
Private->RunsDualLink = FALSE;
- from = X_CONFIG;
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- Private->Coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- Private->Coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- Private->Coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to
%scoherent\n",Output->Name,Private->Coherent ? "" : "in");
+ Private->Coherent = FALSE;
Private->PowerState = RHD_POWER_UNKNOWN;
Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
--
1.5.6.3
Date: Thu, 25 Dec 2008 15:24:10 +0100
Subject: [PATCH] Remove no interlaced modes limitation from TMDS outputs.
This patch removes the limitation of displaying no interlaced modes from
the TMDS outputs. Since interlaced modes are just a matter of CRTC
programming this makes them work out of the box.
---
src/rhd_atomout.c | 3 ---
src/rhd_dig.c | 3 ---
src/rhd_lvtma.c | 3 ---
src/rhd_tmds.c | 3 ---
4 files changed, 0 insertions(+), 12 deletions(-)
diff --git a/src/rhd_atomout.c b/src/rhd_atomout.c
index 5ebd0ce..1d1662a 100644
--- a/src/rhd_atomout.c
+++ b/src/rhd_atomout.c
@@ -546,9 +546,6 @@ rhdAtomOutputModeValid(struct rhdOutput *Output,
DisplayModePtr Mode)
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Mode->Clock < 25000)
return MODE_CLOCK_LOW;
diff --git a/src/rhd_dig.c b/src/rhd_dig.c
index fef54cc..6cc5521 100644
--- a/src/rhd_dig.c
+++ b/src/rhd_dig.c
@@ -151,9 +151,6 @@ LVTMATransmitterModeValid(struct rhdOutput *Output,
DisplayModePtr Mode)
{
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE
&& Mode->SynthClock > 165000)
return MODE_CLOCK_HIGH;
diff --git a/src/rhd_lvtma.c b/src/rhd_lvtma.c
index 04acc3d..6603b05 100644
--- a/src/rhd_lvtma.c
+++ b/src/rhd_lvtma.c
@@ -769,9 +769,6 @@ TMDSBModeValid(struct rhdOutput *Output, DisplayModePtr
Mode)
{
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Mode->Clock < 25000)
return MODE_CLOCK_LOW;
diff --git a/src/rhd_tmds.c b/src/rhd_tmds.c
index 8540969..77529a5 100644
--- a/src/rhd_tmds.c
+++ b/src/rhd_tmds.c
@@ -134,9 +134,6 @@ TMDSAModeValid(struct rhdOutput *Output, DisplayModePtr
Mode)
{
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Mode->Clock < 25000)
return MODE_CLOCK_LOW;
--
1.5.6.3
Date: Wed, 4 Mar 2009 20:43:40 +0100
Subject: [PATCH] Fixes to the radeonhd manpage
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Christian König <deathsimple@xxxxxxxxxxx>
---
man/radeonhd.man | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/man/radeonhd.man b/man/radeonhd.man
index 794fad4..41530ab 100644
--- a/man/radeonhd.man
+++ b/man/radeonhd.man
@@ -399,13 +399,13 @@ mailing list.
.RE
.TP
.BI "Option \*qAudio\*q \*q" boolean \*q
-This option enables the audio hardware, wich is responsible for delivering
audio data
+This option enables the audio hardware, which is responsible for delivering
audio data
to the different HDMI capable conntectors and used to communicate with the
audio
driver of the operation system. The default is
.BR off .
.TP
-.BI "Option \*qHDMI\*q \*q" boolean \*q
-Possible values are "DVI-I 0", "DVI-I 1"..,"DVI-D 0","DVI-I 1",.., "all".
+.BI "Option \*qHDMI\*q \*q" string \*q
+Possible values are "DVI-I_0", "DVI-I_1"..,"DVI-D_0","DVI-I_1",.., "all".
This option enables HDMI-Audio and HDMI-Info packets on the specified
connector.
This is the only way enabling HDMI at the moment, since decoding E-EDID data
to check if monitor supports HDMI is not implemented (yet).
.TP
--
1.5.6.3
attached are 5 patches, which as far as i can see can go into mainline.
The first 4 are laying around in my personal repository for quite some
time now, and the last is a small change to the hdmi stuff in the
manpage from Rafał Miłecki.
Can anybody please commit them?
Bye, Christian.
From ede6f4273326e2e4682f9a21917bb9a5a4d0b426 Mon Sep 17 00:00:00 2001From: Christian Koenig <deathsimple@xxxxxxxxxxx>
Date: Sat, 20 Dec 2008 23:03:22 +0100
Subject: [PATCH] Update RHDAudioInit to include RS600, RS690 and RS740
RHDAudioInit decides from the chipset type if there is an audio engine.
This commit changes this test to include more chipsets. It should be
removed entirely when i figure out how to get this information from
atombios.
---
src/rhd_audio.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/rhd_audio.c b/src/rhd_audio.c
index bd2d9a8..8d8a7d1 100644
--- a/src/rhd_audio.c
+++ b/src/rhd_audio.c
@@ -165,7 +165,7 @@ RHDAudioInit(RHDPtr rhdPtr)
{
RHDFUNC(rhdPtr);
- if (rhdPtr->ChipSet >= RHD_R600) {
+ if (rhdPtr->ChipSet >= RHD_RS600) {
struct rhdAudio *Audio = (struct rhdAudio *) xnfcalloc(sizeof(struct
rhdAudio), 1);
Audio->scrnIndex = rhdPtr->scrnIndex;
--
1.5.6.3
From 88aa4245a69f3a709a3b2abf7f2f66a857bc9818 Mon Sep 17 00:00:00 2001From: Christian Koenig <deathsimple@xxxxxxxxxxx>
Date: Sat, 20 Dec 2008 23:05:27 +0100
Subject: [PATCH] Cleanup and include true/false as match in
RhdParseBooleanOption
Further improve RhdParseBooleanOption to include true/false as match,
since people seems to be used to it because of the behaviour of Boolean
options.
---
src/rhd_helper.c | 30 ++++++++++++++++++++++++------
1 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/src/rhd_helper.c b/src/rhd_helper.c
index 26f6774..0f47bba 100644
--- a/src/rhd_helper.c
+++ b/src/rhd_helper.c
@@ -120,9 +120,23 @@ RhdGetOptValString(const OptionInfoRec *table, int token,
enum rhdOptStatus
RhdParseBooleanOption(struct RHDOpt *Option, char *Name)
{
+ unsigned int i;
char* c;
char* str = strdup(Name);
+ const char* off[] = {
+ "false",
+ "off",
+ "no",
+ "0"
+ };
+ const char* on[] = {
+ "true",
+ "on",
+ "yes",
+ "1"
+ };
+
/* first fixup the name to match the randr names */
for (c = str; *c; c++)
if (isspace(*c))
@@ -146,12 +160,16 @@ RhdParseBooleanOption(struct RHDOpt *Option, char *Name)
if (isspace(*ptr) || *ptr == '=') {
ptr++;
}
- if (!strncasecmp("off",ptr,3) || !strncasecmp("0",ptr,1) ||
!strncasecmp("no",ptr,2)) {
- return RHD_OPTION_OFF;
- } else if (!strncasecmp("on",ptr,2) || !strncasecmp("1",ptr,1)
|| !strncasecmp("yes",ptr,3)) {
- return RHD_OPTION_ON;
- } else
- return RHD_OPTION_DEFAULT;
+
+ for(i=0; i<sizeof(on)/sizeof(char*); i++)
+ if (!strncasecmp(on[i],ptr,strlen(on[i])))
+ return RHD_OPTION_OFF;
+
+ for(i=0; i<sizeof(off)/sizeof(char*); i++)
+ if (!strncasecmp(off[i],ptr,strlen(off[i])))
+ return RHD_OPTION_ON;
+
+ return RHD_OPTION_DEFAULT;
} else
while (*ptr != '\0' && !isspace(*ptr))
ptr++;
--
1.5.6.3
From f2957cb1e6f7332a13be189c109101304e0bbd40 Mon Sep 17 00:00:00 2001From: Christian Koenig <deathsimple@xxxxxxxxxxx>
Date: Sat, 20 Dec 2008 23:15:14 +0100
Subject: [PATCH] Randr HDMI property
Adds an HDMI property to randr and while we are at it rework the
property handling a bit. Also adds an RHDOutputAttachConnector function
which is called every time an output <-> connection relation is changed.
---
src/rhd.h | 3 +-
src/rhd_atomout.c | 147 +++++++++++++++++++++++++++++++++-------------------
src/rhd_dig.c | 87 +++++++++++++------------------
src/rhd_driver.c | 4 +-
src/rhd_lvtma.c | 62 ++++++++++++----------
src/rhd_output.c | 56 ++++++++++++++++++++
src/rhd_output.h | 4 +-
src/rhd_randr.c | 71 +++++++++++++++++++++-----
src/rhd_tmds.c | 52 +++++++++----------
9 files changed, 310 insertions(+), 176 deletions(-)
diff --git a/src/rhd.h b/src/rhd.h
index d3ab278..5a5ef53 100644
--- a/src/rhd.h
+++ b/src/rhd.h
@@ -122,7 +122,8 @@ enum RHD_TV_MODE {
enum rhdPropertyAction {
rhdPropertyCheck,
rhdPropertyGet,
- rhdPropertySet
+ rhdPropertySet,
+ rhdPropertyCommit
};
union rhdPropertyData
diff --git a/src/rhd_atomout.c b/src/rhd_atomout.c
index 600e055..5ebd0ce 100644
--- a/src/rhd_atomout.c
+++ b/src/rhd_atomout.c
@@ -278,13 +278,14 @@ atomSetBacklightFromBIOSScratch(struct rhdOutput *Output)
*
*/
static void
-atomSetBacklight(struct rhdOutput *Output, int value)
+atomSetBacklight(struct rhdOutput *Output)
{
RHDPtr rhdPtr = RHDPTRI(Output);
+ struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
RHDFUNC(Output);
- RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlSet, &value);
+ RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlSet, &Private->BlLevel);
atomSetBacklightFromBIOSScratch(Output);
}
@@ -352,6 +353,63 @@ rhdAtomOutputSet(struct rhdOutput *Output, DisplayModePtr
Mode)
/*
*
*/
+static Bool
+atomIsHdmiEnabled(struct rhdOutput *Output)
+{
+ struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
+ switch(Output->Id) {
+ case RHD_OUTPUT_TMDSA:
+ case RHD_OUTPUT_LVTMA:
+ return Private->EncoderConfig.u.lvds2.Hdmi;
+
+ case RHD_OUTPUT_UNIPHYA:
+ case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYC:
+ case RHD_OUTPUT_UNIPHYD:
+ case RHD_OUTPUT_UNIPHYE:
+ case RHD_OUTPUT_UNIPHYF:
+ case RHD_OUTPUT_KLDSKP_LVTMA:
+ return Private->TransmitterConfig.Mode == atomHDMI &&
+ Private->EncoderConfig.u.dig.EncoderMode == atomHDMI;
+
+ default:
+ return FALSE;
+ }
+}
+
+/*
+ *
+ */
+static void
+atomSetHdmiEnabled(struct rhdOutput *Output, Bool value)
+{
+ struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
+ switch(Output->Id) {
+ case RHD_OUTPUT_TMDSA:
+ case RHD_OUTPUT_LVTMA:
+ Private->EncoderConfig.u.lvds2.Hdmi = value;
+ break;
+
+ case RHD_OUTPUT_UNIPHYA:
+ case RHD_OUTPUT_UNIPHYB:
+ case RHD_OUTPUT_UNIPHYC:
+ case RHD_OUTPUT_UNIPHYD:
+ case RHD_OUTPUT_UNIPHYE:
+ case RHD_OUTPUT_UNIPHYF:
+ case RHD_OUTPUT_KLDSKP_LVTMA:
+ Private->TransmitterConfig.Mode =
+ Private->EncoderConfig.u.dig.EncoderMode =
+ value ? atomHDMI : atomDVI;
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*
+ *
+ */
static inline void
rhdAtomOutputPower(struct rhdOutput *Output, int Power)
{
@@ -359,39 +417,9 @@ rhdAtomOutputPower(struct rhdOutput *Output, int Power)
struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *)
Output->Private;
struct atomEncoderConfig *EncoderConfig = &Private->EncoderConfig;
union AtomBiosArg data;
- Bool enableHDMI = FALSE;
RHDFUNC(Output);
- if(Output->Connector != NULL) {
- enableHDMI = RHDConnectorEnableHDMI(Output->Connector);
- switch(Output->Id) {
- case RHD_OUTPUT_TMDSA:
- case RHD_OUTPUT_LVTMA:
- if(enableHDMI && !Private->EncoderConfig.u.lvds2.Hdmi)
- Private->EncoderConfig.u.lvds2.Hdmi = TRUE;
- else if(!enableHDMI && Private->EncoderConfig.u.lvds2.Hdmi)
- Private->EncoderConfig.u.lvds2.Hdmi = FALSE;
- break;
-
- case RHD_OUTPUT_UNIPHYA:
- case RHD_OUTPUT_UNIPHYB:
- case RHD_OUTPUT_KLDSKP_LVTMA:
- if(enableHDMI && Private->TransmitterConfig.Mode == atomDVI) {
- Private->TransmitterConfig.Mode = atomHDMI;
- Private->EncoderConfig.u.dig.EncoderMode = atomHDMI;
-
- } else if(!enableHDMI && Private->TransmitterConfig.Mode ==
atomHDMI) {
- Private->TransmitterConfig.Mode = atomDVI;
- Private->EncoderConfig.u.dig.EncoderMode = atomDVI;
- }
- break;
-
- default:
- break;
- }
- }
-
data.Address = &Private->Save;
RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS,
ATOM_SET_REGISTER_LIST_LOCATION, &data);
@@ -423,7 +451,7 @@ rhdAtomOutputPower(struct rhdOutput *Output, int Power)
ERROR_MSG("rhdAtomOutputControl(atomOutputEnable)");
break;
}
- RHDHdmiEnable(Private->Hdmi, enableHDMI);
+ RHDHdmiEnable(Private->Hdmi, atomIsHdmiEnabled(Output));
break;
case RHD_POWER_RESET:
RHDDebug(Output->scrnIndex, "RHD_POWER_RESET\n");
@@ -656,7 +684,16 @@ atomLVDSPropertyControl(struct rhdOutput *Output,
return FALSE;
switch (Property) {
case RHD_OUTPUT_BACKLIGHT:
- atomSetBacklight(Output, val->integer);
+ Private->BlLevel = val->integer;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_BACKLIGHT:
+ atomSetBacklight(Output);
return TRUE;
default:
return FALSE;
@@ -678,17 +715,21 @@ atomTMDSPropertyControl(struct rhdOutput *Output,
RHDFUNC(Output);
switch (Action) {
case rhdPropertyCheck:
- switch (Property) {
- case RHD_OUTPUT_COHERENT:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
return TRUE;
- default:
- return FALSE;
- }
+ default:
+ return FALSE;
+ }
case rhdPropertyGet:
switch (Property) {
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = atomIsHdmiEnabled(Output);
+ return TRUE;
default:
return FALSE;
}
@@ -697,6 +738,18 @@ atomTMDSPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ atomSetHdmiEnabled(Output, val->Bool);
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -1004,23 +1057,9 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType
ConnectorType,
LVDSInfoRetrieve(rhdPtr, Private);
Private->Hdmi = NULL;
} else {
- int from = X_CONFIG;
TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode =
atomDVI;
TMDSInfoRetrieve(rhdPtr, Private);
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name))
{
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- Private->Coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- Private->Coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- Private->Coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to
%scoherent\n",Output->Name,Private->Coherent ? "" : "in");
+ Private->Coherent = FALSE;
Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
}
break;
diff --git a/src/rhd_dig.c b/src/rhd_dig.c
index a16e09c..fef54cc 100644
--- a/src/rhd_dig.c
+++ b/src/rhd_dig.c
@@ -162,14 +162,13 @@ LVTMATransmitterModeValid(struct rhdOutput *Output,
DisplayModePtr Mode)
}
static void
-LVDSSetBacklight(struct rhdOutput *Output, int level)
+LVDSSetBacklight(struct rhdOutput *Output)
{
struct DIGPrivate *Private = (struct DIGPrivate *) Output->Private;
+ int level = Private->BlLevel;
RHDFUNC(Output);
- Private->BlLevel = level;
-
RHDRegMask(Output, RV620_LVTMA_PWRSEQ_REF_DIV,
0x144 << LVTMA_BL_MOD_REF_DI_SHIFT,
0x7ff << LVTMA_BL_MOD_REF_DI_SHIFT);
@@ -215,7 +214,16 @@ LVDSTransmitterPropertyControl(struct rhdOutput *Output,
return FALSE;
switch (Property) {
case RHD_OUTPUT_BACKLIGHT:
- LVDSSetBacklight(Output, val->integer);
+ Private->BlLevel = val->integer;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_BACKLIGHT:
+ LVDSSetBacklight(Output);
return TRUE;
default:
return FALSE;
@@ -237,17 +245,21 @@ TMDSTransmitterPropertyControl(struct rhdOutput *Output,
RHDFUNC(Output);
switch (Action) {
case rhdPropertyCheck:
- switch (Property) {
- case RHD_OUTPUT_COHERENT:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
return TRUE;
- default:
- return FALSE;
- }
+ default:
+ return FALSE;
+ }
case rhdPropertyGet:
switch (Property) {
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = Private->EncoderMode == TMDS_HDMI;
+ return TRUE;
default:
return FALSE;
}
@@ -256,6 +268,18 @@ TMDSTransmitterPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ Private->EncoderMode = val->Bool ? TMDS_HDMI : TMDS_DVI;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -1397,20 +1421,10 @@ DigPower(struct rhdOutput *Output, int Power)
struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private;
struct transmitter *Transmitter = &Private->Transmitter;
struct encoder *Encoder = &Private->Encoder;
- Bool enableHDMI;
RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name,
rhdPowerString[Power]);
- if(Output->Connector != NULL) {
- /* check if attached monitor supports HDMI */
- enableHDMI = RHDConnectorEnableHDMI(Output->Connector);
- if (enableHDMI && Private->EncoderMode == TMDS_DVI)
- Private->EncoderMode = TMDS_HDMI;
- else if (!enableHDMI && Private->EncoderMode == TMDS_HDMI)
- Private->EncoderMode = TMDS_DVI;
- }
-
switch (Power) {
case RHD_POWER_ON:
Encoder->Power(Output, Power);
@@ -1444,6 +1458,7 @@ DigPropertyControl(struct rhdOutput *Output,
switch(Property) {
case RHD_OUTPUT_COHERENT:
case RHD_OUTPUT_BACKLIGHT:
+ case RHD_OUTPUT_HDMI:
{
if (!Private->Transmitter.Property)
return FALSE;
@@ -1629,34 +1644,6 @@ DigAllocFree(struct rhdOutput *Output, enum
rhdOutputAllocation Alloc)
/*
*
*/
-static Bool
-rhdDIGSetCoherent(RHDPtr rhdPtr,struct rhdOutput *Output)
-{
- Bool coherent = FALSE;
- int from = X_CONFIG;
-
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to %scoherent\n",
- Output->Name,coherent ? "" : "in");
-
- return coherent;
-}
-
-/*
- *
- */
#ifdef NOT_YET
static Bool
digTransmitterPropertyWrapper(struct rhdOutput *Output,
@@ -1729,7 +1716,7 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType,
CARD8 ConnectorType)
struct ATOMTransmitterPrivate *transPrivate =
(struct ATOMTransmitterPrivate
*)Private->Transmitter.Private;
struct atomTransmitterConfig *atc =
&transPrivate->atomTransmitterConfig;
- atc->Coherent = Private->Coherent = rhdDIGSetCoherent(rhdPtr,
Output);
+ atc->Coherent = Private->Coherent = FALSE;
atc->Link = atomTransLinkA;
atc->Encoder = atomEncoderNone;
if (RHDIsIGP(rhdPtr->ChipSet)) {
@@ -1774,7 +1761,7 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType,
CARD8 ConnectorType)
struct ATOMTransmitterPrivate *transPrivate =
(struct ATOMTransmitterPrivate
*)Private->Transmitter.Private;
struct atomTransmitterConfig *atc =
&transPrivate->atomTransmitterConfig;
- atc->Coherent = Private->Coherent = rhdDIGSetCoherent(rhdPtr,
Output);
+ atc->Coherent = Private->Coherent = FALSE;
atc->Link = atomTransLinkB;
atc->Encoder = atomEncoderNone;
if (RHDIsIGP(rhdPtr->ChipSet)) {
@@ -1803,7 +1790,7 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType,
CARD8 ConnectorType)
case RHD_OUTPUT_KLDSKP_LVTMA:
Output->Name = "UNIPHY_KLDSKP_LVTMA";
- Private->Coherent = rhdDIGSetCoherent(rhdPtr, Output);
+ Private->Coherent = FALSE;
Private->Transmitter.Private =
(struct LVTMATransmitterPrivate *)xnfcalloc(sizeof (struct
LVTMATransmitterPrivate), 1);
Private->Transmitter.Sense = NULL;
diff --git a/src/rhd_driver.c b/src/rhd_driver.c
index 4bd9bd9..859b99e 100644
--- a/src/rhd_driver.c
+++ b/src/rhd_driver.c
@@ -1987,7 +1987,7 @@ rhdOutputConnectorCheck(struct rhdConnector *Connector)
/* Do this before sensing as AtomBIOS sense needs this info */
if ((Output->SensedType = Output->Sense(Output, Connector)) !=
RHD_SENSED_NONE) {
RHDOutputPrintSensedType(Output);
- Output->Connector = Connector;
+ RHDOutputAttachConnector(Output, Connector);
break;
}
}
@@ -1999,7 +1999,7 @@ rhdOutputConnectorCheck(struct rhdConnector *Connector)
for (i = 0; i < 2; i++) {
Output = Connector->Output[i];
if (Output && !Output->Sense) {
- Output->Connector = Connector;
+ RHDOutputAttachConnector(Output, Connector);
break;
}
}
diff --git a/src/rhd_lvtma.c b/src/rhd_lvtma.c
index 57f384e..04acc3d 100644
--- a/src/rhd_lvtma.c
+++ b/src/rhd_lvtma.c
@@ -203,13 +203,12 @@ LVDSDebugBacklight(struct rhdOutput *Output)
*
*/
static void
-LVDSSetBacklight(struct rhdOutput *Output, int level)
+LVDSSetBacklight(struct rhdOutput *Output)
{
struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private;
+ int level = Private->BlLevel;
RHDPtr rhdPtr = RHDPTRI(Output);
- Private->BlLevel = level;
-
xf86DrvMsg(rhdPtr->scrnIndex, X_INFO,
"%s: trying to set BL_MOD_LEVEL to: %d\n",
__func__, level);
@@ -264,7 +263,18 @@ LVDSPropertyControl(struct rhdOutput *Output, enum
rhdPropertyAction Action,
case RHD_OUTPUT_BACKLIGHT:
if (Private->BlLevel < 0)
return FALSE;
- LVDSSetBacklight(Output, val->integer);
+ Private->BlLevel = val->integer;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_BACKLIGHT:
+ if (Private->BlLevel < 0)
+ return FALSE;
+ LVDSSetBacklight(Output);
break;
default:
return FALSE;
@@ -420,10 +430,7 @@ LVDSEnable(struct rhdOutput *Output)
__func__, i, (int) tmp);
}
if (Private->BlLevel >= 0) {
- union rhdPropertyData data;
- data.integer = Private->BlLevel;
- Output->Property(Output, rhdPropertySet, RHD_OUTPUT_BACKLIGHT,
- &data);
+ LVDSSetBacklight(Output);
}
}
@@ -728,6 +735,7 @@ LVDSDestroy(struct rhdOutput *Output)
struct rhdTMDSBPrivate {
Bool RunsDualLink;
Bool Coherent;
+ Bool HdmiEnabled;
DisplayModePtr Mode;
struct rhdHdmi *Hdmi;
@@ -1042,6 +1050,7 @@ TMDSBPropertyControl(struct rhdOutput *Output,
case rhdPropertyCheck:
switch (Property) {
case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
return TRUE;
default:
return FALSE;
@@ -1051,6 +1060,9 @@ TMDSBPropertyControl(struct rhdOutput *Output,
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = Private->HdmiEnabled;
+ return TRUE;
default:
return FALSE;
}
@@ -1059,6 +1071,18 @@ TMDSBPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ Private->HdmiEnabled = val->Bool;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -1177,10 +1201,7 @@ TMDSBPower(struct rhdOutput *Output, int Power)
RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001);
usleep(2);
RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000002);
- if(Output->Connector != NULL &&
RHDConnectorEnableHDMI(Output->Connector))
- RHDHdmiEnable(Private->Hdmi, TRUE);
- else
- RHDHdmiEnable(Private->Hdmi, FALSE);
+ RHDHdmiEnable(Private->Hdmi, Private->HdmiEnabled);
return;
case RHD_POWER_RESET:
RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x00003E3E);
@@ -1363,7 +1384,6 @@ RHDLVTMAInit(RHDPtr rhdPtr, CARD8 Type)
} else {
struct rhdTMDSBPrivate *Private = xnfcalloc(sizeof(struct
rhdTMDSBPrivate), 1);
- int from;
Output->Name = "TMDS B";
@@ -1379,21 +1399,7 @@ RHDLVTMAInit(RHDPtr rhdPtr, CARD8 Type)
Output->Private = Private;
Private->RunsDualLink = FALSE;
- from = X_CONFIG;
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- Private->Coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- Private->Coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- Private->Coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to
%scoherent\n",Output->Name,Private->Coherent ? "" : "in");
+ Private->Coherent = FALSE;
}
return Output;
diff --git a/src/rhd_output.c b/src/rhd_output.c
index 22804dc..7fe2ee9 100644
--- a/src/rhd_output.c
+++ b/src/rhd_output.c
@@ -205,3 +205,59 @@ RHDOutputPrintSensedType(struct rhdOutput *Output)
i++;
}
}
+
+/*
+ * Attach an connector to the specified output and set output properties
depending on the connector
+ */
+void
+RHDOutputAttachConnector(struct rhdOutput *Output, struct rhdConnector
*Connector)
+{
+ RHDPtr rhdPtr = RHDPTRI(Output);
+
+ if(Output->Connector == Connector)
+ return; /* output is allready attached to this connector -> nothing
todo */
+
+ Output->Connector = Connector;
+
+ if(!Output->Property) /* property controll available? */
+ return; /* no -> we are done here */
+
+ /* yes -> check if we need to set any properties */
+ if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_COHERENT, NULL))
{
+ union rhdPropertyData val;
+ switch(RhdParseBooleanOption(&rhdPtr->coherent, Connector->Name)) {
+ case RHD_OPTION_NOT_SET:
+ /* for compatibility with old implementation, test also output
name */
+ switch(RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
+ case RHD_OPTION_NOT_SET:
+ case RHD_OPTION_DEFAULT:
+ case RHD_OPTION_OFF:
+ val.Bool = FALSE;
+ break;
+ case RHD_OPTION_ON:
+ val.Bool = TRUE;
+ break;
+ }
+ break;
+ case RHD_OPTION_DEFAULT:
+ case RHD_OPTION_OFF:
+ val.Bool = FALSE;
+ break;
+ case RHD_OPTION_ON:
+ val.Bool = TRUE;
+ break;
+ }
+ if(Output->Property(Output, rhdPropertySet, RHD_OUTPUT_COHERENT, &val))
+ xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Setting %s to %scoherent\n",
Output->Name, val.Bool ? "" : "in");
+ else
+ xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Failed to set %s to
%scoherent\n", Output->Name, val.Bool ? "" : "in");
+ }
+
+ /* ask attached connector if EEDID or config options say we should enable
HDMI */
+ if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_HDMI, NULL)) {
+ union rhdPropertyData val;
+ val.Bool = RHDConnectorEnableHDMI(Connector);
+ if(!Output->Property(Output, rhdPropertySet, RHD_OUTPUT_HDMI, &val))
+ xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Failed to %s HDMI on
%s\n", val.Bool ? "disable" : "enable", Output->Name);
+ }
+}
diff --git a/src/rhd_output.h b/src/rhd_output.h
index 66ace35..22edfe9 100644
--- a/src/rhd_output.h
+++ b/src/rhd_output.h
@@ -58,7 +58,8 @@ typedef enum rhdSensedOutput {
enum rhdOutputProperty {
RHD_OUTPUT_BACKLIGHT,
- RHD_OUTPUT_COHERENT
+ RHD_OUTPUT_COHERENT,
+ RHD_OUTPUT_HDMI
};
enum rhdOutputAllocation {
@@ -113,6 +114,7 @@ void RHDOutputsSave(RHDPtr rhdPtr);
void RHDOutputsRestore(RHDPtr rhdPtr);
void RHDOutputsDestroy(RHDPtr rhdPtr);
void RHDOutputPrintSensedType(struct rhdOutput *Output);
+void RHDOutputAttachConnector(struct rhdOutput *Output, struct rhdConnector
*Connector);
/* output local functions. */
struct rhdOutput *RHDDACAInit(RHDPtr rhdPtr);
diff --git a/src/rhd_randr.c b/src/rhd_randr.c
index 954afe9..0493dfc 100644
--- a/src/rhd_randr.c
+++ b/src/rhd_randr.c
@@ -118,9 +118,11 @@ struct rhdRandrCrtc {
#define ATOM_PANNING_AREA "_PanningArea"
#define ATOM_BACKLIGHT "_Backlight"
#define ATOM_COHERENT "_Coherent"
+#define ATOM_HDMI "_HDMI"
static Atom atom_SignalFormat, atom_ConnectorType, atom_ConnectorNumber,
- atom_OutputNumber, atom_PanningArea, atom_Backlight, atom_Coherent;
+ atom_OutputNumber, atom_PanningArea, atom_Backlight, atom_Coherent,
+ atom_HdmiProperty;
static Atom atom_unknown, atom_VGA, atom_TMDS, atom_LVDS, atom_DisplayPort,
atom_TV;
static Atom atom_DVI, atom_DVII, atom_DVID, atom_DVIA, atom_HDMI, atom_Panel;
@@ -660,6 +662,31 @@ rhdRROutputCreateResources(xf86OutputPtr out)
__func__, err);
}
}
+ if (rout->Output->Property(rout->Output, rhdPropertyCheck,
RHD_OUTPUT_HDMI, NULL)) {
+ atom_HdmiProperty = MakeAtom(ATOM_HDMI, sizeof(ATOM_HDMI)-1, TRUE);
+
+ range[0] = 0;
+ range[1] = 1;
+ err = RRConfigureOutputProperty(out->randr_output,
atom_HdmiProperty,
+ FALSE, TRUE, FALSE, 2, range);
+ if (err != 0)
+ xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR,
+ "RRConfigureOutputProperty error: %d\n", err);
+ else {
+ union rhdPropertyData val;
+
+ if (!rout->Output->Property(rout->Output, rhdPropertyGet,
RHD_OUTPUT_HDMI, &val))
+ val.Bool = 1;
+ err = RRChangeOutputProperty(out->randr_output,
atom_HdmiProperty,
+ XA_INTEGER, 32, PropModeReplace,
+ 1, &val.Bool, FALSE, FALSE);
+ if (err != 0)
+ xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR,
+ "In %s RRChangeOutputProperty error: %d\n",
+ __func__, err);
+ }
+ }
+
}
}
@@ -998,7 +1025,7 @@ rhdRROutputCommit(xf86OutputPtr out)
ASSERT(rhdCrtc == rout->Output->Crtc);
rout->Output->Active = TRUE;
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */
rout->Output->Power(rout->Output, RHD_POWER_ON);
/* Some outputs may have physical protocol changes (e.g. TV) */
@@ -1058,7 +1085,7 @@ rhdRROutputDetect(xf86OutputPtr output)
/* Assume that a panel is always connected */
if (rout->Connector->Type == RHD_CONNECTOR_PANEL) {
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */
return XF86OutputStatusConnected;
} else if (rout->Connector->Type == RHD_CONNECTOR_TV) /* until TV_OUT is
fixed we bail here */
return XF86OutputStatusDisconnected;
@@ -1074,7 +1101,7 @@ rhdRROutputDetect(xf86OutputPtr output)
= rout->Output->Sense(rout->Output,
rout->Connector)) !=
RHD_SENSED_NONE) {
RHDOutputPrintSensedType(rout->Output);
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /*
@@@ */
return XF86OutputStatusConnected;
} else
return XF86OutputStatusDisconnected;
@@ -1086,7 +1113,7 @@ rhdRROutputDetect(xf86OutputPtr output)
* is attached to this one */
if (rhdRROtherOutputOnConnectorHelper(rhdPtr, rout))
return XF86OutputStatusDisconnected;
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@
*/
return XF86OutputStatusConnected;
}
} else {
@@ -1103,8 +1130,8 @@ rhdRROutputDetect(xf86OutputPtr output)
= rout->Output->Sense(rout->Output,
rout->Connector);
if (rout->Output->SensedType != RHD_SENSED_NONE) {
- rout->Output->Connector = rout->Connector; /* @@@ */
RHDOutputPrintSensedType(rout->Output);
+ RHDOutputAttachConnector(rout->Output,
rout->Connector); /* @@@ */
return XF86OutputStatusConnected;
}
}
@@ -1119,8 +1146,8 @@ rhdRROutputDetect(xf86OutputPtr output)
rout->Output->SensedType
= rout->Output->Sense(rout->Output, rout->Connector);
if (rout->Output->SensedType != RHD_SENSED_NONE) {
- rout->Output->Connector = rout->Connector; /* @@@ */
RHDOutputPrintSensedType(rout->Output);
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /*
@@@ */
return XF86OutputStatusConnected;
} else
return XF86OutputStatusDisconnected;
@@ -1140,7 +1167,7 @@ rhdRROutputDetect(xf86OutputPtr output)
rout_tmp->Output->Name);
return XF86OutputStatusDisconnected;
}
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@
*/
return XF86OutputStatusConnected;
} else {
RHDDebug(rout->Output->scrnIndex, "DDC Probing for Output %s
returned disconnected\n",
@@ -1148,7 +1175,7 @@ rhdRROutputDetect(xf86OutputPtr output)
return XF86OutputStatusDisconnected;
}
}
- rout->Output->Connector = rout->Connector; /* @@@ */
+ RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */
return XF86OutputStatusUnknown;
}
}
@@ -1313,8 +1340,10 @@ rhdRROutputSetProperty(xf86OutputPtr out, Atom property,
if (rout->Output->Property) {
union rhdPropertyData val;
val.integer = *(int*)(value->data);
- return rout->Output->Property(rout->Output, rhdPropertySet,
- RHD_OUTPUT_BACKLIGHT, &val);
+ if(rout->Output->Property(rout->Output, rhdPropertySet,
+ RHD_OUTPUT_BACKLIGHT, &val))
+ return rout->Output->Property(rout->Output, rhdPropertyCommit,
+ RHD_OUTPUT_BACKLIGHT, NULL);
}
return FALSE;
} else if (property == atom_Coherent) {
@@ -1325,8 +1354,24 @@ rhdRROutputSetProperty(xf86OutputPtr out, Atom property,
if (rout->Output->Property) {
union rhdPropertyData val;
val.Bool = *(int*)(value->data);
- return rout->Output->Property(rout->Output, rhdPropertySet,
- RHD_OUTPUT_COHERENT, &val);
+ if(rout->Output->Property(rout->Output, rhdPropertySet,
+ RHD_OUTPUT_COHERENT, &val))
+ return rout->Output->Property(rout->Output, rhdPropertyCommit,
+ RHD_OUTPUT_COHERENT, NULL);
+ }
+ return FALSE;
+ } else if (property == atom_HdmiProperty) {
+ if (value->type != XA_INTEGER || value->format != 32) {
+ xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: wrong value\n",
__func__);
+ return FALSE;
+ }
+ if (rout->Output->Property) {
+ union rhdPropertyData val;
+ val.Bool = *(int*)(value->data);
+ if(rout->Output->Property(rout->Output, rhdPropertySet,
+ RHD_OUTPUT_HDMI, &val))
+ return rout->Output->Property(rout->Output, rhdPropertyCommit,
+ RHD_OUTPUT_HDMI, NULL);
}
return FALSE;
}
diff --git a/src/rhd_tmds.c b/src/rhd_tmds.c
index 0e3124e..8540969 100644
--- a/src/rhd_tmds.c
+++ b/src/rhd_tmds.c
@@ -56,6 +56,7 @@ struct rhdTMDSPrivate {
Bool RunsDualLink;
DisplayModePtr Mode;
Bool Coherent;
+ Bool HdmiEnabled;
int PowerState;
struct rhdHdmi *Hdmi;
@@ -242,18 +243,21 @@ TMDSAPropertyControl(struct rhdOutput *Output,
RHDFUNC(Output);
switch (Action) {
case rhdPropertyCheck:
- switch (Property) {
- case RHD_OUTPUT_COHERENT:
- return TRUE;
- default:
- return FALSE;
- }
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
+ return TRUE;
+ default:
+ return FALSE;
+ }
case rhdPropertyGet:
switch (Property) {
case RHD_OUTPUT_COHERENT:
val->Bool = Private->Coherent;
return TRUE;
- break;
+ case RHD_OUTPUT_HDMI:
+ val->Bool = Private->HdmiEnabled;
+ return TRUE;
default:
return FALSE;
}
@@ -262,6 +266,18 @@ TMDSAPropertyControl(struct rhdOutput *Output,
switch (Property) {
case RHD_OUTPUT_COHERENT:
Private->Coherent = val->Bool;
+ break;
+ case RHD_OUTPUT_HDMI:
+ Private->HdmiEnabled = val->Bool;
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case rhdPropertyCommit:
+ switch (Property) {
+ case RHD_OUTPUT_COHERENT:
+ case RHD_OUTPUT_HDMI:
Output->Mode(Output, Private->Mode);
Output->Power(Output, RHD_POWER_ON);
break;
@@ -391,10 +407,7 @@ TMDSAPower(struct rhdOutput *Output, int Power)
} else
RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x0000001F,
0x00001F1F);
- if(Output->Connector != NULL &&
RHDConnectorEnableHDMI(Output->Connector))
- RHDHdmiEnable(Private->Hdmi, TRUE);
- else
- RHDHdmiEnable(Private->Hdmi, FALSE);
+ RHDHdmiEnable(Private->Hdmi, Private->HdmiEnabled);
Private->PowerState = RHD_POWER_ON;
return;
@@ -519,7 +532,6 @@ RHDTMDSAInit(RHDPtr rhdPtr)
{
struct rhdOutput *Output;
struct rhdTMDSPrivate *Private;
- int from;
RHDFUNC(rhdPtr);
@@ -540,21 +552,7 @@ RHDTMDSAInit(RHDPtr rhdPtr)
Private = xnfcalloc(sizeof(struct rhdTMDSPrivate), 1);
Private->RunsDualLink = FALSE;
- from = X_CONFIG;
- switch (RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) {
- case RHD_OPTION_NOT_SET:
- case RHD_OPTION_DEFAULT:
- from = X_DEFAULT;
- Private->Coherent = FALSE;
- break;
- case RHD_OPTION_ON:
- Private->Coherent = TRUE;
- break;
- case RHD_OPTION_OFF:
- Private->Coherent = FALSE;
- break;
- }
- xf86DrvMsg(rhdPtr->scrnIndex,from,"Setting %s to
%scoherent\n",Output->Name,Private->Coherent ? "" : "in");
+ Private->Coherent = FALSE;
Private->PowerState = RHD_POWER_UNKNOWN;
Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
--
1.5.6.3
From 9bfc312efc3feb2577855100efcc40cf55290f6c Mon Sep 17 00:00:00 2001From: Christian Koenig <deathsimple@xxxxxxxxxxx>
Date: Thu, 25 Dec 2008 15:24:10 +0100
Subject: [PATCH] Remove no interlaced modes limitation from TMDS outputs.
This patch removes the limitation of displaying no interlaced modes from
the TMDS outputs. Since interlaced modes are just a matter of CRTC
programming this makes them work out of the box.
---
src/rhd_atomout.c | 3 ---
src/rhd_dig.c | 3 ---
src/rhd_lvtma.c | 3 ---
src/rhd_tmds.c | 3 ---
4 files changed, 0 insertions(+), 12 deletions(-)
diff --git a/src/rhd_atomout.c b/src/rhd_atomout.c
index 5ebd0ce..1d1662a 100644
--- a/src/rhd_atomout.c
+++ b/src/rhd_atomout.c
@@ -546,9 +546,6 @@ rhdAtomOutputModeValid(struct rhdOutput *Output,
DisplayModePtr Mode)
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Mode->Clock < 25000)
return MODE_CLOCK_LOW;
diff --git a/src/rhd_dig.c b/src/rhd_dig.c
index fef54cc..6cc5521 100644
--- a/src/rhd_dig.c
+++ b/src/rhd_dig.c
@@ -151,9 +151,6 @@ LVTMATransmitterModeValid(struct rhdOutput *Output,
DisplayModePtr Mode)
{
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE
&& Mode->SynthClock > 165000)
return MODE_CLOCK_HIGH;
diff --git a/src/rhd_lvtma.c b/src/rhd_lvtma.c
index 04acc3d..6603b05 100644
--- a/src/rhd_lvtma.c
+++ b/src/rhd_lvtma.c
@@ -769,9 +769,6 @@ TMDSBModeValid(struct rhdOutput *Output, DisplayModePtr
Mode)
{
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Mode->Clock < 25000)
return MODE_CLOCK_LOW;
diff --git a/src/rhd_tmds.c b/src/rhd_tmds.c
index 8540969..77529a5 100644
--- a/src/rhd_tmds.c
+++ b/src/rhd_tmds.c
@@ -134,9 +134,6 @@ TMDSAModeValid(struct rhdOutput *Output, DisplayModePtr
Mode)
{
RHDFUNC(Output);
- if (Mode->Flags & V_INTERLACE)
- return MODE_NO_INTERLACE;
-
if (Mode->Clock < 25000)
return MODE_CLOCK_LOW;
--
1.5.6.3
From 5dd60d9bb01eb9032cac3d942090879d0a927787 Mon Sep 17 00:00:00 2001From: =?utf-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@xxxxxxxxx>
Date: Wed, 4 Mar 2009 20:43:40 +0100
Subject: [PATCH] Fixes to the radeonhd manpage
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Christian König <deathsimple@xxxxxxxxxxx>
---
man/radeonhd.man | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/man/radeonhd.man b/man/radeonhd.man
index 794fad4..41530ab 100644
--- a/man/radeonhd.man
+++ b/man/radeonhd.man
@@ -399,13 +399,13 @@ mailing list.
.RE
.TP
.BI "Option \*qAudio\*q \*q" boolean \*q
-This option enables the audio hardware, wich is responsible for delivering
audio data
+This option enables the audio hardware, which is responsible for delivering
audio data
to the different HDMI capable conntectors and used to communicate with the
audio
driver of the operation system. The default is
.BR off .
.TP
-.BI "Option \*qHDMI\*q \*q" boolean \*q
-Possible values are "DVI-I 0", "DVI-I 1"..,"DVI-D 0","DVI-I 1",.., "all".
+.BI "Option \*qHDMI\*q \*q" string \*q
+Possible values are "DVI-I_0", "DVI-I_1"..,"DVI-D_0","DVI-I_1",.., "all".
This option enables HDMI-Audio and HDMI-Info packets on the specified
connector.
This is the only way enabling HDMI at the moment, since decoding E-EDID data
to check if monitor supports HDMI is not implemented (yet).
.TP
--
1.5.6.3
| < Previous | Next > |