1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2017 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka #define MODULE_TAG "HAL_JPEGD_VDPU1"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka #include <stdint.h>
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka #include "mpp_env.h"
24*437bfbebSnyanmisaka #include "mpp_mem.h"
25*437bfbebSnyanmisaka #include "mpp_debug.h"
26*437bfbebSnyanmisaka #include "mpp_frame.h"
27*437bfbebSnyanmisaka #include "mpp_common.h"
28*437bfbebSnyanmisaka
29*437bfbebSnyanmisaka #include "jpegd_syntax.h"
30*437bfbebSnyanmisaka #include "hal_jpegd_common.h"
31*437bfbebSnyanmisaka #include "hal_jpegd_vdpu1.h"
32*437bfbebSnyanmisaka #include "hal_jpegd_vdpu1_reg.h"
33*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
34*437bfbebSnyanmisaka
35*437bfbebSnyanmisaka static void
jpegd_write_code_word_number(JpegdHalCtx * ctx,JpegdSyntax * syntax)36*437bfbebSnyanmisaka jpegd_write_code_word_number(JpegdHalCtx *ctx, JpegdSyntax *syntax)
37*437bfbebSnyanmisaka {
38*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
39*437bfbebSnyanmisaka JpegdSyntax *s = syntax;
40*437bfbebSnyanmisaka AcTable *ac_ptr0 = NULL, *ac_ptr1 = NULL;
41*437bfbebSnyanmisaka DcTable *dc_ptr0 = NULL, *dc_ptr1 = NULL;
42*437bfbebSnyanmisaka
43*437bfbebSnyanmisaka JpegdIocRegInfo *info = (JpegdIocRegInfo *)ctx->regs;
44*437bfbebSnyanmisaka JpegRegSet *reg = &info->regs;
45*437bfbebSnyanmisaka
46*437bfbebSnyanmisaka /* first, select the table we'll use.
47*437bfbebSnyanmisaka * this trick is done because hardware always wants luma
48*437bfbebSnyanmisaka * table as AC hardware table 0.
49*437bfbebSnyanmisaka */
50*437bfbebSnyanmisaka if (s->ac_index[0] == HUFFMAN_TABLE_ID_ZERO) {
51*437bfbebSnyanmisaka /* Luma's AC uses Huffman table zero */
52*437bfbebSnyanmisaka ac_ptr0 = &(s->ac_table[HUFFMAN_TABLE_ID_ZERO]);
53*437bfbebSnyanmisaka ac_ptr1 = &(s->ac_table[HUFFMAN_TABLE_ID_ONE]);
54*437bfbebSnyanmisaka } else {
55*437bfbebSnyanmisaka ac_ptr0 = &(s->ac_table[HUFFMAN_TABLE_ID_ONE]);
56*437bfbebSnyanmisaka ac_ptr1 = &(s->ac_table[HUFFMAN_TABLE_ID_ZERO]);
57*437bfbebSnyanmisaka }
58*437bfbebSnyanmisaka
59*437bfbebSnyanmisaka /* write AC table 1 (luma) */
60*437bfbebSnyanmisaka reg->reg16.sw_ac1_code1_cnt = ac_ptr0->bits[0];
61*437bfbebSnyanmisaka reg->reg16.sw_ac1_code2_cnt = ac_ptr0->bits[1];
62*437bfbebSnyanmisaka reg->reg16.sw_ac1_code3_cnt = ac_ptr0->bits[2];
63*437bfbebSnyanmisaka reg->reg16.sw_ac1_code4_cnt = ac_ptr0->bits[3];
64*437bfbebSnyanmisaka reg->reg16.sw_ac1_code5_cnt = ac_ptr0->bits[4];
65*437bfbebSnyanmisaka reg->reg16.sw_ac1_code6_cnt = ac_ptr0->bits[5];
66*437bfbebSnyanmisaka
67*437bfbebSnyanmisaka reg->reg17.sw_ac1_code7_cnt = ac_ptr0->bits[6];
68*437bfbebSnyanmisaka reg->reg17.sw_ac1_code8_cnt = ac_ptr0->bits[7];
69*437bfbebSnyanmisaka reg->reg17.sw_ac1_code9_cnt = ac_ptr0->bits[8];
70*437bfbebSnyanmisaka reg->reg17.sw_ac1_code10_cnt = ac_ptr0->bits[9];
71*437bfbebSnyanmisaka
72*437bfbebSnyanmisaka reg->reg18.sw_ac1_code11_cnt = ac_ptr0->bits[10];
73*437bfbebSnyanmisaka reg->reg18.sw_ac1_code12_cnt = ac_ptr0->bits[11];
74*437bfbebSnyanmisaka reg->reg18.sw_ac1_code13_cnt = ac_ptr0->bits[12];
75*437bfbebSnyanmisaka reg->reg18.sw_ac1_code14_cnt = ac_ptr0->bits[13];
76*437bfbebSnyanmisaka
77*437bfbebSnyanmisaka reg->reg19.sw_ac1_code15_cnt = ac_ptr0->bits[14];
78*437bfbebSnyanmisaka reg->reg19.sw_ac1_code16_cnt = ac_ptr0->bits[15];
79*437bfbebSnyanmisaka
80*437bfbebSnyanmisaka /* table AC2 (the not-luma table) */
81*437bfbebSnyanmisaka reg->reg19.sw_ac2_code1_cnt = ac_ptr1->bits[0];
82*437bfbebSnyanmisaka reg->reg19.sw_ac2_code2_cnt = ac_ptr1->bits[1];
83*437bfbebSnyanmisaka reg->reg19.sw_ac2_code3_cnt = ac_ptr1->bits[2];
84*437bfbebSnyanmisaka reg->reg19.sw_ac2_code4_cnt = ac_ptr1->bits[3];
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka reg->reg20.sw_ac2_code5_cnt = ac_ptr1->bits[4];
87*437bfbebSnyanmisaka reg->reg20.sw_ac2_code6_cnt = ac_ptr1->bits[5];
88*437bfbebSnyanmisaka reg->reg20.sw_ac2_code7_cnt = ac_ptr1->bits[6];
89*437bfbebSnyanmisaka reg->reg20.sw_ac2_code8_cnt = ac_ptr1->bits[7];
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka reg->reg21.sw_ac2_code9_cnt = ac_ptr1->bits[8];
92*437bfbebSnyanmisaka reg->reg21.sw_ac2_code10_cnt = ac_ptr1->bits[9];
93*437bfbebSnyanmisaka reg->reg21.sw_ac2_code11_cnt = ac_ptr1->bits[10];
94*437bfbebSnyanmisaka reg->reg21.sw_ac2_code12_cnt = ac_ptr1->bits[11];
95*437bfbebSnyanmisaka
96*437bfbebSnyanmisaka reg->reg22.sw_ac2_code13_cnt = ac_ptr1->bits[12];
97*437bfbebSnyanmisaka reg->reg22.sw_ac2_code14_cnt = ac_ptr1->bits[13];
98*437bfbebSnyanmisaka reg->reg22.sw_ac2_code15_cnt = ac_ptr1->bits[14];
99*437bfbebSnyanmisaka reg->reg22.sw_ac2_code16_cnt = ac_ptr1->bits[15];
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka /* first, select the table we'll use.
102*437bfbebSnyanmisaka * this trick is done because hardware always wants luma
103*437bfbebSnyanmisaka * table as DC hardware table 0.
104*437bfbebSnyanmisaka */
105*437bfbebSnyanmisaka if (s->dc_index[0] == HUFFMAN_TABLE_ID_ZERO) {
106*437bfbebSnyanmisaka /* Luma's DC uses Huffman table zero */
107*437bfbebSnyanmisaka dc_ptr0 = &(s->dc_table[HUFFMAN_TABLE_ID_ZERO]);
108*437bfbebSnyanmisaka dc_ptr1 = &(s->dc_table[HUFFMAN_TABLE_ID_ONE]);
109*437bfbebSnyanmisaka } else {
110*437bfbebSnyanmisaka dc_ptr0 = &(s->dc_table[HUFFMAN_TABLE_ID_ONE]);
111*437bfbebSnyanmisaka dc_ptr1 = &(s->dc_table[HUFFMAN_TABLE_ID_ZERO]);
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka
114*437bfbebSnyanmisaka /* write DC table 1 (luma) */
115*437bfbebSnyanmisaka reg->reg23.sw_dc1_code1_cnt = dc_ptr0->bits[0];
116*437bfbebSnyanmisaka reg->reg23.sw_dc1_code2_cnt = dc_ptr0->bits[1];
117*437bfbebSnyanmisaka reg->reg23.sw_dc1_code3_cnt = dc_ptr0->bits[2];
118*437bfbebSnyanmisaka reg->reg23.sw_dc1_code4_cnt = dc_ptr0->bits[3];
119*437bfbebSnyanmisaka reg->reg23.sw_dc1_code5_cnt = dc_ptr0->bits[4];
120*437bfbebSnyanmisaka reg->reg23.sw_dc1_code6_cnt = dc_ptr0->bits[5];
121*437bfbebSnyanmisaka reg->reg23.sw_dc1_code7_cnt = dc_ptr0->bits[6];
122*437bfbebSnyanmisaka reg->reg23.sw_dc1_code8_cnt = dc_ptr0->bits[7];
123*437bfbebSnyanmisaka
124*437bfbebSnyanmisaka reg->reg24.sw_dc1_code9_cnt = dc_ptr0->bits[8];
125*437bfbebSnyanmisaka reg->reg24.sw_dc1_code10_cnt = dc_ptr0->bits[9];
126*437bfbebSnyanmisaka reg->reg24.sw_dc1_code11_cnt = dc_ptr0->bits[10];
127*437bfbebSnyanmisaka reg->reg24.sw_dc1_code12_cnt = dc_ptr0->bits[11];
128*437bfbebSnyanmisaka reg->reg24.sw_dc1_code13_cnt = dc_ptr0->bits[12];
129*437bfbebSnyanmisaka reg->reg24.sw_dc1_code14_cnt = dc_ptr0->bits[13];
130*437bfbebSnyanmisaka reg->reg24.sw_dc1_code15_cnt = dc_ptr0->bits[14];
131*437bfbebSnyanmisaka reg->reg24.sw_dc1_code16_cnt = dc_ptr0->bits[15];
132*437bfbebSnyanmisaka
133*437bfbebSnyanmisaka /* table DC2 (the not-luma table) */
134*437bfbebSnyanmisaka reg->reg25.sw_dc2_code1_cnt = dc_ptr1->bits[0];
135*437bfbebSnyanmisaka reg->reg25.sw_dc2_code2_cnt = dc_ptr1->bits[1];
136*437bfbebSnyanmisaka reg->reg25.sw_dc2_code3_cnt = dc_ptr1->bits[2];
137*437bfbebSnyanmisaka reg->reg25.sw_dc2_code4_cnt = dc_ptr1->bits[3];
138*437bfbebSnyanmisaka reg->reg25.sw_dc2_code5_cnt = dc_ptr1->bits[4];
139*437bfbebSnyanmisaka reg->reg25.sw_dc2_code6_cnt = dc_ptr1->bits[5];
140*437bfbebSnyanmisaka reg->reg25.sw_dc2_code7_cnt = dc_ptr1->bits[6];
141*437bfbebSnyanmisaka reg->reg25.sw_dc2_code8_cnt = dc_ptr1->bits[7];
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka reg->reg26.sw_dc2_code9_cnt = dc_ptr1->bits[8];
144*437bfbebSnyanmisaka reg->reg26.sw_dc2_code10_cnt = dc_ptr1->bits[9];
145*437bfbebSnyanmisaka reg->reg26.sw_dc2_code11_cnt = dc_ptr1->bits[10];
146*437bfbebSnyanmisaka reg->reg26.sw_dc2_code12_cnt = dc_ptr1->bits[11];
147*437bfbebSnyanmisaka reg->reg26.sw_dc2_code13_cnt = dc_ptr1->bits[12];
148*437bfbebSnyanmisaka reg->reg26.sw_dc2_code14_cnt = dc_ptr1->bits[13];
149*437bfbebSnyanmisaka reg->reg26.sw_dc2_code15_cnt = dc_ptr1->bits[14];
150*437bfbebSnyanmisaka reg->reg26.sw_dc2_code16_cnt = dc_ptr1->bits[15];
151*437bfbebSnyanmisaka
152*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
153*437bfbebSnyanmisaka return;
154*437bfbebSnyanmisaka }
155*437bfbebSnyanmisaka
156*437bfbebSnyanmisaka static void
jpegd_set_stream_offset(JpegdHalCtx * ctx,JpegdSyntax * syntax)157*437bfbebSnyanmisaka jpegd_set_stream_offset(JpegdHalCtx *ctx, JpegdSyntax *syntax)
158*437bfbebSnyanmisaka {
159*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
160*437bfbebSnyanmisaka JpegdSyntax *s = syntax;
161*437bfbebSnyanmisaka JpegdIocRegInfo *info = (JpegdIocRegInfo *)ctx->regs;
162*437bfbebSnyanmisaka JpegRegSet *reg = &info->regs;
163*437bfbebSnyanmisaka RK_U32 offset = 0, byte_cnt = 0;
164*437bfbebSnyanmisaka RK_U32 bit_pos_in_byte = 0;
165*437bfbebSnyanmisaka RK_U32 strm_len_by_hw = 0;
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka /* calculate and set stream start address to hw,
168*437bfbebSnyanmisaka * the offset must be 8-byte aligned.
169*437bfbebSnyanmisaka */
170*437bfbebSnyanmisaka offset = (s->strm_offset & (~7));
171*437bfbebSnyanmisaka reg->reg12_input_stream_base = ctx->pkt_fd;
172*437bfbebSnyanmisaka if (offset) {
173*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 12, offset);
174*437bfbebSnyanmisaka }
175*437bfbebSnyanmisaka
176*437bfbebSnyanmisaka /* calculate and set stream start bit to hardware
177*437bfbebSnyanmisaka * change current pos to bus address style
178*437bfbebSnyanmisaka * remove three lowest bits and add the difference to bitPosInWord
179*437bfbebSnyanmisaka * used as bit pos in word not as bit pos in byte actually...
180*437bfbebSnyanmisaka */
181*437bfbebSnyanmisaka byte_cnt = ((uintptr_t) s->cur_pos & (7));
182*437bfbebSnyanmisaka bit_pos_in_byte = byte_cnt * 8; /* 1 Byte = 8 bits */
183*437bfbebSnyanmisaka reg->reg5.sw_strm0_start_bit = bit_pos_in_byte;
184*437bfbebSnyanmisaka
185*437bfbebSnyanmisaka /* set up stream length for HW.
186*437bfbebSnyanmisaka * length = size of original buffer - stream we already decoded in SW
187*437bfbebSnyanmisaka */
188*437bfbebSnyanmisaka strm_len_by_hw = s->pkt_len - offset;
189*437bfbebSnyanmisaka reg->reg6_stream_info.sw_stream_len = strm_len_by_hw;
190*437bfbebSnyanmisaka reg->reg5.sw_jpeg_stream_all = 1;
191*437bfbebSnyanmisaka
192*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
193*437bfbebSnyanmisaka return;
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka
196*437bfbebSnyanmisaka static void
jpegd_set_chroma_table_id(JpegdHalCtx * ctx,JpegdSyntax * syntax)197*437bfbebSnyanmisaka jpegd_set_chroma_table_id(JpegdHalCtx *ctx, JpegdSyntax *syntax)
198*437bfbebSnyanmisaka {
199*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
200*437bfbebSnyanmisaka JpegdSyntax *s = syntax;
201*437bfbebSnyanmisaka JpegdIocRegInfo *info = (JpegdIocRegInfo *)ctx->regs;
202*437bfbebSnyanmisaka JpegRegSet *reg = &info->regs;
203*437bfbebSnyanmisaka
204*437bfbebSnyanmisaka /* this trick is done because hw always wants
205*437bfbebSnyanmisaka * luma table as ac hw table 1
206*437bfbebSnyanmisaka */
207*437bfbebSnyanmisaka if (s->ac_index[0] == HUFFMAN_TABLE_ID_ZERO) {
208*437bfbebSnyanmisaka reg->reg5.sw_cb_ac_vlctable = s->ac_index[1];
209*437bfbebSnyanmisaka reg->reg5.sw_cr_ac_vlctable = s->ac_index[2];
210*437bfbebSnyanmisaka } else {
211*437bfbebSnyanmisaka if (s->ac_index[0] == s->ac_index[1])
212*437bfbebSnyanmisaka reg->reg5.sw_cb_ac_vlctable = 0;
213*437bfbebSnyanmisaka else
214*437bfbebSnyanmisaka reg->reg5.sw_cb_ac_vlctable = 1;
215*437bfbebSnyanmisaka
216*437bfbebSnyanmisaka if (s->ac_index[0] == s->ac_index[2])
217*437bfbebSnyanmisaka reg->reg5.sw_cr_ac_vlctable = 0;
218*437bfbebSnyanmisaka else
219*437bfbebSnyanmisaka reg->reg5.sw_cr_ac_vlctable = 1;
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka
222*437bfbebSnyanmisaka /* Third DC table selectors */
223*437bfbebSnyanmisaka if (s->dc_index[0] == HUFFMAN_TABLE_ID_ZERO) {
224*437bfbebSnyanmisaka reg->reg5.sw_cb_dc_vlctable = s->dc_index[1];
225*437bfbebSnyanmisaka reg->reg5.sw_cr_dc_vlctable = s->dc_index[2];
226*437bfbebSnyanmisaka } else {
227*437bfbebSnyanmisaka if (s->dc_index[0] == s->dc_index[1])
228*437bfbebSnyanmisaka reg->reg5.sw_cb_dc_vlctable = 0;
229*437bfbebSnyanmisaka else
230*437bfbebSnyanmisaka reg->reg5.sw_cb_dc_vlctable = 1;
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka if (s->dc_index[0] == s->dc_index[2])
233*437bfbebSnyanmisaka reg->reg5.sw_cr_dc_vlctable = 0;
234*437bfbebSnyanmisaka else
235*437bfbebSnyanmisaka reg->reg5.sw_cr_dc_vlctable = 1;
236*437bfbebSnyanmisaka }
237*437bfbebSnyanmisaka
238*437bfbebSnyanmisaka reg->reg5.sw_cr_dc_vlctable3 = 0;
239*437bfbebSnyanmisaka reg->reg5.sw_cb_dc_vlctable3 = 0;
240*437bfbebSnyanmisaka
241*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
242*437bfbebSnyanmisaka return;
243*437bfbebSnyanmisaka }
244*437bfbebSnyanmisaka
jpegd_setup_pp(JpegdHalCtx * ctx,JpegdSyntax * syntax)245*437bfbebSnyanmisaka static MPP_RET jpegd_setup_pp(JpegdHalCtx *ctx, JpegdSyntax *syntax)
246*437bfbebSnyanmisaka {
247*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
248*437bfbebSnyanmisaka JpegdIocRegInfo *info = (JpegdIocRegInfo *)ctx->regs;
249*437bfbebSnyanmisaka JpegRegSet *regs = &info->regs;
250*437bfbebSnyanmisaka post_processor_reg *post = ®s->post;
251*437bfbebSnyanmisaka JpegdSyntax *s = syntax;
252*437bfbebSnyanmisaka
253*437bfbebSnyanmisaka RK_U32 in_color = ctx->pp_info.pp_in_fmt;
254*437bfbebSnyanmisaka RK_U32 out_color = ctx->pp_info.pp_out_fmt;
255*437bfbebSnyanmisaka RK_U32 dither = ctx->pp_info.dither_enable;
256*437bfbebSnyanmisaka RK_U32 crop_width = ctx->pp_info.crop_width;
257*437bfbebSnyanmisaka RK_U32 crop_height = ctx->pp_info.crop_height;
258*437bfbebSnyanmisaka RK_U32 crop_x = ctx->pp_info.crop_x;
259*437bfbebSnyanmisaka RK_U32 crop_y = ctx->pp_info.crop_y;
260*437bfbebSnyanmisaka RK_U32 in_width = s->hor_stride;
261*437bfbebSnyanmisaka RK_U32 in_height = s->ver_stride;
262*437bfbebSnyanmisaka RK_U32 out_width = s->hor_stride;
263*437bfbebSnyanmisaka RK_U32 out_height = s->ver_stride;
264*437bfbebSnyanmisaka RK_U32 uv_offset = s->hor_stride * s->ver_stride;
265*437bfbebSnyanmisaka
266*437bfbebSnyanmisaka int video_range = 1;
267*437bfbebSnyanmisaka
268*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_axi_rd_id = 0;
269*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_axi_wr_id = 0;
270*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_scmd_dis = 1;
271*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_max_burst = 16;
272*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_in_a2_endsel = 1;
273*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_in_a1_swap32 = 1;
274*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_in_a1_endian = 1;
275*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_in_swap32_e = 1;
276*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_in_endian = 1;
277*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_out_endian = 1;
278*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_out_swap32_e = 1;
279*437bfbebSnyanmisaka
280*437bfbebSnyanmisaka post->reg63_pp_in_lu_base = 0;
281*437bfbebSnyanmisaka
282*437bfbebSnyanmisaka post->reg88_mask_1_size.sw_ext_orig_width = in_width >> 4;
283*437bfbebSnyanmisaka
284*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_clk_gate_e = 0;
285*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_ahb_hlock_e = 1;
286*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_data_disc_e = 1;
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka if (crop_width <= 0) {
289*437bfbebSnyanmisaka post->reg92_display.sw_pp_in_w_ext = (((in_width / 16) & 0xE00) >> 9);
290*437bfbebSnyanmisaka post->reg72_crop.sw_pp_in_width = ((in_width / 16) & 0x1FF);
291*437bfbebSnyanmisaka post->reg92_display.sw_pp_in_h_ext = (((in_height / 16) & 0x700) >> 8);
292*437bfbebSnyanmisaka post->reg72_crop.sw_pp_in_height = ((in_height / 16) & 0x0FF);
293*437bfbebSnyanmisaka } else {
294*437bfbebSnyanmisaka post->reg92_display.sw_pp_in_w_ext =
295*437bfbebSnyanmisaka (((crop_width / 16) & 0xE00) >> 9);
296*437bfbebSnyanmisaka post->reg72_crop.sw_pp_in_width = ((crop_width / 16) & 0x1FF);
297*437bfbebSnyanmisaka post->reg92_display.sw_pp_in_h_ext =
298*437bfbebSnyanmisaka (((crop_height / 16) & 0x700) >> 8);
299*437bfbebSnyanmisaka post->reg72_crop.sw_pp_in_height = ((crop_height / 16) & 0x0FF);
300*437bfbebSnyanmisaka
301*437bfbebSnyanmisaka post->reg92_display.sw_crop_startx_ext =
302*437bfbebSnyanmisaka (((crop_x / 16) & 0xE00) >> 9);
303*437bfbebSnyanmisaka post->reg71_color_coeff_1.sw_crop_startx =
304*437bfbebSnyanmisaka ((crop_x / 16) & 0x1FF);
305*437bfbebSnyanmisaka post->reg92_display.sw_crop_starty_ext =
306*437bfbebSnyanmisaka (((crop_y / 16) & 0x700) >> 8);
307*437bfbebSnyanmisaka post->reg72_crop.sw_crop_starty =
308*437bfbebSnyanmisaka ((crop_y / 16) & 0x0FF);
309*437bfbebSnyanmisaka
310*437bfbebSnyanmisaka if (crop_width & 0x0F) {
311*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_crop8_r_e = 1;
312*437bfbebSnyanmisaka } else {
313*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_crop8_r_e = 0;
314*437bfbebSnyanmisaka }
315*437bfbebSnyanmisaka if (crop_height & 0x0F) {
316*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_crop8_d_e = 1;
317*437bfbebSnyanmisaka } else {
318*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_crop8_d_e = 0;
319*437bfbebSnyanmisaka }
320*437bfbebSnyanmisaka in_width = crop_width;
321*437bfbebSnyanmisaka in_height = crop_height;
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka
324*437bfbebSnyanmisaka post->reg92_display.sw_display_width = out_width;
325*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_out_width = out_width;
326*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_out_height = out_height;
327*437bfbebSnyanmisaka post->reg66_pp_out_lu_base = ctx->frame_fd;
328*437bfbebSnyanmisaka
329*437bfbebSnyanmisaka switch (in_color) {
330*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV422INTERLAVE:
331*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV420SEMI:
332*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV420PLANAR:
333*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV400:
334*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV422SEMI:
335*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV420SEMITIELED:
336*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV440SEMI:
337*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_in_format = in_color;
338*437bfbebSnyanmisaka break;
339*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV444_SEMI:
340*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_in_format = 7;
341*437bfbebSnyanmisaka post->reg86_mask_1.sw_pp_in_format_es = 0;
342*437bfbebSnyanmisaka break;
343*437bfbebSnyanmisaka case PP_IN_FORMAT_YUV411_SEMI:
344*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_in_format = 0;
345*437bfbebSnyanmisaka post->reg86_mask_1.sw_pp_in_format_es = 1;
346*437bfbebSnyanmisaka break;
347*437bfbebSnyanmisaka default:
348*437bfbebSnyanmisaka mpp_err_f("unsupported format:%d", in_color);
349*437bfbebSnyanmisaka return -1;
350*437bfbebSnyanmisaka }
351*437bfbebSnyanmisaka
352*437bfbebSnyanmisaka post->reg72_crop.sw_rangemap_coef_y = 9;
353*437bfbebSnyanmisaka post->reg86_mask_1.sw_rangemap_coef_c = 9;
354*437bfbebSnyanmisaka /* brightness */
355*437bfbebSnyanmisaka post->reg71_color_coeff_1.sw_color_coefff = BRIGHTNESS;
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka if (out_color <= PP_OUT_FORMAT_ARGB) {
358*437bfbebSnyanmisaka /*Bt.601*/
359*437bfbebSnyanmisaka unsigned int a = 298;
360*437bfbebSnyanmisaka unsigned int b = 409;
361*437bfbebSnyanmisaka unsigned int c = 208;
362*437bfbebSnyanmisaka unsigned int d = 100;
363*437bfbebSnyanmisaka unsigned int e = 516;
364*437bfbebSnyanmisaka
365*437bfbebSnyanmisaka /*Bt.709
366*437bfbebSnyanmisaka unsigned int a = 298;
367*437bfbebSnyanmisaka unsigned int b = 459;
368*437bfbebSnyanmisaka unsigned int c = 137;
369*437bfbebSnyanmisaka unsigned int d = 55;
370*437bfbebSnyanmisaka unsigned int e = 544;*/
371*437bfbebSnyanmisaka
372*437bfbebSnyanmisaka int satur = 0, tmp;
373*437bfbebSnyanmisaka if (video_range != 0) {
374*437bfbebSnyanmisaka /*Bt.601*/
375*437bfbebSnyanmisaka a = 256;
376*437bfbebSnyanmisaka b = 350;
377*437bfbebSnyanmisaka c = 179;
378*437bfbebSnyanmisaka d = 86;
379*437bfbebSnyanmisaka e = 443;
380*437bfbebSnyanmisaka /*Bt.709
381*437bfbebSnyanmisaka a = 256;
382*437bfbebSnyanmisaka b = 403;
383*437bfbebSnyanmisaka c = 120;
384*437bfbebSnyanmisaka d = 48;
385*437bfbebSnyanmisaka e = 475;*/
386*437bfbebSnyanmisaka
387*437bfbebSnyanmisaka post->reg79_scaling_0.sw_ycbcr_range = video_range;
388*437bfbebSnyanmisaka }
389*437bfbebSnyanmisaka int contrast = CONTRAST;
390*437bfbebSnyanmisaka if (contrast != 0) {
391*437bfbebSnyanmisaka int thr1y, thr2y, off1, off2, thr1, thr2, a1, a2;
392*437bfbebSnyanmisaka if (video_range == 0) {
393*437bfbebSnyanmisaka int tmp1, tmp2;
394*437bfbebSnyanmisaka /* Contrast */
395*437bfbebSnyanmisaka thr1 = (219 * (contrast + 128)) / 512;
396*437bfbebSnyanmisaka thr1y = (219 - 2 * thr1) / 2;
397*437bfbebSnyanmisaka thr2 = 219 - thr1;
398*437bfbebSnyanmisaka thr2y = 219 - thr1y;
399*437bfbebSnyanmisaka
400*437bfbebSnyanmisaka tmp1 = (thr1y * 256) / thr1;
401*437bfbebSnyanmisaka tmp2 = ((thr2y - thr1y) * 256) / (thr2 - thr1);
402*437bfbebSnyanmisaka off1 = ((thr1y - ((tmp2 * thr1) / 256)) * a) / 256;
403*437bfbebSnyanmisaka off2 = ((thr2y - ((tmp1 * thr2) / 256)) * a) / 256;
404*437bfbebSnyanmisaka
405*437bfbebSnyanmisaka tmp1 = (64 * (contrast + 128)) / 128;
406*437bfbebSnyanmisaka tmp2 = 256 * (128 - tmp1);
407*437bfbebSnyanmisaka a1 = (tmp2 + off2) / thr1;
408*437bfbebSnyanmisaka a2 = a1 + (256 * (off2 - 1)) / (thr2 - thr1);
409*437bfbebSnyanmisaka } else {
410*437bfbebSnyanmisaka /* Contrast */
411*437bfbebSnyanmisaka thr1 = (64 * (contrast + 128)) / 128;
412*437bfbebSnyanmisaka thr1y = 128 - thr1;
413*437bfbebSnyanmisaka thr2 = 256 - thr1;
414*437bfbebSnyanmisaka thr2y = 256 - thr1y;
415*437bfbebSnyanmisaka a1 = (thr1y * 256) / thr1;
416*437bfbebSnyanmisaka a2 = ((thr2y - thr1y) * 256) / (thr2 - thr1);
417*437bfbebSnyanmisaka off1 = thr1y - (a2 * thr1) / 256;
418*437bfbebSnyanmisaka off2 = thr2y - (a1 * thr2) / 256;
419*437bfbebSnyanmisaka }
420*437bfbebSnyanmisaka
421*437bfbebSnyanmisaka if (a1 > 1023)
422*437bfbebSnyanmisaka a1 = 1023;
423*437bfbebSnyanmisaka else if (a1 < 0)
424*437bfbebSnyanmisaka a1 = 0;
425*437bfbebSnyanmisaka
426*437bfbebSnyanmisaka if (a2 > 1023)
427*437bfbebSnyanmisaka a2 = 1023;
428*437bfbebSnyanmisaka else if (a2 < 0)
429*437bfbebSnyanmisaka a2 = 0;
430*437bfbebSnyanmisaka
431*437bfbebSnyanmisaka if (thr1 > 255)
432*437bfbebSnyanmisaka thr1 = 255;
433*437bfbebSnyanmisaka else if (thr1 < 0)
434*437bfbebSnyanmisaka thr1 = 0;
435*437bfbebSnyanmisaka
436*437bfbebSnyanmisaka if (thr2 > 255)
437*437bfbebSnyanmisaka thr2 = 255;
438*437bfbebSnyanmisaka else if (thr2 < 0)
439*437bfbebSnyanmisaka thr2 = 0;
440*437bfbebSnyanmisaka
441*437bfbebSnyanmisaka if (off1 > 511)
442*437bfbebSnyanmisaka off1 = 511;
443*437bfbebSnyanmisaka else if (off1 < -512)
444*437bfbebSnyanmisaka off1 = -512;
445*437bfbebSnyanmisaka
446*437bfbebSnyanmisaka if (off2 > 511)
447*437bfbebSnyanmisaka off2 = 511;
448*437bfbebSnyanmisaka else if (off2 < -512)
449*437bfbebSnyanmisaka off2 = -512;
450*437bfbebSnyanmisaka
451*437bfbebSnyanmisaka post->reg68_contrast_adjust.sw_contrast_thr1 = thr1;
452*437bfbebSnyanmisaka post->reg69.sw_contrast_thr2 = thr2;
453*437bfbebSnyanmisaka post->reg68_contrast_adjust.sw_contrast_off1 = off1;
454*437bfbebSnyanmisaka post->reg68_contrast_adjust.sw_contrast_off2 = off2;
455*437bfbebSnyanmisaka
456*437bfbebSnyanmisaka post->reg69.sw_color_coeffa1 = a1;
457*437bfbebSnyanmisaka post->reg69.sw_color_coeffa2 = a2;
458*437bfbebSnyanmisaka } else {
459*437bfbebSnyanmisaka post->reg68_contrast_adjust.sw_contrast_thr1 = 55;
460*437bfbebSnyanmisaka post->reg69.sw_contrast_thr2 = 165;
461*437bfbebSnyanmisaka post->reg68_contrast_adjust.sw_contrast_off1 = 0;
462*437bfbebSnyanmisaka post->reg68_contrast_adjust.sw_contrast_off2 = 0;
463*437bfbebSnyanmisaka
464*437bfbebSnyanmisaka tmp = a;
465*437bfbebSnyanmisaka if (tmp > 1023)
466*437bfbebSnyanmisaka tmp = 1023;
467*437bfbebSnyanmisaka else if (tmp < 0)
468*437bfbebSnyanmisaka tmp = 0;
469*437bfbebSnyanmisaka
470*437bfbebSnyanmisaka post->reg69.sw_color_coeffa1 = tmp;
471*437bfbebSnyanmisaka post->reg69.sw_color_coeffa2 = tmp;
472*437bfbebSnyanmisaka }
473*437bfbebSnyanmisaka
474*437bfbebSnyanmisaka /* saturation */
475*437bfbebSnyanmisaka satur = 64 + SATURATION;
476*437bfbebSnyanmisaka
477*437bfbebSnyanmisaka tmp = (satur * (int) b) / 64;
478*437bfbebSnyanmisaka if (tmp > 1023)
479*437bfbebSnyanmisaka tmp = 1023;
480*437bfbebSnyanmisaka else if (tmp < 0)
481*437bfbebSnyanmisaka tmp = 0;
482*437bfbebSnyanmisaka post->reg70_color_coeff_0.sw_color_coeffb = (unsigned int) tmp;
483*437bfbebSnyanmisaka
484*437bfbebSnyanmisaka tmp = (satur * (int) c) / 64;
485*437bfbebSnyanmisaka if (tmp > 1023)
486*437bfbebSnyanmisaka tmp = 1023;
487*437bfbebSnyanmisaka else if (tmp < 0)
488*437bfbebSnyanmisaka tmp = 0;
489*437bfbebSnyanmisaka post->reg70_color_coeff_0.sw_color_coeffc = (unsigned int) tmp;
490*437bfbebSnyanmisaka
491*437bfbebSnyanmisaka tmp = (satur * (int) d) / 64;
492*437bfbebSnyanmisaka if (tmp > 1023)
493*437bfbebSnyanmisaka tmp = 1023;
494*437bfbebSnyanmisaka else if (tmp < 0)
495*437bfbebSnyanmisaka tmp = 0;
496*437bfbebSnyanmisaka post->reg70_color_coeff_0.sw_color_coeffd = (unsigned int) tmp;
497*437bfbebSnyanmisaka
498*437bfbebSnyanmisaka tmp = (satur * (int) e) / 64;
499*437bfbebSnyanmisaka if (tmp > 1023)
500*437bfbebSnyanmisaka tmp = 1023;
501*437bfbebSnyanmisaka else if (tmp < 0)
502*437bfbebSnyanmisaka tmp = 0;
503*437bfbebSnyanmisaka post->reg71_color_coeff_1.sw_color_coeffe = (unsigned int) tmp;
504*437bfbebSnyanmisaka }
505*437bfbebSnyanmisaka
506*437bfbebSnyanmisaka if (out_color <= PP_OUT_FORMAT_ARGB) {
507*437bfbebSnyanmisaka PpRgbCfg *cfg = get_pp_rgb_Cfg(ctx->output_fmt);
508*437bfbebSnyanmisaka post->reg82_r_mask = cfg->r_mask;
509*437bfbebSnyanmisaka post->reg83_g_mask = cfg->g_mask;
510*437bfbebSnyanmisaka post->reg84_b_mask = cfg->b_mask;
511*437bfbebSnyanmisaka post->reg79_scaling_0.sw_rgb_r_padd = cfg->r_padd;
512*437bfbebSnyanmisaka post->reg79_scaling_0.sw_rgb_g_padd = cfg->g_padd;
513*437bfbebSnyanmisaka post->reg80_scaling_1.sw_rgb_b_padd = cfg->b_padd;
514*437bfbebSnyanmisaka
515*437bfbebSnyanmisaka if (dither) {
516*437bfbebSnyanmisaka jpegd_dbg_hal("we do dither.");
517*437bfbebSnyanmisaka post->reg91_pip_2.sw_dither_select_r = cfg->r_dither;
518*437bfbebSnyanmisaka post->reg91_pip_2.sw_dither_select_r = cfg->g_dither;
519*437bfbebSnyanmisaka post->reg91_pip_2.sw_dither_select_r = cfg->b_dither;
520*437bfbebSnyanmisaka } else {
521*437bfbebSnyanmisaka jpegd_dbg_hal("we do not dither.");
522*437bfbebSnyanmisaka }
523*437bfbebSnyanmisaka
524*437bfbebSnyanmisaka post->reg79_scaling_0.sw_rgb_pix_in32 = cfg->rgb_in_32;
525*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_out_swap16_e = cfg->swap_16;
526*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_out_swap32_e = cfg->swap_32;
527*437bfbebSnyanmisaka post->reg61_dev_conf.sw_pp_out_endian = cfg->out_endian;
528*437bfbebSnyanmisaka
529*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_out_format = 0;
530*437bfbebSnyanmisaka
531*437bfbebSnyanmisaka } else if (out_color == PP_OUT_FORMAT_YUV422INTERLAVE) {
532*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_out_format = 3;
533*437bfbebSnyanmisaka } else if (out_color == PP_OUT_FORMAT_YUV420INTERLAVE) {
534*437bfbebSnyanmisaka post->reg85_ctrl.sw_pp_out_format = 5;
535*437bfbebSnyanmisaka } else {
536*437bfbebSnyanmisaka mpp_err_f("unsuppotred format:%d", out_color);
537*437bfbebSnyanmisaka return -1;
538*437bfbebSnyanmisaka }
539*437bfbebSnyanmisaka
540*437bfbebSnyanmisaka post->reg71_color_coeff_1.sw_rotation_mode = 0;
541*437bfbebSnyanmisaka
542*437bfbebSnyanmisaka unsigned int inw, inh;
543*437bfbebSnyanmisaka unsigned int outw, outh;
544*437bfbebSnyanmisaka
545*437bfbebSnyanmisaka inw = in_width - 1;
546*437bfbebSnyanmisaka inh = in_height - 1;
547*437bfbebSnyanmisaka outw = out_width - 1;
548*437bfbebSnyanmisaka outh = out_height - 1;
549*437bfbebSnyanmisaka
550*437bfbebSnyanmisaka if (inw < outw) {
551*437bfbebSnyanmisaka post->reg80_scaling_1.sw_hor_scale_mode = 1;
552*437bfbebSnyanmisaka post->reg79_scaling_0.sw_scale_wratio = (outw << 16) / inw;
553*437bfbebSnyanmisaka post->reg81_scaling_2.sw_wscale_invra = (inw << 16) / outw;
554*437bfbebSnyanmisaka } else if (inw > outw) {
555*437bfbebSnyanmisaka post->reg80_scaling_1.sw_hor_scale_mode = 2;
556*437bfbebSnyanmisaka post->reg81_scaling_2.sw_wscale_invra = ((outw + 1) << 16) / (inw + 1);
557*437bfbebSnyanmisaka } else
558*437bfbebSnyanmisaka post->reg80_scaling_1.sw_hor_scale_mode = 0;
559*437bfbebSnyanmisaka
560*437bfbebSnyanmisaka if (inh < outh) {
561*437bfbebSnyanmisaka post->reg80_scaling_1.sw_ver_scale_mode = 1;
562*437bfbebSnyanmisaka post->reg80_scaling_1.sw_scale_hratio = (outh << 16) / inh;
563*437bfbebSnyanmisaka post->reg81_scaling_2.sw_hscale_invra = (inh << 16) / outh;
564*437bfbebSnyanmisaka } else if (inh > outh) {
565*437bfbebSnyanmisaka post->reg80_scaling_1.sw_ver_scale_mode = 2;
566*437bfbebSnyanmisaka post->reg81_scaling_2.sw_hscale_invra =
567*437bfbebSnyanmisaka ((outh + 1) << 16) / (inh + 1) + 1;
568*437bfbebSnyanmisaka } else
569*437bfbebSnyanmisaka post->reg80_scaling_1.sw_ver_scale_mode = 0;
570*437bfbebSnyanmisaka
571*437bfbebSnyanmisaka post->reg60_interrupt.sw_pp_pipeline_e = ctx->pp_info.pp_enable;
572*437bfbebSnyanmisaka
573*437bfbebSnyanmisaka if (ctx->pp_info.pp_enable) {
574*437bfbebSnyanmisaka post->reg60_interrupt.sw_pp_pipeline_e = 1;
575*437bfbebSnyanmisaka regs->reg3.sw_dec_out_dis = 1;
576*437bfbebSnyanmisaka
577*437bfbebSnyanmisaka regs->reg13_cur_pic_base = 0;
578*437bfbebSnyanmisaka regs->reg14_sw_jpg_ch_out_base = 0;
579*437bfbebSnyanmisaka
580*437bfbebSnyanmisaka post->reg66_pp_out_lu_base = ctx->frame_fd;
581*437bfbebSnyanmisaka post->reg67_pp_out_ch_base = ctx->frame_fd;
582*437bfbebSnyanmisaka
583*437bfbebSnyanmisaka if (uv_offset)
584*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 67, uv_offset);
585*437bfbebSnyanmisaka
586*437bfbebSnyanmisaka jpegd_dbg_hal("output_frame_fd:%x, reg67:%x", ctx->frame_fd,
587*437bfbebSnyanmisaka post->reg67_pp_out_ch_base);
588*437bfbebSnyanmisaka } else {
589*437bfbebSnyanmisaka // output without pp
590*437bfbebSnyanmisaka post->reg60_interrupt.sw_pp_pipeline_e = 0;
591*437bfbebSnyanmisaka regs->reg3.sw_dec_out_dis = 0;
592*437bfbebSnyanmisaka
593*437bfbebSnyanmisaka post->reg66_pp_out_lu_base = 0;
594*437bfbebSnyanmisaka post->reg67_pp_out_ch_base = 0;
595*437bfbebSnyanmisaka
596*437bfbebSnyanmisaka regs->reg13_cur_pic_base = ctx->frame_fd;
597*437bfbebSnyanmisaka regs->reg14_sw_jpg_ch_out_base = ctx->frame_fd;
598*437bfbebSnyanmisaka
599*437bfbebSnyanmisaka if (uv_offset)
600*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 14, uv_offset);
601*437bfbebSnyanmisaka
602*437bfbebSnyanmisaka jpegd_dbg_hal("output_frame_fd:%x, reg14:%x", ctx->frame_fd,
603*437bfbebSnyanmisaka regs->reg14_sw_jpg_ch_out_base);
604*437bfbebSnyanmisaka }
605*437bfbebSnyanmisaka
606*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
607*437bfbebSnyanmisaka return 0;
608*437bfbebSnyanmisaka }
609*437bfbebSnyanmisaka
jpegd_regs_init(JpegRegSet * reg)610*437bfbebSnyanmisaka static MPP_RET jpegd_regs_init(JpegRegSet *reg)
611*437bfbebSnyanmisaka {
612*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
613*437bfbebSnyanmisaka memset(reg, 0, sizeof(JpegRegSet));
614*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_out_tiled_e = 0;
615*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_scmd_dis = DEC_VDPU1_SCMD_DISABLE;
616*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_latency = DEC_VDPU1_LATENCY_COMPENSATION;
617*437bfbebSnyanmisaka
618*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_in_endian = DEC_VDPU1_BIG_ENDIAN;
619*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_out_endian = DEC_VDPU1_LITTLE_ENDIAN;
620*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_strendian_e = DEC_VDPU1_LITTLE_ENDIAN;
621*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_outswap32_e = DEC_VDPU1_LITTLE_ENDIAN;
622*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_inswap32_e = 1;
623*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_strswap32_e = 1;
624*437bfbebSnyanmisaka
625*437bfbebSnyanmisaka reg->reg1_interrupt.sw_dec_irq_dis = 0;
626*437bfbebSnyanmisaka
627*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_axi_rn_id = 0xff;
628*437bfbebSnyanmisaka reg->reg3.sw_dec_axi_wr_id = 0;
629*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_max_burst = DEC_VDPU1_BUS_BURST_LENGTH_16;
630*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_data_disc_e = DEC_VDPU1_DATA_DISCARD_ENABLE;
631*437bfbebSnyanmisaka
632*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_timeout_e = 1;
633*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_clk_gate_e = 1;
634*437bfbebSnyanmisaka
635*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
636*437bfbebSnyanmisaka return MPP_OK;
637*437bfbebSnyanmisaka }
638*437bfbebSnyanmisaka
jpegd_gen_regs(JpegdHalCtx * ctx,JpegdSyntax * syntax)639*437bfbebSnyanmisaka static MPP_RET jpegd_gen_regs(JpegdHalCtx *ctx, JpegdSyntax *syntax)
640*437bfbebSnyanmisaka {
641*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
642*437bfbebSnyanmisaka JpegdIocRegInfo *info = (JpegdIocRegInfo *)ctx->regs;
643*437bfbebSnyanmisaka JpegRegSet *reg = &info->regs;
644*437bfbebSnyanmisaka JpegdSyntax *s = syntax;
645*437bfbebSnyanmisaka
646*437bfbebSnyanmisaka jpegd_regs_init(reg);
647*437bfbebSnyanmisaka
648*437bfbebSnyanmisaka /* Enable jpeg mode */
649*437bfbebSnyanmisaka reg->reg1_interrupt.sw_dec_e = 1;
650*437bfbebSnyanmisaka
651*437bfbebSnyanmisaka reg->reg3.sw_filtering_dis = 1;
652*437bfbebSnyanmisaka
653*437bfbebSnyanmisaka /* JPEG decoder */
654*437bfbebSnyanmisaka reg->reg3.sw_dec_mode = 3;
655*437bfbebSnyanmisaka reg->reg3.sw_pjpeg_e = 0; /* Set JPEG operation mode */
656*437bfbebSnyanmisaka reg->reg3.sw_dec_out_dis = 0;
657*437bfbebSnyanmisaka reg->reg3.sw_rlc_mode_e = 0;
658*437bfbebSnyanmisaka
659*437bfbebSnyanmisaka /* frame size, round up the number of mbs */
660*437bfbebSnyanmisaka reg->reg4.sw_pic_mb_h_ext = ((((s->ver_stride) >> (4)) & 0x700) >> 8);
661*437bfbebSnyanmisaka reg->reg4.sw_pic_mb_w_ext = ((((s->hor_stride) >> (4)) & 0xE00) >> 9);
662*437bfbebSnyanmisaka reg->reg4.sw_pic_mb_width = ((s->hor_stride) >> (4)) & 0x1FF;
663*437bfbebSnyanmisaka reg->reg4.sw_pic_mb_height_p = ((s->ver_stride) >> (4)) & 0x0FF;
664*437bfbebSnyanmisaka
665*437bfbebSnyanmisaka reg->reg7.sw_pjpeg_fildown_e = s->fill_bottom;
666*437bfbebSnyanmisaka /* Set spectral selection start coefficient */
667*437bfbebSnyanmisaka reg->reg7.sw_pjpeg_ss = s->scan_start;
668*437bfbebSnyanmisaka /* Set spectral selection end coefficient */
669*437bfbebSnyanmisaka reg->reg7.sw_pjpeg_se = s->scan_end;
670*437bfbebSnyanmisaka /* Set the point transform used in the preceding scan */
671*437bfbebSnyanmisaka reg->reg7.sw_pjpeg_ah = s->prev_shift;
672*437bfbebSnyanmisaka /* Set the point transform value */
673*437bfbebSnyanmisaka reg->reg7.sw_pjpeg_al = s->point_transform;
674*437bfbebSnyanmisaka
675*437bfbebSnyanmisaka reg->reg5.sw_jpeg_qtables = s->qtable_cnt;
676*437bfbebSnyanmisaka reg->reg5.sw_jpeg_mode = s->yuv_mode;
677*437bfbebSnyanmisaka reg->reg5.sw_jpeg_filright_e = s->fill_right;
678*437bfbebSnyanmisaka
679*437bfbebSnyanmisaka reg->reg15.sw_jpeg_slice_h = 0;
680*437bfbebSnyanmisaka /*
681*437bfbebSnyanmisaka * Set bit 21 of reg148 to 1, notifying hardware to decode
682*437bfbebSnyanmisaka * jpeg including DRI segment
683*437bfbebSnyanmisaka */
684*437bfbebSnyanmisaka reg->reg5.sw_sync_marker_e = 1;
685*437bfbebSnyanmisaka
686*437bfbebSnyanmisaka /* tell hardware that height is 8-pixel aligned, but not 16-pixel aligned */
687*437bfbebSnyanmisaka if ((s->height % 16) && ((s->height % 16) <= 8) &&
688*437bfbebSnyanmisaka (s->yuv_mode == JPEGDEC_YUV422 ||
689*437bfbebSnyanmisaka s->yuv_mode == JPEGDEC_YUV444 ||
690*437bfbebSnyanmisaka s->yuv_mode == JPEGDEC_YUV411)) {
691*437bfbebSnyanmisaka reg->reg15.sw_jpeg_height8_flag = 1;
692*437bfbebSnyanmisaka }
693*437bfbebSnyanmisaka
694*437bfbebSnyanmisaka /* write VLC code word number to register */
695*437bfbebSnyanmisaka jpegd_write_code_word_number(ctx, s);
696*437bfbebSnyanmisaka
697*437bfbebSnyanmisaka /* Create AC/DC/QP tables for hardware */
698*437bfbebSnyanmisaka jpegd_write_qp_ac_dc_table(ctx, s);
699*437bfbebSnyanmisaka
700*437bfbebSnyanmisaka /* Select which tables the chromas use */
701*437bfbebSnyanmisaka jpegd_set_chroma_table_id(ctx, s);
702*437bfbebSnyanmisaka
703*437bfbebSnyanmisaka /* write table base */
704*437bfbebSnyanmisaka reg->reg40_qtable_base = mpp_buffer_get_fd(ctx->pTableBase);
705*437bfbebSnyanmisaka if (reg->reg40_qtable_base <= 0) {
706*437bfbebSnyanmisaka mpp_err_f("get qtable_base failed\n");
707*437bfbebSnyanmisaka return MPP_NOK;
708*437bfbebSnyanmisaka }
709*437bfbebSnyanmisaka
710*437bfbebSnyanmisaka /* set up stream position for HW decode */
711*437bfbebSnyanmisaka jpegd_set_stream_offset(ctx, s);
712*437bfbebSnyanmisaka
713*437bfbebSnyanmisaka /* set restart interval */
714*437bfbebSnyanmisaka if (s->restart_interval) {
715*437bfbebSnyanmisaka reg->reg5.sw_sync_marker_e = 1;
716*437bfbebSnyanmisaka /*
717*437bfbebSnyanmisaka * If exists DRI segment, bit 0 to bit 15 of reg8
718*437bfbebSnyanmisaka * is set to restart interval
719*437bfbebSnyanmisaka */
720*437bfbebSnyanmisaka reg->reg8.sw_pjpeg_rest_freq = s->restart_interval;
721*437bfbebSnyanmisaka } else {
722*437bfbebSnyanmisaka reg->reg5.sw_sync_marker_e = 0;
723*437bfbebSnyanmisaka }
724*437bfbebSnyanmisaka
725*437bfbebSnyanmisaka jpegd_setup_pp(ctx, syntax);
726*437bfbebSnyanmisaka
727*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
728*437bfbebSnyanmisaka return MPP_OK;
729*437bfbebSnyanmisaka }
730*437bfbebSnyanmisaka
hal_jpegd_vdpu1_init(void * hal,MppHalCfg * cfg)731*437bfbebSnyanmisaka MPP_RET hal_jpegd_vdpu1_init(void *hal, MppHalCfg *cfg)
732*437bfbebSnyanmisaka {
733*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
734*437bfbebSnyanmisaka JpegdHalCtx *JpegHalCtx = (JpegdHalCtx *)hal;
735*437bfbebSnyanmisaka
736*437bfbebSnyanmisaka mpp_assert(JpegHalCtx);
737*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
738*437bfbebSnyanmisaka
739*437bfbebSnyanmisaka //configure
740*437bfbebSnyanmisaka JpegHalCtx->dec_cb = cfg->dec_cb;
741*437bfbebSnyanmisaka JpegHalCtx->packet_slots = cfg->packet_slots;
742*437bfbebSnyanmisaka JpegHalCtx->frame_slots = cfg->frame_slots;
743*437bfbebSnyanmisaka JpegHalCtx->have_pp = cfg->hw_info->cap_jpg_pp_out;
744*437bfbebSnyanmisaka
745*437bfbebSnyanmisaka /* allocate regs buffer */
746*437bfbebSnyanmisaka if (JpegHalCtx->regs == NULL) {
747*437bfbebSnyanmisaka JpegHalCtx->regs = mpp_calloc_size(void, sizeof(JpegdIocRegInfo));
748*437bfbebSnyanmisaka if (JpegHalCtx->regs == NULL) {
749*437bfbebSnyanmisaka mpp_err("hal jpegd reg alloc failed\n");
750*437bfbebSnyanmisaka
751*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
752*437bfbebSnyanmisaka return MPP_ERR_NOMEM;
753*437bfbebSnyanmisaka }
754*437bfbebSnyanmisaka }
755*437bfbebSnyanmisaka JpegdIocRegInfo *info = (JpegdIocRegInfo *)JpegHalCtx->regs;
756*437bfbebSnyanmisaka memset(info, 0, sizeof(JpegdIocRegInfo));
757*437bfbebSnyanmisaka
758*437bfbebSnyanmisaka //malloc hw buf
759*437bfbebSnyanmisaka if (JpegHalCtx->group == NULL) {
760*437bfbebSnyanmisaka ret = mpp_buffer_group_get_internal(&JpegHalCtx->group,
761*437bfbebSnyanmisaka MPP_BUFFER_TYPE_ION);
762*437bfbebSnyanmisaka if (ret) {
763*437bfbebSnyanmisaka mpp_err_f("mpp_buffer_group_get failed ret %d\n", ret);
764*437bfbebSnyanmisaka return ret;
765*437bfbebSnyanmisaka }
766*437bfbebSnyanmisaka }
767*437bfbebSnyanmisaka
768*437bfbebSnyanmisaka ret = mpp_buffer_get(JpegHalCtx->group, &JpegHalCtx->pTableBase,
769*437bfbebSnyanmisaka JPEGD_BASELINE_TABLE_SIZE);
770*437bfbebSnyanmisaka if (ret) {
771*437bfbebSnyanmisaka mpp_err_f("get table buffer failed ret %d\n", ret);
772*437bfbebSnyanmisaka return ret;
773*437bfbebSnyanmisaka }
774*437bfbebSnyanmisaka
775*437bfbebSnyanmisaka PPInfo *pp_info = &(JpegHalCtx->pp_info);
776*437bfbebSnyanmisaka memset(pp_info, 0, sizeof(PPInfo));
777*437bfbebSnyanmisaka pp_info->pp_enable = 0;
778*437bfbebSnyanmisaka pp_info->pp_in_fmt = PP_IN_FORMAT_YUV420SEMI;
779*437bfbebSnyanmisaka pp_info->pp_out_fmt = PP_OUT_FORMAT_YUV420INTERLAVE;
780*437bfbebSnyanmisaka
781*437bfbebSnyanmisaka JpegHalCtx->output_fmt = MPP_FMT_YUV420SP;
782*437bfbebSnyanmisaka JpegHalCtx->set_output_fmt_flag = 0;
783*437bfbebSnyanmisaka
784*437bfbebSnyanmisaka /* init dbg stuff */
785*437bfbebSnyanmisaka JpegHalCtx->hal_debug_enable = 0;
786*437bfbebSnyanmisaka JpegHalCtx->frame_count = 0;
787*437bfbebSnyanmisaka JpegHalCtx->output_yuv_count = 0;
788*437bfbebSnyanmisaka
789*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
790*437bfbebSnyanmisaka return MPP_OK;
791*437bfbebSnyanmisaka }
792*437bfbebSnyanmisaka
hal_jpegd_vdpu1_deinit(void * hal)793*437bfbebSnyanmisaka MPP_RET hal_jpegd_vdpu1_deinit(void *hal)
794*437bfbebSnyanmisaka {
795*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
796*437bfbebSnyanmisaka JpegdHalCtx *JpegHalCtx = (JpegdHalCtx *)hal;
797*437bfbebSnyanmisaka
798*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
799*437bfbebSnyanmisaka
800*437bfbebSnyanmisaka if (JpegHalCtx->dev) {
801*437bfbebSnyanmisaka mpp_dev_deinit(JpegHalCtx->dev);
802*437bfbebSnyanmisaka JpegHalCtx->dev = NULL;
803*437bfbebSnyanmisaka }
804*437bfbebSnyanmisaka
805*437bfbebSnyanmisaka if (JpegHalCtx->pTableBase) {
806*437bfbebSnyanmisaka ret = mpp_buffer_put(JpegHalCtx->pTableBase);
807*437bfbebSnyanmisaka if (ret) {
808*437bfbebSnyanmisaka mpp_err_f("put buffer failed\n");
809*437bfbebSnyanmisaka return ret;
810*437bfbebSnyanmisaka }
811*437bfbebSnyanmisaka }
812*437bfbebSnyanmisaka
813*437bfbebSnyanmisaka if (JpegHalCtx->group) {
814*437bfbebSnyanmisaka ret = mpp_buffer_group_put(JpegHalCtx->group);
815*437bfbebSnyanmisaka if (ret) {
816*437bfbebSnyanmisaka mpp_err_f("group free buffer failed\n");
817*437bfbebSnyanmisaka return ret;
818*437bfbebSnyanmisaka }
819*437bfbebSnyanmisaka }
820*437bfbebSnyanmisaka
821*437bfbebSnyanmisaka if (JpegHalCtx->regs) {
822*437bfbebSnyanmisaka mpp_free(JpegHalCtx->regs);
823*437bfbebSnyanmisaka JpegHalCtx->regs = NULL;
824*437bfbebSnyanmisaka }
825*437bfbebSnyanmisaka
826*437bfbebSnyanmisaka JpegHalCtx->output_fmt = MPP_FMT_YUV420SP;
827*437bfbebSnyanmisaka JpegHalCtx->set_output_fmt_flag = 0;
828*437bfbebSnyanmisaka JpegHalCtx->hal_debug_enable = 0;
829*437bfbebSnyanmisaka JpegHalCtx->frame_count = 0;
830*437bfbebSnyanmisaka JpegHalCtx->output_yuv_count = 0;
831*437bfbebSnyanmisaka
832*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
833*437bfbebSnyanmisaka return MPP_OK;
834*437bfbebSnyanmisaka }
835*437bfbebSnyanmisaka
hal_jpegd_vdpu1_gen_regs(void * hal,HalTaskInfo * syn)836*437bfbebSnyanmisaka MPP_RET hal_jpegd_vdpu1_gen_regs(void *hal, HalTaskInfo *syn)
837*437bfbebSnyanmisaka {
838*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
839*437bfbebSnyanmisaka if (NULL == hal || NULL == syn) {
840*437bfbebSnyanmisaka mpp_err_f("NULL pointer");
841*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
842*437bfbebSnyanmisaka }
843*437bfbebSnyanmisaka
844*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
845*437bfbebSnyanmisaka JpegdHalCtx *JpegHalCtx = (JpegdHalCtx *)hal;
846*437bfbebSnyanmisaka JpegdSyntax *syntax = (JpegdSyntax *)syn->dec.syntax.data;
847*437bfbebSnyanmisaka MppBuffer streambuf = NULL;
848*437bfbebSnyanmisaka MppBuffer outputBuf = NULL;
849*437bfbebSnyanmisaka
850*437bfbebSnyanmisaka if (syn->dec.flags.parse_err)
851*437bfbebSnyanmisaka goto RET;
852*437bfbebSnyanmisaka
853*437bfbebSnyanmisaka ret = jpeg_image_check_size(syntax->hor_stride, syntax->ver_stride);
854*437bfbebSnyanmisaka if (ret)
855*437bfbebSnyanmisaka goto RET;
856*437bfbebSnyanmisaka
857*437bfbebSnyanmisaka if (syn->dec.valid) {
858*437bfbebSnyanmisaka jpegd_setup_output_fmt(JpegHalCtx, syntax, syn->dec.output);
859*437bfbebSnyanmisaka if (ret) {
860*437bfbebSnyanmisaka mpp_err_f("setup output format %x failed\n", syntax->output_fmt);
861*437bfbebSnyanmisaka goto RET;
862*437bfbebSnyanmisaka }
863*437bfbebSnyanmisaka
864*437bfbebSnyanmisaka /* input stream address */
865*437bfbebSnyanmisaka mpp_buf_slot_get_prop(JpegHalCtx->packet_slots, syn->dec.input,
866*437bfbebSnyanmisaka SLOT_BUFFER, &streambuf);
867*437bfbebSnyanmisaka JpegHalCtx->pkt_fd = mpp_buffer_get_fd(streambuf);
868*437bfbebSnyanmisaka if (JpegHalCtx->pkt_fd <= 0) {
869*437bfbebSnyanmisaka mpp_err_f("get pkt_fd failed\n");
870*437bfbebSnyanmisaka goto RET;
871*437bfbebSnyanmisaka }
872*437bfbebSnyanmisaka
873*437bfbebSnyanmisaka syntax->pkt_len = jpegd_vdpu_tail_0xFF_patch(streambuf, syntax->pkt_len);
874*437bfbebSnyanmisaka
875*437bfbebSnyanmisaka /* output picture address */
876*437bfbebSnyanmisaka mpp_buf_slot_get_prop(JpegHalCtx->frame_slots, syn->dec.output,
877*437bfbebSnyanmisaka SLOT_BUFFER, &outputBuf);
878*437bfbebSnyanmisaka JpegHalCtx->frame_fd = mpp_buffer_get_fd(outputBuf);
879*437bfbebSnyanmisaka if (JpegHalCtx->frame_fd <= 0) {
880*437bfbebSnyanmisaka mpp_err_f("get frame_fd failed\n");
881*437bfbebSnyanmisaka goto RET;
882*437bfbebSnyanmisaka }
883*437bfbebSnyanmisaka
884*437bfbebSnyanmisaka ret = jpegd_gen_regs(JpegHalCtx, syntax);
885*437bfbebSnyanmisaka mpp_buffer_sync_end(streambuf);
886*437bfbebSnyanmisaka mpp_buffer_sync_end(JpegHalCtx->pTableBase);
887*437bfbebSnyanmisaka if (ret != MPP_OK) {
888*437bfbebSnyanmisaka mpp_err_f("generate registers failed\n");
889*437bfbebSnyanmisaka goto RET;
890*437bfbebSnyanmisaka }
891*437bfbebSnyanmisaka }
892*437bfbebSnyanmisaka
893*437bfbebSnyanmisaka
894*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
895*437bfbebSnyanmisaka return ret;
896*437bfbebSnyanmisaka
897*437bfbebSnyanmisaka RET:
898*437bfbebSnyanmisaka syn->dec.valid = 0;
899*437bfbebSnyanmisaka syn->dec.flags.parse_err = 1;
900*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
901*437bfbebSnyanmisaka
902*437bfbebSnyanmisaka return ret;
903*437bfbebSnyanmisaka }
904*437bfbebSnyanmisaka
hal_jpegd_vdpu1_start(void * hal,HalTaskInfo * task)905*437bfbebSnyanmisaka MPP_RET hal_jpegd_vdpu1_start(void *hal, HalTaskInfo *task)
906*437bfbebSnyanmisaka {
907*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
908*437bfbebSnyanmisaka JpegdHalCtx *JpegHalCtx = (JpegdHalCtx *)hal;
909*437bfbebSnyanmisaka RK_U32 *regs = (RK_U32 *)JpegHalCtx->regs;
910*437bfbebSnyanmisaka
911*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
912*437bfbebSnyanmisaka if (task->dec.flags.parse_err)
913*437bfbebSnyanmisaka goto __RETURN;
914*437bfbebSnyanmisaka
915*437bfbebSnyanmisaka do {
916*437bfbebSnyanmisaka MppDevRegWrCfg wr_cfg;
917*437bfbebSnyanmisaka MppDevRegRdCfg rd_cfg;
918*437bfbebSnyanmisaka MppIoctlVersion ioctl_version = mpp_get_ioctl_version();
919*437bfbebSnyanmisaka RK_U32 reg_size = ioctl_version ?
920*437bfbebSnyanmisaka sizeof(((JpegdIocRegInfo *)0)->regs) :
921*437bfbebSnyanmisaka sizeof(JpegdIocRegInfo) - EXTRA_INFO_SIZE;
922*437bfbebSnyanmisaka
923*437bfbebSnyanmisaka if (ROCKCHIP_SOC_RK3036 == mpp_get_soc_type() &&
924*437bfbebSnyanmisaka IOCTL_VCODEC_SERVICE == ioctl_version)
925*437bfbebSnyanmisaka reg_size -= sizeof(((JpegdIocRegInfo *)0)->regs_diff);
926*437bfbebSnyanmisaka
927*437bfbebSnyanmisaka wr_cfg.reg = regs;
928*437bfbebSnyanmisaka wr_cfg.size = reg_size;
929*437bfbebSnyanmisaka wr_cfg.offset = 0;
930*437bfbebSnyanmisaka
931*437bfbebSnyanmisaka ret = mpp_dev_ioctl(JpegHalCtx->dev, MPP_DEV_REG_WR, &wr_cfg);
932*437bfbebSnyanmisaka if (ret) {
933*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
934*437bfbebSnyanmisaka goto __RETURN;
935*437bfbebSnyanmisaka }
936*437bfbebSnyanmisaka
937*437bfbebSnyanmisaka reg_size = sizeof(((JpegdIocRegInfo *)0)->regs);
938*437bfbebSnyanmisaka
939*437bfbebSnyanmisaka rd_cfg.reg = regs;
940*437bfbebSnyanmisaka rd_cfg.size = reg_size;
941*437bfbebSnyanmisaka rd_cfg.offset = 0;
942*437bfbebSnyanmisaka
943*437bfbebSnyanmisaka ret = mpp_dev_ioctl(JpegHalCtx->dev, MPP_DEV_REG_RD, &rd_cfg);
944*437bfbebSnyanmisaka if (ret) {
945*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
946*437bfbebSnyanmisaka goto __RETURN;
947*437bfbebSnyanmisaka }
948*437bfbebSnyanmisaka
949*437bfbebSnyanmisaka ret = mpp_dev_ioctl(JpegHalCtx->dev, MPP_DEV_CMD_SEND, NULL);
950*437bfbebSnyanmisaka if (ret) {
951*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
952*437bfbebSnyanmisaka goto __RETURN;
953*437bfbebSnyanmisaka }
954*437bfbebSnyanmisaka } while (0);
955*437bfbebSnyanmisaka
956*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
957*437bfbebSnyanmisaka return ret;
958*437bfbebSnyanmisaka
959*437bfbebSnyanmisaka __RETURN:
960*437bfbebSnyanmisaka task->dec.flags.parse_err = 1;
961*437bfbebSnyanmisaka
962*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
963*437bfbebSnyanmisaka return ret;
964*437bfbebSnyanmisaka }
965*437bfbebSnyanmisaka
hal_jpegd_vdpu1_wait(void * hal,HalTaskInfo * task)966*437bfbebSnyanmisaka MPP_RET hal_jpegd_vdpu1_wait(void *hal, HalTaskInfo *task)
967*437bfbebSnyanmisaka {
968*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
969*437bfbebSnyanmisaka JpegdHalCtx *JpegHalCtx = (JpegdHalCtx *)hal;
970*437bfbebSnyanmisaka JpegRegSet *reg_out = JpegHalCtx->regs;
971*437bfbebSnyanmisaka RK_U32 errinfo = 1;
972*437bfbebSnyanmisaka
973*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
974*437bfbebSnyanmisaka if (task->dec.flags.parse_err)
975*437bfbebSnyanmisaka goto __SKIP_HARD;
976*437bfbebSnyanmisaka
977*437bfbebSnyanmisaka ret = mpp_dev_ioctl(JpegHalCtx->dev, MPP_DEV_CMD_POLL, NULL);
978*437bfbebSnyanmisaka if (ret) {
979*437bfbebSnyanmisaka task->dec.flags.parse_err = 1;
980*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
981*437bfbebSnyanmisaka }
982*437bfbebSnyanmisaka
983*437bfbebSnyanmisaka __SKIP_HARD:
984*437bfbebSnyanmisaka if (JpegHalCtx->dec_cb) {
985*437bfbebSnyanmisaka DecCbHalDone param;
986*437bfbebSnyanmisaka
987*437bfbebSnyanmisaka param.task = (void *)&task->dec;
988*437bfbebSnyanmisaka param.regs = (RK_U32 *)reg_out;
989*437bfbebSnyanmisaka if (reg_out->reg1_interrupt.sw_dec_bus_int) {
990*437bfbebSnyanmisaka mpp_err_f("IRQ BUS ERROR!");
991*437bfbebSnyanmisaka } else if (reg_out->reg1_interrupt.sw_dec_error_int) {
992*437bfbebSnyanmisaka /*
993*437bfbebSnyanmisaka * NOTE: It is a bug of VDPU1, when sample color is YUV422,
994*437bfbebSnyanmisaka * YUV444, YUV411, the height could be aligned with 8 but not 16
995*437bfbebSnyanmisaka */
996*437bfbebSnyanmisaka if (JpegHalCtx->output_fmt != MPP_FMT_YUV420SP)
997*437bfbebSnyanmisaka ret = MPP_OK;
998*437bfbebSnyanmisaka else
999*437bfbebSnyanmisaka mpp_err_f("IRQ STREAM ERROR! %d", JpegHalCtx->output_fmt);
1000*437bfbebSnyanmisaka } else if (reg_out->reg1_interrupt.sw_dec_timeout) {
1001*437bfbebSnyanmisaka mpp_err_f("IRQ TIMEOUT!");
1002*437bfbebSnyanmisaka } else if (reg_out->reg1_interrupt.sw_dec_buffer_int) {
1003*437bfbebSnyanmisaka mpp_err_f("IRQ BUFFER EMPTY!");
1004*437bfbebSnyanmisaka } else if (reg_out->reg1_interrupt.sw_dec_irq) {
1005*437bfbebSnyanmisaka errinfo = 0;
1006*437bfbebSnyanmisaka jpegd_dbg_hal("DECODE SUCCESS!");
1007*437bfbebSnyanmisaka }
1008*437bfbebSnyanmisaka param.hard_err = errinfo;
1009*437bfbebSnyanmisaka mpp_callback(JpegHalCtx->dec_cb, ¶m);
1010*437bfbebSnyanmisaka }
1011*437bfbebSnyanmisaka
1012*437bfbebSnyanmisaka /* debug information */
1013*437bfbebSnyanmisaka if (jpegd_debug & JPEGD_DBG_IO) {
1014*437bfbebSnyanmisaka static FILE *jpg_file;
1015*437bfbebSnyanmisaka static char name[64];
1016*437bfbebSnyanmisaka MppBuffer outputBuf = NULL;
1017*437bfbebSnyanmisaka void *base = NULL;
1018*437bfbebSnyanmisaka mpp_buf_slot_get_prop(JpegHalCtx->frame_slots, task->dec.output,
1019*437bfbebSnyanmisaka SLOT_BUFFER, &outputBuf);
1020*437bfbebSnyanmisaka base = mpp_buffer_get_ptr(outputBuf);
1021*437bfbebSnyanmisaka
1022*437bfbebSnyanmisaka snprintf(name, sizeof(name) - 1, "/data/tmp/output%02d.yuv",
1023*437bfbebSnyanmisaka JpegHalCtx->output_yuv_count);
1024*437bfbebSnyanmisaka jpg_file = fopen(name, "wb+");
1025*437bfbebSnyanmisaka if (jpg_file) {
1026*437bfbebSnyanmisaka JpegdSyntax *s = (JpegdSyntax *)task->dec.syntax.data;
1027*437bfbebSnyanmisaka RK_U32 width = s->hor_stride;
1028*437bfbebSnyanmisaka RK_U32 height = s->ver_stride;
1029*437bfbebSnyanmisaka
1030*437bfbebSnyanmisaka fwrite(base, width * height * 3 / 2, 1, jpg_file);
1031*437bfbebSnyanmisaka jpegd_dbg_io("frame_%02d output YUV(%d*%d) saving to %s\n",
1032*437bfbebSnyanmisaka JpegHalCtx->output_yuv_count,
1033*437bfbebSnyanmisaka width, height, name);
1034*437bfbebSnyanmisaka
1035*437bfbebSnyanmisaka fclose(jpg_file);
1036*437bfbebSnyanmisaka JpegHalCtx->output_yuv_count++;
1037*437bfbebSnyanmisaka }
1038*437bfbebSnyanmisaka }
1039*437bfbebSnyanmisaka
1040*437bfbebSnyanmisaka memset(®_out->reg1_interrupt, 0, sizeof(RK_U32));
1041*437bfbebSnyanmisaka jpegd_dbg_func("exit\n");
1042*437bfbebSnyanmisaka
1043*437bfbebSnyanmisaka return ret;
1044*437bfbebSnyanmisaka }
1045*437bfbebSnyanmisaka
hal_jpegd_vdpu1_control(void * hal,MpiCmd cmd_type,void * param)1046*437bfbebSnyanmisaka MPP_RET hal_jpegd_vdpu1_control(void *hal, MpiCmd cmd_type, void *param)
1047*437bfbebSnyanmisaka {
1048*437bfbebSnyanmisaka jpegd_dbg_func("enter\n");
1049*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1050*437bfbebSnyanmisaka JpegdHalCtx *JpegHalCtx = (JpegdHalCtx *)hal;
1051*437bfbebSnyanmisaka if (NULL == JpegHalCtx) {
1052*437bfbebSnyanmisaka mpp_err_f("NULL pointer");
1053*437bfbebSnyanmisaka return MPP_ERR_NULL_PTR;
1054*437bfbebSnyanmisaka }
1055*437bfbebSnyanmisaka
1056*437bfbebSnyanmisaka switch (cmd_type) {
1057*437bfbebSnyanmisaka case MPP_DEC_SET_OUTPUT_FORMAT: {
1058*437bfbebSnyanmisaka JpegHalCtx->output_fmt = *((MppFrameFormat *)param);
1059*437bfbebSnyanmisaka JpegHalCtx->set_output_fmt_flag = 1;
1060*437bfbebSnyanmisaka jpegd_dbg_hal("output_format: 0x%x\n", JpegHalCtx->output_fmt);
1061*437bfbebSnyanmisaka
1062*437bfbebSnyanmisaka if (!MPP_FRAME_FMT_IS_YUV(JpegHalCtx->output_fmt) && !MPP_FRAME_FMT_IS_RGB(JpegHalCtx->output_fmt)) {
1063*437bfbebSnyanmisaka mpp_err_f("invalid output format 0x%x\n", JpegHalCtx->output_fmt);
1064*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
1065*437bfbebSnyanmisaka }
1066*437bfbebSnyanmisaka } break;
1067*437bfbebSnyanmisaka default :
1068*437bfbebSnyanmisaka break;
1069*437bfbebSnyanmisaka }
1070*437bfbebSnyanmisaka
1071*437bfbebSnyanmisaka jpegd_dbg_func("exit ret %d\n", ret);
1072*437bfbebSnyanmisaka return ret;
1073*437bfbebSnyanmisaka }
1074