cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ivtv-irq.c (32837B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* interrupt handling
      3    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
      4    Copyright (C) 2004  Chris Kennedy <c@groovy.org>
      5    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
      6
      7 */
      8
      9#include "ivtv-driver.h"
     10#include "ivtv-queue.h"
     11#include "ivtv-udma.h"
     12#include "ivtv-irq.h"
     13#include "ivtv-mailbox.h"
     14#include "ivtv-vbi.h"
     15#include "ivtv-yuv.h"
     16#include <media/v4l2-event.h>
     17
     18#define DMA_MAGIC_COOKIE 0x000001fe
     19
     20static void ivtv_dma_dec_start(struct ivtv_stream *s);
     21
     22static const int ivtv_stream_map[] = {
     23	IVTV_ENC_STREAM_TYPE_MPG,
     24	IVTV_ENC_STREAM_TYPE_YUV,
     25	IVTV_ENC_STREAM_TYPE_PCM,
     26	IVTV_ENC_STREAM_TYPE_VBI,
     27};
     28
     29static void ivtv_pcm_work_handler(struct ivtv *itv)
     30{
     31	struct ivtv_stream *s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM];
     32	struct ivtv_buffer *buf;
     33
     34	/* Pass the PCM data to ivtv-alsa */
     35
     36	while (1) {
     37		/*
     38		 * Users should not be using both the ALSA and V4L2 PCM audio
     39		 * capture interfaces at the same time.  If the user is doing
     40		 * this, there maybe a buffer in q_io to grab, use, and put
     41		 * back in rotation.
     42		 */
     43		buf = ivtv_dequeue(s, &s->q_io);
     44		if (buf == NULL)
     45			buf = ivtv_dequeue(s, &s->q_full);
     46		if (buf == NULL)
     47			break;
     48
     49		if (buf->readpos < buf->bytesused)
     50			itv->pcm_announce_callback(itv->alsa,
     51				(u8 *)(buf->buf + buf->readpos),
     52				(size_t)(buf->bytesused - buf->readpos));
     53
     54		ivtv_enqueue(s, buf, &s->q_free);
     55	}
     56}
     57
     58static void ivtv_pio_work_handler(struct ivtv *itv)
     59{
     60	struct ivtv_stream *s = &itv->streams[itv->cur_pio_stream];
     61	struct ivtv_buffer *buf;
     62	int i = 0;
     63
     64	IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n");
     65	if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS ||
     66			s->vdev.v4l2_dev == NULL || !ivtv_use_pio(s)) {
     67		itv->cur_pio_stream = -1;
     68		/* trigger PIO complete user interrupt */
     69		write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
     70		return;
     71	}
     72	IVTV_DEBUG_HI_DMA("Process PIO %s\n", s->name);
     73	list_for_each_entry(buf, &s->q_dma.list, list) {
     74		u32 size = s->sg_processing[i].size & 0x3ffff;
     75
     76		/* Copy the data from the card to the buffer */
     77		if (s->type == IVTV_DEC_STREAM_TYPE_VBI) {
     78			memcpy_fromio(buf->buf, itv->dec_mem + s->sg_processing[i].src - IVTV_DECODER_OFFSET, size);
     79		}
     80		else {
     81			memcpy_fromio(buf->buf, itv->enc_mem + s->sg_processing[i].src, size);
     82		}
     83		i++;
     84		if (i == s->sg_processing_size)
     85			break;
     86	}
     87	write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
     88}
     89
     90void ivtv_irq_work_handler(struct kthread_work *work)
     91{
     92	struct ivtv *itv = container_of(work, struct ivtv, irq_work);
     93
     94	if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags))
     95		ivtv_pio_work_handler(itv);
     96
     97	if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags))
     98		ivtv_vbi_work_handler(itv);
     99
    100	if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags))
    101		ivtv_yuv_work_handler(itv);
    102
    103	if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags))
    104		ivtv_pcm_work_handler(itv);
    105}
    106
    107/* Determine the required DMA size, setup enough buffers in the predma queue and
    108   actually copy the data from the card to the buffers in case a PIO transfer is
    109   required for this stream.
    110 */
    111static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MAX_DATA])
    112{
    113	struct ivtv *itv = s->itv;
    114	struct ivtv_buffer *buf;
    115	u32 bytes_needed = 0;
    116	u32 offset, size;
    117	u32 UVoffset = 0, UVsize = 0;
    118	int skip_bufs = s->q_predma.buffers;
    119	int idx = s->sg_pending_size;
    120	int rc;
    121
    122	/* sanity checks */
    123	if (s->vdev.v4l2_dev == NULL) {
    124		IVTV_DEBUG_WARN("Stream %s not started\n", s->name);
    125		return -1;
    126	}
    127	if (!test_bit(IVTV_F_S_CLAIMED, &s->s_flags)) {
    128		IVTV_DEBUG_WARN("Stream %s not open\n", s->name);
    129		return -1;
    130	}
    131
    132	/* determine offset, size and PTS for the various streams */
    133	switch (s->type) {
    134		case IVTV_ENC_STREAM_TYPE_MPG:
    135			offset = data[1];
    136			size = data[2];
    137			s->pending_pts = 0;
    138			break;
    139
    140		case IVTV_ENC_STREAM_TYPE_YUV:
    141			offset = data[1];
    142			size = data[2];
    143			UVoffset = data[3];
    144			UVsize = data[4];
    145			s->pending_pts = ((u64) data[5] << 32) | data[6];
    146			break;
    147
    148		case IVTV_ENC_STREAM_TYPE_PCM:
    149			offset = data[1] + 12;
    150			size = data[2] - 12;
    151			s->pending_pts = read_dec(offset - 8) |
    152				((u64)(read_dec(offset - 12)) << 32);
    153			if (itv->has_cx23415)
    154				offset += IVTV_DECODER_OFFSET;
    155			break;
    156
    157		case IVTV_ENC_STREAM_TYPE_VBI:
    158			size = itv->vbi.enc_size * itv->vbi.fpi;
    159			offset = read_enc(itv->vbi.enc_start - 4) + 12;
    160			if (offset == 12) {
    161				IVTV_DEBUG_INFO("VBI offset == 0\n");
    162				return -1;
    163			}
    164			s->pending_pts = read_enc(offset - 4) | ((u64)read_enc(offset - 8) << 32);
    165			break;
    166
    167		case IVTV_DEC_STREAM_TYPE_VBI:
    168			size = read_dec(itv->vbi.dec_start + 4) + 8;
    169			offset = read_dec(itv->vbi.dec_start) + itv->vbi.dec_start;
    170			s->pending_pts = 0;
    171			offset += IVTV_DECODER_OFFSET;
    172			break;
    173		default:
    174			/* shouldn't happen */
    175			return -1;
    176	}
    177
    178	/* if this is the start of the DMA then fill in the magic cookie */
    179	if (s->sg_pending_size == 0 && ivtv_use_dma(s)) {
    180		if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
    181		    s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
    182			s->pending_backup = read_dec(offset - IVTV_DECODER_OFFSET);
    183			write_dec_sync(DMA_MAGIC_COOKIE, offset - IVTV_DECODER_OFFSET);
    184		}
    185		else {
    186			s->pending_backup = read_enc(offset);
    187			write_enc_sync(DMA_MAGIC_COOKIE, offset);
    188		}
    189		s->pending_offset = offset;
    190	}
    191
    192	bytes_needed = size;
    193	if (s->type == IVTV_ENC_STREAM_TYPE_YUV) {
    194		/* The size for the Y samples needs to be rounded upwards to a
    195		   multiple of the buf_size. The UV samples then start in the
    196		   next buffer. */
    197		bytes_needed = s->buf_size * ((bytes_needed + s->buf_size - 1) / s->buf_size);
    198		bytes_needed += UVsize;
    199	}
    200
    201	IVTV_DEBUG_HI_DMA("%s %s: 0x%08x bytes at 0x%08x\n",
    202		ivtv_use_pio(s) ? "PIO" : "DMA", s->name, bytes_needed, offset);
    203
    204	rc = ivtv_queue_move(s, &s->q_free, &s->q_full, &s->q_predma, bytes_needed);
    205	if (rc < 0) { /* Insufficient buffers */
    206		IVTV_DEBUG_WARN("Cannot obtain %d bytes for %s data transfer\n",
    207				bytes_needed, s->name);
    208		return -1;
    209	}
    210	if (rc && !s->buffers_stolen && test_bit(IVTV_F_S_APPL_IO, &s->s_flags)) {
    211		IVTV_WARN("All %s stream buffers are full. Dropping data.\n", s->name);
    212		IVTV_WARN("Cause: the application is not reading fast enough.\n");
    213	}
    214	s->buffers_stolen = rc;
    215
    216	/* got the buffers, now fill in sg_pending */
    217	buf = list_entry(s->q_predma.list.next, struct ivtv_buffer, list);
    218	memset(buf->buf, 0, 128);
    219	list_for_each_entry(buf, &s->q_predma.list, list) {
    220		if (skip_bufs-- > 0)
    221			continue;
    222		s->sg_pending[idx].dst = buf->dma_handle;
    223		s->sg_pending[idx].src = offset;
    224		s->sg_pending[idx].size = s->buf_size;
    225		buf->bytesused = min(size, s->buf_size);
    226		buf->dma_xfer_cnt = s->dma_xfer_cnt;
    227
    228		s->q_predma.bytesused += buf->bytesused;
    229		size -= buf->bytesused;
    230		offset += s->buf_size;
    231
    232		/* Sync SG buffers */
    233		ivtv_buf_sync_for_device(s, buf);
    234
    235		if (size == 0) {	/* YUV */
    236			/* process the UV section */
    237			offset = UVoffset;
    238			size = UVsize;
    239		}
    240		idx++;
    241	}
    242	s->sg_pending_size = idx;
    243	return 0;
    244}
    245
    246static void dma_post(struct ivtv_stream *s)
    247{
    248	struct ivtv *itv = s->itv;
    249	struct ivtv_buffer *buf = NULL;
    250	struct list_head *p;
    251	u32 offset;
    252	__le32 *u32buf;
    253	int x = 0;
    254
    255	IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA",
    256			s->name, s->dma_offset);
    257	list_for_each(p, &s->q_dma.list) {
    258		buf = list_entry(p, struct ivtv_buffer, list);
    259		u32buf = (__le32 *)buf->buf;
    260
    261		/* Sync Buffer */
    262		ivtv_buf_sync_for_cpu(s, buf);
    263
    264		if (x == 0 && ivtv_use_dma(s)) {
    265			offset = s->dma_last_offset;
    266			if (le32_to_cpu(u32buf[offset / 4]) != DMA_MAGIC_COOKIE)
    267			{
    268				for (offset = 0; offset < 64; offset++)
    269					if (le32_to_cpu(u32buf[offset]) == DMA_MAGIC_COOKIE)
    270						break;
    271				offset *= 4;
    272				if (offset == 256) {
    273					IVTV_DEBUG_WARN("%s: Couldn't find start of buffer within the first 256 bytes\n", s->name);
    274					offset = s->dma_last_offset;
    275				}
    276				if (s->dma_last_offset != offset)
    277					IVTV_DEBUG_WARN("%s: offset %d -> %d\n", s->name, s->dma_last_offset, offset);
    278				s->dma_last_offset = offset;
    279			}
    280			if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
    281						s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
    282				write_dec_sync(0, s->dma_offset - IVTV_DECODER_OFFSET);
    283			}
    284			else {
    285				write_enc_sync(0, s->dma_offset);
    286			}
    287			if (offset) {
    288				buf->bytesused -= offset;
    289				memcpy(buf->buf, buf->buf + offset, buf->bytesused + offset);
    290			}
    291			*u32buf = cpu_to_le32(s->dma_backup);
    292		}
    293		x++;
    294		/* flag byteswap ABCD -> DCBA for MPG & VBI data outside irq */
    295		if (s->type == IVTV_ENC_STREAM_TYPE_MPG ||
    296		    s->type == IVTV_ENC_STREAM_TYPE_VBI)
    297			buf->b_flags |= IVTV_F_B_NEED_BUF_SWAP;
    298	}
    299	if (buf)
    300		buf->bytesused += s->dma_last_offset;
    301	if (buf && s->type == IVTV_DEC_STREAM_TYPE_VBI) {
    302		list_for_each_entry(buf, &s->q_dma.list, list) {
    303			/* Parse and Groom VBI Data */
    304			s->q_dma.bytesused -= buf->bytesused;
    305			ivtv_process_vbi_data(itv, buf, 0, s->type);
    306			s->q_dma.bytesused += buf->bytesused;
    307		}
    308		if (s->fh == NULL) {
    309			ivtv_queue_move(s, &s->q_dma, NULL, &s->q_free, 0);
    310			return;
    311		}
    312	}
    313
    314	ivtv_queue_move(s, &s->q_dma, NULL, &s->q_full, s->q_dma.bytesused);
    315
    316	if (s->type == IVTV_ENC_STREAM_TYPE_PCM &&
    317	    itv->pcm_announce_callback != NULL) {
    318		/*
    319		 * Set up the work handler to pass the data to ivtv-alsa.
    320		 *
    321		 * We just use q_full and let the work handler race with users
    322		 * making ivtv-fileops.c calls on the PCM device node.
    323		 *
    324		 * Users should not be using both the ALSA and V4L2 PCM audio
    325		 * capture interfaces at the same time.  If the user does this,
    326		 * fragments of data will just go out each interface as they
    327		 * race for PCM data.
    328		 */
    329		set_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags);
    330		set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
    331	}
    332
    333	if (s->fh)
    334		wake_up(&s->waitq);
    335}
    336
    337void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock)
    338{
    339	struct ivtv *itv = s->itv;
    340	struct yuv_playback_info *yi = &itv->yuv_info;
    341	u8 frame = yi->draw_frame;
    342	struct yuv_frame_info *f = &yi->new_frame_info[frame];
    343	struct ivtv_buffer *buf;
    344	u32 y_size = 720 * ((f->src_h + 31) & ~31);
    345	u32 uv_offset = offset + IVTV_YUV_BUFFER_UV_OFFSET;
    346	int y_done = 0;
    347	int bytes_written = 0;
    348	int idx = 0;
    349
    350	IVTV_DEBUG_HI_DMA("DEC PREPARE DMA %s: %08x %08x\n", s->name, s->q_predma.bytesused, offset);
    351
    352	/* Insert buffer block for YUV if needed */
    353	if (s->type == IVTV_DEC_STREAM_TYPE_YUV && f->offset_y) {
    354		if (yi->blanking_dmaptr) {
    355			s->sg_pending[idx].src = yi->blanking_dmaptr;
    356			s->sg_pending[idx].dst = offset;
    357			s->sg_pending[idx].size = 720 * 16;
    358		}
    359		offset += 720 * 16;
    360		idx++;
    361	}
    362
    363	list_for_each_entry(buf, &s->q_predma.list, list) {
    364		/* YUV UV Offset from Y Buffer */
    365		if (s->type == IVTV_DEC_STREAM_TYPE_YUV && !y_done &&
    366				(bytes_written + buf->bytesused) >= y_size) {
    367			s->sg_pending[idx].src = buf->dma_handle;
    368			s->sg_pending[idx].dst = offset;
    369			s->sg_pending[idx].size = y_size - bytes_written;
    370			offset = uv_offset;
    371			if (s->sg_pending[idx].size != buf->bytesused) {
    372				idx++;
    373				s->sg_pending[idx].src =
    374				  buf->dma_handle + s->sg_pending[idx - 1].size;
    375				s->sg_pending[idx].dst = offset;
    376				s->sg_pending[idx].size =
    377				   buf->bytesused - s->sg_pending[idx - 1].size;
    378				offset += s->sg_pending[idx].size;
    379			}
    380			y_done = 1;
    381		} else {
    382			s->sg_pending[idx].src = buf->dma_handle;
    383			s->sg_pending[idx].dst = offset;
    384			s->sg_pending[idx].size = buf->bytesused;
    385			offset += buf->bytesused;
    386		}
    387		bytes_written += buf->bytesused;
    388
    389		/* Sync SG buffers */
    390		ivtv_buf_sync_for_device(s, buf);
    391		idx++;
    392	}
    393	s->sg_pending_size = idx;
    394
    395	/* Sync Hardware SG List of buffers */
    396	ivtv_stream_sync_for_device(s);
    397	if (lock) {
    398		unsigned long flags = 0;
    399
    400		spin_lock_irqsave(&itv->dma_reg_lock, flags);
    401		if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
    402			ivtv_dma_dec_start(s);
    403		else
    404			set_bit(IVTV_F_S_DMA_PENDING, &s->s_flags);
    405		spin_unlock_irqrestore(&itv->dma_reg_lock, flags);
    406	} else {
    407		if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
    408			ivtv_dma_dec_start(s);
    409		else
    410			set_bit(IVTV_F_S_DMA_PENDING, &s->s_flags);
    411	}
    412}
    413
    414static void ivtv_dma_enc_start_xfer(struct ivtv_stream *s)
    415{
    416	struct ivtv *itv = s->itv;
    417
    418	s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
    419	s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
    420	s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
    421	s->sg_processed++;
    422	/* Sync Hardware SG List of buffers */
    423	ivtv_stream_sync_for_device(s);
    424	write_reg(s->sg_handle, IVTV_REG_ENCDMAADDR);
    425	write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x02, IVTV_REG_DMAXFER);
    426	itv->dma_timer.expires = jiffies + msecs_to_jiffies(300);
    427	add_timer(&itv->dma_timer);
    428}
    429
    430static void ivtv_dma_dec_start_xfer(struct ivtv_stream *s)
    431{
    432	struct ivtv *itv = s->itv;
    433
    434	s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
    435	s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
    436	s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
    437	s->sg_processed++;
    438	/* Sync Hardware SG List of buffers */
    439	ivtv_stream_sync_for_device(s);
    440	write_reg(s->sg_handle, IVTV_REG_DECDMAADDR);
    441	write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x01, IVTV_REG_DMAXFER);
    442	itv->dma_timer.expires = jiffies + msecs_to_jiffies(300);
    443	add_timer(&itv->dma_timer);
    444}
    445
    446/* start the encoder DMA */
    447static void ivtv_dma_enc_start(struct ivtv_stream *s)
    448{
    449	struct ivtv *itv = s->itv;
    450	struct ivtv_stream *s_vbi = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
    451	int i;
    452
    453	IVTV_DEBUG_HI_DMA("start %s for %s\n", ivtv_use_dma(s) ? "DMA" : "PIO", s->name);
    454
    455	if (s->q_predma.bytesused)
    456		ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
    457
    458	if (ivtv_use_dma(s))
    459		s->sg_pending[s->sg_pending_size - 1].size += 256;
    460
    461	/* If this is an MPEG stream, and VBI data is also pending, then append the
    462	   VBI DMA to the MPEG DMA and transfer both sets of data at once.
    463
    464	   VBI DMA is a second class citizen compared to MPEG and mixing them together
    465	   will confuse the firmware (the end of a VBI DMA is seen as the end of a
    466	   MPEG DMA, thus effectively dropping an MPEG frame). So instead we make
    467	   sure we only use the MPEG DMA to transfer the VBI DMA if both are in
    468	   use. This way no conflicts occur. */
    469	clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
    470	if (s->type == IVTV_ENC_STREAM_TYPE_MPG && s_vbi->sg_pending_size &&
    471			s->sg_pending_size + s_vbi->sg_pending_size <= s->buffers) {
    472		ivtv_queue_move(s_vbi, &s_vbi->q_predma, NULL, &s_vbi->q_dma, s_vbi->q_predma.bytesused);
    473		if (ivtv_use_dma(s_vbi))
    474			s_vbi->sg_pending[s_vbi->sg_pending_size - 1].size += 256;
    475		for (i = 0; i < s_vbi->sg_pending_size; i++) {
    476			s->sg_pending[s->sg_pending_size++] = s_vbi->sg_pending[i];
    477		}
    478		s_vbi->dma_offset = s_vbi->pending_offset;
    479		s_vbi->sg_pending_size = 0;
    480		s_vbi->dma_xfer_cnt++;
    481		set_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
    482		IVTV_DEBUG_HI_DMA("include DMA for %s\n", s_vbi->name);
    483	}
    484
    485	s->dma_xfer_cnt++;
    486	memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
    487	s->sg_processing_size = s->sg_pending_size;
    488	s->sg_pending_size = 0;
    489	s->sg_processed = 0;
    490	s->dma_offset = s->pending_offset;
    491	s->dma_backup = s->pending_backup;
    492	s->dma_pts = s->pending_pts;
    493
    494	if (ivtv_use_pio(s)) {
    495		set_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags);
    496		set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
    497		set_bit(IVTV_F_I_PIO, &itv->i_flags);
    498		itv->cur_pio_stream = s->type;
    499	}
    500	else {
    501		itv->dma_retries = 0;
    502		ivtv_dma_enc_start_xfer(s);
    503		set_bit(IVTV_F_I_DMA, &itv->i_flags);
    504		itv->cur_dma_stream = s->type;
    505	}
    506}
    507
    508static void ivtv_dma_dec_start(struct ivtv_stream *s)
    509{
    510	struct ivtv *itv = s->itv;
    511
    512	if (s->q_predma.bytesused)
    513		ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
    514	s->dma_xfer_cnt++;
    515	memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
    516	s->sg_processing_size = s->sg_pending_size;
    517	s->sg_pending_size = 0;
    518	s->sg_processed = 0;
    519
    520	IVTV_DEBUG_HI_DMA("start DMA for %s\n", s->name);
    521	itv->dma_retries = 0;
    522	ivtv_dma_dec_start_xfer(s);
    523	set_bit(IVTV_F_I_DMA, &itv->i_flags);
    524	itv->cur_dma_stream = s->type;
    525}
    526
    527static void ivtv_irq_dma_read(struct ivtv *itv)
    528{
    529	struct ivtv_stream *s = NULL;
    530	struct ivtv_buffer *buf;
    531	int hw_stream_type = 0;
    532
    533	IVTV_DEBUG_HI_IRQ("DEC DMA READ\n");
    534
    535	del_timer(&itv->dma_timer);
    536
    537	if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && itv->cur_dma_stream < 0)
    538		return;
    539
    540	if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
    541		s = &itv->streams[itv->cur_dma_stream];
    542		ivtv_stream_sync_for_cpu(s);
    543
    544		if (read_reg(IVTV_REG_DMASTATUS) & 0x14) {
    545			IVTV_DEBUG_WARN("DEC DMA ERROR %x (xfer %d of %d, retry %d)\n",
    546					read_reg(IVTV_REG_DMASTATUS),
    547					s->sg_processed, s->sg_processing_size, itv->dma_retries);
    548			write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
    549			if (itv->dma_retries == 3) {
    550				/* Too many retries, give up on this frame */
    551				itv->dma_retries = 0;
    552				s->sg_processed = s->sg_processing_size;
    553			}
    554			else {
    555				/* Retry, starting with the first xfer segment.
    556				   Just retrying the current segment is not sufficient. */
    557				s->sg_processed = 0;
    558				itv->dma_retries++;
    559			}
    560		}
    561		if (s->sg_processed < s->sg_processing_size) {
    562			/* DMA next buffer */
    563			ivtv_dma_dec_start_xfer(s);
    564			return;
    565		}
    566		if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
    567			hw_stream_type = 2;
    568		IVTV_DEBUG_HI_DMA("DEC DATA READ %s: %d\n", s->name, s->q_dma.bytesused);
    569
    570		/* For some reason must kick the firmware, like PIO mode,
    571		   I think this tells the firmware we are done and the size
    572		   of the xfer so it can calculate what we need next.
    573		   I think we can do this part ourselves but would have to
    574		   fully calculate xfer info ourselves and not use interrupts
    575		 */
    576		ivtv_vapi(itv, CX2341X_DEC_SCHED_DMA_FROM_HOST, 3, 0, s->q_dma.bytesused,
    577				hw_stream_type);
    578
    579		/* Free last DMA call */
    580		while ((buf = ivtv_dequeue(s, &s->q_dma)) != NULL) {
    581			ivtv_buf_sync_for_cpu(s, buf);
    582			ivtv_enqueue(s, buf, &s->q_free);
    583		}
    584		wake_up(&s->waitq);
    585	}
    586	clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
    587	clear_bit(IVTV_F_I_DMA, &itv->i_flags);
    588	itv->cur_dma_stream = -1;
    589	wake_up(&itv->dma_waitq);
    590}
    591
    592static void ivtv_irq_enc_dma_complete(struct ivtv *itv)
    593{
    594	u32 data[CX2341X_MBOX_MAX_DATA];
    595	struct ivtv_stream *s;
    596
    597	ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
    598	IVTV_DEBUG_HI_IRQ("ENC DMA COMPLETE %x %d (%d)\n", data[0], data[1], itv->cur_dma_stream);
    599
    600	del_timer(&itv->dma_timer);
    601
    602	if (itv->cur_dma_stream < 0)
    603		return;
    604
    605	s = &itv->streams[itv->cur_dma_stream];
    606	ivtv_stream_sync_for_cpu(s);
    607
    608	if (data[0] & 0x18) {
    609		IVTV_DEBUG_WARN("ENC DMA ERROR %x (offset %08x, xfer %d of %d, retry %d)\n", data[0],
    610			s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries);
    611		write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
    612		if (itv->dma_retries == 3) {
    613			/* Too many retries, give up on this frame */
    614			itv->dma_retries = 0;
    615			s->sg_processed = s->sg_processing_size;
    616		}
    617		else {
    618			/* Retry, starting with the first xfer segment.
    619			   Just retrying the current segment is not sufficient. */
    620			s->sg_processed = 0;
    621			itv->dma_retries++;
    622		}
    623	}
    624	if (s->sg_processed < s->sg_processing_size) {
    625		/* DMA next buffer */
    626		ivtv_dma_enc_start_xfer(s);
    627		return;
    628	}
    629	clear_bit(IVTV_F_I_DMA, &itv->i_flags);
    630	itv->cur_dma_stream = -1;
    631	dma_post(s);
    632	if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
    633		s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
    634		dma_post(s);
    635	}
    636	s->sg_processing_size = 0;
    637	s->sg_processed = 0;
    638	wake_up(&itv->dma_waitq);
    639}
    640
    641static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
    642{
    643	struct ivtv_stream *s;
    644
    645	if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS) {
    646		itv->cur_pio_stream = -1;
    647		return;
    648	}
    649	s = &itv->streams[itv->cur_pio_stream];
    650	IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s->name);
    651	clear_bit(IVTV_F_I_PIO, &itv->i_flags);
    652	itv->cur_pio_stream = -1;
    653	dma_post(s);
    654	if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
    655		ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 0);
    656	else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
    657		ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 1);
    658	else if (s->type == IVTV_ENC_STREAM_TYPE_PCM)
    659		ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 2);
    660	clear_bit(IVTV_F_I_PIO, &itv->i_flags);
    661	if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
    662		s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
    663		dma_post(s);
    664	}
    665	wake_up(&itv->dma_waitq);
    666}
    667
    668static void ivtv_irq_dma_err(struct ivtv *itv)
    669{
    670	u32 data[CX2341X_MBOX_MAX_DATA];
    671	u32 status;
    672
    673	del_timer(&itv->dma_timer);
    674
    675	ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
    676	status = read_reg(IVTV_REG_DMASTATUS);
    677	IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1],
    678				status, itv->cur_dma_stream);
    679	/*
    680	 * We do *not* write back to the IVTV_REG_DMASTATUS register to
    681	 * clear the error status, if either the encoder write (0x02) or
    682	 * decoder read (0x01) bus master DMA operation do not indicate
    683	 * completed.  We can race with the DMA engine, which may have
    684	 * transitioned to completed status *after* we read the register.
    685	 * Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the
    686	 * DMA engine has completed, will cause the DMA engine to stop working.
    687	 */
    688	status &= 0x3;
    689	if (status == 0x3)
    690		write_reg(status, IVTV_REG_DMASTATUS);
    691
    692	if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) &&
    693	    itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) {
    694		struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream];
    695
    696		if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) {
    697			/* retry */
    698			/*
    699			 * FIXME - handle cases of DMA error similar to
    700			 * encoder below, except conditioned on status & 0x1
    701			 */
    702			ivtv_dma_dec_start(s);
    703			return;
    704		} else {
    705			if ((status & 0x2) == 0) {
    706				/*
    707				 * CX2341x Bus Master DMA write is ongoing.
    708				 * Reset the timer and let it complete.
    709				 */
    710				itv->dma_timer.expires =
    711						jiffies + msecs_to_jiffies(600);
    712				add_timer(&itv->dma_timer);
    713				return;
    714			}
    715
    716			if (itv->dma_retries < 3) {
    717				/*
    718				 * CX2341x Bus Master DMA write has ended.
    719				 * Retry the write, starting with the first
    720				 * xfer segment. Just retrying the current
    721				 * segment is not sufficient.
    722				 */
    723				s->sg_processed = 0;
    724				itv->dma_retries++;
    725				ivtv_dma_enc_start_xfer(s);
    726				return;
    727			}
    728			/* Too many retries, give up on this one */
    729		}
    730
    731	}
    732	if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
    733		ivtv_udma_start(itv);
    734		return;
    735	}
    736	clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
    737	clear_bit(IVTV_F_I_DMA, &itv->i_flags);
    738	itv->cur_dma_stream = -1;
    739	wake_up(&itv->dma_waitq);
    740}
    741
    742static void ivtv_irq_enc_start_cap(struct ivtv *itv)
    743{
    744	u32 data[CX2341X_MBOX_MAX_DATA];
    745	struct ivtv_stream *s;
    746
    747	/* Get DMA destination and size arguments from card */
    748	ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA, 7, data);
    749	IVTV_DEBUG_HI_IRQ("ENC START CAP %d: %08x %08x\n", data[0], data[1], data[2]);
    750
    751	if (data[0] > 2 || data[1] == 0 || data[2] == 0) {
    752		IVTV_DEBUG_WARN("Unknown input: %08x %08x %08x\n",
    753				data[0], data[1], data[2]);
    754		return;
    755	}
    756	s = &itv->streams[ivtv_stream_map[data[0]]];
    757	if (!stream_enc_dma_append(s, data)) {
    758		set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
    759	}
    760}
    761
    762static void ivtv_irq_enc_vbi_cap(struct ivtv *itv)
    763{
    764	u32 data[CX2341X_MBOX_MAX_DATA];
    765	struct ivtv_stream *s;
    766
    767	IVTV_DEBUG_HI_IRQ("ENC START VBI CAP\n");
    768	s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
    769
    770	if (!stream_enc_dma_append(s, data))
    771		set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
    772}
    773
    774static void ivtv_irq_dec_vbi_reinsert(struct ivtv *itv)
    775{
    776	u32 data[CX2341X_MBOX_MAX_DATA];
    777	struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_VBI];
    778
    779	IVTV_DEBUG_HI_IRQ("DEC VBI REINSERT\n");
    780	if (test_bit(IVTV_F_S_CLAIMED, &s->s_flags) &&
    781			!stream_enc_dma_append(s, data)) {
    782		set_bit(IVTV_F_S_PIO_PENDING, &s->s_flags);
    783	}
    784}
    785
    786static void ivtv_irq_dec_data_req(struct ivtv *itv)
    787{
    788	u32 data[CX2341X_MBOX_MAX_DATA];
    789	struct ivtv_stream *s;
    790
    791	/* YUV or MPG */
    792
    793	if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags)) {
    794		ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 2, data);
    795		itv->dma_data_req_size =
    796				 1080 * ((itv->yuv_info.v4l2_src_h + 31) & ~31);
    797		itv->dma_data_req_offset = data[1];
    798		if (atomic_read(&itv->yuv_info.next_dma_frame) >= 0)
    799			ivtv_yuv_frame_complete(itv);
    800		s = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
    801	}
    802	else {
    803		ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 3, data);
    804		itv->dma_data_req_size = min_t(u32, data[2], 0x10000);
    805		itv->dma_data_req_offset = data[1];
    806		s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
    807	}
    808	IVTV_DEBUG_HI_IRQ("DEC DATA REQ %s: %d %08x %u\n", s->name, s->q_full.bytesused,
    809		       itv->dma_data_req_offset, itv->dma_data_req_size);
    810	if (itv->dma_data_req_size == 0 || s->q_full.bytesused < itv->dma_data_req_size) {
    811		set_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
    812	}
    813	else {
    814		if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
    815			ivtv_yuv_setup_stream_frame(itv);
    816		clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
    817		ivtv_queue_move(s, &s->q_full, NULL, &s->q_predma, itv->dma_data_req_size);
    818		ivtv_dma_stream_dec_prepare(s, itv->dma_data_req_offset + IVTV_DECODER_OFFSET, 0);
    819	}
    820}
    821
    822static void ivtv_irq_vsync(struct ivtv *itv)
    823{
    824	/* The vsync interrupt is unusual in that it won't clear until
    825	 * the end of the first line for the current field, at which
    826	 * point it clears itself. This can result in repeated vsync
    827	 * interrupts, or a missed vsync. Read some of the registers
    828	 * to determine the line being displayed and ensure we handle
    829	 * one vsync per frame.
    830	 */
    831	unsigned int frame = read_reg(IVTV_REG_DEC_LINE_FIELD) & 1;
    832	struct yuv_playback_info *yi = &itv->yuv_info;
    833	int last_dma_frame = atomic_read(&yi->next_dma_frame);
    834	struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame];
    835
    836	if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
    837
    838	if (((frame ^ f->sync_field) == 0 &&
    839		((itv->last_vsync_field & 1) ^ f->sync_field)) ||
    840			(frame != (itv->last_vsync_field & 1) && !f->interlaced)) {
    841		int next_dma_frame = last_dma_frame;
    842
    843		if (!(f->interlaced && f->delay && yi->fields_lapsed < 1)) {
    844			if (next_dma_frame >= 0 && next_dma_frame != atomic_read(&yi->next_fill_frame)) {
    845				write_reg(yuv_offset[next_dma_frame] >> 4, 0x82c);
    846				write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x830);
    847				write_reg(yuv_offset[next_dma_frame] >> 4, 0x834);
    848				write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x838);
    849				next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS;
    850				atomic_set(&yi->next_dma_frame, next_dma_frame);
    851				yi->fields_lapsed = -1;
    852				yi->running = 1;
    853			}
    854		}
    855	}
    856	if (frame != (itv->last_vsync_field & 1)) {
    857		static const struct v4l2_event evtop = {
    858			.type = V4L2_EVENT_VSYNC,
    859			.u.vsync.field = V4L2_FIELD_TOP,
    860		};
    861		static const struct v4l2_event evbottom = {
    862			.type = V4L2_EVENT_VSYNC,
    863			.u.vsync.field = V4L2_FIELD_BOTTOM,
    864		};
    865		struct ivtv_stream *s = ivtv_get_output_stream(itv);
    866
    867		itv->last_vsync_field += 1;
    868		if (frame == 0) {
    869			clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
    870			clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
    871		}
    872		else {
    873			set_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
    874		}
    875		if (test_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags)) {
    876			set_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags);
    877			wake_up(&itv->event_waitq);
    878			if (s)
    879				wake_up(&s->waitq);
    880		}
    881		if (s && s->vdev.v4l2_dev)
    882			v4l2_event_queue(&s->vdev, frame ? &evtop : &evbottom);
    883		wake_up(&itv->vsync_waitq);
    884
    885		/* Send VBI to saa7127 */
    886		if (frame && (itv->output_mode == OUT_PASSTHROUGH ||
    887			test_bit(IVTV_F_I_UPDATE_WSS, &itv->i_flags) ||
    888			test_bit(IVTV_F_I_UPDATE_VPS, &itv->i_flags) ||
    889			test_bit(IVTV_F_I_UPDATE_CC, &itv->i_flags))) {
    890			set_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags);
    891			set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
    892		}
    893
    894		/* Check if we need to update the yuv registers */
    895		if (yi->running && (yi->yuv_forced_update || f->update)) {
    896			if (!f->update) {
    897				last_dma_frame =
    898					(u8)(atomic_read(&yi->next_dma_frame) -
    899						 1) % IVTV_YUV_BUFFERS;
    900				f = &yi->new_frame_info[last_dma_frame];
    901			}
    902
    903			if (f->src_w) {
    904				yi->update_frame = last_dma_frame;
    905				f->update = 0;
    906				yi->yuv_forced_update = 0;
    907				set_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags);
    908				set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
    909			}
    910		}
    911
    912		yi->fields_lapsed++;
    913	}
    914}
    915
    916#define IVTV_IRQ_DMA (IVTV_IRQ_DMA_READ | IVTV_IRQ_ENC_DMA_COMPLETE | IVTV_IRQ_DMA_ERR | IVTV_IRQ_ENC_START_CAP | IVTV_IRQ_ENC_VBI_CAP | IVTV_IRQ_DEC_DATA_REQ | IVTV_IRQ_DEC_VBI_RE_INSERT)
    917
    918irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
    919{
    920	struct ivtv *itv = (struct ivtv *)dev_id;
    921	u32 combo;
    922	u32 stat;
    923	int i;
    924	u8 vsync_force = 0;
    925
    926	spin_lock(&itv->dma_reg_lock);
    927	/* get contents of irq status register */
    928	stat = read_reg(IVTV_REG_IRQSTATUS);
    929
    930	combo = ~itv->irqmask & stat;
    931
    932	/* Clear out IRQ */
    933	if (combo) write_reg(combo, IVTV_REG_IRQSTATUS);
    934
    935	if (0 == combo) {
    936		/* The vsync interrupt is unusual and clears itself. If we
    937		 * took too long, we may have missed it. Do some checks
    938		 */
    939		if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
    940			/* vsync is enabled, see if we're in a new field */
    941			if ((itv->last_vsync_field & 1) !=
    942			    (read_reg(IVTV_REG_DEC_LINE_FIELD) & 1)) {
    943				/* New field, looks like we missed it */
    944				IVTV_DEBUG_YUV("VSync interrupt missed %d\n",
    945				       read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16);
    946				vsync_force = 1;
    947			}
    948		}
    949
    950		if (!vsync_force) {
    951			/* No Vsync expected, wasn't for us */
    952			spin_unlock(&itv->dma_reg_lock);
    953			return IRQ_NONE;
    954		}
    955	}
    956
    957	/* Exclude interrupts noted below from the output, otherwise the log is flooded with
    958	   these messages */
    959	if (combo & ~0xff6d0400)
    960		IVTV_DEBUG_HI_IRQ("======= valid IRQ bits: 0x%08x ======\n", combo);
    961
    962	if (combo & IVTV_IRQ_DEC_DMA_COMPLETE) {
    963		IVTV_DEBUG_HI_IRQ("DEC DMA COMPLETE\n");
    964	}
    965
    966	if (combo & IVTV_IRQ_DMA_READ) {
    967		ivtv_irq_dma_read(itv);
    968	}
    969
    970	if (combo & IVTV_IRQ_ENC_DMA_COMPLETE) {
    971		ivtv_irq_enc_dma_complete(itv);
    972	}
    973
    974	if (combo & IVTV_IRQ_ENC_PIO_COMPLETE) {
    975		ivtv_irq_enc_pio_complete(itv);
    976	}
    977
    978	if (combo & IVTV_IRQ_DMA_ERR) {
    979		ivtv_irq_dma_err(itv);
    980	}
    981
    982	if (combo & IVTV_IRQ_ENC_START_CAP) {
    983		ivtv_irq_enc_start_cap(itv);
    984	}
    985
    986	if (combo & IVTV_IRQ_ENC_VBI_CAP) {
    987		ivtv_irq_enc_vbi_cap(itv);
    988	}
    989
    990	if (combo & IVTV_IRQ_DEC_VBI_RE_INSERT) {
    991		ivtv_irq_dec_vbi_reinsert(itv);
    992	}
    993
    994	if (combo & IVTV_IRQ_ENC_EOS) {
    995		IVTV_DEBUG_IRQ("ENC EOS\n");
    996		set_bit(IVTV_F_I_EOS, &itv->i_flags);
    997		wake_up(&itv->eos_waitq);
    998	}
    999
   1000	if (combo & IVTV_IRQ_DEC_DATA_REQ) {
   1001		ivtv_irq_dec_data_req(itv);
   1002	}
   1003
   1004	/* Decoder Vertical Sync - We can't rely on 'combo', so check if vsync enabled */
   1005	if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
   1006		ivtv_irq_vsync(itv);
   1007	}
   1008
   1009	if (combo & IVTV_IRQ_ENC_VIM_RST) {
   1010		IVTV_DEBUG_IRQ("VIM RST\n");
   1011		/*ivtv_vapi(itv, CX2341X_ENC_REFRESH_INPUT, 0); */
   1012	}
   1013
   1014	if (combo & IVTV_IRQ_DEC_AUD_MODE_CHG) {
   1015		IVTV_DEBUG_INFO("Stereo mode changed\n");
   1016	}
   1017
   1018	if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
   1019		itv->irq_rr_idx++;
   1020		for (i = 0; i < IVTV_MAX_STREAMS; i++) {
   1021			int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
   1022			struct ivtv_stream *s = &itv->streams[idx];
   1023
   1024			if (!test_and_clear_bit(IVTV_F_S_DMA_PENDING, &s->s_flags))
   1025				continue;
   1026			if (s->type >= IVTV_DEC_STREAM_TYPE_MPG)
   1027				ivtv_dma_dec_start(s);
   1028			else
   1029				ivtv_dma_enc_start(s);
   1030			break;
   1031		}
   1032
   1033		if (i == IVTV_MAX_STREAMS &&
   1034		    test_bit(IVTV_F_I_UDMA_PENDING, &itv->i_flags))
   1035			ivtv_udma_start(itv);
   1036	}
   1037
   1038	if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_PIO, &itv->i_flags)) {
   1039		itv->irq_rr_idx++;
   1040		for (i = 0; i < IVTV_MAX_STREAMS; i++) {
   1041			int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
   1042			struct ivtv_stream *s = &itv->streams[idx];
   1043
   1044			if (!test_and_clear_bit(IVTV_F_S_PIO_PENDING, &s->s_flags))
   1045				continue;
   1046			if (s->type == IVTV_DEC_STREAM_TYPE_VBI || s->type < IVTV_DEC_STREAM_TYPE_MPG)
   1047				ivtv_dma_enc_start(s);
   1048			break;
   1049		}
   1050	}
   1051
   1052	if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) {
   1053		kthread_queue_work(&itv->irq_worker, &itv->irq_work);
   1054	}
   1055
   1056	spin_unlock(&itv->dma_reg_lock);
   1057
   1058	/* If we've just handled a 'forced' vsync, it's safest to say it
   1059	 * wasn't ours. Another device may have triggered it at just
   1060	 * the right time.
   1061	 */
   1062	return vsync_force ? IRQ_NONE : IRQ_HANDLED;
   1063}
   1064
   1065void ivtv_unfinished_dma(struct timer_list *t)
   1066{
   1067	struct ivtv *itv = from_timer(itv, t, dma_timer);
   1068
   1069	if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
   1070		return;
   1071	IVTV_ERR("DMA TIMEOUT %08x %d\n", read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream);
   1072
   1073	write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
   1074	clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
   1075	clear_bit(IVTV_F_I_DMA, &itv->i_flags);
   1076	itv->cur_dma_stream = -1;
   1077	wake_up(&itv->dma_waitq);
   1078}