|
@@ -1252,11 +1252,19 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
|
|
|
static int inline vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma)
|
|
|
{
|
|
|
stream_t *dma = &vortex->dma_adb[adbdma];
|
|
|
- int temp;
|
|
|
+ int temp, page, delta;
|
|
|
|
|
|
temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2));
|
|
|
- temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1));
|
|
|
- return temp;
|
|
|
+ page = (temp & ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT;
|
|
|
+ if (dma->nr_periods >= 4)
|
|
|
+ delta = (page - dma->period_real) & 3;
|
|
|
+ else {
|
|
|
+ delta = (page - dma->period_real);
|
|
|
+ if (delta < 0)
|
|
|
+ delta += dma->nr_periods;
|
|
|
+ }
|
|
|
+ return (dma->period_virt + delta) * dma->period_bytes
|
|
|
+ + (temp & (dma->period_bytes - 1));
|
|
|
}
|
|
|
|
|
|
static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma)
|