196 lines
5.8 KiB
C
196 lines
5.8 KiB
C
|
//
|
||
|
// Module: DPMS.C
|
||
|
// Date: Aug 08, 1997
|
||
|
//
|
||
|
// Copyright (c) 1997 by ATI Technologies Inc.
|
||
|
//
|
||
|
|
||
|
/********************** PolyTron RCS Utilities
|
||
|
|
||
|
$Revision: 1.1 $
|
||
|
$Date: 21 Aug 1997 15:01:36 $
|
||
|
$Author: MACIESOW $
|
||
|
$Log: V:\source\wnt\ms11\miniport\archive\dpms.c_v $
|
||
|
*
|
||
|
* Rev 1.1 21 Aug 1997 15:01:36 MACIESOW
|
||
|
* Initial revision.
|
||
|
|
||
|
End of PolyTron RCS section *****************/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include "dderror.h"
|
||
|
#include "miniport.h"
|
||
|
#include "ntddvdeo.h"
|
||
|
#include "video.h"
|
||
|
|
||
|
#include "stdtyp.h"
|
||
|
#include "amach1.h"
|
||
|
#include "amachcx.h"
|
||
|
#include "atimp.h"
|
||
|
#include "atint.h"
|
||
|
#include "dpms.h"
|
||
|
#include "init_m.h"
|
||
|
#include "init_cx.h"
|
||
|
|
||
|
//
|
||
|
// Allow miniport to be swapped out when not needed.
|
||
|
//
|
||
|
#if defined (ALLOC_PRAGMA)
|
||
|
#pragma alloc_text (PAGE_COM, SetMonitorPowerState)
|
||
|
#pragma alloc_text (PAGE_COM, GetMonitorPowerState)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
VP_STATUS
|
||
|
SetMonitorPowerState(
|
||
|
PHW_DEVICE_EXTENSION phwDeviceExtension,
|
||
|
VIDEO_POWER_STATE VideoPowerState
|
||
|
)
|
||
|
//
|
||
|
// DESCRIPTION:
|
||
|
// Set the CRT output to the desired DPMS state under.
|
||
|
//
|
||
|
// PARAMETERS:
|
||
|
// phwDeviceExtension Points to hardware device extension structure.
|
||
|
// VideoPowerState Desired DPMS state.
|
||
|
//
|
||
|
// RETURN VALUE:
|
||
|
// Status code, NO_ERROR = OK.
|
||
|
//
|
||
|
{
|
||
|
ASSERT(phwDeviceExtension != NULL);
|
||
|
|
||
|
VideoDebugPrint((DEBUG_DETAIL, "ATI.SYS SetMonitorPowerState: Setting power state to %lu\n", VideoPowerState));
|
||
|
|
||
|
if ((VideoPowerState != VideoPowerOn) &&
|
||
|
(VideoPowerState != VideoPowerStandBy) &&
|
||
|
(VideoPowerState != VideoPowerSuspend) &&
|
||
|
(VideoPowerState != VideoPowerOff))
|
||
|
{
|
||
|
VideoDebugPrint((DEBUG_DETAIL, "ATI.SYS SetMonitorPowerState: Invalid VideoPowerState\n"));
|
||
|
return ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Different card families need different routines to set the power management state.
|
||
|
//
|
||
|
|
||
|
if (phwDeviceExtension->ModelNumber == MACH64_ULTRA)
|
||
|
{
|
||
|
VIDEO_X86_BIOS_ARGUMENTS Registers;
|
||
|
|
||
|
//
|
||
|
// Invoke the BIOS call to set the desired DPMS state. The BIOS call
|
||
|
// enumeration of DPMS states is in the same order as that in
|
||
|
// VIDEO_POWER_STATE, but it is zero-based instead of one-based.
|
||
|
//
|
||
|
VideoPortZeroMemory(&Registers, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
|
||
|
Registers.Eax = BIOS_SET_DPMS;
|
||
|
Registers.Ecx = VideoPowerState - 1;
|
||
|
VideoPortInt10(phwDeviceExtension, &Registers);
|
||
|
|
||
|
return NO_ERROR;
|
||
|
}
|
||
|
|
||
|
else if((phwDeviceExtension->ModelNumber == _8514_ULTRA) ||
|
||
|
(phwDeviceExtension->ModelNumber == GRAPHICS_ULTRA) ||
|
||
|
(phwDeviceExtension->ModelNumber == MACH32_ULTRA))
|
||
|
|
||
|
{
|
||
|
struct query_structure * pQuery =
|
||
|
(struct query_structure *) phwDeviceExtension->CardInfo;
|
||
|
|
||
|
return SetPowerManagement_m(pQuery, VideoPowerState);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
VideoDebugPrint((DEBUG_ERROR, "ATI.SYS SetMonitorPowerState: Invalid adapter type\n"));
|
||
|
ASSERT(FALSE);
|
||
|
return ERROR_INVALID_PARAMETER;
|
||
|
}
|
||
|
} // SetMonitorPowerState()
|
||
|
|
||
|
VP_STATUS
|
||
|
GetMonitorPowerState(
|
||
|
PHW_DEVICE_EXTENSION phwDeviceExtension,
|
||
|
PVIDEO_POWER_STATE pVideoPowerState
|
||
|
)
|
||
|
//
|
||
|
// DESCRIPTION:
|
||
|
// Retrieve the current CRT power state.
|
||
|
//
|
||
|
// PARAMETERS:
|
||
|
// phwDeviceExtension Points to hardware device extension structure.
|
||
|
// pVideoPowerStats Points to
|
||
|
//
|
||
|
// RETURN VALUE:
|
||
|
// Error code on error.
|
||
|
// NO_ERROR = OK, current power management state in pVideoPowerState.
|
||
|
//
|
||
|
// NOTE:
|
||
|
// The enumerations VIDEO_DEVICE_POWER_MANAGEMENT (used by GetMonitorPowerState()) and VIDEO_POWER_MANAGEMENT
|
||
|
// (used by this IOCTL) have opposite orderings (VIDEO_POWER_MANAGEMENT values increase as power consumption
|
||
|
// decreases, while VIDEO_DEVICE_POWER_MANAGEMENT values increase as power consumption increases, and has
|
||
|
// a reserved value for "state unknown"), so we can't simply add a constant to translate between them.
|
||
|
//
|
||
|
{
|
||
|
VP_STATUS vpStatus;
|
||
|
|
||
|
ASSERT(phwDeviceExtension != NULL && pVideoPowerState != NULL);
|
||
|
|
||
|
//
|
||
|
// Different card families need different routines to retrieve the power management state.
|
||
|
//
|
||
|
if (phwDeviceExtension->ModelNumber == MACH64_ULTRA)
|
||
|
*pVideoPowerState = GetPowerManagement_cx(phwDeviceExtension);
|
||
|
else
|
||
|
*pVideoPowerState = GetPowerManagement_m(phwDeviceExtension);
|
||
|
|
||
|
//
|
||
|
// VIDEO_POWER_STATE has 5 possible states and a
|
||
|
// reserved value to report that we can't read the state.
|
||
|
// Our cards support 3 levels of monitor power-down in
|
||
|
// addition to normal operation. Since the number of
|
||
|
// values which can be reported exceeds the number
|
||
|
// of states our cards can be in, we will never report
|
||
|
// one of the possible states (VPPowerDeviceD3).
|
||
|
//
|
||
|
switch (*pVideoPowerState)
|
||
|
{
|
||
|
case VideoPowerOn:
|
||
|
|
||
|
VideoDebugPrint((DEBUG_DETAIL, "ATI.SYS GetMonitorPowerState: Currently set to DPMS ON\n"));
|
||
|
vpStatus = NO_ERROR;
|
||
|
break;
|
||
|
|
||
|
case VideoPowerStandBy:
|
||
|
|
||
|
VideoDebugPrint((DEBUG_DETAIL, "ATI.SYS GetMonitorPowerState: Currently set to DPMS STAND-BY\n"));
|
||
|
vpStatus = NO_ERROR;
|
||
|
break;
|
||
|
|
||
|
case VideoPowerSuspend:
|
||
|
|
||
|
VideoDebugPrint((DEBUG_DETAIL, "ATI.SYS GetMonitorPowerState: Currently set to DPMS SUSPEND\n"));
|
||
|
vpStatus = NO_ERROR;
|
||
|
break;
|
||
|
|
||
|
case VideoPowerOff:
|
||
|
|
||
|
VideoDebugPrint((DEBUG_DETAIL, "ATI.SYS GetMonitorPowerState: Currently set to DPMS OFF\n"));
|
||
|
vpStatus = NO_ERROR;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
|
||
|
VideoDebugPrint((DEBUG_ERROR, "ATI.SYS GetMonitorPowerState: Currently set to invalid DPMS state\n"));
|
||
|
*pVideoPowerState = VideoPowerOn;
|
||
|
vpStatus = ERROR_INVALID_PARAMETER;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return vpStatus;
|
||
|
} // GetMonitorPowerState()
|