4a1271fa05263b7789e76d27c5bdc452952e8629
[firefly-linux-kernel-4.4.55.git] / drivers / media / platform / rockchip-vpu / rk3288_vpu_hw_vp8e.c
1 /*
2  * Rockchip RK3288 VPU codec driver
3  *
4  * Copyright (C) 2014 Rockchip Electronics Co., Ltd.
5  *      Alpha Lin <Alpha.Lin@rock-chips.com>
6  *      Jeffy Chen <jeffy.chen@rock-chips.com>
7  *
8  * Copyright (C) 2014 Google, Inc.
9  *      Tomasz Figa <tfiga@chromium.org>
10  *
11  * This software is licensed under the terms of the GNU General Public
12  * License version 2, as published by the Free Software Foundation, and
13  * may be copied, distributed, and modified under those terms.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  */
20
21 #include "rockchip_vpu_common.h"
22
23 #include <linux/types.h>
24 #include <linux/sort.h>
25
26 #include "rk3288_vpu_regs.h"
27 #include "rockchip_vpu_hw.h"
28
29 /* Various parameters specific to VP8 encoder. */
30 #define VP8_CABAC_CTX_OFFSET                    192
31 #define VP8_CABAC_CTX_SIZE                      ((55 + 96) << 3)
32
33 #define VP8_KEY_FRAME_HDR_SIZE                  10
34 #define VP8_INTER_FRAME_HDR_SIZE                3
35
36 #define VP8_FRAME_TAG_KEY_FRAME_BIT             BIT(0)
37 #define VP8_FRAME_TAG_LENGTH_SHIFT              5
38 #define VP8_FRAME_TAG_LENGTH_MASK               (0x7ffff << 5)
39
40 /**
41  * struct rk3288_vpu_vp8e_ctrl_buf - hardware control buffer layout
42  * @ext_hdr_size:       Ext header size in bytes (written by hardware).
43  * @dct_size:           DCT partition size (written by hardware).
44  * @rsvd:               Reserved for hardware.
45  */
46 struct rk3288_vpu_vp8e_ctrl_buf {
47         u32 ext_hdr_size;
48         u32 dct_size;
49         u8 rsvd[1016];
50 };
51
52 /*
53  * The hardware takes care only of ext hdr and dct partition. The software
54  * must take care of frame header.
55  *
56  * Buffer layout as received from hardware:
57  *   |<--gap-->|<--ext hdr-->|<-gap->|<---dct part---
58  *   |<-------dct part offset------->|
59  *
60  * Required buffer layout:
61  *   |<--hdr-->|<--ext hdr-->|<---dct part---
62  */
63 void rk3288_vpu_vp8e_assemble_bitstream(struct rk3288_vpu_ctx *ctx,
64                                         struct rk3288_vpu_buf *dst_buf)
65 {
66         struct vb2_v4l2_buffer *vb2_dst = to_vb2_v4l2_buffer(&dst_buf->vb.vb2_buf);
67         size_t ext_hdr_size = dst_buf->vp8e.ext_hdr_size;
68         size_t dct_size = dst_buf->vp8e.dct_size;
69         size_t hdr_size = dst_buf->vp8e.hdr_size;
70         size_t dst_size;
71         size_t tag_size;
72         void *dst;
73         u32 *tag;
74
75         dst_size = vb2_plane_size(&dst_buf->vb.vb2_buf, 0);
76         dst = vb2_plane_vaddr(&dst_buf->vb.vb2_buf, 0);
77         tag = dst; /* To access frame tag words. */
78
79         if (WARN_ON(hdr_size + ext_hdr_size + dct_size > dst_size))
80                 return;
81         if (WARN_ON(dst_buf->vp8e.dct_offset + dct_size > dst_size))
82                 return;
83
84         memmove(dst + hdr_size + ext_hdr_size,
85                 dst + dst_buf->vp8e.dct_offset, dct_size);
86         memcpy(dst, dst_buf->vp8e.header, hdr_size);
87
88         /* Patch frame tag at first 32-bit word of the frame. */
89         if (vb2_dst->flags & V4L2_BUF_FLAG_KEYFRAME) {
90                 tag_size = VP8_KEY_FRAME_HDR_SIZE;
91                 tag[0] &= ~VP8_FRAME_TAG_KEY_FRAME_BIT;
92         } else {
93                 tag_size = VP8_INTER_FRAME_HDR_SIZE;
94                 tag[0] |= VP8_FRAME_TAG_KEY_FRAME_BIT;
95         }
96
97         tag[0] &= ~VP8_FRAME_TAG_LENGTH_MASK;
98         tag[0] |= (hdr_size + ext_hdr_size - tag_size)
99                                                 << VP8_FRAME_TAG_LENGTH_SHIFT;
100
101         vb2_set_plane_payload(&dst_buf->vb.vb2_buf, 0,
102                                 hdr_size + ext_hdr_size + dct_size);
103 }
104
105 static inline unsigned int ref_luma_size(unsigned int w, unsigned int h)
106 {
107         return round_up(w, MB_DIM) * round_up(h, MB_DIM);
108 }
109
110 int rk3288_vpu_vp8e_init(struct rk3288_vpu_ctx *ctx)
111 {
112         struct rk3288_vpu_dev *vpu = ctx->dev;
113         size_t height = ctx->src_fmt.height;
114         size_t width = ctx->src_fmt.width;
115         size_t ref_buf_size;
116         size_t mv_size;
117         int ret;
118
119         ret = rk3288_vpu_aux_buf_alloc(vpu, &ctx->hw.vp8e.ctrl_buf,
120                                 sizeof(struct rk3288_vpu_vp8e_ctrl_buf));
121         if (ret) {
122                 vpu_err("failed to allocate ctrl buffer\n");
123                 return ret;
124         }
125
126         mv_size = DIV_ROUND_UP(width, 16) * DIV_ROUND_UP(height, 16) / 4;
127         ret = rk3288_vpu_aux_buf_alloc(vpu, &ctx->hw.vp8e.mv_buf, mv_size);
128         if (ret) {
129                 vpu_err("failed to allocate MV buffer\n");
130                 goto err_ctrl_buf;
131         }
132
133         ref_buf_size = ref_luma_size(width, height) * 3 / 2;
134         ret = rk3288_vpu_aux_buf_alloc(vpu, &ctx->hw.vp8e.ext_buf,
135                                         2 * ref_buf_size);
136         if (ret) {
137                 vpu_err("failed to allocate ext buffer\n");
138                 goto err_mv_buf;
139         }
140
141         return 0;
142
143 err_mv_buf:
144         rk3288_vpu_aux_buf_free(vpu, &ctx->hw.vp8e.mv_buf);
145 err_ctrl_buf:
146         rk3288_vpu_aux_buf_free(vpu, &ctx->hw.vp8e.ctrl_buf);
147
148         return ret;
149 }
150
151 void rk3288_vpu_vp8e_exit(struct rk3288_vpu_ctx *ctx)
152 {
153         struct rk3288_vpu_dev *vpu = ctx->dev;
154
155         rk3288_vpu_aux_buf_free(vpu, &ctx->hw.vp8e.ext_buf);
156         rk3288_vpu_aux_buf_free(vpu, &ctx->hw.vp8e.mv_buf);
157         rk3288_vpu_aux_buf_free(vpu, &ctx->hw.vp8e.ctrl_buf);
158 }
159
160 static inline u32 enc_in_img_ctrl(struct rk3288_vpu_ctx *ctx)
161 {
162         struct v4l2_pix_format_mplane *pix_fmt = &ctx->src_fmt;
163         struct v4l2_rect *crop = &ctx->src_crop;
164         unsigned bytes_per_line, overfill_r, overfill_b;
165
166         /*
167          * The hardware needs only the value for luma plane, because
168          * values of other planes are calculated internally based on
169          * format setting.
170          */
171         bytes_per_line = pix_fmt->plane_fmt[0].bytesperline;
172         overfill_r = (pix_fmt->width - crop->width) / 4;
173         overfill_b = pix_fmt->height - crop->height;
174
175         return VEPU_REG_IN_IMG_CTRL_ROW_LEN(bytes_per_line)
176                         | VEPU_REG_IN_IMG_CTRL_OVRFLR_D4(overfill_r)
177                         | VEPU_REG_IN_IMG_CTRL_OVRFLB_D4(overfill_b)
178                         | VEPU_REG_IN_IMG_CTRL_FMT(ctx->vpu_src_fmt->enc_fmt);
179 }
180
181 static void rk3288_vpu_vp8e_set_buffers(struct rk3288_vpu_dev *vpu,
182                                         struct rk3288_vpu_ctx *ctx)
183 {
184         struct vb2_v4l2_buffer *vb2_dst = to_vb2_v4l2_buffer(&ctx->run.dst->vb.vb2_buf);
185         const struct rk3288_vp8e_reg_params *params = ctx->run.vp8e.reg_params;
186         dma_addr_t ref_buf_dma, rec_buf_dma;
187         dma_addr_t stream_dma;
188         size_t rounded_size;
189         dma_addr_t dst_dma;
190         u32 start_offset;
191         size_t dst_size;
192
193         rounded_size = ref_luma_size(ctx->src_fmt.width,
194                                                 ctx->src_fmt.height);
195
196         ref_buf_dma = rec_buf_dma = ctx->hw.vp8e.ext_buf.dma;
197         if (ctx->hw.vp8e.ref_rec_ptr)
198                 ref_buf_dma += rounded_size * 3 / 2;
199         else
200                 rec_buf_dma += rounded_size * 3 / 2;
201         ctx->hw.vp8e.ref_rec_ptr ^= 1;
202
203         if (rk3288_vpu_ctx_is_dummy_encode(ctx)) {
204                 dst_dma = vpu->dummy_encode_dst.dma;
205                 dst_size = vpu->dummy_encode_dst.size;
206         } else {
207                 dst_dma = vb2_dma_contig_plane_dma_addr(&ctx->run.dst->vb.vb2_buf, 0);
208                 dst_size = vb2_plane_size(&ctx->run.dst->vb.vb2_buf, 0);
209         }
210
211         /*
212          * stream addr-->|
213          * align 64bits->|<-start offset->|
214          * |<---------header size-------->|<---dst buf---
215          */
216         start_offset = (params->rlc_ctrl & VEPU_REG_RLC_CTRL_STR_OFFS_MASK)
217                                         >> VEPU_REG_RLC_CTRL_STR_OFFS_SHIFT;
218         stream_dma = dst_dma + params->hdr_len;
219
220         /**
221          * Userspace will pass 8 bytes aligned size(round_down) to us,
222          * so we need to plus start offset to get real header size.
223          *
224          * |<-aligned size->|<-start offset->|
225          * |<----------header size---------->|
226          */
227         ctx->run.dst->vp8e.hdr_size = params->hdr_len + (start_offset >> 3);
228
229         if (params->enc_ctrl & VEPU_REG_ENC_CTRL_KEYFRAME_BIT)
230                 vb2_dst->flags |= V4L2_BUF_FLAG_KEYFRAME;
231         else
232                 vb2_dst->flags &= ~V4L2_BUF_FLAG_KEYFRAME;
233
234         /*
235          * We assume here that 1/10 of the buffer is enough for headers.
236          * DCT partition will be placed in remaining 9/10 of the buffer.
237          */
238         ctx->run.dst->vp8e.dct_offset = round_up(dst_size / 10, 8);
239
240         /* Destination buffer. */
241         vepu_write_relaxed(vpu, stream_dma, VEPU_REG_ADDR_OUTPUT_STREAM);
242         vepu_write_relaxed(vpu, dst_dma + ctx->run.dst->vp8e.dct_offset,
243                                 VEPU_REG_ADDR_VP8_DCT_PART(0));
244         vepu_write_relaxed(vpu, dst_size - ctx->run.dst->vp8e.dct_offset,
245                                 VEPU_REG_STR_BUF_LIMIT);
246
247         /* Auxilliary buffers. */
248         vepu_write_relaxed(vpu, ctx->hw.vp8e.ctrl_buf.dma,
249                                 VEPU_REG_ADDR_OUTPUT_CTRL);
250         vepu_write_relaxed(vpu, ctx->hw.vp8e.mv_buf.dma,
251                                 VEPU_REG_ADDR_MV_OUT);
252         vepu_write_relaxed(vpu, ctx->run.priv_dst.dma,
253                                 VEPU_REG_ADDR_VP8_PROB_CNT);
254         vepu_write_relaxed(vpu, ctx->run.priv_src.dma + VP8_CABAC_CTX_OFFSET,
255                                 VEPU_REG_ADDR_CABAC_TBL);
256         vepu_write_relaxed(vpu, ctx->run.priv_src.dma
257                                 + VP8_CABAC_CTX_OFFSET + VP8_CABAC_CTX_SIZE,
258                                 VEPU_REG_ADDR_VP8_SEG_MAP);
259
260         /* Reference buffers. */
261         vepu_write_relaxed(vpu, ref_buf_dma,
262                                 VEPU_REG_ADDR_REF_LUMA);
263         vepu_write_relaxed(vpu, ref_buf_dma + rounded_size,
264                                 VEPU_REG_ADDR_REF_CHROMA);
265
266         /* Reconstruction buffers. */
267         vepu_write_relaxed(vpu, rec_buf_dma,
268                                 VEPU_REG_ADDR_REC_LUMA);
269         vepu_write_relaxed(vpu, rec_buf_dma + rounded_size,
270                                 VEPU_REG_ADDR_REC_CHROMA);
271
272         /* Source buffer. */
273         if (rk3288_vpu_ctx_is_dummy_encode(ctx)) {
274                 vepu_write_relaxed(vpu, vpu->dummy_encode_src[PLANE_Y].dma,
275                                         VEPU_REG_ADDR_IN_LUMA);
276                 vepu_write_relaxed(vpu, vpu->dummy_encode_src[PLANE_CB].dma,
277                                         VEPU_REG_ADDR_IN_CB);
278                 vepu_write_relaxed(vpu, vpu->dummy_encode_src[PLANE_CR].dma,
279                                         VEPU_REG_ADDR_IN_CR);
280         } else {
281                 vepu_write_relaxed(vpu, vb2_dma_contig_plane_dma_addr(
282                                         &ctx->run.src->vb.vb2_buf, PLANE_Y),
283                                         VEPU_REG_ADDR_IN_LUMA);
284                 vepu_write_relaxed(vpu, vb2_dma_contig_plane_dma_addr(
285                                         &ctx->run.src->vb.vb2_buf, PLANE_CB),
286                                         VEPU_REG_ADDR_IN_CB);
287                 vepu_write_relaxed(vpu, vb2_dma_contig_plane_dma_addr(
288                                         &ctx->run.src->vb.vb2_buf, PLANE_CR),
289                                         VEPU_REG_ADDR_IN_CR);
290         }
291
292         /* Source parameters. */
293         vepu_write_relaxed(vpu, enc_in_img_ctrl(ctx), VEPU_REG_IN_IMG_CTRL);
294 }
295
296 static void rk3288_vpu_vp8e_set_params(struct rk3288_vpu_dev *vpu,
297                                        struct rk3288_vpu_ctx *ctx)
298 {
299         const struct rk3288_vp8e_reg_params *params = ctx->run.vp8e.reg_params;
300         int i;
301
302         vepu_write_relaxed(vpu, params->enc_ctrl0, VEPU_REG_ENC_CTRL0);
303         vepu_write_relaxed(vpu, params->enc_ctrl1, VEPU_REG_ENC_CTRL1);
304         vepu_write_relaxed(vpu, params->enc_ctrl2, VEPU_REG_ENC_CTRL2);
305         vepu_write_relaxed(vpu, params->enc_ctrl3, VEPU_REG_ENC_CTRL3);
306         vepu_write_relaxed(vpu, params->enc_ctrl5, VEPU_REG_ENC_CTRL5);
307         vepu_write_relaxed(vpu, params->enc_ctrl4, VEPU_REG_ENC_CTRL4);
308         vepu_write_relaxed(vpu, params->str_hdr_rem_msb,
309                                 VEPU_REG_STR_HDR_REM_MSB);
310         vepu_write_relaxed(vpu, params->str_hdr_rem_lsb,
311                                 VEPU_REG_STR_HDR_REM_LSB);
312         vepu_write_relaxed(vpu, params->mad_ctrl, VEPU_REG_MAD_CTRL);
313
314         for (i = 0; i < ARRAY_SIZE(params->qp_val); ++i)
315                 vepu_write_relaxed(vpu, params->qp_val[i],
316                                         VEPU_REG_VP8_QP_VAL(i));
317
318         vepu_write_relaxed(vpu, params->bool_enc, VEPU_REG_VP8_BOOL_ENC);
319         vepu_write_relaxed(vpu, params->vp8_ctrl0, VEPU_REG_VP8_CTRL0);
320         vepu_write_relaxed(vpu, params->rlc_ctrl, VEPU_REG_RLC_CTRL);
321         vepu_write_relaxed(vpu, params->mb_ctrl, VEPU_REG_MB_CTRL);
322
323         for (i = 0; i < ARRAY_SIZE(params->rgb_yuv_coeff); ++i)
324                 vepu_write_relaxed(vpu, params->rgb_yuv_coeff[i],
325                                         VEPU_REG_RGB_YUV_COEFF(i));
326
327         vepu_write_relaxed(vpu, params->rgb_mask_msb,
328                                 VEPU_REG_RGB_MASK_MSB);
329         vepu_write_relaxed(vpu, params->intra_area_ctrl,
330                                 VEPU_REG_INTRA_AREA_CTRL);
331         vepu_write_relaxed(vpu, params->cir_intra_ctrl,
332                                 VEPU_REG_CIR_INTRA_CTRL);
333         vepu_write_relaxed(vpu, params->first_roi_area,
334                                 VEPU_REG_FIRST_ROI_AREA);
335         vepu_write_relaxed(vpu, params->second_roi_area,
336                                 VEPU_REG_SECOND_ROI_AREA);
337         vepu_write_relaxed(vpu, params->mvc_ctrl,
338                                 VEPU_REG_MVC_CTRL);
339
340         for (i = 0; i < ARRAY_SIZE(params->intra_penalty); ++i)
341                 vepu_write_relaxed(vpu, params->intra_penalty[i],
342                                         VEPU_REG_VP8_INTRA_PENALTY(i));
343
344         for (i = 0; i < ARRAY_SIZE(params->seg_qp); ++i)
345                 vepu_write_relaxed(vpu, params->seg_qp[i],
346                                         VEPU_REG_VP8_SEG_QP(i));
347
348         for (i = 0; i < ARRAY_SIZE(params->dmv_4p_1p_penalty); ++i)
349                 vepu_write_relaxed(vpu, params->dmv_4p_1p_penalty[i],
350                                         VEPU_REG_DMV_4P_1P_PENALTY(i));
351
352         for (i = 0; i < ARRAY_SIZE(params->dmv_qpel_penalty); ++i)
353                 vepu_write_relaxed(vpu, params->dmv_qpel_penalty[i],
354                                         VEPU_REG_DMV_QPEL_PENALTY(i));
355
356         vepu_write_relaxed(vpu, params->vp8_ctrl1, VEPU_REG_VP8_CTRL1);
357         vepu_write_relaxed(vpu, params->bit_cost_golden,
358                                 VEPU_REG_VP8_BIT_COST_GOLDEN);
359
360         for (i = 0; i < ARRAY_SIZE(params->loop_flt_delta); ++i)
361                 vepu_write_relaxed(vpu, params->loop_flt_delta[i],
362                                         VEPU_REG_VP8_LOOP_FLT_DELTA(i));
363 }
364
365 void rk3288_vpu_vp8e_run(struct rk3288_vpu_ctx *ctx)
366 {
367         struct vb2_v4l2_buffer *vb2_dst = to_vb2_v4l2_buffer(&ctx->run.dst->vb.vb2_buf);
368         struct rk3288_vpu_dev *vpu = ctx->dev;
369         u32 reg;
370
371         /* The hardware expects the control buffer to be zeroed. */
372         memset(ctx->hw.vp8e.ctrl_buf.cpu, 0,
373                 sizeof(struct rk3288_vpu_vp8e_ctrl_buf));
374
375         /*
376          * Program the hardware.
377          */
378         rk3288_vpu_power_on(vpu);
379
380         vepu_write_relaxed(vpu, VEPU_REG_ENC_CTRL_ENC_MODE_VP8,
381                                 VEPU_REG_ENC_CTRL);
382
383         rk3288_vpu_vp8e_set_params(vpu, ctx);
384         rk3288_vpu_vp8e_set_buffers(vpu, ctx);
385
386         /* Make sure that all registers are written at this point. */
387         wmb();
388
389         /* Set the watchdog. */
390         schedule_delayed_work(&vpu->watchdog_work, msecs_to_jiffies(2000));
391
392         /* Start the hardware. */
393         reg = VEPU_REG_AXI_CTRL_OUTPUT_SWAP16
394                 | VEPU_REG_AXI_CTRL_INPUT_SWAP16
395                 | VEPU_REG_AXI_CTRL_BURST_LEN(16)
396                 | VEPU_REG_AXI_CTRL_GATE_BIT
397                 | VEPU_REG_AXI_CTRL_OUTPUT_SWAP32
398                 | VEPU_REG_AXI_CTRL_INPUT_SWAP32
399                 | VEPU_REG_AXI_CTRL_OUTPUT_SWAP8
400                 | VEPU_REG_AXI_CTRL_INPUT_SWAP8;
401         vepu_write(vpu, reg, VEPU_REG_AXI_CTRL);
402
403         vepu_write(vpu, 0, VEPU_REG_INTERRUPT);
404
405         reg = VEPU_REG_ENC_CTRL_NAL_MODE_BIT
406                 | VEPU_REG_ENC_CTRL_WIDTH(MB_WIDTH(ctx->src_fmt.width))
407                 | VEPU_REG_ENC_CTRL_HEIGHT(MB_HEIGHT(ctx->src_fmt.height))
408                 | VEPU_REG_ENC_CTRL_ENC_MODE_VP8
409                 | VEPU_REG_ENC_CTRL_EN_BIT;
410
411         if (vb2_dst->flags & V4L2_BUF_FLAG_KEYFRAME)
412                 reg |= VEPU_REG_ENC_CTRL_KEYFRAME_BIT;
413
414         vepu_write(vpu, reg, VEPU_REG_ENC_CTRL);
415 }
416
417 void rk3288_vpu_vp8e_done(struct rk3288_vpu_ctx *ctx,
418                           enum vb2_buffer_state result)
419 {
420         struct rk3288_vpu_vp8e_ctrl_buf *ctrl_buf = ctx->hw.vp8e.ctrl_buf.cpu;
421
422         /* Read length information of this run from utility buffer. */
423         ctx->run.dst->vp8e.ext_hdr_size = ctrl_buf->ext_hdr_size;
424         ctx->run.dst->vp8e.dct_size = ctrl_buf->dct_size;
425
426         rk3288_vpu_run_done(ctx, result);
427 }
428
429 /*
430  * WAR for encoder state corruption after decoding
431  */
432
433 static const struct rk3288_vp8e_reg_params dummy_encode_reg_params = {
434         /* 00000014 */ .hdr_len = 0x00000000,
435         /* 00000038 */ .enc_ctrl = VEPU_REG_ENC_CTRL_KEYFRAME_BIT,
436         /* 00000040 */ .enc_ctrl0 = 0x00000000,
437         /* 00000044 */ .enc_ctrl1 = 0x00000000,
438         /* 00000048 */ .enc_ctrl2 = 0x00040014,
439         /* 0000004c */ .enc_ctrl3 = 0x404083c0,
440         /* 00000050 */ .enc_ctrl5 = 0x01006bff,
441         /* 00000054 */ .enc_ctrl4 = 0x00000039,
442         /* 00000058 */ .str_hdr_rem_msb = 0x85848805,
443         /* 0000005c */ .str_hdr_rem_lsb = 0x02000000,
444         /* 00000064 */ .mad_ctrl = 0x00000000,
445         /* 0000006c */ .qp_val = {
446                 /* 0000006c */ 0x020213b1,
447                 /* 00000070 */ 0x02825249,
448                 /* 00000074 */ 0x048409d8,
449                 /* 00000078 */ 0x03834c30,
450                 /* 0000007c */ 0x020213b1,
451                 /* 00000080 */ 0x02825249,
452                 /* 00000084 */ 0x00340e0d,
453                 /* 00000088 */ 0x401c1a15,
454         },
455         /* 0000008c */ .bool_enc = 0x00018140,
456         /* 00000090 */ .vp8_ctrl0 = 0x000695c0,
457         /* 00000094 */ .rlc_ctrl = 0x14000000,
458         /* 00000098 */ .mb_ctrl = 0x00000000,
459         /* 000000d4 */ .rgb_yuv_coeff = {
460                 /* 000000d4 */ 0x962b4c85,
461                 /* 000000d8 */ 0x90901d50,
462         },
463         /* 000000dc */ .rgb_mask_msb = 0x0000b694,
464         /* 000000e0 */ .intra_area_ctrl = 0xffffffff,
465         /* 000000e4 */ .cir_intra_ctrl = 0x00000000,
466         /* 000000f0 */ .first_roi_area = 0xffffffff,
467         /* 000000f4 */ .second_roi_area = 0xffffffff,
468         /* 000000f8 */ .mvc_ctrl = 0x01780000,
469         /* 00000100 */ .intra_penalty = {
470                 /* 00000100 */ 0x00010005,
471                 /* 00000104 */ 0x00015011,
472                 /* 00000108 */ 0x0000c005,
473                 /* 0000010c */ 0x00016010,
474                 /* 00000110 */ 0x0001a018,
475                 /* 00000114 */ 0x00018015,
476                 /* 00000118 */ 0x0001d01a,
477         },
478         /* 00000120 */ .seg_qp = {
479                 /* 00000120 */ 0x020213b1,
480                 /* 00000124 */ 0x02825249,
481                 /* 00000128 */ 0x048409d8,
482                 /* 0000012c */ 0x03834c30,
483                 /* 00000130 */ 0x020213b1,
484                 /* 00000134 */ 0x02825249,
485                 /* 00000138 */ 0x00340e0d,
486                 /* 0000013c */ 0x341c1a15,
487                 /* 00000140 */ 0x020213b1,
488                 /* 00000144 */ 0x02825249,
489                 /* 00000148 */ 0x048409d8,
490                 /* 0000014c */ 0x03834c30,
491                 /* 00000150 */ 0x020213b1,
492                 /* 00000154 */ 0x02825249,
493                 /* 00000158 */ 0x00340e0d,
494                 /* 0000015c */ 0x341c1a15,
495                 /* 00000160 */ 0x020213b1,
496                 /* 00000164 */ 0x02825249,
497                 /* 00000168 */ 0x048409d8,
498                 /* 0000016c */ 0x03834c30,
499                 /* 00000170 */ 0x020213b1,
500                 /* 00000174 */ 0x02825249,
501                 /* 00000178 */ 0x00340e0d,
502                 /* 0000017c */ 0x341c1a15,
503         },
504         /* 00000180 */ .dmv_4p_1p_penalty = {
505                 /* 00000180 */ 0x00020406,
506                 /* 00000184 */ 0x080a0c0e,
507                 /* 00000188 */ 0x10121416,
508                 /* 0000018c */ 0x181a1c1e,
509                 /* 00000190 */ 0x20222426,
510                 /* 00000194 */ 0x282a2c2e,
511                 /* 00000198 */ 0x30323436,
512                 /* 0000019c */ 0x383a3c3e,
513                 /* 000001a0 */ 0x40424446,
514                 /* 000001a4 */ 0x484a4c4e,
515                 /* 000001a8 */ 0x50525456,
516                 /* 000001ac */ 0x585a5c5e,
517                 /* 000001b0 */ 0x60626466,
518                 /* 000001b4 */ 0x686a6c6e,
519                 /* 000001b8 */ 0x70727476,
520                 /* NOTE: Further 17 registers set to 0. */
521         },
522         /*
523          * NOTE: Following registers all set to 0:
524          * - dmv_qpel_penalty,
525          * - vp8_ctrl1,
526          * - bit_cost_golden,
527          * - loop_flt_delta.
528          */
529 };
530
531 const struct rk3288_vp8e_reg_params *rk3288_vpu_vp8e_get_dummy_params(void)
532 {
533         return &dummy_encode_reg_params;
534 }