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