206 lines
4 KiB
C
206 lines
4 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|