diff --git a/reactos/drivers/video/videoprt/dma.c b/reactos/drivers/video/videoprt/dma.c index a2db10a9920..e35f63b9ecf 100644 --- a/reactos/drivers/video/videoprt/dma.c +++ b/reactos/drivers/video/videoprt/dma.c @@ -14,8 +14,10 @@ typedef struct { + LIST_ENTRY Entry; PDMA_ADAPTER Adapter; ULONG MapRegisters; + PVOID HwDeviceExtension; }VIP_DMA_ADAPTER, *PVIP_DMA_ADAPTER; @@ -46,7 +48,14 @@ VideoPortAllocateCommonBuffer(IN PVOID HwDeviceExtension, { PVIP_DMA_ADAPTER Adapter = (PVIP_DMA_ADAPTER)VpDmaAdapter; + /* check for valid arguments */ + if (!Adapter || !Adapter->Adapter) + { + /* invalid parameter */ + return NULL; + } + /* allocate common buffer */ return Adapter->Adapter->DmaOperations->AllocateCommonBuffer(Adapter->Adapter, DesiredLength, LogicalAddress, CacheEnabled); } @@ -64,6 +73,14 @@ VideoPortReleaseCommonBuffer(IN PVOID HwDeviceExtension, { PVIP_DMA_ADAPTER Adapter = (PVIP_DMA_ADAPTER)VpDmaAdapter; + /* check for valid arguments */ + if (!Adapter || !Adapter->Adapter) + { + /* invalid parameter */ + return; + } + + /* release common buffer */ Adapter->Adapter->DmaOperations->FreeCommonBuffer(Adapter->Adapter, Length, LogicalAddress, VirtualAddress, CacheEnabled); } @@ -75,9 +92,22 @@ NTAPI VideoPortPutDmaAdapter(IN PVOID HwDeviceExtension, IN PVP_DMA_ADAPTER VpDmaAdapter) { + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; PVIP_DMA_ADAPTER Adapter = (PVIP_DMA_ADAPTER)VpDmaAdapter; + /* get hw device extension */ + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + /* sanity check */ + ASSERT(!IsListEmpty(&DeviceExtension->DmaAdapterList)); + + /* remove dma adapter from list */ + RemoveEntryList(&Adapter->Entry); + + /* release dma adapter */ Adapter->Adapter->DmaOperations->PutDmaAdapter(Adapter->Adapter); + + /* free memory */ ExFreePool(Adapter); } @@ -95,13 +125,21 @@ VideoPortGetDmaAdapter(IN PVOID HwDeviceExtension, PVIP_DMA_ADAPTER Adapter; PDMA_ADAPTER DmaAdapter; + /* allocate private adapter structure */ + Adapter = ExAllocatePool(NonPagedPool, sizeof(VIP_DMA_ADAPTER)); + if (!Adapter) + { + /* failed to allocate adapter structure */ + return NULL; + } + /* Zero the structure */ RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION)); /* Initialize the structure */ DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; - DeviceDescription.Master = TRUE /* ?? */; + DeviceDescription.Master = TRUE; DeviceDescription.DmaWidth = Width8Bits; DeviceDescription.DmaSpeed = Compatible; @@ -115,21 +153,28 @@ VideoPortGetDmaAdapter(IN PVOID HwDeviceExtension, DeviceDescription.BusNumber = DeviceExtension->SystemIoBusNumber; DeviceDescription.InterfaceType = DeviceExtension->AdapterInterfaceType; - Adapter = ExAllocatePool(NonPagedPool, sizeof(VIP_DMA_ADAPTER)); - if (!Adapter) - return NULL; - - + /* acquire dma adapter */ DmaAdapter = IoGetDmaAdapter(DeviceExtension->PhysicalDeviceObject, &DeviceDescription, &NumberOfMapRegisters); if (!DmaAdapter) { + /* failed to acquire dma */ ExFreePool(Adapter); return NULL; } + /* store dma adapter */ Adapter->Adapter = DmaAdapter; + + /* store map register count */ Adapter->MapRegisters = NumberOfMapRegisters; + /* store hw device extension */ + Adapter->HwDeviceExtension = HwDeviceExtension; + + /* store in dma adapter list */ + InsertTailList(&DeviceExtension->DmaAdapterList, &Adapter->Entry); + + /* return result */ return (PVP_DMA_ADAPTER)Adapter; } @@ -144,21 +189,26 @@ VideoPortFreeCommonBuffer(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled) { - DEVICE_DESCRIPTION DeviceDescription; - PVP_DMA_ADAPTER VpDmaAdapter; + PVIP_DMA_ADAPTER VpDmaAdapter; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + /* sanity check */ + ASSERT(!IsListEmpty(&DeviceExtension->DmaAdapterList)); + + /* grab first dma adapter */ + VpDmaAdapter = (PVIP_DMA_ADAPTER)CONTAINING_RECORD(DeviceExtension->DmaAdapterList.Flink, VIP_DMA_ADAPTER, Entry); + + /* sanity checks */ + ASSERT(VpDmaAdapter->HwDeviceExtension == HwDeviceExtension); + ASSERT(VpDmaAdapter->Adapter != NULL); + ASSERT(VpDmaAdapter->MapRegisters != 0); + + return VideoPortReleaseCommonBuffer(HwDeviceExtension, (PVP_DMA_ADAPTER)VpDmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled); - /* FIXME: Broken code*/ - VpDmaAdapter = VideoPortGetDmaAdapter(HwDeviceExtension, - (PVP_DEVICE_DESCRIPTION)&DeviceDescription); - HalFreeCommonBuffer((PADAPTER_OBJECT)VpDmaAdapter, - Length, - LogicalAddress, - VirtualAddress, - CacheEnabled); } /* - * @unimplemented + * @implemented */ PVOID NTAPI @@ -169,8 +219,44 @@ VideoPortGetCommonBuffer(IN PVOID HwDeviceExtension, OUT PULONG pActualLength, IN BOOLEAN CacheEnabled) { - UNIMPLEMENTED; - return NULL; + PVOID Result; + PVIP_DMA_ADAPTER VpDmaAdapter; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + /* maximum palette size */ + if (DesiredLength > 262144) + { + /* size exceeded */ + return NULL; + } + + /* sanity check */ + ASSERT(!IsListEmpty(&DeviceExtension->DmaAdapterList)); + + /* grab first dma adapter */ + VpDmaAdapter = (PVIP_DMA_ADAPTER)CONTAINING_RECORD(DeviceExtension->DmaAdapterList.Flink, VIP_DMA_ADAPTER, Entry); + + /* sanity checks */ + ASSERT(VpDmaAdapter->HwDeviceExtension == HwDeviceExtension); + ASSERT(VpDmaAdapter->Adapter != NULL); + ASSERT(VpDmaAdapter->MapRegisters != 0); + + + /* allocate common buffer */ + Result = VideoPortAllocateCommonBuffer(HwDeviceExtension, (PVP_DMA_ADAPTER)VpDmaAdapter, DesiredLength, LogicalAddress, CacheEnabled, NULL); + + if (Result) + { + /* store length */ + *pActualLength = DesiredLength; + } + else + { + /* failed to allocate common buffer */ + *pActualLength = 0; + } + + return Result; } /* @@ -185,7 +271,7 @@ VideoPortUnmapDmaMemory( PDMA BoardMemoryHandle) { /* Deprecated */ - return FALSE; + return FALSE; } /* @@ -203,7 +289,7 @@ VideoPortMapDmaMemory(IN PVOID HwDeviceExtension, IN OUT PVOID *VirtualAddress) { /* Deprecated */ - return NULL; + return NULL; } /* @@ -216,7 +302,7 @@ VideoPortSetDmaContext(IN PVOID HwDeviceExtension, IN PVOID InstanceContext) { /* Deprecated */ - return; + return; } /* @@ -228,7 +314,7 @@ VideoPortSignalDmaComplete(IN PVOID HwDeviceExtension, IN PDMA pDmaHandle) { /* Deprecated */ - return FALSE; + return FALSE; } @@ -327,7 +413,7 @@ VideoPortGetDmaContext(IN PVOID HwDeviceExtension, IN PDMA pDma) { /* Deprecated */ - return NULL; + return NULL; } /* @@ -344,7 +430,7 @@ VideoPortDoDma(IN PVOID HwDeviceExtension, } /* - * @unimplemented + * @implemented */ PDMA NTAPI @@ -353,8 +439,8 @@ VideoPortAssociateEventsWithDmaHandle(IN PVOID HwDeviceExtension, IN PVOID MappedUserEvent, IN PVOID DisplayDriverEvent) { - UNIMPLEMENTED; - return NULL; + /* Deprecated */ + return NULL; } /* diff --git a/reactos/drivers/video/videoprt/resource.c b/reactos/drivers/video/videoprt/resource.c index b17edb75500..1e4162de0c3 100644 --- a/reactos/drivers/video/videoprt/resource.c +++ b/reactos/drivers/video/videoprt/resource.c @@ -760,7 +760,49 @@ VideoPortLockBuffer( } /* - * @unimplemented + * @implemented + */ + +BOOLEAN +NTAPI +VideoPortLockPages( + IN PVOID HwDeviceExtension, + IN OUT PVIDEO_REQUEST_PACKET pVrp, + IN PEVENT pUEvent, + IN PEVENT pDisplayEvent, + IN DMA_FLAGS DmaFlags) +{ + PVOID Buffer; + + /* clear output buffer */ + pVrp->OutputBuffer = NULL; + + if (DmaFlags != VideoPortDmaInitOnly) + { + /* VideoPortKeepPagesLocked / VideoPortUnlockAfterDma is no-op */ + return FALSE; + } + + /* lock the buffer */ + Buffer = VideoPortLockBuffer(HwDeviceExtension, pVrp->InputBuffer, pVrp->InputBufferLength, IoModifyAccess); + + if (Buffer) + { + /* store result buffer & length */ + pVrp->OutputBuffer = Buffer; + pVrp->OutputBufferLength = pVrp->InputBufferLength; + + /* operation succeeded */ + return TRUE; + } + + /* operation failed */ + return FALSE; +} + + +/* + * @implemented */ VOID NTAPI diff --git a/reactos/drivers/video/videoprt/stubs.c b/reactos/drivers/video/videoprt/stubs.c index 0f6a29f876f..5e557f09cfc 100644 --- a/reactos/drivers/video/videoprt/stubs.c +++ b/reactos/drivers/video/videoprt/stubs.c @@ -62,19 +62,6 @@ VideoPortGetMdl( return 0; } -BOOLEAN -NTAPI -VideoPortLockPages( - IN PVOID HwDeviceExtension, - IN OUT PVIDEO_REQUEST_PACKET pVrp, - IN PEVENT pUEvent, - IN PEVENT pDisplayEvent, - IN DMA_FLAGS DmaFlags) -{ - UNIMPLEMENTED; - return 0; -} - LONG NTAPI VideoPortReadStateEvent( diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 4c339b67677..e2e8df2ca77 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -304,6 +304,8 @@ IntVideoPortCreateAdapterDeviceObject( } InitializeListHead(&DeviceExtension->AddressMappingListHead); + InitializeListHead(&DeviceExtension->DmaAdapterList); + KeInitializeDpc( &DeviceExtension->DpcObject, IntVideoPortDeferredRoutine, diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index 21ea2c09ee1..9a24c2e6e31 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -95,6 +95,7 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION ULONG DeviceOpened; AGP_BUS_INTERFACE_STANDARD AgpInterface; KMUTEX DeviceLock; + LIST_ENTRY DmaAdapterList; CHAR MiniPortDeviceExtension[1]; } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION;