[VIDEOPRT]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 1 Oct 2010 17:43:03 +0000 (17:43 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 1 Oct 2010 17:43:03 +0000 (17:43 +0000)
- Add sanity checks
- Implement VideoPortGetCommonBuffer, VideoPortLockPages

See issue #5629 for more details.

svn path=/trunk/; revision=48954

reactos/drivers/video/videoprt/dma.c
reactos/drivers/video/videoprt/resource.c
reactos/drivers/video/videoprt/stubs.c
reactos/drivers/video/videoprt/videoprt.c
reactos/drivers/video/videoprt/videoprt.h

index a2db10a..e35f63b 100644 (file)
 
 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;
 }
 
 /*
index b17edb7..1e4162d 100644 (file)
@@ -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
index 0f6a29f..5e557f0 100644 (file)
@@ -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(
index 4c339b6..e2e8df2 100644 (file)
@@ -304,6 +304,8 @@ IntVideoPortCreateAdapterDeviceObject(
    }
 
    InitializeListHead(&DeviceExtension->AddressMappingListHead);
+   InitializeListHead(&DeviceExtension->DmaAdapterList);
+
    KeInitializeDpc(
       &DeviceExtension->DpcObject,
       IntVideoPortDeferredRoutine,
index 21ea2c0..9a24c2e 100644 (file)
@@ -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;