windows-nt/Source/XPSP1/NT/base/busdrv/acpi/driver/nt/callback.c
2020-09-26 16:20:57 +08:00

193 lines
4.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
callback.c
Abstract:
This module implements all the callbacks that are NT specific from
the AML Interperter
Environment
Kernel mode only
Revision History:
04-Jun-97 Initial Revision
01-Mar-98 Split off all the OSNotify() into osnotify.c
02-Mar-98 Rewrite to make the notifactions work at DPC level
13-Mar-00 Rewrite to handle Load()/Unload()
--*/
#include "pch.h"
//
// Keep track of the number of Loads and Unloads present in the system
//
ULONG AcpiTableDelta = 0;
NTSTATUS
EXPORT
ACPICallBackLoad(
IN ULONG EventType,
IN ULONG NotifyType,
IN ULONG EventData,
IN PNSOBJ AcpiObject,
IN ULONG EventParameter
)
/*++
Routine Description:
This routine is called when before we process the Load() and after we
finish the Load() operator.
The purpose of this function is to do the work required to load the
table. We actually split the work to be done at the start of the
load process and the work to be done after the table has been loaded
Arguments:
EventType - EVTYPE_OPCODE_EX
NotifyType - This indicates wether or not we have completed the Load() yet
EventData - OP_LOAD
AcpiObject - the affected name space object (ignored)
EventParam - Supplied information (ignored)
Return Value:
NTSTATUS
--*/
{
ULONG newValue;
if (NotifyType == OPEXF_NOTIFY_PRE) {
//
// We are being called before the load operator. Increment
// the count of Load()'s outstanding. If this value reaches
// 1, then we know that this is the first instance..
//
newValue = InterlockedIncrement( &AcpiTableDelta );
if (newValue == 1) {
//
// We need to get rid of the GPEs...
//
ACPIGpeClearEventMasks();
}
return STATUS_SUCCESS;
}
//
// We are being called after the load operator. Decrement the Load()'s
// outstanding. If this value reaches 0, then we know what we are the
// last instance
//
newValue = InterlockedDecrement( &AcpiTableDelta );
if (newValue == 0) {
//
// We re-enable to re-enable the GPEs
//
ACPIGpeBuildEventMasks();
//
// We also need to process the table...
//
ACPITableLoad();
}
return STATUS_SUCCESS;
}
NTSTATUS
EXPORT
ACPICallBackUnload(
IN ULONG EventType,
IN ULONG NotifyType,
IN ULONG EventData,
IN PNSOBJ AcpiObject,
IN ULONG EventParameter
)
/*++
Routine Description:
This routine is called when the AML interpreter has started unloading
a Differentiated Data Block
Arguments:
EventType - The event type (should be EVTYPE_OPCODE)
NotifyType - This indicates wether or not we have completed the
Unload() yet
EventData - The event subtype (should be OP_UNLOAD)
AcpiObject - The affected name space object (ignored)
EventParamter - The event specific information
Return Value:
NTSTATUS
--*/
{
ULONG newValue;
if (NotifyType == OPEXF_NOTIFY_PRE) {
//
// We are being called before the load operator. Increment
// the count of Load()'s outstanding. If this value reaches
// 1, then we know that this is the first instance..
//
newValue = InterlockedIncrement( &AcpiTableDelta );
if (newValue == 1) {
//
// We need to get rid of the GPEs...
//
ACPIGpeClearEventMasks();
}
//
// Lets try to flush the power and device queues
//
ACPIBuildFlushQueue( RootDeviceExtension );
ACPIDevicePowerFlushQueue( RootDeviceExtension );
return STATUS_SUCCESS;
}
//
// We are being called after the load operator. Decrement the Load()'s
// outstanding. If this value reaches 0, then we know what we are the
// last instance
//
newValue = InterlockedDecrement( &AcpiTableDelta );
if (newValue == 0) {
//
// We re-enable to re-enable the GPEs
//
ACPIGpeBuildEventMasks();
//
// We also need to process the disappearing table...
//
ACPITableUnload();
}
return STATUS_SUCCESS;
}