summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/radeon.man14
-rw-r--r--src/radeon.h15
-rw-r--r--src/radeon_crtc.c8
-rw-r--r--src/radeon_driver.c9
-rw-r--r--src/radeon_output.c95
5 files changed, 140 insertions, 1 deletions
diff --git a/man/radeon.man b/man/radeon.man
index 88665bf0..8217262a 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -397,6 +397,20 @@ driver defaults for each chip.
The default is
.B off
.TP
+.BI "Option \*qMacModel\*q \*q" string \*q
+.br
+Used to specify Mac models for connector tables and quirks. Only valid
+ on PowerPC.
+.br
+ibook \-\- ibooks
+.br
+powerbook-duallink \-\- Powerbooks with dual link DVI
+.br
+powerbook \-\- Powerbooks with single link DVI
+.br
+The default value is
+.B undefined.
+.TP
.SH SEE ALSO
__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), xorgconfig(__appmansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
diff --git a/src/radeon.h b/src/radeon.h
index b7a69bd7..4c995111 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -153,6 +153,9 @@ typedef enum {
OPTION_CONNECTORTABLE,
OPTION_DRI,
OPTION_DEFAULT_CONNECTOR_TABLE,
+#if defined(__powerpc__)
+ OPTION_MAC_MODEL,
+#endif
OPTION_DEFAULT_TMDS_PLL
} RADEONOpts;
@@ -423,6 +426,14 @@ typedef enum {
CHIP_ERRATA_PLL_DELAY = 0x00000004
} RADEONErrata;
+#if defined(__powerpc__)
+typedef enum {
+ RADEON_MAC_IBOOK = 0x00000001,
+ RADEON_MAC_POWERBOOK_DL = 0x00000002,
+ RADEON_MAC_POWERBOOK = 0x00000004
+} RADEONMacModel;
+#endif
+
typedef enum {
CARD_PCI,
CARD_AGP,
@@ -802,6 +813,10 @@ typedef struct {
Bool InternalTVOut;
int tvdac_use_count;
+#if defined(__powerpc__)
+ RADEONMacModel MacModel;
+#endif
+
Rotation rotation;
void (*PointerMoved)(int, int, int);
CreateScreenResourcesProcPtr CreateScreenResources;
diff --git a/src/radeon_crtc.c b/src/radeon_crtc.c
index e976e2c9..47e46f38 100644
--- a/src/radeon_crtc.c
+++ b/src/radeon_crtc.c
@@ -680,7 +680,15 @@ RADEONInitPLLRegisters(ScrnInfoPtr pScrn, RADEONInfoPtr info,
save->post_div);
save->ppll_ref_div = pll->reference_div;
+
+#if defined(__powerpc__)
+ /* apparently programming this otherwise causes a hang??? */
+ if (info->MacModel == RADEON_MAC_IBOOK)
+ save->ppll_div_3 = 0x000600ad;
+ else
+#endif
save->ppll_div_3 = (save->feedback_div | (post_div->bitvalue << 16));
+
save->htotal_cntl = 0;
save->vclk_ecp_cntl = (info->SavedReg.vclk_ecp_cntl &
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index fc0f40bf..5c2efd30 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -188,6 +188,9 @@ static const OptionInfoRec RADEONOptions[] = {
{ OPTION_CONNECTORTABLE, "ConnectorTable", OPTV_STRING, {0}, FALSE },
{ OPTION_DEFAULT_CONNECTOR_TABLE, "DefaultConnectorTable", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_DEFAULT_TMDS_PLL, "DefaultTMDSPLL", OPTV_BOOLEAN, {0}, FALSE },
+#if defined(__powerpc__)
+ { OPTION_CONNECTORTABLE, "MacModel", OPTV_STRING, {0}, FALSE },
+#endif
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -4567,6 +4570,12 @@ void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn,
unsigned char *RADEONMMIO = info->MMIO;
CARD8 pllGain;
+#if defined(__powerpc__)
+ /* apparently restoring the pll causes a hang??? */
+ if (info->MacModel == RADEON_MAC_IBOOK)
+ return;
+#endif
+
pllGain = RADEONComputePLLGain(info->pll.reference_freq,
restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK);
diff --git a/src/radeon_output.c b/src/radeon_output.c
index 168eab42..40d88731 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -2473,6 +2473,78 @@ void RADEONInitConnector(xf86OutputPtr output)
}
+#if defined(__powerpc__)
+static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+
+
+ switch (info->MacModel) {
+ case RADEON_MAC_IBOOK:
+ info->BiosConnector[0].DDCType = DDC_DVI;
+ info->BiosConnector[0].DACType = DAC_NONE;
+ info->BiosConnector[0].TMDSType = TMDS_NONE;
+ info->BiosConnector[0].ConnectorType = CONNECTOR_PROPRIETARY;
+ info->BiosConnector[0].valid = TRUE;
+
+ info->BiosConnector[1].DDCType = DDC_VGA;
+ info->BiosConnector[1].DACType = DAC_TVDAC;
+ info->BiosConnector[1].TMDSType = TMDS_NONE;
+ info->BiosConnector[1].ConnectorType = CONNECTOR_CRT;
+ info->BiosConnector[1].valid = TRUE;
+
+ info->BiosConnector[2].ConnectorType = CONNECTOR_STV;
+ info->BiosConnector[2].DACType = DAC_TVDAC;
+ info->BiosConnector[2].TMDSType = TMDS_NONE;
+ info->BiosConnector[2].DDCType = DDC_NONE_DETECTED;
+ info->BiosConnector[2].valid = TRUE;
+ return TRUE;
+ case RADEON_MAC_POWERBOOK_DL:
+ info->BiosConnector[0].DDCType = DDC_DVI;
+ info->BiosConnector[0].DACType = DAC_NONE;
+ info->BiosConnector[0].TMDSType = TMDS_NONE;
+ info->BiosConnector[0].ConnectorType = CONNECTOR_PROPRIETARY;
+ info->BiosConnector[0].valid = TRUE;
+
+ info->BiosConnector[1].DDCType = DDC_VGA;
+ info->BiosConnector[1].DACType = DAC_PRIMARY;
+ info->BiosConnector[1].TMDSType = TMDS_EXT;
+ info->BiosConnector[1].ConnectorType = CONNECTOR_DVI_I;
+ info->BiosConnector[1].valid = TRUE;
+
+ info->BiosConnector[2].ConnectorType = CONNECTOR_STV;
+ info->BiosConnector[2].DACType = DAC_TVDAC;
+ info->BiosConnector[2].TMDSType = TMDS_NONE;
+ info->BiosConnector[2].DDCType = DDC_NONE_DETECTED;
+ info->BiosConnector[2].valid = TRUE;
+ return TRUE;
+ case RADEON_MAC_POWERBOOK:
+ info->BiosConnector[0].DDCType = DDC_DVI;
+ info->BiosConnector[0].DACType = DAC_NONE;
+ info->BiosConnector[0].TMDSType = TMDS_NONE;
+ info->BiosConnector[0].ConnectorType = CONNECTOR_PROPRIETARY;
+ info->BiosConnector[0].valid = TRUE;
+
+ info->BiosConnector[1].DDCType = DDC_VGA;
+ info->BiosConnector[1].DACType = DAC_PRIMARY;
+ info->BiosConnector[1].TMDSType = TMDS_INT;
+ info->BiosConnector[1].ConnectorType = CONNECTOR_DVI_I;
+ info->BiosConnector[1].valid = TRUE;
+
+ info->BiosConnector[2].ConnectorType = CONNECTOR_STV;
+ info->BiosConnector[2].DACType = DAC_TVDAC;
+ info->BiosConnector[2].TMDSType = TMDS_NONE;
+ info->BiosConnector[2].DDCType = DDC_NONE_DETECTED;
+ info->BiosConnector[2].valid = TRUE;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+
+ return FALSE;
+}
+#endif
+
static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
@@ -2508,7 +2580,7 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn)
info->BiosConnector[1].DDCType = DDC_VGA;
info->BiosConnector[1].DACType = DAC_PRIMARY;
- info->BiosConnector[1].TMDSType = TMDS_EXT;
+ info->BiosConnector[1].TMDSType = TMDS_UNKNOWN;
info->BiosConnector[1].ConnectorType = CONNECTOR_CRT;
info->BiosConnector[1].valid = TRUE;
}
@@ -2589,6 +2661,27 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn)
info->BiosConnector[i].ConnectorType = CONNECTOR_NONE;
}
+#if defined(__powerpc__)
+ optstr = (char *)xf86GetOptValString(info->Options, OPTION_MAC_MODEL);
+
+ info->MacModel = 0;
+ if (optstr) {
+ if (!strncmp("ibook", optstr, strlen("ibook")))
+ info->MacModel = RADEON_MAC_IBOOK;
+ else if (!strncmp("powerbook-duallink", optstr, strlen("powerbook-duallink")))
+ info->MacModel = RADEON_MAC_POWERBOOK_DL;
+ else if (!strncmp("powerbook", optstr, strlen("powerbook")))
+ info->MacModel = RADEON_MAC_POWERBOOK;
+ else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid Mac Model: %s\n", optstr);
+ return FALSE;
+ }
+
+ if (!RADEONSetupAppleConnectors(pScrn))
+ RADEONSetupGenericConnectors(pScrn);
+
+ } else
+#endif
if (xf86ReturnOptValBool(info->Options, OPTION_DEFAULT_CONNECTOR_TABLE, FALSE)) {
RADEONSetupGenericConnectors(pScrn);
} else {