summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-10-26 18:44:17 +0100
committerLuc Verhaegen <libv@skynet.be>2009-11-04 15:13:03 +0100
commit298cfc4922a1f33bc0c02440cdbfa42d3cc35004 (patch)
tree685a94926cb0b3655e94b55fac7875389fdbc838
parent7de800a69f64f37eba697d0e8d847aca514f7de2 (diff)
Xv(MC): Improve engine idle waits.
There's a lot of cpu cycles to be gained by avoid the usleep system call.
-rw-r--r--src/via_mpeg.c23
-rw-r--r--src/via_video.c60
2 files changed, 37 insertions, 46 deletions
diff --git a/src/via_mpeg.c b/src/via_mpeg.c
index 2823b16..ded90f5 100644
--- a/src/via_mpeg.c
+++ b/src/via_mpeg.c
@@ -63,7 +63,6 @@ ViaMpegReset(struct ViaMpeg *Mpeg)
Mpeg->Regs->MV[j] = 0;
}
-#define MPEG_ENGINE_IDLE_WAIT 0x10000
/*
*
*/
@@ -72,15 +71,15 @@ ViaMpegEngineIdle(struct ViaMpeg *Mpeg)
{
int i;
- for (i = 0; i < MPEG_ENGINE_IDLE_WAIT; i++)
- if (!(Mpeg->Regs->Status & 0x00000001)) {
- if (i > 0x1000)
- xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: %d loops\n", __func__, i);
- return;
- }
+ for (i = 0; i < 0x10000; i++)
+ if (!(Mpeg->Regs->Status & 0x00000001)) {
+ if (i > 0x2000)
+ ViaDebug(Mpeg->scrnIndex, "%s: %d loops\n", __func__, i);
+ return;
+ }
- xf86DrvMsg(Mpeg->scrnIndex, X_ERROR, "%s: Timed out! (0x%08X)\n",
- __func__, Mpeg->Regs->Status);
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: Timed out! (0x%08X)\n",
+ __func__, (unsigned int) Mpeg->Regs->Status);
}
/*
@@ -94,9 +93,9 @@ ViaMpegEngineInit(struct ViaMpeg *Mpeg, CARD16 Width, CARD16 Height)
/* Since MPEG macroblocks are 16x16 anyway, the chroma planes are always
addressable by the unichrome. */
if ((Width & 0x0F) || (Height & 0x0F)) {
- xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: %dx%d is not a multiple of 16x16.\n",
- __func__, Width, Height);
- return FALSE;
+ xf86DrvMsg(Mpeg->scrnIndex, X_WARNING, "%s: %dx%d is not a multiple of"
+ " 16x16.\n", __func__, Width, Height);
+ return FALSE;
}
Mpeg->MBWidth = Width >> 4;
diff --git a/src/via_video.c b/src/via_video.c
index 36bc050..6e71fed 100644
--- a/src/via_video.c
+++ b/src/via_video.c
@@ -1466,17 +1466,15 @@ ViaHQVIdle(struct ViaSwov *Swov)
{
int i;
- for (i = 0; i < 10; i++)
- if (Swov->HQV->Control & HQV_IDLE)
- break;
- else
- usleep(1);
+ for (i = 0; i < 0x10000; i++)
+ if (Swov->HQV->Control & HQV_IDLE) {
+ if (i > 0x2000)
+ ViaDebug(Swov->scrnIndex, "%s: %d loops.\n", __func__, i);
+ return;
+ }
- if (i > IDLELOOP_LEVEL) {
- ViaDebug(Swov->scrnIndex, "%s: %d loops.\n", __func__, i);
- if (!(Swov->HQV->Control & HQV_IDLE))
- xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV not idle.\n", __func__);
- }
+ xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV not idle (0x%08X).\n",
+ __func__, (unsigned int) Swov->HQV->Control);
}
/*
@@ -1487,18 +1485,15 @@ ViaSwovFireWait(struct ViaSwov *Swov)
{
int i;
- for (i = 0; i < 25; i++)
- if (!(Swov->Video->Compose & V3_COMMAND_FIRE))
- break;
- else
- usleep(1);
+ for (i = 0; i < 0x10000; i++)
+ if (!(Swov->Video->Compose & V3_COMMAND_FIRE)) {
+ if (i > 0x2000)
+ ViaDebug(Swov->scrnIndex, "%s: %d loops.\n", __func__, i);
+ return;
+ }
- if (i > IDLELOOP_LEVEL) {
- ViaDebug(Swov->scrnIndex, "%s: %d loops.\n", __func__, i);
- if ((Swov->Video->Compose & V3_COMMAND_FIRE))
- xf86DrvMsg(Swov->scrnIndex, X_WARNING,
- "%s: Video3 engine still firing.\n", __func__);
- }
+ xf86DrvMsg(Swov->scrnIndex, X_WARNING,
+ "%s: Video3 engine still firing.\n", __func__);
}
/*
@@ -2349,22 +2344,19 @@ ViaHQVIdleWait(struct ViaSwov *Swov)
{
int i;
- for (i = 0; i < 10; i++)
+ for (i = 0; i < 0x10000; i++)
if (!(Swov->HQV->Control & HQV_IDLE) ||
- (Swov->HQV->Control & HQV_FLIP_STATUS)) {
+ (Swov->HQV->Control & HQV_FLIP_STATUS))
Swov->HQV->Control |= HQV_FLIP_STATUS;
- usleep(1);
- } else
- break;
+ else {
+ if (i > 0x2000)
+ ViaDebug(Swov->scrnIndex, "%s: idle/status wait: %d.\n",
+ __func__, i);
+ return;
+ }
- if (i > IDLELOOP_LEVEL) {
- ViaDebug(Swov->scrnIndex, "%s: idle/status wait: %d.\n", __func__, i);
- if (!(Swov->HQV->Control & HQV_IDLE))
- xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV not idle.\n", __func__);
- if (Swov->HQV->Control & HQV_FLIP_STATUS)
- xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV flip status not"
- " cleared.\n", __func__);
- }
+ xf86DrvMsg(Swov->scrnIndex, X_WARNING, "%s: HQV not idle (0x%08X)\n",
+ __func__, (unsigned int) Swov->HQV->Control);
}
/*