summaryrefslogtreecommitdiff
path: root/pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h')
-rw-r--r--pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h382
1 files changed, 382 insertions, 0 deletions
diff --git a/pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h b/pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h
new file mode 100644
index 00000000..6e294572
--- /dev/null
+++ b/pofx/WDF/Driver/MultiComp/lib/WdfPoFxPriv.h
@@ -0,0 +1,382 @@
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+ THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
+ PURPOSE.
+
+Module Name:
+
+ WdfPoFxPriv.h
+
+Abstract:
+ Private header file for the power framework helper library. Contains
+ structures and function headers that are used by various source files in the
+ library.
+
+Environment:
+
+ Kernel mode
+
+--*/
+#if !defined(_WDFPOFXPRIV_H_)
+#define _WDFPOFXPRIV_H_
+
+#include <ntddk.h>
+#include <ntintsafe.h>
+#include "WdfPoFx.h"
+
+#define DO_NOTHING() (0)
+
+//
+// The following structure is used to capture the driver layer's settings for a
+// device
+//
+typedef struct _HELPER_DEVICE_INIT {
+ //
+ // KMDF callbacks registered by the driver layer. The power framework helper
+ // library invokes these callbacks when KMDF invokes that corresponding
+ // callback that the library has registered.
+ //
+ PFN_WDF_DEVICE_SELF_MANAGED_IO_INIT EvtDeviceSelfManagedIoInit;
+ PFN_WDF_DEVICE_SELF_MANAGED_IO_FLUSH EvtDeviceSelfManagedIoFlush;
+ PFN_WDF_DEVICE_SELF_MANAGED_IO_RESTART EvtDeviceSelfManagedIoRestart;
+ PFN_WDF_DEVICE_D0_ENTRY EvtDeviceD0Entry;
+
+ //
+ // Callbacks that notify the driver layer about registration and
+ // unregistration with the power framework. The power framework helper
+ // library invokes these callbacks after registering with the power
+ // framework and before unregistering from the power framework.
+ //
+ PPFH_CALLBACK_POHANDLE_AVAILABLE PfhCallbackPoHandleAvailable;
+ PPFH_CALLBACK_POHANDLE_UNAVAILABLE PfhCallbackPoHandleUnavailable;
+
+ //
+ // The driver layer's WDM pre-process callback for power IRPs. The power
+ // framework helper library invokes this callback when KMDF invokes the
+ // corresponding callback that the library has registered.
+ //
+ PFN_WDFDEVICE_WDM_IRP_PREPROCESS EvtDeviceWdmPowerIrpPreprocess;
+
+ //
+ // Memory object containing the array of power IRP minor functions that the
+ // driver layer is interested in preprocessing.
+ //
+ WDFMEMORY PowerIrpPreprocessMinorFunctions;
+
+ //
+ // The following members track the status of the initialization performed by
+ // the driver layer for a given device. They are used in verification.
+ //
+ BOOLEAN PnpPowerEventCallbacksIntercepted;
+ BOOLEAN PoHandleAvailabilityCallbacksSet;
+ BOOLEAN PowerIrpPreprocessCallbackAssigned;
+#if PFH_S0IDLE_SUPPORTED
+ BOOLEAN S0IdleConfigSet;
+
+ //
+ // The driver's S0-idle configuration
+ //
+ PFH_S0IDLE_CONFIG S0IdleConfig;
+#endif
+
+} HELPER_DEVICE_INIT, *PHELPER_DEVICE_INIT;
+
+//
+// The following structure is used to capture the driver layer's settings for a
+// component queue
+//
+typedef struct _HELPER_QUEUE_INIT {
+ //
+ // Component number of the component that the queue is associated with
+ //
+ ULONG Component;
+
+ //
+ // The driver layer's EvtIoCanceledOnQueue callback for the component queue.
+ // The power framework helper library invokes this callback when KMDF
+ // invokes the corresponding callback that the library has registered.
+ //
+ PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
+
+ //
+ // The following members track the status of the initialization performed by
+ // the driver layer for a given queue. They are used in verification.
+ //
+ BOOLEAN ComponentQueueConfigIntercepted;
+ BOOLEAN ComponentSet;
+} HELPER_QUEUE_INIT, *PHELPER_QUEUE_INIT;
+
+//
+// Enumeration of KMDF objects that can be initialized using the power framework
+// helper library's initializer object.
+//
+typedef enum _HELPER_INIT_TYPE {
+ HelperInitTypeNone,
+ HelperInitTypeDevice,
+ HelperInitTypeQueue,
+} HELPER_INIT_TYPE, *PHELPER_INIT_TYPE;
+
+//
+// The following structure represents the object context space for the power
+// framework helper library's initializer object.
+//
+typedef struct _HELPER_INIT {
+ //
+ // Type of KMDF object being initialized using the power framework helper
+ // library's initializer object.
+ //
+ HELPER_INIT_TYPE InitType;
+ union {
+ //
+ // Driver layer's device initialization settings
+ //
+ HELPER_DEVICE_INIT DeviceInit;
+
+ //
+ // Driver layer's queue initialization settings
+ //
+ HELPER_QUEUE_INIT QueueInit;
+ } u;
+} HELPER_INIT, *PHELPER_INIT;
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(HELPER_INIT,
+ HelperGetInitContext)
+
+//
+// The following structure represents the array of power IRP minor functions
+// that the driver layer is interested in preprocessing
+//
+#pragma warning(push)
+#pragma warning(disable:4200)
+typedef struct _POFX_DRIVER_LAYER_POWER_IRP_PREPROCESS_INFO {
+ //
+ // Number of power IRP minor functions that the driver layer is interested
+ // in preprocessing
+ //
+ ULONG NumMinorFunctions;
+
+ //
+ // Array of power IRP minor functions that the driver layer is interested in
+ // preprocessing
+ //
+ UCHAR MinorFunctions[];
+} POFX_DRIVER_LAYER_POWER_IRP_PREPROCESS_INFO,
+ *PPOFX_DRIVER_LAYER_POWER_IRP_PREPROCESS_INFO;
+#pragma warning(pop)
+
+//
+// Per-component information maintained by the power framework helper library
+//
+typedef struct _POFX_COMPONENT_INFO {
+ //
+ // Queue associated with the component
+ //
+ WDFQUEUE Queue;
+
+ //
+ // Whether or not the component is active
+ //
+ BOOLEAN IsActive;
+} POFX_COMPONENT_INFO, *PPOFX_COMPONENT_INFO;
+
+//
+// The following structure represents the driver layer's power framework
+// callbacks. The power framework helper library invokes these callbacks when
+// the power framework invokes the corresponding callbacks that the library has
+// registered.
+//
+typedef struct _POFX_DRIVER_LAYER_POWER_CALLBACKS {
+ PPO_FX_COMPONENT_IDLE_STATE_CALLBACK ComponentIdleStateCallback;
+ PPO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK ComponentActiveConditionCallback;
+ PPO_FX_COMPONENT_IDLE_CONDITION_CALLBACK ComponentIdleConditionCallback;
+ PPO_FX_DEVICE_POWER_REQUIRED_CALLBACK DevicePowerRequiredCallback;
+ PPO_FX_DEVICE_POWER_NOT_REQUIRED_CALLBACK DevicePowerNotRequiredCallback;
+} POFX_DRIVER_LAYER_POWER_CALLBACKS, *PPOFX_DRIVER_LAYER_POWER_CALLBACKS;
+
+//
+// The following structure represents the power framework helper library's
+// device context space.
+//
+typedef struct _POFX_DEVICE_CONTEXT {
+ //
+ // Pointer to the power framework settings registered by the power framework
+ // helper library
+ //
+ PPO_FX_DEVICE PoFxDeviceInfo;
+
+ //
+ // Pointer to the driver layer's power framework callbacks
+ //
+ POFX_DRIVER_LAYER_POWER_CALLBACKS DriverLayerPoFxCallbacks;
+
+ //
+ // Pointer to the driver layer's context for power framework callbacks
+ //
+ PVOID DriverLayerPoFxContext;
+
+ //
+ // Pointer to the information that is tracked by the power framework helper
+ // library for each component
+ //
+ PPOFX_COMPONENT_INFO ComponentInfo;
+
+ //
+ // POHANDLE representing the registration with the power framework
+ //
+ POHANDLE PoHandle;
+
+ //
+ // Array of power IRP minor functions that the driver layer is interested in
+ // preprocessing.
+ //
+ PPOFX_DRIVER_LAYER_POWER_IRP_PREPROCESS_INFO
+ DriverLayerPowerIrpPreprocessInfo;
+
+ //
+ // The driver layer's settings for the device
+ //
+ HELPER_DEVICE_INIT DeviceInitSettings;
+
+ //
+ // Whether or not we should call PoFxReportDevicePoweredOn from our next
+ // EvtDeviceD0Entry callback
+ //
+ BOOLEAN ShouldReportDevicePoweredOn;
+
+#if PFH_S0IDLE_SUPPORTED
+ //
+ // Whether or not we invoked WdfDeviceStopIdle during device start so that
+ // the device remains in D0 until the power framework permits it to go to Dx
+ //
+ BOOLEAN StopIdleInvokedOnDeviceStart;
+
+ //
+ // Work item that is queued in response to device-power-required callback.
+ // When the work item callback is invoked, we make a blocking call to
+ // WdfDeviceStopIdle in order to bring the device to D0. This blocking call
+ // cannot be made within the device-power-required callback because it can
+ // be invoked at dispatch level. Therefore, we make this call at passive
+ // level from a work item callback.
+ //
+ WDFWORKITEM PowerRequiredWorkItem;
+#endif
+
+} POFX_DEVICE_CONTEXT, *PPOFX_DEVICE_CONTEXT;
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(POFX_DEVICE_CONTEXT, HelperGetDeviceContext)
+
+//
+// The following structure represents the power framework helper library's
+// component queue context space.
+//
+typedef struct _POFX_QUEUE_CONTEXT {
+ //
+ // The driver layer's settings for the component queue
+ //
+ HELPER_QUEUE_INIT QueueInitSettings;
+} POFX_QUEUE_CONTEXT, *PPOFX_QUEUE_CONTEXT;
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(POFX_QUEUE_CONTEXT, HelperGetQueueContext)
+
+//
+// Power framework helper library's KMDF callbacks
+//
+EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT _PfhEvtSelfManagedIoInit;
+EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH _PfhEvtSelfManagedIoFlush;
+EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART _PfhEvtSelfManagedIoRestart;
+
+EVT_WDF_DEVICE_D0_ENTRY _PfhEvtD0Entry;
+
+EVT_WDFDEVICE_WDM_IRP_PREPROCESS _PfhEvtWdmPowerIrpPreprocess;
+
+EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE _PfhEvtRequestCanceledOnComponentQueue;
+
+//
+// Power framework helper library's power framework callbacks
+//
+PO_FX_COMPONENT_IDLE_STATE_CALLBACK _PfhComponentIdleStateCallback;
+PO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK _PfhComponentActiveConditionCallback;
+PO_FX_COMPONENT_IDLE_CONDITION_CALLBACK _PfhComponentIdleConditionCallback;
+PO_FX_DEVICE_POWER_REQUIRED_CALLBACK _PfhDevicePowerRequiredCallback;
+PO_FX_DEVICE_POWER_NOT_REQUIRED_CALLBACK _PfhDevicePowerNotRequiredCallback;
+
+//
+// Routines used by source files within the power framework helper library
+//
+PHELPER_DEVICE_INIT
+GetDeviceInitSettings(
+ _In_ WDFOBJECT Initializer
+ );
+
+VOID
+UnregisterWithPowerFrameworkWorker(
+ _In_ WDFDEVICE Device
+ );
+
+BOOLEAN
+IsDeviceInitialized(
+ _In_ WDFDEVICE Device
+ );
+
+BOOLEAN
+IsQueueInitialized(
+ _In_ WDFQUEUE Queue
+ );
+
+BOOLEAN
+ArePowerFrameworkSettingsAvailable(
+ _In_ WDFDEVICE Device
+ );
+
+NTSTATUS
+CopyAndUpdateMinorFunctionsArray(
+ _In_ WDFOBJECT Initializer,
+ _In_reads_opt_(NumMinorFunctions) PUCHAR MinorFunctions,
+ _In_ ULONG NumMinorFunctions,
+ _Out_ WDFMEMORY * MinorFunctionsMemory,
+ _Outptr_result_buffer_(*UpdatedNumMinorFunctions) PUCHAR *UpdatedMinorFunctions,
+ _Out_ PULONG UpdatedNumMinorFunctions
+ );
+
+NTSTATUS
+CopyMinorFunctionsArray(
+ _In_ WDFDEVICE Device,
+ _In_ WDFMEMORY SourceMemory,
+ _Out_ WDFMEMORY * DestinationMemory
+ );
+
+#include "s0idle.h"
+
+//
+// Define the tracing flags.
+//
+// The (0,0,0,0,0) GUID below is a dummy. The driver layer's GUID is the one
+// that gets used.
+//
+#define WPP_CONTROL_GUIDS \
+ WPP_DEFINE_CONTROL_GUID( \
+ WdfPoFxTraceControl, (0,0,0,0,0), \
+ WPP_DEFINE_BIT(WDFPOFX_ALL_INFO) \
+ )
+
+#define WPP_FLAG_LEVEL_LOGGER(flag, level) \
+ WPP_LEVEL_LOGGER(flag)
+
+#define WPP_FLAG_LEVEL_ENABLED(flag, level) \
+ (WPP_LEVEL_ENABLED(flag) && \
+ WPP_CONTROL(WPP_BIT_ ## flag).Level >= level)
+
+//
+// This comment block is scanned by the trace preprocessor to define our
+// Trace function.
+//
+// begin_wpp config
+// FUNC Trace{FLAG=WDFPOFX_ALL_INFO}(LEVEL, MSG, ...);
+// end_wpp
+//
+
+#endif // _WDFPOFXPRIV_H_