1 /*
2 * Copyright (C) 2013 ROCKCHIP, Inc.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
15 #include <linux/delay.h>
16 #include <linux/slab.h>
17 #include "iep_iommu_ops.h"
18 #include "hw_iep_reg.h"
19 #include "iep.h"
20 #include "hw_iep_config_addr.h"
21
22 extern iep_service_info iep_service;
iep_config_src_size(struct IEP_MSG * iep_msg)23 static void iep_config_src_size(struct IEP_MSG *iep_msg)
24 {
25 IEP_REGB_SRC_IMG_WIDTH(iep_msg->base, iep_msg->src.act_w - 1);
26 IEP_REGB_SRC_IMG_HEIGHT(iep_msg->base, iep_msg->src.act_h - 1);
27 #ifdef IEP_PRINT_INFO
28 IEP_DBG(" //==source image size config===================//\n\n");
29 IEP_DBG("sw_src_img_height = %d;//source image height \n",
30 iep_msg->src.act_h - 1);
31 IEP_DBG("sw_src_img_width = %d;//source image width \n\n",
32 iep_msg->src.act_w - 1);
33 #endif
34 }
35
iep_config_dst_size(struct IEP_MSG * iep_msg)36 static void iep_config_dst_size(struct IEP_MSG *iep_msg)
37 {
38 IEP_REGB_DST_IMG_WIDTH(iep_msg->base, iep_msg->dst.act_w - 1);
39 IEP_REGB_DST_IMG_HEIGHT(iep_msg->base, iep_msg->dst.act_h - 1);
40 #ifdef IEP_PRINT_INFO
41 IEP_DBG(" //==destination image size config===================//\n\n");
42 IEP_DBG("sw_dst_img_height = %d;//source image height \n",
43 iep_msg->dst.act_h - 1);
44 IEP_DBG("sw_dst_img_width = %d;//source image width \n",
45 iep_msg->dst.act_w - 1);
46 #endif
47 }
48
iep_config_dst_width_tile(struct IEP_MSG * iep_msg)49 static void iep_config_dst_width_tile(struct IEP_MSG *iep_msg)
50 {
51 /*IEP_REGB_DST_IMG_WIDTH_TILE0();
52 IEP_REGB_DST_IMG_WIDTH_TILE1();
53 IEP_REGB_DST_IMG_WIDTH_TILE2();
54 IEP_REGB_DST_IMG_WIDTH_TILE3();*/
55 #ifdef IEP_PRINT_INFO
56 IEP_DBG("sw_dst_width_tile0 = 0;\n");
57 IEP_DBG("sw_dst_width_tile1 = 0;\n");
58 IEP_DBG("sw_dst_width_tile2 = 0;\n");
59 IEP_DBG("sw_dst_width_tile3 = 0;\n\n");
60 #endif
61 }
62
iep_config_dst_fmt(struct IEP_MSG * iep_msg)63 static void iep_config_dst_fmt(struct IEP_MSG *iep_msg)
64 {
65 unsigned int dst_fmt = 0;
66 unsigned int dst_rgb_swap = 0;
67 unsigned int dst_yuv_swap = 0;
68 switch (iep_msg->dst.format) {
69 case IEP_FORMAT_ARGB_8888 :
70 IEP_REGB_DST_FMT(iep_msg->base, 0);
71 IEP_REGB_DST_RGB_SWAP(iep_msg->base, 0);
72 dst_fmt = 0;
73 dst_rgb_swap = 0;
74 dst_yuv_swap = 0;
75 break;
76 case IEP_FORMAT_ABGR_8888 :
77 IEP_REGB_DST_FMT(iep_msg->base, 0);
78 IEP_REGB_DST_RGB_SWAP(iep_msg->base, 1);
79 dst_fmt = 0;
80 dst_rgb_swap = 1;
81 dst_yuv_swap = 0;
82 break;
83 case IEP_FORMAT_RGBA_8888 :
84 IEP_REGB_DST_FMT(iep_msg->base, 0);
85 IEP_REGB_DST_RGB_SWAP(iep_msg->base, 2);
86 dst_fmt = 0;
87 dst_rgb_swap = 2;
88 dst_yuv_swap = 0;
89 break;
90 case IEP_FORMAT_BGRA_8888 :
91 IEP_REGB_DST_FMT(iep_msg->base, 0);
92 IEP_REGB_DST_RGB_SWAP(iep_msg->base, 3);
93 dst_fmt = 0;
94 dst_rgb_swap = 3;
95 dst_yuv_swap = 0;
96 break;
97 case IEP_FORMAT_RGB_565 :
98 IEP_REGB_DST_FMT(iep_msg->base, 1);
99 IEP_REGB_DST_RGB_SWAP(iep_msg->base, 0);
100 dst_fmt = 1;
101 dst_rgb_swap = 0;
102 dst_yuv_swap = 0;
103 break;
104 case IEP_FORMAT_BGR_565 :
105 IEP_REGB_DST_FMT(iep_msg->base, 1);
106 IEP_REGB_DST_RGB_SWAP(iep_msg->base, 1);
107 dst_fmt = 1;
108 dst_rgb_swap = 1;
109 dst_yuv_swap = 0;
110 break;
111 case IEP_FORMAT_YCbCr_422_SP :
112 IEP_REGB_DST_FMT(iep_msg->base, 2);
113 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 0);
114 dst_fmt = 2;
115 dst_yuv_swap = 0;
116 break;
117 case IEP_FORMAT_YCbCr_422_P :
118 IEP_REGB_DST_FMT(iep_msg->base, 2);
119 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 2);
120 dst_fmt = 2;
121 dst_yuv_swap = 2;
122 break;
123 case IEP_FORMAT_YCbCr_420_SP :
124 IEP_REGB_DST_FMT(iep_msg->base, 3);
125 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 0);
126 dst_fmt = 3;
127 dst_yuv_swap = 0;
128 break;
129 case IEP_FORMAT_YCbCr_420_P :
130 IEP_REGB_DST_FMT(iep_msg->base, 3);
131 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 2);
132 dst_fmt = 3;
133 dst_yuv_swap = 2;
134 break;
135 case IEP_FORMAT_YCrCb_422_SP :
136 IEP_REGB_DST_FMT(iep_msg->base, 2);
137 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 1);
138 dst_fmt = 2;
139 dst_yuv_swap = 1;
140 break;
141 case IEP_FORMAT_YCrCb_422_P :
142 IEP_REGB_DST_FMT(iep_msg->base, 2);
143 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 2);
144 dst_fmt = 2;
145 dst_yuv_swap = 2;
146 break;
147 case IEP_FORMAT_YCrCb_420_SP :
148 IEP_REGB_DST_FMT(iep_msg->base, 3);
149 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 1);
150 dst_fmt = 3;
151 dst_yuv_swap = 1;
152 break;
153 case IEP_FORMAT_YCrCb_420_P :
154 IEP_REGB_DST_FMT(iep_msg->base, 3);
155 IEP_REGB_DST_YUV_SWAP(iep_msg->base, 2);
156 dst_fmt = 3;
157 dst_yuv_swap = 2;
158 break;
159 default:
160 break;
161 }
162 #ifdef IEP_PRINT_INFO
163 IEP_DBG(" //==destination data format config============//\n\n");
164 IEP_DBG("sw_dst_yuv_swap = %d;//0:sp uv; 1:sp vu; 2:p ;"
165 " 3:p;\n",
166 dst_yuv_swap);
167 IEP_DBG("sw_dst_rgb_swap = %d;//if ARGB 0:argb; "
168 "1,abgr; 2:rgba; 3:bgra; if rgb565: 0,2:rgb; 1,3:bgr;\n",
169 dst_rgb_swap);
170 IEP_DBG("sw_dst_fmt = %d;//0:argb; 1:rgb565; 2:yuv422;"
171 " 3:yuv420;\n\n", dst_fmt);
172 #endif
173 }
174
iep_config_src_fmt(struct IEP_MSG * iep_msg)175 static void iep_config_src_fmt(struct IEP_MSG *iep_msg)
176 {
177 unsigned int src_fmt = 0;
178 unsigned int src_rgb_swap = 0;
179 unsigned int src_yuv_swap = 0;
180 switch (iep_msg->src.format) {
181 case IEP_FORMAT_ARGB_8888 :
182 IEP_REGB_SRC_FMT(iep_msg->base, 0);
183 IEP_REGB_SRC_RGB_SWAP(iep_msg->base, 0);
184 src_fmt = 0;
185 src_rgb_swap = 0;
186 break;
187 case IEP_FORMAT_ABGR_8888 :
188 IEP_REGB_SRC_FMT(iep_msg->base, 0);
189 IEP_REGB_SRC_RGB_SWAP(iep_msg->base, 1);
190 src_fmt = 0;
191 src_rgb_swap = 1;
192 break;
193 case IEP_FORMAT_RGBA_8888 :
194 IEP_REGB_SRC_FMT(iep_msg->base, 0);
195 IEP_REGB_SRC_RGB_SWAP(iep_msg->base, 2);
196 src_fmt = 0;
197 src_rgb_swap = 2;
198 break;
199 case IEP_FORMAT_BGRA_8888 :
200 IEP_REGB_SRC_FMT(iep_msg->base, 0);
201 IEP_REGB_SRC_RGB_SWAP(iep_msg->base, 3);
202 src_fmt = 0;
203 src_rgb_swap = 3;
204 break;
205 case IEP_FORMAT_RGB_565 :
206 IEP_REGB_SRC_FMT(iep_msg->base, 1);
207 IEP_REGB_SRC_RGB_SWAP(iep_msg->base, 0);
208 src_fmt = 1;
209 src_rgb_swap = 0;
210 break;
211 case IEP_FORMAT_BGR_565 :
212 IEP_REGB_SRC_FMT(iep_msg->base, 1);
213 IEP_REGB_SRC_RGB_SWAP(iep_msg->base, 1);
214 src_fmt = 1;
215 src_rgb_swap = 1;
216 break;
217 case IEP_FORMAT_YCbCr_422_SP :
218 IEP_REGB_SRC_FMT(iep_msg->base, 2);
219 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 0);
220 src_fmt = 2;
221 src_yuv_swap = 0;
222 break;
223 case IEP_FORMAT_YCbCr_422_P :
224 IEP_REGB_SRC_FMT(iep_msg->base, 2);
225 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 2);
226 src_fmt = 2;
227 src_yuv_swap = 2;
228 break;
229 case IEP_FORMAT_YCbCr_420_SP :
230 IEP_REGB_SRC_FMT(iep_msg->base, 3);
231 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 0);
232 src_fmt = 3;
233 src_yuv_swap = 0;
234 break;
235 case IEP_FORMAT_YCbCr_420_P :
236 IEP_REGB_SRC_FMT(iep_msg->base, 3);
237 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 2);
238 src_fmt = 3;
239 src_yuv_swap = 2;
240 break;
241 case IEP_FORMAT_YCrCb_422_SP :
242 IEP_REGB_SRC_FMT(iep_msg->base, 2);
243 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 1);
244 src_fmt = 2;
245 src_yuv_swap = 1;
246 break;
247 case IEP_FORMAT_YCrCb_422_P :
248 IEP_REGB_SRC_FMT(iep_msg->base, 2);
249 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 2);
250 src_fmt = 2;
251 src_yuv_swap = 2;
252 break;
253 case IEP_FORMAT_YCrCb_420_SP :
254 IEP_REGB_SRC_FMT(iep_msg->base, 3);
255 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 1);
256 src_fmt = 3;
257 src_yuv_swap = 1;
258 break;
259 case IEP_FORMAT_YCrCb_420_P :
260 IEP_REGB_SRC_FMT(iep_msg->base, 3);
261 IEP_REGB_SRC_YUV_SWAP(iep_msg->base, 2);
262 src_fmt = 3;
263 src_yuv_swap = 2;
264 break;
265 default:
266 break;
267 }
268 #ifdef IEP_PRINT_INFO
269 IEP_DBG(" //==source data format config=================//\n\n");
270 IEP_DBG("sw_src_yuv_swap = %d;//0:sp uv; 1:sp vu;"
271 " 2:p ; 3:p;\n", src_yuv_swap);
272 IEP_DBG("sw_src_rgb_swap = %d;//if ARGB 0:argb; 1,abgr;"
273 " 2:rgba; 3:bgra; if rgb565: 0,2:rgb; 1,3:bgr;\n",
274 src_rgb_swap);
275 IEP_DBG("sw_src_fmt = %d;//0:argb; 1:rgb565;"
276 " 2:yuv422; 3:yuv420;\n\n", src_fmt);
277 #endif
278 }
279
iep_config_scl(struct IEP_MSG * iep_msg)280 static void iep_config_scl(struct IEP_MSG *iep_msg)
281 {
282 int scl_en;
283 int scl_sel;
284 //int vrt_fct;
285 //int hrz_fct;
286
287 unsigned int src_height, src_width, dst_height, dst_width;
288
289 int div_height_dst_src;
290 int div_width_dst_src;
291
292 src_height = iep_msg->src.act_h - 1;
293 src_width = iep_msg->src.act_w - 1;
294 dst_height = iep_msg->dst.act_h - 1;
295 dst_width = iep_msg->dst.act_w - 1;
296
297 if ((iep_msg->src.act_w == iep_msg->dst.act_w) &&
298 (iep_msg->src.act_h == iep_msg->dst.act_h))
299 scl_en = 0;
300 else
301 scl_en = 1;
302
303 if ((iep_msg->src.act_w >= iep_msg->dst.act_w) &&
304 (iep_msg->src.act_h >= iep_msg->dst.act_h))
305 scl_sel = 0;
306 else if ((iep_msg->src.act_w >= iep_msg->dst.act_w) &&
307 (iep_msg->src.act_h <= iep_msg->dst.act_h))
308 scl_sel = 1;
309 else if ((iep_msg->src.act_w <= iep_msg->dst.act_w) &&
310 (iep_msg->src.act_h >= iep_msg->dst.act_h))
311 scl_sel = 2;
312 else
313 scl_sel = 3;
314
315 //for vrt_fct
316 if ((scl_sel == 1) || (scl_sel == 3)) {
317 div_height_dst_src = src_height * 65536 / dst_height;
318 } else {
319 div_height_dst_src = (dst_height + 1) * 65536 /
320 (src_height + 1);
321 if ((div_height_dst_src * (src_height + 1)) <
322 ((dst_height + 1) * 65536))
323 div_height_dst_src = div_height_dst_src + 1;
324 }
325
326 if (div_height_dst_src == 65536)
327 div_height_dst_src = 0;
328
329 //for hrz_fct
330 if ((scl_sel == 2) || (scl_sel == 3)) {
331 div_width_dst_src = src_width * 65536 / dst_width;
332 } else {
333 div_width_dst_src = (dst_width + 1) * 65536 / (src_width + 1);
334 if ((div_width_dst_src * (src_width + 1)) <
335 ((dst_width + 1) * 65536))
336 div_width_dst_src = div_width_dst_src + 1;
337 }
338
339 if (div_width_dst_src == 65536)
340 div_width_dst_src = 0;
341
342
343 IEP_REGB_SCL_EN(iep_msg->base, scl_en);
344
345 if (scl_en == 1) {
346 IEP_REGB_SCL_SEL(iep_msg->base, scl_sel);
347 IEP_REGB_SCL_UP_COE_SEL(iep_msg->base, iep_msg->scale_up_mode);
348 IEP_REGB_SCL_VRT_FCT(iep_msg->base, div_height_dst_src);
349 IEP_REGB_SCL_HRZ_FCT(iep_msg->base, div_width_dst_src);
350 }
351 #ifdef IEP_PRINT_INFO
352 IEP_DBG(" //==scaling config============================//\n\n");
353 IEP_DBG("sw_scl_en = %d;//0:disable; 1:enable;\n",
354 scl_en);
355 IEP_DBG("sw_scl_sel = %d;//0:hrz down & vrt down;"
356 " 1:hrz down & vrt up; 2:hrz up & vrt down; 3:hrz up &"
357 " vrt up;\n", scl_sel);
358 IEP_DBG("sw_scl_up_coe_sel = %d;//select four groups of"
359 " up scaling coefficient\n", iep_msg->scale_up_mode);
360 IEP_DBG("sw_scl_vrt_fct = %d;//if up-scaling,equal"
361 " to floor(src_img_height/dst_image_height)*2^16;"
362 " if down-scaling,equal to ceiling(dst_image_height/"
363 "src_image_height)*2^16;\n", div_height_dst_src);
364 IEP_DBG("sw_scl_hrz_fct = %d;//if up-scaling,equal"
365 " to floor(src_img_widht/dst_image_width)*2^16; if"
366 " down-scaling,equal to ceiling(dst_image_width/"
367 "src_image_width)*2^16 ; \n\n", div_width_dst_src);
368 #endif
369 }
370
iep_config_cg_order(struct IEP_MSG * iep_msg)371 static void iep_config_cg_order(struct IEP_MSG *iep_msg)
372 {
373 IEP_REGB_CON_GAM_ORDER(iep_msg->base,
374 iep_msg->rgb_contrast_enhance_mode);
375 #ifdef IEP_PRINT_INFO
376 IEP_DBG(" //==rgb enhancement & denoise config==========//\n\n");
377 IEP_DBG("sw_con_gam_order = %d;//0:CG(contrast/gamma"
378 " operation)prior to DDE(de-noise/detail/edge enhance);"
379 " 1:DDE prior to CG;\n",
380 iep_msg->rgb_contrast_enhance_mode);
381 #endif
382 }
383
iep_config_cg(struct IEP_MSG * iep_msg)384 static void iep_config_cg(struct IEP_MSG *iep_msg)
385 {
386 unsigned i;
387 unsigned int cg_conf_addr;
388
389 IEP_REGB_RGB_CON_GAM_EN(iep_msg->base, iep_msg->rgb_cg_en);
390
391 if (iep_msg->rgb_cg_en) {
392 cg_conf_addr = rIEP_CG_TAB_ADDR;
393
394 for (i = 0; i < 192; i++) {
395 WriteReg32(iep_msg->base, cg_conf_addr,
396 iep_msg->cg_tab[i]);
397 cg_conf_addr += 0x04;
398 }
399 }
400
401 #ifdef IEP_PRINT_INFO
402 IEP_DBG("sw_rgb_con_gam_en = 0;//0:contrast"
403 " & gamma disable; 1:enable;\n",
404 iep_msg->rgb_cg_en);
405 #endif
406 }
407
iep_config_dde(struct IEP_MSG * iep_msg)408 static void iep_config_dde(struct IEP_MSG *iep_msg)
409 {
410 IEP_REGB_RGB_ENH_SEL(iep_msg->base, iep_msg->rgb_enhance_mode);
411 IEP_REGB_ENH_THRESHOLD(iep_msg->base, iep_msg->enh_threshold);
412 IEP_REGB_ENH_ALPHA(iep_msg->base, iep_msg->enh_alpha);
413 IEP_REGB_ENH_RADIUS(iep_msg->base, iep_msg->enh_radius);
414 #ifdef IEP_PRINT_INFO
415 IEP_DBG("sw_rgb_enh_sel = %d;//0:no operation;"
416 " 1:de-noise; 2:detail enhance; 3:edge enhance;\n",
417 iep_msg->rgb_enhance_mode);
418 #endif
419
420 }
421
iep_config_color_enh(struct IEP_MSG * iep_msg)422 static void iep_config_color_enh(struct IEP_MSG *iep_msg)
423 {
424 IEP_REGB_RGB_COLOR_ENH_EN(iep_msg->base, iep_msg->rgb_color_enhance_en);
425 IEP_REGB_ENH_C_COE(iep_msg->base, iep_msg->rgb_enh_coe);
426 #ifdef IEP_PRINT_INFO
427 IEP_DBG("sw_rgb_color_enh_en = %d;//0:color enhance disable;"
428 " 1:enable;\n\n",
429 iep_msg->rgb_color_enhance_en);
430 #endif
431 }
432
iep_config_yuv_dns(struct IEP_MSG * iep_msg)433 static void iep_config_yuv_dns(struct IEP_MSG *iep_msg)
434 {
435 IEP_REGB_YUV_DNS_EN(iep_msg->base, iep_msg->yuv_3D_denoise_en);
436 IEP_REGB_YUV_DNS_LUMA_SPAT_SEL(iep_msg->base, 0);
437 IEP_REGB_YUV_DNS_LUMA_TEMP_SEL(iep_msg->base, 1);
438 IEP_REGB_YUV_DNS_CHROMA_SPAT_SEL(iep_msg->base, 2);
439 IEP_REGB_YUV_DNS_CHROMA_TEMP_SEL(iep_msg->base, 3);
440 #ifdef IEP_PRINT_INFO
441 IEP_DBG("//==yuv denoise config========================// \n\n");
442 IEP_DBG("sw_yuv_dns_en = %d;//0:yuv 3d denoise disable;"
443 " 1:enable\n\n", iep_msg->yuv_3D_denoise_en);
444 #endif
445 }
446
447
iep_config_dil(struct IEP_MSG * iep_msg)448 static void iep_config_dil(struct IEP_MSG *iep_msg)
449 {
450 int dein_mode;
451 switch (iep_msg->dein_mode) {
452 case IEP_DEINTERLACE_MODE_DISABLE:
453 dein_mode = dein_mode_bypass_dis;
454 break;
455 case IEP_DEINTERLACE_MODE_I2O1:
456 dein_mode = iep_msg->field_order == FIELD_ORDER_TOP_FIRST ? dein_mode_I2O1T : dein_mode_I2O1B;
457 break;
458 case IEP_DEINTERLACE_MODE_I4O1:
459 #if 1
460 dein_mode = iep_msg->field_order == FIELD_ORDER_TOP_FIRST ? dein_mode_I4O1B : dein_mode_I4O1T;
461 #else
462 dein_mode = iep_msg->field_order == FIELD_ORDER_TOP_FIRST ? dein_mode_I4O1T : dein_mode_I4O1B;
463 #endif
464 break;
465 case IEP_DEINTERLACE_MODE_I4O2:
466 dein_mode = dein_mode_I4O2;
467 break;
468 case IEP_DEINTERLACE_MODE_BYPASS:
469 dein_mode = dein_mode_bypass;
470 break;
471 default:
472 IEP_ERR("unknown deinterlace mode, set deinterlace mode (bypass)\n");
473 dein_mode = dein_mode_bypass;
474 }
475
476 IEP_REGB_DIL_MODE(iep_msg->base, dein_mode);
477 //hf
478 IEP_REGB_DIL_HF_EN(iep_msg->base, iep_msg->dein_high_fre_en);
479 if (iep_msg->dein_high_fre_en == 1) IEP_REGB_DIL_HF_FCT(iep_msg->base, iep_msg->dein_high_fre_fct);
480 //ei
481 IEP_REGB_DIL_EI_MODE(iep_msg->base, iep_msg->dein_ei_mode);
482 IEP_REGB_DIL_EI_SMOOTH(iep_msg->base, iep_msg->dein_ei_smooth);
483 IEP_REGB_DIL_EI_SEL(iep_msg->base, iep_msg->dein_ei_sel);
484 if (iep_msg->dein_ei_sel == 0) IEP_REGB_DIL_EI_RADIUS(iep_msg->base, iep_msg->dein_ei_radius);
485 IEP_REGB_DIL_MTN_TAB0(iep_msg->base, 0x40404040);
486 IEP_REGB_DIL_MTN_TAB1(iep_msg->base, 0x3c3e3f3f);
487 IEP_REGB_DIL_MTN_TAB2(iep_msg->base, 0x3336393b);
488 IEP_REGB_DIL_MTN_TAB3(iep_msg->base, 0x272a2d31);
489 IEP_REGB_DIL_MTN_TAB4(iep_msg->base, 0x181c2023);
490 IEP_REGB_DIL_MTN_TAB5(iep_msg->base, 0x0c0e1215);
491 IEP_REGB_DIL_MTN_TAB6(iep_msg->base, 0x03040609);
492 IEP_REGB_DIL_MTN_TAB7(iep_msg->base, 0x00000001);
493 }
494
iep_config_yuv_enh(struct IEP_MSG * iep_msg)495 static void iep_config_yuv_enh(struct IEP_MSG *iep_msg)
496 {
497 IEP_REGB_YUV_ENH_EN(iep_msg->base, iep_msg->yuv_enhance_en);
498 if (iep_msg->yuv_enhance_en == 1) {
499 IEP_REGB_VIDEO_MODE(iep_msg->base, iep_msg->video_mode);
500 if (iep_msg->video_mode == normal_mode) {
501 IEP_REGB_SAT_CON(iep_msg->base, iep_msg->sat_con_int);
502 IEP_REGB_CONTRAST(iep_msg->base,
503 iep_msg->contrast_int);
504 IEP_REGB_BRIGHTNESS(iep_msg->base,
505 iep_msg->yuv_enh_brightness);
506 IEP_REGB_COS_HUE(iep_msg->base, iep_msg->cos_hue_int);
507 IEP_REGB_SIN_HUE(iep_msg->base, iep_msg->sin_hue_int);
508 } else if (iep_msg->video_mode == color_bar) { //color bar
509 IEP_REGB_COLOR_BAR_Y(iep_msg->base,
510 iep_msg->color_bar_y);
511 IEP_REGB_COLOR_BAR_U(iep_msg->base,
512 iep_msg->color_bar_u);
513 IEP_REGB_COLOR_BAR_V(iep_msg->base,
514 iep_msg->color_bar_v);
515 }
516
517 }
518 }
519
iep_config_rgb2yuv(struct IEP_MSG * iep_msg)520 static void iep_config_rgb2yuv(struct IEP_MSG *iep_msg)
521 {
522 unsigned char cond1, cond2;
523 unsigned int rgb2yuv_en = 0;
524
525 //rgb in,yuv out
526 cond1 = ((iep_msg->src.format <= 5) && (iep_msg->dst.format > 5)) ?
527 1 : 0;
528
529 //rgb process,yuv out
530 cond2 = (((iep_msg->rgb_color_enhance_en == 1) ||
531 (iep_msg->rgb_cg_en == 1) ||
532 (iep_msg->rgb_enhance_mode != rgb_enhance_bypass)) &&
533 (iep_msg->dst.format > 5)) ? 1 : 0;
534
535
536 if ((cond1 == 1) || (cond2 == 1)) {
537 IEP_REGB_RGB_TO_YUV_EN(iep_msg->base, 1);
538 rgb2yuv_en = 1;
539 IEP_REGB_RGB2YUV_COE_SEL(iep_msg->base, iep_msg->rgb2yuv_mode);
540 IEP_REGB_RGB2YUV_INPUT_CLIP(iep_msg->base,
541 iep_msg->rgb2yuv_clip_en);
542 } else
543 IEP_REGB_RGB_TO_YUV_EN(iep_msg->base, 0);
544 #ifdef IEP_PRINT_INFO
545 IEP_DBG("//==color space conversion config============//\n\n");
546 IEP_DBG("sw_rgb_to_yuv_en = %d;\n", rgb2yuv_en);
547 IEP_DBG("sw_rgb2yuv_coe_sel = %d;\n", iep_msg->rgb2yuv_mode);
548 IEP_DBG("sw_rgb2yuv_input_clip = %d;\n\n", iep_msg->rgb2yuv_clip_en);
549 #endif
550
551 }
552
iep_config_yuv2rgb(struct IEP_MSG * iep_msg)553 static void iep_config_yuv2rgb(struct IEP_MSG *iep_msg)
554 {
555 unsigned char cond1, cond2;
556 unsigned int yuv2rgb_en = 0;
557
558 //yuv in,rgb out
559 cond1 = ((iep_msg->src.format > 5) &&
560 (iep_msg->dst.format <= 5)) ? 1 : 0;
561
562 //yuv in,rgb process
563 cond2 = (((iep_msg->rgb_color_enhance_en == 1) ||
564 (iep_msg->rgb_cg_en == 1) ||
565 (iep_msg->rgb_enhance_mode != rgb_enhance_bypass)) &&
566 (iep_msg->src.format > 5)) ? 1 : 0;
567
568 if ((cond1 == 1) || (cond2 == 1)) {
569 IEP_REGB_YUV_TO_RGB_EN(iep_msg->base, 1);
570 yuv2rgb_en = 1;
571 IEP_REGB_YUV2RGB_COE_SEL(iep_msg->base,
572 iep_msg->yuv2rgb_mode);
573 IEP_REGB_YUV2RGB_INPUT_CLIP(iep_msg->base,
574 iep_msg->yuv2rgb_clip_en);
575 } else {
576 IEP_REGB_YUV_TO_RGB_EN(iep_msg->base, 0);
577 }
578 #ifdef IEP_PRINT_INFO
579 IEP_DBG("sw_yuv_to_rgb_en = %d;\n", yuv2rgb_en);
580 IEP_DBG("sw_yuv2rgb_coe_sel = %d;\n", iep_msg->yuv2rgb_mode);
581 IEP_DBG("sw_yuv2rgb_input_clip = %d;\n\n", iep_msg->yuv2rgb_clip_en);
582 #endif
583 }
584
iep_config_dither_up(struct IEP_MSG * iep_msg)585 static void iep_config_dither_up(struct IEP_MSG *iep_msg)
586 {
587 unsigned int dither_up = 0;
588 if ((iep_msg->src.format == IEP_FORMAT_RGB_565) ||
589 (iep_msg->src.format == IEP_FORMAT_BGR_565)) {
590 IEP_REGB_DITHER_UP_EN(iep_msg->base, iep_msg->dither_up_en);
591 dither_up = iep_msg->dither_up_en;
592 } else {
593 IEP_REGB_DITHER_UP_EN(iep_msg->base, 0);
594 }
595 #ifdef IEP_PRINT_INFO
596 IEP_DBG("//==dither config=============================//\n\n");
597 IEP_DBG("sw_dither_up_en = %d;\n", dither_up);
598 #endif
599 }
600
iep_config_dither_down(struct IEP_MSG * iep_msg)601 static void iep_config_dither_down(struct IEP_MSG *iep_msg)
602 {
603 unsigned int dither_down = 0;
604 if ((iep_msg->dst.format == IEP_FORMAT_RGB_565) ||
605 (iep_msg->dst.format == IEP_FORMAT_BGR_565)) {
606 IEP_REGB_DITHER_DOWN_EN(iep_msg->base, 1);
607 dither_down = 1;
608 } else {
609 IEP_REGB_DITHER_DOWN_EN(iep_msg->base, 0);
610 }
611 #ifdef IEP_PRINT_INFO
612 IEP_DBG("sw_dither_down_en = %d;\n\n", dither_down);
613 #endif
614 }
615
iep_config_glb_alpha(struct IEP_MSG * iep_msg)616 static void iep_config_glb_alpha(struct IEP_MSG *iep_msg)
617 {
618 IEP_REGB_GLB_ALPHA(iep_msg->base, iep_msg->global_alpha_value);
619 #ifdef IEP_PRINT_INFO
620 IEP_DBG("//==global alpha for ARGB config=============//\n\n");
621 IEP_DBG("sw_glb_alpha = %d;//global alpha value for output ARGB\n\n",
622 iep_msg->global_alpha_value);
623 #endif
624 }
625
iep_config_vir_line(struct IEP_MSG * iep_msg)626 static void iep_config_vir_line(struct IEP_MSG *iep_msg)
627 {
628 unsigned int src_vir_w;
629 unsigned int dst_vir_w;
630
631 switch (iep_msg->src.format) {
632 case IEP_FORMAT_ARGB_8888 :
633 src_vir_w = iep_msg->src.vir_w;
634 break;
635 case IEP_FORMAT_ABGR_8888 :
636 src_vir_w = iep_msg->src.vir_w;
637 break;
638 case IEP_FORMAT_RGBA_8888 :
639 src_vir_w = iep_msg->src.vir_w;
640 break;
641 case IEP_FORMAT_BGRA_8888 :
642 src_vir_w = iep_msg->src.vir_w;
643 break;
644 case IEP_FORMAT_RGB_565 :
645 if (iep_msg->src.vir_w % 2 == 1)
646 src_vir_w = (iep_msg->src.vir_w + 1) / 2;
647 else
648 src_vir_w = iep_msg->src.vir_w / 2;
649 break;
650 case IEP_FORMAT_BGR_565 :
651 if (iep_msg->src.vir_w % 2 == 1)
652 src_vir_w = iep_msg->src.vir_w / 2 + 1;
653 else
654 src_vir_w = iep_msg->src.vir_w / 2;
655 break;
656 case IEP_FORMAT_YCbCr_422_SP :
657 if (iep_msg->src.vir_w % 4 != 0)
658 src_vir_w = iep_msg->src.vir_w / 4 + 1;
659 else
660 src_vir_w = iep_msg->src.vir_w / 4;
661 break;
662 case IEP_FORMAT_YCbCr_422_P :
663 if (iep_msg->src.vir_w % 4 != 0)
664 src_vir_w = iep_msg->src.vir_w / 4 + 1;
665 else
666 src_vir_w = iep_msg->src.vir_w / 4;
667 break;
668 case IEP_FORMAT_YCbCr_420_SP :
669 if (iep_msg->src.vir_w % 4 != 0)
670 src_vir_w = iep_msg->src.vir_w / 4 + 1;
671 else
672 src_vir_w = iep_msg->src.vir_w / 4;
673 break;
674 case IEP_FORMAT_YCbCr_420_P :
675 if (iep_msg->src.vir_w % 4 != 0)
676 src_vir_w = iep_msg->src.vir_w / 4 + 1;
677 else
678 src_vir_w = iep_msg->src.vir_w / 4;
679 break;
680 case IEP_FORMAT_YCrCb_422_SP :
681 if (iep_msg->src.vir_w % 4 != 0)
682 src_vir_w = iep_msg->src.vir_w / 4 + 1;
683 else
684 src_vir_w = iep_msg->src.vir_w / 4;
685 break;
686 case IEP_FORMAT_YCrCb_422_P :
687 if (iep_msg->src.vir_w % 4 != 0)
688 src_vir_w = iep_msg->src.vir_w / 4 + 1;
689 else
690 src_vir_w = iep_msg->src.vir_w / 4;
691 break;
692 case IEP_FORMAT_YCrCb_420_SP :
693 if (iep_msg->src.vir_w % 4 != 0)
694 src_vir_w = iep_msg->src.vir_w / 4 + 1;
695 else
696 src_vir_w = iep_msg->src.vir_w / 4;
697 break;
698 case IEP_FORMAT_YCrCb_420_P :
699 if (iep_msg->src.vir_w % 4 != 0)
700 src_vir_w = iep_msg->src.vir_w / 4 + 1;
701 else
702 src_vir_w = iep_msg->src.vir_w / 4;
703 break;
704 default:
705 IEP_ERR("Unkown format,"
706 "set the source image virtual width 0\n");
707 src_vir_w = 0;
708 break;
709 }
710
711 switch (iep_msg->dst.format) {
712 case IEP_FORMAT_ARGB_8888 :
713 dst_vir_w = iep_msg->dst.vir_w;
714 break;
715 case IEP_FORMAT_ABGR_8888 :
716 dst_vir_w = iep_msg->dst.vir_w;
717 break;
718 case IEP_FORMAT_RGBA_8888 :
719 dst_vir_w = iep_msg->dst.vir_w;
720 break;
721 case IEP_FORMAT_BGRA_8888 :
722 dst_vir_w = iep_msg->dst.vir_w;
723 break;
724 case IEP_FORMAT_RGB_565 :
725 if (iep_msg->dst.vir_w % 2 == 1)
726 dst_vir_w = (iep_msg->dst.vir_w + 1) / 2;
727 else
728 dst_vir_w = iep_msg->dst.vir_w / 2;
729 break;
730 case IEP_FORMAT_BGR_565 :
731 if (iep_msg->dst.vir_w % 2 == 1)
732 dst_vir_w = iep_msg->dst.vir_w / 2 + 1;
733 else
734 dst_vir_w = iep_msg->dst.vir_w / 2;
735 break;
736 case IEP_FORMAT_YCbCr_422_SP :
737 if (iep_msg->dst.vir_w % 4 != 0)
738 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
739 else
740 dst_vir_w = iep_msg->dst.vir_w / 4;
741 break;
742 case IEP_FORMAT_YCbCr_422_P :
743 if (iep_msg->dst.vir_w % 4 != 0)
744 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
745 else
746 dst_vir_w = iep_msg->dst.vir_w / 4;
747 break;
748 case IEP_FORMAT_YCbCr_420_SP :
749 if (iep_msg->dst.vir_w % 4 != 0)
750 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
751 else
752 dst_vir_w = iep_msg->dst.vir_w / 4;
753 break;
754 case IEP_FORMAT_YCbCr_420_P :
755 if (iep_msg->dst.vir_w % 4 != 0)
756 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
757 else
758 dst_vir_w = iep_msg->dst.vir_w / 4;
759 break;
760 case IEP_FORMAT_YCrCb_422_SP :
761 if (iep_msg->dst.vir_w % 4 != 0)
762 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
763 else
764 dst_vir_w = iep_msg->dst.vir_w / 4;
765 break;
766 case IEP_FORMAT_YCrCb_422_P :
767 if (iep_msg->dst.vir_w % 4 != 0)
768 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
769 else
770 dst_vir_w = iep_msg->dst.vir_w / 4;
771 break;
772 case IEP_FORMAT_YCrCb_420_SP :
773 if (iep_msg->dst.vir_w % 4 != 0)
774 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
775 else
776 dst_vir_w = iep_msg->dst.vir_w / 4;
777 break;
778 case IEP_FORMAT_YCrCb_420_P :
779 if (iep_msg->dst.vir_w % 4 != 0)
780 dst_vir_w = iep_msg->dst.vir_w / 4 + 1;
781 else
782 dst_vir_w = iep_msg->dst.vir_w / 4;
783 break;
784 default:
785 IEP_ERR("Unkown format, set the destination"
786 " image virtual width 0\n");
787 dst_vir_w = 0;
788 break;
789 }
790 IEP_REGB_DST_VIR_LINE_WIDTH(iep_msg->base, dst_vir_w);
791 IEP_REGB_SRC_VIR_LINE_WIDTH(iep_msg->base, src_vir_w);
792 }
793
iep_config_src_addr(struct IEP_MSG * iep_msg)794 static void iep_config_src_addr(struct IEP_MSG *iep_msg)
795 {
796 u32 src_addr_yrgb;
797 u32 src_addr_cbcr;
798 u32 src_addr_cr;
799 u32 src_addr_y1;
800 u32 src_addr_cbcr1;
801 u32 src_addr_cr1;
802 u32 src_addr_y_itemp;
803 u32 src_addr_cbcr_itemp;
804 u32 src_addr_cr_itemp;
805 u32 src_addr_y_ftemp;
806 u32 src_addr_cbcr_ftemp;
807 u32 src_addr_cr_ftemp;
808 unsigned int offset_addr_y = 0;
809 unsigned int offset_addr_uv = 0;
810 unsigned int offset_addr_v = 0;
811 //unsigned int offset_addr_y_w = 0;
812 unsigned int offset_addr_uv_w = 0;
813 unsigned int offset_addr_v_w = 0;
814 //unsigned int offset_addr_y_h = 0;
815 unsigned int offset_addr_uv_h = 0;
816 unsigned int offset_addr_v_h = 0;
817
818 unsigned int offset_x_equ_uv;
819 unsigned int offset_x_u_byte;
820 unsigned int offset_x_v_byte;
821 unsigned int vir_w_euq_uv;
822 unsigned int line_u_byte;
823 unsigned int line_v_byte;
824 unsigned int offset_y_equ_420_uv = 0;
825
826 //**********************************************//
827 //***********y addr offset**********************//
828 //**********************************************//
829 if (iep_msg->src.format <= 3) {
830 offset_addr_y = iep_msg->src.y_off * 4 *
831 iep_msg->src.vir_w + iep_msg->src.x_off * 4;
832 } else if (iep_msg->src.format <= 5) {
833 offset_addr_y = iep_msg->src.y_off * 2 *
834 iep_msg->src.vir_w + iep_msg->src.x_off * 2;
835 } else {
836 offset_addr_y = iep_msg->src.y_off *
837 iep_msg->src.vir_w + iep_msg->src.x_off;
838 }
839
840 //**********************************************//
841 //***********uv addr offset*********************//
842 //**********************************************//
843 // note: image size align to even when image format is yuv
844
845 //----------offset_w--------//
846 if (iep_msg->src.x_off % 2 == 1)
847 offset_x_equ_uv = iep_msg->src.x_off + 1;
848 else
849 offset_x_equ_uv = iep_msg->src.x_off;
850
851 offset_x_u_byte = offset_x_equ_uv / 2;
852 offset_x_v_byte = offset_x_equ_uv / 2;
853
854 if ((iep_msg->src.format == IEP_FORMAT_YCbCr_422_SP) ||
855 (iep_msg->src.format == IEP_FORMAT_YCbCr_420_SP)
856 || (iep_msg->src.format == IEP_FORMAT_YCrCb_422_SP) ||
857 (iep_msg->src.format == IEP_FORMAT_YCrCb_420_SP))
858 offset_addr_uv_w = offset_x_u_byte + offset_x_v_byte;
859 else {
860 offset_addr_uv_w = offset_x_u_byte;
861 offset_addr_v_w = offset_x_v_byte;
862 }
863
864 //----------offset_h--------//
865 if (iep_msg->src.vir_w % 2 == 1)
866 vir_w_euq_uv = iep_msg->src.vir_w + 1;
867 else
868 vir_w_euq_uv = iep_msg->src.vir_w;
869
870 line_u_byte = vir_w_euq_uv / 2;
871 line_v_byte = vir_w_euq_uv / 2;
872
873 if (iep_msg->src.y_off % 2 == 1)
874 offset_y_equ_420_uv = iep_msg->src.y_off + 1;
875 else
876 offset_y_equ_420_uv = iep_msg->src.y_off;
877
878 switch (iep_msg->src.format) {
879 case IEP_FORMAT_YCbCr_422_SP :
880 offset_addr_uv_h = (line_u_byte + line_v_byte) *
881 iep_msg->src.y_off;
882 break;
883 case IEP_FORMAT_YCbCr_422_P :
884 offset_addr_uv_h = line_u_byte * iep_msg->src.y_off;
885 offset_addr_v_h = line_v_byte * iep_msg->src.y_off;
886 break;
887 case IEP_FORMAT_YCbCr_420_SP :
888 offset_addr_uv_h = (line_u_byte + line_v_byte) *
889 offset_y_equ_420_uv / 2;
890 break;
891 case IEP_FORMAT_YCbCr_420_P :
892 offset_addr_uv_h = line_u_byte * offset_y_equ_420_uv / 2;
893 offset_addr_v_h = line_v_byte * offset_y_equ_420_uv / 2;
894 break;
895 case IEP_FORMAT_YCrCb_422_SP :
896 offset_addr_uv_h = (line_u_byte + line_v_byte) *
897 iep_msg->src.y_off;
898 break;
899 case IEP_FORMAT_YCrCb_422_P :
900 offset_addr_uv_h = line_u_byte * iep_msg->src.y_off;
901 offset_addr_v_h = line_v_byte * iep_msg->src.y_off;
902 break;
903 case IEP_FORMAT_YCrCb_420_SP :
904 offset_addr_uv_h = (line_u_byte + line_v_byte) *
905 offset_y_equ_420_uv / 2;
906 break;
907 case IEP_FORMAT_YCrCb_420_P :
908 offset_addr_uv_h = line_u_byte * offset_y_equ_420_uv / 2;
909 offset_addr_v_h = line_v_byte * offset_y_equ_420_uv / 2;
910 break;
911 default:
912 break;
913 }
914 //----------offset u/v addr--------//
915
916 offset_addr_uv = offset_addr_uv_w + offset_addr_uv_h;
917 offset_addr_v = offset_addr_v_w + offset_addr_v_h;
918 //**********************************************//
919 //***********yuv address *********************//
920 //**********************************************//
921 if (iep_service.iommu_dev == NULL) {
922 src_addr_yrgb = ((u32)iep_msg->src.mem_addr) + offset_addr_y;
923 src_addr_cbcr = ((u32)iep_msg->src.uv_addr) + offset_addr_uv;
924 src_addr_cr = ((u32)iep_msg->src.v_addr) + offset_addr_v;
925
926 src_addr_y1 = ((u32)iep_msg->src1.mem_addr) + offset_addr_y;
927 src_addr_cbcr1 = ((u32)iep_msg->src1.uv_addr) + offset_addr_uv;
928 src_addr_cr1 = ((u32)iep_msg->src1.v_addr) + offset_addr_v;
929
930 src_addr_y_itemp = ((u32)iep_msg->src_itemp.mem_addr) +
931 offset_addr_y;
932 src_addr_cbcr_itemp = ((u32)iep_msg->src_itemp.uv_addr) +
933 offset_addr_uv;
934 src_addr_cr_itemp = ((u32)iep_msg->src_itemp.v_addr) +
935 offset_addr_v;
936
937 src_addr_y_ftemp = ((u32)iep_msg->src_ftemp.mem_addr) +
938 offset_addr_y;
939 src_addr_cbcr_ftemp = ((u32)iep_msg->src_ftemp.uv_addr) +
940 offset_addr_uv;
941 src_addr_cr_ftemp = ((u32)iep_msg->src_ftemp.v_addr) +
942 offset_addr_v;
943 } else {
944 src_addr_yrgb = ((u32)iep_msg->src.mem_addr) + (offset_addr_y << 10);
945 src_addr_cbcr = ((u32)iep_msg->src.uv_addr) + (offset_addr_uv << 10);
946 src_addr_cr = ((u32)iep_msg->src.v_addr) + (offset_addr_v << 10);
947
948 src_addr_y1 = ((u32)iep_msg->src1.mem_addr) + (offset_addr_y << 10);
949 src_addr_cbcr1 = ((u32)iep_msg->src1.uv_addr) + (offset_addr_uv << 10);
950 src_addr_cr1 = ((u32)iep_msg->src1.v_addr) + (offset_addr_v << 10);
951
952 src_addr_y_itemp = ((u32)iep_msg->src_itemp.mem_addr) +
953 (offset_addr_y << 10);
954 src_addr_cbcr_itemp = ((u32)iep_msg->src_itemp.uv_addr) +
955 (offset_addr_uv << 10);
956 src_addr_cr_itemp = ((u32)iep_msg->src_itemp.v_addr) +
957 (offset_addr_v << 10);
958
959 src_addr_y_ftemp = ((u32)iep_msg->src_ftemp.mem_addr) +
960 (offset_addr_y << 10);
961 src_addr_cbcr_ftemp = ((u32)iep_msg->src_ftemp.uv_addr) +
962 (offset_addr_uv << 10);
963 src_addr_cr_ftemp = ((u32)iep_msg->src_ftemp.v_addr) +
964 (offset_addr_v << 10);
965 }
966
967 if ((iep_msg->dein_mode == IEP_DEINTERLACE_MODE_I4O1 ||
968 iep_msg->dein_mode == IEP_DEINTERLACE_MODE_I4O2) &&
969 #if 1
970 iep_msg->field_order == FIELD_ORDER_BOTTOM_FIRST
971 #else
972 iep_msg->field_order == FIELD_ORDER_TOP_FIRST
973 #endif
974 ) {
975 IEP_REGB_SRC_ADDR_YRGB(iep_msg->base, src_addr_y1);
976 IEP_REGB_SRC_ADDR_CBCR(iep_msg->base, src_addr_cbcr1);
977 IEP_REGB_SRC_ADDR_CR(iep_msg->base, src_addr_cr1);
978 IEP_REGB_SRC_ADDR_Y1(iep_msg->base, src_addr_yrgb);
979 IEP_REGB_SRC_ADDR_CBCR1(iep_msg->base, src_addr_cbcr);
980 IEP_REGB_SRC_ADDR_CR1(iep_msg->base, src_addr_cr);
981 } else {
982 IEP_REGB_SRC_ADDR_YRGB(iep_msg->base, src_addr_yrgb);
983 IEP_REGB_SRC_ADDR_CBCR(iep_msg->base, src_addr_cbcr);
984 IEP_REGB_SRC_ADDR_CR(iep_msg->base, src_addr_cr);
985 IEP_REGB_SRC_ADDR_Y1(iep_msg->base, src_addr_y1);
986 IEP_REGB_SRC_ADDR_CBCR1(iep_msg->base, src_addr_cbcr1);
987 IEP_REGB_SRC_ADDR_CR1(iep_msg->base, src_addr_cr1);
988 }
989
990 if (iep_msg->yuv_3D_denoise_en) {
991 IEP_REGB_SRC_ADDR_Y_ITEMP(iep_msg->base,
992 src_addr_y_itemp);
993 IEP_REGB_SRC_ADDR_CBCR_ITEMP(iep_msg->base,
994 src_addr_cbcr_itemp);
995 IEP_REGB_SRC_ADDR_Y_FTEMP(iep_msg->base,
996 src_addr_y_ftemp);
997 IEP_REGB_SRC_ADDR_CBCR_FTEMP(iep_msg->base,
998 src_addr_cbcr_ftemp);
999 if ((iep_msg->src.format == IEP_FORMAT_YCbCr_422_P) ||
1000 (iep_msg->src.format == IEP_FORMAT_YCbCr_420_P)
1001 || (iep_msg->src.format == IEP_FORMAT_YCrCb_422_P) ||
1002 (iep_msg->src.format == IEP_FORMAT_YCrCb_420_P)) {
1003 IEP_REGB_SRC_ADDR_CR_ITEMP(iep_msg->base,
1004 src_addr_cr_itemp);
1005 IEP_REGB_SRC_ADDR_CR_FTEMP(iep_msg->base,
1006 src_addr_cr_ftemp);
1007 }
1008 }
1009 #ifdef IEP_PRINT_INFO
1010 IEP_DBG("//-------source address for image-------// \n\n");
1011 IEP_DBG("sw_src_addr_yrgb = 32'h%x;\n", src_addr_yrgb);
1012 IEP_DBG("sw_src_addr_cbcr = 32'h%x;\n", src_addr_cbcr);
1013 IEP_DBG("sw_src_addr_cr = 32'h%x;\n", src_addr_cr);
1014 IEP_DBG("sw_src_addr_y1 = 32'h%x;\n", src_addr_y1);
1015 IEP_DBG("sw_src_addr_cbcr0 = 32'h%x;\n", src_addr_cbcr1);
1016 IEP_DBG("sw_src_addr_cr0 = 32'h%x;\n", src_addr_cr1);
1017 IEP_DBG("sw_src_addr_y_itemp = 32'h%x;\n", src_addr_y_itemp);
1018 IEP_DBG("sw_src_addr_cbcr_itemp = 32'h%x;\n", src_addr_cbcr_itemp);
1019 IEP_DBG("sw_src_addr_cr_itemp = 32'h%x;\n", src_addr_cr_itemp);
1020 IEP_DBG("sw_src_addr_y_ftemp = 32'h%x;\n", src_addr_y_ftemp);
1021 IEP_DBG("sw_src_addr_cbcr_ftemp = 32'h%x;\n", src_addr_cbcr_ftemp);
1022 IEP_DBG("sw_src_addr_cr_ftemp = 32'h%x;\n\n", src_addr_cr_ftemp);
1023 #endif
1024 }
1025
iep_config_dst_addr(struct IEP_MSG * iep_msg)1026 static void iep_config_dst_addr(struct IEP_MSG *iep_msg)
1027 {
1028 u32 dst_addr_yrgb;
1029 u32 dst_addr_cbcr;
1030 u32 dst_addr_cr;
1031 u32 dst_addr_y1;
1032 u32 dst_addr_cbcr1;
1033 u32 dst_addr_cr1;
1034 u32 dst_addr_y_itemp;
1035 u32 dst_addr_cbcr_itemp;
1036 u32 dst_addr_cr_itemp;
1037 u32 dst_addr_y_ftemp;
1038 u32 dst_addr_cbcr_ftemp;
1039 u32 dst_addr_cr_ftemp;
1040 unsigned int offset_addr_y = 0;
1041 unsigned int offset_addr_uv = 0;
1042 unsigned int offset_addr_v = 0;
1043 //unsigned int offset_addr_y_w = 0;
1044 unsigned int offset_addr_uv_w = 0;
1045 unsigned int offset_addr_v_w = 0;
1046 //unsigned int offset_addr_y_h = 0;
1047 unsigned int offset_addr_uv_h = 0;
1048 unsigned int offset_addr_v_h = 0;
1049
1050 unsigned int offset_x_equ_uv;
1051 unsigned int offset_x_u_byte;
1052 unsigned int offset_x_v_byte;
1053 unsigned int vir_w_euq_uv;
1054 unsigned int line_u_byte;
1055 unsigned int line_v_byte;
1056 unsigned int offset_y_equ_420_uv = 0;
1057
1058 //**********************************************//
1059 //***********y addr offset**********************//
1060 //**********************************************//
1061 if (iep_msg->dst.format <= 3) {
1062 offset_addr_y = iep_msg->dst.y_off * 4 *
1063 iep_msg->dst.vir_w + iep_msg->dst.x_off * 4;
1064 } else if (iep_msg->dst.format <= 5) {
1065 offset_addr_y = iep_msg->dst.y_off * 2 *
1066 iep_msg->dst.vir_w + iep_msg->dst.x_off * 2;
1067 } else {
1068 offset_addr_y = iep_msg->dst.y_off *
1069 iep_msg->dst.vir_w + iep_msg->dst.x_off;
1070 }
1071
1072 //**********************************************//
1073 //***********uv addr offset*********************//
1074 //**********************************************//
1075 // note: image size align to even when image format is yuv
1076
1077 //----------offset_w--------//
1078 if (iep_msg->dst.x_off % 2 == 1)
1079 offset_x_equ_uv = iep_msg->dst.x_off + 1;
1080 else
1081 offset_x_equ_uv = iep_msg->dst.x_off;
1082
1083 offset_x_u_byte = offset_x_equ_uv / 2;
1084 offset_x_v_byte = offset_x_equ_uv / 2;
1085
1086 if ((iep_msg->dst.format == IEP_FORMAT_YCbCr_422_SP) ||
1087 (iep_msg->dst.format == IEP_FORMAT_YCbCr_420_SP)
1088 || (iep_msg->dst.format == IEP_FORMAT_YCrCb_422_SP) ||
1089 (iep_msg->dst.format == IEP_FORMAT_YCrCb_420_SP))
1090 offset_addr_uv_w = offset_x_u_byte + offset_x_v_byte;
1091 else {
1092 offset_addr_uv_w = offset_x_u_byte;
1093 offset_addr_v_w = offset_x_v_byte;
1094 }
1095
1096 //----------offset_h--------//
1097 if (iep_msg->dst.vir_w % 2 == 1)
1098 vir_w_euq_uv = iep_msg->dst.vir_w + 1;
1099 else
1100 vir_w_euq_uv = iep_msg->dst.vir_w;
1101
1102 line_u_byte = vir_w_euq_uv / 2;
1103 line_v_byte = vir_w_euq_uv / 2;
1104
1105 if (iep_msg->dst.y_off % 2 == 1)
1106 offset_y_equ_420_uv = iep_msg->dst.y_off + 1;
1107 else
1108 offset_y_equ_420_uv = iep_msg->dst.y_off;
1109
1110 switch (iep_msg->dst.format) {
1111 case IEP_FORMAT_YCbCr_422_SP :
1112 offset_addr_uv_h = (line_u_byte + line_v_byte) *
1113 iep_msg->dst.y_off;
1114 break;
1115 case IEP_FORMAT_YCbCr_422_P :
1116 offset_addr_uv_h = line_u_byte * iep_msg->dst.y_off;
1117 offset_addr_v_h = line_v_byte * iep_msg->dst.y_off;
1118 break;
1119 case IEP_FORMAT_YCbCr_420_SP :
1120 offset_addr_uv_h = (line_u_byte + line_v_byte) *
1121 offset_y_equ_420_uv / 2;
1122 break;
1123 case IEP_FORMAT_YCbCr_420_P :
1124 offset_addr_uv_h = line_u_byte * offset_y_equ_420_uv / 2;
1125 offset_addr_v_h = line_v_byte * offset_y_equ_420_uv / 2;
1126 break;
1127 case IEP_FORMAT_YCrCb_422_SP :
1128 offset_addr_uv_h = (line_u_byte + line_v_byte) *
1129 iep_msg->dst.y_off;
1130 break;
1131 case IEP_FORMAT_YCrCb_422_P :
1132 offset_addr_uv_h = line_u_byte * iep_msg->dst.y_off;
1133 offset_addr_v_h = line_v_byte * iep_msg->dst.y_off;
1134 break;
1135 case IEP_FORMAT_YCrCb_420_SP :
1136 offset_addr_uv_h = (line_u_byte + line_v_byte) *
1137 offset_y_equ_420_uv / 2;
1138 break;
1139 case IEP_FORMAT_YCrCb_420_P :
1140 offset_addr_uv_h = line_u_byte * offset_y_equ_420_uv / 2;
1141 offset_addr_v_h = line_v_byte * offset_y_equ_420_uv / 2;
1142 break;
1143 default:
1144 break;
1145 }
1146 //----------offset u/v addr--------//
1147
1148 offset_addr_uv = offset_addr_uv_w + offset_addr_uv_h;
1149 offset_addr_v = offset_addr_v_w + offset_addr_v_h;
1150 //**********************************************//
1151 //***********yuv address *********************//
1152 //**********************************************//
1153
1154 if (iep_service.iommu_dev == NULL) {
1155 dst_addr_yrgb = ((u32)iep_msg->dst.mem_addr) + offset_addr_y;
1156 dst_addr_cbcr = ((u32)iep_msg->dst.uv_addr) + offset_addr_uv;
1157 dst_addr_cr = ((u32)iep_msg->dst.v_addr) + offset_addr_v;
1158
1159 // former frame when processing deinterlace
1160 dst_addr_y1 = ((u32)iep_msg->dst1.mem_addr) + offset_addr_y;
1161 dst_addr_cbcr1 = ((u32)iep_msg->dst1.uv_addr) + offset_addr_uv;
1162 dst_addr_cr1 = ((u32)iep_msg->dst1.v_addr) + offset_addr_v;
1163
1164 dst_addr_y_itemp = ((u32)iep_msg->dst_itemp.mem_addr) +
1165 offset_addr_y;
1166 dst_addr_cbcr_itemp = ((u32)iep_msg->dst_itemp.uv_addr) +
1167 offset_addr_uv;
1168 dst_addr_cr_itemp = ((u32)iep_msg->dst_itemp.v_addr) +
1169 offset_addr_v;
1170
1171 dst_addr_y_ftemp = ((u32)iep_msg->dst_ftemp.mem_addr) +
1172 offset_addr_y;
1173 dst_addr_cbcr_ftemp = ((u32)iep_msg->dst_ftemp.uv_addr) +
1174 offset_addr_uv;
1175 dst_addr_cr_ftemp = ((u32)iep_msg->dst_ftemp.v_addr) +
1176 offset_addr_v;
1177 } else {
1178 dst_addr_yrgb = ((u32)iep_msg->dst.mem_addr) + (offset_addr_y << 10);
1179 dst_addr_cbcr = ((u32)iep_msg->dst.uv_addr) + (offset_addr_uv << 10);
1180 dst_addr_cr = ((u32)iep_msg->dst.v_addr) + (offset_addr_v << 10);
1181
1182 // former frame when processing deinterlace
1183 dst_addr_y1 = ((u32)iep_msg->dst1.mem_addr) + (offset_addr_y << 10);
1184 dst_addr_cbcr1 = ((u32)iep_msg->dst1.uv_addr) + (offset_addr_uv << 10);
1185 dst_addr_cr1 = ((u32)iep_msg->dst1.v_addr) + (offset_addr_v << 10);
1186
1187 dst_addr_y_itemp = ((u32)iep_msg->dst_itemp.mem_addr) +
1188 (offset_addr_y << 10);
1189 dst_addr_cbcr_itemp = ((u32)iep_msg->dst_itemp.uv_addr) +
1190 (offset_addr_uv << 10);
1191 dst_addr_cr_itemp = ((u32)iep_msg->dst_itemp.v_addr) +
1192 (offset_addr_v << 10);
1193
1194 dst_addr_y_ftemp = ((u32)iep_msg->dst_ftemp.mem_addr) +
1195 (offset_addr_y << 10);
1196 dst_addr_cbcr_ftemp = ((u32)iep_msg->dst_ftemp.uv_addr) +
1197 (offset_addr_uv << 10);
1198 dst_addr_cr_ftemp = ((u32)iep_msg->dst_ftemp.v_addr) +
1199 (offset_addr_v << 10);
1200 }
1201
1202 IEP_REGB_DST_ADDR_YRGB(iep_msg->base, dst_addr_yrgb);
1203 IEP_REGB_DST_ADDR_CBCR(iep_msg->base, dst_addr_cbcr);
1204 IEP_REGB_DST_ADDR_Y1(iep_msg->base, dst_addr_y1);
1205 IEP_REGB_DST_ADDR_CBCR1(iep_msg->base, dst_addr_cbcr1);
1206 IEP_REGB_DST_ADDR_CR(iep_msg->base, dst_addr_cr);
1207 IEP_REGB_DST_ADDR_CR1(iep_msg->base, dst_addr_cr1);
1208
1209 if (iep_msg->yuv_3D_denoise_en) {
1210 IEP_REGB_DST_ADDR_Y_ITEMP(iep_msg->base,
1211 dst_addr_y_itemp);
1212 IEP_REGB_DST_ADDR_CBCR_ITEMP(iep_msg->base,
1213 dst_addr_cbcr_itemp);
1214 IEP_REGB_DST_ADDR_Y_FTEMP(iep_msg->base,
1215 dst_addr_y_ftemp);
1216 IEP_REGB_DST_ADDR_CBCR_FTEMP(iep_msg->base,
1217 dst_addr_cbcr_ftemp);
1218 if ((iep_msg->dst.format == IEP_FORMAT_YCbCr_422_P) ||
1219 (iep_msg->dst.format == IEP_FORMAT_YCbCr_420_P) ||
1220 (iep_msg->dst.format == IEP_FORMAT_YCrCb_422_P) ||
1221 (iep_msg->dst.format == IEP_FORMAT_YCrCb_420_P)) {
1222 IEP_REGB_DST_ADDR_CR_ITEMP(iep_msg->base,
1223 dst_addr_cr_itemp);
1224 IEP_REGB_DST_ADDR_CR_FTEMP(iep_msg->base,
1225 dst_addr_cr_ftemp);
1226 }
1227 }
1228 #ifdef IEP_PRINT_INFO
1229 IEP_DBG("//-------destination address for image-------// \n\n");
1230 IEP_DBG("sw_dst_addr_yrgb = 32'h%x;\n",
1231 (u32)iep_msg->dst.mem_addr);
1232 IEP_DBG("sw_dst_addr_cbcr = 32'h%x;\n",
1233 (u32)iep_msg->dst.uv_addr);
1234 IEP_DBG("sw_dst_addr_cr = 32'h%x;\n",
1235 (u32)iep_msg->dst.v_addr);
1236 IEP_DBG("sw_dst_addr_y1 = 32'h%x;\n",
1237 (u32)iep_msg->dst1.mem_addr);
1238 IEP_DBG("sw_dst_addr_cbcr0 = 32'h%x;\n",
1239 (u32)iep_msg->dst1.uv_addr);
1240 IEP_DBG("sw_dst_addr_cr0 = 32'h%x;\n",
1241 (u32)iep_msg->dst1.v_addr);
1242 IEP_DBG("sw_dst_addr_y_itemp = 32'h%x;\n",
1243 (u32)iep_msg->dst_itemp.mem_addr);
1244 IEP_DBG("sw_dst_addr_cbcr_itemp = 32'h%x;\n",
1245 (u32)iep_msg->dst_itemp.uv_addr);
1246 IEP_DBG("sw_dst_addr_cr_itemp = 32'h%x;\n",
1247 (u32)iep_msg->dst_itemp.v_addr);
1248 IEP_DBG("sw_dst_addr_y_ftemp = 32'h%x;\n",
1249 (u32)iep_msg->dst_ftemp.mem_addr);
1250 IEP_DBG("sw_dst_addr_cbcr_ftemp = 32'h%x;\n",
1251 (u32)iep_msg->dst_ftemp.uv_addr);
1252 IEP_DBG("sw_dst_addr_cr_ftemp = 32'h%x;\n\n",
1253 (u32)iep_msg->dst_ftemp.v_addr);
1254 #endif
1255 }
1256
iep_config_lcdc_path(struct IEP_MSG * iep_msg)1257 void iep_config_lcdc_path(struct IEP_MSG *iep_msg)
1258 {
1259 IEP_REGB_LCDC_PATH_EN(iep_msg->base, iep_msg->lcdc_path_en);
1260
1261 #ifdef IEP_PRINT_INFO
1262 IEP_DBG("//==write back or lcdc direct path config=====// \n\n");
1263 IEP_DBG("sw_lcdc_path_en = %d;//lcdc direct path enable,c"
1264 " model don't care this value\n\n", iep_msg->lcdc_path_en);
1265 #endif
1266 }
1267
iep_probe_int(void * base)1268 int iep_probe_int(void *base)
1269 {
1270 return ReadReg32(base, rIEP_INT) & 1;
1271 }
1272
iep_config_frame_end_int_clr(void * base)1273 void iep_config_frame_end_int_clr(void *base)
1274 {
1275 IEP_REGB_FRAME_END_INT_CLR(base, 1);
1276 }
1277
iep_config_frame_end_int_en(void * base)1278 void iep_config_frame_end_int_en(void *base)
1279 {
1280 IEP_REGB_FRAME_END_INT_CLR(base, 1);
1281 IEP_REGB_FRAME_END_INT_EN(base, 1);
1282 }
1283
iep_config_misc(struct IEP_MSG * iep_msg)1284 static void iep_config_misc(struct IEP_MSG *iep_msg)
1285 {
1286 // IEP_REGB_V_REVERSE_DISP();
1287 // IEP_REGB_H_REVERSE_DISP();
1288 #ifdef IEP_PRINT_INFO
1289 IEP_DBG("//==misc config==========================//\n\n");
1290 IEP_DBG("sw_v_reverse_disp = 0;\n");
1291 IEP_DBG("sw_u_reverse_disp = 0;\n\n");
1292 #endif
1293 }
1294
1295 #define IEP_RESET_TIMEOUT 1000
iep_soft_rst(void * base)1296 void iep_soft_rst(void *base)
1297 {
1298 unsigned int rst_state = 0;
1299 int i = 0;
1300 WriteReg32(base, rIEP_SOFT_RST, 2);
1301 WriteReg32(base, rIEP_SOFT_RST, 1);
1302 while (i++ < IEP_RESET_TIMEOUT) {
1303 rst_state = ReadReg32(base, IEP_STATUS);
1304 if ((rst_state & 0x200) == 0x200) {
1305 break;
1306 }
1307
1308 udelay(1);
1309 }
1310 WriteReg32(base, IEP_SOFT_RST, 2);
1311
1312 if (i == IEP_RESET_TIMEOUT)
1313 IEP_DBG("soft reset timeout.\n");
1314 }
1315
iep_config_done(void * base)1316 void iep_config_done(void *base)
1317 {
1318 WriteReg32(base, rIEP_CONF_DONE, 1);
1319 }
1320
iep_config_frm_start(void * base)1321 void iep_config_frm_start(void *base)
1322 {
1323 IEP_REGB_FRM_START(base, 1);
1324 }
1325
iep_get_status(void * base)1326 struct iep_status iep_get_status(void *base)
1327 {
1328 uint32_t sts_int = IEP_REGB_STATUS(base);
1329 struct iep_status sts;
1330
1331 memcpy(&sts, &sts_int, 4);
1332
1333 return sts;
1334 }
1335
iep_get_deinterlace_mode(void * base)1336 int iep_get_deinterlace_mode(void *base)
1337 {
1338 int cfg = ReadReg32(base, IEP_CONFIG0);
1339 return (cfg >> 8) & 0x7;
1340 }
1341
iep_set_deinterlace_mode(int mode,void * base)1342 void iep_set_deinterlace_mode(int mode, void *base)
1343 {
1344 int cfg;
1345
1346 if (mode > dein_mode_bypass) {
1347 IEP_ERR("invalid deinterlace mode\n");
1348 return;
1349 }
1350
1351 cfg = ReadReg32(base, RAW_IEP_CONFIG0);
1352 cfg = (cfg & (~(7 << 8))) | (mode << 8);
1353 WriteReg32(base, IEP_CONFIG0, cfg);
1354
1355 //IEP_REGB_DIL_MODE(base, mode);
1356 }
1357
iep_switch_input_address(void * base)1358 void iep_switch_input_address(void *base)
1359 {
1360 u32 src_addr_yrgb = ReadReg32(base, IEP_SRC_ADDR_YRGB);
1361 u32 src_addr_cbcr = ReadReg32(base, IEP_SRC_ADDR_CBCR);
1362 u32 src_addr_cr = ReadReg32(base, IEP_SRC_ADDR_CR);
1363
1364 u32 src_addr_y1 = ReadReg32(base, IEP_SRC_ADDR_Y1);
1365 u32 src_addr_cbcr1 = ReadReg32(base, IEP_SRC_ADDR_CBCR1);
1366 u32 src_addr_cr1 = ReadReg32(base, IEP_SRC_ADDR_CR1);
1367
1368 IEP_REGB_SRC_ADDR_YRGB(base, src_addr_y1);
1369 IEP_REGB_SRC_ADDR_CBCR(base, src_addr_cbcr1);
1370 IEP_REGB_SRC_ADDR_CR(base, src_addr_cr1);
1371 IEP_REGB_SRC_ADDR_Y1(base, src_addr_yrgb);
1372 IEP_REGB_SRC_ADDR_CBCR1(base, src_addr_cbcr);
1373 IEP_REGB_SRC_ADDR_CR1(base, src_addr_cr);
1374 }
1375
iep_bufid_to_iova(iep_service_info * pservice,u8 * tbl,int size,struct iep_reg * reg)1376 static int iep_bufid_to_iova(iep_service_info *pservice, u8 *tbl,
1377 int size, struct iep_reg *reg)
1378 {
1379 int i;
1380 int usr_fd = 0;
1381 int offset = 0;
1382
1383 if (tbl == NULL || size <= 0) {
1384 dev_err(pservice->iommu_dev, "input arguments invalidate\n");
1385 return -1;
1386 }
1387
1388 for (i = 0; i < size; i++) {
1389 usr_fd = reg->reg[tbl[i]] & 0x3FF;
1390 offset = reg->reg[tbl[i]] >> 10;
1391 if (usr_fd != 0) {
1392 int hdl;
1393 int ret;
1394 struct iep_mem_region *mem_region;
1395
1396 hdl = iep_iommu_import(pservice->iommu_info,
1397 reg->session, usr_fd);
1398
1399 mem_region = kzalloc(sizeof(struct iep_mem_region),
1400 GFP_KERNEL);
1401
1402 if (mem_region == NULL) {
1403 dev_err(pservice->iommu_dev,
1404 "allocate memory for"
1405 " iommu memory region failed\n");
1406 iep_iommu_free(pservice->iommu_info,
1407 reg->session, hdl);
1408 return -ENOMEM;
1409 }
1410
1411 mem_region->hdl = hdl;
1412
1413 ret = iep_iommu_map_iommu(pservice->iommu_info,
1414 reg->session, mem_region->hdl,
1415 &mem_region->iova, &mem_region->len);
1416 if (ret < 0) {
1417 dev_err(pservice->iommu_dev,
1418 "ion map iommu failed\n");
1419 kfree(mem_region);
1420 iep_iommu_free(pservice->iommu_info,
1421 reg->session, hdl);
1422 return ret;
1423 }
1424
1425 reg->reg[tbl[i]] = mem_region->iova + offset;
1426 INIT_LIST_HEAD(&mem_region->reg_lnk);
1427 list_add_tail(&mem_region->reg_lnk,
1428 ®->mem_region_list);
1429 }
1430 }
1431
1432 return 0;
1433 }
1434
1435 static u8 addr_tbl_iep[] = {
1436 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55
1437 };
1438
iep_reg_address_translate(iep_service_info * pservice,struct iep_reg * reg)1439 static int iep_reg_address_translate(iep_service_info *pservice, struct iep_reg *reg)
1440 {
1441 return iep_bufid_to_iova(pservice, addr_tbl_iep, sizeof(addr_tbl_iep), reg);
1442 }
1443
1444 /**
1445 * generating a series of registers copy from iep message
1446 */
iep_config(iep_session * session,struct IEP_MSG * iep_msg)1447 void iep_config(iep_session *session, struct IEP_MSG *iep_msg)
1448 {
1449 struct iep_reg *reg = NULL;
1450 int w;
1451 int h;
1452
1453 reg = kzalloc(sizeof(*reg), GFP_KERNEL);
1454 if (!reg)
1455 return;
1456 reg->session = session;
1457 iep_msg->base = reg->reg;
1458 atomic_set(®->session->done, 0);
1459
1460 INIT_LIST_HEAD(®->session_link);
1461 INIT_LIST_HEAD(®->status_link);
1462
1463 INIT_LIST_HEAD(®->mem_region_list);
1464
1465 //write config
1466 iep_config_src_size(iep_msg);
1467 iep_config_dst_size(iep_msg);
1468 iep_config_dst_width_tile(iep_msg); //not implement
1469 iep_config_dst_fmt(iep_msg);
1470 iep_config_src_fmt(iep_msg);
1471 iep_config_scl(iep_msg);
1472 iep_config_cg_order(iep_msg);
1473
1474 iep_config_cg(iep_msg);
1475 iep_config_dde(iep_msg); //not implement
1476 iep_config_color_enh(iep_msg); //not implement
1477 iep_config_yuv_dns(iep_msg);
1478 iep_config_dil(iep_msg);
1479 iep_config_yuv_enh(iep_msg);
1480 iep_config_rgb2yuv(iep_msg);
1481 iep_config_yuv2rgb(iep_msg);
1482 iep_config_dither_up(iep_msg);
1483 iep_config_dither_down(iep_msg);
1484 iep_config_glb_alpha(iep_msg);
1485 iep_config_vir_line(iep_msg);
1486 iep_config_src_addr(iep_msg);
1487 iep_config_dst_addr(iep_msg);
1488 iep_config_lcdc_path(iep_msg);
1489 iep_config_misc(iep_msg); //not implement
1490
1491 if (iep_msg->lcdc_path_en) {
1492 reg->dpi_en = true;
1493 reg->act_width = iep_msg->dst.act_w;
1494 reg->act_height = iep_msg->dst.act_h;
1495 reg->off_x = iep_msg->off_x;
1496 reg->off_y = iep_msg->off_y;
1497 reg->vir_width = iep_msg->width;
1498 reg->vir_height = iep_msg->height;
1499 reg->layer = iep_msg->layer;
1500 reg->format = iep_msg->dst.format;
1501 } else {
1502 reg->dpi_en = false;
1503 }
1504
1505 if (iep_service.iommu_dev) {
1506 if (0 > iep_reg_address_translate(&iep_service, reg)) {
1507 IEP_ERR("error: translate reg address failed\n");
1508 kfree(reg);
1509 return;
1510 }
1511 }
1512
1513 /* workaround for iommu enable case when 4k video input */
1514 w = (iep_msg->src.act_w + 15) & (0xfffffff0);
1515 h = (iep_msg->src.act_h + 15) & (0xfffffff0);
1516 if (w > 1920 && iep_msg->src.format == IEP_FORMAT_YCbCr_420_SP)
1517 reg->reg[33] = reg->reg[32] + w * h;
1518
1519 w = (iep_msg->dst.act_w + 15) & (0xfffffff0);
1520 h = (iep_msg->dst.act_h + 15) & (0xfffffff0);
1521 if (w > 1920 && iep_msg->dst.format == IEP_FORMAT_YCbCr_420_SP)
1522 reg->reg[45] = reg->reg[44] + w * h;
1523
1524 mutex_lock(&iep_service.lock);
1525
1526 list_add_tail(®->status_link, &iep_service.waiting);
1527 list_add_tail(®->session_link, &session->waiting);
1528 mutex_unlock(&iep_service.lock);
1529 }
1530
1531