blob: e3e32256078367e72b6e467f83e0dcbb65ca8c09 [file] [log] [blame]
Philipp Zabel79924ca2014-07-23 12:28:45 -03001/*
2 * Coda multi-standard codec IP - BIT processor functions
3 *
4 * Copyright (C) 2012 Vista Silicon S.L.
5 * Javier Martin, <javier.martin@vista-silicon.com>
6 * Xavier Duret
7 * Copyright (C) 2012-2014 Philipp Zabel, Pengutronix
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 */
14
15#include <linux/clk.h>
16#include <linux/irqreturn.h>
17#include <linux/kernel.h>
Philipp Zabelad532d32015-03-24 14:30:52 -030018#include <linux/log2.h>
Philipp Zabel79924ca2014-07-23 12:28:45 -030019#include <linux/platform_device.h>
20#include <linux/reset.h>
Fabio Estevamc0aaf692014-09-19 08:32:30 -030021#include <linux/slab.h>
Philipp Zabel79924ca2014-07-23 12:28:45 -030022#include <linux/videodev2.h>
23
24#include <media/v4l2-common.h>
25#include <media/v4l2-ctrls.h>
26#include <media/v4l2-fh.h>
27#include <media/v4l2-mem2mem.h>
Junghak Sungc1399902015-09-22 10:30:29 -030028#include <media/videobuf2-v4l2.h>
Philipp Zabel79924ca2014-07-23 12:28:45 -030029#include <media/videobuf2-dma-contig.h>
30#include <media/videobuf2-vmalloc.h>
31
32#include "coda.h"
Michael Trettere7f3c542017-01-20 12:00:24 -020033#include "imx-vdoa.h"
Philipp Zabel9a1a8f92015-01-29 14:36:00 -030034#define CREATE_TRACE_POINTS
35#include "trace.h"
Philipp Zabel79924ca2014-07-23 12:28:45 -030036
Philipp Zabel650b9392015-03-24 14:30:53 -030037#define CODA_PARA_BUF_SIZE (10 * 1024)
Philipp Zabel79924ca2014-07-23 12:28:45 -030038#define CODA7_PS_BUF_SIZE 0x28000
39#define CODA9_PS_SAVE_SIZE (512 * 1024)
40
41#define CODA_DEFAULT_GAMMA 4096
42#define CODA9_DEFAULT_GAMMA 24576 /* 0.75 * 32768 */
43
Philipp Zabelad532d32015-03-24 14:30:52 -030044static void coda_free_bitstream_buffer(struct coda_ctx *ctx);
45
Philipp Zabel79924ca2014-07-23 12:28:45 -030046static inline int coda_is_initialized(struct coda_dev *dev)
47{
Philipp Zabelf23797b2014-08-06 08:02:23 -030048 return coda_read(dev, CODA_REG_BIT_CUR_PC) != 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -030049}
50
51static inline unsigned long coda_isbusy(struct coda_dev *dev)
52{
53 return coda_read(dev, CODA_REG_BIT_BUSY);
54}
55
56static int coda_wait_timeout(struct coda_dev *dev)
57{
58 unsigned long timeout = jiffies + msecs_to_jiffies(1000);
59
60 while (coda_isbusy(dev)) {
61 if (time_after(jiffies, timeout))
62 return -ETIMEDOUT;
63 }
64 return 0;
65}
66
67static void coda_command_async(struct coda_ctx *ctx, int cmd)
68{
69 struct coda_dev *dev = ctx->dev;
70
71 if (dev->devtype->product == CODA_960 ||
72 dev->devtype->product == CODA_7541) {
73 /* Restore context related registers to CODA */
74 coda_write(dev, ctx->bit_stream_param,
75 CODA_REG_BIT_BIT_STREAM_PARAM);
76 coda_write(dev, ctx->frm_dis_flg,
77 CODA_REG_BIT_FRM_DIS_FLG(ctx->reg_idx));
78 coda_write(dev, ctx->frame_mem_ctrl,
79 CODA_REG_BIT_FRAME_MEM_CTRL);
80 coda_write(dev, ctx->workbuf.paddr, CODA_REG_BIT_WORK_BUF_ADDR);
81 }
82
83 if (dev->devtype->product == CODA_960) {
84 coda_write(dev, 1, CODA9_GDI_WPROT_ERR_CLR);
85 coda_write(dev, 0, CODA9_GDI_WPROT_RGN_EN);
86 }
87
88 coda_write(dev, CODA_REG_BIT_BUSY_FLAG, CODA_REG_BIT_BUSY);
89
90 coda_write(dev, ctx->idx, CODA_REG_BIT_RUN_INDEX);
91 coda_write(dev, ctx->params.codec_mode, CODA_REG_BIT_RUN_COD_STD);
92 coda_write(dev, ctx->params.codec_mode_aux, CODA7_REG_BIT_RUN_AUX_STD);
93
Philipp Zabel9a1a8f92015-01-29 14:36:00 -030094 trace_coda_bit_run(ctx, cmd);
95
Philipp Zabel79924ca2014-07-23 12:28:45 -030096 coda_write(dev, cmd, CODA_REG_BIT_RUN_COMMAND);
97}
98
99static int coda_command_sync(struct coda_ctx *ctx, int cmd)
100{
101 struct coda_dev *dev = ctx->dev;
Philipp Zabel9a1a8f92015-01-29 14:36:00 -0300102 int ret;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300103
104 coda_command_async(ctx, cmd);
Philipp Zabel9a1a8f92015-01-29 14:36:00 -0300105 ret = coda_wait_timeout(dev);
106 trace_coda_bit_done(ctx);
107
108 return ret;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300109}
110
111int coda_hw_reset(struct coda_ctx *ctx)
112{
113 struct coda_dev *dev = ctx->dev;
114 unsigned long timeout;
115 unsigned int idx;
116 int ret;
117
118 if (!dev->rstc)
119 return -ENOENT;
120
121 idx = coda_read(dev, CODA_REG_BIT_RUN_INDEX);
122
123 if (dev->devtype->product == CODA_960) {
124 timeout = jiffies + msecs_to_jiffies(100);
125 coda_write(dev, 0x11, CODA9_GDI_BUS_CTRL);
126 while (coda_read(dev, CODA9_GDI_BUS_STATUS) != 0x77) {
127 if (time_after(jiffies, timeout))
128 return -ETIME;
129 cpu_relax();
130 }
131 }
132
133 ret = reset_control_reset(dev->rstc);
134 if (ret < 0)
135 return ret;
136
137 if (dev->devtype->product == CODA_960)
138 coda_write(dev, 0x00, CODA9_GDI_BUS_CTRL);
139 coda_write(dev, CODA_REG_BIT_BUSY_FLAG, CODA_REG_BIT_BUSY);
140 coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN);
141 ret = coda_wait_timeout(dev);
142 coda_write(dev, idx, CODA_REG_BIT_RUN_INDEX);
143
144 return ret;
145}
146
147static void coda_kfifo_sync_from_device(struct coda_ctx *ctx)
148{
149 struct __kfifo *kfifo = &ctx->bitstream_fifo.kfifo;
150 struct coda_dev *dev = ctx->dev;
151 u32 rd_ptr;
152
153 rd_ptr = coda_read(dev, CODA_REG_BIT_RD_PTR(ctx->reg_idx));
154 kfifo->out = (kfifo->in & ~kfifo->mask) |
155 (rd_ptr - ctx->bitstream.paddr);
156 if (kfifo->out > kfifo->in)
157 kfifo->out -= kfifo->mask + 1;
158}
159
160static void coda_kfifo_sync_to_device_full(struct coda_ctx *ctx)
161{
162 struct __kfifo *kfifo = &ctx->bitstream_fifo.kfifo;
163 struct coda_dev *dev = ctx->dev;
164 u32 rd_ptr, wr_ptr;
165
166 rd_ptr = ctx->bitstream.paddr + (kfifo->out & kfifo->mask);
167 coda_write(dev, rd_ptr, CODA_REG_BIT_RD_PTR(ctx->reg_idx));
168 wr_ptr = ctx->bitstream.paddr + (kfifo->in & kfifo->mask);
169 coda_write(dev, wr_ptr, CODA_REG_BIT_WR_PTR(ctx->reg_idx));
170}
171
172static void coda_kfifo_sync_to_device_write(struct coda_ctx *ctx)
173{
174 struct __kfifo *kfifo = &ctx->bitstream_fifo.kfifo;
175 struct coda_dev *dev = ctx->dev;
176 u32 wr_ptr;
177
178 wr_ptr = ctx->bitstream.paddr + (kfifo->in & kfifo->mask);
179 coda_write(dev, wr_ptr, CODA_REG_BIT_WR_PTR(ctx->reg_idx));
180}
181
Philipp Zabelf23797b2014-08-06 08:02:23 -0300182static int coda_bitstream_queue(struct coda_ctx *ctx,
Junghak Sung2d700712015-09-22 10:30:30 -0300183 struct vb2_v4l2_buffer *src_buf)
Philipp Zabel79924ca2014-07-23 12:28:45 -0300184{
Junghak Sung2d700712015-09-22 10:30:30 -0300185 u32 src_size = vb2_get_plane_payload(&src_buf->vb2_buf, 0);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300186 u32 n;
187
Junghak Sung2d700712015-09-22 10:30:30 -0300188 n = kfifo_in(&ctx->bitstream_fifo,
189 vb2_plane_vaddr(&src_buf->vb2_buf, 0), src_size);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300190 if (n < src_size)
191 return -ENOSPC;
192
Junghak Sung2d700712015-09-22 10:30:30 -0300193 src_buf->sequence = ctx->qsequence++;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300194
195 return 0;
196}
197
198static bool coda_bitstream_try_queue(struct coda_ctx *ctx,
Junghak Sung2d700712015-09-22 10:30:30 -0300199 struct vb2_v4l2_buffer *src_buf)
Philipp Zabel79924ca2014-07-23 12:28:45 -0300200{
201 int ret;
202
203 if (coda_get_bitstream_payload(ctx) +
Junghak Sung2d700712015-09-22 10:30:30 -0300204 vb2_get_plane_payload(&src_buf->vb2_buf, 0) + 512 >=
205 ctx->bitstream.size)
Philipp Zabel79924ca2014-07-23 12:28:45 -0300206 return false;
207
Junghak Sung2d700712015-09-22 10:30:30 -0300208 if (vb2_plane_vaddr(&src_buf->vb2_buf, 0) == NULL) {
Philipp Zabel79924ca2014-07-23 12:28:45 -0300209 v4l2_err(&ctx->dev->v4l2_dev, "trying to queue empty buffer\n");
210 return true;
211 }
212
213 ret = coda_bitstream_queue(ctx, src_buf);
214 if (ret < 0) {
215 v4l2_err(&ctx->dev->v4l2_dev, "bitstream buffer overflow\n");
216 return false;
217 }
218 /* Sync read pointer to device */
219 if (ctx == v4l2_m2m_get_curr_priv(ctx->dev->m2m_dev))
220 coda_kfifo_sync_to_device_write(ctx);
221
222 ctx->hold = false;
223
224 return true;
225}
226
Philipp Zabel331e7862017-03-03 09:12:48 -0300227void coda_fill_bitstream(struct coda_ctx *ctx, struct list_head *buffer_list)
Philipp Zabel79924ca2014-07-23 12:28:45 -0300228{
Junghak Sung2d700712015-09-22 10:30:30 -0300229 struct vb2_v4l2_buffer *src_buf;
Philipp Zabel7cbb1052014-10-02 14:08:32 -0300230 struct coda_buffer_meta *meta;
Philipp Zabel47f3fa62015-07-09 07:10:21 -0300231 unsigned long flags;
Philipp Zabel7cbb1052014-10-02 14:08:32 -0300232 u32 start;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300233
Philipp Zabel30a09572015-07-09 07:10:15 -0300234 if (ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG)
235 return;
236
Philipp Zabel79924ca2014-07-23 12:28:45 -0300237 while (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) > 0) {
Philipp Zabel619165628d2014-10-02 14:08:34 -0300238 /*
239 * Only queue a single JPEG into the bitstream buffer, except
240 * to increase payload over 512 bytes or if in hold state.
241 */
242 if (ctx->codec->src_fourcc == V4L2_PIX_FMT_JPEG &&
243 (coda_get_bitstream_payload(ctx) >= 512) && !ctx->hold)
244 break;
245
Philipp Zabel79924ca2014-07-23 12:28:45 -0300246 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
247
Philipp Zabeledc16cb2014-10-08 13:09:27 -0300248 /* Drop frames that do not start/end with a SOI/EOI markers */
249 if (ctx->codec->src_fourcc == V4L2_PIX_FMT_JPEG &&
Philipp Zabeld4de0472015-12-02 14:58:51 -0200250 !coda_jpeg_check_buffer(ctx, &src_buf->vb2_buf)) {
Philipp Zabeledc16cb2014-10-08 13:09:27 -0300251 v4l2_err(&ctx->dev->v4l2_dev,
Philipp Zabel582d88722015-03-24 14:30:57 -0300252 "dropping invalid JPEG frame %d\n",
253 ctx->qsequence);
Philipp Zabeledc16cb2014-10-08 13:09:27 -0300254 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
Philipp Zabel331e7862017-03-03 09:12:48 -0300255 if (buffer_list) {
256 struct v4l2_m2m_buffer *m2m_buf;
257
258 m2m_buf = container_of(src_buf,
259 struct v4l2_m2m_buffer,
260 vb);
261 list_add_tail(&m2m_buf->list, buffer_list);
262 } else {
263 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
264 }
Philipp Zabeledc16cb2014-10-08 13:09:27 -0300265 continue;
266 }
267
Zahari Doychev54733872015-08-03 08:57:19 -0300268 /* Dump empty buffers */
Junghak Sung2d700712015-09-22 10:30:30 -0300269 if (!vb2_get_plane_payload(&src_buf->vb2_buf, 0)) {
Zahari Doychev54733872015-08-03 08:57:19 -0300270 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
271 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
272 continue;
273 }
274
Philipp Zabel7cbb1052014-10-02 14:08:32 -0300275 /* Buffer start position */
276 start = ctx->bitstream_fifo.kfifo.in &
277 ctx->bitstream_fifo.kfifo.mask;
278
Philipp Zabel79924ca2014-07-23 12:28:45 -0300279 if (coda_bitstream_try_queue(ctx, src_buf)) {
280 /*
281 * Source buffer is queued in the bitstream ringbuffer;
282 * queue the timestamp and mark source buffer as done
283 */
284 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
285
Philipp Zabel7cbb1052014-10-02 14:08:32 -0300286 meta = kmalloc(sizeof(*meta), GFP_KERNEL);
287 if (meta) {
Junghak Sung2d700712015-09-22 10:30:30 -0300288 meta->sequence = src_buf->sequence;
289 meta->timecode = src_buf->timecode;
Junghak Sungd6dd6452015-11-03 08:16:37 -0200290 meta->timestamp = src_buf->vb2_buf.timestamp;
Philipp Zabel7cbb1052014-10-02 14:08:32 -0300291 meta->start = start;
292 meta->end = ctx->bitstream_fifo.kfifo.in &
293 ctx->bitstream_fifo.kfifo.mask;
Philipp Zabel47f3fa62015-07-09 07:10:21 -0300294 spin_lock_irqsave(&ctx->buffer_meta_lock,
295 flags);
Philipp Zabel7cbb1052014-10-02 14:08:32 -0300296 list_add_tail(&meta->list,
297 &ctx->buffer_meta_list);
Philipp Zabel47f3fa62015-07-09 07:10:21 -0300298 ctx->num_metas++;
299 spin_unlock_irqrestore(&ctx->buffer_meta_lock,
300 flags);
Philipp Zabel9a1a8f92015-01-29 14:36:00 -0300301
302 trace_coda_bit_queue(ctx, src_buf, meta);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300303 }
304
Philipp Zabel331e7862017-03-03 09:12:48 -0300305 if (buffer_list) {
306 struct v4l2_m2m_buffer *m2m_buf;
307
308 m2m_buf = container_of(src_buf,
309 struct v4l2_m2m_buffer,
310 vb);
311 list_add_tail(&m2m_buf->list, buffer_list);
312 } else {
313 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
314 }
Philipp Zabel79924ca2014-07-23 12:28:45 -0300315 } else {
316 break;
317 }
318 }
319}
320
321void coda_bit_stream_end_flag(struct coda_ctx *ctx)
322{
323 struct coda_dev *dev = ctx->dev;
324
325 ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
326
Philipp Zabelf23797b2014-08-06 08:02:23 -0300327 /* If this context is currently running, update the hardware flag */
Philipp Zabel79924ca2014-07-23 12:28:45 -0300328 if ((dev->devtype->product == CODA_960) &&
329 coda_isbusy(dev) &&
330 (ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX))) {
Philipp Zabelf23797b2014-08-06 08:02:23 -0300331 coda_write(dev, ctx->bit_stream_param,
332 CODA_REG_BIT_BIT_STREAM_PARAM);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300333 }
334}
335
336static void coda_parabuf_write(struct coda_ctx *ctx, int index, u32 value)
337{
338 struct coda_dev *dev = ctx->dev;
339 u32 *p = ctx->parabuf.vaddr;
340
341 if (dev->devtype->product == CODA_DX6)
342 p[index] = value;
343 else
344 p[index ^ 1] = value;
345}
346
Philipp Zabel650b9392015-03-24 14:30:53 -0300347static inline int coda_alloc_context_buf(struct coda_ctx *ctx,
348 struct coda_aux_buf *buf, size_t size,
349 const char *name)
350{
351 return coda_alloc_aux_buf(ctx->dev, buf, size, name, ctx->debugfs_entry);
352}
353
354
Philipp Zabel79924ca2014-07-23 12:28:45 -0300355static void coda_free_framebuffers(struct coda_ctx *ctx)
356{
357 int i;
358
359 for (i = 0; i < CODA_MAX_FRAMEBUFFERS; i++)
360 coda_free_aux_buf(ctx->dev, &ctx->internal_frames[i]);
361}
362
363static int coda_alloc_framebuffers(struct coda_ctx *ctx,
364 struct coda_q_data *q_data, u32 fourcc)
365{
366 struct coda_dev *dev = ctx->dev;
367 int width, height;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300368 int ysize;
369 int ret;
370 int i;
371
372 if (ctx->codec && (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 ||
373 ctx->codec->dst_fourcc == V4L2_PIX_FMT_H264)) {
374 width = round_up(q_data->width, 16);
375 height = round_up(q_data->height, 16);
376 } else {
377 width = round_up(q_data->width, 8);
378 height = q_data->height;
379 }
380 ysize = width * height;
381
382 /* Allocate frame buffers */
383 for (i = 0; i < ctx->num_internal_frames; i++) {
384 size_t size;
385 char *name;
386
Philipp Zabela269e532015-07-16 13:19:38 -0300387 if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP)
388 size = round_up(ysize, 4096) + ysize / 2;
389 else
390 size = ysize + ysize / 2;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300391 if (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 &&
392 dev->devtype->product != CODA_DX6)
393 size += ysize / 4;
394 name = kasprintf(GFP_KERNEL, "fb%d", i);
395 ret = coda_alloc_context_buf(ctx, &ctx->internal_frames[i],
396 size, name);
397 kfree(name);
398 if (ret < 0) {
399 coda_free_framebuffers(ctx);
400 return ret;
401 }
402 }
403
404 /* Register frame buffers in the parameter buffer */
405 for (i = 0; i < ctx->num_internal_frames; i++) {
Philipp Zabela269e532015-07-16 13:19:38 -0300406 u32 y, cb, cr;
407
Philipp Zabelf23797b2014-08-06 08:02:23 -0300408 /* Start addresses of Y, Cb, Cr planes */
Philipp Zabela269e532015-07-16 13:19:38 -0300409 y = ctx->internal_frames[i].paddr;
410 cb = y + ysize;
411 cr = y + ysize + ysize/4;
412 if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) {
413 cb = round_up(cb, 4096);
414 cr = 0;
415 /* Packed 20-bit MSB of base addresses */
416 /* YYYYYCCC, CCyyyyyc, cccc.... */
417 y = (y & 0xfffff000) | cb >> 20;
418 cb = (cb & 0x000ff000) << 12;
419 }
420 coda_parabuf_write(ctx, i * 3 + 0, y);
421 coda_parabuf_write(ctx, i * 3 + 1, cb);
422 coda_parabuf_write(ctx, i * 3 + 2, cr);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300423
424 /* mvcol buffer for h.264 */
425 if (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 &&
426 dev->devtype->product != CODA_DX6)
427 coda_parabuf_write(ctx, 96 + i,
428 ctx->internal_frames[i].paddr +
429 ysize + ysize/4 + ysize/4);
430 }
431
432 /* mvcol buffer for mpeg4 */
433 if ((dev->devtype->product != CODA_DX6) &&
434 (ctx->codec->src_fourcc == V4L2_PIX_FMT_MPEG4))
Philipp Zabelb05959c2015-07-09 07:10:13 -0300435 coda_parabuf_write(ctx, 97, ctx->internal_frames[0].paddr +
Philipp Zabel79924ca2014-07-23 12:28:45 -0300436 ysize + ysize/4 + ysize/4);
437
438 return 0;
439}
440
441static void coda_free_context_buffers(struct coda_ctx *ctx)
442{
443 struct coda_dev *dev = ctx->dev;
444
445 coda_free_aux_buf(dev, &ctx->slicebuf);
446 coda_free_aux_buf(dev, &ctx->psbuf);
447 if (dev->devtype->product != CODA_DX6)
448 coda_free_aux_buf(dev, &ctx->workbuf);
Philipp Zabel650b9392015-03-24 14:30:53 -0300449 coda_free_aux_buf(dev, &ctx->parabuf);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300450}
451
452static int coda_alloc_context_buffers(struct coda_ctx *ctx,
453 struct coda_q_data *q_data)
454{
455 struct coda_dev *dev = ctx->dev;
456 size_t size;
457 int ret;
458
Philipp Zabel650b9392015-03-24 14:30:53 -0300459 if (!ctx->parabuf.vaddr) {
460 ret = coda_alloc_context_buf(ctx, &ctx->parabuf,
461 CODA_PARA_BUF_SIZE, "parabuf");
Philipp Zabel6ba53b82015-03-24 14:30:54 -0300462 if (ret < 0)
Philipp Zabel650b9392015-03-24 14:30:53 -0300463 return ret;
Philipp Zabel650b9392015-03-24 14:30:53 -0300464 }
465
Philipp Zabel79924ca2014-07-23 12:28:45 -0300466 if (dev->devtype->product == CODA_DX6)
467 return 0;
468
Philipp Zabelad532d32015-03-24 14:30:52 -0300469 if (!ctx->slicebuf.vaddr && q_data->fourcc == V4L2_PIX_FMT_H264) {
Philipp Zabel79924ca2014-07-23 12:28:45 -0300470 /* worst case slice size */
471 size = (DIV_ROUND_UP(q_data->width, 16) *
472 DIV_ROUND_UP(q_data->height, 16)) * 3200 / 8 + 512;
Philipp Zabelf23797b2014-08-06 08:02:23 -0300473 ret = coda_alloc_context_buf(ctx, &ctx->slicebuf, size,
474 "slicebuf");
Philipp Zabel6ba53b82015-03-24 14:30:54 -0300475 if (ret < 0)
Philipp Zabel650b9392015-03-24 14:30:53 -0300476 goto err;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300477 }
478
Philipp Zabelad532d32015-03-24 14:30:52 -0300479 if (!ctx->psbuf.vaddr && dev->devtype->product == CODA_7541) {
Philipp Zabelf23797b2014-08-06 08:02:23 -0300480 ret = coda_alloc_context_buf(ctx, &ctx->psbuf,
481 CODA7_PS_BUF_SIZE, "psbuf");
Philipp Zabel6ba53b82015-03-24 14:30:54 -0300482 if (ret < 0)
Philipp Zabel79924ca2014-07-23 12:28:45 -0300483 goto err;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300484 }
485
Philipp Zabelad532d32015-03-24 14:30:52 -0300486 if (!ctx->workbuf.vaddr) {
487 size = dev->devtype->workbuf_size;
488 if (dev->devtype->product == CODA_960 &&
489 q_data->fourcc == V4L2_PIX_FMT_H264)
490 size += CODA9_PS_SAVE_SIZE;
491 ret = coda_alloc_context_buf(ctx, &ctx->workbuf, size,
492 "workbuf");
Philipp Zabel6ba53b82015-03-24 14:30:54 -0300493 if (ret < 0)
Philipp Zabelad532d32015-03-24 14:30:52 -0300494 goto err;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300495 }
496
497 return 0;
498
499err:
500 coda_free_context_buffers(ctx);
501 return ret;
502}
503
Junghak Sung2d700712015-09-22 10:30:30 -0300504static int coda_encode_header(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf,
Philipp Zabel79924ca2014-07-23 12:28:45 -0300505 int header_code, u8 *header, int *size)
506{
Junghak Sung2d700712015-09-22 10:30:30 -0300507 struct vb2_buffer *vb = &buf->vb2_buf;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300508 struct coda_dev *dev = ctx->dev;
509 size_t bufsize;
510 int ret;
511 int i;
512
513 if (dev->devtype->product == CODA_960)
Junghak Sung2d700712015-09-22 10:30:30 -0300514 memset(vb2_plane_vaddr(vb, 0), 0, 64);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300515
Junghak Sung2d700712015-09-22 10:30:30 -0300516 coda_write(dev, vb2_dma_contig_plane_dma_addr(vb, 0),
Philipp Zabel79924ca2014-07-23 12:28:45 -0300517 CODA_CMD_ENC_HEADER_BB_START);
Junghak Sung2d700712015-09-22 10:30:30 -0300518 bufsize = vb2_plane_size(vb, 0);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300519 if (dev->devtype->product == CODA_960)
520 bufsize /= 1024;
521 coda_write(dev, bufsize, CODA_CMD_ENC_HEADER_BB_SIZE);
522 coda_write(dev, header_code, CODA_CMD_ENC_HEADER_CODE);
523 ret = coda_command_sync(ctx, CODA_COMMAND_ENCODE_HEADER);
524 if (ret < 0) {
525 v4l2_err(&dev->v4l2_dev, "CODA_COMMAND_ENCODE_HEADER timeout\n");
526 return ret;
527 }
528
529 if (dev->devtype->product == CODA_960) {
530 for (i = 63; i > 0; i--)
Junghak Sung2d700712015-09-22 10:30:30 -0300531 if (((char *)vb2_plane_vaddr(vb, 0))[i] != 0)
Philipp Zabel79924ca2014-07-23 12:28:45 -0300532 break;
533 *size = i + 1;
534 } else {
535 *size = coda_read(dev, CODA_REG_BIT_WR_PTR(ctx->reg_idx)) -
536 coda_read(dev, CODA_CMD_ENC_HEADER_BB_START);
537 }
Junghak Sung2d700712015-09-22 10:30:30 -0300538 memcpy(header, vb2_plane_vaddr(vb, 0), *size);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300539
540 return 0;
541}
542
543static phys_addr_t coda_iram_alloc(struct coda_iram_info *iram, size_t size)
544{
545 phys_addr_t ret;
546
547 size = round_up(size, 1024);
548 if (size > iram->remaining)
549 return 0;
550 iram->remaining -= size;
551
552 ret = iram->next_paddr;
553 iram->next_paddr += size;
554
555 return ret;
556}
557
558static void coda_setup_iram(struct coda_ctx *ctx)
559{
560 struct coda_iram_info *iram_info = &ctx->iram_info;
561 struct coda_dev *dev = ctx->dev;
Philipp Zabelf23797b2014-08-06 08:02:23 -0300562 int w64, w128;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300563 int mb_width;
564 int dbk_bits;
565 int bit_bits;
566 int ip_bits;
567
568 memset(iram_info, 0, sizeof(*iram_info));
569 iram_info->next_paddr = dev->iram.paddr;
570 iram_info->remaining = dev->iram.size;
571
Philipp Zabel8be31c82014-08-05 14:00:13 -0300572 if (!dev->iram.vaddr)
573 return;
574
Philipp Zabel79924ca2014-07-23 12:28:45 -0300575 switch (dev->devtype->product) {
576 case CODA_7541:
577 dbk_bits = CODA7_USE_HOST_DBK_ENABLE | CODA7_USE_DBK_ENABLE;
578 bit_bits = CODA7_USE_HOST_BIT_ENABLE | CODA7_USE_BIT_ENABLE;
579 ip_bits = CODA7_USE_HOST_IP_ENABLE | CODA7_USE_IP_ENABLE;
580 break;
581 case CODA_960:
582 dbk_bits = CODA9_USE_HOST_DBK_ENABLE | CODA9_USE_DBK_ENABLE;
583 bit_bits = CODA9_USE_HOST_BIT_ENABLE | CODA7_USE_BIT_ENABLE;
584 ip_bits = CODA9_USE_HOST_IP_ENABLE | CODA7_USE_IP_ENABLE;
585 break;
586 default: /* CODA_DX6 */
587 return;
588 }
589
590 if (ctx->inst_type == CODA_INST_ENCODER) {
591 struct coda_q_data *q_data_src;
592
593 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
594 mb_width = DIV_ROUND_UP(q_data_src->width, 16);
Philipp Zabelf23797b2014-08-06 08:02:23 -0300595 w128 = mb_width * 128;
596 w64 = mb_width * 64;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300597
598 /* Prioritize in case IRAM is too small for everything */
599 if (dev->devtype->product == CODA_7541) {
600 iram_info->search_ram_size = round_up(mb_width * 16 *
601 36 + 2048, 1024);
602 iram_info->search_ram_paddr = coda_iram_alloc(iram_info,
Philipp Zabelf23797b2014-08-06 08:02:23 -0300603 iram_info->search_ram_size);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300604 if (!iram_info->search_ram_paddr) {
605 pr_err("IRAM is smaller than the search ram size\n");
606 goto out;
607 }
608 iram_info->axi_sram_use |= CODA7_USE_HOST_ME_ENABLE |
609 CODA7_USE_ME_ENABLE;
610 }
611
612 /* Only H.264BP and H.263P3 are considered */
Philipp Zabelf23797b2014-08-06 08:02:23 -0300613 iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w64);
614 iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w64);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300615 if (!iram_info->buf_dbk_c_use)
616 goto out;
617 iram_info->axi_sram_use |= dbk_bits;
618
Philipp Zabelf23797b2014-08-06 08:02:23 -0300619 iram_info->buf_bit_use = coda_iram_alloc(iram_info, w128);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300620 if (!iram_info->buf_bit_use)
621 goto out;
622 iram_info->axi_sram_use |= bit_bits;
623
Philipp Zabelf23797b2014-08-06 08:02:23 -0300624 iram_info->buf_ip_ac_dc_use = coda_iram_alloc(iram_info, w128);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300625 if (!iram_info->buf_ip_ac_dc_use)
626 goto out;
627 iram_info->axi_sram_use |= ip_bits;
628
629 /* OVL and BTP disabled for encoder */
630 } else if (ctx->inst_type == CODA_INST_DECODER) {
631 struct coda_q_data *q_data_dst;
632
633 q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
634 mb_width = DIV_ROUND_UP(q_data_dst->width, 16);
Philipp Zabelf23797b2014-08-06 08:02:23 -0300635 w128 = mb_width * 128;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300636
Philipp Zabelf23797b2014-08-06 08:02:23 -0300637 iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w128);
638 iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w128);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300639 if (!iram_info->buf_dbk_c_use)
640 goto out;
641 iram_info->axi_sram_use |= dbk_bits;
642
Philipp Zabelf23797b2014-08-06 08:02:23 -0300643 iram_info->buf_bit_use = coda_iram_alloc(iram_info, w128);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300644 if (!iram_info->buf_bit_use)
645 goto out;
646 iram_info->axi_sram_use |= bit_bits;
647
Philipp Zabelf23797b2014-08-06 08:02:23 -0300648 iram_info->buf_ip_ac_dc_use = coda_iram_alloc(iram_info, w128);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300649 if (!iram_info->buf_ip_ac_dc_use)
650 goto out;
651 iram_info->axi_sram_use |= ip_bits;
652
653 /* OVL and BTP unused as there is no VC1 support yet */
654 }
655
656out:
657 if (!(iram_info->axi_sram_use & CODA7_USE_HOST_IP_ENABLE))
658 v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
659 "IRAM smaller than needed\n");
660
661 if (dev->devtype->product == CODA_7541) {
662 /* TODO - Enabling these causes picture errors on CODA7541 */
663 if (ctx->inst_type == CODA_INST_DECODER) {
664 /* fw 1.4.50 */
665 iram_info->axi_sram_use &= ~(CODA7_USE_HOST_IP_ENABLE |
666 CODA7_USE_IP_ENABLE);
667 } else {
668 /* fw 13.4.29 */
669 iram_info->axi_sram_use &= ~(CODA7_USE_HOST_IP_ENABLE |
670 CODA7_USE_HOST_DBK_ENABLE |
671 CODA7_USE_IP_ENABLE |
672 CODA7_USE_DBK_ENABLE);
673 }
674 }
675}
676
677static u32 coda_supported_firmwares[] = {
678 CODA_FIRMWARE_VERNUM(CODA_DX6, 2, 2, 5),
679 CODA_FIRMWARE_VERNUM(CODA_7541, 1, 4, 50),
680 CODA_FIRMWARE_VERNUM(CODA_960, 2, 1, 5),
681};
682
683static bool coda_firmware_supported(u32 vernum)
684{
685 int i;
686
687 for (i = 0; i < ARRAY_SIZE(coda_supported_firmwares); i++)
688 if (vernum == coda_supported_firmwares[i])
689 return true;
690 return false;
691}
692
693int coda_check_firmware(struct coda_dev *dev)
694{
695 u16 product, major, minor, release;
696 u32 data;
697 int ret;
698
699 ret = clk_prepare_enable(dev->clk_per);
700 if (ret)
701 goto err_clk_per;
702
703 ret = clk_prepare_enable(dev->clk_ahb);
704 if (ret)
705 goto err_clk_ahb;
706
707 coda_write(dev, 0, CODA_CMD_FIRMWARE_VERNUM);
708 coda_write(dev, CODA_REG_BIT_BUSY_FLAG, CODA_REG_BIT_BUSY);
709 coda_write(dev, 0, CODA_REG_BIT_RUN_INDEX);
710 coda_write(dev, 0, CODA_REG_BIT_RUN_COD_STD);
711 coda_write(dev, CODA_COMMAND_FIRMWARE_GET, CODA_REG_BIT_RUN_COMMAND);
712 if (coda_wait_timeout(dev)) {
713 v4l2_err(&dev->v4l2_dev, "firmware get command error\n");
714 ret = -EIO;
715 goto err_run_cmd;
716 }
717
718 if (dev->devtype->product == CODA_960) {
719 data = coda_read(dev, CODA9_CMD_FIRMWARE_CODE_REV);
720 v4l2_info(&dev->v4l2_dev, "Firmware code revision: %d\n",
721 data);
722 }
723
724 /* Check we are compatible with the loaded firmware */
725 data = coda_read(dev, CODA_CMD_FIRMWARE_VERNUM);
726 product = CODA_FIRMWARE_PRODUCT(data);
727 major = CODA_FIRMWARE_MAJOR(data);
728 minor = CODA_FIRMWARE_MINOR(data);
729 release = CODA_FIRMWARE_RELEASE(data);
730
731 clk_disable_unprepare(dev->clk_per);
732 clk_disable_unprepare(dev->clk_ahb);
733
734 if (product != dev->devtype->product) {
Philipp Zabelf23797b2014-08-06 08:02:23 -0300735 v4l2_err(&dev->v4l2_dev,
736 "Wrong firmware. Hw: %s, Fw: %s, Version: %u.%u.%u\n",
Philipp Zabel79924ca2014-07-23 12:28:45 -0300737 coda_product_name(dev->devtype->product),
738 coda_product_name(product), major, minor, release);
739 return -EINVAL;
740 }
741
742 v4l2_info(&dev->v4l2_dev, "Initialized %s.\n",
743 coda_product_name(product));
744
745 if (coda_firmware_supported(data)) {
746 v4l2_info(&dev->v4l2_dev, "Firmware version: %u.%u.%u\n",
747 major, minor, release);
748 } else {
Philipp Zabelf23797b2014-08-06 08:02:23 -0300749 v4l2_warn(&dev->v4l2_dev,
750 "Unsupported firmware version: %u.%u.%u\n",
751 major, minor, release);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300752 }
753
754 return 0;
755
756err_run_cmd:
757 clk_disable_unprepare(dev->clk_ahb);
758err_clk_ahb:
759 clk_disable_unprepare(dev->clk_per);
760err_clk_per:
761 return ret;
762}
763
Philipp Zabel4e447ff2015-07-16 13:19:37 -0300764static void coda9_set_frame_cache(struct coda_ctx *ctx, u32 fourcc)
765{
766 u32 cache_size, cache_config;
767
Philipp Zabela269e532015-07-16 13:19:38 -0300768 if (ctx->tiled_map_type == GDI_LINEAR_FRAME_MAP) {
769 /* Luma 2x0 page, 2x6 cache, chroma 2x0 page, 2x4 cache size */
770 cache_size = 0x20262024;
771 cache_config = 2 << CODA9_CACHE_PAGEMERGE_OFFSET;
772 } else {
773 /* Luma 0x2 page, 4x4 cache, chroma 0x2 page, 4x3 cache size */
774 cache_size = 0x02440243;
775 cache_config = 1 << CODA9_CACHE_PAGEMERGE_OFFSET;
776 }
Philipp Zabel4e447ff2015-07-16 13:19:37 -0300777 coda_write(ctx->dev, cache_size, CODA9_CMD_SET_FRAME_CACHE_SIZE);
Michael Tretterd40e98c2017-01-20 12:00:25 -0200778 if (fourcc == V4L2_PIX_FMT_NV12 || fourcc == V4L2_PIX_FMT_YUYV) {
Philipp Zabel4e447ff2015-07-16 13:19:37 -0300779 cache_config |= 32 << CODA9_CACHE_LUMA_BUFFER_SIZE_OFFSET |
780 16 << CODA9_CACHE_CR_BUFFER_SIZE_OFFSET |
781 0 << CODA9_CACHE_CB_BUFFER_SIZE_OFFSET;
782 } else {
783 cache_config |= 32 << CODA9_CACHE_LUMA_BUFFER_SIZE_OFFSET |
784 8 << CODA9_CACHE_CR_BUFFER_SIZE_OFFSET |
785 8 << CODA9_CACHE_CB_BUFFER_SIZE_OFFSET;
786 }
787 coda_write(ctx->dev, cache_config, CODA9_CMD_SET_FRAME_CACHE_CONFIG);
788}
789
Philipp Zabel79924ca2014-07-23 12:28:45 -0300790/*
791 * Encoder context operations
792 */
793
Philipp Zabel73751da2015-03-24 14:30:51 -0300794static int coda_encoder_reqbufs(struct coda_ctx *ctx,
795 struct v4l2_requestbuffers *rb)
796{
797 struct coda_q_data *q_data_src;
798 int ret;
799
800 if (rb->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
801 return 0;
802
803 if (rb->count) {
804 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
805 ret = coda_alloc_context_buffers(ctx, q_data_src);
806 if (ret < 0)
807 return ret;
808 } else {
809 coda_free_context_buffers(ctx);
810 }
811
812 return 0;
813}
814
Philipp Zabel79924ca2014-07-23 12:28:45 -0300815static int coda_start_encoding(struct coda_ctx *ctx)
816{
817 struct coda_dev *dev = ctx->dev;
818 struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
819 struct coda_q_data *q_data_src, *q_data_dst;
820 u32 bitstream_buf, bitstream_size;
Junghak Sung2d700712015-09-22 10:30:30 -0300821 struct vb2_v4l2_buffer *buf;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300822 int gamma, ret, value;
823 u32 dst_fourcc;
Philipp Zabele3cccff2015-01-23 13:51:28 -0300824 int num_fb;
Philipp Zabelcb1d3a32014-10-02 14:08:31 -0300825 u32 stride;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300826
827 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
828 q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
829 dst_fourcc = q_data_dst->fourcc;
830
Philipp Zabel79924ca2014-07-23 12:28:45 -0300831 buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
Junghak Sung2d700712015-09-22 10:30:30 -0300832 bitstream_buf = vb2_dma_contig_plane_dma_addr(&buf->vb2_buf, 0);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300833 bitstream_size = q_data_dst->sizeimage;
834
835 if (!coda_is_initialized(dev)) {
836 v4l2_err(v4l2_dev, "coda is not initialized.\n");
837 return -EFAULT;
838 }
839
Philipp Zabelcb1d3a32014-10-02 14:08:31 -0300840 if (dst_fourcc == V4L2_PIX_FMT_JPEG) {
841 if (!ctx->params.jpeg_qmat_tab[0])
842 ctx->params.jpeg_qmat_tab[0] = kmalloc(64, GFP_KERNEL);
843 if (!ctx->params.jpeg_qmat_tab[1])
844 ctx->params.jpeg_qmat_tab[1] = kmalloc(64, GFP_KERNEL);
845 coda_set_jpeg_compression_quality(ctx, ctx->params.jpeg_quality);
846 }
847
Philipp Zabel79924ca2014-07-23 12:28:45 -0300848 mutex_lock(&dev->coda_mutex);
849
850 coda_write(dev, ctx->parabuf.paddr, CODA_REG_BIT_PARA_BUF_ADDR);
851 coda_write(dev, bitstream_buf, CODA_REG_BIT_RD_PTR(ctx->reg_idx));
852 coda_write(dev, bitstream_buf, CODA_REG_BIT_WR_PTR(ctx->reg_idx));
853 switch (dev->devtype->product) {
854 case CODA_DX6:
855 coda_write(dev, CODADX6_STREAM_BUF_DYNALLOC_EN |
856 CODADX6_STREAM_BUF_PIC_RESET, CODA_REG_BIT_STREAM_CTRL);
857 break;
858 case CODA_960:
859 coda_write(dev, 0, CODA9_GDI_WPROT_RGN_EN);
860 /* fallthrough */
861 case CODA_7541:
862 coda_write(dev, CODA7_STREAM_BUF_DYNALLOC_EN |
863 CODA7_STREAM_BUF_PIC_RESET, CODA_REG_BIT_STREAM_CTRL);
864 break;
865 }
866
Philipp Zabela269e532015-07-16 13:19:38 -0300867 ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) |
868 CODA9_FRAME_TILED2LINEAR);
Philipp Zabel1cb12cf2014-09-29 09:53:47 -0300869 if (q_data_src->fourcc == V4L2_PIX_FMT_NV12)
870 ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE;
Philipp Zabela269e532015-07-16 13:19:38 -0300871 if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP)
872 ctx->frame_mem_ctrl |= (0x3 << 9) | CODA9_FRAME_TILED2LINEAR;
Philipp Zabel2bf299c2014-09-29 09:53:46 -0300873 coda_write(dev, ctx->frame_mem_ctrl, CODA_REG_BIT_FRAME_MEM_CTRL);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300874
875 if (dev->devtype->product == CODA_DX6) {
876 /* Configure the coda */
Philipp Zabelf23797b2014-08-06 08:02:23 -0300877 coda_write(dev, dev->iram.paddr,
878 CODADX6_REG_BIT_SEARCH_RAM_BASE_ADDR);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300879 }
880
881 /* Could set rotation here if needed */
Philipp Zabel2bf299c2014-09-29 09:53:46 -0300882 value = 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300883 switch (dev->devtype->product) {
884 case CODA_DX6:
Philipp Zabelf23797b2014-08-06 08:02:23 -0300885 value = (q_data_src->width & CODADX6_PICWIDTH_MASK)
886 << CODADX6_PICWIDTH_OFFSET;
887 value |= (q_data_src->height & CODADX6_PICHEIGHT_MASK)
888 << CODA_PICHEIGHT_OFFSET;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300889 break;
890 case CODA_7541:
891 if (dst_fourcc == V4L2_PIX_FMT_H264) {
892 value = (round_up(q_data_src->width, 16) &
893 CODA7_PICWIDTH_MASK) << CODA7_PICWIDTH_OFFSET;
894 value |= (round_up(q_data_src->height, 16) &
Philipp Zabelf23797b2014-08-06 08:02:23 -0300895 CODA7_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300896 break;
897 }
898 /* fallthrough */
899 case CODA_960:
Philipp Zabelf23797b2014-08-06 08:02:23 -0300900 value = (q_data_src->width & CODA7_PICWIDTH_MASK)
901 << CODA7_PICWIDTH_OFFSET;
902 value |= (q_data_src->height & CODA7_PICHEIGHT_MASK)
903 << CODA_PICHEIGHT_OFFSET;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300904 }
905 coda_write(dev, value, CODA_CMD_ENC_SEQ_SRC_SIZE);
Philipp Zabelcb1d3a32014-10-02 14:08:31 -0300906 if (dst_fourcc == V4L2_PIX_FMT_JPEG)
907 ctx->params.framerate = 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300908 coda_write(dev, ctx->params.framerate,
909 CODA_CMD_ENC_SEQ_SRC_F_RATE);
910
911 ctx->params.codec_mode = ctx->codec->mode;
912 switch (dst_fourcc) {
913 case V4L2_PIX_FMT_MPEG4:
914 if (dev->devtype->product == CODA_960)
Philipp Zabelf23797b2014-08-06 08:02:23 -0300915 coda_write(dev, CODA9_STD_MPEG4,
916 CODA_CMD_ENC_SEQ_COD_STD);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300917 else
Philipp Zabelf23797b2014-08-06 08:02:23 -0300918 coda_write(dev, CODA_STD_MPEG4,
919 CODA_CMD_ENC_SEQ_COD_STD);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300920 coda_write(dev, 0, CODA_CMD_ENC_SEQ_MP4_PARA);
921 break;
922 case V4L2_PIX_FMT_H264:
923 if (dev->devtype->product == CODA_960)
Philipp Zabelf23797b2014-08-06 08:02:23 -0300924 coda_write(dev, CODA9_STD_H264,
925 CODA_CMD_ENC_SEQ_COD_STD);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300926 else
Philipp Zabelf23797b2014-08-06 08:02:23 -0300927 coda_write(dev, CODA_STD_H264,
928 CODA_CMD_ENC_SEQ_COD_STD);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300929 if (ctx->params.h264_deblk_enabled) {
930 value = ((ctx->params.h264_deblk_alpha &
931 CODA_264PARAM_DEBLKFILTEROFFSETALPHA_MASK) <<
932 CODA_264PARAM_DEBLKFILTEROFFSETALPHA_OFFSET) |
933 ((ctx->params.h264_deblk_beta &
934 CODA_264PARAM_DEBLKFILTEROFFSETBETA_MASK) <<
935 CODA_264PARAM_DEBLKFILTEROFFSETBETA_OFFSET);
936 } else {
937 value = 1 << CODA_264PARAM_DISABLEDEBLK_OFFSET;
938 }
939 coda_write(dev, value, CODA_CMD_ENC_SEQ_264_PARA);
940 break;
Philipp Zabelcb1d3a32014-10-02 14:08:31 -0300941 case V4L2_PIX_FMT_JPEG:
942 coda_write(dev, 0, CODA_CMD_ENC_SEQ_JPG_PARA);
943 coda_write(dev, ctx->params.jpeg_restart_interval,
944 CODA_CMD_ENC_SEQ_JPG_RST_INTERVAL);
945 coda_write(dev, 0, CODA_CMD_ENC_SEQ_JPG_THUMB_EN);
946 coda_write(dev, 0, CODA_CMD_ENC_SEQ_JPG_THUMB_SIZE);
947 coda_write(dev, 0, CODA_CMD_ENC_SEQ_JPG_THUMB_OFFSET);
948
949 coda_jpeg_write_tables(ctx);
950 break;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300951 default:
952 v4l2_err(v4l2_dev,
953 "dst format (0x%08x) invalid.\n", dst_fourcc);
954 ret = -EINVAL;
955 goto out;
956 }
957
Philipp Zabelcb1d3a32014-10-02 14:08:31 -0300958 /*
959 * slice mode and GOP size registers are used for thumb size/offset
960 * in JPEG mode
961 */
962 if (dst_fourcc != V4L2_PIX_FMT_JPEG) {
963 switch (ctx->params.slice_mode) {
964 case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE:
965 value = 0;
966 break;
967 case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB:
968 value = (ctx->params.slice_max_mb &
969 CODA_SLICING_SIZE_MASK)
970 << CODA_SLICING_SIZE_OFFSET;
971 value |= (1 & CODA_SLICING_UNIT_MASK)
972 << CODA_SLICING_UNIT_OFFSET;
973 value |= 1 & CODA_SLICING_MODE_MASK;
974 break;
975 case V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES:
976 value = (ctx->params.slice_max_bits &
977 CODA_SLICING_SIZE_MASK)
978 << CODA_SLICING_SIZE_OFFSET;
979 value |= (0 & CODA_SLICING_UNIT_MASK)
980 << CODA_SLICING_UNIT_OFFSET;
981 value |= 1 & CODA_SLICING_MODE_MASK;
982 break;
983 }
984 coda_write(dev, value, CODA_CMD_ENC_SEQ_SLICE_MODE);
985 value = ctx->params.gop_size & CODA_GOP_SIZE_MASK;
986 coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE);
Philipp Zabel79924ca2014-07-23 12:28:45 -0300987 }
Philipp Zabel79924ca2014-07-23 12:28:45 -0300988
989 if (ctx->params.bitrate) {
990 /* Rate control enabled */
Philipp Zabelf23797b2014-08-06 08:02:23 -0300991 value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK)
992 << CODA_RATECONTROL_BITRATE_OFFSET;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300993 value |= 1 & CODA_RATECONTROL_ENABLE_MASK;
Philipp Zabelda2b3b32015-07-10 10:37:52 -0300994 value |= (ctx->params.vbv_delay &
995 CODA_RATECONTROL_INITIALDELAY_MASK)
996 << CODA_RATECONTROL_INITIALDELAY_OFFSET;
Philipp Zabel79924ca2014-07-23 12:28:45 -0300997 if (dev->devtype->product == CODA_960)
998 value |= BIT(31); /* disable autoskip */
999 } else {
1000 value = 0;
1001 }
1002 coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA);
1003
Philipp Zabelda2b3b32015-07-10 10:37:52 -03001004 coda_write(dev, ctx->params.vbv_size, CODA_CMD_ENC_SEQ_RC_BUF_SIZE);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001005 coda_write(dev, ctx->params.intra_refresh,
1006 CODA_CMD_ENC_SEQ_INTRA_REFRESH);
1007
1008 coda_write(dev, bitstream_buf, CODA_CMD_ENC_SEQ_BB_START);
1009 coda_write(dev, bitstream_size / 1024, CODA_CMD_ENC_SEQ_BB_SIZE);
1010
1011
1012 value = 0;
1013 if (dev->devtype->product == CODA_960)
1014 gamma = CODA9_DEFAULT_GAMMA;
1015 else
1016 gamma = CODA_DEFAULT_GAMMA;
1017 if (gamma > 0) {
1018 coda_write(dev, (gamma & CODA_GAMMA_MASK) << CODA_GAMMA_OFFSET,
1019 CODA_CMD_ENC_SEQ_RC_GAMMA);
1020 }
1021
1022 if (ctx->params.h264_min_qp || ctx->params.h264_max_qp) {
1023 coda_write(dev,
1024 ctx->params.h264_min_qp << CODA_QPMIN_OFFSET |
1025 ctx->params.h264_max_qp << CODA_QPMAX_OFFSET,
1026 CODA_CMD_ENC_SEQ_RC_QP_MIN_MAX);
1027 }
1028 if (dev->devtype->product == CODA_960) {
1029 if (ctx->params.h264_max_qp)
1030 value |= 1 << CODA9_OPTION_RCQPMAX_OFFSET;
1031 if (CODA_DEFAULT_GAMMA > 0)
1032 value |= 1 << CODA9_OPTION_GAMMA_OFFSET;
1033 } else {
1034 if (CODA_DEFAULT_GAMMA > 0) {
1035 if (dev->devtype->product == CODA_DX6)
1036 value |= 1 << CODADX6_OPTION_GAMMA_OFFSET;
1037 else
1038 value |= 1 << CODA7_OPTION_GAMMA_OFFSET;
1039 }
1040 if (ctx->params.h264_min_qp)
1041 value |= 1 << CODA7_OPTION_RCQPMIN_OFFSET;
1042 if (ctx->params.h264_max_qp)
1043 value |= 1 << CODA7_OPTION_RCQPMAX_OFFSET;
1044 }
1045 coda_write(dev, value, CODA_CMD_ENC_SEQ_OPTION);
1046
1047 coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE);
1048
1049 coda_setup_iram(ctx);
1050
1051 if (dst_fourcc == V4L2_PIX_FMT_H264) {
1052 switch (dev->devtype->product) {
1053 case CODA_DX6:
1054 value = FMO_SLICE_SAVE_BUF_SIZE << 7;
1055 coda_write(dev, value, CODADX6_CMD_ENC_SEQ_FMO);
1056 break;
1057 case CODA_7541:
1058 coda_write(dev, ctx->iram_info.search_ram_paddr,
1059 CODA7_CMD_ENC_SEQ_SEARCH_BASE);
1060 coda_write(dev, ctx->iram_info.search_ram_size,
1061 CODA7_CMD_ENC_SEQ_SEARCH_SIZE);
1062 break;
1063 case CODA_960:
1064 coda_write(dev, 0, CODA9_CMD_ENC_SEQ_ME_OPTION);
1065 coda_write(dev, 0, CODA9_CMD_ENC_SEQ_INTRA_WEIGHT);
1066 }
1067 }
1068
1069 ret = coda_command_sync(ctx, CODA_COMMAND_SEQ_INIT);
1070 if (ret < 0) {
1071 v4l2_err(v4l2_dev, "CODA_COMMAND_SEQ_INIT timeout\n");
1072 goto out;
1073 }
1074
1075 if (coda_read(dev, CODA_RET_ENC_SEQ_SUCCESS) == 0) {
1076 v4l2_err(v4l2_dev, "CODA_COMMAND_SEQ_INIT failed\n");
1077 ret = -EFAULT;
1078 goto out;
1079 }
Philipp Zabel5c718bb2015-07-09 07:10:16 -03001080 ctx->initialized = 1;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001081
Philipp Zabelcb1d3a32014-10-02 14:08:31 -03001082 if (dst_fourcc != V4L2_PIX_FMT_JPEG) {
1083 if (dev->devtype->product == CODA_960)
1084 ctx->num_internal_frames = 4;
1085 else
1086 ctx->num_internal_frames = 2;
1087 ret = coda_alloc_framebuffers(ctx, q_data_src, dst_fourcc);
1088 if (ret < 0) {
1089 v4l2_err(v4l2_dev, "failed to allocate framebuffers\n");
1090 goto out;
1091 }
Philipp Zabele3cccff2015-01-23 13:51:28 -03001092 num_fb = 2;
Philipp Zabelcb1d3a32014-10-02 14:08:31 -03001093 stride = q_data_src->bytesperline;
1094 } else {
1095 ctx->num_internal_frames = 0;
Philipp Zabele3cccff2015-01-23 13:51:28 -03001096 num_fb = 0;
Philipp Zabelcb1d3a32014-10-02 14:08:31 -03001097 stride = 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001098 }
Philipp Zabele3cccff2015-01-23 13:51:28 -03001099 coda_write(dev, num_fb, CODA_CMD_SET_FRAME_BUF_NUM);
Philipp Zabelcb1d3a32014-10-02 14:08:31 -03001100 coda_write(dev, stride, CODA_CMD_SET_FRAME_BUF_STRIDE);
1101
Philipp Zabel79924ca2014-07-23 12:28:45 -03001102 if (dev->devtype->product == CODA_7541) {
1103 coda_write(dev, q_data_src->bytesperline,
1104 CODA7_CMD_SET_FRAME_SOURCE_BUF_STRIDE);
1105 }
1106 if (dev->devtype->product != CODA_DX6) {
1107 coda_write(dev, ctx->iram_info.buf_bit_use,
1108 CODA7_CMD_SET_FRAME_AXI_BIT_ADDR);
1109 coda_write(dev, ctx->iram_info.buf_ip_ac_dc_use,
1110 CODA7_CMD_SET_FRAME_AXI_IPACDC_ADDR);
1111 coda_write(dev, ctx->iram_info.buf_dbk_y_use,
1112 CODA7_CMD_SET_FRAME_AXI_DBKY_ADDR);
1113 coda_write(dev, ctx->iram_info.buf_dbk_c_use,
1114 CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR);
1115 coda_write(dev, ctx->iram_info.buf_ovl_use,
1116 CODA7_CMD_SET_FRAME_AXI_OVL_ADDR);
1117 if (dev->devtype->product == CODA_960) {
1118 coda_write(dev, ctx->iram_info.buf_btp_use,
1119 CODA9_CMD_SET_FRAME_AXI_BTP_ADDR);
1120
Philipp Zabel4e447ff2015-07-16 13:19:37 -03001121 coda9_set_frame_cache(ctx, q_data_src->fourcc);
1122
Philipp Zabel79924ca2014-07-23 12:28:45 -03001123 /* FIXME */
Philipp Zabelf23797b2014-08-06 08:02:23 -03001124 coda_write(dev, ctx->internal_frames[2].paddr,
1125 CODA9_CMD_SET_FRAME_SUBSAMP_A);
1126 coda_write(dev, ctx->internal_frames[3].paddr,
1127 CODA9_CMD_SET_FRAME_SUBSAMP_B);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001128 }
1129 }
1130
1131 ret = coda_command_sync(ctx, CODA_COMMAND_SET_FRAME_BUF);
1132 if (ret < 0) {
1133 v4l2_err(v4l2_dev, "CODA_COMMAND_SET_FRAME_BUF timeout\n");
1134 goto out;
1135 }
1136
1137 /* Save stream headers */
1138 buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1139 switch (dst_fourcc) {
1140 case V4L2_PIX_FMT_H264:
1141 /*
1142 * Get SPS in the first frame and copy it to an
1143 * intermediate buffer.
1144 */
1145 ret = coda_encode_header(ctx, buf, CODA_HEADER_H264_SPS,
1146 &ctx->vpu_header[0][0],
1147 &ctx->vpu_header_size[0]);
1148 if (ret < 0)
1149 goto out;
1150
1151 /*
1152 * Get PPS in the first frame and copy it to an
1153 * intermediate buffer.
1154 */
1155 ret = coda_encode_header(ctx, buf, CODA_HEADER_H264_PPS,
1156 &ctx->vpu_header[1][0],
1157 &ctx->vpu_header_size[1]);
1158 if (ret < 0)
1159 goto out;
1160
1161 /*
1162 * Length of H.264 headers is variable and thus it might not be
1163 * aligned for the coda to append the encoded frame. In that is
1164 * the case a filler NAL must be added to header 2.
1165 */
1166 ctx->vpu_header_size[2] = coda_h264_padding(
1167 (ctx->vpu_header_size[0] +
1168 ctx->vpu_header_size[1]),
1169 ctx->vpu_header[2]);
1170 break;
1171 case V4L2_PIX_FMT_MPEG4:
1172 /*
1173 * Get VOS in the first frame and copy it to an
1174 * intermediate buffer
1175 */
1176 ret = coda_encode_header(ctx, buf, CODA_HEADER_MP4V_VOS,
1177 &ctx->vpu_header[0][0],
1178 &ctx->vpu_header_size[0]);
1179 if (ret < 0)
1180 goto out;
1181
1182 ret = coda_encode_header(ctx, buf, CODA_HEADER_MP4V_VIS,
1183 &ctx->vpu_header[1][0],
1184 &ctx->vpu_header_size[1]);
1185 if (ret < 0)
1186 goto out;
1187
1188 ret = coda_encode_header(ctx, buf, CODA_HEADER_MP4V_VOL,
1189 &ctx->vpu_header[2][0],
1190 &ctx->vpu_header_size[2]);
1191 if (ret < 0)
1192 goto out;
1193 break;
1194 default:
1195 /* No more formats need to save headers at the moment */
1196 break;
1197 }
1198
1199out:
1200 mutex_unlock(&dev->coda_mutex);
1201 return ret;
1202}
1203
1204static int coda_prepare_encode(struct coda_ctx *ctx)
1205{
1206 struct coda_q_data *q_data_src, *q_data_dst;
Junghak Sung2d700712015-09-22 10:30:30 -03001207 struct vb2_v4l2_buffer *src_buf, *dst_buf;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001208 struct coda_dev *dev = ctx->dev;
1209 int force_ipicture;
1210 int quant_param = 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001211 u32 pic_stream_buffer_addr, pic_stream_buffer_size;
Philipp Zabel59ebc2e2014-09-29 09:53:45 -03001212 u32 rot_mode = 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001213 u32 dst_fourcc;
Philipp Zabel856d7d92014-09-29 09:53:44 -03001214 u32 reg;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001215
1216 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1217 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1218 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1219 q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1220 dst_fourcc = q_data_dst->fourcc;
1221
Junghak Sung2d700712015-09-22 10:30:30 -03001222 src_buf->sequence = ctx->osequence;
1223 dst_buf->sequence = ctx->osequence;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001224 ctx->osequence++;
1225
1226 /*
1227 * Workaround coda firmware BUG that only marks the first
1228 * frame as IDR. This is a problem for some decoders that can't
1229 * recover when a frame is lost.
1230 */
Junghak Sung2d700712015-09-22 10:30:30 -03001231 if (src_buf->sequence % ctx->params.gop_size) {
1232 src_buf->flags |= V4L2_BUF_FLAG_PFRAME;
1233 src_buf->flags &= ~V4L2_BUF_FLAG_KEYFRAME;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001234 } else {
Junghak Sung2d700712015-09-22 10:30:30 -03001235 src_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
1236 src_buf->flags &= ~V4L2_BUF_FLAG_PFRAME;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001237 }
1238
1239 if (dev->devtype->product == CODA_960)
1240 coda_set_gdi_regs(ctx);
1241
1242 /*
1243 * Copy headers at the beginning of the first frame for H.264 only.
1244 * In MPEG4 they are already copied by the coda.
1245 */
Junghak Sung2d700712015-09-22 10:30:30 -03001246 if (src_buf->sequence == 0) {
Philipp Zabel79924ca2014-07-23 12:28:45 -03001247 pic_stream_buffer_addr =
Junghak Sung2d700712015-09-22 10:30:30 -03001248 vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0) +
Philipp Zabel79924ca2014-07-23 12:28:45 -03001249 ctx->vpu_header_size[0] +
1250 ctx->vpu_header_size[1] +
1251 ctx->vpu_header_size[2];
Philipp Zabeld4c6a412014-10-02 14:08:35 -03001252 pic_stream_buffer_size = q_data_dst->sizeimage -
Philipp Zabel79924ca2014-07-23 12:28:45 -03001253 ctx->vpu_header_size[0] -
1254 ctx->vpu_header_size[1] -
1255 ctx->vpu_header_size[2];
Junghak Sung2d700712015-09-22 10:30:30 -03001256 memcpy(vb2_plane_vaddr(&dst_buf->vb2_buf, 0),
Philipp Zabel79924ca2014-07-23 12:28:45 -03001257 &ctx->vpu_header[0][0], ctx->vpu_header_size[0]);
Junghak Sung2d700712015-09-22 10:30:30 -03001258 memcpy(vb2_plane_vaddr(&dst_buf->vb2_buf, 0)
1259 + ctx->vpu_header_size[0], &ctx->vpu_header[1][0],
1260 ctx->vpu_header_size[1]);
1261 memcpy(vb2_plane_vaddr(&dst_buf->vb2_buf, 0)
1262 + ctx->vpu_header_size[0] + ctx->vpu_header_size[1],
1263 &ctx->vpu_header[2][0], ctx->vpu_header_size[2]);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001264 } else {
1265 pic_stream_buffer_addr =
Junghak Sung2d700712015-09-22 10:30:30 -03001266 vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
Philipp Zabeld4c6a412014-10-02 14:08:35 -03001267 pic_stream_buffer_size = q_data_dst->sizeimage;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001268 }
1269
Junghak Sung2d700712015-09-22 10:30:30 -03001270 if (src_buf->flags & V4L2_BUF_FLAG_KEYFRAME) {
Philipp Zabel79924ca2014-07-23 12:28:45 -03001271 force_ipicture = 1;
1272 switch (dst_fourcc) {
1273 case V4L2_PIX_FMT_H264:
1274 quant_param = ctx->params.h264_intra_qp;
1275 break;
1276 case V4L2_PIX_FMT_MPEG4:
1277 quant_param = ctx->params.mpeg4_intra_qp;
1278 break;
Philipp Zabelcb1d3a32014-10-02 14:08:31 -03001279 case V4L2_PIX_FMT_JPEG:
1280 quant_param = 30;
1281 break;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001282 default:
1283 v4l2_warn(&ctx->dev->v4l2_dev,
1284 "cannot set intra qp, fmt not supported\n");
1285 break;
1286 }
1287 } else {
1288 force_ipicture = 0;
1289 switch (dst_fourcc) {
1290 case V4L2_PIX_FMT_H264:
1291 quant_param = ctx->params.h264_inter_qp;
1292 break;
1293 case V4L2_PIX_FMT_MPEG4:
1294 quant_param = ctx->params.mpeg4_inter_qp;
1295 break;
1296 default:
1297 v4l2_warn(&ctx->dev->v4l2_dev,
1298 "cannot set inter qp, fmt not supported\n");
1299 break;
1300 }
1301 }
1302
1303 /* submit */
Philipp Zabel59ebc2e2014-09-29 09:53:45 -03001304 if (ctx->params.rot_mode)
1305 rot_mode = CODA_ROT_MIR_ENABLE | ctx->params.rot_mode;
1306 coda_write(dev, rot_mode, CODA_CMD_ENC_PIC_ROT_MODE);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001307 coda_write(dev, quant_param, CODA_CMD_ENC_PIC_QS);
1308
Philipp Zabel79924ca2014-07-23 12:28:45 -03001309 if (dev->devtype->product == CODA_960) {
1310 coda_write(dev, 4/*FIXME: 0*/, CODA9_CMD_ENC_PIC_SRC_INDEX);
1311 coda_write(dev, q_data_src->width, CODA9_CMD_ENC_PIC_SRC_STRIDE);
1312 coda_write(dev, 0, CODA9_CMD_ENC_PIC_SUB_FRAME_SYNC);
1313
Philipp Zabel856d7d92014-09-29 09:53:44 -03001314 reg = CODA9_CMD_ENC_PIC_SRC_ADDR_Y;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001315 } else {
Philipp Zabel856d7d92014-09-29 09:53:44 -03001316 reg = CODA_CMD_ENC_PIC_SRC_ADDR_Y;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001317 }
Philipp Zabel856d7d92014-09-29 09:53:44 -03001318 coda_write_base(ctx, q_data_src, src_buf, reg);
1319
Philipp Zabel79924ca2014-07-23 12:28:45 -03001320 coda_write(dev, force_ipicture << 1 & 0x2,
1321 CODA_CMD_ENC_PIC_OPTION);
1322
1323 coda_write(dev, pic_stream_buffer_addr, CODA_CMD_ENC_PIC_BB_START);
1324 coda_write(dev, pic_stream_buffer_size / 1024,
1325 CODA_CMD_ENC_PIC_BB_SIZE);
1326
1327 if (!ctx->streamon_out) {
Philipp Zabelf23797b2014-08-06 08:02:23 -03001328 /* After streamoff on the output side, set stream end flag */
Philipp Zabel79924ca2014-07-23 12:28:45 -03001329 ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
Philipp Zabelf23797b2014-08-06 08:02:23 -03001330 coda_write(dev, ctx->bit_stream_param,
1331 CODA_REG_BIT_BIT_STREAM_PARAM);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001332 }
1333
1334 if (dev->devtype->product != CODA_DX6)
1335 coda_write(dev, ctx->iram_info.axi_sram_use,
1336 CODA7_REG_BIT_AXI_SRAM_USE);
1337
Philipp Zabel9a1a8f92015-01-29 14:36:00 -03001338 trace_coda_enc_pic_run(ctx, src_buf);
1339
Philipp Zabel79924ca2014-07-23 12:28:45 -03001340 coda_command_async(ctx, CODA_COMMAND_PIC_RUN);
1341
1342 return 0;
1343}
1344
1345static void coda_finish_encode(struct coda_ctx *ctx)
1346{
Junghak Sung2d700712015-09-22 10:30:30 -03001347 struct vb2_v4l2_buffer *src_buf, *dst_buf;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001348 struct coda_dev *dev = ctx->dev;
1349 u32 wr_ptr, start_ptr;
1350
1351 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1352 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1353
Philipp Zabel9a1a8f92015-01-29 14:36:00 -03001354 trace_coda_enc_pic_done(ctx, dst_buf);
1355
Philipp Zabel79924ca2014-07-23 12:28:45 -03001356 /* Get results from the coda */
1357 start_ptr = coda_read(dev, CODA_CMD_ENC_PIC_BB_START);
1358 wr_ptr = coda_read(dev, CODA_REG_BIT_WR_PTR(ctx->reg_idx));
1359
1360 /* Calculate bytesused field */
Junghak Sung2d700712015-09-22 10:30:30 -03001361 if (dst_buf->sequence == 0) {
Philipp Zabel74dc3852016-01-04 17:30:09 -02001362 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, wr_ptr - start_ptr +
Philipp Zabel79924ca2014-07-23 12:28:45 -03001363 ctx->vpu_header_size[0] +
1364 ctx->vpu_header_size[1] +
1365 ctx->vpu_header_size[2]);
1366 } else {
Junghak Sung2d700712015-09-22 10:30:30 -03001367 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, wr_ptr - start_ptr);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001368 }
1369
1370 v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, "frame size = %u\n",
1371 wr_ptr - start_ptr);
1372
1373 coda_read(dev, CODA_RET_ENC_PIC_SLICE_NUM);
1374 coda_read(dev, CODA_RET_ENC_PIC_FLAG);
1375
1376 if (coda_read(dev, CODA_RET_ENC_PIC_TYPE) == 0) {
Junghak Sung2d700712015-09-22 10:30:30 -03001377 dst_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
1378 dst_buf->flags &= ~V4L2_BUF_FLAG_PFRAME;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001379 } else {
Junghak Sung2d700712015-09-22 10:30:30 -03001380 dst_buf->flags |= V4L2_BUF_FLAG_PFRAME;
1381 dst_buf->flags &= ~V4L2_BUF_FLAG_KEYFRAME;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001382 }
1383
Junghak Sungd6dd6452015-11-03 08:16:37 -02001384 dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
Junghak Sung2d700712015-09-22 10:30:30 -03001385 dst_buf->flags &= ~V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
1386 dst_buf->flags |=
1387 src_buf->flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
1388 dst_buf->timecode = src_buf->timecode;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001389
1390 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1391
1392 dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
Philipp Zabel9f2bfb32015-05-04 07:51:07 -03001393 coda_m2m_buf_done(ctx, dst_buf, VB2_BUF_STATE_DONE);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001394
1395 ctx->gopcounter--;
1396 if (ctx->gopcounter < 0)
1397 ctx->gopcounter = ctx->params.gop_size - 1;
1398
1399 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
1400 "job finished: encoding frame (%d) (%s)\n",
Junghak Sung2d700712015-09-22 10:30:30 -03001401 dst_buf->sequence,
1402 (dst_buf->flags & V4L2_BUF_FLAG_KEYFRAME) ?
Philipp Zabel79924ca2014-07-23 12:28:45 -03001403 "KEYFRAME" : "PFRAME");
1404}
1405
1406static void coda_seq_end_work(struct work_struct *work)
1407{
1408 struct coda_ctx *ctx = container_of(work, struct coda_ctx, seq_end_work);
1409 struct coda_dev *dev = ctx->dev;
1410
1411 mutex_lock(&ctx->buffer_mutex);
1412 mutex_lock(&dev->coda_mutex);
1413
Philipp Zabel5c718bb2015-07-09 07:10:16 -03001414 if (ctx->initialized == 0)
1415 goto out;
1416
Philipp Zabel79924ca2014-07-23 12:28:45 -03001417 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
Philipp Zabelf23797b2014-08-06 08:02:23 -03001418 "%d: %s: sent command 'SEQ_END' to coda\n", ctx->idx,
1419 __func__);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001420 if (coda_command_sync(ctx, CODA_COMMAND_SEQ_END)) {
1421 v4l2_err(&dev->v4l2_dev,
1422 "CODA_COMMAND_SEQ_END failed\n");
1423 }
1424
Philipp Zabel68aa7ee2015-07-10 10:37:44 -03001425 /*
1426 * FIXME: Sometimes h.264 encoding fails with 8-byte sequences missing
1427 * from the output stream after the h.264 decoder has run. Resetting the
1428 * hardware after the decoder has finished seems to help.
1429 */
1430 if (dev->devtype->product == CODA_960)
1431 coda_hw_reset(ctx);
1432
Philipp Zabel79924ca2014-07-23 12:28:45 -03001433 kfifo_init(&ctx->bitstream_fifo,
1434 ctx->bitstream.vaddr, ctx->bitstream.size);
1435
1436 coda_free_framebuffers(ctx);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001437
Philipp Zabel5c718bb2015-07-09 07:10:16 -03001438 ctx->initialized = 0;
1439
1440out:
Philipp Zabel79924ca2014-07-23 12:28:45 -03001441 mutex_unlock(&dev->coda_mutex);
1442 mutex_unlock(&ctx->buffer_mutex);
1443}
1444
1445static void coda_bit_release(struct coda_ctx *ctx)
1446{
Philipp Zabel540d70d2015-01-23 13:51:32 -03001447 mutex_lock(&ctx->buffer_mutex);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001448 coda_free_framebuffers(ctx);
1449 coda_free_context_buffers(ctx);
Philipp Zabelad532d32015-03-24 14:30:52 -03001450 coda_free_bitstream_buffer(ctx);
Philipp Zabel540d70d2015-01-23 13:51:32 -03001451 mutex_unlock(&ctx->buffer_mutex);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001452}
1453
1454const struct coda_context_ops coda_bit_encode_ops = {
1455 .queue_init = coda_encoder_queue_init,
Philipp Zabel73751da2015-03-24 14:30:51 -03001456 .reqbufs = coda_encoder_reqbufs,
Philipp Zabel79924ca2014-07-23 12:28:45 -03001457 .start_streaming = coda_start_encoding,
1458 .prepare_run = coda_prepare_encode,
1459 .finish_run = coda_finish_encode,
1460 .seq_end_work = coda_seq_end_work,
1461 .release = coda_bit_release,
1462};
1463
1464/*
1465 * Decoder context operations
1466 */
1467
Philipp Zabelad532d32015-03-24 14:30:52 -03001468static int coda_alloc_bitstream_buffer(struct coda_ctx *ctx,
1469 struct coda_q_data *q_data)
1470{
1471 if (ctx->bitstream.vaddr)
1472 return 0;
1473
1474 ctx->bitstream.size = roundup_pow_of_two(q_data->sizeimage * 2);
Luis R. Rodriguezf6e45662016-01-22 18:34:22 -08001475 ctx->bitstream.vaddr = dma_alloc_wc(&ctx->dev->plat_dev->dev,
1476 ctx->bitstream.size,
1477 &ctx->bitstream.paddr, GFP_KERNEL);
Philipp Zabelad532d32015-03-24 14:30:52 -03001478 if (!ctx->bitstream.vaddr) {
1479 v4l2_err(&ctx->dev->v4l2_dev,
1480 "failed to allocate bitstream ringbuffer");
1481 return -ENOMEM;
1482 }
1483 kfifo_init(&ctx->bitstream_fifo,
1484 ctx->bitstream.vaddr, ctx->bitstream.size);
1485
1486 return 0;
1487}
1488
1489static void coda_free_bitstream_buffer(struct coda_ctx *ctx)
1490{
1491 if (ctx->bitstream.vaddr == NULL)
1492 return;
1493
Luis R. Rodriguezf6e45662016-01-22 18:34:22 -08001494 dma_free_wc(&ctx->dev->plat_dev->dev, ctx->bitstream.size,
1495 ctx->bitstream.vaddr, ctx->bitstream.paddr);
Philipp Zabelad532d32015-03-24 14:30:52 -03001496 ctx->bitstream.vaddr = NULL;
1497 kfifo_init(&ctx->bitstream_fifo, NULL, 0);
1498}
1499
Philipp Zabel73751da2015-03-24 14:30:51 -03001500static int coda_decoder_reqbufs(struct coda_ctx *ctx,
1501 struct v4l2_requestbuffers *rb)
1502{
1503 struct coda_q_data *q_data_src;
1504 int ret;
1505
1506 if (rb->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1507 return 0;
1508
1509 if (rb->count) {
1510 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1511 ret = coda_alloc_context_buffers(ctx, q_data_src);
1512 if (ret < 0)
1513 return ret;
Philipp Zabelad532d32015-03-24 14:30:52 -03001514 ret = coda_alloc_bitstream_buffer(ctx, q_data_src);
1515 if (ret < 0) {
1516 coda_free_context_buffers(ctx);
1517 return ret;
1518 }
Philipp Zabel73751da2015-03-24 14:30:51 -03001519 } else {
Philipp Zabelad532d32015-03-24 14:30:52 -03001520 coda_free_bitstream_buffer(ctx);
Philipp Zabel73751da2015-03-24 14:30:51 -03001521 coda_free_context_buffers(ctx);
1522 }
1523
1524 return 0;
1525}
1526
Philipp Zabel79924ca2014-07-23 12:28:45 -03001527static int __coda_start_decoding(struct coda_ctx *ctx)
1528{
1529 struct coda_q_data *q_data_src, *q_data_dst;
1530 u32 bitstream_buf, bitstream_size;
1531 struct coda_dev *dev = ctx->dev;
1532 int width, height;
Philipp Zabel1cb12cf2014-09-29 09:53:47 -03001533 u32 src_fourcc, dst_fourcc;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001534 u32 val;
1535 int ret;
1536
Michael Trettere7f3c542017-01-20 12:00:24 -02001537 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
1538 "Video Data Order Adapter: %s\n",
1539 ctx->use_vdoa ? "Enabled" : "Disabled");
1540
Philipp Zabel79924ca2014-07-23 12:28:45 -03001541 /* Start decoding */
1542 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1543 q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1544 bitstream_buf = ctx->bitstream.paddr;
1545 bitstream_size = ctx->bitstream.size;
1546 src_fourcc = q_data_src->fourcc;
Philipp Zabel1cb12cf2014-09-29 09:53:47 -03001547 dst_fourcc = q_data_dst->fourcc;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001548
Philipp Zabel79924ca2014-07-23 12:28:45 -03001549 coda_write(dev, ctx->parabuf.paddr, CODA_REG_BIT_PARA_BUF_ADDR);
1550
1551 /* Update coda bitstream read and write pointers from kfifo */
1552 coda_kfifo_sync_to_device_full(ctx);
1553
Philipp Zabela269e532015-07-16 13:19:38 -03001554 ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) |
1555 CODA9_FRAME_TILED2LINEAR);
Michael Tretterd40e98c2017-01-20 12:00:25 -02001556 if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_YUYV)
Philipp Zabel1cb12cf2014-09-29 09:53:47 -03001557 ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE;
Philipp Zabela269e532015-07-16 13:19:38 -03001558 if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP)
Michael Trettere7f3c542017-01-20 12:00:24 -02001559 ctx->frame_mem_ctrl |= (0x3 << 9) |
1560 ((ctx->use_vdoa) ? 0 : CODA9_FRAME_TILED2LINEAR);
Philipp Zabel2bf299c2014-09-29 09:53:46 -03001561 coda_write(dev, ctx->frame_mem_ctrl, CODA_REG_BIT_FRAME_MEM_CTRL);
1562
Philipp Zabel79924ca2014-07-23 12:28:45 -03001563 ctx->display_idx = -1;
1564 ctx->frm_dis_flg = 0;
1565 coda_write(dev, 0, CODA_REG_BIT_FRM_DIS_FLG(ctx->reg_idx));
1566
1567 coda_write(dev, CODA_BIT_DEC_SEQ_INIT_ESCAPE,
1568 CODA_REG_BIT_BIT_STREAM_PARAM);
1569
1570 coda_write(dev, bitstream_buf, CODA_CMD_DEC_SEQ_BB_START);
1571 coda_write(dev, bitstream_size / 1024, CODA_CMD_DEC_SEQ_BB_SIZE);
1572 val = 0;
1573 if ((dev->devtype->product == CODA_7541) ||
1574 (dev->devtype->product == CODA_960))
1575 val |= CODA_REORDER_ENABLE;
Philipp Zabelcb1d3a32014-10-02 14:08:31 -03001576 if (ctx->codec->src_fourcc == V4L2_PIX_FMT_JPEG)
1577 val |= CODA_NO_INT_ENABLE;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001578 coda_write(dev, val, CODA_CMD_DEC_SEQ_OPTION);
1579
1580 ctx->params.codec_mode = ctx->codec->mode;
1581 if (dev->devtype->product == CODA_960 &&
1582 src_fourcc == V4L2_PIX_FMT_MPEG4)
1583 ctx->params.codec_mode_aux = CODA_MP4_AUX_MPEG4;
1584 else
1585 ctx->params.codec_mode_aux = 0;
1586 if (src_fourcc == V4L2_PIX_FMT_H264) {
1587 if (dev->devtype->product == CODA_7541) {
1588 coda_write(dev, ctx->psbuf.paddr,
1589 CODA_CMD_DEC_SEQ_PS_BB_START);
1590 coda_write(dev, (CODA7_PS_BUF_SIZE / 1024),
1591 CODA_CMD_DEC_SEQ_PS_BB_SIZE);
1592 }
1593 if (dev->devtype->product == CODA_960) {
1594 coda_write(dev, 0, CODA_CMD_DEC_SEQ_X264_MV_EN);
1595 coda_write(dev, 512, CODA_CMD_DEC_SEQ_SPP_CHUNK_SIZE);
1596 }
1597 }
1598 if (dev->devtype->product != CODA_960)
1599 coda_write(dev, 0, CODA_CMD_DEC_SEQ_SRC_SIZE);
1600
1601 if (coda_command_sync(ctx, CODA_COMMAND_SEQ_INIT)) {
1602 v4l2_err(&dev->v4l2_dev, "CODA_COMMAND_SEQ_INIT timeout\n");
1603 coda_write(dev, 0, CODA_REG_BIT_BIT_STREAM_PARAM);
1604 return -ETIMEDOUT;
1605 }
Philipp Zabel5c718bb2015-07-09 07:10:16 -03001606 ctx->initialized = 1;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001607
1608 /* Update kfifo out pointer from coda bitstream read pointer */
1609 coda_kfifo_sync_from_device(ctx);
1610
1611 coda_write(dev, 0, CODA_REG_BIT_BIT_STREAM_PARAM);
1612
1613 if (coda_read(dev, CODA_RET_DEC_SEQ_SUCCESS) == 0) {
1614 v4l2_err(&dev->v4l2_dev,
1615 "CODA_COMMAND_SEQ_INIT failed, error code = %d\n",
1616 coda_read(dev, CODA_RET_DEC_SEQ_ERR_REASON));
1617 return -EAGAIN;
1618 }
1619
1620 val = coda_read(dev, CODA_RET_DEC_SEQ_SRC_SIZE);
1621 if (dev->devtype->product == CODA_DX6) {
1622 width = (val >> CODADX6_PICWIDTH_OFFSET) & CODADX6_PICWIDTH_MASK;
1623 height = val & CODADX6_PICHEIGHT_MASK;
1624 } else {
1625 width = (val >> CODA7_PICWIDTH_OFFSET) & CODA7_PICWIDTH_MASK;
1626 height = val & CODA7_PICHEIGHT_MASK;
1627 }
1628
Markus Pargmann31db5ad2015-01-23 13:51:25 -03001629 if (width > q_data_dst->bytesperline || height > q_data_dst->height) {
Philipp Zabel79924ca2014-07-23 12:28:45 -03001630 v4l2_err(&dev->v4l2_dev, "stream is %dx%d, not %dx%d\n",
Markus Pargmann31db5ad2015-01-23 13:51:25 -03001631 width, height, q_data_dst->bytesperline,
1632 q_data_dst->height);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001633 return -EINVAL;
1634 }
1635
1636 width = round_up(width, 16);
1637 height = round_up(height, 16);
1638
1639 v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "%s instance %d now: %dx%d\n",
1640 __func__, ctx->idx, width, height);
1641
1642 ctx->num_internal_frames = coda_read(dev, CODA_RET_DEC_SEQ_FRAME_NEED);
Michael Trettere7f3c542017-01-20 12:00:24 -02001643 /*
1644 * If the VDOA is used, the decoder needs one additional frame,
1645 * because the frames are freed when the next frame is decoded.
1646 * Otherwise there are visible errors in the decoded frames (green
1647 * regions in displayed frames) and a broken order of frames (earlier
1648 * frames are sporadically displayed after later frames).
1649 */
1650 if (ctx->use_vdoa)
1651 ctx->num_internal_frames += 1;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001652 if (ctx->num_internal_frames > CODA_MAX_FRAMEBUFFERS) {
1653 v4l2_err(&dev->v4l2_dev,
1654 "not enough framebuffers to decode (%d < %d)\n",
1655 CODA_MAX_FRAMEBUFFERS, ctx->num_internal_frames);
1656 return -EINVAL;
1657 }
1658
1659 if (src_fourcc == V4L2_PIX_FMT_H264) {
1660 u32 left_right;
1661 u32 top_bottom;
1662
1663 left_right = coda_read(dev, CODA_RET_DEC_SEQ_CROP_LEFT_RIGHT);
1664 top_bottom = coda_read(dev, CODA_RET_DEC_SEQ_CROP_TOP_BOTTOM);
1665
1666 q_data_dst->rect.left = (left_right >> 10) & 0x3ff;
1667 q_data_dst->rect.top = (top_bottom >> 10) & 0x3ff;
1668 q_data_dst->rect.width = width - q_data_dst->rect.left -
1669 (left_right & 0x3ff);
1670 q_data_dst->rect.height = height - q_data_dst->rect.top -
1671 (top_bottom & 0x3ff);
1672 }
1673
1674 ret = coda_alloc_framebuffers(ctx, q_data_dst, src_fourcc);
Philipp Zabel68fc31c2014-08-05 14:00:16 -03001675 if (ret < 0) {
1676 v4l2_err(&dev->v4l2_dev, "failed to allocate framebuffers\n");
Philipp Zabel79924ca2014-07-23 12:28:45 -03001677 return ret;
Philipp Zabel68fc31c2014-08-05 14:00:16 -03001678 }
Philipp Zabel79924ca2014-07-23 12:28:45 -03001679
1680 /* Tell the decoder how many frame buffers we allocated. */
1681 coda_write(dev, ctx->num_internal_frames, CODA_CMD_SET_FRAME_BUF_NUM);
1682 coda_write(dev, width, CODA_CMD_SET_FRAME_BUF_STRIDE);
1683
1684 if (dev->devtype->product != CODA_DX6) {
1685 /* Set secondary AXI IRAM */
1686 coda_setup_iram(ctx);
1687
1688 coda_write(dev, ctx->iram_info.buf_bit_use,
1689 CODA7_CMD_SET_FRAME_AXI_BIT_ADDR);
1690 coda_write(dev, ctx->iram_info.buf_ip_ac_dc_use,
1691 CODA7_CMD_SET_FRAME_AXI_IPACDC_ADDR);
1692 coda_write(dev, ctx->iram_info.buf_dbk_y_use,
1693 CODA7_CMD_SET_FRAME_AXI_DBKY_ADDR);
1694 coda_write(dev, ctx->iram_info.buf_dbk_c_use,
1695 CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR);
1696 coda_write(dev, ctx->iram_info.buf_ovl_use,
1697 CODA7_CMD_SET_FRAME_AXI_OVL_ADDR);
Philipp Zabel4e447ff2015-07-16 13:19:37 -03001698 if (dev->devtype->product == CODA_960) {
Philipp Zabel79924ca2014-07-23 12:28:45 -03001699 coda_write(dev, ctx->iram_info.buf_btp_use,
1700 CODA9_CMD_SET_FRAME_AXI_BTP_ADDR);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001701
Philipp Zabel4e447ff2015-07-16 13:19:37 -03001702 coda_write(dev, -1, CODA9_CMD_SET_FRAME_DELAY);
1703 coda9_set_frame_cache(ctx, dst_fourcc);
Philipp Zabel1cb12cf2014-09-29 09:53:47 -03001704 }
Philipp Zabel79924ca2014-07-23 12:28:45 -03001705 }
1706
1707 if (src_fourcc == V4L2_PIX_FMT_H264) {
1708 coda_write(dev, ctx->slicebuf.paddr,
1709 CODA_CMD_SET_FRAME_SLICE_BB_START);
1710 coda_write(dev, ctx->slicebuf.size / 1024,
1711 CODA_CMD_SET_FRAME_SLICE_BB_SIZE);
1712 }
1713
1714 if (dev->devtype->product == CODA_7541) {
1715 int max_mb_x = 1920 / 16;
1716 int max_mb_y = 1088 / 16;
1717 int max_mb_num = max_mb_x * max_mb_y;
1718
1719 coda_write(dev, max_mb_num << 16 | max_mb_x << 8 | max_mb_y,
1720 CODA7_CMD_SET_FRAME_MAX_DEC_SIZE);
1721 } else if (dev->devtype->product == CODA_960) {
1722 int max_mb_x = 1920 / 16;
1723 int max_mb_y = 1088 / 16;
1724 int max_mb_num = max_mb_x * max_mb_y;
1725
1726 coda_write(dev, max_mb_num << 16 | max_mb_x << 8 | max_mb_y,
1727 CODA9_CMD_SET_FRAME_MAX_DEC_SIZE);
1728 }
1729
1730 if (coda_command_sync(ctx, CODA_COMMAND_SET_FRAME_BUF)) {
1731 v4l2_err(&ctx->dev->v4l2_dev,
1732 "CODA_COMMAND_SET_FRAME_BUF timeout\n");
1733 return -ETIMEDOUT;
1734 }
1735
1736 return 0;
1737}
1738
1739static int coda_start_decoding(struct coda_ctx *ctx)
1740{
1741 struct coda_dev *dev = ctx->dev;
1742 int ret;
1743
1744 mutex_lock(&dev->coda_mutex);
1745 ret = __coda_start_decoding(ctx);
1746 mutex_unlock(&dev->coda_mutex);
1747
1748 return ret;
1749}
1750
1751static int coda_prepare_decode(struct coda_ctx *ctx)
1752{
Junghak Sung2d700712015-09-22 10:30:30 -03001753 struct vb2_v4l2_buffer *dst_buf;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001754 struct coda_dev *dev = ctx->dev;
1755 struct coda_q_data *q_data_dst;
Philipp Zabel07ba2772015-01-23 13:51:18 -03001756 struct coda_buffer_meta *meta;
Philipp Zabel47f3fa62015-07-09 07:10:21 -03001757 unsigned long flags;
Michael Trettere7f3c542017-01-20 12:00:24 -02001758 u32 rot_mode = 0;
Philipp Zabel856d7d92014-09-29 09:53:44 -03001759 u32 reg_addr, reg_stride;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001760
1761 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1762 q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1763
Philipp Zabel79924ca2014-07-23 12:28:45 -03001764 /* Try to copy source buffer contents into the bitstream ringbuffer */
1765 mutex_lock(&ctx->bitstream_mutex);
Philipp Zabel331e7862017-03-03 09:12:48 -03001766 coda_fill_bitstream(ctx, NULL);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001767 mutex_unlock(&ctx->bitstream_mutex);
1768
1769 if (coda_get_bitstream_payload(ctx) < 512 &&
1770 (!(ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG))) {
1771 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
1772 "bitstream payload: %d, skipping\n",
1773 coda_get_bitstream_payload(ctx));
1774 v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx);
1775 return -EAGAIN;
1776 }
1777
1778 /* Run coda_start_decoding (again) if not yet initialized */
1779 if (!ctx->initialized) {
1780 int ret = __coda_start_decoding(ctx);
1781
1782 if (ret < 0) {
1783 v4l2_err(&dev->v4l2_dev, "failed to start decoding\n");
1784 v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx);
1785 return -EAGAIN;
1786 } else {
1787 ctx->initialized = 1;
1788 }
1789 }
1790
1791 if (dev->devtype->product == CODA_960)
1792 coda_set_gdi_regs(ctx);
1793
Michael Trettere7f3c542017-01-20 12:00:24 -02001794 if (ctx->use_vdoa &&
1795 ctx->display_idx >= 0 &&
1796 ctx->display_idx < ctx->num_internal_frames) {
1797 vdoa_device_run(ctx->vdoa,
1798 vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0),
1799 ctx->internal_frames[ctx->display_idx].paddr);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001800 } else {
Michael Trettere7f3c542017-01-20 12:00:24 -02001801 if (dev->devtype->product == CODA_960) {
1802 /*
1803 * The CODA960 seems to have an internal list of
1804 * buffers with 64 entries that includes the
1805 * registered frame buffers as well as the rotator
1806 * buffer output.
1807 *
1808 * ROT_INDEX needs to be < 0x40, but >
1809 * ctx->num_internal_frames.
1810 */
1811 coda_write(dev,
1812 CODA_MAX_FRAMEBUFFERS + dst_buf->vb2_buf.index,
1813 CODA9_CMD_DEC_PIC_ROT_INDEX);
Philipp Zabel856d7d92014-09-29 09:53:44 -03001814
Michael Trettere7f3c542017-01-20 12:00:24 -02001815 reg_addr = CODA9_CMD_DEC_PIC_ROT_ADDR_Y;
1816 reg_stride = CODA9_CMD_DEC_PIC_ROT_STRIDE;
1817 } else {
1818 reg_addr = CODA_CMD_DEC_PIC_ROT_ADDR_Y;
1819 reg_stride = CODA_CMD_DEC_PIC_ROT_STRIDE;
1820 }
1821 coda_write_base(ctx, q_data_dst, dst_buf, reg_addr);
1822 coda_write(dev, q_data_dst->bytesperline, reg_stride);
1823
1824 rot_mode = CODA_ROT_MIR_ENABLE | ctx->params.rot_mode;
1825 }
1826
1827 coda_write(dev, rot_mode, CODA_CMD_DEC_PIC_ROT_MODE);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001828
1829 switch (dev->devtype->product) {
1830 case CODA_DX6:
1831 /* TBD */
1832 case CODA_7541:
1833 coda_write(dev, CODA_PRE_SCAN_EN, CODA_CMD_DEC_PIC_OPTION);
1834 break;
1835 case CODA_960:
Philipp Zabelf23797b2014-08-06 08:02:23 -03001836 /* 'hardcode to use interrupt disable mode'? */
1837 coda_write(dev, (1 << 10), CODA_CMD_DEC_PIC_OPTION);
Philipp Zabel79924ca2014-07-23 12:28:45 -03001838 break;
1839 }
1840
1841 coda_write(dev, 0, CODA_CMD_DEC_PIC_SKIP_NUM);
1842
1843 coda_write(dev, 0, CODA_CMD_DEC_PIC_BB_START);
1844 coda_write(dev, 0, CODA_CMD_DEC_PIC_START_BYTE);
1845
1846 if (dev->devtype->product != CODA_DX6)
1847 coda_write(dev, ctx->iram_info.axi_sram_use,
1848 CODA7_REG_BIT_AXI_SRAM_USE);
1849
Philipp Zabel47f3fa62015-07-09 07:10:21 -03001850 spin_lock_irqsave(&ctx->buffer_meta_lock, flags);
Philipp Zabel07ba2772015-01-23 13:51:18 -03001851 meta = list_first_entry_or_null(&ctx->buffer_meta_list,
1852 struct coda_buffer_meta, list);
1853
1854 if (meta && ctx->codec->src_fourcc == V4L2_PIX_FMT_JPEG) {
Philipp Zabel5269aed2014-10-02 14:08:33 -03001855
1856 /* If this is the last buffer in the bitstream, add padding */
Philipp Zabel5269aed2014-10-02 14:08:33 -03001857 if (meta->end == (ctx->bitstream_fifo.kfifo.in &
1858 ctx->bitstream_fifo.kfifo.mask)) {
1859 static unsigned char buf[512];
1860 unsigned int pad;
1861
1862 /* Pad to multiple of 256 and then add 256 more */
1863 pad = ((0 - meta->end) & 0xff) + 256;
1864
1865 memset(buf, 0xff, sizeof(buf));
1866
1867 kfifo_in(&ctx->bitstream_fifo, buf, pad);
1868 }
1869 }
Philipp Zabel47f3fa62015-07-09 07:10:21 -03001870 spin_unlock_irqrestore(&ctx->buffer_meta_lock, flags);
Philipp Zabel5269aed2014-10-02 14:08:33 -03001871
Philipp Zabel79924ca2014-07-23 12:28:45 -03001872 coda_kfifo_sync_to_device_full(ctx);
1873
Philipp Zabel8c9ef6b2015-01-23 13:51:24 -03001874 /* Clear decode success flag */
1875 coda_write(dev, 0, CODA_RET_DEC_PIC_SUCCESS);
1876
Philipp Zabel9a1a8f92015-01-29 14:36:00 -03001877 trace_coda_dec_pic_run(ctx, meta);
1878
Philipp Zabel79924ca2014-07-23 12:28:45 -03001879 coda_command_async(ctx, CODA_COMMAND_PIC_RUN);
1880
1881 return 0;
1882}
1883
1884static void coda_finish_decode(struct coda_ctx *ctx)
1885{
1886 struct coda_dev *dev = ctx->dev;
1887 struct coda_q_data *q_data_src;
1888 struct coda_q_data *q_data_dst;
Junghak Sung2d700712015-09-22 10:30:30 -03001889 struct vb2_v4l2_buffer *dst_buf;
Philipp Zabel7cbb1052014-10-02 14:08:32 -03001890 struct coda_buffer_meta *meta;
Philipp Zabel4de69312014-10-02 14:08:26 -03001891 unsigned long payload;
Philipp Zabel47f3fa62015-07-09 07:10:21 -03001892 unsigned long flags;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001893 int width, height;
1894 int decoded_idx;
1895 int display_idx;
1896 u32 src_fourcc;
1897 int success;
1898 u32 err_mb;
Michael Trettere7f3c542017-01-20 12:00:24 -02001899 int err_vdoa = 0;
Philipp Zabel79924ca2014-07-23 12:28:45 -03001900 u32 val;
1901
Philipp Zabel79924ca2014-07-23 12:28:45 -03001902 /* Update kfifo out pointer from coda bitstream read pointer */
1903 coda_kfifo_sync_from_device(ctx);
1904
1905 /*
1906 * in stream-end mode, the read pointer can overshoot the write pointer
1907 * by up to 512 bytes
1908 */
1909 if (ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG) {
Philipp Zabelad532d32015-03-24 14:30:52 -03001910 if (coda_get_bitstream_payload(ctx) >= ctx->bitstream.size - 512)
Philipp Zabel79924ca2014-07-23 12:28:45 -03001911 kfifo_init(&ctx->bitstream_fifo,
1912 ctx->bitstream.vaddr, ctx->bitstream.size);
1913 }
1914
1915 q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1916 src_fourcc = q_data_src->fourcc;
1917
1918 val = coda_read(dev, CODA_RET_DEC_PIC_SUCCESS);
1919 if (val != 1)
1920 pr_err("DEC_PIC_SUCCESS = %d\n", val);
1921
1922 success = val & 0x1;
1923 if (!success)
1924 v4l2_err(&dev->v4l2_dev, "decode failed\n");
1925
1926 if (src_fourcc == V4L2_PIX_FMT_H264) {
1927 if (val & (1 << 3))
1928 v4l2_err(&dev->v4l2_dev,
1929 "insufficient PS buffer space (%d bytes)\n",
1930 ctx->psbuf.size);
1931 if (val & (1 << 2))
1932 v4l2_err(&dev->v4l2_dev,
1933 "insufficient slice buffer space (%d bytes)\n",
1934 ctx->slicebuf.size);
1935 }
1936
1937 val = coda_read(dev, CODA_RET_DEC_PIC_SIZE);
1938 width = (val >> 16) & 0xffff;
1939 height = val & 0xffff;
1940
1941 q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1942
1943 /* frame crop information */
1944 if (src_fourcc == V4L2_PIX_FMT_H264) {
1945 u32 left_right;
1946 u32 top_bottom;
1947
1948 left_right = coda_read(dev, CODA_RET_DEC_PIC_CROP_LEFT_RIGHT);
1949 top_bottom = coda_read(dev, CODA_RET_DEC_PIC_CROP_TOP_BOTTOM);
1950
1951 if (left_right == 0xffffffff && top_bottom == 0xffffffff) {
1952 /* Keep current crop information */
1953 } else {
1954 struct v4l2_rect *rect = &q_data_dst->rect;
1955
1956 rect->left = left_right >> 16 & 0xffff;
1957 rect->top = top_bottom >> 16 & 0xffff;
1958 rect->width = width - rect->left -
1959 (left_right & 0xffff);
1960 rect->height = height - rect->top -
1961 (top_bottom & 0xffff);
1962 }
1963 } else {
1964 /* no cropping */
1965 }
1966
1967 err_mb = coda_read(dev, CODA_RET_DEC_PIC_ERR_MB);
1968 if (err_mb > 0)
1969 v4l2_err(&dev->v4l2_dev,
1970 "errors in %d macroblocks\n", err_mb);
1971
1972 if (dev->devtype->product == CODA_7541) {
1973 val = coda_read(dev, CODA_RET_DEC_PIC_OPTION);
1974 if (val == 0) {
1975 /* not enough bitstream data */
1976 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
1977 "prescan failed: %d\n", val);
1978 ctx->hold = true;
1979 return;
1980 }
1981 }
1982
Michael Trettere7f3c542017-01-20 12:00:24 -02001983 /* Wait until the VDOA finished writing the previous display frame */
1984 if (ctx->use_vdoa &&
1985 ctx->display_idx >= 0 &&
1986 ctx->display_idx < ctx->num_internal_frames) {
1987 err_vdoa = vdoa_wait_for_completion(ctx->vdoa);
1988 }
1989
Philipp Zabelf23797b2014-08-06 08:02:23 -03001990 ctx->frm_dis_flg = coda_read(dev,
1991 CODA_REG_BIT_FRM_DIS_FLG(ctx->reg_idx));
Philipp Zabel79924ca2014-07-23 12:28:45 -03001992
Michael Trettere7f3c542017-01-20 12:00:24 -02001993 /* The previous display frame was copied out and can be overwritten */
Philipp Zabel79924ca2014-07-23 12:28:45 -03001994 if (ctx->display_idx >= 0 &&
1995 ctx->display_idx < ctx->num_internal_frames) {
1996 ctx->frm_dis_flg &= ~(1 << ctx->display_idx);
1997 coda_write(dev, ctx->frm_dis_flg,
1998 CODA_REG_BIT_FRM_DIS_FLG(ctx->reg_idx));
1999 }
2000
2001 /*
2002 * The index of the last decoded frame, not necessarily in
2003 * display order, and the index of the next display frame.
2004 * The latter could have been decoded in a previous run.
2005 */
2006 decoded_idx = coda_read(dev, CODA_RET_DEC_PIC_CUR_IDX);
2007 display_idx = coda_read(dev, CODA_RET_DEC_PIC_FRAME_IDX);
2008
2009 if (decoded_idx == -1) {
2010 /* no frame was decoded, but we might have a display frame */
2011 if (display_idx >= 0 && display_idx < ctx->num_internal_frames)
2012 ctx->sequence_offset++;
2013 else if (ctx->display_idx < 0)
2014 ctx->hold = true;
2015 } else if (decoded_idx == -2) {
Philipp Zabelf23797b2014-08-06 08:02:23 -03002016 /* no frame was decoded, we still return remaining buffers */
Philipp Zabel79924ca2014-07-23 12:28:45 -03002017 } else if (decoded_idx < 0 || decoded_idx >= ctx->num_internal_frames) {
2018 v4l2_err(&dev->v4l2_dev,
2019 "decoded frame index out of range: %d\n", decoded_idx);
2020 } else {
Philipp Zabel79924ca2014-07-23 12:28:45 -03002021 val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM) - 1;
2022 val -= ctx->sequence_offset;
Philipp Zabel47f3fa62015-07-09 07:10:21 -03002023 spin_lock_irqsave(&ctx->buffer_meta_lock, flags);
Philipp Zabel7cbb1052014-10-02 14:08:32 -03002024 if (!list_empty(&ctx->buffer_meta_list)) {
2025 meta = list_first_entry(&ctx->buffer_meta_list,
2026 struct coda_buffer_meta, list);
2027 list_del(&meta->list);
Philipp Zabel47f3fa62015-07-09 07:10:21 -03002028 ctx->num_metas--;
2029 spin_unlock_irqrestore(&ctx->buffer_meta_lock, flags);
Lucas Stachf964c402015-07-09 07:10:12 -03002030 /*
2031 * Clamp counters to 16 bits for comparison, as the HW
2032 * counter rolls over at this point for h.264. This
2033 * may be different for other formats, but using 16 bits
2034 * should be enough to detect most errors and saves us
2035 * from doing different things based on the format.
2036 */
2037 if ((val & 0xffff) != (meta->sequence & 0xffff)) {
Philipp Zabel18fd0cc2014-08-05 14:00:17 -03002038 v4l2_err(&dev->v4l2_dev,
2039 "sequence number mismatch (%d(%d) != %d)\n",
2040 val, ctx->sequence_offset,
Philipp Zabel7cbb1052014-10-02 14:08:32 -03002041 meta->sequence);
Philipp Zabel18fd0cc2014-08-05 14:00:17 -03002042 }
Philipp Zabel7cbb1052014-10-02 14:08:32 -03002043 ctx->frame_metas[decoded_idx] = *meta;
2044 kfree(meta);
Philipp Zabel18fd0cc2014-08-05 14:00:17 -03002045 } else {
Philipp Zabel47f3fa62015-07-09 07:10:21 -03002046 spin_unlock_irqrestore(&ctx->buffer_meta_lock, flags);
Philipp Zabel18fd0cc2014-08-05 14:00:17 -03002047 v4l2_err(&dev->v4l2_dev, "empty timestamp list!\n");
Philipp Zabel7cbb1052014-10-02 14:08:32 -03002048 memset(&ctx->frame_metas[decoded_idx], 0,
2049 sizeof(struct coda_buffer_meta));
2050 ctx->frame_metas[decoded_idx].sequence = val;
Lucas Stach83f31c82015-01-23 13:51:19 -03002051 ctx->sequence_offset++;
Philipp Zabel79924ca2014-07-23 12:28:45 -03002052 }
Philipp Zabel79924ca2014-07-23 12:28:45 -03002053
Philipp Zabel9a1a8f92015-01-29 14:36:00 -03002054 trace_coda_dec_pic_done(ctx, &ctx->frame_metas[decoded_idx]);
2055
Philipp Zabel79924ca2014-07-23 12:28:45 -03002056 val = coda_read(dev, CODA_RET_DEC_PIC_TYPE) & 0x7;
2057 if (val == 0)
2058 ctx->frame_types[decoded_idx] = V4L2_BUF_FLAG_KEYFRAME;
2059 else if (val == 1)
2060 ctx->frame_types[decoded_idx] = V4L2_BUF_FLAG_PFRAME;
2061 else
2062 ctx->frame_types[decoded_idx] = V4L2_BUF_FLAG_BFRAME;
2063
2064 ctx->frame_errors[decoded_idx] = err_mb;
2065 }
2066
2067 if (display_idx == -1) {
2068 /*
2069 * no more frames to be decoded, but there could still
2070 * be rotator output to dequeue
2071 */
2072 ctx->hold = true;
2073 } else if (display_idx == -3) {
2074 /* possibly prescan failure */
2075 } else if (display_idx < 0 || display_idx >= ctx->num_internal_frames) {
2076 v4l2_err(&dev->v4l2_dev,
2077 "presentation frame index out of range: %d\n",
2078 display_idx);
2079 }
2080
2081 /* If a frame was copied out, return it */
2082 if (ctx->display_idx >= 0 &&
2083 ctx->display_idx < ctx->num_internal_frames) {
2084 dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
Junghak Sung2d700712015-09-22 10:30:30 -03002085 dst_buf->sequence = ctx->osequence++;
Philipp Zabel79924ca2014-07-23 12:28:45 -03002086
Junghak Sung2d700712015-09-22 10:30:30 -03002087 dst_buf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME |
Philipp Zabel79924ca2014-07-23 12:28:45 -03002088 V4L2_BUF_FLAG_PFRAME |
2089 V4L2_BUF_FLAG_BFRAME);
Junghak Sung2d700712015-09-22 10:30:30 -03002090 dst_buf->flags |= ctx->frame_types[ctx->display_idx];
Philipp Zabel7cbb1052014-10-02 14:08:32 -03002091 meta = &ctx->frame_metas[ctx->display_idx];
Junghak Sung2d700712015-09-22 10:30:30 -03002092 dst_buf->timecode = meta->timecode;
Junghak Sungd6dd6452015-11-03 08:16:37 -02002093 dst_buf->vb2_buf.timestamp = meta->timestamp;
Philipp Zabel79924ca2014-07-23 12:28:45 -03002094
Philipp Zabelf0710812015-07-09 07:10:19 -03002095 trace_coda_dec_rot_done(ctx, dst_buf, meta);
Philipp Zabel9a1a8f92015-01-29 14:36:00 -03002096
Philipp Zabel4de69312014-10-02 14:08:26 -03002097 switch (q_data_dst->fourcc) {
Michael Tretterd40e98c2017-01-20 12:00:25 -02002098 case V4L2_PIX_FMT_YUYV:
2099 payload = width * height * 2;
2100 break;
Philipp Zabel4de69312014-10-02 14:08:26 -03002101 case V4L2_PIX_FMT_YUV420:
2102 case V4L2_PIX_FMT_YVU420:
2103 case V4L2_PIX_FMT_NV12:
2104 default:
2105 payload = width * height * 3 / 2;
2106 break;
2107 case V4L2_PIX_FMT_YUV422P:
2108 payload = width * height * 2;
2109 break;
2110 }
Junghak Sung2d700712015-09-22 10:30:30 -03002111 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload);
Philipp Zabel79924ca2014-07-23 12:28:45 -03002112
Michael Trettere7f3c542017-01-20 12:00:24 -02002113 if (ctx->frame_errors[ctx->display_idx] || err_vdoa)
2114 coda_m2m_buf_done(ctx, dst_buf, VB2_BUF_STATE_ERROR);
2115 else
2116 coda_m2m_buf_done(ctx, dst_buf, VB2_BUF_STATE_DONE);
Philipp Zabel79924ca2014-07-23 12:28:45 -03002117
2118 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
2119 "job finished: decoding frame (%d) (%s)\n",
Junghak Sung2d700712015-09-22 10:30:30 -03002120 dst_buf->sequence,
2121 (dst_buf->flags & V4L2_BUF_FLAG_KEYFRAME) ?
Philipp Zabel79924ca2014-07-23 12:28:45 -03002122 "KEYFRAME" : "PFRAME");
2123 } else {
2124 v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
2125 "job finished: no frame decoded\n");
2126 }
2127
2128 /* The rotator will copy the current display frame next time */
2129 ctx->display_idx = display_idx;
2130}
2131
2132const struct coda_context_ops coda_bit_decode_ops = {
2133 .queue_init = coda_decoder_queue_init,
Philipp Zabel73751da2015-03-24 14:30:51 -03002134 .reqbufs = coda_decoder_reqbufs,
Philipp Zabel79924ca2014-07-23 12:28:45 -03002135 .start_streaming = coda_start_decoding,
2136 .prepare_run = coda_prepare_decode,
2137 .finish_run = coda_finish_decode,
2138 .seq_end_work = coda_seq_end_work,
2139 .release = coda_bit_release,
2140};
2141
2142irqreturn_t coda_irq_handler(int irq, void *data)
2143{
2144 struct coda_dev *dev = data;
2145 struct coda_ctx *ctx;
2146
2147 /* read status register to attend the IRQ */
2148 coda_read(dev, CODA_REG_BIT_INT_STATUS);
2149 coda_write(dev, CODA_REG_BIT_INT_CLEAR_SET,
2150 CODA_REG_BIT_INT_CLEAR);
2151
2152 ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev);
2153 if (ctx == NULL) {
Philipp Zabelf23797b2014-08-06 08:02:23 -03002154 v4l2_err(&dev->v4l2_dev,
2155 "Instance released before the end of transaction\n");
Philipp Zabel79924ca2014-07-23 12:28:45 -03002156 mutex_unlock(&dev->coda_mutex);
2157 return IRQ_HANDLED;
2158 }
2159
Philipp Zabel9a1a8f92015-01-29 14:36:00 -03002160 trace_coda_bit_done(ctx);
2161
Philipp Zabel79924ca2014-07-23 12:28:45 -03002162 if (ctx->aborting) {
2163 v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
2164 "task has been aborted\n");
2165 }
2166
2167 if (coda_isbusy(ctx->dev)) {
2168 v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
2169 "coda is still busy!!!!\n");
2170 return IRQ_NONE;
2171 }
2172
2173 complete(&ctx->completion);
2174
2175 return IRQ_HANDLED;
2176}