diff options
-rw-r--r-- | man/radeon.man | 8 | ||||
-rw-r--r-- | src/radeon.h | 5 | ||||
-rw-r--r-- | src/radeon_driver.c | 1 | ||||
-rw-r--r-- | src/radeon_modes.c | 37 | ||||
-rw-r--r-- | src/radeon_output.c | 9 |
5 files changed, 53 insertions, 7 deletions
diff --git a/man/radeon.man b/man/radeon.man index 35dd7010..9168254b 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/radeon.h b/src/radeon.h index ad94cc51..7248291f 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; diff --git a/src/radeon_driver.c b/src/radeon_driver.c index 03f531e9..ffd48a5c 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 } }; diff --git a/src/radeon_modes.c b/src/radeon_modes.c index ea2c2291..6252ea05 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; diff --git a/src/radeon_output.c b/src/radeon_output.c index 8f9135d8..08360052 100644 --- 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 |