Change Volari_Idle from a macro (#define) to a function.

This commit is contained in:
Ian Romanick
2007-06-25 15:33:10 -07:00
parent edb6c08722
commit 17645e10c7
5 changed files with 154 additions and 118 deletions

View File

@@ -1047,4 +1047,20 @@
#define RES1280x960x120 0x47
#define LFBDRAMTrap 0x30
/**
* MMIO 8C55 - command queue read pointer
*/
#define IDLE_ALL (1 << 31) /**< 3D & 2D idle, HQ & SQ empty */
#define EMPTY_HQ (1 << 30) /**< HQ empty */
#define IDLE_2D (1 << 29) /**< 2D idle */
#define IDLE_3D (1 << 28) /**< 3D idle */
#define EMPTY_HW_CQ (1 << 27) /**< Hardware command queue empty */
#define EMPTY_2D (1 << 26) /**< 2D queue empty */
#define EMPTY_3D (1 << 25) /**< 3D queue empty */
#define EMPTY_SW_CQ (1 << 24) /**< Software command queue empty */
#define COUNTER_3_MASK (0xff << 16)
#define COUNTER_2_MASK (0xff << 8)
#define COUNTER_1_MASK (0xff << 0)
#endif

View File

@@ -47,6 +47,7 @@
#include "xgi_accel.h"
#include "xgi_regs.h"
#include "xgi.h"
#include "vb_def.h"
#include "xaarop.h"
#include <xaa.h>
@@ -103,7 +104,111 @@ static CARD32 BE_SWAP32 (CARD32 val)
#endif
#ifdef DEBUG
static void dump_cq_read_pointer(unsigned int cqrp)
{
static const char *const field_name[8] = {
"all idle",
"hardware queues empty",
"2D idle",
"3D idle",
"hardware command queue empty",
"2D queue empty",
"3D queue empty",
"software command queue empty",
};
unsigned i;
xf86DrvMsg(0, X_INFO, "IO(0x85CC) = 0x%08x\n", cqrp);
for (i = 31; i > 23; i--) {
if ((cqrp & (1U << i)) != 0) {
xf86DrvMsg(0, X_INFO, " %s\n", field_name[31 - i]);
}
}
}
#endif /* DEBUG */
void Volari_Idle(XGIPtr pXGI)
{
int i;
unsigned int WaitCount = 65535;
#ifdef DEBUG
unsigned int last_cqrp = 0;
#endif /* DEBUG */
if (pXGI->Chipset == PCI_CHIP_XGIXG20) {
WaitCount = 1;
switch (CurrentHDisplay) {
case 640:
if(CurrentColorDepth == 8)
WaitCount=1;
else if(CurrentColorDepth == 16)
WaitCount=1000;
else if(CurrentColorDepth == 24)
WaitCount=3000;
break;
case 800:
if(CurrentColorDepth == 8)
WaitCount=160;
else if(CurrentColorDepth == 16)
WaitCount=1200;
else if(CurrentColorDepth == 24)
WaitCount=4000;
break;
case 1024:
if(CurrentColorDepth == 8)
WaitCount=200;
else if(CurrentColorDepth == 16)
WaitCount=1600;
else if(CurrentColorDepth == 24)
WaitCount=6000;
break;
case 1280:
if(CurrentColorDepth == 8)
WaitCount=500;
else if(CurrentColorDepth == 16)
WaitCount=2000;
else if(CurrentColorDepth == 24)
WaitCount=8000;
break;
default:
break;
}
}
do {
int bIdle = 0;
unsigned int cqrp;
for (i = 0; i < WaitCount; i++) {
cqrp = MMIO_IN32(pXGI->IOBase, 0x85CC);
if (cqrp & IDLE_ALL) {
bIdle = 1;
break;
}
}
if (bIdle)
break;
#ifdef DEBUG
if (last_cqrp != cqrp) {
dump_cq_read_pointer(cqrp);
last_cqrp = cqrp;
}
sleep(1);
#endif /* DEBUG */
if (pXGI->Chipset == PCI_CHIP_XGIXG20)
usleep(1);
} while (1);
}
void
@@ -280,9 +385,9 @@ Volari_InitCmdQueue(ScrnInfoPtr pScrn)
if(pXGI->Chipset == PCI_CHIP_XGIXG40)
{
Volari_Idle ;
Volari_Idle(pXGI);
Volari_DisableDualPipe(pScrn) ;
Volari_Idle ;
Volari_Idle(pXGI);
}
PDEBUG(ErrorF("Volari_InitCmdQueue() done.\n")) ;
@@ -322,7 +427,7 @@ Volari_DisableAccelerator(ScrnInfoPtr pScrn)
PDEBUG(ErrorF("Volari_DisableAccelerator(pScrn)\n")) ;
Volari_Idle ;
Volari_Idle(pXGI);
if( pXGI->TurboQueue )
{
@@ -509,7 +614,7 @@ Volari_Sync(ScrnInfoPtr pScrn)
PDEBUG1(ErrorF("Volari_Sync()\n"));
pXGI->DoColorExpand = FALSE;
Volari_Idle ;
Volari_Idle(pXGI);
}
static int xgiG2_ALUConv[] =
@@ -745,7 +850,7 @@ Volari_SubsequentMonoPatternFill(ScrnInfoPtr pScrn,
Volari_SetupDSTXY(x,y) ;
Volari_SetupRect(w,h) ;
Volari_DoCMD ;
/*Volari_Idle*/;
/*Volari_Idle(pXGI)*/;
}
/************************************************************************/

View File

@@ -126,76 +126,7 @@ extern unsigned int CurrentHDisplay;
extern unsigned int CurrentVDisplay;
extern unsigned int CurrentColorDepth;
/* Jong; 08222005 */
#define Volari_Idle \
{\
int i; \
unsigned int WaitCount;\
\
WaitCount=65535;\
if(pXGI->Chipset == PCI_CHIP_XGIXG20)\
{\
WaitCount=1;\
switch (CurrentHDisplay) {\
case 640:\
if(CurrentColorDepth == 8)\
WaitCount=1;\
else if(CurrentColorDepth == 16)\
WaitCount=1000;\
else if(CurrentColorDepth == 24)\
WaitCount=3000;\
break;\
\
case 800:\
if(CurrentColorDepth == 8)\
WaitCount=160;\
else if(CurrentColorDepth == 16)\
WaitCount=1200;\
else if(CurrentColorDepth == 24)\
WaitCount=4000;\
break;\
\
case 1024:\
if(CurrentColorDepth == 8)\
WaitCount=200;\
else if(CurrentColorDepth == 16)\
WaitCount=1600;\
else if(CurrentColorDepth == 24)\
WaitCount=6000;\
break;\
\
case 1280:\
if(CurrentColorDepth == 8)\
WaitCount=500;\
else if(CurrentColorDepth == 16)\
WaitCount=2000;\
else if(CurrentColorDepth == 24)\
WaitCount=8000;\
break;\
\
default:\
break;\
}\
}\
\
do {\
bool bIdle = 0;\
for (i=0; i<WaitCount; i++) {\
ulong ulTemp = MMIO_IN32(pXGI->IOBase, 0x85CC); \
if (ulTemp & 0x80000000) {\
bIdle=1; \
break;\
}\
}\
if (bIdle == 1) \
break; \
\
if (pXGI->Chipset == PCI_CHIP_XGIXG20)\
usleep(1);\
} while(1);\
}
extern void Volari_Idle(XGIPtr pXGI);
#define Volari_GetSwWP() (unsigned long)(*(pXGI->pCQ_shareWritePort))
#define Volari_GetHwRP() (unsigned long)(MMIO_IN32(pXGI->IOBase, 0x85c8))
@@ -326,7 +257,7 @@ extern unsigned int CurrentColorDepth;
/**********************************************************************
#define Volari_SetupSRCBase(base) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(0), base);\
G2CmdQueLen --;
**********************************************************************/
@@ -359,7 +290,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupSRCPitch(pitch) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT16(pXGI->IOBase, BR(1), pitch);\
G2CmdQueLen --;
@@ -392,7 +323,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupSRCXY(x,y) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(2), (x)<<16 | (y) );\
G2CmdQueLen --;
***********************************************************************/
@@ -424,7 +355,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupDSTBase(base) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(4), base);\
G2CmdQueLen --;
@@ -457,7 +388,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupDSTXY(x,y) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(3), (x)<<16 | (y) );\
G2CmdQueLen --;
@@ -490,7 +421,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupDSTRect(x,y) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(5), (y)<<16 | (x) );\
G2CmdQueLen --;
@@ -524,7 +455,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupDSTColorDepth(bpp) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT16(pXGI->IOBase, BR(1)+2, bpp);\
G2CmdQueLen --;
***********************************************************************/
@@ -534,7 +465,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupRect(w,h) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(6), (h)<<16 | (w) );\
G2CmdQueLen --;
***********************************************************************/
@@ -566,25 +497,25 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupPATFG(color) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(7), color);\
G2CmdQueLen --;
***********************************************************************/
/***********************************************************************
#define Volari_SetupPATBG(color) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(8), color);\
G2CmdQueLen --;
***********************************************************************/
/***********************************************************************
#define Volari_SetupSRCFG(color) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(9), color);\
G2CmdQueLen --;
***********************************************************************/
/***********************************************************************
#define Volari_SetupSRCBG(color) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(10), color);\
G2CmdQueLen --;
***********************************************************************/
@@ -692,7 +623,7 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupMONOPAT(p0,p1) \
if (G2CmdQueLen <= 1) Volari_Idle;\
if (G2CmdQueLen <= 1) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(11), p0);\
MMIO_OUT32(pXGI->IOBase, BR(12), p1);\
G2CmdQueLen =G2CmdQueLen-2;
@@ -749,13 +680,13 @@ extern unsigned int CurrentColorDepth;
}
/***********************************************************************
#define Volari_SetupClipLT(left,top) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(13), ((left) & 0xFFFF) | (top)<<16 );\
G2CmdQueLen--;
***********************************************************************/
/***********************************************************************
#define Volari_SetupClipRB(right,bottom) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(14), ((right) & 0xFFFF) | (bottom)<<16 );\
G2CmdQueLen --;
***********************************************************************/
@@ -843,7 +774,7 @@ extern unsigned int CurrentColorDepth;
pXGI->CommandReg |= (flags);
#define Volari_DoCMD \
if (G2CmdQueLen <= 1) Volari_Idle;\
if (G2CmdQueLen <= 1) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(15), pXGI->CommandReg); \
MMIO_OUT32(pXGI->IOBase, BR(16), 0);\
G2CmdQueLen =G2CmdQueLen-2;
@@ -851,27 +782,27 @@ extern unsigned int CurrentColorDepth;
/***********************************************************************
#define Volari_SetupX0Y0(x,y) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(2), (y)<<16 | (x) );\
G2CmdQueLen --;
#define Volari_SetupX1Y1(x,y) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(3), (y)<<16 | (x) );\
G2CmdQueLen --;
#define Volari_SetupLineCount(c) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT16(pXGI->IOBase, BR(6), c);\
G2CmdQueLen --;
#define Volari_SetupStylePeriod(p) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT16(pXGI->IOBase, BR(6)+2, p);\
G2CmdQueLen --;
#define Volari_SetupStyleLow(ls) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(11), ls);\
G2CmdQueLen --;
#define Volari_SetupStyleHigh(ls) \
if (G2CmdQueLen <= 0) Volari_Idle;\
if (G2CmdQueLen <= 0) Volari_Idle(pXGI);\
MMIO_OUT32(pXGI->IOBase, BR(12), ls);\
G2CmdQueLen --;
***********************************************************************/

