diff options
author | Luc Verhaegen <libv@skynet.be> | 2009-10-26 18:44:17 +0100 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-11-04 15:13:03 +0100 |
commit | 298cfc4922a1f33bc0c02440cdbfa42d3cc35004 (patch) | |
tree | 685a94926cb0b3655e94b55fac7875389fdbc838 | |
parent | 7de800a69f64f37eba697d0e8d847aca514f7de2 (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.c | 23 | ||||
-rw-r--r-- | src/via_video.c | 60 |
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); } /* |