From eacc7a371519b6f82fd0b60149a2e9084b9baca5 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Oct 09 2007 17:59:57 +0000 Subject: - DDC and LVDS patches from git. --- diff --git a/radeon-git-ddc-type-6.patch b/radeon-git-ddc-type-6.patch new file mode 100644 index 0000000..b864fc3 --- /dev/null +++ b/radeon-git-ddc-type-6.patch @@ -0,0 +1,109 @@ +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 new file mode 100644 index 0000000..4dc8dec --- /dev/null +++ b/radeon-git-lvds-fixes.patch @@ -0,0 +1,141 @@ +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/xorg-x11-drv-ati.spec b/xorg-x11-drv-ati.spec index 7cc6a05..9866d6d 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: 1%{?dist} +Release: 2%{?dist} URL: http://www.x.org License: MIT Group: User Interface/X Hardware Support @@ -18,6 +18,8 @@ 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 # Rage 128 patches (100-199) @@ -41,6 +43,8 @@ X.Org X11 ati video driver. %setup -q -n %{tarball}-%{version} %patch2 -p1 -b .renderaccel +%patch3 -p1 -b .ddc +%patch4 -p1 -b .lvds %build %configure --disable-static @@ -81,6 +85,9 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man4/radeon.4* %changelog +* Tue Oct 09 2007 Adam Jackson 6.7.195-2 +- DDC and LVDS patches from git. + * Sat Oct 06 2007 Adam Jackson 6.7.195-1 - xf86-video-ati 6.7.195