//
// No Check-in Source Code.
//
// Do not make this code available to non-Microsoft personnel
// 	without Intel's express permission
//
/**
***  Copyright  (C) 1996-97 Intel Corporation. All rights reserved.
***
*** The information and source code contained herein is the exclusive
*** property of Intel Corporation and may not be disclosed, examined
*** or reproduced in whole or in part without explicit written authorization
*** from the company.
**/

/*++

Copyright (c) 1995  Intel Corporation

Module Name:

    simdma.c

Abstract:

    This module implements the DMA support routines for the HAL DLL.

Author:

    14-Apr-1995

Environment:

    Kernel mode

Revision History:

--*/

#include "halp.h"


PADAPTER_OBJECT
HalGetAdapter(
    IN PDEVICE_DESCRIPTION DeviceDescriptor,
    OUT PULONG NumberOfMapRegisters
    )

/*++

Routine Description:

    This function returns the appropriate adapter object for the DMA 
    device. However, there is no DMA device in the simulation 
    environment.  Therefore, the function returns NULL to indicate
    failure.

Arguments:

    DeviceDescriptor - Supplies a description of the deivce.

    NumberOfMapRegisters - Returns the maximum number of map registers which
    may be allocated by the device driver.

Return Value:

    NULL

--*/

{
    return NULL;
}

NTSTATUS
HalAllocateAdapterChannel(
    IN PADAPTER_OBJECT AdapterObject,
    IN PWAIT_CONTEXT_BLOCK Wcb,
    IN ULONG NumberOfMapRegisters,
    IN PDRIVER_CONTROL ExecutionRoutine
    )
/*++

Routine Description:

    As there is no DMA device in the simulation environment, this function 
    is not supported.

Arguments:

    AdapterObject - Pointer to the adapter control object to allocate to the
    driver.

    Wcb - Supplies a wait context block for saving the allocation parameters.
    The DeviceObject, CurrentIrp and DeviceContext should be initalized.

    NumberOfMapRegisters - The number of map registers that are to be allocated
    from the channel, if any.

    ExecutionRoutine - The address of the driver's execution routine that is
    invoked once the adapter channel (and possibly map registers) have been
    allocated.

Return Value:

    Returns STATUS_NOT_SUPPORTED

Notes:

    Note that this routine MUST be invoked at DISPATCH_LEVEL or above.

--*/
{
    return STATUS_NOT_SUPPORTED;
}

ULONG
HalReadDmaCounter(
    IN PADAPTER_OBJECT AdapterObject
    )
/*++

Routine Description:

    This function reads the DMA counter and returns the number of bytes left
    to be transfered.  As there is no DMA device, a value of zero is always
    returned.

Arguments:

    AdapterObject - Supplies a pointer to the adapter object to be read.

Return Value:

    Returns the number of bytes still be be transfered.

--*/

{
    return 0;
}

PVOID
HalAllocateCommonBuffer(
    IN PADAPTER_OBJECT AdapterObject,
    IN ULONG Length,
    OUT PPHYSICAL_ADDRESS LogicalAddress,
    IN BOOLEAN CacheEnabled
    )
/*++

Routine Description:

    This function allocates the memory for a common buffer and maps so
    that it can be accessed by a master device and the CPU.  As there
    is no DMA support, a value of NULL is always returned.

Arguments:

    AdapterObject - Supplies a pointer to the adapter object used by this
    device.

    Length - Supplies the length of the common buffer to be allocated.

    LogicalAddress - Returns the logical address of the common buffer.

    CacheEnable - Indicates whether the memeory is cached or not.

Return Value:

    Returns the virtual address of the common buffer.  If the buffer cannot
    be allocated then NULL is returned.

--*/

{
    return NULL;
}

BOOLEAN
HalFlushCommonBuffer(
    IN PADAPTER_OBJECT AdapterObject,
    IN ULONG Length,
    IN PHYSICAL_ADDRESS LogicalAddress,
    IN PVOID VirtualAddress
    )
/*++

Routine Description:

    This function is called to flush any hardware adapter buffers when the
    driver needs to read data written by an I/O master device to a common
    buffer.  As there is no DMA support, that implies no buffers to flush
    and TRUE is always returned.

Arguments:

    AdapterObject - Supplies a pointer to the adapter object used by this
    device.

    Length - Supplies the length of the common buffer. This should be the same
    value used for the allocation of the buffer.

    LogicalAddress - Supplies the logical address of the common buffer.  This
    must be the same value return by HalAllocateCommonBuffer.

    VirtualAddress - Supplies the virtual address of the common buffer.  This
    must be the same value return by HalAllocateCommonBuffer.

Return Value:

    Returns TRUE if no errors were detected; otherwise, FALSE is return.

--*/

{
    return TRUE;
}

VOID
HalFreeCommonBuffer(
    IN PADAPTER_OBJECT AdapterObject,
    IN ULONG Length,
    IN PHYSICAL_ADDRESS LogicalAddress,
    IN PVOID VirtualAddress,
    IN BOOLEAN CacheEnabled
    )
/*++

Routine Description:

    This function frees a common buffer and all of the resouces it uses.
    There is no buffer to be freed in the simulation environment. The
    function simply returns.

Arguments:

    AdapterObject - Supplies a pointer to the adapter object used by this
    device.

    Length - Supplies the length of the common buffer. This should be the same
    value used for the allocation of the buffer.

    LogicalAddress - Supplies the logical address of the common buffer.  This
    must be the same value return by HalAllocateCommonBuffer.

    VirtualAddress - Supplies the virtual address of the common buffer.  This
    must be the same value return by HalAllocateCommonBuffer.

    CacheEnable - Indicates whether the memeory is cached or not.

Return Value:

    None

--*/

