VBoxVideoVdma.cpp revision 46b6f5e0e4ef79e4c6c475e86463ab184074c277
/*
* Copyright (C) 2010 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
#include "../VBoxVideo.h"
#include "../Helper.h"
#include <VBox/VBoxGuestLib.h>
#include <VBox/VBoxVideo.h>
#include "VBoxVideoVdma.h"
#include "../VBoxVideo.h"
/*
* This is currently used by VDMA. It is invisible for Vdma API clients since
* Vdma transport may change if we choose to use another (e.g. more light-weight)
* transport for DMA commands submission
*/
{
int rc = VINF_SUCCESS;
PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMICommandAlloc (&pDevExt->u.primary.hgsmiAdapterHeap, sizeof (VBOXVDMA_CTL), HGSMI_CH_VBVA, VBVA_VDMA_CTL);
if (pCmd)
{
}
else
{
}
return rc;
}
/* create a DMACommand buffer */
int vboxVdmaCreate (PDEVICE_EXTENSION pDevExt, VBOXVDMAINFO *pInfo, ULONG offBuffer, ULONG cbBuffer)
{
if((offBuffer & 0xfff)
|| (cbBuffer & 0xfff)
|| !offBuffer
|| !cbBuffer)
{
drprintf((__FUNCTION__": invalid parameters: offBuffer(0x%x), cbBuffer(0x%x)", offBuffer, cbBuffer));
return VERR_INVALID_PARAMETER;
}
&pvBuffer,
cbBuffer);
if (RT_SUCCESS(rc))
{
/* Setup a HGSMI heap within the adapter information area. */
false /*fOffsetBased*/);
if(RT_SUCCESS(rc))
return rc;
else
}
else
return rc;
}
{
return VINF_ALREADY_INITIALIZED;
/* ensure nothing else is submitted */
return rc;
}
{
return VINF_ALREADY_INITIALIZED;
if (RT_SUCCESS(rc))
return rc;
}
{
return VINF_ALREADY_INITIALIZED;
return rc;
}
{
int rc = VINF_SUCCESS;
return rc;
}
{
}
{
{
/* data info is a pointer to the buffer to be coppied and included in the command */
pCmdDr = (PVBOXVDMACBUF_DR)VBoxSHGSMICommandAlloc (&pInfo->CmdHeap, sizeof (VBOXVDMACBUF_DR) + pBufInfo->cbBuf, HGSMI_CH_VBVA, VBVA_VDMA_CMD);
if (!pCmdDr)
return NULL;
}
else
{
pCmdDr = (PVBOXVDMACBUF_DR)VBoxSHGSMICommandAlloc (&pInfo->CmdHeap, sizeof (VBOXVDMACBUF_DR), HGSMI_CH_VBVA, VBVA_VDMA_CMD);
if (!pCmdDr)
return NULL;
else
}
return pCmdDr;
}
static DECLCALLBACK(void) vboxVdmaCBufDrCompletion(struct _HGSMIHEAP * pHeap, void *pvCmd, void *pvContext)
{
}
static DECLCALLBACK(void) vboxVdmaCBufDrCompletionIrq(struct _HGSMIHEAP * pHeap, void *pvCmd, void *pvContext,
{
{
}
{
}
else
{
}
pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, ¬ify);
/* inform SHGSMI we want to be called at DPC later */
}
{
}
int vboxVdmaCBufSubmit (PDEVICE_EXTENSION pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACMDBUF_INFO pBufInfo)
{
if (!pdr)
return VERR_OUT_OF_RESOURCES;
return VINF_SUCCESS;
}