/*++ Copyright (c) 1997 Microsoft Corporation Module Name: buildsrc.h Abstract: This module contains the detector for the NT driver. This module makes extensive calls into the AMLI library Author: Stephane Plante (splante) Environment: NT Kernel Model Driver only Revision History: July 9, 1997 - Complete Rewrite Feb 13, 1998 - Another rewrite to make code ASYNC --*/ #ifndef _BUILDSRC_H_ #define _BUILDSRC_H_ // // Callback function for build requests // typedef VOID ( *PACPI_BUILD_CALLBACK )(PVOID, PVOID, NTSTATUS); typedef struct _ACPI_BUILD_REQUEST { // // This is the list entry that the request is currently queued on // LIST_ENTRY ListEntry; // // We believe in signatures // ULONG Signature; // // We belive in flags // union { ULONG Flags; struct { ULONG Device:1; ULONG Sync:1; ULONG Run:1; ULONG ReleaseReference:1; ULONG Reserved1:8; ULONG ValidTarget:1; ULONG Reserved2:19; } UFlags; }; // // This the current state of the request. It can only be touched // from the InterlockedXXX functions // ULONG WorkDone; // // This is the current state of the request. It can be read safely // from within any of the processing routines. It can only be written // from within the ACPIBuildProcessXXXList() functions // ULONG CurrentWorkDone; // // This is the state that we should transition to next, if we succeed // at the current state // ULONG NextWorkDone; // // This is the object associated with this request // PVOID BuildContext; // // The current status of the request // NTSTATUS Status; // // Remember what the most current control method that we ran was // PNSOBJ CurrentObject; // // We may want to have a callback.. // PACPI_BUILD_CALLBACK CallBack; // // And we should have a context as well // PVOID CallBackContext; // // At this point, the contends depend on what kind of request we // are processing. // union { // // This is the structure for a device request // struct { // // Some local storage for result from an AMLI call // OBJDATA ResultData; } DeviceRequest; struct { // // We need to remember the name of the control method // union { ULONG ControlMethodName; UCHAR ControlMethodNameAsUchar[4]; }; // // We believe in flags while recursing // union { ULONG Flags; struct { ULONG CheckStatus:1; ULONG MarkIni:1; ULONG Recursive:1; ULONG CheckWakeCount:1; ULONG RegOn:1; ULONG RegOff:1; ULONG StopAtBridges:1; ULONG Reserved:25; } UFlags; }; } RunRequest; struct { // // We need to know which list we require to be empty // PLIST_ENTRY SynchronizeListEntry; // // We can keep track of the method name that we are // trying to sync with // union { ULONG SynchronizeMethodName; UCHAR SynchronizeMethodNameAsUchar[4]; }; // // We believe in flags for this structure // union { ULONG Flags; struct { ULONG HasMethod:1; ULONG Reserved:31; } UFlags; }; } SynchronizeRequest; }; // // This is for scratch storage. Note that we use this space to // indicate which is the appropriate list that the request should // be moved onto // union { // // Keep Enough space for one integer // ULONG Integer; // // Or one string pointer // PUCHAR String; // // This is a pointer to the head of the list that this request should // be moved onto // PLIST_ENTRY TargetListEntry; }; } ACPI_BUILD_REQUEST, *PACPI_BUILD_REQUEST; // // These are the flags that are used for BuildRequest // #define BUILD_REQUEST_DEVICE 0x0001 #define BUILD_REQUEST_SYNC 0x0002 #define BUILD_REQUEST_RUN 0x0004 #define BUILD_REQUEST_RELEASE_REFERENCE 0x0008 #define BUILD_REQUEST_VALID_TARGET 0x1000 // // These are the flags that we use in the RunRequest case // #define RUN_REQUEST_CHECK_STATUS 0x01 #define RUN_REQUEST_MARK_INI 0x02 #define RUN_REQUEST_RECURSIVE 0x04 #define RUN_REQUEST_CHECK_WAKE_COUNT 0x08 #define RUN_REQUEST_REG_METHOD_ON 0x10 #define RUN_REQUEST_REG_METHOD_OFF 0x20 #define RUN_REQUEST_STOP_AT_BRIDGES 0x40 // // These are the flags that we use in the SyncRequest case // #define SYNC_REQUEST_HAS_METHOD 0x1 // // Prototype function pointer // typedef NTSTATUS (*PACPI_BUILD_FUNCTION)( IN PACPI_BUILD_REQUEST ); // // These are variables exported from buildsrc.c // extern BOOLEAN AcpiBuildDpcRunning; extern BOOLEAN AcpiBuildFixedButtonEnumerated; extern BOOLEAN AcpiBuildWorkDone; extern KSPIN_LOCK AcpiBuildQueueLock; extern LIST_ENTRY AcpiBuildQueueList; extern LIST_ENTRY AcpiBuildPowerResourceList; extern LIST_ENTRY AcpiBuildDeviceList; extern LIST_ENTRY AcpiBuildOperationRegionList; extern LIST_ENTRY AcpiBuildRunMethodList; extern LIST_ENTRY AcpiBuildSynchronizationList; extern LIST_ENTRY AcpiBuildThermalZoneList; extern KDPC AcpiBuildDpc; extern NPAGED_LOOKASIDE_LIST BuildRequestLookAsideList; // // Because its rather annoying to base everything off the WORK_DONE_STEP_XX // defines (espacially if you have to renumber them), these defines are // used to abstract it out // #define WORK_DONE_ADR WORK_DONE_STEP_1 #define WORK_DONE_ADR_OR_HID WORK_DONE_STEP_0 #define WORK_DONE_CID WORK_DONE_STEP_4 #define WORK_DONE_CRS WORK_DONE_STEP_16 #define WORK_DONE_EJD WORK_DONE_STEP_6 #define WORK_DONE_HID WORK_DONE_STEP_2 #define WORK_DONE_PR0 WORK_DONE_STEP_10 #define WORK_DONE_PR1 WORK_DONE_STEP_12 #define WORK_DONE_PR2 WORK_DONE_STEP_14 #define WORK_DONE_PRW WORK_DONE_STEP_8 #define WORK_DONE_PSC WORK_DONE_STEP_18 #define WORK_DONE_STA WORK_DONE_STEP_5 #define WORK_DONE_UID WORK_DONE_STEP_3 // // These are the function prototypes // VOID ACPIBuildCompleteCommon( IN PULONG OldWorkDone, IN ULONG NewWorkDone ); VOID EXPORT ACPIBuildCompleteGeneric( IN PNSOBJ AcpiObject, IN NTSTATUS Status, IN POBJDATA ObjectData, IN PVOID Context ); VOID EXPORT ACPIBuildCompleteMustSucceed( IN PNSOBJ AcpiObject, IN NTSTATUS Status, IN POBJDATA ObjectData, IN PVOID Context ); VOID ACPIBuildDeviceDpc( IN PKDPC Dpc, IN PVOID DpcContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS ACPIBuildDeviceExtension( IN PNSOBJ CurrentObject, IN PDEVICE_EXTENSION ParentDeviceExtension, OUT PDEVICE_EXTENSION *ReturnExtension ); NTSTATUS ACPIBuildDevicePowerNodes( IN PDEVICE_EXTENSION DeviceExtension, IN PNSOBJ ResultObject, IN POBJDATA ResultData, IN DEVICE_POWER_STATE DeviceState ); NTSTATUS ACPIBuildDeviceRequest( IN PDEVICE_EXTENSION DeviceExtension, IN PACPI_BUILD_CALLBACK CallBack, IN PVOID CallBackContext, IN BOOLEAN RunDPC ); NTSTATUS ACPIBuildDockExtension( IN PNSOBJ CurrentObject, IN PDEVICE_EXTENSION ParentExtension ); NTSTATUS ACPIBuildFilter( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_OBJECT PdoObject ); NTSTATUS ACPIBuildFixedButtonExtension( IN PDEVICE_EXTENSION ParentExtension, IN PDEVICE_EXTENSION *ResultExtnesion ); NTSTATUS ACPIBuildFlushQueue( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS ACPIBuildMissingChildren( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS ACPIBuildMissingEjectionRelations( ); VOID ACPIBuildNotifyEvent( IN PVOID BuildContext, IN PVOID Context, IN NTSTATUS Status ); NTSTATUS ACPIBuildPdo( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_OBJECT ParentPdoObject, IN BOOLEAN CreateAsFilter ); NTSTATUS ACPIBuildPowerResourceExtension( IN PNSOBJ PowerResource, OUT PACPI_POWER_DEVICE_NODE *ReturnNode ); NTSTATUS ACPIBuildPowerResourceRequest( IN PACPI_POWER_DEVICE_NODE PowerNode, IN PACPI_BUILD_CALLBACK CallBack, IN PVOID CallBackContext, IN BOOLEAN RunDPC ); NTSTATUS ACPIBuildProcessDeviceFailure( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDeviceGenericEval( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDeviceGenericEvalStrict( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseAdr( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseAdrOrHid( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseCid( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseCrs( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseEjd( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseHid( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhasePr0( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhasePr1( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhasePr2( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhasePrw( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhasePsc( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseSta( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessDevicePhaseUid( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessGenericComplete( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessGenericList( IN PLIST_ENTRY ListEntry, IN PACPI_BUILD_FUNCTION *DispatchTable ); NTSTATUS ACPIBuildProcessorExtension( IN PNSOBJ ProcessorObject, IN PDEVICE_EXTENSION ParentExtension, IN PDEVICE_EXTENSION *ResultExtension, IN ULONG ProcessorIndex ); NTSTATUS ACPIBuildProcessorRequest( IN PDEVICE_EXTENSION ProcessorExtension, IN PACPI_BUILD_CALLBACK CallBack, IN PVOID CallBackContext, IN BOOLEAN RunDPC ); NTSTATUS ACPIBuildProcessPowerResourceFailure( IN PACPI_BUILD_REQUEST BuidlRequest ); NTSTATUS ACPIBuildProcessPowerResourcePhase0( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessPowerResourcePhase1( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessQueueList( VOID ); NTSTATUS ACPIBuildProcessRunMethodPhaseCheckBridge( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessRunMethodPhaseCheckSta( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessRunMethodPhaseRecurse( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessRunMethodPhaseRunMethod( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildProcessSynchronizationList( IN PLIST_ENTRY ListEntry ); NTSTATUS ACPIBuildProcessThermalZonePhase0( IN PACPI_BUILD_REQUEST BuildRequest ); NTSTATUS ACPIBuildRegRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PACPI_BUILD_CALLBACK CallBack ); NTSTATUS ACPIBuildRegOffRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PACPI_BUILD_CALLBACK CallBack ); NTSTATUS ACPIBuildRegOnRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PACPI_BUILD_CALLBACK CallBack ); NTSTATUS ACPIBuildRunMethodRequest( IN PDEVICE_EXTENSION DeviceExtension, IN PACPI_BUILD_CALLBACK CallBack, IN PVOID CallBackContext, IN ULONG MethodName, IN ULONG MethodFlags, IN BOOLEAN RunDPC ); NTSTATUS ACPIBuildSurpriseRemovedExtension( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS ACPIBuildSynchronizationRequest( IN PDEVICE_EXTENSION DeviceExtension, IN PACPI_BUILD_CALLBACK CallBack, IN PVOID CallBackContext, IN PLIST_ENTRY SynchronizeListEntry, IN BOOLEAN RunDPC ); NTSTATUS ACPIBuildThermalZoneExtension( IN PNSOBJ ThermalObject, IN PDEVICE_EXTENSION ParentExtension, IN PDEVICE_EXTENSION *ResultExtension ); NTSTATUS ACPIBuildThermalZoneRequest( IN PDEVICE_EXTENSION ThermalExtension, IN PACPI_BUILD_CALLBACK CallBack, IN PVOID CallBackContext, IN BOOLEAN RunDPC ); #endif