Author: daniel Date: 2003-06-14 22:58:23 -0500 (Sat, 14 Jun 2003) New Revision: 206
Modified: branches/4.3.0/sid/debian/patches/048_radeon_dpms_on_dvi_support.diff Log: patch #48 (Radeon DPMS on DVI): new patch from XFree86 Bugzilla, via Madkiss, that actually works, unlike the last, which apparently didn't. Modified: branches/4.3.0/sid/debian/patches/048_radeon_dpms_on_dvi_support.diff ============================================================================== --- branches/4.3.0/sid/debian/patches/048_radeon_dpms_on_dvi_support.diff 2003-06-14 11:00:52 UTC (rev 205) +++ branches/4.3.0/sid/debian/patches/048_radeon_dpms_on_dvi_support.diff 2003-06-15 03:58:23 UTC (rev 206) @@ -1,58 +1,31 @@ -Patch by Mike A. Harris <[EMAIL PROTECTED]> - -The following patch adds DPMS support to the radeon driver for flat panel -displays (DFP) and LCD panels. It does not affect the CRT codepath, and -has been tested on singlehead CRT systems, dualhead CRT, CRT + DFP, and -dual DFP cards Dell ships. I've tested it single and dualhead with CRTs -on Radeon 7000/7500/8500/9000/9700 for regressions and had no problems -so far. Tested with suspend/standby/off signals using "xset dpms force". - -Patch update: Version 2 (XFree86-4.3.0-ati-radeon-dpms-on-dvi-v2.patch) - -Hui Yu from ATI provided additional information about DVI vs. LCD DPMS -support and indicated the MT_LCD in my original patch was incorrect. I've -removed that for now, and will work on this some more after XFree86 4.3.0 -is officially released. - ---- xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c.ati-radeon-dpms-on-dvi 2003-02-21 15:54:52.000000000 -0500 -+++ xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c 2003-02-21 16:54:50.000000000 -0500 -@@ -6503,17 +6503,31 @@ - - if (info->accelOn) info->accel->Sync(pScrn); - -+ /* The entire DPMS code seems overly complicated to me, and perhaps -+ * could be rewritten to use DISP_PWR_MAN_DPMS instead of manually twiddling -+ * the CRTCs. This perhaps would enable DPMS to work properly on more hardware -+ * without special casing? - Mike A. Harris <[EMAIL PROTECTED]> -+ */ - if (info->FBDev) { - fbdevHWDPMSSet(pScrn, PowerManagementMode, flags); -+ } else if (info->DisplayType == MT_DFP) { -+ switch (PowerManagementMode) { -+ case DPMSModeOn: -+ OUTREG(RADEON_FP_GEN_CNTL, -+ INREG(RADEON_FP_GEN_CNTL) | (RADEON_FP_TMDS_EN | RADEON_FP_FPON)); -+ break; -+ case DPMSModeStandby: -+ case DPMSModeSuspend: -+ case DPMSModeOff: -+ OUTREG(RADEON_FP_GEN_CNTL, -+ INREG(RADEON_FP_GEN_CNTL) & ~(RADEON_FP_TMDS_EN | RADEON_FP_FPON)); -+ break; -+ } - } else { -- int mask1 = (RADEON_CRTC_DISPLAY_DIS | -- RADEON_CRTC_HSYNC_DIS | -- RADEON_CRTC_VSYNC_DIS); -- int mask2 = (RADEON_CRTC2_DISP_DIS | -- RADEON_CRTC2_VSYNC_DIS | -- RADEON_CRTC2_HSYNC_DIS); -- -- /* TODO: additional handling for LCD ? */ -+ int mask1 = (RADEON_CRTC_DISPLAY_DIS | RADEON_CRTC_HSYNC_DIS | -+ RADEON_CRTC_VSYNC_DIS); -+ int mask2 = (RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_VSYNC_DIS | -+ RADEON_CRTC2_HSYNC_DIS); - - switch (PowerManagementMode) { - case DPMSModeOn: +diff -ruN xc.old/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c +--- xc.old/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c 2003-02-25 04:50:15.000000000 +0100 ++++ xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c 2003-06-14 16:25:42.000000000 +0200 +@@ -6523,6 +6523,14 @@ + else { + if (info->Clone) + OUTREGP(RADEON_CRTC2_GEN_CNTL, 0, ~mask2); ++ if (info->DisplayType == MT_LCD) { ++ usleep(RADEONPTR(pScrn)->PanelPwrDly * 1000); ++ OUTREGP (RADEON_LVDS_GEN_CNTL, (RADEON_LVDS_ON | RADEON_LVDS_BLON), ++ ~(RADEON_LVDS_ON | RADEON_LVDS_BLON)); ++ } else if (info->DisplayType == MT_DFP) { ++ OUTREGP (RADEON_FP_GEN_CNTL, RADEON_FP_FPON | RADEON_FP_TMDS_EN, ++ ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN)); ++ } + OUTREGP(RADEON_CRTC_EXT_CNTL, 0, ~mask1); + } + break; +@@ -6569,6 +6577,12 @@ + if (info->Clone) + OUTREGP(RADEON_CRTC2_GEN_CNTL, mask2, ~mask2); + OUTREGP(RADEON_CRTC_EXT_CNTL, mask1, ~mask1); ++ if (info->DisplayType == MT_LCD) { ++ usleep(RADEONPTR(pScrn)->PanelPwrDly * 1000); ++ OUTREGP (RADEON_LVDS_GEN_CNTL, 0, ~(RADEON_LVDS_ON | RADEON_LVDS_BLON)); ++ } else if (info->DisplayType == MT_DFP) { ++ OUTREGP (RADEON_FP_GEN_CNTL, 0, ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN)); ++ } + } + break; + }