Am Freitag, den 28.08.2009, 11:45 +0200 schrieb Jerome Glisse:

> Patch welcome to add such options i guess we are all delaying power
> saving code to KMS as we would like to be able to change this parameter
> while the GPU is running but this is only doable with KMS as you need
> to block GPU access while changing those. But it's safe to do that on
> ddx startup in non kms world as GPU should be idle.
> 
> Range of valid values are more tricky for vram & GPU i think for vram
> it mostly depends on the chips used by the manufacturer and GPU
> frequency then need to follow some equation taking into account
> the vram frequency. So far it seems that dividing gpu/vram clock
> by the same integer is a safe choice. Note that atombios should provide
> various valid & tested gpu/vram clock but it mostly up to the
> manufacturer and many of them are lazy and don't even bother
> testing much various values.
> 
> Cheers,
> Jerome
> 

Hi,

thanks for your encouragement. As a newbie I do not want to mess up
anything in GIT so I attach the diff of my code to this mail. In this
version the driver allows the user to set any MHz value between 1/4
speed and full speed to GPU and memory independently. I also updated the
man documentation to reflect my changes. Hopefully you can apply this to
the development tree. 

Best regards.

Markus


diff -r -u xf86-video-ati/man/radeon.man mst/man/radeon.man
--- xf86-video-ati/man/radeon.man       2009-08-28 21:28:05.000000000 +0200
+++ mst/man/radeon.man  2009-08-28 21:24:52.000000000 +0200
@@ -418,10 +418,33 @@
 with this enabled.  The default is
 .B off.
 .TP
-.BI "Option \*qForceLowPowerMode\*q \*q" boolean \*q
-Enable a static low power mode.  This can help reduce heat and increase battery
-life by reducing power usage at the expense of performance. The default is
-.B off.
+.BI "Option \*qForceStaticPowerMode\*q \*q" boolean \*q
+Enable a static power mode.  This can help reduce heat and increase battery 
life
+life by reducing power usage at the expense of performance. The default is 
+.B off.
+.TP
+.BI "Option \*qForceCoreClockSpeed\*q \*q" integer \*q
+Set the GPU clock to the given speed (MHz). This value is only available
+if static power mode is enabled. The driver will check this value against lower
+(1/4 of maximum MHz) and upper bounds (maximum GPU MHz). The default value is
+.B 0
+and will set the GPU to maximum speed. Handle this parameter with care as some
+settings may freeze the display.
+.TP
+.BI "Option \*qForceMemoryClockSpeed\*q \*q" integer \*q
+Set the memory clock to the given speed (MHz). This value is only available
+if static power mode is enabled. The driver will check this value against lower
+(1/4 of maximum MHz) and upper bounds (maximum memory MHz). The default value 
is
+.B 0
+and will set the memory to maximum speed. Only cards with AtomBIOS are 
supported
+at the moment. Handle this parameter with care as some settings may freeze the
+display.
+.TP
+.BI "Option \*qForcePCIeLanes\*q \*q" integer \*q
+This option sets the active PCIe express lanes. This feature allows to safe 
power
+at the cost of reduced performancerad. Available values are 1-16. The default 
value is
+.B 0
+and will activate all available lanes. 
 .TP
 .BI "Option \*qDynamicPM\*q \*q" boolean \*q
 Enable dynamic power mode switching.  This can help reduce heat and increase 
battery
diff -r -u xf86-video-ati/src/radeon_driver.c mst/src/radeon_driver.c
--- xf86-video-ati/src/radeon_driver.c  2009-08-28 21:28:05.000000000 +0200
+++ mst/src/radeon_driver.c     2009-08-28 21:25:35.000000000 +0200
@@ -202,7 +202,10 @@
     { OPTION_EXA_VSYNC,         "EXAVSync",        OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_ATOM_TVOUT,       "ATOMTVOut",       OPTV_BOOLEAN, {0}, FALSE },
     { OPTION_R4XX_ATOM,                "R4xxATOM",        OPTV_BOOLEAN, {0}, 
FALSE },
-    { OPTION_FORCE_LOW_POWER,  "ForceLowPowerMode", OPTV_BOOLEAN, {0}, FALSE },
+    { OPTION_FORCE_STATIC_POWER,       "ForceStaticPowerMode", OPTV_BOOLEAN, 
{0}, FALSE },
+    { OPTION_FORCE_STATIC_GPU, "ForceCoreClockSpeed", OPTV_INTEGER, {0}, FALSE 
},
+    { OPTION_FORCE_STATIC_MEM, "ForceMemoryClockSpeed", OPTV_INTEGER, {0}, 
FALSE },
+    { OPTION_FORCE_STATIC_PCIE,        "ForcePCIeLanes", OPTV_INTEGER, {0}, 
FALSE },
     { OPTION_DYNAMIC_PM,       "DynamicPM",       OPTV_BOOLEAN, {0}, FALSE },
     { -1,                    NULL,               OPTV_NONE,    {0}, FALSE }
 };
diff -r -u xf86-video-ati/src/radeon.h mst/src/radeon.h
--- xf86-video-ati/src/radeon.h 2009-08-28 21:28:05.000000000 +0200
+++ mst/src/radeon.h    2009-08-28 21:25:58.000000000 +0200
@@ -218,7 +218,10 @@
     OPTION_EXA_VSYNC,
     OPTION_ATOM_TVOUT,
     OPTION_R4XX_ATOM,
-    OPTION_FORCE_LOW_POWER,
+    OPTION_FORCE_STATIC_POWER,
+    OPTION_FORCE_STATIC_GPU,
+    OPTION_FORCE_STATIC_MEM,
+    OPTION_FORCE_STATIC_PCIE,
     OPTION_DYNAMIC_PM
 } RADEONOpts;
 
@@ -455,7 +458,7 @@
 
     Bool     clock_gating_enabled;
     Bool     dynamic_mode_enabled;
-    Bool     force_low_power_enabled;
+    Bool     force_static_power_enabled;
 } RADEONPowerManagement;
 
 typedef struct _atomBiosHandle *atomBiosHandlePtr;
diff -r -u xf86-video-ati/src/radeon_pm.c mst/src/radeon_pm.c
--- xf86-video-ati/src/radeon_pm.c      2009-08-28 21:28:05.000000000 +0200
+++ mst/src/radeon_pm.c 2009-08-28 21:26:36.000000000 +0200
@@ -768,12 +768,15 @@
 
     RADEONWaitForIdleMMIO(pScrn);
 
-    if (info->IsAtomBios)
-       atombios_set_engine_clock(pScrn, info->pm.mode[i].sclk);
-    else
+    if (info->IsAtomBios) {
+        if (atombios_set_engine_clock(pScrn, info->pm.mode[i].sclk) != 
ATOM_SUCCESS) 
+         xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "set GPU clock failed\n");
+       if (atombios_set_memory_clock(pScrn, info->pm.mode[i].mclk) != 
ATOM_SUCCESS)
+         xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "set memory clock failed\n");
+    } else
        RADEONSetEngineClock(pScrn, info->pm.mode[i].sclk);
 
-    if (info->cardType == CARD_PCIE)
+    if (info->cardType == CARD_PCIE) 
        RADEONSetPCIELanes(pScrn, info->pm.mode[i].pcie_lanes);
 
     info->pm.current_mode = i;
