summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/radeon.man14
-rw-r--r--src/radeon.h17
-rw-r--r--src/radeon_output.c124
3 files changed, 124 insertions, 31 deletions
diff --git a/man/radeon.man b/man/radeon.man
index 8f7b551c..41c72429 100644
--- a/man/radeon.man
+++ b/man/radeon.man
@@ -421,14 +421,22 @@ a powerbook or mini with DVI that does not work properly, try the alternate
.br
ibook \-\- ibooks
.br
-powerbook-duallink \-\- Powerbooks with external DVI
+powerbook-external \-\- Powerbooks with external DVI
.br
-powerbook \-\- Powerbooks with integrated DVI
+powerbook-internal \-\- Powerbooks with integrated DVI
.br
-mini \-\- Mac Mini with external DVI
+powerbook-vga \-\- Powerbooks with VGA rather than DVI
+.br
+powerbook-duallink \-\- powerbook-external alias
+.br
+powerbook \-\- powerbook-internal alias
+.br
+mini-external \-\- Mac Mini with external DVI
.br
mini-internal \-\- Mac Mini with integrated DVI
.br
+mini \-\- mini-external alias
+.br
The default value is
.B undefined.
.TP
diff --git a/src/radeon.h b/src/radeon.h
index 4180752e..f9bf3432 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -428,13 +428,19 @@ typedef enum {
CHIP_ERRATA_PLL_DELAY = 0x00000004
} RADEONErrata;
+typedef enum {
+ RADEON_SIL_164 = 0x00000001,
+ RADEON_SIL_1178 = 0x00000002
+} RADEONExtTMDSChip;
+
#if defined(__powerpc__)
typedef enum {
- RADEON_MAC_IBOOK = 0x00000001,
- RADEON_MAC_POWERBOOK_DL = 0x00000002,
- RADEON_MAC_POWERBOOK = 0x00000004,
- RADEON_MAC_MINI = 0x00000008,
- RADEON_MAC_MINI_INTERNAL = 0x00000016
+ RADEON_MAC_IBOOK = 0x00000001,
+ RADEON_MAC_POWERBOOK_EXTERNAL = 0x00000002,
+ RADEON_MAC_POWERBOOK_INTERNAL = 0x00000004,
+ RADEON_MAC_POWERBOOK_VGA = 0x00000008,
+ RADEON_MAC_MINI_EXTERNAL = 0x00000016,
+ RADEON_MAC_MINI_INTERNAL = 0x00000032
} RADEONMacModel;
#endif
@@ -827,6 +833,7 @@ typedef struct {
#if defined(__powerpc__)
RADEONMacModel MacModel;
#endif
+ RADEONExtTMDSChip ext_tmds_chip;
Rotation rotation;
void (*PointerMoved)(int, int, int);
diff --git a/src/radeon_output.c b/src/radeon_output.c
index 1645b5a4..efe093fc 100644
--- a/src/radeon_output.c
+++ b/src/radeon_output.c
@@ -218,22 +218,33 @@ RADEONRestoreDVOChip(ScrnInfoPtr pScrn, xf86OutputPtr output)
(CARD32)~(RADEON_GPIO_A_0 | RADEON_GPIO_A_1));
if (!RADEONInitExtTMDSInfoFromBIOS(output)) {
- /* do mac stuff here */
-#if defined(__powerpc__)
if (radeon_output->DVOChip) {
- switch(info->MacModel) {
- case RADEON_MAC_POWERBOOK_DL:
+ switch(info->ext_tmds_chip) {
+ case RADEON_SIL_164:
RADEONDVOWriteByte(radeon_output->DVOChip, 0x08, 0x30);
RADEONDVOWriteByte(radeon_output->DVOChip, 0x09, 0x00);
RADEONDVOWriteByte(radeon_output->DVOChip, 0x0a, 0x90);
RADEONDVOWriteByte(radeon_output->DVOChip, 0x0c, 0x89);
RADEONDVOWriteByte(radeon_output->DVOChip, 0x08, 0x3b);
break;
+#if 0
+ /* needs work see bug 10418 */
+ case RADEON_SIL_1178:
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x0f, 0x44);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x0f, 0x4c);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x0e, 0x01);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x0a, 0x80);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x09, 0x30);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x0c, 0xc9);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x0d, 0x70);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x08, 0x32);
+ RADEONDVOWriteByte(radeon_output->DVOChip, 0x08, 0x33);
+ break;
+#endif
default:
break;
}
}
-#endif
}
}
@@ -2667,7 +2678,7 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn)
info->BiosConnector[2].DDCType = DDC_NONE_DETECTED;
info->BiosConnector[2].valid = TRUE;
return TRUE;
- case RADEON_MAC_POWERBOOK_DL:
+ case RADEON_MAC_POWERBOOK_EXTERNAL:
info->BiosConnector[0].DDCType = DDC_DVI;
info->BiosConnector[0].DACType = DAC_NONE;
info->BiosConnector[0].TMDSType = TMDS_NONE;
@@ -2686,7 +2697,7 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn)
info->BiosConnector[2].DDCType = DDC_NONE_DETECTED;
info->BiosConnector[2].valid = TRUE;
return TRUE;
- case RADEON_MAC_POWERBOOK:
+ case RADEON_MAC_POWERBOOK_INTERNAL:
info->BiosConnector[0].DDCType = DDC_DVI;
info->BiosConnector[0].DACType = DAC_NONE;
info->BiosConnector[0].TMDSType = TMDS_NONE;
@@ -2705,7 +2716,26 @@ static Bool RADEONSetupAppleConnectors(ScrnInfoPtr pScrn)
info->BiosConnector[2].DDCType = DDC_NONE_DETECTED;
info->BiosConnector[2].valid = TRUE;
return TRUE;
- case RADEON_MAC_MINI:
+ case RADEON_MAC_POWERBOOK_VGA:
+ info->BiosConnector[0].DDCType = DDC_DVI;
+ info->BiosConnector[0].DACType = DAC_NONE;
+ info->BiosConnector[0].TMDSType = TMDS_NONE;
+ info->BiosConnector[0].ConnectorType = CONNECTOR_CRT;
+ 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;
+ case RADEON_MAC_MINI_EXTERNAL:
info->BiosConnector[0].DDCType = DDC_CRT2;
info->BiosConnector[0].DACType = DAC_TVDAC;
info->BiosConnector[0].TMDSType = TMDS_EXT;
@@ -2815,11 +2845,19 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn)
info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I;
info->BiosConnector[0].valid = TRUE;
+#if defined(__powerpc__)
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;
+#else
+ info->BiosConnector[1].DDCType = DDC_VGA;
+ info->BiosConnector[1].DACType = DAC_PRIMARY;
+ info->BiosConnector[1].TMDSType = TMDS_NONE;
info->BiosConnector[1].ConnectorType = CONNECTOR_CRT;
info->BiosConnector[1].valid = TRUE;
+#endif
}
}
@@ -2848,6 +2886,7 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn)
* in /proc/cpuinfo (on Linux) */
static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn)
{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
RADEONMacModel ret = 0;
#ifdef __linux__
char cpuline[50]; /* 50 should be sufficient for our purposes */
@@ -2858,23 +2897,52 @@ static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn)
* Unforunately, there doesn't seem to be any good way to figure it out.
*/
+ /*
+ * PowerBook5,[1-5]: external tmds, single-link
+ * PowerBook5,[789]: external tmds, dual-link
+ * PowerBook5,6: external tmds, single-link or dual-link
+ * need to add another option to specify the external tmds chip
+ * or find out what's used and add it.
+ */
+
+
if (f != NULL) {
while (fgets(cpuline, sizeof cpuline, f)) {
if (!strncmp(cpuline, "machine", strlen ("machine"))) {
- if (strstr(cpuline, "PowerBook5,6") ||
- strstr(cpuline, "PowerBook5,7") ||
+ if (strstr(cpuline, "PowerBook5,1") ||
+ strstr(cpuline, "PowerBook5,2") ||
+ strstr(cpuline, "PowerBook5,3") ||
+ strstr(cpuline, "PowerBook5,4") ||
+ strstr(cpuline, "PowerBook5,5")) {
+ ret = RADEON_MAC_POWERBOOK_EXTERNAL; /* single link */
+ info->ext_tmds_chip = RADEON_SIL_164; /* works on 5,2 */
+ break;
+ }
+
+ if (strstr(cpuline, "PowerBook5,6")) {
+ ret = RADEON_MAC_POWERBOOK_EXTERNAL; /* dual or single link */
+ break;
+ }
+
+ if (strstr(cpuline, "PowerBook5,7") ||
strstr(cpuline, "PowerBook5,8") ||
strstr(cpuline, "PowerBook5,9")) {
- ret = RADEON_MAC_POWERBOOK_DL;
+ ret = RADEON_MAC_POWERBOOK_EXTERNAL; /* dual link */
+ info->ext_tmds_chip = RADEON_SIL_1178; /* guess */
+ break;
+ }
+
+ if (strstr(cpuline, "PowerBook3,3")) {
+ ret = RADEON_MAC_POWERBOOK_VGA; /* vga rather than dvi */
break;
}
if (strstr(cpuline, "PowerMac10,1")) {
- ret = RADEON_MAC_MINI_INTERNAL;
+ ret = RADEON_MAC_MINI_INTERNAL; /* internal tmds */
break;
}
if (strstr(cpuline, "PowerMac10,2")) {
- ret = RADEON_MAC_MINI;
+ ret = RADEON_MAC_MINI_EXTERNAL; /* external tmds */
break;
}
} else if (!strncmp(cpuline, "detected as", strlen("detected as"))) {
@@ -2882,7 +2950,7 @@ static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn)
ret = RADEON_MAC_IBOOK;
break;
} else if (strstr(cpuline, "PowerBook")) {
- ret = RADEON_MAC_POWERBOOK_DL;
+ ret = RADEON_MAC_POWERBOOK_INTERNAL; /* internal tmds */
break;
}
@@ -2901,10 +2969,12 @@ static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn)
if (ret) {
xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Detected %s.\n",
- ret == RADEON_MAC_POWERBOOK_DL ? "PowerBook with external DVI" :
- ret == RADEON_MAC_POWERBOOK ? "PowerBook with integrated DVI" :
+ ret == RADEON_MAC_POWERBOOK_EXTERNAL ? "PowerBook with external DVI" :
+ ret == RADEON_MAC_POWERBOOK_INTERNAL ? "PowerBook with integrated DVI" :
+ ret == RADEON_MAC_POWERBOOK_VGA ? "PowerBook with VGA" :
ret == RADEON_MAC_IBOOK ? "iBook" :
- "Mac Mini");
+ ret == RADEON_MAC_MINI_EXTERNAL ? "Mac Mini with external DVI" :
+ "Mac Mini with integrated DVI");
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"If this is not correct, try Option \"MacModel\" and "
"consider reporting to the\n");
@@ -2951,14 +3021,22 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn)
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 if (!strncmp("powerbook-duallink", optstr, strlen("powerbook-duallink"))) /* alias */
+ info->MacModel = RADEON_MAC_POWERBOOK_EXTERNAL;
+ else if (!strncmp("powerbook-external", optstr, strlen("powerbook-external")))
+ info->MacModel = RADEON_MAC_POWERBOOK_EXTERNAL;
+ else if (!strncmp("powerbook-internal", optstr, strlen("powerbook-internal")))
+ info->MacModel = RADEON_MAC_POWERBOOK_INTERNAL;
+ else if (!strncmp("powerbook-vga", optstr, strlen("powerbook-vga")))
+ info->MacModel = RADEON_MAC_POWERBOOK_VGA;
+ else if (!strncmp("powerbook", optstr, strlen("powerbook"))) /* alias */
+ info->MacModel = RADEON_MAC_POWERBOOK_INTERNAL;
else if (!strncmp("mini-internal", optstr, strlen("mini-internal")))
info->MacModel = RADEON_MAC_MINI_INTERNAL;
- else if (!strncmp("mini", optstr, strlen("mini")))
- info->MacModel = RADEON_MAC_MINI;
+ else if (!strncmp("mini-external", optstr, strlen("mini-external")))
+ info->MacModel = RADEON_MAC_MINI_EXTERNAL;
+ else if (!strncmp("mini", optstr, strlen("mini"))) /* alias */
+ info->MacModel = RADEON_MAC_MINI_EXTERNAL;
else {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid Mac Model: %s\n", optstr);
}