#include "xf86.h"
#include "via.h"
#include "via_driver.h"
#include "via_regrec.h"
void viaWaitHQVIdle(VIAPtr pVia)
{
while (!IN_HQV_FIRE);
}
void viaWaitVideoCommandFire(VIAPtr pVia)
{
CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+V_COMPOSE_MODE);
while ((*pdwState & V1_COMMAND_FIRE)||(*pdwState & V3_COMMAND_FIRE));
}
void viaWaitHQVFlip(VIAPtr pVia)
{
CARD32 volatile *pdwState = (CARD32 volatile *) pVia->VidMapBase;
pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL);
while (!(*pdwState & HQV_FLIP_STATUS) );
}
void viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData)
{
CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL);
*pdwState =dwData;
while ((*pdwState & HQV_FLIP_STATUS) )
{
VIDOutD(HQV_CONTROL, *pdwState|HQV_FLIP_STATUS);
}
}
void viaWaitVBI(VIAPtr pVia)
{
while (IN_VIDEO_DISPLAY);
}
void viaWaitHQVDone(VIAPtr pVia)
{
CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL);
if (pVia->swov.MPEG_ON)
{
while ((*pdwState & HQV_SW_FLIP) );
}
}
void viaMacro_VidREGFlush(VIAPtr pVia)
{
unsigned long i;
VIDEOREGISTER *VidReg = (VIDEOREGISTER*) pVia->VidReg;
viaWaitVideoCommandFire(pVia);
for (i=0; i< pVia->gdwVidRegCounter; i++ )
{
VIDOutD(VidReg[i].dwIndex, VidReg[i].dwData);
DBG_DD(ErrorF("viaMacro_VidREGFlush:%08lx %08lx\n",VidReg[i].dwIndex+0x200,VidReg[i].dwData));
}
}
void viaMacro_VidREGRec(VIAPtr pVia, unsigned long dwAction, unsigned long dwIndex, unsigned long dwData)
{
VIDEOREGISTER *VidReg;
switch (dwAction)
{
case VIDREGREC_RESET_COUNTER :
if (!pVia->VidReg)
pVia->VidReg = xnfcalloc(VIDEO_REG_NUM,sizeof(VIDEOREGISTER));
pVia->gdwVidRegCounter = 0;
break;
case VIDREGREC_SAVE_REGISTER:
VidReg = (VIDEOREGISTER*) pVia->VidReg;
VidReg[pVia->gdwVidRegCounter].dwIndex = dwIndex;
VidReg[pVia->gdwVidRegCounter].dwData = dwData;
pVia->gdwVidRegCounter++;
if ( pVia->gdwVidRegCounter > VIDEO_REG_NUM){
DBG_DD(ErrorF("viaMacro_VidREGRec:Out of Video register space"));
}
break;
default :
DBG_DD(ErrorF("viaMacro_VidREGRec:Unknow action"));
break;
}
}
void viaMacro_VidREGFlushVPE(VIAPtr pVia)
{
VIDEOREGISTER *VidReg = (VIDEOREGISTER*) pVia->VidReg;
unsigned long i;
CARD32 volatile *pdwState = (CARD32 volatile *) pVia->VidMapBase;
pdwState = (CARD32 volatile *) (pVia->VidMapBase+V_COMPOSE_MODE);
while ((*pdwState & V1_COMMAND_FIRE)||(*pdwState & V3_COMMAND_FIRE));
for (i=0; i< pVia->gdwVidRegCounter; i++ )
{
VIDOutD(VidReg[i].dwIndex, VidReg[i].dwData);
DBG_DD(ErrorF("viaMacro_VidREGFlush V3:%08lx %08lx\n",VidReg[i].dwIndex+0x200,VidReg[i].dwData));
}
}
void viaMacro_VidREGRecVPE(VIAPtr pVia, unsigned long dwAction, unsigned long dwIndex, unsigned long dwData)
{
VIDEOREGISTER *VidReg;
switch (dwAction)
{
case VIDREGREC_RESET_COUNTER :
if (!pVia->VidReg)
pVia->VidReg = xnfcalloc(VIDEO_REG_NUM,sizeof(VIDEOREGISTER));
pVia->gdwVidRegCounter = 0;
break;
case VIDREGREC_SAVE_REGISTER:
VidReg = (VIDEOREGISTER*) pVia->VidReg;
VidReg[pVia->gdwVidRegCounter].dwIndex = dwIndex;
VidReg[pVia->gdwVidRegCounter].dwData = dwData;
pVia->gdwVidRegCounter++;
if ( pVia->gdwVidRegCounter > VIDEO_REG_NUM){
}
break;
default :
break;
}
}