reactos/sdk/include/wdf/kmdf/1.17/wdfdmaenabler.h

515 lines
12 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
_WdfVersionBuild_
Module Name:
WdfDmaEnabler.h
Abstract:
WDF DMA Enabler support
Environment:
Kernel mode only.
Notes:
Revision History:
--*/
//
// NOTE: This header is generated by stubwork. Please make any
// modifications to the corresponding template files
// (.x or .y) and use stubwork to regenerate the header
//
#ifndef _WDFDMAENABLER_H_
#define _WDFDMAENABLER_H_
#ifndef WDF_EXTERN_C
#ifdef __cplusplus
#define WDF_EXTERN_C extern "C"
#define WDF_EXTERN_C_START extern "C" {
#define WDF_EXTERN_C_END }
#else
#define WDF_EXTERN_C
#define WDF_EXTERN_C_START
#define WDF_EXTERN_C_END
#endif
#endif
WDF_EXTERN_C_START
#if (NTDDI_VERSION >= NTDDI_WIN2K)
typedef enum _WDF_DMA_PROFILE {
WdfDmaProfileInvalid = 0,
WdfDmaProfilePacket,
WdfDmaProfileScatterGather,
WdfDmaProfilePacket64,
WdfDmaProfileScatterGather64,
WdfDmaProfileScatterGatherDuplex,
WdfDmaProfileScatterGather64Duplex,
WdfDmaProfileSystem,
WdfDmaProfileSystemDuplex,
} WDF_DMA_PROFILE;
typedef enum _WDF_DMA_DIRECTION {
WdfDmaDirectionReadFromDevice = FALSE,
WdfDmaDirectionWriteToDevice = TRUE,
} WDF_DMA_DIRECTION;
//
// DMA power event callbacks
//
typedef
_Function_class_(EVT_WDF_DMA_ENABLER_FILL)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_DMA_ENABLER_FILL(
_In_
WDFDMAENABLER DmaEnabler
);
typedef EVT_WDF_DMA_ENABLER_FILL *PFN_WDF_DMA_ENABLER_FILL;
typedef
_Function_class_(EVT_WDF_DMA_ENABLER_FLUSH)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_DMA_ENABLER_FLUSH(
_In_
WDFDMAENABLER DmaEnabler
);
typedef EVT_WDF_DMA_ENABLER_FLUSH *PFN_WDF_DMA_ENABLER_FLUSH;
typedef
_Function_class_(EVT_WDF_DMA_ENABLER_ENABLE)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_DMA_ENABLER_ENABLE(
_In_
WDFDMAENABLER DmaEnabler
);
typedef EVT_WDF_DMA_ENABLER_ENABLE *PFN_WDF_DMA_ENABLER_ENABLE;
typedef
_Function_class_(EVT_WDF_DMA_ENABLER_DISABLE)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_DMA_ENABLER_DISABLE(
_In_
WDFDMAENABLER DmaEnabler
);
typedef EVT_WDF_DMA_ENABLER_DISABLE *PFN_WDF_DMA_ENABLER_DISABLE;
typedef
_Function_class_(EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START(
_In_
WDFDMAENABLER DmaEnabler
);
typedef EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START *PFN_WDF_DMA_ENABLER_SELFMANAGED_IO_START;
typedef
_Function_class_(EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP(
_In_
WDFDMAENABLER DmaEnabler
);
typedef EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP *PFN_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP;
#define WDF_DMA_ENABLER_UNLIMITED_FRAGMENTS ((ULONG) -1)
typedef enum _WDF_DMA_ENABLER_CONFIG_FLAGS {
//
// This flag only applies to the following DMA profiles:
// WdfDmaProfileScatterGather,
// WdfDmaProfileScatterGather64,
// WdfDmaProfileScatterGatherDuplex and
// WdfDmaProfileScatterGather64Duplex
//
// When this flag is not set and the profile is one of the above, WDF
// creates a SGLookasideList used by this DMA adapter's transaction
// objects. The SGLookasideList is initialized to allow the max specified
// transfer length. When the transaction is executed, WDF calls the WDM
// DMA's BuildScatterGatherList entry function. Forward progress drivers
// must use this option. This is the default option.
//
// When this flag is set and the profile is one of the above, WDF
// does not create a SGLookasideList. When the transaction is executed,
// WDF calls the WDM DMA's GetScatterGatherList entry function.
//
WDF_DMA_ENABLER_CONFIG_NO_SGLIST_PREALLOCATION = 0x00000001,
} WDF_DMA_ENABLER_CONFIG_FLAGS;
typedef struct _WDF_DMA_ENABLER_CONFIG {
//
// Size of this structure in bytes
//
ULONG Size;
//
// One of the above WDF_DMA_PROFILES
//
WDF_DMA_PROFILE Profile;
//
// Maximum DMA Transfer handled in bytes.
//
size_t MaximumLength;
//
// The various DMA PnP/Power event callbacks
//
PFN_WDF_DMA_ENABLER_FILL EvtDmaEnablerFill;
PFN_WDF_DMA_ENABLER_FLUSH EvtDmaEnablerFlush;
PFN_WDF_DMA_ENABLER_DISABLE EvtDmaEnablerDisable;
PFN_WDF_DMA_ENABLER_ENABLE EvtDmaEnablerEnable;
PFN_WDF_DMA_ENABLER_SELFMANAGED_IO_START EvtDmaEnablerSelfManagedIoStart;
PFN_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP EvtDmaEnablerSelfManagedIoStop;
//
// Overrides the address width specified by the DMA profile.
//
ULONG AddressWidthOverride;
//
// Overrides the version of the WDM DMA interfaces that WDF uses
// (0 for default).
//
ULONG WdmDmaVersionOverride;
//
// Bit field combination of values from the WDF_DMA_ENABLER_CONFIG_FLAGS
// enumeration
//
ULONG Flags;
} WDF_DMA_ENABLER_CONFIG, *PWDF_DMA_ENABLER_CONFIG;
FORCEINLINE
VOID
WDF_DMA_ENABLER_CONFIG_INIT(
_Out_ PWDF_DMA_ENABLER_CONFIG Config,
_In_ WDF_DMA_PROFILE Profile,
_In_ size_t MaximumLength
)
{
RtlZeroMemory(Config, sizeof(WDF_DMA_ENABLER_CONFIG));
Config->Size = sizeof(WDF_DMA_ENABLER_CONFIG);
Config->Profile = Profile;
Config->MaximumLength = MaximumLength;
}
typedef struct _WDF_DMA_SYSTEM_PROFILE_CONFIG {
//
// The size of this structure in bytes
//
ULONG Size;
//
// Specifies that the transfer is controlled by the device's DMA
// request line.
//
BOOLEAN DemandMode;
//
// Specifies that the DMA engine will loop back to the beginning
// of the buffer once it reaches the end.
//
BOOLEAN LoopedTransfer;
//
// Width of the register to DMA to/from
//
DMA_WIDTH DmaWidth;
//
// The adress at which to write to the device
//
PHYSICAL_ADDRESS DeviceAddress;
//
// The translated resource descriptor for the DMA channel assigned
// the device during EvtDevicePrepareHardware
//
PCM_PARTIAL_RESOURCE_DESCRIPTOR DmaDescriptor;
} WDF_DMA_SYSTEM_PROFILE_CONFIG, *PWDF_DMA_SYSTEM_PROFILE_CONFIG;
FORCEINLINE
VOID
WDF_DMA_SYSTEM_PROFILE_CONFIG_INIT(
_Out_ PWDF_DMA_SYSTEM_PROFILE_CONFIG DmaConfig,
_In_ PHYSICAL_ADDRESS Address,
_In_ DMA_WIDTH DmaWidth,
_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR DmaDescriptor
)
{
RtlZeroMemory(DmaConfig, sizeof(WDF_DMA_SYSTEM_PROFILE_CONFIG));
DmaConfig->Size = sizeof(WDF_DMA_SYSTEM_PROFILE_CONFIG);
DmaConfig->DeviceAddress = Address;
DmaConfig->DmaWidth = DmaWidth;
DmaConfig->DmaDescriptor = DmaDescriptor;
}
//
// WDF Function: WdfDmaEnablerCreate
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFDMAENABLERCREATE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDEVICE Device,
_In_
PWDF_DMA_ENABLER_CONFIG Config,
_In_opt_
PWDF_OBJECT_ATTRIBUTES Attributes,
_Out_
WDFDMAENABLER* DmaEnablerHandle
);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
NTSTATUS
WdfDmaEnablerCreate(
_In_
WDFDEVICE Device,
_In_
PWDF_DMA_ENABLER_CONFIG Config,
_In_opt_
PWDF_OBJECT_ATTRIBUTES Attributes,
_Out_
WDFDMAENABLER* DmaEnablerHandle
)
{
return ((PFN_WDFDMAENABLERCREATE) WdfFunctions[WdfDmaEnablerCreateTableIndex])(WdfDriverGlobals, Device, Config, Attributes, DmaEnablerHandle);
}
//
// WDF Function: WdfDmaEnablerConfigureSystemProfile
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFDMAENABLERCONFIGURESYSTEMPROFILE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDMAENABLER DmaEnabler,
_In_
PWDF_DMA_SYSTEM_PROFILE_CONFIG ProfileConfig,
_In_
WDF_DMA_DIRECTION ConfigDirection
);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
NTSTATUS
WdfDmaEnablerConfigureSystemProfile(
_In_
WDFDMAENABLER DmaEnabler,
_In_
PWDF_DMA_SYSTEM_PROFILE_CONFIG ProfileConfig,
_In_
WDF_DMA_DIRECTION ConfigDirection
)
{
return ((PFN_WDFDMAENABLERCONFIGURESYSTEMPROFILE) WdfFunctions[WdfDmaEnablerConfigureSystemProfileTableIndex])(WdfDriverGlobals, DmaEnabler, ProfileConfig, ConfigDirection);
}
//
// WDF Function: WdfDmaEnablerGetMaximumLength
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
size_t
(STDCALL *PFN_WDFDMAENABLERGETMAXIMUMLENGTH)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDMAENABLER DmaEnabler
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
size_t
WdfDmaEnablerGetMaximumLength(
_In_
WDFDMAENABLER DmaEnabler
)
{
return ((PFN_WDFDMAENABLERGETMAXIMUMLENGTH) WdfFunctions[WdfDmaEnablerGetMaximumLengthTableIndex])(WdfDriverGlobals, DmaEnabler);
}
//
// WDF Function: WdfDmaEnablerGetMaximumScatterGatherElements
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
size_t
(STDCALL *PFN_WDFDMAENABLERGETMAXIMUMSCATTERGATHERELEMENTS)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDMAENABLER DmaEnabler
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
size_t
WdfDmaEnablerGetMaximumScatterGatherElements(
_In_
WDFDMAENABLER DmaEnabler
)
{
return ((PFN_WDFDMAENABLERGETMAXIMUMSCATTERGATHERELEMENTS) WdfFunctions[WdfDmaEnablerGetMaximumScatterGatherElementsTableIndex])(WdfDriverGlobals, DmaEnabler);
}
//
// WDF Function: WdfDmaEnablerSetMaximumScatterGatherElements
//
typedef
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFDMAENABLERSETMAXIMUMSCATTERGATHERELEMENTS)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDMAENABLER DmaEnabler,
_In_
_When_(MaximumFragments == 0, __drv_reportError(MaximumFragments cannot be zero))
size_t MaximumFragments
);
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
VOID
WdfDmaEnablerSetMaximumScatterGatherElements(
_In_
WDFDMAENABLER DmaEnabler,
_In_
_When_(MaximumFragments == 0, __drv_reportError(MaximumFragments cannot be zero))
size_t MaximumFragments
)
{
((PFN_WDFDMAENABLERSETMAXIMUMSCATTERGATHERELEMENTS) WdfFunctions[WdfDmaEnablerSetMaximumScatterGatherElementsTableIndex])(WdfDriverGlobals, DmaEnabler, MaximumFragments);
}
//
// WDF Function: WdfDmaEnablerGetFragmentLength
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
size_t
(STDCALL *PFN_WDFDMAENABLERGETFRAGMENTLENGTH)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDMAENABLER DmaEnabler,
_In_
WDF_DMA_DIRECTION DmaDirection
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
size_t
WdfDmaEnablerGetFragmentLength(
_In_
WDFDMAENABLER DmaEnabler,
_In_
WDF_DMA_DIRECTION DmaDirection
)
{
return ((PFN_WDFDMAENABLERGETFRAGMENTLENGTH) WdfFunctions[WdfDmaEnablerGetFragmentLengthTableIndex])(WdfDriverGlobals, DmaEnabler, DmaDirection);
}
//
// WDF Function: WdfDmaEnablerWdmGetDmaAdapter
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
PDMA_ADAPTER
(STDCALL *PFN_WDFDMAENABLERWDMGETDMAADAPTER)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDMAENABLER DmaEnabler,
_In_
WDF_DMA_DIRECTION DmaDirection
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
PDMA_ADAPTER
WdfDmaEnablerWdmGetDmaAdapter(
_In_
WDFDMAENABLER DmaEnabler,
_In_
WDF_DMA_DIRECTION DmaDirection
)
{
return ((PFN_WDFDMAENABLERWDMGETDMAADAPTER) WdfFunctions[WdfDmaEnablerWdmGetDmaAdapterTableIndex])(WdfDriverGlobals, DmaEnabler, DmaDirection);
}
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
WDF_EXTERN_C_END
#endif // _WDFDMAENABLER_H_