summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Nettleton <jon.nettleton@gmail.com>2010-05-04 14:17:22 +0000
committerJon Nettleton <jon.nettleton@gmail.com>2010-05-04 14:17:22 +0000
commit969e8164b922b3db56725b03ef19ca5061dce411 (patch)
tree7bd7af2b74c706954cdbc57f51c2e807b579c032
parent88bd727ea9af6116dc92c9215ebe806fc6f046e6 (diff)
Add timeouts to HQV while loops
-rw-r--r--ChangeLog11
-rw-r--r--src/via_swov.c12
-rw-r--r--src/via_video.c7
3 files changed, 23 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index a7f2f58..6c94eb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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) {