From 03327dfba3adb56eb7cb1cef53056fa99274fa72 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 6 Jan 2009 05:33:34 +0000 Subject: [PATCH] - Remove dma_master.c as it is unused - Implement PcNewDmaChannel - partly implement IDmaChannel / IDmaChannelSlave svn path=/trunk/; revision=38598 --- .../wdm/audio/backpln/portcls/dma_master.c | 198 --------------- .../wdm/audio/backpln/portcls/dma_slave.c | 225 ++++++++++++++++-- .../wdm/audio/backpln/portcls/port_wavepci.c | 1 - .../wdm/audio/backpln/portcls/portcls.rbuild | 2 +- .../wdm/audio/backpln/portcls/private.h | 6 - .../drivers/wdm/audio/backpln/portcls/stubs.c | 12 +- 6 files changed, 202 insertions(+), 242 deletions(-) delete mode 100644 reactos/drivers/wdm/audio/backpln/portcls/dma_master.c diff --git a/reactos/drivers/wdm/audio/backpln/portcls/dma_master.c b/reactos/drivers/wdm/audio/backpln/portcls/dma_master.c deleted file mode 100644 index d5afad2615c..00000000000 --- a/reactos/drivers/wdm/audio/backpln/portcls/dma_master.c +++ /dev/null @@ -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; -} diff --git a/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c b/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c index c785262c1d3..9d68b6911ef 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c @@ -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; } - diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c index b10aaeae710..5ad694afa0a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c @@ -7,7 +7,6 @@ typedef struct #if 0 IUnregisterSubdevice *lpVtblUnregisterSubDevice; - IPortClsVersionVtbl *lpVtblPortClsVersion; #endif LONG ref; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild index 0632edeaf5d..c5ffa080f8c 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild +++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild @@ -9,9 +9,9 @@ ks drmk rtl + hal api.c dll.c - dma_master.c dma_slave.c drm_port.c adapter.c diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index 46ab79d0837..07874386224 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -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); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/stubs.c b/reactos/drivers/wdm/audio/backpln/portcls/stubs.c index d1740bc48c6..480a9d6010a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/stubs.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/stubs.c @@ -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