{
    return;
}

PVOID
HalAllocateCrashDumpRegisters(
    IN PADAPTER_OBJECT AdapterObject,
    IN PULONG NumberOfMapRegisters
    )
/*++

Routine Description:

    This routine is called during the crash dump disk driver's initialization
    to allocate a number map registers permanently.  It is not supported and
    NULL is always returned to indicate allocation failure.  The lack of this
    capability implies that the crash dump disk driver is not supported.

Arguments:

    AdapterObject - Pointer to the adapter control object to allocate to the
    driver.
    NumberOfMapRegisters - Number of map registers requested. This field
    will be updated to reflect the actual number of registers allocated
    when the number is less than what was requested.

Return Value:

    Returns NULL.

--*/
{
    return NULL;
}

BOOLEAN
IoFlushAdapterBuffers(
    IN PADAPTER_OBJECT AdapterObject,
    IN PMDL Mdl,
    IN PVOID MapRegisterBase,
    IN PVOID CurrentVa,
    IN ULONG Length,
    IN BOOLEAN WriteToDevice
    )

/*++

Routine Description:

    This routine flushes the DMA adapter object buffers. In the simulation
    environment, nothing needs to be done and TRUE is always returned.

Arguments:

    AdapterObject - Pointer to the adapter object representing the DMA
    controller channel.

    Mdl - A pointer to a Memory Descriptor List (MDL) that maps the locked-down
    buffer to/from which the I/O occured.

    MapRegisterBase - A pointer to the base of the map registers in the adapter
    or DMA controller.

    CurrentVa - The current virtual address in the buffer described the the Mdl
    where the I/O operation occurred.

    Length - Supplies the length of the transfer.

    WriteToDevice - Supplies a BOOLEAN value that indicates the direction of
    the data transfer was to the device.

Return Value:

    TRUE - No errors are detected so the transfer must succeed.

--*/

{
    return TRUE;
}

VOID
IoFreeAdapterChannel(
    IN PADAPTER_OBJECT AdapterObject
    )

/*++

Routine Description:

    This routine is invoked to deallocate the specified adapter object.
    Any map registers that were allocated are also automatically deallocated.
    No checks are made to ensure that the adapter is really allocated to
    a device object.  However, if it is not, then kernel will bugcheck.

    If another device is waiting in the queue to allocate the adapter object
    it will be pulled from the queue and its execution routine will be
    invoked.
	
    In the simulation environment, this routine does nothing and returns.

Arguments:

    AdapterObject - Pointer to the adapter object to be deallocated.

Return Value:

    None.

--*/

{
    return;
}

VOID
IoFreeMapRegisters(
   PADAPTER_OBJECT AdapterObject,
   PVOID MapRegisterBase,
   ULONG NumberOfMapRegisters
   )
/*++

Routine Description:

    This routine deallocates the map registers for the adapter.  If there are
    any queued adapter waiting for an attempt is made to allocate the next
    entry.

    In the simulation environment, the routine does nothing and returns.

Arguments:

    AdapterObject - The adapter object to where the map register should be
    returned.

    MapRegisterBase - The map register base of the registers to be deallocated.

    NumberOfMapRegisters - The number of registers to be deallocated.

Return Value:

    None

--+*/
{
    return;
}

PHYSICAL_ADDRESS
IoMapTransfer(
    IN PADAPTER_OBJECT AdapterObject,
    IN PMDL Mdl,
    IN PVOID MapRegisterBase,
    IN PVOID CurrentVa,
    IN OUT PULONG Length,
    IN BOOLEAN WriteToDevice
    )

/*++

Routine Description:

    This routine is invoked to set up the map registers in the DMA controller
    to allow a transfer to or from a device.

    In the simulation environment, no map register is supported and a
    logical address of zero is always returned.


Arguments:

    AdapterObject - Pointer to the adapter object representing the DMA
    controller channel that has been allocated.

    Mdl - Pointer to the MDL that describes the pages of memory that are
    being read or written.

    MapRegisterBase - The address of the base map register that has been
    allocated to the device driver for use in mapping the transfer.

    CurrentVa - Current virtual address in the buffer described by the MDL
    that the transfer is being done to or from.

    Length - Supplies the length of the transfer.  This determines the
    number of map registers that need to be written to map the transfer.
    Returns the length of the transfer which was actually mapped.

    WriteToDevice - Boolean value that indicates whether this is a write
    to the device from memory (TRUE), or vice versa.

Return Value:

    Returns the logical address that should be used bus master controllers.

--*/

{
    PHYSICAL_ADDRESS result;

    result.HighPart = 0;
    result.LowPart = 0;
    return (result);
}

ULONG
HalGetDmaAlignmentRequirement (
    VOID
    )

/*++

Routine Description:

    This function returns the alignment requirements for DMA transfers on
    host system.

Arguments:

    None.

Return Value:

    The DMA alignment requirement is returned as the fucntion value.

--*/

{

    return 8;
}

VOID
HalFlushIoBuffers (
    IN PMDL Mdl,
    IN BOOLEAN ReadOperation,
    IN BOOLEAN DmaOperation
    )

/*++

Routine Description:

    This function flushes the I/O buffer specified by the memory descriptor
    list from the data cache on the current processor.

Arguments:

    Mdl - Supplies a pointer to a memory descriptor list that describes the
        I/O buffer location.

    ReadOperation - Supplies a boolean value that determines whether the I/O
        operation is a read into memory.

    DmaOperation - Supplies a boolean value that determines whether the I/O
        operation is a DMA operation.

Return Value:

    None.

--*/

{
    //
    // BUGBUG:  This still needs to be done
    //

}