diff options
author | Jon Nettleton <jon.nettleton@gmail.com> | 2010-05-04 14:17:22 +0000 |
---|---|---|
committer | Jon Nettleton <jon.nettleton@gmail.com> | 2010-05-04 14:17:22 +0000 |
commit | 969e8164b922b3db56725b03ef19ca5061dce411 (patch) | |
tree | 7bd7af2b74c706954cdbc57f51c2e807b579c032 | |
parent | 88bd727ea9af6116dc92c9215ebe806fc6f046e6 (diff) |
Add timeouts to HQV while loops
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | src/via_swov.c | 12 | ||||
-rw-r--r-- | src/via_video.c | 7 |
3 files changed, 23 insertions, 7 deletions
@@ -1,5 +1,16 @@ 2010-05-04 Jon Nettleton <jon.nettleton@gmail.com> + Put timeouts on our while statements. These codepaths + should be interrupted by a hardware state change, but + if something goes wrong they loop forevere. Let's try + and behave a little by putting a timeout on these loops. + + * src/via_swov.c: (viaWaitHQVFlip), (viaWaitHQVFlipClear), + (viaWaitHQVDone): + * src/via_video.c: (Flip): + +2010-05-04 Jon Nettleton <jon.nettleton@gmail.com> + Add XVideo support for the VX855 Chipset. To support this chipset I have added HWDiff->HQVCmeRegs that allows handling differing register values, and diff --git a/src/via_swov.c b/src/via_swov.c index 0d81381..2ed5c42 100644 --- a/src/via_swov.c +++ b/src/via_swov.c @@ -113,6 +113,7 @@ viaWaitHQVFlip(VIAPtr pVia) { unsigned long proReg = 0; CARD32 volatile *pdwState; + unsigned count = 50000; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) @@ -121,10 +122,9 @@ viaWaitHQVFlip(VIAPtr pVia) pdwState = (CARD32 volatile *)(pVia->VidMapBase + (HQV_CONTROL + proReg)); if (pVia->VideoEngine == VIDEO_ENGINE_CME) { - // while (*pdwState & (HQV_SUBPIC_FLIP | HQV_SW_FLIP)) ; - while (*pdwState & HQV_SUBPIC_FLIP); + while (--count && (*pdwState & HQV_SUBPIC_FLIP)); } else { - while (!(*pdwState & HQV_FLIP_STATUS)) ; + while (--count && !(*pdwState & HQV_FLIP_STATUS)) ; } } @@ -134,8 +134,9 @@ viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData) CARD32 volatile *pdwState = (CARD32 volatile *)(pVia->VidMapBase + HQV_CONTROL); *pdwState = dwData; + unsigned count = 50000; - while ((*pdwState & HQV_FLIP_STATUS)) { + while (--count && (*pdwState & HQV_FLIP_STATUS)) { VIDOutD(HQV_CONTROL, *pdwState | HQV_FLIP_STATUS); } } @@ -151,6 +152,7 @@ viaWaitHQVDone(VIAPtr pVia) { CARD32 volatile *pdwState; unsigned long proReg = 0; + unsigned count = 50000; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) @@ -158,7 +160,7 @@ viaWaitHQVDone(VIAPtr pVia) pdwState = (CARD32 volatile *)(pVia->VidMapBase + (HQV_CONTROL + proReg)); if (pVia->swov.MPEG_ON) { - while ((*pdwState & HQV_SW_FLIP)) ; + while (--count && (*pdwState & HQV_SW_FLIP)) ; } } diff --git a/src/via_video.c b/src/via_video.c index 9c3d92c..e9d79a8 100644 --- a/src/via_video.c +++ b/src/via_video.c @@ -999,6 +999,7 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, unsigned long DisplayBufferIndex) { unsigned long proReg = 0; + unsigned count = 50000; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) @@ -1010,7 +1011,8 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, case FOURCC_RV15: case FOURCC_RV16: case FOURCC_RV32: - while ((VIDInD(HQV_CONTROL + proReg) & HQV_SW_FLIP)); + while ((VIDInD(HQV_CONTROL + proReg) & HQV_SW_FLIP) + && --count); VIDOutD(HQV_SRC_STARTADDR_Y + proReg, pVia->swov.SWDevice.dwSWPhysicalAddr[DisplayBufferIndex]); VIDOutD(HQV_CONTROL + proReg, @@ -1019,7 +1021,8 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, break; case FOURCC_YV12: default: - while ((VIDInD(HQV_CONTROL + proReg) & HQV_SW_FLIP)); + while ((VIDInD(HQV_CONTROL + proReg) & HQV_SW_FLIP) + && --count); VIDOutD(HQV_SRC_STARTADDR_Y + proReg, pVia->swov.SWDevice.dwSWPhysicalAddr[DisplayBufferIndex]); if (pVia->VideoEngine == VIDEO_ENGINE_CME) { |