VESA driver does not seem to work with DPMS

Kan-I Jyo cecilhsujp at gmail.com
Wed Feb 18 03:22:07 PST 2009


2009/2/18 Rene Rebe <rene at exactcode.de>:
>
> On 18.02.2009, at 05:28, Kan-I Jyo wrote:
>
>> Dear list,
>>
>> On one of my machines it is loaded with X.org 7.1 with vesa driver 1.2.1.
>>
>> In order to reduce the power consumption, it is set in xorg.conf to turn
>> off
>> the monitor if in idle for a period of time(10 minutes here).
>>
>> However, if using vesa driver, the setting does not seem to work while it
>> takes effect when switching to the intel driver.
>>
>> At the same time, the "$ xset dpms force standby" command brings the
>> monitor into standby mode with intel driver while it triggers no
>> difference
>> with the vesa driver.
>>
>> Is is a know limitation of the vesa driver or it is fixed in a recent
>> version?
>>
>> Any comment would be greatly appreciated.
>
> The xf86-video-vesa driver does implement DPMS (according to the
> code), however the actual availability and functionality depends on your
> card's BIOS, so it might often not be available or simple be defunct.
>
> --
>  René Rebe - ExactCODE GmbH - Europe, Germany, Berlin
>  http://exactcode.de | http://t2-project.org | http://rene.rebe.name
>
>

Dear Rene,

Thank you for your prompt reply.

I have taken a look at the vesa codes as well.
It seems that vesa driver before version 2.1.0 use a more direct
way to trigger the DPMS event, which does not seem to work on
all hardware, just like you have metioned.

And I guess that might be the reason why it does not work
on my machine.

<snip from src/vesa.c>
... snip ...
static void
VESADisplayPowerManagementSet(ScrnInfoPtr pScrn, int mode,
                int flags)
{
    VESAPtr pVesa = VESAGetRec(pScrn);
    unsigned char seq1 = 0, crtc17 = 0;

    if (!pScrn->vtSema)
    return;

    switch (mode) {
    case DPMSModeOn:
        /* Screen: On; HSync: On, VSync: On */
        seq1 = 0x00;
        crtc17 = 0x80;
        break;
    case DPMSModeStandby:
        /* Screen: Off; HSync: Off, VSync: On -- Not Supported */
        seq1 = 0x20;
        crtc17 = 0x80;
        break;
    case DPMSModeSuspend:
        /* Screen: Off; HSync: On, VSync: Off -- Not Supported */
        seq1 = 0x20;
        crtc17 = 0x80;
        break;
    case DPMSModeOff:
        /* Screen: Off; HSync: Off, VSync: Off */
        seq1 = 0x20;
        crtc17 = 0x00;
        break;
    }
    WriteSeq(0x00, 0x01);         /* Synchronous Reset */
    seq1 |= ReadSeq(pVesa, 0x01) & ~0x20;
    WriteSeq(0x01, seq1);
    crtc17 |= ReadCrtc(pVesa, 0x17) & ~0x80;
    usleep(10000);
    WriteCrtc(0x17, crtc17);
    WriteSeq(0x00, 0x03);         /* End Reset */
}
... snip ...
<ends here>


Since 2.1.0 (according to the git log from freedesktop.org), it seems that
vesa driver now depending on VBE service to trigger the DPMS events.

http://cgit.freedesktop.org/xorg/driver/xf86-video-vesa/diff/?id=ea57dcf423ebc3cb24060eebfc1943703448c320

By loading the latest 2.2.0 vesa driver (which is just released several
hours ago), it looks like the new way works well here.
However, the "BlankTime" option in xorg.conf doe not seem to have
any effect comparing to the intel driver.

Might be another limitation?
-- 
Sincerely,

Jyo



More information about the xorg mailing list