windows-nt/Source/XPSP1/NT/drivers/video/ms/ati/mini/dpms.c

196 lines
5.8 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//
// 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()