windows-nt/Source/XPSP1/NT/base/busdrv/acpi/driver/nt/ospower.c

206 lines
4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}