- Remove dma_master.c as it is unused

- Implement PcNewDmaChannel
- partly implement IDmaChannel / IDmaChannelSlave

svn path=/trunk/; revision=38598
This commit is contained in:
Johannes Anderwald
2009-01-06 05:33:34 +00:00
parent b8c35daba1
commit 03327dfba3
6 changed files with 202 additions and 242 deletions
@@ -1,198 +0,0 @@
#include "private.h"
typedef struct
{
IDmaChannelSlaveVtbl *lpVtbl;
LONG ref;
ULONG BufferSize;
PHYSICAL_ADDRESS Address;
}IDmaChannelImpl;
/*
Basic IUnknown methods
*/
NTSTATUS
STDMETHODCALLTYPE
IDmaChannel_fnQueryInterface(
IDmaChannel* iface,
IN REFIID refiid,
OUT PVOID* Output)
{
/* TODO */
return STATUS_UNSUCCESSFUL;
}
ULONG
STDMETHODCALLTYPE
IDmaChannel_fnAddRef(
IDmaChannel* iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_AddRef: This %p\n", This);
return _InterlockedIncrement(&This->ref);
}
ULONG
STDMETHODCALLTYPE
IDmaChannel_fnRelease(
IDmaChannel* iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
_InterlockedDecrement(&This->ref);
DPRINT("IDmaChannel_Release: This %p new ref %u\n", This, This->ref);
if (This->ref == 0)
{
ExFreePoolWithTag(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
return This->ref;
}
NTSTATUS
NTAPI
IDmaChannel_fnAllocateBuffer(
IN IDmaChannel * iface,
IN ULONG BufferSize,
IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_AllocateBuffer: This %p BufferSize %u\n", This, BufferSize);
/* Did the caller already allocate a buffer ?*/
if (This->BufferSize) return STATUS_UNSUCCESSFUL;
/* FIXME */
//This->BufferSize = BufferSize;
return STATUS_UNSUCCESSFUL;
}
ULONG
NTAPI
IDmaChannel_fnAllocatedBufferSize(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_AllocatedBufferSize: This %p BufferSize %u\n", This, This->BufferSize);
return This->BufferSize;
}
VOID
NTAPI
IDmaChannel_fnCopyFrom(
IN IDmaChannel * iface,
IN PVOID Destination,
IN PVOID Source,
IN ULONG ByteCount
)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_CopyFrom: This %p Destination %p Source %p ByteCount %u\n", This, Destination, Source, ByteCount);
}
VOID
NTAPI
IDmaChannel_fnCopyTo(
IN IDmaChannel * iface,
IN PVOID Destination,
IN PVOID Source,
IN ULONG ByteCount
)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_CopyTo: This %p Destination %p Source %p ByteCount %u\n", This, Destination, Source, ByteCount);
}
VOID
NTAPI
IDmaChannel_fnFreeBuffer(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_FreeBuffer: This %p\n", This);
}
PADAPTER_OBJECT
NTAPI
IDmaChannel_fnGetAdapterObject(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_GetAdapterObject: This %p\n", This);
return NULL;
}
ULONG
NTAPI
IDmaChannel_fnMaximumBufferSize(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_MaximumBufferSize: This %p\n", This);
return 0;
}
PHYSICAL_ADDRESS
NTAPI
IDmaChannel_fnPhysicalAdress(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_PhysicalAdress: This %p\n", This);
return This->Address;
}
VOID
NTAPI
IDmaChannel_fnSetBufferSize(
IN IDmaChannel * iface,
IN ULONG BufferSize)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_SetBufferSize: This %p\n", This);
}
PVOID
NTAPI
IDmaChannel_fnSystemAddress(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_SystemAddress: This %p\n", This);
return NULL;
}
ULONG
NTAPI
IDmaChannel_fnTransferCount(
IN IDmaChannel * iface)
{
IDmaChannelImpl * This = (IDmaChannelImpl*)iface;
DPRINT("IDmaChannel_TransferCount: This %p\n", This);
return 0;
}
@@ -7,16 +7,31 @@ typedef struct
LONG ref;
PDEVICE_OBJECT pDeviceObject;
PDMA_ADAPTER pAdapter;
BOOL DmaStarted;
ULONG MapSize;
PVOID MapRegisterBase;
ULONG LastTransferCount;
ULONG MaximumBufferSize;
ULONG MaxMapRegisters;
ULONG AllocatedBufferSize;
ULONG BufferSize;
PDMA_ADAPTER pAdapter;
PHYSICAL_ADDRESS Address;
PVOID Buffer;
PMDL Mdl;
BOOLEAN WriteToDevice;
}IDmaChannelSlaveImpl;
const GUID IID_IDmaChannel;
//---------------------------------------------------------------
// IUnknown methods
@@ -30,7 +45,17 @@ IDmaChannelSlave_fnQueryInterface(
IN REFIID refiid,
OUT PVOID* Output)
{
/* TODO */
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
if (IsEqualGUIDAligned(refiid, &IID_IUnknown) ||
IsEqualGUIDAligned(refiid, &IID_IDmaChannel) ||
IsEqualGUIDAligned(refiid, &IID_IDmaChannelSlave))
{
*Output = &This->lpVtbl;
InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
return STATUS_UNSUCCESSFUL;
}
@@ -81,8 +106,6 @@ IDmaChannelSlave_fnAllocateBuffer(
{
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_AllocateBuffer: This %p BufferSize %u\n", This, BufferSize);
/* Did the caller already allocate a buffer ?*/
if (This->Buffer)
{
@@ -90,6 +113,9 @@ IDmaChannelSlave_fnAllocateBuffer(
return STATUS_UNSUCCESSFUL;
}
//FIXME
// retry with different size on failure
This->Buffer = This->pAdapter->DmaOperations->AllocateCommonBuffer(This->pAdapter, BufferSize, &This->Address, TRUE);
if (!This->Buffer)
{
@@ -97,10 +123,6 @@ IDmaChannelSlave_fnAllocateBuffer(
return STATUS_UNSUCCESSFUL;
}
This->Mdl = IoAllocateMdl(This->Buffer, BufferSize, FALSE, FALSE, NULL);
if (This->Mdl)
MmBuildMdlForNonPagedPool(This->Mdl);
This->BufferSize = BufferSize;
This->AllocatedBufferSize = BufferSize;
return STATUS_SUCCESS;
@@ -129,6 +151,8 @@ IDmaChannelSlave_fnCopyFrom(
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_CopyFrom: This %p Destination %p Source %p ByteCount %u\n", This, Destination, Source, ByteCount);
iface->lpVtbl->CopyTo(iface, Destination, Source, ByteCount);
}
VOID
@@ -143,8 +167,9 @@ IDmaChannelSlave_fnCopyTo(
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_CopyTo: This %p Destination %p Source %p ByteCount %u\n", This, Destination, Source, ByteCount);
RtlCopyMemory(Destination, Source, ByteCount);
}
VOID
NTAPI
IDmaChannelSlave_fnFreeBuffer(
@@ -163,6 +188,13 @@ IDmaChannelSlave_fnFreeBuffer(
This->pAdapter->DmaOperations->FreeCommonBuffer(This->pAdapter, This->AllocatedBufferSize, This->Address, This->Buffer, TRUE);
This->Buffer = NULL;
This->AllocatedBufferSize = 0;
This->Address.QuadPart = 0LL;
if (This->Mdl)
{
IoFreeMdl(This->Mdl);
This->Mdl = NULL;
}
}
PADAPTER_OBJECT
@@ -184,7 +216,7 @@ IDmaChannelSlave_fnMaximumBufferSize(
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_MaximumBufferSize: This %p\n", This);
return 0;
return This->MaximumBufferSize;
}
PHYSICAL_ADDRESS
@@ -241,7 +273,7 @@ IDmaChannelSlave_fnTransferCount(
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_TransferCount: This %p\n", This);
return 0;
return This->LastTransferCount;
}
ULONG
@@ -249,11 +281,44 @@ NTAPI
IDmaChannelSlave_fnReadCounter(
IN IDmaChannelSlave * iface)
{
ULONG Counter;
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_ReadCounter: This %p\n", This);
Counter = This->pAdapter->DmaOperations->ReadDmaCounter(This->pAdapter);
return 0;
if (!This->DmaStarted || Counter >= This->LastTransferCount) //FIXME
Counter = 0;
return Counter;
}
IO_ALLOCATION_ACTION
NTAPI
AdapterControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID MapRegisterBase,
IN PVOID Context)
{
ULONG Length;
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)Context;
Length = This->MapSize;
This->MapRegisterBase = MapRegisterBase;
This->pAdapter->DmaOperations->MapTransfer(This->pAdapter,
This->Mdl,
MapRegisterBase,
(PVOID)((ULONG_PTR)This->Mdl->StartVa + This->Mdl->ByteOffset),
&Length,
This->WriteToDevice);
if (Length == This->BufferSize)
{
This->DmaStarted = TRUE;
}
return KeepObject;
}
NTSTATUS
@@ -263,10 +328,43 @@ IDmaChannelSlave_fnStart(
ULONG MapSize,
BOOLEAN WriteToDevice)
{
NTSTATUS Status;
ULONG MapRegisters;
KIRQL OldIrql;
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_Start: This %p\n", This);
return 0;
if (This->DmaStarted)
return STATUS_UNSUCCESSFUL;
if (!This->Mdl)
{
This->Mdl = IoAllocateMdl(&This->Buffer, This->MaximumBufferSize, FALSE, FALSE, NULL);
if (!This->Mdl)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
MmBuildMdlForNonPagedPool(This->Mdl);
}
This->MapSize = MapSize;
This->WriteToDevice = WriteToDevice;
This->LastTransferCount = MapSize;
//FIXME
// synchronize access
//
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
MapRegisters = ADDRESS_AND_SIZE_TO_SPAN_PAGES(This->Buffer, MapSize);
Status = This->pAdapter->DmaOperations->AllocateAdapterChannel(This->pAdapter, This->pDeviceObject, MapRegisters, AdapterControl, (PVOID)This);
KeLowerIrql(OldIrql);
if(!NT_SUCCESS(Status))
This->LastTransferCount = 0;
return Status;
}
NTSTATUS
@@ -274,9 +372,29 @@ NTAPI
IDmaChannelSlave_fnStop(
IN IDmaChannelSlave * iface)
{
KIRQL OldIrql;
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_fnStop: This %p\n", This);
if (!This->DmaStarted)
return STATUS_SUCCESS;
This->pAdapter->DmaOperations->FlushAdapterBuffers(This->pAdapter,
This->Mdl,
This->MapRegisterBase,
(PVOID)((ULONG_PTR)This->Mdl->StartVa + This->Mdl->ByteOffset),
This->MapSize,
This->WriteToDevice);
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
This->pAdapter->DmaOperations->FreeAdapterChannel(This->pAdapter);
KeLowerIrql(OldIrql);
This->DmaStarted = FALSE;
return 0;
}
@@ -286,10 +404,40 @@ IDmaChannelSlave_fnWaitForTC(
IN IDmaChannelSlave * iface,
ULONG Timeout)
{
ULONG RetryCount;
ULONG BytesRemaining;
ULONG PrevBytesRemaining;
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_WaitForTC: This %p\n", This);
return 0;
BytesRemaining = This->pAdapter->DmaOperations->ReadDmaCounter(This->pAdapter);
if (!BytesRemaining)
{
return STATUS_SUCCESS;
}
RetryCount = Timeout / 10;
PrevBytesRemaining = 0xFFFFFFFF;
do
{
BytesRemaining = This->pAdapter->DmaOperations->ReadDmaCounter(This->pAdapter);
if (!BytesRemaining)
break;
if (PrevBytesRemaining == BytesRemaining)
break;
KeStallExecutionProcessor(10);
PrevBytesRemaining = BytesRemaining;
}while(RetryCount-- >= 1);
//FIXME
// return error code on timeout
//
return STATUS_SUCCESS;
}
@@ -320,29 +468,56 @@ IDmaChannelSlaveVtbl vt_IDmaChannelSlaveVtbl =
};
NTSTATUS NewDmaChannelSlave(
IN PDEVICE_DESCRIPTION DeviceDesc,
IN PDMA_ADAPTER Adapter,
IN ULONG MapRegisters,
OUT PDMACHANNELSLAVE* DmaChannel)
/*
* @unimplemented
*/
NTSTATUS NTAPI
PcNewDmaChannel(
OUT PDMACHANNEL* OutDmaChannel,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PDEVICE_DESCRIPTION DeviceDescription,
IN PDEVICE_OBJECT DeviceObject)
{
NTSTATUS Status;
PDMA_ADAPTER Adapter;
ULONG MapRegisters;
INTERFACE_TYPE BusType;
ULONG ResultLength;
IDmaChannelSlaveImpl * This;
This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
This = ExAllocatePoolWithTag(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
if (!This)
{
Adapter->DmaOperations->PutDmaAdapter(Adapter);
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = IoGetDeviceProperty(DeviceObject, DevicePropertyLegacyBusType, sizeof(BusType), (PVOID)&BusType, &ResultLength);
if (NT_SUCCESS(Status))
{
DeviceDescription->InterfaceType = BusType;
}
Adapter = IoGetDmaAdapter(DeviceObject, DeviceDescription, &MapRegisters);
if (!Adapter)
{
ExFreePoolWithTag(This, TAG_PORTCLASS);
return STATUS_DEVICE_CONFIGURATION_ERROR;
}
RtlZeroMemory(This, sizeof(IDmaChannelSlaveImpl));
This->ref = 1;
This->lpVtbl = &vt_IDmaChannelSlaveVtbl;
This->pAdapter = Adapter;
This->pDeviceObject = DeviceObject;
This->MaximumBufferSize = DeviceDescription->MaximumLength;
This->MaxMapRegisters = MapRegisters;
*DmaChannel = (PVOID)(&This->lpVtbl);
*OutDmaChannel = (PVOID)(&This->lpVtbl);
return STATUS_SUCCESS;
}
@@ -7,7 +7,6 @@ typedef struct
#if 0
IUnregisterSubdevice *lpVtblUnregisterSubDevice;
IPortClsVersionVtbl *lpVtblPortClsVersion;
#endif
LONG ref;
@@ -9,9 +9,9 @@
<library>ks</library>
<library>drmk</library>
<library>rtl</library>
<library>hal</library>
<file>api.c</file>
<file>dll.c</file>
<file>dma_master.c</file>
<file>dma_slave.c</file>
<file>drm_port.c</file>
<file>adapter.c</file>
@@ -71,12 +71,6 @@ NTSTATUS NewPortWaveCyclic(
NTSTATUS NewPortWavePci(
OUT PPORT* OutPort);
NTSTATUS NewDmaChannelSlave(
IN PDEVICE_DESCRIPTION DeviceDesc,
IN PDMA_ADAPTER Adapter,
IN ULONG MapRegisters,
OUT PDMACHANNELSLAVE* DmaChannel);
NTSTATUS NewIDrmPort(
OUT PDRMPORT2 *OutPort);
@@ -16,17 +16,7 @@
Factory Stubs
*/
NTSTATUS NTAPI
PcNewDmaChannel(
OUT PDMACHANNEL* OutDmaChannel,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PDEVICE_DESCRIPTION DeviceDescription,
IN PDEVICE_OBJECT DeviceObject)
{
UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
}
/* ===============================================================
Power Management