617 lines
17 KiB
C
617 lines
17 KiB
C
/*++
|
|
|
|
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
|