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