diff --git a/radeon-git-ddc-type-6.patch b/radeon-git-ddc-type-6.patch deleted file mode 100644 index b864fc3..0000000 --- a/radeon-git-ddc-type-6.patch +++ /dev/null @@ -1,109 +0,0 @@ -From: Dave Airlie -Date: Sat, 6 Oct 2007 10:11:19 +0000 (+1000) -Subject: radeon: add support for DDC type 6 -X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/driver/xf86-video-ati.git;a=commitdiff;h=0b03a73b7dcb4aa192c42f2a4c842d324c358122 - -radeon: add support for DDC type 6 - -thanks to arekm on xorg-devel for testing/feedback ---- - ---- a/src/radeon_bios.c -+++ b/src/radeon_bios.c -@@ -176,6 +176,9 @@ static Bool RADEONGetATOMConnectorInfoFr - case RADEON_LCD_GPIO_MASK: - info->BiosConnector[i].DDCType = DDC_LCD; - break; -+ case RADEON_MDGPIO_EN_REG: -+ info->BiosConnector[i].DDCType = DDC_GPIO; -+ break; - default: - info->BiosConnector[i].DDCType = DDC_NONE_DETECTED; - break; -@@ -277,7 +280,7 @@ static Bool RADEONGetLegacyConnectorInfo - tmp1 = RADEON_BIOS8(tmp0+2) & 0x07; - if (tmp1) { - info->BiosConnector[4].DDCType = tmp1; -- if (info->BiosConnector[4].DDCType > DDC_LCD) { -+ if (info->BiosConnector[4].DDCType > DDC_GPIO) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Unknown DDCType %d found\n", - info->BiosConnector[4].DDCType); ---- a/src/radeon_output.c -+++ b/src/radeon_output.c -@@ -75,13 +75,14 @@ const char *TMDSTypeName[4] = { - "None" - }; - --const char *DDCTypeName[6] = { -+const char *DDCTypeName[7] = { - "None", - "MONID", - "DVI_DDC", - "VGA_DDC", - "CRT2_DDC", -- "LCD_DDC" -+ "LCD_DDC", -+ "GPIO_DDC" - }; - - const char *DACTypeName[4] = { -@@ -277,7 +278,7 @@ RADEONDisplayDDCConnected(ScrnInfoPtr pS - DDCReg = radeon_output->DDCReg; - - /* Read and output monitor info using DDC2 over I2C bus */ -- if (radeon_output->pI2CBus && info->ddc2 && (DDCReg != RADEON_LCD_GPIO_MASK)) { -+ if (radeon_output->pI2CBus && info->ddc2 && (DDCReg != RADEON_LCD_GPIO_MASK) && (DDCReg != RADEON_MDGPIO_EN_REG)) { - OUTREG(DDCReg, INREG(DDCReg) & - (CARD32)~(RADEON_GPIO_A_0 | RADEON_GPIO_A_1)); - -@@ -331,7 +332,7 @@ RADEONDisplayDDCConnected(ScrnInfoPtr pS - usleep(15000); - if(*MonInfo) break; - } -- } else if (radeon_output->pI2CBus && info->ddc2 && DDCReg == RADEON_LCD_GPIO_MASK) { -+ } else if (radeon_output->pI2CBus && info->ddc2 && ((DDCReg == RADEON_LCD_GPIO_MASK) || (DDCReg == RADEON_MDGPIO_EN_REG))) { - *MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex, radeon_output->pI2CBus); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DDC2/I2C is not properly initialized\n"); -@@ -2206,6 +2207,10 @@ static void RADEONI2CGetBits(I2CBusPtr b - val = INREG(b->DriverPrivate.uval+4); - *Clock = (val & (1<<13)) != 0; - *data = (val & (1<<12)) != 0; -+ } else if (b->DriverPrivate.uval == RADEON_MDGPIO_EN_REG) { -+ val = INREG(b->DriverPrivate.uval+4); -+ *Clock = (val & (1<<19)) != 0; -+ *data = (val & (1<<18)) != 0; - } else { - val = INREG(b->DriverPrivate.uval); - *Clock = (val & RADEON_GPIO_Y_1) != 0; -@@ -2225,6 +2230,11 @@ static void RADEONI2CPutBits(I2CBusPtr b - val |= (Clock ? 0:(1<<13)); - val |= (data ? 0:(1<<12)); - OUTREG(b->DriverPrivate.uval, val); -+ } else if (b->DriverPrivate.uval == RADEON_MDGPIO_EN_REG) { -+ val = INREG(b->DriverPrivate.uval) & (CARD32)~((1<<18) | (1<<19)); -+ val |= (Clock ? 0:(1<<19)); -+ val |= (data ? 0:(1<<18)); -+ OUTREG(b->DriverPrivate.uval, val); - } else { - val = INREG(b->DriverPrivate.uval) & (CARD32)~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1); - val |= (Clock ? 0:RADEON_GPIO_EN_1); -@@ -2547,6 +2557,7 @@ void RADEONInitConnector(xf86OutputPtr o - case DDC_VGA : DDCReg = RADEON_GPIO_VGA_DDC; break; - case DDC_CRT2 : DDCReg = RADEON_GPIO_CRT2_DDC; break; - case DDC_LCD : DDCReg = RADEON_LCD_GPIO_MASK; break; -+ case DDC_GPIO : DDCReg = RADEON_MDGPIO_EN_REG; break; - default: break; - } - ---- a/src/radeon_probe.h -+++ b/src/radeon_probe.h -@@ -60,6 +60,7 @@ typedef enum - DDC_VGA, - DDC_CRT2, - DDC_LCD, -+ DDC_GPIO, - } RADEONDDCType; - - typedef enum diff --git a/radeon-git-lvds-fixes.patch b/radeon-git-lvds-fixes.patch deleted file mode 100644 index 4dc8dec..0000000 --- a/radeon-git-lvds-fixes.patch +++ /dev/null @@ -1,141 +0,0 @@ -From: Alex Deucher -Date: Sun, 7 Oct 2007 23:39:47 +0000 (-0400) -Subject: RADEON: still more LVDS fixes -X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/driver/xf86-video-ati.git;a=commitdiff;h=051435610a66735fd455bbb526fa294fcfe8c0b6 - -RADEON: still more LVDS fixes - -Seems some laptops need the native mode from the bios for -LVDS while others seem to prefer a CVT mode. Add an option -to pick the preferred mode. The default it to use the bios -table timing. ---- - ---- a/man/radeon.man -+++ b/man/radeon.man -@@ -383,6 +383,14 @@ case. This is only useful for LVDS pane - The default is - .B on. - .TP -+.BI "Option \*qLVDSBiosNativeMode\*q \*q" boolean \*q -+On some laptops, the LVDS mode from the timing tables in the bios does -+not work properly. In those cases, a CVT mode seems to work better. -+If you get a blank screen or have LVDS display problems, disable this -+option to use a CVT mode. -+The default is -+.B on. -+.TP - .BI "Option \*qDRI\*q \*q" boolean \*q - Enable DRI support. This option allows you to enable to disable the DRI. - The default is ---- a/src/radeon.h -+++ b/src/radeon.h -@@ -157,7 +157,8 @@ typedef enum { - #if defined(__powerpc__) - OPTION_MAC_MODEL, - #endif -- OPTION_DEFAULT_TMDS_PLL -+ OPTION_DEFAULT_TMDS_PLL, -+ OPTION_LVDS_BIOS_NATIVE_MODE - } RADEONOpts; - - -@@ -816,6 +817,8 @@ typedef struct { - RADEONMacModel MacModel; - #endif - -+ Bool LVDSBiosNativeMode; -+ - Rotation rotation; - void (*PointerMoved)(int, int, int); - CreateScreenResourcesProcPtr CreateScreenResources; ---- a/src/radeon_driver.c -+++ b/src/radeon_driver.c -@@ -190,6 +190,7 @@ static const OptionInfoRec RADEONOptions - #if defined(__powerpc__) - { OPTION_MAC_MODEL, "MacModel", OPTV_STRING, {0}, FALSE }, - #endif -+ { OPTION_LVDS_BIOS_NATIVE_MODE, "LVDSBiosNativeMode", OPTV_BOOLEAN, {0}, TRUE }, - { -1, NULL, OPTV_NONE, {0}, FALSE } - }; - ---- a/src/radeon_modes.c -+++ b/src/radeon_modes.c -@@ -95,20 +95,45 @@ static DisplayModePtr RADEONTVModes(xf86 - static DisplayModePtr RADEONFPNativeMode(xf86OutputPtr output) - { - ScrnInfoPtr pScrn = output->scrn; -+ RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONOutputPrivatePtr radeon_output = output->driver_private; - DisplayModePtr new = NULL; -+ char stmp[32]; - - if (radeon_output->PanelXRes != 0 && - radeon_output->PanelYRes != 0 && - radeon_output->DotClock != 0) { - -- /* Add native panel size */ -- new = xf86CVTMode(radeon_output->PanelXRes, radeon_output->PanelYRes, 60.0, TRUE, FALSE); -+ if (info->LVDSBiosNativeMode) { -+ new = xnfcalloc(1, sizeof (DisplayModeRec)); -+ sprintf(stmp, "%dx%d", radeon_output->PanelXRes, radeon_output->PanelYRes); -+ new->name = xnfalloc(strlen(stmp) + 1); -+ strcpy(new->name, stmp); -+ new->HDisplay = radeon_output->PanelXRes; -+ new->VDisplay = radeon_output->PanelYRes; -+ -+ new->HTotal = new->HDisplay + radeon_output->HBlank; -+ new->HSyncStart = new->HDisplay + radeon_output->HOverPlus; -+ new->HSyncEnd = new->HSyncStart + radeon_output->HSyncWidth; -+ new->VTotal = new->VDisplay + radeon_output->VBlank; -+ new->VSyncStart = new->VDisplay + radeon_output->VOverPlus; -+ new->VSyncEnd = new->VSyncStart + radeon_output->VSyncWidth; -+ -+ new->Clock = radeon_output->DotClock; -+ new->Flags = 0; -+ -+ } else { -+ /* Add native panel size */ -+ new = xf86CVTMode(radeon_output->PanelXRes, radeon_output->PanelYRes, 60.0, FALSE, FALSE); - -- new->type = M_T_DRIVER | M_T_PREFERRED; -+ } - -- new->next = NULL; -- new->prev = NULL; -+ if (new) { -+ new->type = M_T_DRIVER | M_T_PREFERRED; -+ -+ new->next = NULL; -+ new->prev = NULL; -+ } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode: %dx%d\n", - radeon_output->PanelXRes, radeon_output->PanelYRes); -@@ -159,7 +184,7 @@ static void RADEONAddScreenModes(xf86Out - } - } - -- new = xf86CVTMode(width, height, 60.0, TRUE, FALSE); -+ new = xf86CVTMode(width, height, 60.0, FALSE, FALSE); - - new->type |= M_T_USERDEF; - ---- a/src/radeon_output.c -+++ b/src/radeon_output.c -@@ -2440,6 +2440,15 @@ RADEONGetLVDSInfo (xf86OutputPtr output) - } - } - -+ info->LVDSBiosNativeMode = TRUE; -+ if (!xf86ReturnOptValBool(info->Options, OPTION_LVDS_BIOS_NATIVE_MODE, TRUE)) { -+ info->LVDSBiosNativeMode = FALSE; -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using CVT mode for LVDS\n"); -+ } else { -+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using LVDS Native Mode\n"); -+ } -+ -+ - /* The panel size we collected from BIOS may not be the - * maximum size supported by the panel. If not, we update - * it now. These will be used if no matching mode can be diff --git a/radeon-git-upstream-fixes.patch b/radeon-git-upstream-fixes.patch new file mode 100644 index 0000000..4129eef --- /dev/null +++ b/radeon-git-upstream-fixes.patch @@ -0,0 +1,805 @@ +diff --git a/configure.ac b/configure.ac +index 5f18d2b..5216eff 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -79,7 +79,7 @@ sdkdir=$(pkg-config --variable=sdkdir xorg-server) + # Checks for header files. + AC_HEADER_STDC + +-if test "$DRI" != no; then ++if test "x$DRI" = xauto; then + AC_CHECK_FILE([${sdkdir}/dri.h], + [have_dri_h="yes"], [have_dri_h="no"]) + AC_CHECK_FILE([${sdkdir}/sarea.h], +diff --git a/man/radeon.man b/man/radeon.man +index 35dd701..9168254 100644 +--- a/man/radeon.man ++++ b/man/radeon.man +@@ -383,6 +383,14 @@ case. This is only useful for LVDS panels (laptop internal panels). + The default is + .B on. + .TP ++.BI "Option \*qLVDSBiosNativeMode\*q \*q" boolean \*q ++On some laptops, the LVDS mode from the timing tables in the bios does ++not work properly. In those cases, a CVT mode seems to work better. ++If you get a blank screen or have LVDS display problems, disable this ++option to use a CVT mode. ++The default is ++.B on. ++.TP + .BI "Option \*qDRI\*q \*q" boolean \*q + Enable DRI support. This option allows you to enable to disable the DRI. + The default is +diff --git a/src/Makefile.am b/src/Makefile.am +index 1eea432..ff1e225 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -66,6 +66,17 @@ atimisc_drv_la_SOURCES = \ + atiload.c atimisc.c atimach64probe.c $(ATIMISC_CPIO_SOURCES) \ + $(ATIMISC_DGA_SOURCES) $(ATIMISC_DRI_SRCS) $(ATIMISC_EXA_SOURCES) + ++if XSERVER_LIBPCIACCESS ++# r128 has not been ported yet ++else ++r128_drv_la_LTLIBRARIES = r128_drv.la ++r128_drv_la_LDFLAGS = -module -avoid-version ++r128_drv_ladir = @moduledir@/drivers ++r128_drv_la_SOURCES = \ ++ r128_accel.c r128_cursor.c r128_dga.c r128_driver.c \ ++ r128_video.c r128_misc.c r128_probe.c $(R128_DRI_SRCS) ++endif ++ + radeon_drv_la_LTLIBRARIES = radeon_drv.la + radeon_drv_la_LDFLAGS = -module -avoid-version + radeon_drv_ladir = @moduledir@/drivers +@@ -76,16 +87,6 @@ radeon_drv_la_SOURCES = \ + radeon_crtc.c radeon_output.c radeon_modes.c radeon_tv.c \ + $(RADEON_DRI_SRCS) $(RADEON_EXA_SOURCES) + +-if XSERVER_LIBPCIACCESS +-# r128 and theatre have not been ported yet +-else +-r128_drv_la_LTLIBRARIES = r128_drv.la +-r128_drv_la_LDFLAGS = -module -avoid-version +-r128_drv_ladir = @moduledir@/drivers +-r128_drv_la_SOURCES = \ +- r128_accel.c r128_cursor.c r128_dga.c r128_driver.c \ +- r128_video.c r128_misc.c r128_probe.c $(R128_DRI_SRCS) +- + theatre_detect_drv_la_LTLIBRARIES = theatre_detect_drv.la + theatre_detect_drv_la_LDFLAGS = -module -avoid-version + theatre_detect_drv_ladir = @moduledir@/multimedia +@@ -106,7 +107,6 @@ theatre200_drv_la_CFLAGS = \ + $(AM_CFLAGS) -DMICROC_DIR=\"$(theatre200_drv_ladir)\" + theatre200_drv_la_SOURCES = \ + theatre200.c theatre200_module.c +-endif + + EXTRA_DIST = \ + atimach64render.c \ +diff --git a/src/atiprint.c b/src/atiprint.c +index 60d9c21..3a1debb 100644 +--- a/src/atiprint.c ++++ b/src/atiprint.c +@@ -26,6 +26,7 @@ + + #include + #include ++#include + + #include "ati.h" + #include "atichip.h" +diff --git a/src/atiprobe.c b/src/atiprobe.c +index 78b3edd..38ce90d 100644 +--- a/src/atiprobe.c ++++ b/src/atiprobe.c +@@ -26,6 +26,7 @@ + + #include + #include ++#include + + #include "ati.h" + #include "atibus.h" +diff --git a/src/radeon.h b/src/radeon.h +index ad94cc5..6ee43b2 100644 +--- a/src/radeon.h ++++ b/src/radeon.h +@@ -157,7 +157,8 @@ typedef enum { + #if defined(__powerpc__) + OPTION_MAC_MODEL, + #endif +- OPTION_DEFAULT_TMDS_PLL ++ OPTION_DEFAULT_TMDS_PLL, ++ OPTION_LVDS_BIOS_NATIVE_MODE + } RADEONOpts; + + +@@ -816,6 +817,8 @@ typedef struct { + RADEONMacModel MacModel; + #endif + ++ Bool LVDSBiosNativeMode; ++ + Rotation rotation; + void (*PointerMoved)(int, int, int); + CreateScreenResourcesProcPtr CreateScreenResources; +@@ -910,6 +913,8 @@ extern void RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, + RADEONSavePtr restore); + extern void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, + RADEONSavePtr restore); ++extern void RADEONRestoreBIOSRegisters(ScrnInfoPtr pScrn, ++ RADEONSavePtr restore); + extern void RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, + RADEONSavePtr restore); + extern void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, +diff --git a/src/radeon_bios.c b/src/radeon_bios.c +index 65c2bb0..1b46746 100644 +--- a/src/radeon_bios.c ++++ b/src/radeon_bios.c +@@ -176,6 +176,9 @@ static Bool RADEONGetATOMConnectorInfoFromBIOS (ScrnInfoPtr pScrn) + case RADEON_LCD_GPIO_MASK: + info->BiosConnector[i].DDCType = DDC_LCD; + break; ++ case RADEON_MDGPIO_EN_REG: ++ info->BiosConnector[i].DDCType = DDC_GPIO; ++ break; + default: + info->BiosConnector[i].DDCType = DDC_NONE_DETECTED; + break; +@@ -254,6 +257,23 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) + info->BiosConnector[i].DDCType = DDC_MONID; + } + ++ /* XPRESS desktop chips seem to have a proprietary connector listed for ++ * DVI-D, try and do the right thing here. ++ */ ++ if ((!info->IsMobility) && ++ (info->BiosConnector[i].ConnectorType == CONNECTOR_PROPRIETARY)) { ++ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ++ "Proprietary connector found, assuming DVI-D\n"); ++ info->BiosConnector[i].DACType = DAC_NONE; ++ info->BiosConnector[i].TMDSType = TMDS_EXT; ++ info->BiosConnector[i].ConnectorType = CONNECTOR_DVI_D; ++ } ++ ++ if (info->BiosConnector[i].ConnectorType >= CONNECTOR_UNSUPPORTED) { ++ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown connector type: %d!\n", ++ info->BiosConnector[i].ConnectorType); ++ info->BiosConnector[i].valid = FALSE; ++ } + + } + } else { +@@ -277,7 +297,7 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) + tmp1 = RADEON_BIOS8(tmp0+2) & 0x07; + if (tmp1) { + info->BiosConnector[4].DDCType = tmp1; +- if (info->BiosConnector[4].DDCType > DDC_LCD) { ++ if (info->BiosConnector[4].DDCType > DDC_GPIO) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Unknown DDCType %d found\n", + info->BiosConnector[4].DDCType); +diff --git a/src/radeon_crtc.c b/src/radeon_crtc.c +index 47e46f3..eeb1c6c 100644 +--- a/src/radeon_crtc.c ++++ b/src/radeon_crtc.c +@@ -311,7 +311,7 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, + return FALSE; + } + +- save->bios_4_scratch = info->SavedReg.bios_4_scratch; ++ /*save->bios_4_scratch = info->SavedReg.bios_4_scratch;*/ + save->crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN + | RADEON_CRTC_EN + | (format << 8) +@@ -348,11 +348,10 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, + + hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; + if (!hsync_wid) hsync_wid = 1; +- if (hsync_wid > 0x3f) hsync_wid = 0x3f; + hsync_start = mode->CrtcHSyncStart - 8; + + save->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) +- | (hsync_wid << 16) ++ | ((hsync_wid & 0x3f) << 16) + | ((mode->Flags & V_NHSYNC) + ? RADEON_CRTC_H_SYNC_POL + : 0)); +@@ -363,10 +362,9 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, + + vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; + if (!vsync_wid) vsync_wid = 1; +- if (vsync_wid > 0x1f) vsync_wid = 0x1f; + + save->crtc_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff) +- | (vsync_wid << 16) ++ | ((vsync_wid & 0x1f) << 16) + | ((mode->Flags & V_NVSYNC) + ? RADEON_CRTC_V_SYNC_POL + : 0)); +@@ -545,11 +543,10 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, + + hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; + if (!hsync_wid) hsync_wid = 1; +- if (hsync_wid > 0x3f) hsync_wid = 0x3f; + hsync_start = mode->CrtcHSyncStart - 8; + + save->crtc2_h_sync_strt_wid = ((hsync_start & 0x1fff) +- | (hsync_wid << 16) ++ | ((hsync_wid & 0x3f) << 16) + | ((mode->Flags & V_NHSYNC) + ? RADEON_CRTC_H_SYNC_POL + : 0)); +@@ -560,10 +557,9 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, + + vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; + if (!vsync_wid) vsync_wid = 1; +- if (vsync_wid > 0x1f) vsync_wid = 0x1f; + + save->crtc2_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff) +- | (vsync_wid << 16) ++ | ((vsync_wid & 0x1f) << 16) + | ((mode->Flags & V_NVSYNC) + ? RADEON_CRTC2_V_SYNC_POL + : 0)); +@@ -768,6 +764,18 @@ RADEONInitPLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save, + } + + static void ++RADEONInitBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) ++{ ++ RADEONInfoPtr info = RADEONPTR(pScrn); ++ ++ /* tell the bios not to muck with the hardware on events */ ++ save->bios_4_scratch = 0; ++ save->bios_5_scratch = 0xff00; ++ save->bios_6_scratch = info->SavedReg.bios_6_scratch | 0x40000000; ++ ++} ++ ++static void + radeon_update_tv_routing(ScrnInfoPtr pScrn, RADEONSavePtr restore) + { + /* pixclks_cntl controls tv clock routing */ +@@ -813,6 +821,9 @@ radeon_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, + } + } + ++ if (info->IsMobility) ++ RADEONInitBIOSRegisters(pScrn, &info->ModeReg); ++ + ErrorF("init memmap\n"); + RADEONInitMemMapRegisters(pScrn, &info->ModeReg, info); + ErrorF("init common\n"); +@@ -868,6 +879,9 @@ radeon_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, + } + } + ++ if (info->IsMobility) ++ RADEONRestoreBIOSRegisters(pScrn, &info->ModeReg); ++ + ErrorF("restore memmap\n"); + RADEONRestoreMemMapRegisters(pScrn, &info->ModeReg); + ErrorF("restore common\n"); +diff --git a/src/radeon_driver.c b/src/radeon_driver.c +index 03f531e..40e1d98 100644 +--- a/src/radeon_driver.c ++++ b/src/radeon_driver.c +@@ -190,6 +190,7 @@ static const OptionInfoRec RADEONOptions[] = { + #if defined(__powerpc__) + { OPTION_MAC_MODEL, "MacModel", OPTV_STRING, {0}, FALSE }, + #endif ++ { OPTION_LVDS_BIOS_NATIVE_MODE, "LVDSBiosNativeMode", OPTV_BOOLEAN, {0}, TRUE }, + { -1, NULL, OPTV_NONE, {0}, FALSE } + }; + +@@ -4235,14 +4236,27 @@ void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) + + if (info->IsMobility) { + OUTREG(RADEON_LVDS_GEN_CNTL, restore->lvds_gen_cntl); +- OUTREG(RADEON_LVDS_PLL_CNTL, restore->lvds_pll_cntl); +- /*OUTREG(RADEON_BIOS_4_SCRATCH, restore->bios_4_scratch); +- OUTREG(RADEON_BIOS_5_SCRATCH, restore->bios_5_scratch); +- OUTREG(RADEON_BIOS_6_SCRATCH, restore->bios_6_scratch);*/ ++ OUTREG(RADEON_LVDS_PLL_CNTL, restore->lvds_pll_cntl); + } + + } + ++void RADEONRestoreBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) ++{ ++ RADEONInfoPtr info = RADEONPTR(pScrn); ++ unsigned char *RADEONMMIO = info->MMIO; ++ CARD32 bios_6_scratch = INREG(RADEON_BIOS_6_SCRATCH); ++ ++ OUTREG(RADEON_BIOS_4_SCRATCH, restore->bios_4_scratch); ++ OUTREG(RADEON_BIOS_5_SCRATCH, restore->bios_5_scratch); ++ if (restore->bios_6_scratch & 0x40000000) ++ bios_6_scratch |= 0x40000000; ++ else ++ bios_6_scratch &= ~0x40000000; ++ OUTREG(RADEON_BIOS_6_SCRATCH, bios_6_scratch); ++ ++} ++ + /* Write to TV FIFO RAM */ + static void RADEONWriteTVFIFO(ScrnInfoPtr pScrn, CARD16 addr, + CARD32 value) +@@ -5082,6 +5096,16 @@ static void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) + + } + ++static void RADEONSaveBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) ++{ ++ RADEONInfoPtr info = RADEONPTR(pScrn); ++ unsigned char *RADEONMMIO = info->MMIO; ++ ++ save->bios_4_scratch = INREG(RADEON_BIOS_4_SCRATCH); ++ save->bios_5_scratch = INREG(RADEON_BIOS_5_SCRATCH); ++ save->bios_6_scratch = INREG(RADEON_BIOS_6_SCRATCH); ++} ++ + /* Read flat panel registers */ + static void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) + { +@@ -5096,9 +5120,6 @@ static void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) + save->lvds_pll_cntl = INREG(RADEON_LVDS_PLL_CNTL); + save->tmds_pll_cntl = INREG(RADEON_TMDS_PLL_CNTL); + save->tmds_transmitter_cntl= INREG(RADEON_TMDS_TRANSMITTER_CNTL); +- save->bios_4_scratch = INREG(RADEON_BIOS_4_SCRATCH); +- save->bios_5_scratch = INREG(RADEON_BIOS_5_SCRATCH); +- save->bios_6_scratch = INREG(RADEON_BIOS_6_SCRATCH); + + if (info->ChipFamily == CHIP_FAMILY_RV280) { + /* bit 22 of TMDS_PLL_CNTL is read-back inverted */ +@@ -5325,7 +5346,7 @@ static void RADEONSave(ScrnInfoPtr pScrn) + vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE); /* Save mode only */ + # else + /* Save mode * & fonts & cmap */ +- vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS); ++ vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); + # endif + vgaHWLock(hwp); + } +@@ -5340,6 +5361,7 @@ static void RADEONSave(ScrnInfoPtr pScrn) + RADEONSavePLLRegisters(pScrn, save); + RADEONSaveCrtcRegisters(pScrn, save); + RADEONSaveFPRegisters(pScrn, save); ++ RADEONSaveBIOSRegisters(pScrn, save); + RADEONSaveDACRegisters(pScrn, save); + if (pRADEONEnt->HasCRTC2) { + RADEONSaveCrtc2Registers(pScrn, save); +@@ -5386,6 +5408,7 @@ void RADEONRestore(ScrnInfoPtr pScrn) + RADEONRestorePLL2Registers(pScrn, restore); + } + ++ RADEONRestoreBIOSRegisters(pScrn, restore); + RADEONRestoreCrtcRegisters(pScrn, restore); + RADEONRestorePLLRegisters(pScrn, restore); + RADEONRestoreRMXRegisters(pScrn, restore); +@@ -5417,7 +5440,7 @@ void RADEONRestore(ScrnInfoPtr pScrn) + */ + vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE ); + # else +- vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS ); ++ vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_ALL ); + # endif + vgaHWLock(hwp); + } +diff --git a/src/radeon_modes.c b/src/radeon_modes.c +index ea2c229..e01c1e1 100644 +--- a/src/radeon_modes.c ++++ b/src/radeon_modes.c +@@ -95,20 +95,45 @@ static DisplayModePtr RADEONTVModes(xf86OutputPtr output) + static DisplayModePtr RADEONFPNativeMode(xf86OutputPtr output) + { + ScrnInfoPtr pScrn = output->scrn; ++ RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONOutputPrivatePtr radeon_output = output->driver_private; + DisplayModePtr new = NULL; ++ char stmp[32]; + + if (radeon_output->PanelXRes != 0 && + radeon_output->PanelYRes != 0 && + radeon_output->DotClock != 0) { + +- /* Add native panel size */ +- new = xf86CVTMode(radeon_output->PanelXRes, radeon_output->PanelYRes, 60.0, TRUE, FALSE); ++ if (info->LVDSBiosNativeMode) { ++ new = xnfcalloc(1, sizeof (DisplayModeRec)); ++ sprintf(stmp, "%dx%d", radeon_output->PanelXRes, radeon_output->PanelYRes); ++ new->name = xnfalloc(strlen(stmp) + 1); ++ strcpy(new->name, stmp); ++ new->HDisplay = radeon_output->PanelXRes; ++ new->VDisplay = radeon_output->PanelYRes; + +- new->type = M_T_DRIVER | M_T_PREFERRED; ++ new->HTotal = new->HDisplay + radeon_output->HBlank; ++ new->HSyncStart = new->HDisplay + radeon_output->HOverPlus; ++ new->HSyncEnd = new->HSyncStart + radeon_output->HSyncWidth; ++ new->VTotal = new->VDisplay + radeon_output->VBlank; ++ new->VSyncStart = new->VDisplay + radeon_output->VOverPlus; ++ new->VSyncEnd = new->VSyncStart + radeon_output->VSyncWidth; + +- new->next = NULL; +- new->prev = NULL; ++ new->Clock = radeon_output->DotClock; ++ new->Flags = 0; ++ ++ } else { ++ /* Add native panel size */ ++ new = xf86CVTMode(radeon_output->PanelXRes, radeon_output->PanelYRes, 60.0, FALSE, FALSE); ++ ++ } ++ ++ if (new) { ++ new->type = M_T_DRIVER | M_T_PREFERRED; ++ ++ new->next = NULL; ++ new->prev = NULL; ++ } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode: %dx%d\n", + radeon_output->PanelXRes, radeon_output->PanelYRes); +@@ -159,7 +184,7 @@ static void RADEONAddScreenModes(xf86OutputPtr output, DisplayModePtr *modeList) + } + } + +- new = xf86CVTMode(width, height, 60.0, TRUE, FALSE); ++ new = xf86CVTMode(width, height, 60.0, FALSE, FALSE); + + new->type |= M_T_USERDEF; + +@@ -199,11 +224,13 @@ RADEONProbeOutputModes(xf86OutputPtr output) + + if (output->status == XF86OutputStatusConnected) { + if (radeon_output->type == OUTPUT_DVI || radeon_output->type == OUTPUT_VGA) { +- edid_mon = xf86OutputGetEDID (output, radeon_output->pI2CBus); +- xf86OutputSetEDID (output, edid_mon); ++ if (output->MonInfo) { ++ edid_mon = xf86OutputGetEDID (output, radeon_output->pI2CBus); ++ xf86OutputSetEDID (output, edid_mon); + +- modes = xf86OutputGetEDIDModes (output); +- return modes; ++ modes = xf86OutputGetEDIDModes (output); ++ return modes; ++ } + } + if (radeon_output->type == OUTPUT_STV || radeon_output->type == OUTPUT_CTV) { + modes = RADEONTVModes(output); +diff --git a/src/radeon_output.c b/src/radeon_output.c +index a6da78e..e2f26e7 100644 +--- a/src/radeon_output.c ++++ b/src/radeon_output.c +@@ -75,13 +75,14 @@ const char *TMDSTypeName[4] = { + "None" + }; + +-const char *DDCTypeName[6] = { ++const char *DDCTypeName[7] = { + "None", + "MONID", + "DVI_DDC", + "VGA_DDC", + "CRT2_DDC", +- "LCD_DDC" ++ "LCD_DDC", ++ "GPIO_DDC" + }; + + const char *DACTypeName[4] = { +@@ -277,7 +278,7 @@ RADEONDisplayDDCConnected(ScrnInfoPtr pScrn, xf86OutputPtr output) + DDCReg = radeon_output->DDCReg; + + /* Read and output monitor info using DDC2 over I2C bus */ +- if (radeon_output->pI2CBus && info->ddc2 && (DDCReg != RADEON_LCD_GPIO_MASK)) { ++ if (radeon_output->pI2CBus && info->ddc2 && (DDCReg != RADEON_LCD_GPIO_MASK) && (DDCReg != RADEON_MDGPIO_EN_REG)) { + OUTREG(DDCReg, INREG(DDCReg) & + (CARD32)~(RADEON_GPIO_A_0 | RADEON_GPIO_A_1)); + +@@ -331,7 +332,7 @@ RADEONDisplayDDCConnected(ScrnInfoPtr pScrn, xf86OutputPtr output) + usleep(15000); + if(*MonInfo) break; + } +- } else if (radeon_output->pI2CBus && info->ddc2 && DDCReg == RADEON_LCD_GPIO_MASK) { ++ } else if (radeon_output->pI2CBus && info->ddc2 && ((DDCReg == RADEON_LCD_GPIO_MASK) || (DDCReg == RADEON_MDGPIO_EN_REG))) { + *MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex, radeon_output->pI2CBus); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DDC2/I2C is not properly initialized\n"); +@@ -669,9 +670,19 @@ static RADEONMonitorType RADEONPortCheckNonDDC(ScrnInfoPtr pScrn, xf86OutputPtr + RADEONOutputPrivatePtr radeon_output = output->driver_private; + RADEONMonitorType MonType = MT_NONE; + +- + if (radeon_output->type == OUTPUT_LVDS) { +- MonType = MT_LCD; ++#if defined(__powerpc__) ++ /* not sure on ppc, OF? */ ++#else ++ if (!info->IsAtomBios) { ++ /* see if the lid is closed -- only works at boot */ ++ if (INREG(RADEON_BIOS_6_SCRATCH) & 0x10) ++ MonType = MT_NONE; ++ else ++ MonType = MT_LCD; ++ } else ++#endif ++ MonType = MT_LCD; + } else if (radeon_output->type == OUTPUT_DVI) { + if (radeon_output->TMDSType == TMDS_INT) { + if (INREG(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE) +@@ -765,10 +776,14 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, + } + } + +- /* update clock for LVDS always and DFP if RMX is active */ +- if ((radeon_output->MonType == MT_LCD) || +- ((radeon_output->MonType == MT_DFP) && +- (radeon_output->Flags & RADEON_USE_RMX))) { ++ /* update timing for LVDS and DFP if RMX is active */ ++ if (radeon_output->Flags & RADEON_USE_RMX) { ++ adjusted_mode->CrtcHTotal = mode->CrtcHDisplay + radeon_output->HBlank; ++ adjusted_mode->CrtcHSyncStart = mode->CrtcHDisplay + radeon_output->HOverPlus; ++ adjusted_mode->CrtcHSyncEnd = mode->CrtcHSyncStart + radeon_output->HSyncWidth; ++ adjusted_mode->CrtcVTotal = mode->CrtcVDisplay + radeon_output->VBlank; ++ adjusted_mode->CrtcVSyncStart = mode->CrtcVDisplay + radeon_output->VOverPlus; ++ adjusted_mode->CrtcVSyncEnd = mode->CrtcVSyncStart + radeon_output->VSyncWidth; + adjusted_mode->Clock = radeon_output->DotClock; + adjusted_mode->Flags = radeon_output->Flags; + } +@@ -1636,6 +1651,16 @@ radeon_detect(xf86OutputPtr output) + break; + } + ++ if (!connected) { ++ /* default to unknown for flaky chips/connectors ++ * so we can get something on the screen ++ */ ++ if (((radeon_output->type == OUTPUT_VGA || radeon_output->type == OUTPUT_DVI) && ++ radeon_output->DACType == DAC_TVDAC) || ++ (info->IsIGP && radeon_output->type == OUTPUT_DVI)) ++ return XF86OutputStatusUnknown; ++ } ++ + if (connected) + return XF86OutputStatusConnected; + else +@@ -1911,7 +1936,7 @@ radeon_create_resources(xf86OutputPtr output) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "RRConfigureOutputProperty error, %d\n", err); + } +- /* Set the current value of the backlight property */ ++ /* Set the current value of the property */ + switch (radeon_output->default_tvStd) { + case TV_STD_PAL: + s = "pal"; +@@ -2081,47 +2106,23 @@ radeon_set_property(xf86OutputPtr output, Atom property, + return FALSE; + s = (char*)value->data; + if (value->size == strlen("ntsc") && !strncmp("ntsc", s, strlen("ntsc"))) { +- if (radeon_output->SupportedTVStds & TV_STD_NTSC) { +- radeon_output->tvStd = TV_STD_NTSC; +- return TRUE; +- } else { +- return FALSE; +- } ++ radeon_output->tvStd = TV_STD_NTSC; ++ return TRUE; + } else if (value->size == strlen("pal") && !strncmp("pal", s, strlen("pal"))) { +- if (radeon_output->SupportedTVStds & TV_STD_PAL) { +- radeon_output->tvStd = TV_STD_PAL; +- return TRUE; +- } else { +- return FALSE; +- } ++ radeon_output->tvStd = TV_STD_PAL; ++ return TRUE; + } else if (value->size == strlen("pal-m") && !strncmp("pal-m", s, strlen("pal-m"))) { +- if (radeon_output->SupportedTVStds & TV_STD_PAL_M) { +- radeon_output->tvStd = TV_STD_PAL_M; +- return TRUE; +- } else { +- return FALSE; +- } ++ radeon_output->tvStd = TV_STD_PAL_M; ++ return TRUE; + } else if (value->size == strlen("pal-60") && !strncmp("pal-60", s, strlen("pal-60"))) { +- if (radeon_output->SupportedTVStds & TV_STD_PAL_60) { +- radeon_output->tvStd = TV_STD_PAL_60; +- return TRUE; +- } else { +- return FALSE; +- } ++ radeon_output->tvStd = TV_STD_PAL_60; ++ return TRUE; + } else if (value->size == strlen("ntsc-j") && !strncmp("ntsc-j", s, strlen("ntsc-j"))) { +- if (radeon_output->SupportedTVStds & TV_STD_NTSC_J) { +- radeon_output->tvStd = TV_STD_NTSC_J; +- return TRUE; +- } else { +- return FALSE; +- } ++ radeon_output->tvStd = TV_STD_NTSC_J; ++ return TRUE; + } else if (value->size == strlen("scart-pal") && !strncmp("scart-pal", s, strlen("scart-pal"))) { +- if (radeon_output->SupportedTVStds & TV_STD_SCART_PAL) { +- radeon_output->tvStd = TV_STD_SCART_PAL; +- return TRUE; +- } else { +- return FALSE; +- } ++ radeon_output->tvStd = TV_STD_SCART_PAL; ++ return TRUE; + } + return FALSE; + } +@@ -2206,6 +2207,10 @@ static void RADEONI2CGetBits(I2CBusPtr b, int *Clock, int *data) + val = INREG(b->DriverPrivate.uval+4); + *Clock = (val & (1<<13)) != 0; + *data = (val & (1<<12)) != 0; ++ } else if (b->DriverPrivate.uval == RADEON_MDGPIO_EN_REG) { ++ val = INREG(b->DriverPrivate.uval+4); ++ *Clock = (val & (1<<19)) != 0; ++ *data = (val & (1<<18)) != 0; + } else { + val = INREG(b->DriverPrivate.uval); + *Clock = (val & RADEON_GPIO_Y_1) != 0; +@@ -2225,6 +2230,11 @@ static void RADEONI2CPutBits(I2CBusPtr b, int Clock, int data) + val |= (Clock ? 0:(1<<13)); + val |= (data ? 0:(1<<12)); + OUTREG(b->DriverPrivate.uval, val); ++ } else if (b->DriverPrivate.uval == RADEON_MDGPIO_EN_REG) { ++ val = INREG(b->DriverPrivate.uval) & (CARD32)~((1<<18) | (1<<19)); ++ val |= (Clock ? 0:(1<<19)); ++ val |= (data ? 0:(1<<18)); ++ OUTREG(b->DriverPrivate.uval, val); + } else { + val = INREG(b->DriverPrivate.uval) & (CARD32)~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1); + val |= (Clock ? 0:RADEON_GPIO_EN_1); +@@ -2430,6 +2440,15 @@ RADEONGetLVDSInfo (xf86OutputPtr output) + } + } + ++ info->LVDSBiosNativeMode = TRUE; ++ if (!xf86ReturnOptValBool(info->Options, OPTION_LVDS_BIOS_NATIVE_MODE, TRUE)) { ++ info->LVDSBiosNativeMode = FALSE; ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using CVT mode for LVDS\n"); ++ } else { ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using LVDS Native Mode\n"); ++ } ++ ++ + /* The panel size we collected from BIOS may not be the + * maximum size supported by the panel. If not, we update + * it now. These will be used if no matching mode can be +@@ -2547,6 +2566,7 @@ void RADEONInitConnector(xf86OutputPtr output) + case DDC_VGA : DDCReg = RADEON_GPIO_VGA_DDC; break; + case DDC_CRT2 : DDCReg = RADEON_GPIO_CRT2_DDC; break; + case DDC_LCD : DDCReg = RADEON_LCD_GPIO_MASK; break; ++ case DDC_GPIO : DDCReg = RADEON_MDGPIO_EN_REG; break; + default: break; + } + +@@ -2791,6 +2811,78 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn) + + } + ++#if defined(__powerpc__) ++ ++/* ++ * Returns RADEONMacModel or 0 based on lines 'detected as' and 'machine' ++ * in /proc/cpuinfo (on Linux) */ ++static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn) ++{ ++ RADEONMacModel ret = 0; ++#ifdef __linux__ ++ char cpuline[50]; /* 50 should be sufficient for our purposes */ ++ FILE *f = fopen ("/proc/cpuinfo", "r"); ++ ++ if (f != NULL) { ++ while (fgets(cpuline, sizeof cpuline, f)) { ++ if (!strncmp(cpuline, "machine", strlen ("machine"))) { ++ if (strstr(cpuline, "PowerBook5,6") || ++ strstr(cpuline, "PowerBook5,7") || ++ strstr(cpuline, "PowerBook5,8") || ++ strstr(cpuline, "PowerBook5,9")) { ++ ret = RADEON_MAC_POWERBOOK_DL; ++ break; ++ } ++ ++ if (strstr(cpuline, "PowerMac10,1") || ++ strstr(cpuline, "PowerMac10,2")) { ++ ret = RADEON_MAC_MINI; ++ break; ++ } ++ } else if (!strncmp(cpuline, "detected as", strlen("detected as"))) { ++ if (strstr(cpuline, "iBook")) { ++ ret = RADEON_MAC_IBOOK; ++ break; ++ } else if (strstr(cpuline, "PowerBook")) { ++ ret = RADEON_MAC_POWERBOOK_DL; ++ break; ++ } ++ ++ /* No known PowerMac model detected */ ++ break; ++ } ++ } ++ ++ fclose (f); ++ } else ++ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ++ "Cannot detect PowerMac model because /proc/cpuinfo not " ++ "readable.\n"); ++ ++#endif /* __linux */ ++ ++ if (ret) { ++ xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Detected %s.\n", ++ ret == RADEON_MAC_POWERBOOK_DL ? "PowerBook with dual link DVI" : ++ ret == RADEON_MAC_POWERBOOK ? "PowerBook with single link DVI" : ++ ret == RADEON_MAC_IBOOK ? "iBook" : ++ "Mac Mini"); ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "If this is not correct, try Option \"MacModel\" and " ++ "consider reporting to the\n"); ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, ++ "xorg-driver-ati@lists.x.org mailing list" ++#ifdef __linux__ ++ " with the contents of /proc/cpuinfo" ++#endif ++ ".\n"); ++ } ++ ++ return ret; ++} ++ ++#endif /* __powerpc__ */ ++ + /* + * initialise the static data sos we don't have to re-do at randr change */ + Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) +@@ -2816,9 +2908,8 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) + } + + #if defined(__powerpc__) +- optstr = (char *)xf86GetOptValString(info->Options, OPTION_MAC_MODEL); +- + info->MacModel = 0; ++ optstr = (char *)xf86GetOptValString(info->Options, OPTION_MAC_MODEL); + if (optstr) { + if (!strncmp("ibook", optstr, strlen("ibook"))) + info->MacModel = RADEON_MAC_IBOOK; +@@ -2830,12 +2921,16 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) + info->MacModel = RADEON_MAC_MINI; + else { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid Mac Model: %s\n", optstr); +- return FALSE; + } ++ } ++ ++ if (!info->MacModel) { ++ info->MacModel = RADEONDetectMacModel(pScrn); ++ } + ++ if (info->MacModel){ + if (!RADEONSetupAppleConnectors(pScrn)) + RADEONSetupGenericConnectors(pScrn); +- + } else + #endif + if (xf86ReturnOptValBool(info->Options, OPTION_DEFAULT_CONNECTOR_TABLE, FALSE)) { +diff --git a/src/radeon_probe.h b/src/radeon_probe.h +index dbd50d7..66ece94 100644 +--- a/src/radeon_probe.h ++++ b/src/radeon_probe.h +@@ -60,6 +60,7 @@ typedef enum + DDC_VGA, + DDC_CRT2, + DDC_LCD, ++ DDC_GPIO, + } RADEONDDCType; + + typedef enum diff --git a/xorg-x11-drv-ati.spec b/xorg-x11-drv-ati.spec index 9866d6d..d1d55ef 100644 --- a/xorg-x11-drv-ati.spec +++ b/xorg-x11-drv-ati.spec @@ -5,7 +5,7 @@ Summary: Xorg X11 ati video driver Name: xorg-x11-drv-ati Version: 6.7.195 -Release: 2%{?dist} +Release: 3%{?dist} URL: http://www.x.org License: MIT Group: User Interface/X Hardware Support @@ -18,8 +18,7 @@ Source3: radeon.xinf # Radeon patches (0-99) Patch2: radeon-6.6.3-renderaccel-buglet.patch -Patch3: radeon-git-ddc-type-6.patch -Patch4: radeon-git-lvds-fixes.patch +Patch3: radeon-git-upstream-fixes.patch # Rage 128 patches (100-199) @@ -43,8 +42,7 @@ X.Org X11 ati video driver. %setup -q -n %{tarball}-%{version} %patch2 -p1 -b .renderaccel -%patch3 -p1 -b .ddc -%patch4 -p1 -b .lvds +%patch3 -p1 -b .fixes %build %configure --disable-static @@ -85,6 +83,9 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man4/radeon.4* %changelog +* Tue Oct 16 2007 Dave Airlie 6.7.195-3 +- upstream fixes including previous patches + attempted mac detection + * Tue Oct 09 2007 Adam Jackson 6.7.195-2 - DDC and LVDS patches from git.