blob: ab6d5d25aa6fdd1a757814c18318dc5881e47a41 [file] [log] [blame]
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001/* interrupt handling
2 Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com>
3 Copyright (C) 2004 Chris Kennedy <c@groovy.org>
4 Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#include "ivtv-driver.h"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030022#include "ivtv-queue.h"
23#include "ivtv-udma.h"
24#include "ivtv-irq.h"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030025#include "ivtv-mailbox.h"
26#include "ivtv-vbi.h"
Hans Verkuil1e13f9e2007-03-10 06:52:02 -030027#include "ivtv-yuv.h"
Hans Verkuil09250192010-03-27 14:10:13 -030028#include <media/v4l2-event.h>
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030029
30#define DMA_MAGIC_COOKIE 0x000001fe
31
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030032static void ivtv_dma_dec_start(struct ivtv_stream *s);
33
34static const int ivtv_stream_map[] = {
35 IVTV_ENC_STREAM_TYPE_MPG,
36 IVTV_ENC_STREAM_TYPE_YUV,
37 IVTV_ENC_STREAM_TYPE_PCM,
38 IVTV_ENC_STREAM_TYPE_VBI,
39};
40
Andy Walls43139022012-09-03 14:50:49 -030041static void ivtv_pcm_work_handler(struct ivtv *itv)
42{
43 struct ivtv_stream *s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM];
44 struct ivtv_buffer *buf;
45
46 /* Pass the PCM data to ivtv-alsa */
47
48 while (1) {
49 /*
50 * Users should not be using both the ALSA and V4L2 PCM audio
51 * capture interfaces at the same time. If the user is doing
52 * this, there maybe a buffer in q_io to grab, use, and put
53 * back in rotation.
54 */
55 buf = ivtv_dequeue(s, &s->q_io);
56 if (buf == NULL)
57 buf = ivtv_dequeue(s, &s->q_full);
58 if (buf == NULL)
59 break;
60
61 if (buf->readpos < buf->bytesused)
62 itv->pcm_announce_callback(itv->alsa,
63 (u8 *)(buf->buf + buf->readpos),
64 (size_t)(buf->bytesused - buf->readpos));
65
66 ivtv_enqueue(s, buf, &s->q_free);
67 }
68}
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030069
Hans Verkuildc02d502007-05-19 14:07:16 -030070static void ivtv_pio_work_handler(struct ivtv *itv)
71{
72 struct ivtv_stream *s = &itv->streams[itv->cur_pio_stream];
73 struct ivtv_buffer *buf;
Hans Verkuildc02d502007-05-19 14:07:16 -030074 int i = 0;
75
Hans Verkuilbd58df62007-07-10 17:47:07 -030076 IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n");
Hans Verkuildc02d502007-05-19 14:07:16 -030077 if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS ||
Hans Verkuil8ac05ae2009-02-07 07:02:27 -030078 s->vdev == NULL || !ivtv_use_pio(s)) {
Hans Verkuildc02d502007-05-19 14:07:16 -030079 itv->cur_pio_stream = -1;
80 /* trigger PIO complete user interrupt */
81 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
82 return;
83 }
Hans Verkuilbd58df62007-07-10 17:47:07 -030084 IVTV_DEBUG_HI_DMA("Process PIO %s\n", s->name);
Trent Piepho805a4392007-10-10 05:37:41 -030085 list_for_each_entry(buf, &s->q_dma.list, list) {
Hans Verkuil37093b12007-07-28 19:45:50 -030086 u32 size = s->sg_processing[i].size & 0x3ffff;
Hans Verkuildc02d502007-05-19 14:07:16 -030087
88 /* Copy the data from the card to the buffer */
89 if (s->type == IVTV_DEC_STREAM_TYPE_VBI) {
Hans Verkuil37093b12007-07-28 19:45:50 -030090 memcpy_fromio(buf->buf, itv->dec_mem + s->sg_processing[i].src - IVTV_DECODER_OFFSET, size);
Hans Verkuildc02d502007-05-19 14:07:16 -030091 }
92 else {
Hans Verkuil37093b12007-07-28 19:45:50 -030093 memcpy_fromio(buf->buf, itv->enc_mem + s->sg_processing[i].src, size);
Hans Verkuildc02d502007-05-19 14:07:16 -030094 }
Hans Verkuildc02d502007-05-19 14:07:16 -030095 i++;
Hans Verkuil37093b12007-07-28 19:45:50 -030096 if (i == s->sg_processing_size)
97 break;
Hans Verkuildc02d502007-05-19 14:07:16 -030098 }
99 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300100}
101
Tejun Heo7bc46562010-06-29 10:07:09 +0200102void ivtv_irq_work_handler(struct kthread_work *work)
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300103{
Tejun Heo7bc46562010-06-29 10:07:09 +0200104 struct ivtv *itv = container_of(work, struct ivtv, irq_work);
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300105
Hans Verkuildc02d502007-05-19 14:07:16 -0300106 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags))
107 ivtv_pio_work_handler(itv);
108
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300109 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags))
Hans Verkuildc02d502007-05-19 14:07:16 -0300110 ivtv_vbi_work_handler(itv);
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300111
112 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags))
113 ivtv_yuv_work_handler(itv);
Andy Walls43139022012-09-03 14:50:49 -0300114
115 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags))
116 ivtv_pcm_work_handler(itv);
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300117}
118
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300119/* Determine the required DMA size, setup enough buffers in the predma queue and
120 actually copy the data from the card to the buffers in case a PIO transfer is
121 required for this stream.
122 */
123static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MAX_DATA])
124{
125 struct ivtv *itv = s->itv;
126 struct ivtv_buffer *buf;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300127 u32 bytes_needed = 0;
128 u32 offset, size;
129 u32 UVoffset = 0, UVsize = 0;
130 int skip_bufs = s->q_predma.buffers;
Hans Verkuil37093b12007-07-28 19:45:50 -0300131 int idx = s->sg_pending_size;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300132 int rc;
133
134 /* sanity checks */
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300135 if (s->vdev == NULL) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300136 IVTV_DEBUG_WARN("Stream %s not started\n", s->name);
137 return -1;
138 }
139 if (!test_bit(IVTV_F_S_CLAIMED, &s->s_flags)) {
140 IVTV_DEBUG_WARN("Stream %s not open\n", s->name);
141 return -1;
142 }
143
144 /* determine offset, size and PTS for the various streams */
145 switch (s->type) {
146 case IVTV_ENC_STREAM_TYPE_MPG:
147 offset = data[1];
148 size = data[2];
Hans Verkuil37093b12007-07-28 19:45:50 -0300149 s->pending_pts = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300150 break;
151
152 case IVTV_ENC_STREAM_TYPE_YUV:
153 offset = data[1];
154 size = data[2];
155 UVoffset = data[3];
156 UVsize = data[4];
Hans Verkuil37093b12007-07-28 19:45:50 -0300157 s->pending_pts = ((u64) data[5] << 32) | data[6];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300158 break;
159
160 case IVTV_ENC_STREAM_TYPE_PCM:
161 offset = data[1] + 12;
162 size = data[2] - 12;
Hans Verkuil37093b12007-07-28 19:45:50 -0300163 s->pending_pts = read_dec(offset - 8) |
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300164 ((u64)(read_dec(offset - 12)) << 32);
165 if (itv->has_cx23415)
166 offset += IVTV_DECODER_OFFSET;
167 break;
168
169 case IVTV_ENC_STREAM_TYPE_VBI:
170 size = itv->vbi.enc_size * itv->vbi.fpi;
171 offset = read_enc(itv->vbi.enc_start - 4) + 12;
172 if (offset == 12) {
173 IVTV_DEBUG_INFO("VBI offset == 0\n");
174 return -1;
175 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300176 s->pending_pts = read_enc(offset - 4) | ((u64)read_enc(offset - 8) << 32);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300177 break;
178
179 case IVTV_DEC_STREAM_TYPE_VBI:
180 size = read_dec(itv->vbi.dec_start + 4) + 8;
181 offset = read_dec(itv->vbi.dec_start) + itv->vbi.dec_start;
Hans Verkuil37093b12007-07-28 19:45:50 -0300182 s->pending_pts = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300183 offset += IVTV_DECODER_OFFSET;
184 break;
185 default:
186 /* shouldn't happen */
187 return -1;
188 }
189
190 /* if this is the start of the DMA then fill in the magic cookie */
Hans Verkuil51a99c02007-08-18 15:16:00 -0300191 if (s->sg_pending_size == 0 && ivtv_use_dma(s)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300192 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
193 s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
Hans Verkuil37093b12007-07-28 19:45:50 -0300194 s->pending_backup = read_dec(offset - IVTV_DECODER_OFFSET);
Hans Verkuil3efb8ab2014-08-21 16:31:51 -0300195 write_dec_sync(DMA_MAGIC_COOKIE, offset - IVTV_DECODER_OFFSET);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300196 }
197 else {
Hans Verkuil37093b12007-07-28 19:45:50 -0300198 s->pending_backup = read_enc(offset);
Hans Verkuil3efb8ab2014-08-21 16:31:51 -0300199 write_enc_sync(DMA_MAGIC_COOKIE, offset);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300200 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300201 s->pending_offset = offset;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300202 }
203
204 bytes_needed = size;
205 if (s->type == IVTV_ENC_STREAM_TYPE_YUV) {
206 /* The size for the Y samples needs to be rounded upwards to a
207 multiple of the buf_size. The UV samples then start in the
208 next buffer. */
209 bytes_needed = s->buf_size * ((bytes_needed + s->buf_size - 1) / s->buf_size);
210 bytes_needed += UVsize;
211 }
212
Hans Verkuilbd58df62007-07-10 17:47:07 -0300213 IVTV_DEBUG_HI_DMA("%s %s: 0x%08x bytes at 0x%08x\n",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300214 ivtv_use_pio(s) ? "PIO" : "DMA", s->name, bytes_needed, offset);
215
216 rc = ivtv_queue_move(s, &s->q_free, &s->q_full, &s->q_predma, bytes_needed);
217 if (rc < 0) { /* Insufficient buffers */
218 IVTV_DEBUG_WARN("Cannot obtain %d bytes for %s data transfer\n",
219 bytes_needed, s->name);
220 return -1;
221 }
Hans Verkuilec105a42009-05-02 11:10:23 -0300222 if (rc && !s->buffers_stolen && test_bit(IVTV_F_S_APPL_IO, &s->s_flags)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300223 IVTV_WARN("All %s stream buffers are full. Dropping data.\n", s->name);
224 IVTV_WARN("Cause: the application is not reading fast enough.\n");
225 }
226 s->buffers_stolen = rc;
227
Hans Verkuil37093b12007-07-28 19:45:50 -0300228 /* got the buffers, now fill in sg_pending */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300229 buf = list_entry(s->q_predma.list.next, struct ivtv_buffer, list);
230 memset(buf->buf, 0, 128);
Trent Piepho805a4392007-10-10 05:37:41 -0300231 list_for_each_entry(buf, &s->q_predma.list, list) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300232 if (skip_bufs-- > 0)
233 continue;
Hans Verkuil37093b12007-07-28 19:45:50 -0300234 s->sg_pending[idx].dst = buf->dma_handle;
235 s->sg_pending[idx].src = offset;
236 s->sg_pending[idx].size = s->buf_size;
Richard Knutsson14d5deb2007-12-08 10:35:06 -0300237 buf->bytesused = min(size, s->buf_size);
Hans Verkuilf4071b82007-07-28 12:07:12 -0300238 buf->dma_xfer_cnt = s->dma_xfer_cnt;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300239
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300240 s->q_predma.bytesused += buf->bytesused;
241 size -= buf->bytesused;
242 offset += s->buf_size;
243
244 /* Sync SG buffers */
245 ivtv_buf_sync_for_device(s, buf);
246
247 if (size == 0) { /* YUV */
248 /* process the UV section */
249 offset = UVoffset;
250 size = UVsize;
251 }
252 idx++;
253 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300254 s->sg_pending_size = idx;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300255 return 0;
256}
257
258static void dma_post(struct ivtv_stream *s)
259{
260 struct ivtv *itv = s->itv;
261 struct ivtv_buffer *buf = NULL;
262 struct list_head *p;
263 u32 offset;
Al Virob0510f82008-05-21 00:31:41 -0300264 __le32 *u32buf;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300265 int x = 0;
266
Hans Verkuilbd58df62007-07-10 17:47:07 -0300267 IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300268 s->name, s->dma_offset);
269 list_for_each(p, &s->q_dma.list) {
270 buf = list_entry(p, struct ivtv_buffer, list);
Al Virob0510f82008-05-21 00:31:41 -0300271 u32buf = (__le32 *)buf->buf;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300272
273 /* Sync Buffer */
274 ivtv_buf_sync_for_cpu(s, buf);
275
Hans Verkuil51a99c02007-08-18 15:16:00 -0300276 if (x == 0 && ivtv_use_dma(s)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300277 offset = s->dma_last_offset;
Hans Verkuil3efb8ab2014-08-21 16:31:51 -0300278 if (le32_to_cpu(u32buf[offset / 4]) != DMA_MAGIC_COOKIE)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300279 {
Hans Verkuil3efb8ab2014-08-21 16:31:51 -0300280 for (offset = 0; offset < 64; offset++)
281 if (le32_to_cpu(u32buf[offset]) == DMA_MAGIC_COOKIE)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300282 break;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300283 offset *= 4;
284 if (offset == 256) {
285 IVTV_DEBUG_WARN("%s: Couldn't find start of buffer within the first 256 bytes\n", s->name);
286 offset = s->dma_last_offset;
287 }
288 if (s->dma_last_offset != offset)
289 IVTV_DEBUG_WARN("%s: offset %d -> %d\n", s->name, s->dma_last_offset, offset);
290 s->dma_last_offset = offset;
291 }
292 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
293 s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
294 write_dec_sync(0, s->dma_offset - IVTV_DECODER_OFFSET);
295 }
296 else {
297 write_enc_sync(0, s->dma_offset);
298 }
299 if (offset) {
300 buf->bytesused -= offset;
301 memcpy(buf->buf, buf->buf + offset, buf->bytesused + offset);
302 }
303 *u32buf = cpu_to_le32(s->dma_backup);
304 }
305 x++;
306 /* flag byteswap ABCD -> DCBA for MPG & VBI data outside irq */
307 if (s->type == IVTV_ENC_STREAM_TYPE_MPG ||
308 s->type == IVTV_ENC_STREAM_TYPE_VBI)
Hans Verkuilf4071b82007-07-28 12:07:12 -0300309 buf->b_flags |= IVTV_F_B_NEED_BUF_SWAP;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300310 }
311 if (buf)
312 buf->bytesused += s->dma_last_offset;
313 if (buf && s->type == IVTV_DEC_STREAM_TYPE_VBI) {
Trent Piepho805a4392007-10-10 05:37:41 -0300314 list_for_each_entry(buf, &s->q_dma.list, list) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300315 /* Parse and Groom VBI Data */
316 s->q_dma.bytesused -= buf->bytesused;
317 ivtv_process_vbi_data(itv, buf, 0, s->type);
318 s->q_dma.bytesused += buf->bytesused;
319 }
Hans Verkuil61bb7252011-10-12 05:36:04 -0300320 if (s->fh == NULL) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300321 ivtv_queue_move(s, &s->q_dma, NULL, &s->q_free, 0);
322 return;
323 }
324 }
Andy Walls43139022012-09-03 14:50:49 -0300325
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300326 ivtv_queue_move(s, &s->q_dma, NULL, &s->q_full, s->q_dma.bytesused);
Andy Walls43139022012-09-03 14:50:49 -0300327
328 if (s->type == IVTV_ENC_STREAM_TYPE_PCM &&
329 itv->pcm_announce_callback != NULL) {
330 /*
331 * Set up the work handler to pass the data to ivtv-alsa.
332 *
333 * We just use q_full and let the work handler race with users
334 * making ivtv-fileops.c calls on the PCM device node.
335 *
336 * Users should not be using both the ALSA and V4L2 PCM audio
337 * capture interfaces at the same time. If the user does this,
338 * fragments of data will just go out each interface as they
339 * race for PCM data.
340 */
341 set_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags);
342 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
343 }
344
Hans Verkuil61bb7252011-10-12 05:36:04 -0300345 if (s->fh)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300346 wake_up(&s->waitq);
347}
348
349void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock)
350{
351 struct ivtv *itv = s->itv;
Ian Armstrong77aded62007-11-05 14:27:09 -0300352 struct yuv_playback_info *yi = &itv->yuv_info;
353 u8 frame = yi->draw_frame;
354 struct yuv_frame_info *f = &yi->new_frame_info[frame];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300355 struct ivtv_buffer *buf;
Ian Armstrong77aded62007-11-05 14:27:09 -0300356 u32 y_size = 720 * ((f->src_h + 31) & ~31);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300357 u32 uv_offset = offset + IVTV_YUV_BUFFER_UV_OFFSET;
358 int y_done = 0;
359 int bytes_written = 0;
360 unsigned long flags = 0;
361 int idx = 0;
362
Hans Verkuilbd58df62007-07-10 17:47:07 -0300363 IVTV_DEBUG_HI_DMA("DEC PREPARE DMA %s: %08x %08x\n", s->name, s->q_predma.bytesused, offset);
Ian Armstrong77aded62007-11-05 14:27:09 -0300364
365 /* Insert buffer block for YUV if needed */
366 if (s->type == IVTV_DEC_STREAM_TYPE_YUV && f->offset_y) {
367 if (yi->blanking_dmaptr) {
368 s->sg_pending[idx].src = yi->blanking_dmaptr;
369 s->sg_pending[idx].dst = offset;
370 s->sg_pending[idx].size = 720 * 16;
371 }
372 offset += 720 * 16;
373 idx++;
374 }
375
Trent Piepho805a4392007-10-10 05:37:41 -0300376 list_for_each_entry(buf, &s->q_predma.list, list) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300377 /* YUV UV Offset from Y Buffer */
Ian Armstrongc240ad02007-10-16 03:21:46 -0300378 if (s->type == IVTV_DEC_STREAM_TYPE_YUV && !y_done &&
379 (bytes_written + buf->bytesused) >= y_size) {
380 s->sg_pending[idx].src = buf->dma_handle;
381 s->sg_pending[idx].dst = offset;
382 s->sg_pending[idx].size = y_size - bytes_written;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300383 offset = uv_offset;
Ian Armstrongc240ad02007-10-16 03:21:46 -0300384 if (s->sg_pending[idx].size != buf->bytesused) {
385 idx++;
386 s->sg_pending[idx].src =
387 buf->dma_handle + s->sg_pending[idx - 1].size;
388 s->sg_pending[idx].dst = offset;
389 s->sg_pending[idx].size =
390 buf->bytesused - s->sg_pending[idx - 1].size;
391 offset += s->sg_pending[idx].size;
392 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300393 y_done = 1;
Ian Armstrongc240ad02007-10-16 03:21:46 -0300394 } else {
395 s->sg_pending[idx].src = buf->dma_handle;
396 s->sg_pending[idx].dst = offset;
397 s->sg_pending[idx].size = buf->bytesused;
398 offset += buf->bytesused;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300399 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300400 bytes_written += buf->bytesused;
401
402 /* Sync SG buffers */
403 ivtv_buf_sync_for_device(s, buf);
404 idx++;
405 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300406 s->sg_pending_size = idx;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300407
408 /* Sync Hardware SG List of buffers */
409 ivtv_stream_sync_for_device(s);
410 if (lock)
411 spin_lock_irqsave(&itv->dma_reg_lock, flags);
412 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
413 ivtv_dma_dec_start(s);
414 }
415 else {
416 set_bit(IVTV_F_S_DMA_PENDING, &s->s_flags);
417 }
418 if (lock)
419 spin_unlock_irqrestore(&itv->dma_reg_lock, flags);
420}
421
Hans Verkuil37093b12007-07-28 19:45:50 -0300422static void ivtv_dma_enc_start_xfer(struct ivtv_stream *s)
423{
424 struct ivtv *itv = s->itv;
425
426 s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
427 s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
428 s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
429 s->sg_processed++;
430 /* Sync Hardware SG List of buffers */
431 ivtv_stream_sync_for_device(s);
432 write_reg(s->sg_handle, IVTV_REG_ENCDMAADDR);
433 write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x02, IVTV_REG_DMAXFER);
Hans Verkuil2968e312008-04-26 11:22:11 -0300434 itv->dma_timer.expires = jiffies + msecs_to_jiffies(300);
Hans Verkuil9b2e5c62008-04-22 14:42:16 -0300435 add_timer(&itv->dma_timer);
Hans Verkuil37093b12007-07-28 19:45:50 -0300436}
437
438static void ivtv_dma_dec_start_xfer(struct ivtv_stream *s)
439{
440 struct ivtv *itv = s->itv;
441
442 s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
443 s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
444 s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
445 s->sg_processed++;
446 /* Sync Hardware SG List of buffers */
447 ivtv_stream_sync_for_device(s);
448 write_reg(s->sg_handle, IVTV_REG_DECDMAADDR);
449 write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x01, IVTV_REG_DMAXFER);
Hans Verkuil2968e312008-04-26 11:22:11 -0300450 itv->dma_timer.expires = jiffies + msecs_to_jiffies(300);
Hans Verkuil9b2e5c62008-04-22 14:42:16 -0300451 add_timer(&itv->dma_timer);
Hans Verkuil37093b12007-07-28 19:45:50 -0300452}
453
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300454/* start the encoder DMA */
455static void ivtv_dma_enc_start(struct ivtv_stream *s)
456{
457 struct ivtv *itv = s->itv;
458 struct ivtv_stream *s_vbi = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
459 int i;
460
Hans Verkuilbd58df62007-07-10 17:47:07 -0300461 IVTV_DEBUG_HI_DMA("start %s for %s\n", ivtv_use_dma(s) ? "DMA" : "PIO", s->name);
Hans Verkuildc02d502007-05-19 14:07:16 -0300462
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300463 if (s->q_predma.bytesused)
464 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
Hans Verkuildc02d502007-05-19 14:07:16 -0300465
466 if (ivtv_use_dma(s))
Hans Verkuil37093b12007-07-28 19:45:50 -0300467 s->sg_pending[s->sg_pending_size - 1].size += 256;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300468
469 /* If this is an MPEG stream, and VBI data is also pending, then append the
470 VBI DMA to the MPEG DMA and transfer both sets of data at once.
471
472 VBI DMA is a second class citizen compared to MPEG and mixing them together
473 will confuse the firmware (the end of a VBI DMA is seen as the end of a
474 MPEG DMA, thus effectively dropping an MPEG frame). So instead we make
475 sure we only use the MPEG DMA to transfer the VBI DMA if both are in
476 use. This way no conflicts occur. */
477 clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
Hans Verkuil37093b12007-07-28 19:45:50 -0300478 if (s->type == IVTV_ENC_STREAM_TYPE_MPG && s_vbi->sg_pending_size &&
479 s->sg_pending_size + s_vbi->sg_pending_size <= s->buffers) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300480 ivtv_queue_move(s_vbi, &s_vbi->q_predma, NULL, &s_vbi->q_dma, s_vbi->q_predma.bytesused);
Hans Verkuildc02d502007-05-19 14:07:16 -0300481 if (ivtv_use_dma(s_vbi))
Hans Verkuil37093b12007-07-28 19:45:50 -0300482 s_vbi->sg_pending[s_vbi->sg_pending_size - 1].size += 256;
483 for (i = 0; i < s_vbi->sg_pending_size; i++) {
484 s->sg_pending[s->sg_pending_size++] = s_vbi->sg_pending[i];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300485 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300486 s_vbi->dma_offset = s_vbi->pending_offset;
487 s_vbi->sg_pending_size = 0;
Hans Verkuilf4071b82007-07-28 12:07:12 -0300488 s_vbi->dma_xfer_cnt++;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300489 set_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
Hans Verkuil6b1e5672007-12-02 06:56:00 -0300490 IVTV_DEBUG_HI_DMA("include DMA for %s\n", s_vbi->name);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300491 }
492
Hans Verkuilf4071b82007-07-28 12:07:12 -0300493 s->dma_xfer_cnt++;
Al Virob0510f82008-05-21 00:31:41 -0300494 memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
Hans Verkuil37093b12007-07-28 19:45:50 -0300495 s->sg_processing_size = s->sg_pending_size;
496 s->sg_pending_size = 0;
497 s->sg_processed = 0;
498 s->dma_offset = s->pending_offset;
499 s->dma_backup = s->pending_backup;
500 s->dma_pts = s->pending_pts;
Hans Verkuildd1e7292007-07-18 13:22:06 -0300501
Hans Verkuildc02d502007-05-19 14:07:16 -0300502 if (ivtv_use_pio(s)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300503 set_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags);
504 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
505 set_bit(IVTV_F_I_PIO, &itv->i_flags);
506 itv->cur_pio_stream = s->type;
507 }
508 else {
Hans Verkuil37093b12007-07-28 19:45:50 -0300509 itv->dma_retries = 0;
510 ivtv_dma_enc_start_xfer(s);
Hans Verkuildc02d502007-05-19 14:07:16 -0300511 set_bit(IVTV_F_I_DMA, &itv->i_flags);
512 itv->cur_dma_stream = s->type;
Hans Verkuildc02d502007-05-19 14:07:16 -0300513 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300514}
515
516static void ivtv_dma_dec_start(struct ivtv_stream *s)
517{
518 struct ivtv *itv = s->itv;
519
520 if (s->q_predma.bytesused)
521 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
Hans Verkuil37093b12007-07-28 19:45:50 -0300522 s->dma_xfer_cnt++;
Al Virob0510f82008-05-21 00:31:41 -0300523 memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
Hans Verkuil37093b12007-07-28 19:45:50 -0300524 s->sg_processing_size = s->sg_pending_size;
525 s->sg_pending_size = 0;
526 s->sg_processed = 0;
527
Hans Verkuilbd58df62007-07-10 17:47:07 -0300528 IVTV_DEBUG_HI_DMA("start DMA for %s\n", s->name);
Hans Verkuil37093b12007-07-28 19:45:50 -0300529 itv->dma_retries = 0;
530 ivtv_dma_dec_start_xfer(s);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300531 set_bit(IVTV_F_I_DMA, &itv->i_flags);
532 itv->cur_dma_stream = s->type;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300533}
534
535static void ivtv_irq_dma_read(struct ivtv *itv)
536{
537 struct ivtv_stream *s = NULL;
538 struct ivtv_buffer *buf;
Hans Verkuil37093b12007-07-28 19:45:50 -0300539 int hw_stream_type = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300540
Hans Verkuilbd58df62007-07-10 17:47:07 -0300541 IVTV_DEBUG_HI_IRQ("DEC DMA READ\n");
Hans Verkuil9b2e5c62008-04-22 14:42:16 -0300542
543 del_timer(&itv->dma_timer);
544
545 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && itv->cur_dma_stream < 0)
Hans Verkuil37093b12007-07-28 19:45:50 -0300546 return;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300547
Hans Verkuil37093b12007-07-28 19:45:50 -0300548 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
549 s = &itv->streams[itv->cur_dma_stream];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300550 ivtv_stream_sync_for_cpu(s);
551
Hans Verkuil37093b12007-07-28 19:45:50 -0300552 if (read_reg(IVTV_REG_DMASTATUS) & 0x14) {
553 IVTV_DEBUG_WARN("DEC DMA ERROR %x (xfer %d of %d, retry %d)\n",
554 read_reg(IVTV_REG_DMASTATUS),
555 s->sg_processed, s->sg_processing_size, itv->dma_retries);
556 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
557 if (itv->dma_retries == 3) {
Hans Verkuile17a06b2007-08-18 15:48:42 -0300558 /* Too many retries, give up on this frame */
Hans Verkuil37093b12007-07-28 19:45:50 -0300559 itv->dma_retries = 0;
Hans Verkuile17a06b2007-08-18 15:48:42 -0300560 s->sg_processed = s->sg_processing_size;
Hans Verkuil37093b12007-07-28 19:45:50 -0300561 }
562 else {
563 /* Retry, starting with the first xfer segment.
564 Just retrying the current segment is not sufficient. */
565 s->sg_processed = 0;
566 itv->dma_retries++;
567 }
568 }
569 if (s->sg_processed < s->sg_processing_size) {
570 /* DMA next buffer */
571 ivtv_dma_dec_start_xfer(s);
572 return;
573 }
574 if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
575 hw_stream_type = 2;
576 IVTV_DEBUG_HI_DMA("DEC DATA READ %s: %d\n", s->name, s->q_dma.bytesused);
577
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300578 /* For some reason must kick the firmware, like PIO mode,
579 I think this tells the firmware we are done and the size
580 of the xfer so it can calculate what we need next.
581 I think we can do this part ourselves but would have to
582 fully calculate xfer info ourselves and not use interrupts
583 */
584 ivtv_vapi(itv, CX2341X_DEC_SCHED_DMA_FROM_HOST, 3, 0, s->q_dma.bytesused,
585 hw_stream_type);
586
587 /* Free last DMA call */
588 while ((buf = ivtv_dequeue(s, &s->q_dma)) != NULL) {
589 ivtv_buf_sync_for_cpu(s, buf);
590 ivtv_enqueue(s, buf, &s->q_free);
591 }
592 wake_up(&s->waitq);
593 }
594 clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
595 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
596 itv->cur_dma_stream = -1;
597 wake_up(&itv->dma_waitq);
598}
599
600static void ivtv_irq_enc_dma_complete(struct ivtv *itv)
601{
602 u32 data[CX2341X_MBOX_MAX_DATA];
603 struct ivtv_stream *s;
604
Andy Walls587808d2010-02-10 15:34:46 -0300605 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
Hans Verkuil37093b12007-07-28 19:45:50 -0300606 IVTV_DEBUG_HI_IRQ("ENC DMA COMPLETE %x %d (%d)\n", data[0], data[1], itv->cur_dma_stream);
Hans Verkuil9b2e5c62008-04-22 14:42:16 -0300607
608 del_timer(&itv->dma_timer);
609
610 if (itv->cur_dma_stream < 0)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300611 return;
Hans Verkuil9b2e5c62008-04-22 14:42:16 -0300612
Hans Verkuil37093b12007-07-28 19:45:50 -0300613 s = &itv->streams[itv->cur_dma_stream];
614 ivtv_stream_sync_for_cpu(s);
615
616 if (data[0] & 0x18) {
617 IVTV_DEBUG_WARN("ENC DMA ERROR %x (offset %08x, xfer %d of %d, retry %d)\n", data[0],
618 s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries);
619 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
620 if (itv->dma_retries == 3) {
Hans Verkuile17a06b2007-08-18 15:48:42 -0300621 /* Too many retries, give up on this frame */
Hans Verkuil37093b12007-07-28 19:45:50 -0300622 itv->dma_retries = 0;
Hans Verkuile17a06b2007-08-18 15:48:42 -0300623 s->sg_processed = s->sg_processing_size;
Hans Verkuil37093b12007-07-28 19:45:50 -0300624 }
625 else {
626 /* Retry, starting with the first xfer segment.
627 Just retrying the current segment is not sufficient. */
628 s->sg_processed = 0;
629 itv->dma_retries++;
630 }
631 }
632 if (s->sg_processed < s->sg_processing_size) {
633 /* DMA next buffer */
634 ivtv_dma_enc_start_xfer(s);
635 return;
636 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300637 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
638 itv->cur_dma_stream = -1;
639 dma_post(s);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300640 if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300641 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300642 dma_post(s);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300643 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300644 s->sg_processing_size = 0;
645 s->sg_processed = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300646 wake_up(&itv->dma_waitq);
647}
648
Hans Verkuildc02d502007-05-19 14:07:16 -0300649static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
650{
651 struct ivtv_stream *s;
652
653 if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS) {
654 itv->cur_pio_stream = -1;
655 return;
656 }
657 s = &itv->streams[itv->cur_pio_stream];
Hans Verkuilbd58df62007-07-10 17:47:07 -0300658 IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s->name);
Hans Verkuildc02d502007-05-19 14:07:16 -0300659 clear_bit(IVTV_F_I_PIO, &itv->i_flags);
660 itv->cur_pio_stream = -1;
661 dma_post(s);
662 if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
663 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 0);
664 else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
665 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 1);
666 else if (s->type == IVTV_ENC_STREAM_TYPE_PCM)
667 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 2);
668 clear_bit(IVTV_F_I_PIO, &itv->i_flags);
669 if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300670 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
Hans Verkuildc02d502007-05-19 14:07:16 -0300671 dma_post(s);
Hans Verkuildc02d502007-05-19 14:07:16 -0300672 }
673 wake_up(&itv->dma_waitq);
674}
675
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300676static void ivtv_irq_dma_err(struct ivtv *itv)
677{
678 u32 data[CX2341X_MBOX_MAX_DATA];
Michaeld213ad02011-02-26 01:56:34 -0300679 u32 status;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300680
681 del_timer(&itv->dma_timer);
Michaeld213ad02011-02-26 01:56:34 -0300682
Andy Walls587808d2010-02-10 15:34:46 -0300683 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
Michaeld213ad02011-02-26 01:56:34 -0300684 status = read_reg(IVTV_REG_DMASTATUS);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300685 IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1],
Michaeld213ad02011-02-26 01:56:34 -0300686 status, itv->cur_dma_stream);
687 /*
688 * We do *not* write back to the IVTV_REG_DMASTATUS register to
689 * clear the error status, if either the encoder write (0x02) or
690 * decoder read (0x01) bus master DMA operation do not indicate
691 * completed. We can race with the DMA engine, which may have
692 * transitioned to completed status *after* we read the register.
693 * Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the
694 * DMA engine has completed, will cause the DMA engine to stop working.
695 */
696 status &= 0x3;
697 if (status == 0x3)
698 write_reg(status, IVTV_REG_DMASTATUS);
699
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300700 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) &&
701 itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) {
702 struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream];
703
Michaeld213ad02011-02-26 01:56:34 -0300704 if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) {
705 /* retry */
706 /*
707 * FIXME - handle cases of DMA error similar to
708 * encoder below, except conditioned on status & 0x1
709 */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300710 ivtv_dma_dec_start(s);
Michaeld213ad02011-02-26 01:56:34 -0300711 return;
712 } else {
713 if ((status & 0x2) == 0) {
714 /*
715 * CX2341x Bus Master DMA write is ongoing.
716 * Reset the timer and let it complete.
717 */
718 itv->dma_timer.expires =
719 jiffies + msecs_to_jiffies(600);
720 add_timer(&itv->dma_timer);
721 return;
722 }
723
724 if (itv->dma_retries < 3) {
725 /*
726 * CX2341x Bus Master DMA write has ended.
727 * Retry the write, starting with the first
728 * xfer segment. Just retrying the current
729 * segment is not sufficient.
730 */
731 s->sg_processed = 0;
732 itv->dma_retries++;
733 ivtv_dma_enc_start_xfer(s);
734 return;
735 }
736 /* Too many retries, give up on this one */
737 }
738
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300739 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300740 if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
741 ivtv_udma_start(itv);
742 return;
743 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300744 clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
745 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
746 itv->cur_dma_stream = -1;
747 wake_up(&itv->dma_waitq);
748}
749
750static void ivtv_irq_enc_start_cap(struct ivtv *itv)
751{
752 u32 data[CX2341X_MBOX_MAX_DATA];
753 struct ivtv_stream *s;
754
755 /* Get DMA destination and size arguments from card */
Andy Walls587808d2010-02-10 15:34:46 -0300756 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA, 7, data);
Hans Verkuilbd58df62007-07-10 17:47:07 -0300757 IVTV_DEBUG_HI_IRQ("ENC START CAP %d: %08x %08x\n", data[0], data[1], data[2]);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300758
759 if (data[0] > 2 || data[1] == 0 || data[2] == 0) {
760 IVTV_DEBUG_WARN("Unknown input: %08x %08x %08x\n",
761 data[0], data[1], data[2]);
762 return;
763 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300764 s = &itv->streams[ivtv_stream_map[data[0]]];
765 if (!stream_enc_dma_append(s, data)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300766 set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300767 }
768}
769
770static void ivtv_irq_enc_vbi_cap(struct ivtv *itv)
771{
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300772 u32 data[CX2341X_MBOX_MAX_DATA];
773 struct ivtv_stream *s;
774
Hans Verkuilbd58df62007-07-10 17:47:07 -0300775 IVTV_DEBUG_HI_IRQ("ENC START VBI CAP\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300776 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
777
Hans Verkuild526afe2008-09-03 16:47:14 -0300778 if (!stream_enc_dma_append(s, data))
Hans Verkuildc02d502007-05-19 14:07:16 -0300779 set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300780}
781
Hans Verkuildc02d502007-05-19 14:07:16 -0300782static void ivtv_irq_dec_vbi_reinsert(struct ivtv *itv)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300783{
784 u32 data[CX2341X_MBOX_MAX_DATA];
785 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_VBI];
786
Hans Verkuilbd58df62007-07-10 17:47:07 -0300787 IVTV_DEBUG_HI_IRQ("DEC VBI REINSERT\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300788 if (test_bit(IVTV_F_S_CLAIMED, &s->s_flags) &&
789 !stream_enc_dma_append(s, data)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300790 set_bit(IVTV_F_S_PIO_PENDING, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300791 }
792}
793
794static void ivtv_irq_dec_data_req(struct ivtv *itv)
795{
796 u32 data[CX2341X_MBOX_MAX_DATA];
797 struct ivtv_stream *s;
798
799 /* YUV or MPG */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300800
801 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags)) {
Andy Walls587808d2010-02-10 15:34:46 -0300802 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 2, data);
Ian Armstrong77aded62007-11-05 14:27:09 -0300803 itv->dma_data_req_size =
804 1080 * ((itv->yuv_info.v4l2_src_h + 31) & ~31);
805 itv->dma_data_req_offset = data[1];
806 if (atomic_read(&itv->yuv_info.next_dma_frame) >= 0)
807 ivtv_yuv_frame_complete(itv);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300808 s = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
809 }
810 else {
Andy Walls587808d2010-02-10 15:34:46 -0300811 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 3, data);
Richard Knutsson14d5deb2007-12-08 10:35:06 -0300812 itv->dma_data_req_size = min_t(u32, data[2], 0x10000);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300813 itv->dma_data_req_offset = data[1];
814 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
815 }
Hans Verkuilbd58df62007-07-10 17:47:07 -0300816 IVTV_DEBUG_HI_IRQ("DEC DATA REQ %s: %d %08x %u\n", s->name, s->q_full.bytesused,
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300817 itv->dma_data_req_offset, itv->dma_data_req_size);
818 if (itv->dma_data_req_size == 0 || s->q_full.bytesused < itv->dma_data_req_size) {
819 set_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
820 }
821 else {
Ian Armstrong77aded62007-11-05 14:27:09 -0300822 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
823 ivtv_yuv_setup_stream_frame(itv);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300824 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
825 ivtv_queue_move(s, &s->q_full, NULL, &s->q_predma, itv->dma_data_req_size);
826 ivtv_dma_stream_dec_prepare(s, itv->dma_data_req_offset + IVTV_DECODER_OFFSET, 0);
827 }
828}
829
830static void ivtv_irq_vsync(struct ivtv *itv)
831{
832 /* The vsync interrupt is unusual in that it won't clear until
833 * the end of the first line for the current field, at which
834 * point it clears itself. This can result in repeated vsync
835 * interrupts, or a missed vsync. Read some of the registers
836 * to determine the line being displayed and ensure we handle
837 * one vsync per frame.
838 */
Andy Walls4e1af312010-03-13 20:37:25 -0300839 unsigned int frame = read_reg(IVTV_REG_DEC_LINE_FIELD) & 1;
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300840 struct yuv_playback_info *yi = &itv->yuv_info;
Ian Armstrong2bd7ac52008-10-09 12:04:23 -0300841 int last_dma_frame = atomic_read(&yi->next_dma_frame);
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300842 struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300843
844 if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
845
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300846 if (((frame ^ f->sync_field) == 0 &&
847 ((itv->last_vsync_field & 1) ^ f->sync_field)) ||
848 (frame != (itv->last_vsync_field & 1) && !f->interlaced)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300849 int next_dma_frame = last_dma_frame;
850
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300851 if (!(f->interlaced && f->delay && yi->fields_lapsed < 1)) {
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300852 if (next_dma_frame >= 0 && next_dma_frame != atomic_read(&yi->next_fill_frame)) {
Ian Armstrongbfd7bea2007-08-03 10:01:39 -0300853 write_reg(yuv_offset[next_dma_frame] >> 4, 0x82c);
854 write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x830);
855 write_reg(yuv_offset[next_dma_frame] >> 4, 0x834);
856 write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x838);
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300857 next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS;
858 atomic_set(&yi->next_dma_frame, next_dma_frame);
859 yi->fields_lapsed = -1;
Ian Armstrong2bd7ac52008-10-09 12:04:23 -0300860 yi->running = 1;
Ian Armstrongbfd7bea2007-08-03 10:01:39 -0300861 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300862 }
863 }
Hans Verkuila158f352007-08-23 11:31:57 -0300864 if (frame != (itv->last_vsync_field & 1)) {
Hans Verkuil09250192010-03-27 14:10:13 -0300865 static const struct v4l2_event evtop = {
866 .type = V4L2_EVENT_VSYNC,
867 .u.vsync.field = V4L2_FIELD_TOP,
868 };
869 static const struct v4l2_event evbottom = {
870 .type = V4L2_EVENT_VSYNC,
871 .u.vsync.field = V4L2_FIELD_BOTTOM,
872 };
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300873 struct ivtv_stream *s = ivtv_get_output_stream(itv);
874
Hans Verkuila158f352007-08-23 11:31:57 -0300875 itv->last_vsync_field += 1;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300876 if (frame == 0) {
877 clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
878 clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
879 }
880 else {
881 set_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
882 }
883 if (test_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags)) {
884 set_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags);
885 wake_up(&itv->event_waitq);
Hans Verkuil09250192010-03-27 14:10:13 -0300886 if (s)
887 wake_up(&s->waitq);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300888 }
Hans Verkuil09250192010-03-27 14:10:13 -0300889 if (s && s->vdev)
890 v4l2_event_queue(s->vdev, frame ? &evtop : &evbottom);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300891 wake_up(&itv->vsync_waitq);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300892
893 /* Send VBI to saa7127 */
Hans Verkuil2f3a9892007-08-25 14:11:23 -0300894 if (frame && (itv->output_mode == OUT_PASSTHROUGH ||
895 test_bit(IVTV_F_I_UPDATE_WSS, &itv->i_flags) ||
896 test_bit(IVTV_F_I_UPDATE_VPS, &itv->i_flags) ||
897 test_bit(IVTV_F_I_UPDATE_CC, &itv->i_flags))) {
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300898 set_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags);
Hans Verkuildc02d502007-05-19 14:07:16 -0300899 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300900 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300901
902 /* Check if we need to update the yuv registers */
Ian Armstrong2bd7ac52008-10-09 12:04:23 -0300903 if (yi->running && (yi->yuv_forced_update || f->update)) {
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300904 if (!f->update) {
Ian Armstrong2bd7ac52008-10-09 12:04:23 -0300905 last_dma_frame =
906 (u8)(atomic_read(&yi->next_dma_frame) -
907 1) % IVTV_YUV_BUFFERS;
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300908 f = &yi->new_frame_info[last_dma_frame];
909 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300910
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300911 if (f->src_w) {
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300912 yi->update_frame = last_dma_frame;
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300913 f->update = 0;
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300914 yi->yuv_forced_update = 0;
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300915 set_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags);
Hans Verkuildc02d502007-05-19 14:07:16 -0300916 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300917 }
918 }
Ian Armstrongbfd7bea2007-08-03 10:01:39 -0300919
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300920 yi->fields_lapsed++;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300921 }
922}
923
Hans Verkuil2f3a9892007-08-25 14:11:23 -0300924#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)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300925
926irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
927{
928 struct ivtv *itv = (struct ivtv *)dev_id;
929 u32 combo;
930 u32 stat;
931 int i;
932 u8 vsync_force = 0;
933
934 spin_lock(&itv->dma_reg_lock);
935 /* get contents of irq status register */
936 stat = read_reg(IVTV_REG_IRQSTATUS);
937
938 combo = ~itv->irqmask & stat;
939
940 /* Clear out IRQ */
941 if (combo) write_reg(combo, IVTV_REG_IRQSTATUS);
942
943 if (0 == combo) {
944 /* The vsync interrupt is unusual and clears itself. If we
945 * took too long, we may have missed it. Do some checks
946 */
947 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
948 /* vsync is enabled, see if we're in a new field */
Andy Walls4e1af312010-03-13 20:37:25 -0300949 if ((itv->last_vsync_field & 1) !=
950 (read_reg(IVTV_REG_DEC_LINE_FIELD) & 1)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300951 /* New field, looks like we missed it */
Andy Walls4e1af312010-03-13 20:37:25 -0300952 IVTV_DEBUG_YUV("VSync interrupt missed %d\n",
953 read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300954 vsync_force = 1;
955 }
956 }
957
958 if (!vsync_force) {
959 /* No Vsync expected, wasn't for us */
960 spin_unlock(&itv->dma_reg_lock);
961 return IRQ_NONE;
962 }
963 }
964
965 /* Exclude interrupts noted below from the output, otherwise the log is flooded with
966 these messages */
967 if (combo & ~0xff6d0400)
Hans Verkuilbd58df62007-07-10 17:47:07 -0300968 IVTV_DEBUG_HI_IRQ("======= valid IRQ bits: 0x%08x ======\n", combo);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300969
970 if (combo & IVTV_IRQ_DEC_DMA_COMPLETE) {
Hans Verkuilbd58df62007-07-10 17:47:07 -0300971 IVTV_DEBUG_HI_IRQ("DEC DMA COMPLETE\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300972 }
973
974 if (combo & IVTV_IRQ_DMA_READ) {
975 ivtv_irq_dma_read(itv);
976 }
977
978 if (combo & IVTV_IRQ_ENC_DMA_COMPLETE) {
979 ivtv_irq_enc_dma_complete(itv);
980 }
981
Hans Verkuildc02d502007-05-19 14:07:16 -0300982 if (combo & IVTV_IRQ_ENC_PIO_COMPLETE) {
983 ivtv_irq_enc_pio_complete(itv);
984 }
985
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300986 if (combo & IVTV_IRQ_DMA_ERR) {
987 ivtv_irq_dma_err(itv);
988 }
989
990 if (combo & IVTV_IRQ_ENC_START_CAP) {
991 ivtv_irq_enc_start_cap(itv);
992 }
993
994 if (combo & IVTV_IRQ_ENC_VBI_CAP) {
995 ivtv_irq_enc_vbi_cap(itv);
996 }
997
998 if (combo & IVTV_IRQ_DEC_VBI_RE_INSERT) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300999 ivtv_irq_dec_vbi_reinsert(itv);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001000 }
1001
1002 if (combo & IVTV_IRQ_ENC_EOS) {
1003 IVTV_DEBUG_IRQ("ENC EOS\n");
1004 set_bit(IVTV_F_I_EOS, &itv->i_flags);
Hans Verkuilfd8b2812007-08-23 10:13:15 -03001005 wake_up(&itv->eos_waitq);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001006 }
1007
1008 if (combo & IVTV_IRQ_DEC_DATA_REQ) {
1009 ivtv_irq_dec_data_req(itv);
1010 }
1011
1012 /* Decoder Vertical Sync - We can't rely on 'combo', so check if vsync enabled */
1013 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
1014 ivtv_irq_vsync(itv);
1015 }
1016
1017 if (combo & IVTV_IRQ_ENC_VIM_RST) {
1018 IVTV_DEBUG_IRQ("VIM RST\n");
1019 /*ivtv_vapi(itv, CX2341X_ENC_REFRESH_INPUT, 0); */
1020 }
1021
1022 if (combo & IVTV_IRQ_DEC_AUD_MODE_CHG) {
1023 IVTV_DEBUG_INFO("Stereo mode changed\n");
1024 }
1025
1026 if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -03001027 itv->irq_rr_idx++;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001028 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -03001029 int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001030 struct ivtv_stream *s = &itv->streams[idx];
1031
1032 if (!test_and_clear_bit(IVTV_F_S_DMA_PENDING, &s->s_flags))
1033 continue;
1034 if (s->type >= IVTV_DEC_STREAM_TYPE_MPG)
1035 ivtv_dma_dec_start(s);
1036 else
1037 ivtv_dma_enc_start(s);
1038 break;
1039 }
Ian Armstrongb6e436b2009-12-21 22:59:26 -03001040
1041 if (i == IVTV_MAX_STREAMS &&
1042 test_bit(IVTV_F_I_UDMA_PENDING, &itv->i_flags))
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001043 ivtv_udma_start(itv);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001044 }
1045
Hans Verkuildc02d502007-05-19 14:07:16 -03001046 if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_PIO, &itv->i_flags)) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -03001047 itv->irq_rr_idx++;
Hans Verkuildc02d502007-05-19 14:07:16 -03001048 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -03001049 int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
Hans Verkuildc02d502007-05-19 14:07:16 -03001050 struct ivtv_stream *s = &itv->streams[idx];
1051
1052 if (!test_and_clear_bit(IVTV_F_S_PIO_PENDING, &s->s_flags))
1053 continue;
1054 if (s->type == IVTV_DEC_STREAM_TYPE_VBI || s->type < IVTV_DEC_STREAM_TYPE_MPG)
1055 ivtv_dma_enc_start(s);
1056 break;
1057 }
1058 }
1059
Hans Verkuil2f3a9892007-08-25 14:11:23 -03001060 if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) {
Tejun Heo7bc46562010-06-29 10:07:09 +02001061 queue_kthread_work(&itv->irq_worker, &itv->irq_work);
Hans Verkuil2f3a9892007-08-25 14:11:23 -03001062 }
Hans Verkuildc02d502007-05-19 14:07:16 -03001063
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001064 spin_unlock(&itv->dma_reg_lock);
1065
1066 /* If we've just handled a 'forced' vsync, it's safest to say it
1067 * wasn't ours. Another device may have triggered it at just
1068 * the right time.
1069 */
1070 return vsync_force ? IRQ_NONE : IRQ_HANDLED;
1071}
1072
1073void ivtv_unfinished_dma(unsigned long arg)
1074{
1075 struct ivtv *itv = (struct ivtv *)arg;
1076
1077 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
1078 return;
1079 IVTV_ERR("DMA TIMEOUT %08x %d\n", read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream);
1080
1081 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
1082 clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
1083 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
1084 itv->cur_dma_stream = -1;
1085 wake_up(&itv->dma_waitq);
1086}