GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / media / platform / chips-media / coda-jpeg.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Coda multi-standard codec IP - JPEG support functions
4  *
5  * Copyright (C) 2014 Philipp Zabel, Pengutronix
6  */
7
8 #include <asm/unaligned.h>
9 #include <linux/irqreturn.h>
10 #include <linux/kernel.h>
11 #include <linux/ktime.h>
12 #include <linux/slab.h>
13 #include <linux/swab.h>
14 #include <linux/videodev2.h>
15
16 #include <media/v4l2-common.h>
17 #include <media/v4l2-fh.h>
18 #include <media/v4l2-jpeg.h>
19 #include <media/v4l2-mem2mem.h>
20 #include <media/videobuf2-core.h>
21 #include <media/videobuf2-dma-contig.h>
22
23 #include "coda.h"
24 #include "trace.h"
25
26 #define SOI_MARKER      0xffd8
27 #define APP9_MARKER     0xffe9
28 #define DRI_MARKER      0xffdd
29 #define DQT_MARKER      0xffdb
30 #define DHT_MARKER      0xffc4
31 #define SOF_MARKER      0xffc0
32 #define SOS_MARKER      0xffda
33 #define EOI_MARKER      0xffd9
34
35 enum {
36         CODA9_JPEG_FORMAT_420,
37         CODA9_JPEG_FORMAT_422,
38         CODA9_JPEG_FORMAT_224,
39         CODA9_JPEG_FORMAT_444,
40         CODA9_JPEG_FORMAT_400,
41 };
42
43 struct coda_huff_tab {
44         u8 luma_dc[16 + 12];
45         u8 chroma_dc[16 + 12];
46         u8 luma_ac[16 + 162];
47         u8 chroma_ac[16 + 162];
48
49         /* DC Luma, DC Chroma, AC Luma, AC Chroma */
50         s16     min[4 * 16];
51         s16     max[4 * 16];
52         s8      ptr[4 * 16];
53 };
54
55 #define CODA9_JPEG_ENC_HUFF_DATA_SIZE   (256 + 256 + 16 + 16)
56
57 /*
58  * Typical Huffman tables for 8-bit precision luminance and
59  * chrominance from JPEG ITU-T.81 (ISO/IEC 10918-1) Annex K.3
60  */
61
62 static const unsigned char luma_dc[16 + 12] = {
63         /* bits */
64         0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
65         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66         /* values */
67         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
68         0x08, 0x09, 0x0a, 0x0b,
69 };
70
71 static const unsigned char chroma_dc[16 + 12] = {
72         /* bits */
73         0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
74         0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
75         /* values */
76         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
77         0x08, 0x09, 0x0a, 0x0b,
78 };
79
80 static const unsigned char luma_ac[16 + 162 + 2] = {
81         /* bits */
82         0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03,
83         0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d,
84         /* values */
85         0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
86         0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
87         0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
88         0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
89         0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
90         0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
91         0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
92         0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
93         0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
94         0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
95         0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
96         0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
97         0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
98         0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
99         0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
100         0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
101         0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
102         0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
103         0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
104         0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
105         0xf9, 0xfa, /* padded to 32-bit */
106 };
107
108 static const unsigned char chroma_ac[16 + 162 + 2] = {
109         /* bits */
110         0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04,
111         0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77,
112         /* values */
113         0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
114         0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
115         0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
116         0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
117         0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
118         0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
119         0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
120         0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
121         0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
122         0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
123         0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
124         0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
125         0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
126         0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
127         0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
128         0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
129         0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
130         0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
131         0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
132         0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
133         0xf9, 0xfa, /* padded to 32-bit */
134 };
135
136 /*
137  * Quantization tables for luminance and chrominance components in
138  * zig-zag scan order from the Freescale i.MX VPU libraries
139  */
140
141 static unsigned char luma_q[64] = {
142         0x06, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x05,
143         0x05, 0x06, 0x09, 0x06, 0x05, 0x06, 0x09, 0x0b,
144         0x08, 0x06, 0x06, 0x08, 0x0b, 0x0c, 0x0a, 0x0a,
145         0x0b, 0x0a, 0x0a, 0x0c, 0x10, 0x0c, 0x0c, 0x0c,
146         0x0c, 0x0c, 0x0c, 0x10, 0x0c, 0x0c, 0x0c, 0x0c,
147         0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
148         0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
149         0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
150 };
151
152 static unsigned char chroma_q[64] = {
153         0x07, 0x07, 0x07, 0x0d, 0x0c, 0x0d, 0x18, 0x10,
154         0x10, 0x18, 0x14, 0x0e, 0x0e, 0x0e, 0x14, 0x14,
155         0x0e, 0x0e, 0x0e, 0x0e, 0x14, 0x11, 0x0c, 0x0c,
156         0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x0c, 0x0c, 0x0c,
157         0x0c, 0x0c, 0x0c, 0x11, 0x0c, 0x0c, 0x0c, 0x0c,
158         0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
159         0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
160         0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
161 };
162
163 static const unsigned char width_align[] = {
164         [CODA9_JPEG_FORMAT_420] = 16,
165         [CODA9_JPEG_FORMAT_422] = 16,
166         [CODA9_JPEG_FORMAT_224] = 8,
167         [CODA9_JPEG_FORMAT_444] = 8,
168         [CODA9_JPEG_FORMAT_400] = 8,
169 };
170
171 static const unsigned char height_align[] = {
172         [CODA9_JPEG_FORMAT_420] = 16,
173         [CODA9_JPEG_FORMAT_422] = 8,
174         [CODA9_JPEG_FORMAT_224] = 16,
175         [CODA9_JPEG_FORMAT_444] = 8,
176         [CODA9_JPEG_FORMAT_400] = 8,
177 };
178
179 static int coda9_jpeg_chroma_format(u32 pixfmt)
180 {
181         switch (pixfmt) {
182         case V4L2_PIX_FMT_YUV420:
183         case V4L2_PIX_FMT_NV12:
184                 return CODA9_JPEG_FORMAT_420;
185         case V4L2_PIX_FMT_YUV422P:
186                 return CODA9_JPEG_FORMAT_422;
187         case V4L2_PIX_FMT_YUV444:
188                 return CODA9_JPEG_FORMAT_444;
189         case V4L2_PIX_FMT_GREY:
190                 return CODA9_JPEG_FORMAT_400;
191         }
192         return -EINVAL;
193 }
194
195 struct coda_memcpy_desc {
196         int offset;
197         const void *src;
198         size_t len;
199 };
200
201 static void coda_memcpy_parabuf(void *parabuf,
202                                 const struct coda_memcpy_desc *desc)
203 {
204         u32 *dst = parabuf + desc->offset;
205         const u32 *src = desc->src;
206         int len = desc->len / 4;
207         int i;
208
209         for (i = 0; i < len; i += 2) {
210                 dst[i + 1] = swab32(src[i]);
211                 dst[i] = swab32(src[i + 1]);
212         }
213 }
214
215 int coda_jpeg_write_tables(struct coda_ctx *ctx)
216 {
217         int i;
218         static const struct coda_memcpy_desc huff[8] = {
219                 { 0,   luma_dc,    sizeof(luma_dc)    },
220                 { 32,  luma_ac,    sizeof(luma_ac)    },
221                 { 216, chroma_dc,  sizeof(chroma_dc)  },
222                 { 248, chroma_ac,  sizeof(chroma_ac)  },
223         };
224         struct coda_memcpy_desc qmat[3] = {
225                 { 512, ctx->params.jpeg_qmat_tab[0], 64 },
226                 { 576, ctx->params.jpeg_qmat_tab[1], 64 },
227                 { 640, ctx->params.jpeg_qmat_tab[1], 64 },
228         };
229
230         /* Write huffman tables to parameter memory */
231         for (i = 0; i < ARRAY_SIZE(huff); i++)
232                 coda_memcpy_parabuf(ctx->parabuf.vaddr, huff + i);
233
234         /* Write Q-matrix to parameter memory */
235         for (i = 0; i < ARRAY_SIZE(qmat); i++)
236                 coda_memcpy_parabuf(ctx->parabuf.vaddr, qmat + i);
237
238         return 0;
239 }
240
241 bool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_buffer *vb)
242 {
243         void *vaddr = vb2_plane_vaddr(vb, 0);
244         u16 soi, eoi;
245         int len, i;
246
247         soi = be16_to_cpup((__be16 *)vaddr);
248         if (soi != SOI_MARKER)
249                 return false;
250
251         len = vb2_get_plane_payload(vb, 0);
252         vaddr += len - 2;
253         for (i = 0; i < 32; i++) {
254                 eoi = be16_to_cpup((__be16 *)(vaddr - i));
255                 if (eoi == EOI_MARKER) {
256                         if (i > 0)
257                                 vb2_set_plane_payload(vb, 0, len - i);
258                         return true;
259                 }
260         }
261
262         return false;
263 }
264
265 static int coda9_jpeg_gen_dec_huff_tab(struct coda_ctx *ctx, int tab_num);
266
267 int coda_jpeg_decode_header(struct coda_ctx *ctx, struct vb2_buffer *vb)
268 {
269         struct coda_dev *dev = ctx->dev;
270         u8 *buf = vb2_plane_vaddr(vb, 0);
271         size_t len = vb2_get_plane_payload(vb, 0);
272         struct v4l2_jpeg_scan_header scan_header;
273         struct v4l2_jpeg_reference quantization_tables[4] = { };
274         struct v4l2_jpeg_reference huffman_tables[4] = { };
275         struct v4l2_jpeg_header header = {
276                 .scan = &scan_header,
277                 .quantization_tables = quantization_tables,
278                 .huffman_tables = huffman_tables,
279         };
280         struct coda_q_data *q_data_src;
281         struct coda_huff_tab *huff_tab;
282         int i, j, ret;
283
284         ret = v4l2_jpeg_parse_header(buf, len, &header);
285         if (ret < 0) {
286                 v4l2_err(&dev->v4l2_dev, "failed to parse JPEG header: %pe\n",
287                          ERR_PTR(ret));
288                 return ret;
289         }
290
291         ctx->params.jpeg_restart_interval = header.restart_interval;
292
293         /* check frame header */
294         if (header.frame.height > ctx->codec->max_h ||
295             header.frame.width > ctx->codec->max_w) {
296                 v4l2_err(&dev->v4l2_dev, "invalid dimensions: %dx%d\n",
297                          header.frame.width, header.frame.height);
298                 return -EINVAL;
299         }
300
301         q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
302         if (header.frame.height != q_data_src->height ||
303             header.frame.width != q_data_src->width) {
304                 v4l2_err(&dev->v4l2_dev,
305                          "dimensions don't match format: %dx%d\n",
306                          header.frame.width, header.frame.height);
307                 return -EINVAL;
308         }
309
310         if (header.frame.num_components != 3) {
311                 v4l2_err(&dev->v4l2_dev,
312                          "unsupported number of components: %d\n",
313                          header.frame.num_components);
314                 return -EINVAL;
315         }
316
317         /* install quantization tables */
318         if (quantization_tables[3].start) {
319                 v4l2_err(&dev->v4l2_dev,
320                          "only 3 quantization tables supported\n");
321                 return -EINVAL;
322         }
323         for (i = 0; i < 3; i++) {
324                 if (!quantization_tables[i].start)
325                         continue;
326                 if (quantization_tables[i].length != 64) {
327                         v4l2_err(&dev->v4l2_dev,
328                                  "only 8-bit quantization tables supported\n");
329                         continue;
330                 }
331                 if (!ctx->params.jpeg_qmat_tab[i]) {
332                         ctx->params.jpeg_qmat_tab[i] = kmalloc(64, GFP_KERNEL);
333                         if (!ctx->params.jpeg_qmat_tab[i])
334                                 return -ENOMEM;
335                 }
336                 memcpy(ctx->params.jpeg_qmat_tab[i],
337                        quantization_tables[i].start, 64);
338         }
339
340         /* install Huffman tables */
341         for (i = 0; i < 4; i++) {
342                 if (!huffman_tables[i].start) {
343                         v4l2_err(&dev->v4l2_dev, "missing Huffman table\n");
344                         return -EINVAL;
345                 }
346                 /* AC tables should be between 17 -> 178, DC between 17 -> 28 */
347                 if (huffman_tables[i].length < 17 ||
348                     huffman_tables[i].length > 178 ||
349                     ((i & 2) == 0 && huffman_tables[i].length > 28)) {
350                         v4l2_err(&dev->v4l2_dev,
351                                  "invalid Huffman table %d length: %zu\n",
352                                  i, huffman_tables[i].length);
353                         return -EINVAL;
354                 }
355         }
356         huff_tab = ctx->params.jpeg_huff_tab;
357         if (!huff_tab) {
358                 huff_tab = kzalloc(sizeof(struct coda_huff_tab), GFP_KERNEL);
359                 if (!huff_tab)
360                         return -ENOMEM;
361                 ctx->params.jpeg_huff_tab = huff_tab;
362         }
363
364         memset(huff_tab, 0, sizeof(*huff_tab));
365         memcpy(huff_tab->luma_dc, huffman_tables[0].start, huffman_tables[0].length);
366         memcpy(huff_tab->chroma_dc, huffman_tables[1].start, huffman_tables[1].length);
367         memcpy(huff_tab->luma_ac, huffman_tables[2].start, huffman_tables[2].length);
368         memcpy(huff_tab->chroma_ac, huffman_tables[3].start, huffman_tables[3].length);
369
370         /* check scan header */
371         for (i = 0; i < scan_header.num_components; i++) {
372                 struct v4l2_jpeg_scan_component_spec *scan_component;
373
374                 scan_component = &scan_header.component[i];
375                 for (j = 0; j < header.frame.num_components; j++) {
376                         if (header.frame.component[j].component_identifier ==
377                             scan_component->component_selector)
378                                 break;
379                 }
380                 if (j == header.frame.num_components)
381                         continue;
382
383                 ctx->params.jpeg_huff_dc_index[j] =
384                         scan_component->dc_entropy_coding_table_selector;
385                 ctx->params.jpeg_huff_ac_index[j] =
386                         scan_component->ac_entropy_coding_table_selector;
387         }
388
389         /* Generate Huffman table information */
390         for (i = 0; i < 4; i++)
391                 coda9_jpeg_gen_dec_huff_tab(ctx, i);
392
393         /* start of entropy coded segment */
394         ctx->jpeg_ecs_offset = header.ecs_offset;
395
396         switch (header.frame.subsampling) {
397         case V4L2_JPEG_CHROMA_SUBSAMPLING_420:
398         case V4L2_JPEG_CHROMA_SUBSAMPLING_422:
399                 ctx->params.jpeg_chroma_subsampling = header.frame.subsampling;
400                 break;
401         default:
402                 v4l2_err(&dev->v4l2_dev, "chroma subsampling not supported: %d",
403                          header.frame.subsampling);
404                 return -EINVAL;
405         }
406
407         return 0;
408 }
409
410 static inline void coda9_jpeg_write_huff_values(struct coda_dev *dev, u8 *bits,
411                                                 int num_values)
412 {
413         s8 *values = (s8 *)(bits + 16);
414         int huff_length, i;
415
416         for (huff_length = 0, i = 0; i < 16; i++)
417                 huff_length += bits[i];
418         for (i = huff_length; i < num_values; i++)
419                 values[i] = -1;
420         for (i = 0; i < num_values; i++)
421                 coda_write(dev, (s32)values[i], CODA9_REG_JPEG_HUFF_DATA);
422 }
423
424 static void coda9_jpeg_dec_huff_setup(struct coda_ctx *ctx)
425 {
426         struct coda_huff_tab *huff_tab = ctx->params.jpeg_huff_tab;
427         struct coda_dev *dev = ctx->dev;
428         s16 *huff_min = huff_tab->min;
429         s16 *huff_max = huff_tab->max;
430         s8 *huff_ptr = huff_tab->ptr;
431         int i;
432
433         /* MIN Tables */
434         coda_write(dev, 0x003, CODA9_REG_JPEG_HUFF_CTRL);
435         coda_write(dev, 0x000, CODA9_REG_JPEG_HUFF_ADDR);
436         for (i = 0; i < 4 * 16; i++)
437                 coda_write(dev, (s32)huff_min[i], CODA9_REG_JPEG_HUFF_DATA);
438
439         /* MAX Tables */
440         coda_write(dev, 0x403, CODA9_REG_JPEG_HUFF_CTRL);
441         coda_write(dev, 0x440, CODA9_REG_JPEG_HUFF_ADDR);
442         for (i = 0; i < 4 * 16; i++)
443                 coda_write(dev, (s32)huff_max[i], CODA9_REG_JPEG_HUFF_DATA);
444
445         /* PTR Tables */
446         coda_write(dev, 0x803, CODA9_REG_JPEG_HUFF_CTRL);
447         coda_write(dev, 0x880, CODA9_REG_JPEG_HUFF_ADDR);
448         for (i = 0; i < 4 * 16; i++)
449                 coda_write(dev, (s32)huff_ptr[i], CODA9_REG_JPEG_HUFF_DATA);
450
451         /* VAL Tables: DC Luma, DC Chroma, AC Luma, AC Chroma */
452         coda_write(dev, 0xc03, CODA9_REG_JPEG_HUFF_CTRL);
453         coda9_jpeg_write_huff_values(dev, huff_tab->luma_dc, 12);
454         coda9_jpeg_write_huff_values(dev, huff_tab->chroma_dc, 12);
455         coda9_jpeg_write_huff_values(dev, huff_tab->luma_ac, 162);
456         coda9_jpeg_write_huff_values(dev, huff_tab->chroma_ac, 162);
457         coda_write(dev, 0x000, CODA9_REG_JPEG_HUFF_CTRL);
458 }
459
460 static inline void coda9_jpeg_write_qmat_tab(struct coda_dev *dev,
461                                              u8 *qmat, int index)
462 {
463         int i;
464
465         coda_write(dev, index | 0x3, CODA9_REG_JPEG_QMAT_CTRL);
466         for (i = 0; i < 64; i++)
467                 coda_write(dev, qmat[i], CODA9_REG_JPEG_QMAT_DATA);
468         coda_write(dev, 0, CODA9_REG_JPEG_QMAT_CTRL);
469 }
470
471 static void coda9_jpeg_qmat_setup(struct coda_ctx *ctx)
472 {
473         struct coda_dev *dev = ctx->dev;
474         int *qmat_index = ctx->params.jpeg_qmat_index;
475         u8 **qmat_tab = ctx->params.jpeg_qmat_tab;
476
477         coda9_jpeg_write_qmat_tab(dev, qmat_tab[qmat_index[0]], 0x00);
478         coda9_jpeg_write_qmat_tab(dev, qmat_tab[qmat_index[1]], 0x40);
479         coda9_jpeg_write_qmat_tab(dev, qmat_tab[qmat_index[2]], 0x80);
480 }
481
482 static void coda9_jpeg_dec_bbc_gbu_setup(struct coda_ctx *ctx,
483                                          struct vb2_buffer *buf, u32 ecs_offset)
484 {
485         struct coda_dev *dev = ctx->dev;
486         int page_ptr, word_ptr, bit_ptr;
487         u32 bbc_base_addr, end_addr;
488         int bbc_cur_pos;
489         int ret, val;
490
491         bbc_base_addr = vb2_dma_contig_plane_dma_addr(buf, 0);
492         end_addr = bbc_base_addr + vb2_get_plane_payload(buf, 0);
493
494         page_ptr = ecs_offset / 256;
495         word_ptr = (ecs_offset % 256) / 4;
496         if (page_ptr & 1)
497                 word_ptr += 64;
498         bit_ptr = (ecs_offset % 4) * 8;
499         if (word_ptr & 1)
500                 bit_ptr += 32;
501         word_ptr &= ~0x1;
502
503         coda_write(dev, end_addr, CODA9_REG_JPEG_BBC_WR_PTR);
504         coda_write(dev, bbc_base_addr, CODA9_REG_JPEG_BBC_BAS_ADDR);
505
506         /* Leave 3 256-byte page margin to avoid a BBC interrupt */
507         coda_write(dev, end_addr + 256 * 3 + 256, CODA9_REG_JPEG_BBC_END_ADDR);
508         val = DIV_ROUND_UP(vb2_plane_size(buf, 0), 256) + 3;
509         coda_write(dev, BIT(31) | val, CODA9_REG_JPEG_BBC_STRM_CTRL);
510
511         bbc_cur_pos = page_ptr;
512         coda_write(dev, bbc_cur_pos, CODA9_REG_JPEG_BBC_CUR_POS);
513         coda_write(dev, bbc_base_addr + (bbc_cur_pos << 8),
514                         CODA9_REG_JPEG_BBC_EXT_ADDR);
515         coda_write(dev, (bbc_cur_pos & 1) << 6, CODA9_REG_JPEG_BBC_INT_ADDR);
516         coda_write(dev, 64, CODA9_REG_JPEG_BBC_DATA_CNT);
517         coda_write(dev, 0, CODA9_REG_JPEG_BBC_COMMAND);
518         do {
519                 ret = coda_read(dev, CODA9_REG_JPEG_BBC_BUSY);
520         } while (ret == 1);
521
522         bbc_cur_pos++;
523         coda_write(dev, bbc_cur_pos, CODA9_REG_JPEG_BBC_CUR_POS);
524         coda_write(dev, bbc_base_addr + (bbc_cur_pos << 8),
525                         CODA9_REG_JPEG_BBC_EXT_ADDR);
526         coda_write(dev, (bbc_cur_pos & 1) << 6, CODA9_REG_JPEG_BBC_INT_ADDR);
527         coda_write(dev, 64, CODA9_REG_JPEG_BBC_DATA_CNT);
528         coda_write(dev, 0, CODA9_REG_JPEG_BBC_COMMAND);
529         do {
530                 ret = coda_read(dev, CODA9_REG_JPEG_BBC_BUSY);
531         } while (ret == 1);
532
533         bbc_cur_pos++;
534         coda_write(dev, bbc_cur_pos, CODA9_REG_JPEG_BBC_CUR_POS);
535         coda_write(dev, 1, CODA9_REG_JPEG_BBC_CTRL);
536
537         coda_write(dev, 0, CODA9_REG_JPEG_GBU_TT_CNT);
538         coda_write(dev, word_ptr, CODA9_REG_JPEG_GBU_WD_PTR);
539         coda_write(dev, 0, CODA9_REG_JPEG_GBU_BBSR);
540         coda_write(dev, 127, CODA9_REG_JPEG_GBU_BBER);
541         if (page_ptr & 1) {
542                 coda_write(dev, 0, CODA9_REG_JPEG_GBU_BBIR);
543                 coda_write(dev, 0, CODA9_REG_JPEG_GBU_BBHR);
544         } else {
545                 coda_write(dev, 64, CODA9_REG_JPEG_GBU_BBIR);
546                 coda_write(dev, 64, CODA9_REG_JPEG_GBU_BBHR);
547         }
548         coda_write(dev, 4, CODA9_REG_JPEG_GBU_CTRL);
549         coda_write(dev, bit_ptr, CODA9_REG_JPEG_GBU_FF_RPTR);
550         coda_write(dev, 3, CODA9_REG_JPEG_GBU_CTRL);
551 }
552
553 static const int bus_req_num[] = {
554         [CODA9_JPEG_FORMAT_420] = 2,
555         [CODA9_JPEG_FORMAT_422] = 3,
556         [CODA9_JPEG_FORMAT_224] = 3,
557         [CODA9_JPEG_FORMAT_444] = 4,
558         [CODA9_JPEG_FORMAT_400] = 4,
559 };
560
561 #define MCU_INFO(mcu_block_num, comp_num, comp0_info, comp1_info, comp2_info) \
562         (((mcu_block_num) << CODA9_JPEG_MCU_BLOCK_NUM_OFFSET) | \
563          ((comp_num) << CODA9_JPEG_COMP_NUM_OFFSET) | \
564          ((comp0_info) << CODA9_JPEG_COMP0_INFO_OFFSET) | \
565          ((comp1_info) << CODA9_JPEG_COMP1_INFO_OFFSET) | \
566          ((comp2_info) << CODA9_JPEG_COMP2_INFO_OFFSET))
567
568 static const u32 mcu_info[] = {
569         [CODA9_JPEG_FORMAT_420] = MCU_INFO(6, 3, 10, 5, 5),
570         [CODA9_JPEG_FORMAT_422] = MCU_INFO(4, 3, 9, 5, 5),
571         [CODA9_JPEG_FORMAT_224] = MCU_INFO(4, 3, 6, 5, 5),
572         [CODA9_JPEG_FORMAT_444] = MCU_INFO(3, 3, 5, 5, 5),
573         [CODA9_JPEG_FORMAT_400] = MCU_INFO(1, 1, 5, 0, 0),
574 };
575
576 /*
577  * Convert Huffman table specifcations to tables of codes and code lengths.
578  * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) [1]
579  *
580  * [1] https://www.w3.org/Graphics/JPEG/itu-t81.pdf
581  */
582 static int coda9_jpeg_gen_enc_huff_tab(struct coda_ctx *ctx, int tab_num,
583                                        int *ehufsi, int *ehufco)
584 {
585         int i, j, k, lastk, si, code, maxsymbol;
586         const u8 *bits, *huffval;
587         struct {
588                 int size[256];
589                 int code[256];
590         } *huff;
591         static const unsigned char *huff_tabs[4] = {
592                 luma_dc, luma_ac, chroma_dc, chroma_ac,
593         };
594         int ret = -EINVAL;
595
596         huff = kzalloc(sizeof(*huff), GFP_KERNEL);
597         if (!huff)
598                 return -ENOMEM;
599
600         bits = huff_tabs[tab_num];
601         huffval = huff_tabs[tab_num] + 16;
602
603         maxsymbol = tab_num & 1 ? 256 : 16;
604
605         /* Figure C.1 - Generation of table of Huffman code sizes */
606         k = 0;
607         for (i = 1; i <= 16; i++) {
608                 j = bits[i - 1];
609                 if (k + j > maxsymbol)
610                         goto out;
611                 while (j--)
612                         huff->size[k++] = i;
613         }
614         lastk = k;
615
616         /* Figure C.2 - Generation of table of Huffman codes */
617         k = 0;
618         code = 0;
619         si = huff->size[0];
620         while (k < lastk) {
621                 while (huff->size[k] == si) {
622                         huff->code[k++] = code;
623                         code++;
624                 }
625                 if (code >= (1 << si))
626                         goto out;
627                 code <<= 1;
628                 si++;
629         }
630
631         /* Figure C.3 - Ordering procedure for encoding procedure code tables */
632         for (k = 0; k < lastk; k++) {
633                 i = huffval[k];
634                 if (i >= maxsymbol || ehufsi[i])
635                         goto out;
636                 ehufco[i] = huff->code[k];
637                 ehufsi[i] = huff->size[k];
638         }
639
640         ret = 0;
641 out:
642         kfree(huff);
643         return ret;
644 }
645
646 #define DC_TABLE_INDEX0             0
647 #define AC_TABLE_INDEX0             1
648 #define DC_TABLE_INDEX1             2
649 #define AC_TABLE_INDEX1             3
650
651 static u8 *coda9_jpeg_get_huff_bits(struct coda_ctx *ctx, int tab_num)
652 {
653         struct coda_huff_tab *huff_tab = ctx->params.jpeg_huff_tab;
654
655         if (!huff_tab)
656                 return NULL;
657
658         switch (tab_num) {
659         case DC_TABLE_INDEX0: return huff_tab->luma_dc;
660         case AC_TABLE_INDEX0: return huff_tab->luma_ac;
661         case DC_TABLE_INDEX1: return huff_tab->chroma_dc;
662         case AC_TABLE_INDEX1: return huff_tab->chroma_ac;
663         }
664
665         return NULL;
666 }
667
668 static int coda9_jpeg_gen_dec_huff_tab(struct coda_ctx *ctx, int tab_num)
669 {
670         int ptr_cnt = 0, huff_code = 0, zero_flag = 0, data_flag = 0;
671         u8 *huff_bits;
672         s16 *huff_max;
673         s16 *huff_min;
674         s8 *huff_ptr;
675         int ofs;
676         int i;
677
678         huff_bits = coda9_jpeg_get_huff_bits(ctx, tab_num);
679         if (!huff_bits)
680                 return -EINVAL;
681
682         /* DC/AC Luma, DC/AC Chroma -> DC Luma/Chroma, AC Luma/Chroma */
683         ofs = ((tab_num & 1) << 1) | ((tab_num >> 1) & 1);
684         ofs *= 16;
685
686         huff_ptr = ctx->params.jpeg_huff_tab->ptr + ofs;
687         huff_max = ctx->params.jpeg_huff_tab->max + ofs;
688         huff_min = ctx->params.jpeg_huff_tab->min + ofs;
689
690         for (i = 0; i < 16; i++) {
691                 if (huff_bits[i]) {
692                         huff_ptr[i] = ptr_cnt;
693                         ptr_cnt += huff_bits[i];
694                         huff_min[i] = huff_code;
695                         huff_max[i] = huff_code + (huff_bits[i] - 1);
696                         data_flag = 1;
697                         zero_flag = 0;
698                 } else {
699                         huff_ptr[i] = -1;
700                         huff_min[i] = -1;
701                         huff_max[i] = -1;
702                         zero_flag = 1;
703                 }
704
705                 if (data_flag == 1) {
706                         if (zero_flag == 1)
707                                 huff_code <<= 1;
708                         else
709                                 huff_code = (huff_max[i] + 1) << 1;
710                 }
711         }
712
713         return 0;
714 }
715
716 static int coda9_jpeg_load_huff_tab(struct coda_ctx *ctx)
717 {
718         struct {
719                 int size[4][256];
720                 int code[4][256];
721         } *huff;
722         u32 *huff_data;
723         int i, j;
724         int ret;
725
726         huff = kzalloc(sizeof(*huff), GFP_KERNEL);
727         if (!huff)
728                 return -ENOMEM;
729
730         /* Generate all four (luma/chroma DC/AC) code/size lookup tables */
731         for (i = 0; i < 4; i++) {
732                 ret = coda9_jpeg_gen_enc_huff_tab(ctx, i, huff->size[i],
733                                                   huff->code[i]);
734                 if (ret)
735                         goto out;
736         }
737
738         if (!ctx->params.jpeg_huff_data) {
739                 ctx->params.jpeg_huff_data =
740                         kzalloc(sizeof(u32) * CODA9_JPEG_ENC_HUFF_DATA_SIZE,
741                                 GFP_KERNEL);
742                 if (!ctx->params.jpeg_huff_data) {
743                         ret = -ENOMEM;
744                         goto out;
745                 }
746         }
747         huff_data = ctx->params.jpeg_huff_data;
748
749         for (j = 0; j < 4; j++) {
750                 /* Store Huffman lookup tables in AC0, AC1, DC0, DC1 order */
751                 int t = (j == 0) ? AC_TABLE_INDEX0 :
752                         (j == 1) ? AC_TABLE_INDEX1 :
753                         (j == 2) ? DC_TABLE_INDEX0 :
754                                    DC_TABLE_INDEX1;
755                 /* DC tables only have 16 entries */
756                 int len = (j < 2) ? 256 : 16;
757
758                 for (i = 0; i < len; i++) {
759                         if (huff->size[t][i] == 0 && huff->code[t][i] == 0)
760                                 *(huff_data++) = 0;
761                         else
762                                 *(huff_data++) =
763                                         ((huff->size[t][i] - 1) << 16) |
764                                         huff->code[t][i];
765                 }
766         }
767
768         ret = 0;
769 out:
770         kfree(huff);
771         return ret;
772 }
773
774 static void coda9_jpeg_write_huff_tab(struct coda_ctx *ctx)
775 {
776         struct coda_dev *dev = ctx->dev;
777         u32 *huff_data = ctx->params.jpeg_huff_data;
778         int i;
779
780         /* Write Huffman size/code lookup tables in AC0, AC1, DC0, DC1 order */
781         coda_write(dev, 0x3, CODA9_REG_JPEG_HUFF_CTRL);
782         for (i = 0; i < CODA9_JPEG_ENC_HUFF_DATA_SIZE; i++)
783                 coda_write(dev, *(huff_data++), CODA9_REG_JPEG_HUFF_DATA);
784         coda_write(dev, 0x0, CODA9_REG_JPEG_HUFF_CTRL);
785 }
786
787 static inline void coda9_jpeg_write_qmat_quotients(struct coda_dev *dev,
788                                                    u8 *qmat, int index)
789 {
790         int i;
791
792         coda_write(dev, index | 0x3, CODA9_REG_JPEG_QMAT_CTRL);
793         for (i = 0; i < 64; i++)
794                 coda_write(dev, 0x80000 / qmat[i], CODA9_REG_JPEG_QMAT_DATA);
795         coda_write(dev, index, CODA9_REG_JPEG_QMAT_CTRL);
796 }
797
798 static void coda9_jpeg_load_qmat_tab(struct coda_ctx *ctx)
799 {
800         struct coda_dev *dev = ctx->dev;
801         u8 *luma_tab;
802         u8 *chroma_tab;
803
804         luma_tab = ctx->params.jpeg_qmat_tab[0];
805         if (!luma_tab)
806                 luma_tab = luma_q;
807
808         chroma_tab = ctx->params.jpeg_qmat_tab[1];
809         if (!chroma_tab)
810                 chroma_tab = chroma_q;
811
812         coda9_jpeg_write_qmat_quotients(dev, luma_tab, 0x00);
813         coda9_jpeg_write_qmat_quotients(dev, chroma_tab, 0x40);
814         coda9_jpeg_write_qmat_quotients(dev, chroma_tab, 0x80);
815 }
816
817 struct coda_jpeg_stream {
818         u8 *curr;
819         u8 *end;
820 };
821
822 static inline int coda_jpeg_put_byte(u8 byte, struct coda_jpeg_stream *stream)
823 {
824         if (stream->curr >= stream->end)
825                 return -EINVAL;
826
827         *stream->curr++ = byte;
828
829         return 0;
830 }
831
832 static inline int coda_jpeg_put_word(u16 word, struct coda_jpeg_stream *stream)
833 {
834         if (stream->curr + sizeof(__be16) > stream->end)
835                 return -EINVAL;
836
837         put_unaligned_be16(word, stream->curr);
838         stream->curr += sizeof(__be16);
839
840         return 0;
841 }
842
843 static int coda_jpeg_put_table(u16 marker, u8 index, const u8 *table,
844                                size_t len, struct coda_jpeg_stream *stream)
845 {
846         int i, ret;
847
848         ret = coda_jpeg_put_word(marker, stream);
849         if (ret < 0)
850                 return ret;
851         ret = coda_jpeg_put_word(3 + len, stream);
852         if (ret < 0)
853                 return ret;
854         ret = coda_jpeg_put_byte(index, stream);
855         for (i = 0; i < len && ret == 0; i++)
856                 ret = coda_jpeg_put_byte(table[i], stream);
857
858         return ret;
859 }
860
861 static int coda_jpeg_define_quantization_table(struct coda_ctx *ctx, u8 index,
862                                                struct coda_jpeg_stream *stream)
863 {
864         return coda_jpeg_put_table(DQT_MARKER, index,
865                                    ctx->params.jpeg_qmat_tab[index], 64,
866                                    stream);
867 }
868
869 static int coda_jpeg_define_huffman_table(u8 index, const u8 *table, size_t len,
870                                           struct coda_jpeg_stream *stream)
871 {
872         return coda_jpeg_put_table(DHT_MARKER, index, table, len, stream);
873 }
874
875 static int coda9_jpeg_encode_header(struct coda_ctx *ctx, int len, u8 *buf)
876 {
877         struct coda_jpeg_stream stream = { buf, buf + len };
878         struct coda_q_data *q_data_src;
879         int chroma_format, comp_num;
880         int i, ret, pad;
881
882         q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
883         chroma_format = coda9_jpeg_chroma_format(q_data_src->fourcc);
884         if (chroma_format < 0)
885                 return 0;
886
887         /* Start Of Image */
888         ret = coda_jpeg_put_word(SOI_MARKER, &stream);
889         if (ret < 0)
890                 return ret;
891
892         /* Define Restart Interval */
893         if (ctx->params.jpeg_restart_interval) {
894                 ret = coda_jpeg_put_word(DRI_MARKER, &stream);
895                 if (ret < 0)
896                         return ret;
897                 ret = coda_jpeg_put_word(4, &stream);
898                 if (ret < 0)
899                         return ret;
900                 ret = coda_jpeg_put_word(ctx->params.jpeg_restart_interval,
901                                          &stream);
902                 if (ret < 0)
903                         return ret;
904         }
905
906         /* Define Quantization Tables */
907         ret = coda_jpeg_define_quantization_table(ctx, 0x00, &stream);
908         if (ret < 0)
909                 return ret;
910         if (chroma_format != CODA9_JPEG_FORMAT_400) {
911                 ret = coda_jpeg_define_quantization_table(ctx, 0x01, &stream);
912                 if (ret < 0)
913                         return ret;
914         }
915
916         /* Define Huffman Tables */
917         ret = coda_jpeg_define_huffman_table(0x00, luma_dc, 16 + 12, &stream);
918         if (ret < 0)
919                 return ret;
920         ret = coda_jpeg_define_huffman_table(0x10, luma_ac, 16 + 162, &stream);
921         if (ret < 0)
922                 return ret;
923         if (chroma_format != CODA9_JPEG_FORMAT_400) {
924                 ret = coda_jpeg_define_huffman_table(0x01, chroma_dc, 16 + 12,
925                                                      &stream);
926                 if (ret < 0)
927                         return ret;
928                 ret = coda_jpeg_define_huffman_table(0x11, chroma_ac, 16 + 162,
929                                                      &stream);
930                 if (ret < 0)
931                         return ret;
932         }
933
934         /* Start Of Frame */
935         ret = coda_jpeg_put_word(SOF_MARKER, &stream);
936         if (ret < 0)
937                 return ret;
938         comp_num = (chroma_format == CODA9_JPEG_FORMAT_400) ? 1 : 3;
939         ret = coda_jpeg_put_word(8 + comp_num * 3, &stream);
940         if (ret < 0)
941                 return ret;
942         ret = coda_jpeg_put_byte(0x08, &stream);
943         if (ret < 0)
944                 return ret;
945         ret = coda_jpeg_put_word(q_data_src->height, &stream);
946         if (ret < 0)
947                 return ret;
948         ret = coda_jpeg_put_word(q_data_src->width, &stream);
949         if (ret < 0)
950                 return ret;
951         ret = coda_jpeg_put_byte(comp_num, &stream);
952         if (ret < 0)
953                 return ret;
954         for (i = 0; i < comp_num; i++) {
955                 static unsigned char subsampling[5][3] = {
956                         [CODA9_JPEG_FORMAT_420] = { 0x22, 0x11, 0x11 },
957                         [CODA9_JPEG_FORMAT_422] = { 0x21, 0x11, 0x11 },
958                         [CODA9_JPEG_FORMAT_224] = { 0x12, 0x11, 0x11 },
959                         [CODA9_JPEG_FORMAT_444] = { 0x11, 0x11, 0x11 },
960                         [CODA9_JPEG_FORMAT_400] = { 0x11 },
961                 };
962
963                 /* Component identifier, matches SOS */
964                 ret = coda_jpeg_put_byte(i + 1, &stream);
965                 if (ret < 0)
966                         return ret;
967                 ret = coda_jpeg_put_byte(subsampling[chroma_format][i],
968                                          &stream);
969                 if (ret < 0)
970                         return ret;
971                 /* Chroma table index */
972                 ret = coda_jpeg_put_byte((i == 0) ? 0 : 1, &stream);
973                 if (ret < 0)
974                         return ret;
975         }
976
977         /* Pad to multiple of 8 bytes */
978         pad = (stream.curr - buf) % 8;
979         if (pad) {
980                 pad = 8 - pad;
981                 while (pad--) {
982                         ret = coda_jpeg_put_byte(0x00, &stream);
983                         if (ret < 0)
984                                 return ret;
985                 }
986         }
987
988         return stream.curr - buf;
989 }
990
991 /*
992  * Scale quantization table using nonlinear scaling factor
993  * u8 qtab[64], scale [50,190]
994  */
995 static void coda_scale_quant_table(u8 *q_tab, int scale)
996 {
997         unsigned int temp;
998         int i;
999
1000         for (i = 0; i < 64; i++) {
1001                 temp = DIV_ROUND_CLOSEST((unsigned int)q_tab[i] * scale, 100);
1002                 if (temp <= 0)
1003                         temp = 1;
1004                 if (temp > 255)
1005                         temp = 255;
1006                 q_tab[i] = (unsigned char)temp;
1007         }
1008 }
1009
1010 void coda_set_jpeg_compression_quality(struct coda_ctx *ctx, int quality)
1011 {
1012         unsigned int scale;
1013
1014         ctx->params.jpeg_quality = quality;
1015
1016         /* Clip quality setting to [5,100] interval */
1017         if (quality > 100)
1018                 quality = 100;
1019         if (quality < 5)
1020                 quality = 5;
1021
1022         /*
1023          * Non-linear scaling factor:
1024          * [5,50] -> [1000..100], [51,100] -> [98..0]
1025          */
1026         if (quality < 50)
1027                 scale = 5000 / quality;
1028         else
1029                 scale = 200 - 2 * quality;
1030
1031         if (ctx->params.jpeg_qmat_tab[0]) {
1032                 memcpy(ctx->params.jpeg_qmat_tab[0], luma_q, 64);
1033                 coda_scale_quant_table(ctx->params.jpeg_qmat_tab[0], scale);
1034         }
1035         if (ctx->params.jpeg_qmat_tab[1]) {
1036                 memcpy(ctx->params.jpeg_qmat_tab[1], chroma_q, 64);
1037                 coda_scale_quant_table(ctx->params.jpeg_qmat_tab[1], scale);
1038         }
1039 }
1040
1041 /*
1042  * Encoder context operations
1043  */
1044
1045 static int coda9_jpeg_start_encoding(struct coda_ctx *ctx)
1046 {
1047         struct coda_dev *dev = ctx->dev;
1048         int ret;
1049
1050         ret = coda9_jpeg_load_huff_tab(ctx);
1051         if (ret < 0) {
1052                 v4l2_err(&dev->v4l2_dev, "error loading Huffman tables\n");
1053                 return ret;
1054         }
1055         if (!ctx->params.jpeg_qmat_tab[0]) {
1056                 ctx->params.jpeg_qmat_tab[0] = kmalloc(64, GFP_KERNEL);
1057                 if (!ctx->params.jpeg_qmat_tab[0])
1058                         return -ENOMEM;
1059         }
1060         if (!ctx->params.jpeg_qmat_tab[1]) {
1061                 ctx->params.jpeg_qmat_tab[1] = kmalloc(64, GFP_KERNEL);
1062                 if (!ctx->params.jpeg_qmat_tab[1])
1063                         return -ENOMEM;
1064         }
1065         coda_set_jpeg_compression_quality(ctx, ctx->params.jpeg_quality);
1066
1067         return 0;
1068 }
1069
1070 static int coda9_jpeg_prepare_encode(struct coda_ctx *ctx)
1071 {
1072         struct coda_q_data *q_data_src;
1073         struct vb2_v4l2_buffer *src_buf, *dst_buf;
1074         struct coda_dev *dev = ctx->dev;
1075         u32 start_addr, end_addr;
1076         u16 aligned_width, aligned_height;
1077         bool chroma_interleave;
1078         int chroma_format;
1079         int header_len;
1080         int ret;
1081         ktime_t timeout;
1082
1083         src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1084         dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1085         q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1086
1087         if (vb2_get_plane_payload(&src_buf->vb2_buf, 0) == 0)
1088                 vb2_set_plane_payload(&src_buf->vb2_buf, 0,
1089                                       vb2_plane_size(&src_buf->vb2_buf, 0));
1090
1091         src_buf->sequence = ctx->osequence;
1092         dst_buf->sequence = ctx->osequence;
1093         ctx->osequence++;
1094
1095         src_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
1096         src_buf->flags &= ~V4L2_BUF_FLAG_PFRAME;
1097
1098         coda_set_gdi_regs(ctx);
1099
1100         start_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1101         end_addr = start_addr + vb2_plane_size(&dst_buf->vb2_buf, 0);
1102
1103         chroma_format = coda9_jpeg_chroma_format(q_data_src->fourcc);
1104         if (chroma_format < 0)
1105                 return chroma_format;
1106
1107         /* Round image dimensions to multiple of MCU size */
1108         aligned_width = round_up(q_data_src->width, width_align[chroma_format]);
1109         aligned_height = round_up(q_data_src->height,
1110                                   height_align[chroma_format]);
1111         if (aligned_width != q_data_src->bytesperline) {
1112                 v4l2_err(&dev->v4l2_dev, "wrong stride: %d instead of %d\n",
1113                          aligned_width, q_data_src->bytesperline);
1114         }
1115
1116         header_len =
1117                 coda9_jpeg_encode_header(ctx,
1118                                          vb2_plane_size(&dst_buf->vb2_buf, 0),
1119                                          vb2_plane_vaddr(&dst_buf->vb2_buf, 0));
1120         if (header_len < 0)
1121                 return header_len;
1122
1123         coda_write(dev, start_addr + header_len, CODA9_REG_JPEG_BBC_BAS_ADDR);
1124         coda_write(dev, end_addr, CODA9_REG_JPEG_BBC_END_ADDR);
1125         coda_write(dev, start_addr + header_len, CODA9_REG_JPEG_BBC_WR_PTR);
1126         coda_write(dev, start_addr + header_len, CODA9_REG_JPEG_BBC_RD_PTR);
1127         coda_write(dev, 0, CODA9_REG_JPEG_BBC_CUR_POS);
1128         /* 64 words per 256-byte page */
1129         coda_write(dev, 64, CODA9_REG_JPEG_BBC_DATA_CNT);
1130         coda_write(dev, start_addr, CODA9_REG_JPEG_BBC_EXT_ADDR);
1131         coda_write(dev, 0, CODA9_REG_JPEG_BBC_INT_ADDR);
1132
1133         coda_write(dev, 0, CODA9_REG_JPEG_GBU_BT_PTR);
1134         coda_write(dev, 0, CODA9_REG_JPEG_GBU_WD_PTR);
1135         coda_write(dev, 0, CODA9_REG_JPEG_GBU_BBSR);
1136         coda_write(dev, BIT(31) | ((end_addr - start_addr - header_len) / 256),
1137                    CODA9_REG_JPEG_BBC_STRM_CTRL);
1138         coda_write(dev, 0, CODA9_REG_JPEG_GBU_CTRL);
1139         coda_write(dev, 0, CODA9_REG_JPEG_GBU_FF_RPTR);
1140         coda_write(dev, 127, CODA9_REG_JPEG_GBU_BBER);
1141         coda_write(dev, 64, CODA9_REG_JPEG_GBU_BBIR);
1142         coda_write(dev, 64, CODA9_REG_JPEG_GBU_BBHR);
1143
1144         chroma_interleave = (q_data_src->fourcc == V4L2_PIX_FMT_NV12);
1145         coda_write(dev, CODA9_JPEG_PIC_CTRL_TC_DIRECTION |
1146                    CODA9_JPEG_PIC_CTRL_ENCODER_EN, CODA9_REG_JPEG_PIC_CTRL);
1147         coda_write(dev, 0, CODA9_REG_JPEG_SCL_INFO);
1148         coda_write(dev, chroma_interleave, CODA9_REG_JPEG_DPB_CONFIG);
1149         coda_write(dev, ctx->params.jpeg_restart_interval,
1150                    CODA9_REG_JPEG_RST_INTVAL);
1151         coda_write(dev, 1, CODA9_REG_JPEG_BBC_CTRL);
1152
1153         coda_write(dev, bus_req_num[chroma_format], CODA9_REG_JPEG_OP_INFO);
1154
1155         coda9_jpeg_write_huff_tab(ctx);
1156         coda9_jpeg_load_qmat_tab(ctx);
1157
1158         if (ctx->params.rot_mode & CODA_ROT_90) {
1159                 aligned_width = aligned_height;
1160                 aligned_height = q_data_src->bytesperline;
1161                 if (chroma_format == CODA9_JPEG_FORMAT_422)
1162                         chroma_format = CODA9_JPEG_FORMAT_224;
1163                 else if (chroma_format == CODA9_JPEG_FORMAT_224)
1164                         chroma_format = CODA9_JPEG_FORMAT_422;
1165         }
1166         /* These need to be multiples of MCU size */
1167         coda_write(dev, aligned_width << 16 | aligned_height,
1168                    CODA9_REG_JPEG_PIC_SIZE);
1169         coda_write(dev, ctx->params.rot_mode ?
1170                    (CODA_ROT_MIR_ENABLE | ctx->params.rot_mode) : 0,
1171                    CODA9_REG_JPEG_ROT_INFO);
1172
1173         coda_write(dev, mcu_info[chroma_format], CODA9_REG_JPEG_MCU_INFO);
1174
1175         coda_write(dev, 1, CODA9_GDI_CONTROL);
1176         timeout = ktime_add_us(ktime_get(), 100000);
1177         do {
1178                 ret = coda_read(dev, CODA9_GDI_STATUS);
1179                 if (ktime_compare(ktime_get(), timeout) > 0) {
1180                         v4l2_err(&dev->v4l2_dev, "timeout waiting for GDI\n");
1181                         return -ETIMEDOUT;
1182                 }
1183         } while (!ret);
1184
1185         coda_write(dev, (chroma_format << 17) | (chroma_interleave << 16) |
1186                    q_data_src->bytesperline, CODA9_GDI_INFO_CONTROL);
1187         /* The content of this register seems to be irrelevant: */
1188         coda_write(dev, aligned_width << 16 | aligned_height,
1189                    CODA9_GDI_INFO_PIC_SIZE);
1190
1191         coda_write_base(ctx, q_data_src, src_buf, CODA9_GDI_INFO_BASE_Y);
1192
1193         coda_write(dev, 0, CODA9_REG_JPEG_DPB_BASE00);
1194         coda_write(dev, 0, CODA9_GDI_CONTROL);
1195         coda_write(dev, 1, CODA9_GDI_PIC_INIT_HOST);
1196
1197         coda_write(dev, 1, CODA9_GDI_WPROT_ERR_CLR);
1198         coda_write(dev, 0, CODA9_GDI_WPROT_RGN_EN);
1199
1200         trace_coda_jpeg_run(ctx, src_buf);
1201
1202         coda_write(dev, 1, CODA9_REG_JPEG_PIC_START);
1203
1204         return 0;
1205 }
1206
1207 static void coda9_jpeg_finish_encode(struct coda_ctx *ctx)
1208 {
1209         struct vb2_v4l2_buffer *src_buf, *dst_buf;
1210         struct coda_dev *dev = ctx->dev;
1211         u32 wr_ptr, start_ptr;
1212         u32 err_mb;
1213
1214         if (ctx->aborting) {
1215                 coda_write(ctx->dev, 0, CODA9_REG_JPEG_BBC_FLUSH_CMD);
1216                 return;
1217         }
1218
1219         /*
1220          * Lock to make sure that an encoder stop command running in parallel
1221          * will either already have marked src_buf as last, or it will wake up
1222          * the capture queue after the buffers are returned.
1223          */
1224         mutex_lock(&ctx->wakeup_mutex);
1225         src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1226         dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1227
1228         trace_coda_jpeg_done(ctx, dst_buf);
1229
1230         /*
1231          * Set plane payload to the number of bytes written out
1232          * by the JPEG processing unit
1233          */
1234         start_ptr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1235         wr_ptr = coda_read(dev, CODA9_REG_JPEG_BBC_WR_PTR);
1236         vb2_set_plane_payload(&dst_buf->vb2_buf, 0, wr_ptr - start_ptr);
1237
1238         err_mb = coda_read(dev, CODA9_REG_JPEG_PIC_ERRMB);
1239         if (err_mb)
1240                 coda_dbg(1, ctx, "ERRMB: 0x%x\n", err_mb);
1241
1242         coda_write(dev, 0, CODA9_REG_JPEG_BBC_FLUSH_CMD);
1243
1244         dst_buf->flags &= ~(V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_LAST);
1245         dst_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
1246         dst_buf->flags |= src_buf->flags & V4L2_BUF_FLAG_LAST;
1247
1248         v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, false);
1249
1250         v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1251         coda_m2m_buf_done(ctx, dst_buf, err_mb ? VB2_BUF_STATE_ERROR :
1252                                                  VB2_BUF_STATE_DONE);
1253         mutex_unlock(&ctx->wakeup_mutex);
1254
1255         coda_dbg(1, ctx, "job finished: encoded frame (%u)%s\n",
1256                  dst_buf->sequence,
1257                  (dst_buf->flags & V4L2_BUF_FLAG_LAST) ? " (last)" : "");
1258
1259         /*
1260          * Reset JPEG processing unit after each encode run to work
1261          * around hangups when switching context between encoder and
1262          * decoder.
1263          */
1264         coda_hw_reset(ctx);
1265 }
1266
1267 static void coda9_jpeg_encode_timeout(struct coda_ctx *ctx)
1268 {
1269         struct coda_dev *dev = ctx->dev;
1270         u32 end_addr, wr_ptr;
1271
1272         /* Handle missing BBC overflow interrupt via timeout */
1273         end_addr = coda_read(dev, CODA9_REG_JPEG_BBC_END_ADDR);
1274         wr_ptr = coda_read(dev, CODA9_REG_JPEG_BBC_WR_PTR);
1275         if (wr_ptr >= end_addr - 256) {
1276                 v4l2_err(&dev->v4l2_dev, "JPEG too large for capture buffer\n");
1277                 coda9_jpeg_finish_encode(ctx);
1278                 return;
1279         }
1280
1281         coda_hw_reset(ctx);
1282 }
1283
1284 static void coda9_jpeg_release(struct coda_ctx *ctx)
1285 {
1286         int i;
1287
1288         if (ctx->params.jpeg_qmat_tab[0] == luma_q)
1289                 ctx->params.jpeg_qmat_tab[0] = NULL;
1290         if (ctx->params.jpeg_qmat_tab[1] == chroma_q)
1291                 ctx->params.jpeg_qmat_tab[1] = NULL;
1292         for (i = 0; i < 3; i++)
1293                 kfree(ctx->params.jpeg_qmat_tab[i]);
1294         kfree(ctx->params.jpeg_huff_data);
1295         kfree(ctx->params.jpeg_huff_tab);
1296 }
1297
1298 const struct coda_context_ops coda9_jpeg_encode_ops = {
1299         .queue_init = coda_encoder_queue_init,
1300         .start_streaming = coda9_jpeg_start_encoding,
1301         .prepare_run = coda9_jpeg_prepare_encode,
1302         .finish_run = coda9_jpeg_finish_encode,
1303         .run_timeout = coda9_jpeg_encode_timeout,
1304         .release = coda9_jpeg_release,
1305 };
1306
1307 /*
1308  * Decoder context operations
1309  */
1310
1311 static int coda9_jpeg_start_decoding(struct coda_ctx *ctx)
1312 {
1313         ctx->params.jpeg_qmat_index[0] = 0;
1314         ctx->params.jpeg_qmat_index[1] = 1;
1315         ctx->params.jpeg_qmat_index[2] = 1;
1316         ctx->params.jpeg_qmat_tab[0] = luma_q;
1317         ctx->params.jpeg_qmat_tab[1] = chroma_q;
1318         /* nothing more to do here */
1319
1320         /* TODO: we could already scan the first header to get the chroma
1321          * format.
1322          */
1323
1324         return 0;
1325 }
1326
1327 static int coda9_jpeg_prepare_decode(struct coda_ctx *ctx)
1328 {
1329         struct coda_dev *dev = ctx->dev;
1330         int aligned_width, aligned_height;
1331         int chroma_format;
1332         int ret;
1333         u32 val, dst_fourcc;
1334         struct coda_q_data *q_data_src, *q_data_dst;
1335         struct vb2_v4l2_buffer *src_buf, *dst_buf;
1336         int chroma_interleave;
1337         int scl_hor_mode, scl_ver_mode;
1338
1339         src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1340         dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1341         q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1342         q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1343         dst_fourcc = q_data_dst->fourcc;
1344
1345         scl_hor_mode = coda_jpeg_scale(q_data_src->width, q_data_dst->width);
1346         scl_ver_mode = coda_jpeg_scale(q_data_src->height, q_data_dst->height);
1347
1348         if (vb2_get_plane_payload(&src_buf->vb2_buf, 0) == 0)
1349                 vb2_set_plane_payload(&src_buf->vb2_buf, 0,
1350                                       vb2_plane_size(&src_buf->vb2_buf, 0));
1351
1352         chroma_format = coda9_jpeg_chroma_format(q_data_dst->fourcc);
1353         if (chroma_format < 0)
1354                 return chroma_format;
1355
1356         ret = coda_jpeg_decode_header(ctx, &src_buf->vb2_buf);
1357         if (ret < 0) {
1358                 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1359                 dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1360                 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1361                 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1362
1363                 return ret;
1364         }
1365
1366         /* Round image dimensions to multiple of MCU size */
1367         aligned_width = round_up(q_data_src->width, width_align[chroma_format]);
1368         aligned_height = round_up(q_data_src->height, height_align[chroma_format]);
1369         if (aligned_width != q_data_dst->bytesperline) {
1370                 v4l2_err(&dev->v4l2_dev, "stride mismatch: %d != %d\n",
1371                          aligned_width, q_data_dst->bytesperline);
1372         }
1373
1374         coda_set_gdi_regs(ctx);
1375
1376         val = ctx->params.jpeg_huff_ac_index[0] << 12 |
1377               ctx->params.jpeg_huff_ac_index[1] << 11 |
1378               ctx->params.jpeg_huff_ac_index[2] << 10 |
1379               ctx->params.jpeg_huff_dc_index[0] << 9 |
1380               ctx->params.jpeg_huff_dc_index[1] << 8 |
1381               ctx->params.jpeg_huff_dc_index[2] << 7;
1382         if (ctx->params.jpeg_huff_tab)
1383                 val |= CODA9_JPEG_PIC_CTRL_USER_HUFFMAN_EN;
1384         coda_write(dev, val, CODA9_REG_JPEG_PIC_CTRL);
1385
1386         coda_write(dev, aligned_width << 16 | aligned_height,
1387                         CODA9_REG_JPEG_PIC_SIZE);
1388
1389         chroma_interleave = (dst_fourcc == V4L2_PIX_FMT_NV12);
1390         coda_write(dev, 0, CODA9_REG_JPEG_ROT_INFO);
1391         coda_write(dev, bus_req_num[chroma_format], CODA9_REG_JPEG_OP_INFO);
1392         coda_write(dev, mcu_info[chroma_format], CODA9_REG_JPEG_MCU_INFO);
1393         if (scl_hor_mode || scl_ver_mode)
1394                 val = CODA9_JPEG_SCL_ENABLE | (scl_hor_mode << 2) | scl_ver_mode;
1395         else
1396                 val = 0;
1397         coda_write(dev, val, CODA9_REG_JPEG_SCL_INFO);
1398         coda_write(dev, chroma_interleave, CODA9_REG_JPEG_DPB_CONFIG);
1399         coda_write(dev, ctx->params.jpeg_restart_interval,
1400                         CODA9_REG_JPEG_RST_INTVAL);
1401
1402         if (ctx->params.jpeg_huff_tab)
1403                 coda9_jpeg_dec_huff_setup(ctx);
1404
1405         coda9_jpeg_qmat_setup(ctx);
1406
1407         coda9_jpeg_dec_bbc_gbu_setup(ctx, &src_buf->vb2_buf,
1408                                      ctx->jpeg_ecs_offset);
1409
1410         coda_write(dev, 0, CODA9_REG_JPEG_RST_INDEX);
1411         coda_write(dev, 0, CODA9_REG_JPEG_RST_COUNT);
1412
1413         coda_write(dev, 0, CODA9_REG_JPEG_DPCM_DIFF_Y);
1414         coda_write(dev, 0, CODA9_REG_JPEG_DPCM_DIFF_CB);
1415         coda_write(dev, 0, CODA9_REG_JPEG_DPCM_DIFF_CR);
1416
1417         coda_write(dev, 0, CODA9_REG_JPEG_ROT_INFO);
1418
1419         coda_write(dev, 1, CODA9_GDI_CONTROL);
1420         do {
1421                 ret = coda_read(dev, CODA9_GDI_STATUS);
1422         } while (!ret);
1423
1424         val = (chroma_format << 17) | (chroma_interleave << 16) |
1425               q_data_dst->bytesperline;
1426         if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP)
1427                 val |= 3 << 20;
1428         coda_write(dev, val, CODA9_GDI_INFO_CONTROL);
1429
1430         coda_write(dev, aligned_width << 16 | aligned_height,
1431                         CODA9_GDI_INFO_PIC_SIZE);
1432
1433         coda_write_base(ctx, q_data_dst, dst_buf, CODA9_GDI_INFO_BASE_Y);
1434
1435         coda_write(dev, 0, CODA9_REG_JPEG_DPB_BASE00);
1436         coda_write(dev, 0, CODA9_GDI_CONTROL);
1437         coda_write(dev, 1, CODA9_GDI_PIC_INIT_HOST);
1438
1439         trace_coda_jpeg_run(ctx, src_buf);
1440
1441         coda_write(dev, 1, CODA9_REG_JPEG_PIC_START);
1442
1443         return 0;
1444 }
1445
1446 static void coda9_jpeg_finish_decode(struct coda_ctx *ctx)
1447 {
1448         struct coda_dev *dev = ctx->dev;
1449         struct vb2_v4l2_buffer *dst_buf, *src_buf;
1450         struct coda_q_data *q_data_dst;
1451         u32 err_mb;
1452
1453         err_mb = coda_read(dev, CODA9_REG_JPEG_PIC_ERRMB);
1454         if (err_mb)
1455                 v4l2_err(&dev->v4l2_dev, "ERRMB: 0x%x\n", err_mb);
1456
1457         coda_write(dev, 0, CODA9_REG_JPEG_BBC_FLUSH_CMD);
1458
1459         /*
1460          * Lock to make sure that a decoder stop command running in parallel
1461          * will either already have marked src_buf as last, or it will wake up
1462          * the capture queue after the buffers are returned.
1463          */
1464         mutex_lock(&ctx->wakeup_mutex);
1465         src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1466         dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1467         dst_buf->sequence = ctx->osequence++;
1468
1469         trace_coda_jpeg_done(ctx, dst_buf);
1470
1471         dst_buf->flags &= ~(V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_LAST);
1472         dst_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
1473         dst_buf->flags |= src_buf->flags & V4L2_BUF_FLAG_LAST;
1474
1475         v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, false);
1476
1477         q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1478         vb2_set_plane_payload(&dst_buf->vb2_buf, 0, q_data_dst->sizeimage);
1479
1480         v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1481         coda_m2m_buf_done(ctx, dst_buf, err_mb ? VB2_BUF_STATE_ERROR :
1482                                                  VB2_BUF_STATE_DONE);
1483
1484         mutex_unlock(&ctx->wakeup_mutex);
1485
1486         coda_dbg(1, ctx, "job finished: decoded frame (%u)%s\n",
1487                  dst_buf->sequence,
1488                  (dst_buf->flags & V4L2_BUF_FLAG_LAST) ? " (last)" : "");
1489
1490         /*
1491          * Reset JPEG processing unit after each decode run to work
1492          * around hangups when switching context between encoder and
1493          * decoder.
1494          */
1495         coda_hw_reset(ctx);
1496 }
1497
1498 const struct coda_context_ops coda9_jpeg_decode_ops = {
1499         .queue_init = coda_encoder_queue_init, /* non-bitstream operation */
1500         .start_streaming = coda9_jpeg_start_decoding,
1501         .prepare_run = coda9_jpeg_prepare_decode,
1502         .finish_run = coda9_jpeg_finish_decode,
1503         .release = coda9_jpeg_release,
1504 };
1505
1506 irqreturn_t coda9_jpeg_irq_handler(int irq, void *data)
1507 {
1508         struct coda_dev *dev = data;
1509         struct coda_ctx *ctx;
1510         int status;
1511         int err_mb;
1512
1513         status = coda_read(dev, CODA9_REG_JPEG_PIC_STATUS);
1514         if (status == 0)
1515                 return IRQ_HANDLED;
1516         coda_write(dev, status, CODA9_REG_JPEG_PIC_STATUS);
1517
1518         if (status & CODA9_JPEG_STATUS_OVERFLOW)
1519                 v4l2_err(&dev->v4l2_dev, "JPEG overflow\n");
1520
1521         if (status & CODA9_JPEG_STATUS_BBC_INT)
1522                 v4l2_err(&dev->v4l2_dev, "JPEG BBC interrupt\n");
1523
1524         if (status & CODA9_JPEG_STATUS_ERROR) {
1525                 v4l2_err(&dev->v4l2_dev, "JPEG error\n");
1526
1527                 err_mb = coda_read(dev, CODA9_REG_JPEG_PIC_ERRMB);
1528                 if (err_mb) {
1529                         v4l2_err(&dev->v4l2_dev,
1530                                  "ERRMB: 0x%x: rst idx %d, mcu pos (%d,%d)\n",
1531                                  err_mb, err_mb >> 24, (err_mb >> 12) & 0xfff,
1532                                  err_mb & 0xfff);
1533                 }
1534         }
1535
1536         ctx = v4l2_m2m_get_curr_priv(dev->m2m_dev);
1537         if (!ctx) {
1538                 v4l2_err(&dev->v4l2_dev,
1539                          "Instance released before the end of transaction\n");
1540                 mutex_unlock(&dev->coda_mutex);
1541                 return IRQ_HANDLED;
1542         }
1543
1544         complete(&ctx->completion);
1545
1546         return IRQ_HANDLED;
1547 }