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>
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.
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.
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
21 #include "ivtv-driver.h"
22 #include "ivtv-queue.h"
23 #include "ivtv-udma.h"
25 #include "ivtv-mailbox.h"
28 #include <media/v4l2-event.h>
30 #define DMA_MAGIC_COOKIE 0x000001fe
32 static void ivtv_dma_dec_start(struct ivtv_stream
*s
);
34 static 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
,
41 static void ivtv_pcm_work_handler(struct ivtv
*itv
)
43 struct ivtv_stream
*s
= &itv
->streams
[IVTV_ENC_STREAM_TYPE_PCM
];
44 struct ivtv_buffer
*buf
;
46 /* Pass the PCM data to ivtv-alsa */
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
55 buf
= ivtv_dequeue(s
, &s
->q_io
);
57 buf
= ivtv_dequeue(s
, &s
->q_full
);
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
));
66 ivtv_enqueue(s
, buf
, &s
->q_free
);
70 static void ivtv_pio_work_handler(struct ivtv
*itv
)
72 struct ivtv_stream
*s
= &itv
->streams
[itv
->cur_pio_stream
];
73 struct ivtv_buffer
*buf
;
76 IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n");
77 if (itv
->cur_pio_stream
< 0 || itv
->cur_pio_stream
>= IVTV_MAX_STREAMS
||
78 s
->vdev
.v4l2_dev
== NULL
|| !ivtv_use_pio(s
)) {
79 itv
->cur_pio_stream
= -1;
80 /* trigger PIO complete user interrupt */
81 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE
, 0x44);
84 IVTV_DEBUG_HI_DMA("Process PIO %s\n", s
->name
);
85 list_for_each_entry(buf
, &s
->q_dma
.list
, list
) {
86 u32 size
= s
->sg_processing
[i
].size
& 0x3ffff;
88 /* Copy the data from the card to the buffer */
89 if (s
->type
== IVTV_DEC_STREAM_TYPE_VBI
) {
90 memcpy_fromio(buf
->buf
, itv
->dec_mem
+ s
->sg_processing
[i
].src
- IVTV_DECODER_OFFSET
, size
);
93 memcpy_fromio(buf
->buf
, itv
->enc_mem
+ s
->sg_processing
[i
].src
, size
);
96 if (i
== s
->sg_processing_size
)
99 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE
, 0x44);
102 void ivtv_irq_work_handler(struct kthread_work
*work
)
104 struct ivtv
*itv
= container_of(work
, struct ivtv
, irq_work
);
106 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO
, &itv
->i_flags
))
107 ivtv_pio_work_handler(itv
);
109 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_VBI
, &itv
->i_flags
))
110 ivtv_vbi_work_handler(itv
);
112 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_YUV
, &itv
->i_flags
))
113 ivtv_yuv_work_handler(itv
);
115 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PCM
, &itv
->i_flags
))
116 ivtv_pcm_work_handler(itv
);
119 /* 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.
123 static int stream_enc_dma_append(struct ivtv_stream
*s
, u32 data
[CX2341X_MBOX_MAX_DATA
])
125 struct ivtv
*itv
= s
->itv
;
126 struct ivtv_buffer
*buf
;
127 u32 bytes_needed
= 0;
129 u32 UVoffset
= 0, UVsize
= 0;
130 int skip_bufs
= s
->q_predma
.buffers
;
131 int idx
= s
->sg_pending_size
;
135 if (s
->vdev
.v4l2_dev
== NULL
) {
136 IVTV_DEBUG_WARN("Stream %s not started\n", s
->name
);
139 if (!test_bit(IVTV_F_S_CLAIMED
, &s
->s_flags
)) {
140 IVTV_DEBUG_WARN("Stream %s not open\n", s
->name
);
144 /* determine offset, size and PTS for the various streams */
146 case IVTV_ENC_STREAM_TYPE_MPG
:
152 case IVTV_ENC_STREAM_TYPE_YUV
:
157 s
->pending_pts
= ((u64
) data
[5] << 32) | data
[6];
160 case IVTV_ENC_STREAM_TYPE_PCM
:
161 offset
= data
[1] + 12;
163 s
->pending_pts
= read_dec(offset
- 8) |
164 ((u64
)(read_dec(offset
- 12)) << 32);
165 if (itv
->has_cx23415
)
166 offset
+= IVTV_DECODER_OFFSET
;
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;
173 IVTV_DEBUG_INFO("VBI offset == 0\n");
176 s
->pending_pts
= read_enc(offset
- 4) | ((u64
)read_enc(offset
- 8) << 32);
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
;
183 offset
+= IVTV_DECODER_OFFSET
;
186 /* shouldn't happen */
190 /* if this is the start of the DMA then fill in the magic cookie */
191 if (s
->sg_pending_size
== 0 && ivtv_use_dma(s
)) {
192 if (itv
->has_cx23415
&& (s
->type
== IVTV_ENC_STREAM_TYPE_PCM
||
193 s
->type
== IVTV_DEC_STREAM_TYPE_VBI
)) {
194 s
->pending_backup
= read_dec(offset
- IVTV_DECODER_OFFSET
);
195 write_dec_sync(DMA_MAGIC_COOKIE
, offset
- IVTV_DECODER_OFFSET
);
198 s
->pending_backup
= read_enc(offset
);
199 write_enc_sync(DMA_MAGIC_COOKIE
, offset
);
201 s
->pending_offset
= offset
;
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
209 bytes_needed
= s
->buf_size
* ((bytes_needed
+ s
->buf_size
- 1) / s
->buf_size
);
210 bytes_needed
+= UVsize
;
213 IVTV_DEBUG_HI_DMA("%s %s: 0x%08x bytes at 0x%08x\n",
214 ivtv_use_pio(s
) ? "PIO" : "DMA", s
->name
, bytes_needed
, offset
);
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
);
222 if (rc
&& !s
->buffers_stolen
&& test_bit(IVTV_F_S_APPL_IO
, &s
->s_flags
)) {
223 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");
226 s
->buffers_stolen
= rc
;
228 /* got the buffers, now fill in sg_pending */
229 buf
= list_entry(s
->q_predma
.list
.next
, struct ivtv_buffer
, list
);
230 memset(buf
->buf
, 0, 128);
231 list_for_each_entry(buf
, &s
->q_predma
.list
, list
) {
234 s
->sg_pending
[idx
].dst
= buf
->dma_handle
;
235 s
->sg_pending
[idx
].src
= offset
;
236 s
->sg_pending
[idx
].size
= s
->buf_size
;
237 buf
->bytesused
= min(size
, s
->buf_size
);
238 buf
->dma_xfer_cnt
= s
->dma_xfer_cnt
;
240 s
->q_predma
.bytesused
+= buf
->bytesused
;
241 size
-= buf
->bytesused
;
242 offset
+= s
->buf_size
;
244 /* Sync SG buffers */
245 ivtv_buf_sync_for_device(s
, buf
);
247 if (size
== 0) { /* YUV */
248 /* process the UV section */
254 s
->sg_pending_size
= idx
;
258 static void dma_post(struct ivtv_stream
*s
)
260 struct ivtv
*itv
= s
->itv
;
261 struct ivtv_buffer
*buf
= NULL
;
267 IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s
) ? "PIO" : "DMA",
268 s
->name
, s
->dma_offset
);
269 list_for_each(p
, &s
->q_dma
.list
) {
270 buf
= list_entry(p
, struct ivtv_buffer
, list
);
271 u32buf
= (__le32
*)buf
->buf
;
274 ivtv_buf_sync_for_cpu(s
, buf
);
276 if (x
== 0 && ivtv_use_dma(s
)) {
277 offset
= s
->dma_last_offset
;
278 if (le32_to_cpu(u32buf
[offset
/ 4]) != DMA_MAGIC_COOKIE
)
280 for (offset
= 0; offset
< 64; offset
++)
281 if (le32_to_cpu(u32buf
[offset
]) == DMA_MAGIC_COOKIE
)
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
;
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
;
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
);
297 write_enc_sync(0, s
->dma_offset
);
300 buf
->bytesused
-= offset
;
301 memcpy(buf
->buf
, buf
->buf
+ offset
, buf
->bytesused
+ offset
);
303 *u32buf
= cpu_to_le32(s
->dma_backup
);
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
)
309 buf
->b_flags
|= IVTV_F_B_NEED_BUF_SWAP
;
312 buf
->bytesused
+= s
->dma_last_offset
;
313 if (buf
&& s
->type
== IVTV_DEC_STREAM_TYPE_VBI
) {
314 list_for_each_entry(buf
, &s
->q_dma
.list
, list
) {
315 /* 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
;
321 ivtv_queue_move(s
, &s
->q_dma
, NULL
, &s
->q_free
, 0);
326 ivtv_queue_move(s
, &s
->q_dma
, NULL
, &s
->q_full
, s
->q_dma
.bytesused
);
328 if (s
->type
== IVTV_ENC_STREAM_TYPE_PCM
&&
329 itv
->pcm_announce_callback
!= NULL
) {
331 * Set up the work handler to pass the data to ivtv-alsa.
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.
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
341 set_bit(IVTV_F_I_WORK_HANDLER_PCM
, &itv
->i_flags
);
342 set_bit(IVTV_F_I_HAVE_WORK
, &itv
->i_flags
);
349 void ivtv_dma_stream_dec_prepare(struct ivtv_stream
*s
, u32 offset
, int lock
)
351 struct ivtv
*itv
= s
->itv
;
352 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
];
355 struct ivtv_buffer
*buf
;
356 u32 y_size
= 720 * ((f
->src_h
+ 31) & ~31);
357 u32 uv_offset
= offset
+ IVTV_YUV_BUFFER_UV_OFFSET
;
359 int bytes_written
= 0;
362 IVTV_DEBUG_HI_DMA("DEC PREPARE DMA %s: %08x %08x\n", s
->name
, s
->q_predma
.bytesused
, offset
);
364 /* Insert buffer block for YUV if needed */
365 if (s
->type
== IVTV_DEC_STREAM_TYPE_YUV
&& f
->offset_y
) {
366 if (yi
->blanking_dmaptr
) {
367 s
->sg_pending
[idx
].src
= yi
->blanking_dmaptr
;
368 s
->sg_pending
[idx
].dst
= offset
;
369 s
->sg_pending
[idx
].size
= 720 * 16;
375 list_for_each_entry(buf
, &s
->q_predma
.list
, list
) {
376 /* YUV UV Offset from Y Buffer */
377 if (s
->type
== IVTV_DEC_STREAM_TYPE_YUV
&& !y_done
&&
378 (bytes_written
+ buf
->bytesused
) >= y_size
) {
379 s
->sg_pending
[idx
].src
= buf
->dma_handle
;
380 s
->sg_pending
[idx
].dst
= offset
;
381 s
->sg_pending
[idx
].size
= y_size
- bytes_written
;
383 if (s
->sg_pending
[idx
].size
!= buf
->bytesused
) {
385 s
->sg_pending
[idx
].src
=
386 buf
->dma_handle
+ s
->sg_pending
[idx
- 1].size
;
387 s
->sg_pending
[idx
].dst
= offset
;
388 s
->sg_pending
[idx
].size
=
389 buf
->bytesused
- s
->sg_pending
[idx
- 1].size
;
390 offset
+= s
->sg_pending
[idx
].size
;
394 s
->sg_pending
[idx
].src
= buf
->dma_handle
;
395 s
->sg_pending
[idx
].dst
= offset
;
396 s
->sg_pending
[idx
].size
= buf
->bytesused
;
397 offset
+= buf
->bytesused
;
399 bytes_written
+= buf
->bytesused
;
401 /* Sync SG buffers */
402 ivtv_buf_sync_for_device(s
, buf
);
405 s
->sg_pending_size
= idx
;
407 /* Sync Hardware SG List of buffers */
408 ivtv_stream_sync_for_device(s
);
410 unsigned long flags
= 0;
412 spin_lock_irqsave(&itv
->dma_reg_lock
, flags
);
413 if (!test_bit(IVTV_F_I_DMA
, &itv
->i_flags
))
414 ivtv_dma_dec_start(s
);
416 set_bit(IVTV_F_S_DMA_PENDING
, &s
->s_flags
);
417 spin_unlock_irqrestore(&itv
->dma_reg_lock
, flags
);
419 if (!test_bit(IVTV_F_I_DMA
, &itv
->i_flags
))
420 ivtv_dma_dec_start(s
);
422 set_bit(IVTV_F_S_DMA_PENDING
, &s
->s_flags
);
426 static void ivtv_dma_enc_start_xfer(struct ivtv_stream
*s
)
428 struct ivtv
*itv
= s
->itv
;
430 s
->sg_dma
->src
= cpu_to_le32(s
->sg_processing
[s
->sg_processed
].src
);
431 s
->sg_dma
->dst
= cpu_to_le32(s
->sg_processing
[s
->sg_processed
].dst
);
432 s
->sg_dma
->size
= cpu_to_le32(s
->sg_processing
[s
->sg_processed
].size
| 0x80000000);
434 /* Sync Hardware SG List of buffers */
435 ivtv_stream_sync_for_device(s
);
436 write_reg(s
->sg_handle
, IVTV_REG_ENCDMAADDR
);
437 write_reg_sync(read_reg(IVTV_REG_DMAXFER
) | 0x02, IVTV_REG_DMAXFER
);
438 itv
->dma_timer
.expires
= jiffies
+ msecs_to_jiffies(300);
439 add_timer(&itv
->dma_timer
);
442 static void ivtv_dma_dec_start_xfer(struct ivtv_stream
*s
)
444 struct ivtv
*itv
= s
->itv
;
446 s
->sg_dma
->src
= cpu_to_le32(s
->sg_processing
[s
->sg_processed
].src
);
447 s
->sg_dma
->dst
= cpu_to_le32(s
->sg_processing
[s
->sg_processed
].dst
);
448 s
->sg_dma
->size
= cpu_to_le32(s
->sg_processing
[s
->sg_processed
].size
| 0x80000000);
450 /* Sync Hardware SG List of buffers */
451 ivtv_stream_sync_for_device(s
);
452 write_reg(s
->sg_handle
, IVTV_REG_DECDMAADDR
);
453 write_reg_sync(read_reg(IVTV_REG_DMAXFER
) | 0x01, IVTV_REG_DMAXFER
);
454 itv
->dma_timer
.expires
= jiffies
+ msecs_to_jiffies(300);
455 add_timer(&itv
->dma_timer
);
458 /* start the encoder DMA */
459 static void ivtv_dma_enc_start(struct ivtv_stream
*s
)
461 struct ivtv
*itv
= s
->itv
;
462 struct ivtv_stream
*s_vbi
= &itv
->streams
[IVTV_ENC_STREAM_TYPE_VBI
];
465 IVTV_DEBUG_HI_DMA("start %s for %s\n", ivtv_use_dma(s
) ? "DMA" : "PIO", s
->name
);
467 if (s
->q_predma
.bytesused
)
468 ivtv_queue_move(s
, &s
->q_predma
, NULL
, &s
->q_dma
, s
->q_predma
.bytesused
);
471 s
->sg_pending
[s
->sg_pending_size
- 1].size
+= 256;
473 /* If this is an MPEG stream, and VBI data is also pending, then append the
474 VBI DMA to the MPEG DMA and transfer both sets of data at once.
476 VBI DMA is a second class citizen compared to MPEG and mixing them together
477 will confuse the firmware (the end of a VBI DMA is seen as the end of a
478 MPEG DMA, thus effectively dropping an MPEG frame). So instead we make
479 sure we only use the MPEG DMA to transfer the VBI DMA if both are in
480 use. This way no conflicts occur. */
481 clear_bit(IVTV_F_S_DMA_HAS_VBI
, &s
->s_flags
);
482 if (s
->type
== IVTV_ENC_STREAM_TYPE_MPG
&& s_vbi
->sg_pending_size
&&
483 s
->sg_pending_size
+ s_vbi
->sg_pending_size
<= s
->buffers
) {
484 ivtv_queue_move(s_vbi
, &s_vbi
->q_predma
, NULL
, &s_vbi
->q_dma
, s_vbi
->q_predma
.bytesused
);
485 if (ivtv_use_dma(s_vbi
))
486 s_vbi
->sg_pending
[s_vbi
->sg_pending_size
- 1].size
+= 256;
487 for (i
= 0; i
< s_vbi
->sg_pending_size
; i
++) {
488 s
->sg_pending
[s
->sg_pending_size
++] = s_vbi
->sg_pending
[i
];
490 s_vbi
->dma_offset
= s_vbi
->pending_offset
;
491 s_vbi
->sg_pending_size
= 0;
492 s_vbi
->dma_xfer_cnt
++;
493 set_bit(IVTV_F_S_DMA_HAS_VBI
, &s
->s_flags
);
494 IVTV_DEBUG_HI_DMA("include DMA for %s\n", s_vbi
->name
);
498 memcpy(s
->sg_processing
, s
->sg_pending
, sizeof(struct ivtv_sg_host_element
) * s
->sg_pending_size
);
499 s
->sg_processing_size
= s
->sg_pending_size
;
500 s
->sg_pending_size
= 0;
502 s
->dma_offset
= s
->pending_offset
;
503 s
->dma_backup
= s
->pending_backup
;
504 s
->dma_pts
= s
->pending_pts
;
506 if (ivtv_use_pio(s
)) {
507 set_bit(IVTV_F_I_WORK_HANDLER_PIO
, &itv
->i_flags
);
508 set_bit(IVTV_F_I_HAVE_WORK
, &itv
->i_flags
);
509 set_bit(IVTV_F_I_PIO
, &itv
->i_flags
);
510 itv
->cur_pio_stream
= s
->type
;
513 itv
->dma_retries
= 0;
514 ivtv_dma_enc_start_xfer(s
);
515 set_bit(IVTV_F_I_DMA
, &itv
->i_flags
);
516 itv
->cur_dma_stream
= s
->type
;
520 static void ivtv_dma_dec_start(struct ivtv_stream
*s
)
522 struct ivtv
*itv
= s
->itv
;
524 if (s
->q_predma
.bytesused
)
525 ivtv_queue_move(s
, &s
->q_predma
, NULL
, &s
->q_dma
, s
->q_predma
.bytesused
);
527 memcpy(s
->sg_processing
, s
->sg_pending
, sizeof(struct ivtv_sg_host_element
) * s
->sg_pending_size
);
528 s
->sg_processing_size
= s
->sg_pending_size
;
529 s
->sg_pending_size
= 0;
532 IVTV_DEBUG_HI_DMA("start DMA for %s\n", s
->name
);
533 itv
->dma_retries
= 0;
534 ivtv_dma_dec_start_xfer(s
);
535 set_bit(IVTV_F_I_DMA
, &itv
->i_flags
);
536 itv
->cur_dma_stream
= s
->type
;
539 static void ivtv_irq_dma_read(struct ivtv
*itv
)
541 struct ivtv_stream
*s
= NULL
;
542 struct ivtv_buffer
*buf
;
543 int hw_stream_type
= 0;
545 IVTV_DEBUG_HI_IRQ("DEC DMA READ\n");
547 del_timer(&itv
->dma_timer
);
549 if (!test_bit(IVTV_F_I_UDMA
, &itv
->i_flags
) && itv
->cur_dma_stream
< 0)
552 if (!test_bit(IVTV_F_I_UDMA
, &itv
->i_flags
)) {
553 s
= &itv
->streams
[itv
->cur_dma_stream
];
554 ivtv_stream_sync_for_cpu(s
);
556 if (read_reg(IVTV_REG_DMASTATUS
) & 0x14) {
557 IVTV_DEBUG_WARN("DEC DMA ERROR %x (xfer %d of %d, retry %d)\n",
558 read_reg(IVTV_REG_DMASTATUS
),
559 s
->sg_processed
, s
->sg_processing_size
, itv
->dma_retries
);
560 write_reg(read_reg(IVTV_REG_DMASTATUS
) & 3, IVTV_REG_DMASTATUS
);
561 if (itv
->dma_retries
== 3) {
562 /* Too many retries, give up on this frame */
563 itv
->dma_retries
= 0;
564 s
->sg_processed
= s
->sg_processing_size
;
567 /* Retry, starting with the first xfer segment.
568 Just retrying the current segment is not sufficient. */
573 if (s
->sg_processed
< s
->sg_processing_size
) {
574 /* DMA next buffer */
575 ivtv_dma_dec_start_xfer(s
);
578 if (s
->type
== IVTV_DEC_STREAM_TYPE_YUV
)
580 IVTV_DEBUG_HI_DMA("DEC DATA READ %s: %d\n", s
->name
, s
->q_dma
.bytesused
);
582 /* For some reason must kick the firmware, like PIO mode,
583 I think this tells the firmware we are done and the size
584 of the xfer so it can calculate what we need next.
585 I think we can do this part ourselves but would have to
586 fully calculate xfer info ourselves and not use interrupts
588 ivtv_vapi(itv
, CX2341X_DEC_SCHED_DMA_FROM_HOST
, 3, 0, s
->q_dma
.bytesused
,
591 /* Free last DMA call */
592 while ((buf
= ivtv_dequeue(s
, &s
->q_dma
)) != NULL
) {
593 ivtv_buf_sync_for_cpu(s
, buf
);
594 ivtv_enqueue(s
, buf
, &s
->q_free
);
598 clear_bit(IVTV_F_I_UDMA
, &itv
->i_flags
);
599 clear_bit(IVTV_F_I_DMA
, &itv
->i_flags
);
600 itv
->cur_dma_stream
= -1;
601 wake_up(&itv
->dma_waitq
);
604 static void ivtv_irq_enc_dma_complete(struct ivtv
*itv
)
606 u32 data
[CX2341X_MBOX_MAX_DATA
];
607 struct ivtv_stream
*s
;
609 ivtv_api_get_data(&itv
->enc_mbox
, IVTV_MBOX_DMA_END
, 2, data
);
610 IVTV_DEBUG_HI_IRQ("ENC DMA COMPLETE %x %d (%d)\n", data
[0], data
[1], itv
->cur_dma_stream
);
612 del_timer(&itv
->dma_timer
);
614 if (itv
->cur_dma_stream
< 0)
617 s
= &itv
->streams
[itv
->cur_dma_stream
];
618 ivtv_stream_sync_for_cpu(s
);
620 if (data
[0] & 0x18) {
621 IVTV_DEBUG_WARN("ENC DMA ERROR %x (offset %08x, xfer %d of %d, retry %d)\n", data
[0],
622 s
->dma_offset
, s
->sg_processed
, s
->sg_processing_size
, itv
->dma_retries
);
623 write_reg(read_reg(IVTV_REG_DMASTATUS
) & 3, IVTV_REG_DMASTATUS
);
624 if (itv
->dma_retries
== 3) {
625 /* Too many retries, give up on this frame */
626 itv
->dma_retries
= 0;
627 s
->sg_processed
= s
->sg_processing_size
;
630 /* Retry, starting with the first xfer segment.
631 Just retrying the current segment is not sufficient. */
636 if (s
->sg_processed
< s
->sg_processing_size
) {
637 /* DMA next buffer */
638 ivtv_dma_enc_start_xfer(s
);
641 clear_bit(IVTV_F_I_DMA
, &itv
->i_flags
);
642 itv
->cur_dma_stream
= -1;
644 if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI
, &s
->s_flags
)) {
645 s
= &itv
->streams
[IVTV_ENC_STREAM_TYPE_VBI
];
648 s
->sg_processing_size
= 0;
650 wake_up(&itv
->dma_waitq
);
653 static void ivtv_irq_enc_pio_complete(struct ivtv
*itv
)
655 struct ivtv_stream
*s
;
657 if (itv
->cur_pio_stream
< 0 || itv
->cur_pio_stream
>= IVTV_MAX_STREAMS
) {
658 itv
->cur_pio_stream
= -1;
661 s
= &itv
->streams
[itv
->cur_pio_stream
];
662 IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s
->name
);
663 clear_bit(IVTV_F_I_PIO
, &itv
->i_flags
);
664 itv
->cur_pio_stream
= -1;
666 if (s
->type
== IVTV_ENC_STREAM_TYPE_MPG
)
667 ivtv_vapi(itv
, CX2341X_ENC_SCHED_DMA_TO_HOST
, 3, 0, 0, 0);
668 else if (s
->type
== IVTV_ENC_STREAM_TYPE_YUV
)
669 ivtv_vapi(itv
, CX2341X_ENC_SCHED_DMA_TO_HOST
, 3, 0, 0, 1);
670 else if (s
->type
== IVTV_ENC_STREAM_TYPE_PCM
)
671 ivtv_vapi(itv
, CX2341X_ENC_SCHED_DMA_TO_HOST
, 3, 0, 0, 2);
672 clear_bit(IVTV_F_I_PIO
, &itv
->i_flags
);
673 if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI
, &s
->s_flags
)) {
674 s
= &itv
->streams
[IVTV_ENC_STREAM_TYPE_VBI
];
677 wake_up(&itv
->dma_waitq
);
680 static void ivtv_irq_dma_err(struct ivtv
*itv
)
682 u32 data
[CX2341X_MBOX_MAX_DATA
];
685 del_timer(&itv
->dma_timer
);
687 ivtv_api_get_data(&itv
->enc_mbox
, IVTV_MBOX_DMA_END
, 2, data
);
688 status
= read_reg(IVTV_REG_DMASTATUS
);
689 IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data
[0], data
[1],
690 status
, itv
->cur_dma_stream
);
692 * We do *not* write back to the IVTV_REG_DMASTATUS register to
693 * clear the error status, if either the encoder write (0x02) or
694 * decoder read (0x01) bus master DMA operation do not indicate
695 * completed. We can race with the DMA engine, which may have
696 * transitioned to completed status *after* we read the register.
697 * Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the
698 * DMA engine has completed, will cause the DMA engine to stop working.
702 write_reg(status
, IVTV_REG_DMASTATUS
);
704 if (!test_bit(IVTV_F_I_UDMA
, &itv
->i_flags
) &&
705 itv
->cur_dma_stream
>= 0 && itv
->cur_dma_stream
< IVTV_MAX_STREAMS
) {
706 struct ivtv_stream
*s
= &itv
->streams
[itv
->cur_dma_stream
];
708 if (s
->type
>= IVTV_DEC_STREAM_TYPE_MPG
) {
711 * FIXME - handle cases of DMA error similar to
712 * encoder below, except conditioned on status & 0x1
714 ivtv_dma_dec_start(s
);
717 if ((status
& 0x2) == 0) {
719 * CX2341x Bus Master DMA write is ongoing.
720 * Reset the timer and let it complete.
722 itv
->dma_timer
.expires
=
723 jiffies
+ msecs_to_jiffies(600);
724 add_timer(&itv
->dma_timer
);
728 if (itv
->dma_retries
< 3) {
730 * CX2341x Bus Master DMA write has ended.
731 * Retry the write, starting with the first
732 * xfer segment. Just retrying the current
733 * segment is not sufficient.
737 ivtv_dma_enc_start_xfer(s
);
740 /* Too many retries, give up on this one */
744 if (test_bit(IVTV_F_I_UDMA
, &itv
->i_flags
)) {
745 ivtv_udma_start(itv
);
748 clear_bit(IVTV_F_I_UDMA
, &itv
->i_flags
);
749 clear_bit(IVTV_F_I_DMA
, &itv
->i_flags
);
750 itv
->cur_dma_stream
= -1;
751 wake_up(&itv
->dma_waitq
);
754 static void ivtv_irq_enc_start_cap(struct ivtv
*itv
)
756 u32 data
[CX2341X_MBOX_MAX_DATA
];
757 struct ivtv_stream
*s
;
759 /* Get DMA destination and size arguments from card */
760 ivtv_api_get_data(&itv
->enc_mbox
, IVTV_MBOX_DMA
, 7, data
);
761 IVTV_DEBUG_HI_IRQ("ENC START CAP %d: %08x %08x\n", data
[0], data
[1], data
[2]);
763 if (data
[0] > 2 || data
[1] == 0 || data
[2] == 0) {
764 IVTV_DEBUG_WARN("Unknown input: %08x %08x %08x\n",
765 data
[0], data
[1], data
[2]);
768 s
= &itv
->streams
[ivtv_stream_map
[data
[0]]];
769 if (!stream_enc_dma_append(s
, data
)) {
770 set_bit(ivtv_use_pio(s
) ? IVTV_F_S_PIO_PENDING
: IVTV_F_S_DMA_PENDING
, &s
->s_flags
);
774 static void ivtv_irq_enc_vbi_cap(struct ivtv
*itv
)
776 u32 data
[CX2341X_MBOX_MAX_DATA
];
777 struct ivtv_stream
*s
;
779 IVTV_DEBUG_HI_IRQ("ENC START VBI CAP\n");
780 s
= &itv
->streams
[IVTV_ENC_STREAM_TYPE_VBI
];
782 if (!stream_enc_dma_append(s
, data
))
783 set_bit(ivtv_use_pio(s
) ? IVTV_F_S_PIO_PENDING
: IVTV_F_S_DMA_PENDING
, &s
->s_flags
);
786 static void ivtv_irq_dec_vbi_reinsert(struct ivtv
*itv
)
788 u32 data
[CX2341X_MBOX_MAX_DATA
];
789 struct ivtv_stream
*s
= &itv
->streams
[IVTV_DEC_STREAM_TYPE_VBI
];
791 IVTV_DEBUG_HI_IRQ("DEC VBI REINSERT\n");
792 if (test_bit(IVTV_F_S_CLAIMED
, &s
->s_flags
) &&
793 !stream_enc_dma_append(s
, data
)) {
794 set_bit(IVTV_F_S_PIO_PENDING
, &s
->s_flags
);
798 static void ivtv_irq_dec_data_req(struct ivtv
*itv
)
800 u32 data
[CX2341X_MBOX_MAX_DATA
];
801 struct ivtv_stream
*s
;
805 if (test_bit(IVTV_F_I_DEC_YUV
, &itv
->i_flags
)) {
806 ivtv_api_get_data(&itv
->dec_mbox
, IVTV_MBOX_DMA
, 2, data
);
807 itv
->dma_data_req_size
=
808 1080 * ((itv
->yuv_info
.v4l2_src_h
+ 31) & ~31);
809 itv
->dma_data_req_offset
= data
[1];
810 if (atomic_read(&itv
->yuv_info
.next_dma_frame
) >= 0)
811 ivtv_yuv_frame_complete(itv
);
812 s
= &itv
->streams
[IVTV_DEC_STREAM_TYPE_YUV
];
815 ivtv_api_get_data(&itv
->dec_mbox
, IVTV_MBOX_DMA
, 3, data
);
816 itv
->dma_data_req_size
= min_t(u32
, data
[2], 0x10000);
817 itv
->dma_data_req_offset
= data
[1];
818 s
= &itv
->streams
[IVTV_DEC_STREAM_TYPE_MPG
];
820 IVTV_DEBUG_HI_IRQ("DEC DATA REQ %s: %d %08x %u\n", s
->name
, s
->q_full
.bytesused
,
821 itv
->dma_data_req_offset
, itv
->dma_data_req_size
);
822 if (itv
->dma_data_req_size
== 0 || s
->q_full
.bytesused
< itv
->dma_data_req_size
) {
823 set_bit(IVTV_F_S_NEEDS_DATA
, &s
->s_flags
);
826 if (test_bit(IVTV_F_I_DEC_YUV
, &itv
->i_flags
))
827 ivtv_yuv_setup_stream_frame(itv
);
828 clear_bit(IVTV_F_S_NEEDS_DATA
, &s
->s_flags
);
829 ivtv_queue_move(s
, &s
->q_full
, NULL
, &s
->q_predma
, itv
->dma_data_req_size
);
830 ivtv_dma_stream_dec_prepare(s
, itv
->dma_data_req_offset
+ IVTV_DECODER_OFFSET
, 0);
834 static void ivtv_irq_vsync(struct ivtv
*itv
)
836 /* The vsync interrupt is unusual in that it won't clear until
837 * the end of the first line for the current field, at which
838 * point it clears itself. This can result in repeated vsync
839 * interrupts, or a missed vsync. Read some of the registers
840 * to determine the line being displayed and ensure we handle
841 * one vsync per frame.
843 unsigned int frame
= read_reg(IVTV_REG_DEC_LINE_FIELD
) & 1;
844 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
845 int last_dma_frame
= atomic_read(&yi
->next_dma_frame
);
846 struct yuv_frame_info
*f
= &yi
->new_frame_info
[last_dma_frame
];
848 if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
850 if (((frame
^ f
->sync_field
) == 0 &&
851 ((itv
->last_vsync_field
& 1) ^ f
->sync_field
)) ||
852 (frame
!= (itv
->last_vsync_field
& 1) && !f
->interlaced
)) {
853 int next_dma_frame
= last_dma_frame
;
855 if (!(f
->interlaced
&& f
->delay
&& yi
->fields_lapsed
< 1)) {
856 if (next_dma_frame
>= 0 && next_dma_frame
!= atomic_read(&yi
->next_fill_frame
)) {
857 write_reg(yuv_offset
[next_dma_frame
] >> 4, 0x82c);
858 write_reg((yuv_offset
[next_dma_frame
] + IVTV_YUV_BUFFER_UV_OFFSET
) >> 4, 0x830);
859 write_reg(yuv_offset
[next_dma_frame
] >> 4, 0x834);
860 write_reg((yuv_offset
[next_dma_frame
] + IVTV_YUV_BUFFER_UV_OFFSET
) >> 4, 0x838);
861 next_dma_frame
= (next_dma_frame
+ 1) % IVTV_YUV_BUFFERS
;
862 atomic_set(&yi
->next_dma_frame
, next_dma_frame
);
863 yi
->fields_lapsed
= -1;
868 if (frame
!= (itv
->last_vsync_field
& 1)) {
869 static const struct v4l2_event evtop
= {
870 .type
= V4L2_EVENT_VSYNC
,
871 .u
.vsync
.field
= V4L2_FIELD_TOP
,
873 static const struct v4l2_event evbottom
= {
874 .type
= V4L2_EVENT_VSYNC
,
875 .u
.vsync
.field
= V4L2_FIELD_BOTTOM
,
877 struct ivtv_stream
*s
= ivtv_get_output_stream(itv
);
879 itv
->last_vsync_field
+= 1;
881 clear_bit(IVTV_F_I_VALID_DEC_TIMINGS
, &itv
->i_flags
);
882 clear_bit(IVTV_F_I_EV_VSYNC_FIELD
, &itv
->i_flags
);
885 set_bit(IVTV_F_I_EV_VSYNC_FIELD
, &itv
->i_flags
);
887 if (test_bit(IVTV_F_I_EV_VSYNC_ENABLED
, &itv
->i_flags
)) {
888 set_bit(IVTV_F_I_EV_VSYNC
, &itv
->i_flags
);
889 wake_up(&itv
->event_waitq
);
893 if (s
&& s
->vdev
.v4l2_dev
)
894 v4l2_event_queue(&s
->vdev
, frame
? &evtop
: &evbottom
);
895 wake_up(&itv
->vsync_waitq
);
897 /* Send VBI to saa7127 */
898 if (frame
&& (itv
->output_mode
== OUT_PASSTHROUGH
||
899 test_bit(IVTV_F_I_UPDATE_WSS
, &itv
->i_flags
) ||
900 test_bit(IVTV_F_I_UPDATE_VPS
, &itv
->i_flags
) ||
901 test_bit(IVTV_F_I_UPDATE_CC
, &itv
->i_flags
))) {
902 set_bit(IVTV_F_I_WORK_HANDLER_VBI
, &itv
->i_flags
);
903 set_bit(IVTV_F_I_HAVE_WORK
, &itv
->i_flags
);
906 /* Check if we need to update the yuv registers */
907 if (yi
->running
&& (yi
->yuv_forced_update
|| f
->update
)) {
910 (u8
)(atomic_read(&yi
->next_dma_frame
) -
911 1) % IVTV_YUV_BUFFERS
;
912 f
= &yi
->new_frame_info
[last_dma_frame
];
916 yi
->update_frame
= last_dma_frame
;
918 yi
->yuv_forced_update
= 0;
919 set_bit(IVTV_F_I_WORK_HANDLER_YUV
, &itv
->i_flags
);
920 set_bit(IVTV_F_I_HAVE_WORK
, &itv
->i_flags
);
928 #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)
930 irqreturn_t
ivtv_irq_handler(int irq
, void *dev_id
)
932 struct ivtv
*itv
= (struct ivtv
*)dev_id
;
938 spin_lock(&itv
->dma_reg_lock
);
939 /* get contents of irq status register */
940 stat
= read_reg(IVTV_REG_IRQSTATUS
);
942 combo
= ~itv
->irqmask
& stat
;
945 if (combo
) write_reg(combo
, IVTV_REG_IRQSTATUS
);
948 /* The vsync interrupt is unusual and clears itself. If we
949 * took too long, we may have missed it. Do some checks
951 if (~itv
->irqmask
& IVTV_IRQ_DEC_VSYNC
) {
952 /* vsync is enabled, see if we're in a new field */
953 if ((itv
->last_vsync_field
& 1) !=
954 (read_reg(IVTV_REG_DEC_LINE_FIELD
) & 1)) {
955 /* New field, looks like we missed it */
956 IVTV_DEBUG_YUV("VSync interrupt missed %d\n",
957 read_reg(IVTV_REG_DEC_LINE_FIELD
) >> 16);
963 /* No Vsync expected, wasn't for us */
964 spin_unlock(&itv
->dma_reg_lock
);
969 /* Exclude interrupts noted below from the output, otherwise the log is flooded with
971 if (combo
& ~0xff6d0400)
972 IVTV_DEBUG_HI_IRQ("======= valid IRQ bits: 0x%08x ======\n", combo
);
974 if (combo
& IVTV_IRQ_DEC_DMA_COMPLETE
) {
975 IVTV_DEBUG_HI_IRQ("DEC DMA COMPLETE\n");
978 if (combo
& IVTV_IRQ_DMA_READ
) {
979 ivtv_irq_dma_read(itv
);
982 if (combo
& IVTV_IRQ_ENC_DMA_COMPLETE
) {
983 ivtv_irq_enc_dma_complete(itv
);
986 if (combo
& IVTV_IRQ_ENC_PIO_COMPLETE
) {
987 ivtv_irq_enc_pio_complete(itv
);
990 if (combo
& IVTV_IRQ_DMA_ERR
) {
991 ivtv_irq_dma_err(itv
);
994 if (combo
& IVTV_IRQ_ENC_START_CAP
) {
995 ivtv_irq_enc_start_cap(itv
);
998 if (combo
& IVTV_IRQ_ENC_VBI_CAP
) {
999 ivtv_irq_enc_vbi_cap(itv
);
1002 if (combo
& IVTV_IRQ_DEC_VBI_RE_INSERT
) {
1003 ivtv_irq_dec_vbi_reinsert(itv
);
1006 if (combo
& IVTV_IRQ_ENC_EOS
) {
1007 IVTV_DEBUG_IRQ("ENC EOS\n");
1008 set_bit(IVTV_F_I_EOS
, &itv
->i_flags
);
1009 wake_up(&itv
->eos_waitq
);
1012 if (combo
& IVTV_IRQ_DEC_DATA_REQ
) {
1013 ivtv_irq_dec_data_req(itv
);
1016 /* Decoder Vertical Sync - We can't rely on 'combo', so check if vsync enabled */
1017 if (~itv
->irqmask
& IVTV_IRQ_DEC_VSYNC
) {
1018 ivtv_irq_vsync(itv
);
1021 if (combo
& IVTV_IRQ_ENC_VIM_RST
) {
1022 IVTV_DEBUG_IRQ("VIM RST\n");
1023 /*ivtv_vapi(itv, CX2341X_ENC_REFRESH_INPUT, 0); */
1026 if (combo
& IVTV_IRQ_DEC_AUD_MODE_CHG
) {
1027 IVTV_DEBUG_INFO("Stereo mode changed\n");
1030 if ((combo
& IVTV_IRQ_DMA
) && !test_bit(IVTV_F_I_DMA
, &itv
->i_flags
)) {
1032 for (i
= 0; i
< IVTV_MAX_STREAMS
; i
++) {
1033 int idx
= (i
+ itv
->irq_rr_idx
) % IVTV_MAX_STREAMS
;
1034 struct ivtv_stream
*s
= &itv
->streams
[idx
];
1036 if (!test_and_clear_bit(IVTV_F_S_DMA_PENDING
, &s
->s_flags
))
1038 if (s
->type
>= IVTV_DEC_STREAM_TYPE_MPG
)
1039 ivtv_dma_dec_start(s
);
1041 ivtv_dma_enc_start(s
);
1045 if (i
== IVTV_MAX_STREAMS
&&
1046 test_bit(IVTV_F_I_UDMA_PENDING
, &itv
->i_flags
))
1047 ivtv_udma_start(itv
);
1050 if ((combo
& IVTV_IRQ_DMA
) && !test_bit(IVTV_F_I_PIO
, &itv
->i_flags
)) {
1052 for (i
= 0; i
< IVTV_MAX_STREAMS
; i
++) {
1053 int idx
= (i
+ itv
->irq_rr_idx
) % IVTV_MAX_STREAMS
;
1054 struct ivtv_stream
*s
= &itv
->streams
[idx
];
1056 if (!test_and_clear_bit(IVTV_F_S_PIO_PENDING
, &s
->s_flags
))
1058 if (s
->type
== IVTV_DEC_STREAM_TYPE_VBI
|| s
->type
< IVTV_DEC_STREAM_TYPE_MPG
)
1059 ivtv_dma_enc_start(s
);
1064 if (test_and_clear_bit(IVTV_F_I_HAVE_WORK
, &itv
->i_flags
)) {
1065 kthread_queue_work(&itv
->irq_worker
, &itv
->irq_work
);
1068 spin_unlock(&itv
->dma_reg_lock
);
1070 /* If we've just handled a 'forced' vsync, it's safest to say it
1071 * wasn't ours. Another device may have triggered it at just
1074 return vsync_force
? IRQ_NONE
: IRQ_HANDLED
;
1077 void ivtv_unfinished_dma(unsigned long arg
)
1079 struct ivtv
*itv
= (struct ivtv
*)arg
;
1081 if (!test_bit(IVTV_F_I_DMA
, &itv
->i_flags
))
1083 IVTV_ERR("DMA TIMEOUT %08x %d\n", read_reg(IVTV_REG_DMASTATUS
), itv
->cur_dma_stream
);
1085 write_reg(read_reg(IVTV_REG_DMASTATUS
) & 3, IVTV_REG_DMASTATUS
);
1086 clear_bit(IVTV_F_I_UDMA
, &itv
->i_flags
);
1087 clear_bit(IVTV_F_I_DMA
, &itv
->i_flags
);
1088 itv
->cur_dma_stream
= -1;
1089 wake_up(&itv
->dma_waitq
);