mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 20:34:59 +00:00
[VIDEOPRT]
- Add sanity checks - Implement VideoPortGetCommonBuffer, VideoPortLockPages See issue #5629 for more details. svn path=/trunk/; revision=48954
This commit is contained in:
parent
2374c7cb8d
commit
a53b8966ba
5 changed files with 159 additions and 41 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -304,6 +304,8 @@ IntVideoPortCreateAdapterDeviceObject(
|
|||
}
|
||||
|
||||
InitializeListHead(&DeviceExtension->AddressMappingListHead);
|
||||
InitializeListHead(&DeviceExtension->DmaAdapterList);
|
||||
|
||||
KeInitializeDpc(
|
||||
&DeviceExtension->DpcObject,
|
||||
IntVideoPortDeferredRoutine,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue