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.
192 lines
4.5 KiB
192 lines
4.5 KiB
/*++
|
|
|
|
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;
|
|
}
|