mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
4.0 KiB
205 lines
4.0 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ospower.c
|
|
|
|
Abstract:
|
|
|
|
This module abstracts the power information structures to each of the
|
|
OSes
|
|
|
|
Author:
|
|
|
|
Stephane Plante (splante)
|
|
|
|
Environment:
|
|
|
|
NT Kernel Model Driver only
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
PACPI_POWER_INFO
|
|
OSPowerFindPowerInfo(
|
|
PNSOBJ AcpiObject
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Return the Power Information (which contains the device state and the
|
|
device dependencies)
|
|
|
|
Arguments:
|
|
|
|
AcpiObject - The NameSpace object that we want to know about
|
|
|
|
Return Value:
|
|
|
|
PACPI_POWER_INFO
|
|
|
|
--*/
|
|
{
|
|
KIRQL oldIrql;
|
|
PDEVICE_EXTENSION deviceExtension;
|
|
|
|
ASSERT( AcpiObject != NULL);
|
|
|
|
//
|
|
// Grab the spinlock
|
|
//
|
|
KeAcquireSpinLock( &AcpiDeviceTreeLock, &oldIrql );
|
|
|
|
//
|
|
// Check for the case that there is no device object associated with
|
|
// this AcpiObject - can happen if there is no HID associated with
|
|
// the device in the AML.
|
|
//
|
|
deviceExtension = AcpiObject->Context;
|
|
if (deviceExtension) {
|
|
|
|
ASSERT( deviceExtension->Signature == ACPI_SIGNATURE );
|
|
KeReleaseSpinLock( &AcpiDeviceTreeLock, oldIrql );
|
|
return &(deviceExtension->PowerInfo);
|
|
|
|
}
|
|
|
|
//
|
|
// Done with the spinlock
|
|
//
|
|
KeReleaseSpinLock( &AcpiDeviceTreeLock, oldIrql );
|
|
return NULL;
|
|
}
|
|
|
|
PACPI_POWER_INFO
|
|
OSPowerFindPowerInfoByContext(
|
|
PVOID Context
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Return the Power Information (which contains the device state and the
|
|
device dependencies)
|
|
|
|
The difference between this function and the previous is that it searches
|
|
the list based on the context pointer. On NT, this is a NOP since the
|
|
context pointer is actually an NT device object, and we store the structure
|
|
within the device extension. But this isn't the same for Win9x <sigh>
|
|
|
|
Arguments:
|
|
|
|
Context - Actually is a DeviceObject
|
|
|
|
Return Value:
|
|
|
|
PACPI_POWER_INFO
|
|
|
|
--*/
|
|
{
|
|
PDEVICE_OBJECT deviceObject = (PDEVICE_OBJECT) Context;
|
|
PDEVICE_EXTENSION deviceExtension = (PDEVICE_EXTENSION) Context;
|
|
|
|
ASSERT( Context != NULL );
|
|
|
|
|
|
//
|
|
// Get the real extension
|
|
//
|
|
deviceExtension = ACPIInternalGetDeviceExtension( deviceObject );
|
|
ASSERT( deviceExtension->Signature == ACPI_SIGNATURE );
|
|
|
|
//
|
|
// We store the Power info in the device extension
|
|
//
|
|
return &(deviceExtension->PowerInfo);
|
|
}
|
|
|
|
PACPI_POWER_DEVICE_NODE
|
|
OSPowerFindPowerNode(
|
|
PNSOBJ PowerObject
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Return the Power Device Node (which contains the current state of the
|
|
power resource, the power resource, and the use counts)
|
|
|
|
Arguments:
|
|
|
|
PowerObject - The NameSpace object that we want to know about
|
|
|
|
Return Value:
|
|
|
|
PACPI_POWER_DEVICE_NODE
|
|
|
|
--*/
|
|
{
|
|
KIRQL oldIrql;
|
|
PACPI_POWER_DEVICE_NODE powerNode = NULL;
|
|
|
|
//
|
|
// Before we touch the power list, we need to have a spinlock
|
|
//
|
|
KeAcquireSpinLock( &AcpiPowerLock, &oldIrql );
|
|
|
|
//
|
|
// Boundary check
|
|
//
|
|
if (AcpiPowerNodeList.Flink == &AcpiPowerNodeList) {
|
|
|
|
//
|
|
// At end
|
|
//
|
|
goto OSPowerFindPowerNodeExit;
|
|
|
|
}
|
|
|
|
//
|
|
// Start from the first node and check to see if they match the
|
|
// required NameSpace object
|
|
//
|
|
powerNode = (PACPI_POWER_DEVICE_NODE) AcpiPowerNodeList.Flink;
|
|
while (powerNode != (PACPI_POWER_DEVICE_NODE) &AcpiPowerNodeList) {
|
|
|
|
//
|
|
// Check to see if the node that we are looking at matches the
|
|
// name space object in question
|
|
//
|
|
if (powerNode->PowerObject == PowerObject) {
|
|
|
|
//
|
|
// Match
|
|
//
|
|
goto OSPowerFindPowerNodeExit;
|
|
|
|
}
|
|
|
|
//
|
|
// Next object
|
|
//
|
|
powerNode = (PACPI_POWER_DEVICE_NODE) powerNode->ListEntry.Flink;
|
|
|
|
}
|
|
|
|
//
|
|
// No match
|
|
//
|
|
powerNode = NULL;
|
|
|
|
OSPowerFindPowerNodeExit:
|
|
//
|
|
// No longer need the spin lock
|
|
//
|
|
KeReleaseSpinLock( &AcpiPowerLock, oldIrql );
|
|
|
|
//
|
|
// Return the node we found
|
|
//
|
|
return powerNode;
|
|
}
|