@@ -785,6 +788,7 @@
 void RADEONPMInit(ScrnInfoPtr pScrn)
 {
     RADEONInfoPtr  info       = RADEONPTR(pScrn);
+    int ForceGPU, ForceMEM, ForcePCIe;
 
     if (xf86ReturnOptValBool(info->Options, OPTION_CLOCK_GATING, FALSE)) {
        info->pm.clock_gating_enabled = TRUE;
@@ -819,24 +823,50 @@
        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Power Management 
Disabled\n");
     }
 
-    if (xf86ReturnOptValBool(info->Options, OPTION_FORCE_LOW_POWER, FALSE)) {
-       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Force Low Power Mode Enabled\n");
-       info->pm.force_low_power_enabled = TRUE;
+    if (xf86ReturnOptValBool(info->Options, OPTION_FORCE_STATIC_POWER, FALSE)) 
{
+       
+        ForceGPU = info->pm.mode[0].sclk;
+       if (xf86GetOptValInteger(info->Options, OPTION_FORCE_STATIC_GPU, 
&ForceGPU)) {
+          ForceGPU = ForceGPU * 100;
+          if (ForceGPU < info->pm.mode[0].sclk / 4) ForceGPU = 
info->pm.mode[0].sclk / 4;
+          if (ForceGPU > info->pm.mode[0].sclk)     ForceGPU = 
info->pm.mode[0].sclk;
+        }
+
+        ForceMEM = info->pm.mode[0].mclk;
+        if (info->IsAtomBios) {
+         if (xf86GetOptValInteger(info->Options, OPTION_FORCE_STATIC_MEM, 
&ForceMEM)) {
+            ForceMEM = ForceMEM * 100;
+            if (ForceMEM < info->pm.mode[0].mclk / 4) ForceMEM = 
info->pm.mode[0].mclk / 4;
+            if (ForceMEM > info->pm.mode[0].mclk)     ForceMEM = 
info->pm.mode[0].mclk;
+         }
+       }
+
+       ForcePCIe = info->pm.mode[0].pcie_lanes;
+       if (xf86GetOptValInteger(info->Options, OPTION_FORCE_STATIC_PCIE, 
&ForcePCIe)) {
+          if (ForcePCIe < 1)  ForcePCIe = 1;
+          if (ForcePCIe > 16) ForcePCIe = 16;
+       }
+
+       xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+               "Force Static Power Mode: GPU %u MHz, Mem %u MHz, %u PCIe 
lanes\n",
+                ForceGPU / 100, ForceMEM / 100, ForcePCIe);
+
+       info->pm.force_static_power_enabled = TRUE;
        if (info->pm.dynamic_mode_enabled) {
            info->pm.mode[2].type = POWER_HIGH;
-           info->pm.mode[2].sclk = info->pm.mode[0].sclk / 2;
-           info->pm.mode[2].mclk = info->pm.mode[0].mclk / 2;
-           info->pm.mode[2].pcie_lanes = 4;
+           info->pm.mode[2].sclk = ForceGPU;
+           info->pm.mode[2].mclk = ForceMEM;
+           info->pm.mode[2].pcie_lanes = ForcePCIe;
        } else {
            info->pm.mode[1].type = POWER_HIGH;
-           info->pm.mode[1].sclk = info->pm.mode[0].sclk / 2;
-           info->pm.mode[1].mclk = info->pm.mode[0].mclk / 2;
-           info->pm.mode[1].pcie_lanes = 4;
+           info->pm.mode[1].sclk = ForceGPU;
+           info->pm.mode[1].mclk = ForceMEM;
+           info->pm.mode[1].pcie_lanes = ForcePCIe;
            info->pm.num_modes += 1;
        }
        RADEONSetStaticPowerMode(pScrn, POWER_HIGH);
     } else
-       info->pm.force_low_power_enabled = FALSE;
+       info->pm.force_static_power_enabled = FALSE;
 
     RADEONPMQuirks(pScrn);
 }
@@ -848,7 +878,7 @@
     if (info->pm.clock_gating_enabled)
        RADEONSetClockGating(pScrn, info->pm.clock_gating_enabled);
     RADEONPMQuirks(pScrn);
-    if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled)
+    if (info->pm.force_static_power_enabled || info->pm.dynamic_mode_enabled)
        RADEONSetStaticPowerMode(pScrn, POWER_HIGH);
 }
 
@@ -858,7 +888,7 @@
 
     if (info->pm.clock_gating_enabled)
        RADEONSetClockGating(pScrn, FALSE);
-    if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled)
+    if (info->pm.force_static_power_enabled || info->pm.dynamic_mode_enabled)
        RADEONSetStaticPowerMode(pScrn, POWER_DEFAULT);
 }
 
@@ -868,7 +898,7 @@
 
     if (info->pm.clock_gating_enabled)
        RADEONSetClockGating(pScrn, FALSE);
-    if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled)
+    if (info->pm.force_static_power_enabled || info->pm.dynamic_mode_enabled)
        RADEONSetStaticPowerMode(pScrn, POWER_DEFAULT);
 }
 
_______________________________________________
xorg-driver-ati mailing list
xorg-driver-ati@lists.x.org
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to