View File

@@ -370,30 +370,14 @@ PDEBUG(ErrorF("--- Volari_Restore(). \n")) ;
#if 1
/* Volari_DisableAccelerator(pScrn) ; */
#ifdef DEBUG
/*
PDEBUG(ErrorF("--- MMIO Info. \n")) ;
for( i = 0x85c0 ;i <= 0x85CC ; i+=4 )
{
ErrorF("MMIO[0x%04lX] = 0x%08X\n", i, MMIO_IN32(pXGI->IOBase,i)) ;
}
*/
#endif
#else
inXGIIDXREG(XGISR, 0x1E, temp);
if (temp & 0x42) {
while( (MMIO_IN32(pXGI->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
while( (MMIO_IN32(pXGI->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
while( (MMIO_IN32(pXGI->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
Volari_Idle(pXGI);
}
PDEBUG(XGIDumpRegs(pScrn)) ;
temp = MMIO_IN32(pXGI->IOBase,0x85CC) ;
/* ErrorF( "\npXGI->IOBase = 0x%lX, [85CC] = 0x%lX\n", */
(unsigned long)(pXGI->IOBase), temp ) ;
outXGIIDXREG(XGICR, 0x55, 0) ;
andXGIIDXREG(XGISR, 0x1E, ~0xC2) ;

View File

@@ -568,7 +568,7 @@ XGIDRIFinishScreenInit(ScreenPtr pScreen)
Volari_Idle
Volari_Idle(pXGI);
}
return DRIFinishScreenInit(pScreen);
@@ -592,7 +592,7 @@ XGIDRISwapContext(ScreenPtr pScreen, DRISyncType syncType,
*(unsigned int *)(pXGI->IOBase + 0x8B60) = -1;
*/
Volari_Idle
Volari_Idle(pXGI);
}
static void
@@ -602,7 +602,7 @@ XGIDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index)
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
XGIPtr pXGI = XGIPTR(pScrn);
Volari_Idle
Volari_Idle(pXGI);
}
static void
@@ -613,7 +613,7 @@ XGIDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg,
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
XGIPtr pXGI = XGIPTR(pScrn);
Volari_Idle
Volari_Idle(pXGI);
}
/*******************************************************************************