mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 10:14:44 +00:00

Not all files are included, but these are necessary to compile cdrom driver. So far it can only be statically linked with drivers, a proper implementation requires wdfldr helper driver
196 lines
4.8 KiB
C++
196 lines
4.8 KiB
C++
//
|
|
// Copyright (C) Microsoft. All rights reserved.
|
|
//
|
|
#ifndef _FXWAKEINTERRUPTSTATEMACHINE_H_
|
|
#define _FXWAKEINTERRUPTSTATEMACHINE_H_
|
|
|
|
//
|
|
// This is a magical number based on inspection. If the queue overflows,
|
|
// it is OK to increase these numbers without fear of either dependencies or
|
|
// weird side affects.
|
|
//
|
|
const UCHAR FxWakeInterruptEventQueueDepth = 8;
|
|
|
|
enum FxWakeInterruptEvents : UINT32 {
|
|
WakeInterruptEventInvalid = 0x00,
|
|
WakeInterruptEventIsr = 0x01,
|
|
WakeInterruptEventEnteringD0 = 0x02,
|
|
WakeInterruptEventLeavingD0 = 0x04,
|
|
WakeInterruptEventD0EntryFailed = 0x08,
|
|
WakeInterruptEventLeavingD0NotArmedForWake = 0x10,
|
|
WakeInterruptEventNull = 0xFF,
|
|
};
|
|
|
|
enum FxWakeInterruptStates {
|
|
WakeInterruptInvalid = 0,
|
|
WakeInterruptFailed,
|
|
WakeInterruptD0,
|
|
WakeInterruptDx,
|
|
WakeInterruptWaking,
|
|
WakeInterruptInvokingEvtIsrPostWake,
|
|
WakeInterruptCompletingD0,
|
|
WakeInterruptInvokingEvtIsrInD0,
|
|
WakeInterruptDxNotArmedForWake,
|
|
WakeInterruptInvokingEvtIsrInDxNotArmedForWake,
|
|
WakeInterruptMax
|
|
};
|
|
|
|
//
|
|
// Forward declaration
|
|
//
|
|
class FxWakeInterruptMachine;
|
|
class FxInterrupt;
|
|
|
|
typedef
|
|
_Must_inspect_result_
|
|
FxWakeInterruptStates
|
|
(*PFN_WAKE_INTERRUPT_STATE_ENTRY_FUNCTION)(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
struct FxWakeInterruptTargetState {
|
|
FxWakeInterruptEvents WakeInterruptEvent;
|
|
|
|
FxWakeInterruptStates WakeInterruptState;
|
|
|
|
#if FX_SUPER_DBG
|
|
BOOLEAN EventDebugged;
|
|
#endif
|
|
};
|
|
|
|
//
|
|
// This type of union is done so that we can
|
|
// 1) shrink the array element to the smallest size possible
|
|
// 2) keep types within the structure so we can dump it in the debugger
|
|
//
|
|
union FxWakeInterruptMachineStateHistory {
|
|
struct {
|
|
FxWakeInterruptStates State1 : 8;
|
|
FxWakeInterruptStates State2 : 8;
|
|
FxWakeInterruptStates State3 : 8;
|
|
FxWakeInterruptStates State4 : 8;
|
|
FxWakeInterruptStates State5 : 8;
|
|
FxWakeInterruptStates State6 : 8;
|
|
FxWakeInterruptStates State7 : 8;
|
|
FxWakeInterruptStates State8 : 8;
|
|
} S;
|
|
|
|
UCHAR History[FxWakeInterruptEventQueueDepth];
|
|
};
|
|
|
|
struct FxWakeInterruptStateTable {
|
|
PFN_WAKE_INTERRUPT_STATE_ENTRY_FUNCTION StateFunc;
|
|
|
|
const FxWakeInterruptTargetState* TargetStates;
|
|
|
|
ULONG TargetStatesCount;
|
|
};
|
|
|
|
class FxWakeInterruptMachine : public FxThreadedEventQueue {
|
|
|
|
friend FxInterrupt;
|
|
|
|
public:
|
|
FxWakeInterruptMachine(
|
|
__in FxInterrupt * Interrupt
|
|
);
|
|
|
|
VOID
|
|
ProcessEvent(
|
|
__in FxWakeInterruptEvents Event
|
|
);
|
|
|
|
static
|
|
VOID
|
|
_ProcessEventInner(
|
|
__inout FxPkgPnp* PkgPnp,
|
|
__inout FxPostProcessInfo* Info,
|
|
__in PVOID WorkerContext
|
|
);
|
|
|
|
private:
|
|
VOID
|
|
ProcessEventInner(
|
|
__inout FxPostProcessInfo* Info
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
Waking(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
Dx(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
DxNotArmedForWake(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
Failed(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
InvokingEvtIsrPostWake(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
InvokingEvtIsrInDxNotArmedForWake(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
InvokingEvtIsrInD0(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
static
|
|
FxWakeInterruptStates
|
|
CompletingD0(
|
|
__in FxWakeInterruptMachine* This
|
|
);
|
|
|
|
protected:
|
|
//FxPkgPnp* m_PkgPnp;
|
|
FxInterrupt* m_Interrupt;
|
|
//
|
|
// Set if the interrupt was left active during Dx transition to handle wake
|
|
// events.
|
|
//
|
|
BOOLEAN m_ActiveForWake;
|
|
BOOLEAN m_Claimed;
|
|
MxEvent m_IsrEvent;
|
|
|
|
// uses FxWakeInterruptStates values
|
|
BYTE m_CurrentState;
|
|
|
|
// three extra padded bytes are put in here by the compiler
|
|
|
|
FxWakeInterruptEvents m_Queue[FxWakeInterruptEventQueueDepth];
|
|
FxWakeInterruptMachineStateHistory m_States;
|
|
|
|
static const FxWakeInterruptStateTable m_StateTable[];
|
|
|
|
static const FxWakeInterruptTargetState m_FailedStates[];
|
|
static const FxWakeInterruptTargetState m_D0States[];
|
|
static const FxWakeInterruptTargetState m_DxStates[];
|
|
static const FxWakeInterruptTargetState m_DxNotArmedForWakeStates[];
|
|
static const FxWakeInterruptTargetState m_WakingStates[];
|
|
static const FxWakeInterruptTargetState m_InvokingEvtIsrPostWakeStates[];
|
|
static const FxWakeInterruptTargetState m_CompletingD0States[];
|
|
static const FxWakeInterruptTargetState m_InvokingIsrInD0[];
|
|
};
|
|
|
|
#endif // _FXWAKEINTERRUPTSTATEMACHINE_H_
|