123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- /*++
- Copyright (c) 2016 Minoca Corp. All Rights Reserved
- Module Name:
- dmahost.h
- Abstract:
- This header contains definitions for creating and managing Direct Memory
- Access controllers.
- Author:
- Evan Green 2-Feb-2016
- --*/
- //
- // ------------------------------------------------------------------- Includes
- //
- #include <minoca/dma/dma.h>
- //
- // ---------------------------------------------------------------- Definitions
- //
- #ifndef DMA_API
- #define DMA_API __DLLIMPORT
- #endif
- #define DMA_CONTROLLER_INFORMATION_VERSION 1
- //
- // ------------------------------------------------------ Data Type Definitions
- //
- typedef struct _DMA_CONTROLLER DMA_CONTROLLER, *PDMA_CONTROLLER;
- typedef
- KSTATUS
- (*PDMA_HOST_SUBMIT_TRANSFER) (
- PVOID Context,
- PDMA_TRANSFER Transfer
- );
- /*++
- Routine Description:
- This routine is called to execute a transfer on the DMA controller.
- Arguments:
- Context - Supplies the host controller context.
- Transfer - Supplies a pointer to the transfer to begin executing. The
- controller can return immediately, and should call
- DmaProcessCompletedTransfer when the transfer completes.
- Return Value:
- Status code indicating whether or not the transfer was successfully
- started.
- --*/
- typedef
- KSTATUS
- (*PDMA_HOST_CANCEL_TRANSFER) (
- PVOID Context,
- PDMA_TRANSFER Transfer
- );
- /*++
- Routine Description:
- This routine is called to cancel an in-progress transfer. Once this routine
- returns, the transfer should be all the way out of the DMA controller and
- the controller should no longer interrupt because of this transfer. This
- routine is called at dispatch level.
- Arguments:
- Context - Supplies the host controller context.
- Transfer - Supplies a pointer to the transfer to cancel.
- Return Value:
- STATUS_SUCCESS on success.
- STATUS_TOO_LATE if the transfer is already complete.
- Other errors on other failures.
- --*/
- typedef
- KSTATUS
- (*PDMA_HOST_CONTROL_REQUEST) (
- PVOID Context,
- PDMA_TRANSFER Transfer,
- PVOID Request,
- UINTN RequestSize
- );
- /*++
- Routine Description:
- This routine is called to perform a DMA controller-specific operation. It
- provides a direct link between DMA controllers and users, for controller-
- specific functionality.
- Arguments:
- Context - Supplies the host controller context.
- Transfer - Supplies an optional pointer to the transfer involved.
- Request - Supplies a pointer to the request/response data.
- RequestSize - Supplies the size of the request in bytes.
- Return Value:
- Status code.
- --*/
- /*++
- Structure Description:
- This structure stores the set of Direct Memory Access controller functions
- called by the DMA library.
- Members:
- SubmitTransfer - Stores a pointer to a function used to begin a new
- transfer.
- CancelTransfer - Stores a pointer to a function used to cancel a transfer.
- ControlRequest - Stores a pointer to a function used to implemented
- controller-specific functionality.
- --*/
- typedef struct _DMA_FUNCTION_TABLE {
- PDMA_HOST_SUBMIT_TRANSFER SubmitTransfer;
- PDMA_HOST_CANCEL_TRANSFER CancelTransfer;
- PDMA_HOST_CONTROL_REQUEST ControlRequest;
- } DMA_FUNCTION_TABLE, *PDMA_FUNCTION_TABLE;
- /*++
- Structure Description:
- This structure defines the information provided to the DMA library by a
- Direct Memory Access controller.
- Members:
- Version - Stores the value DMA_CONTROLLER_INFORMATION_VERSION, used to
- enable future expansion of this structure.
- Context - Stores an opaque context pointer that is passed to the DMA
- controller functions.
- Device - Stores a pointer to the OS device associated with this controller.
- Information - Stores the information to be returned to users via the
- interface.
- Features - Stores a bitfield of features about this controller. See
- DMA_FEATURE_* definitions.
- FunctionTable - Stores the table of functions the library uses to call back
- into the controller.
- --*/
- typedef struct _DMA_CONTROLLER_INFORMATION {
- ULONG Version;
- PVOID Context;
- PDEVICE Device;
- DMA_INFORMATION Information;
- ULONG Features;
- DMA_FUNCTION_TABLE FunctionTable;
- } DMA_CONTROLLER_INFORMATION, *PDMA_CONTROLLER_INFORMATION;
- //
- // -------------------------------------------------------------------- Globals
- //
- //
- // -------------------------------------------------------- Function Prototypes
- //
- DMA_API
- KSTATUS
- DmaCreateController (
- PDMA_CONTROLLER_INFORMATION Registration,
- PDMA_CONTROLLER *Controller
- );
- /*++
- Routine Description:
- This routine creates a new Direct Memory Access controller.
- Arguments:
- Registration - Supplies a pointer to the host registration information.
- Controller - Supplies a pointer where a pointer to the new controller will
- be returned on success.
- Return Value:
- Status code.
- --*/
- DMA_API
- VOID
- DmaDestroyController (
- PDMA_CONTROLLER Controller
- );
- /*++
- Routine Description:
- This routine destroys a Direct Memory Access controller.
- Arguments:
- Controller - Supplies a pointer to the controller to tear down.
- Return Value:
- None.
- --*/
- DMA_API
- KSTATUS
- DmaStartController (
- PDMA_CONTROLLER Controller
- );
- /*++
- Routine Description:
- This routine starts a Direct Memory Access controller. This function is
- not thread safe, as it is meant to be called during the start IRP, which is
- always serialized.
- Arguments:
- Controller - Supplies a pointer to the controller.
- Return Value:
- Status code.
- --*/
- DMA_API
- VOID
- DmaStopController (
- PDMA_CONTROLLER Controller
- );
- /*++
- Routine Description:
- This routine stops a Direct Memory Access controller. This function is not
- thread safe, as it is meant to be called during a state transition IRP,
- which is always serialized.
- Arguments:
- Controller - Supplies a pointer to the controller.
- Return Value:
- None.
- --*/
- DMA_API
- PDMA_TRANSFER
- DmaTransferCompletion (
- PDMA_CONTROLLER Controller,
- PDMA_TRANSFER Transfer
- );
- /*++
- Routine Description:
- This routine is called by a DMA host controller when a transfer has
- completed. This function must be called at or below dispatch level. The
- host should have already filled in the number of bytes completed and the
- status.
- Arguments:
- Controller - Supplies a pointer to the controller.
- Transfer - Supplies a pointer to the transfer that completed.
- Return Value:
- Returns a pointer to the next transfer to start.
- NULL if no more transfers are queued.
- --*/
|