1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun * Authors:
4*4882a593Smuzhiyun * Zhiqin Wei <wzq@rock-chips.com>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
7*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
8*4882a593Smuzhiyun * You may obtain a copy of the License at
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
13*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
14*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*4882a593Smuzhiyun * See the License for the specific language governing permissions and
16*4882a593Smuzhiyun * limitations under the License.
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include "NormalRga.h"
20*4882a593Smuzhiyun #include "NormalRgaContext.h"
21*4882a593Smuzhiyun #include "rga.h"
22*4882a593Smuzhiyun #ifdef ANDROID
23*4882a593Smuzhiyun #include "GrallocOps.h"
24*4882a593Smuzhiyun #endif
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun int sina_table[360];
27*4882a593Smuzhiyun int cosa_table[360];
28*4882a593Smuzhiyun /**********************************************************************
29*4882a593Smuzhiyun =======================================================================
30*4882a593Smuzhiyun **********************************************************************/
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* In order to be compatible with RK_FORMAT_XX and HAL_PIXEL_FORMAT_XX,
33*4882a593Smuzhiyun * RK_FORMAT_XX is shifted to the left by 8 bits to distinguish. In order
34*4882a593Smuzhiyun * to be compatible with the old RK_FORMAT_XX definition, a conversion
35*4882a593Smuzhiyun * function is made here. */
RkRgaCompatibleFormat(int format)36*4882a593Smuzhiyun int RkRgaCompatibleFormat(int format) {
37*4882a593Smuzhiyun #if LINUX
38*4882a593Smuzhiyun if (format == 0)
39*4882a593Smuzhiyun return format;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun if ((format >> 8) != 0) {
42*4882a593Smuzhiyun return format;
43*4882a593Smuzhiyun } else {
44*4882a593Smuzhiyun return format << 8;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun #endif
47*4882a593Smuzhiyun return format;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #ifdef ANDROID
RkRgaGetRgaFormatFromAndroid(int format)51*4882a593Smuzhiyun int RkRgaGetRgaFormatFromAndroid(int format) {
52*4882a593Smuzhiyun switch (format) {
53*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_RGB_565:
54*4882a593Smuzhiyun return RK_FORMAT_RGB_565;
55*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_RGB_888:
56*4882a593Smuzhiyun return RK_FORMAT_RGB_888;
57*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_RGBA_8888:
58*4882a593Smuzhiyun return RK_FORMAT_RGBA_8888;
59*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_RGBX_8888:
60*4882a593Smuzhiyun return RK_FORMAT_RGBX_8888;
61*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_BGRA_8888:
62*4882a593Smuzhiyun return RK_FORMAT_BGRA_8888;
63*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_YCrCb_420_SP:
64*4882a593Smuzhiyun return RK_FORMAT_YCrCb_420_SP;
65*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_YCrCb_NV12:
66*4882a593Smuzhiyun return RK_FORMAT_YCbCr_420_SP;
67*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO:
68*4882a593Smuzhiyun return RK_FORMAT_YCbCr_420_SP;
69*4882a593Smuzhiyun case HAL_PIXEL_FORMAT_YCrCb_NV12_10:
70*4882a593Smuzhiyun return RK_FORMAT_YCbCr_420_SP_10B; //0x20
71*4882a593Smuzhiyun default:
72*4882a593Smuzhiyun ALOGE("%x is unsupport format now,pilese fix.", format);
73*4882a593Smuzhiyun return -1;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun #endif
77*4882a593Smuzhiyun
RkRgaGetRgaFormat(int format)78*4882a593Smuzhiyun int RkRgaGetRgaFormat(int format) {
79*4882a593Smuzhiyun /* Because the format of librga is the value of driver format << 8 . */
80*4882a593Smuzhiyun #ifdef ANDROID
81*4882a593Smuzhiyun if (format & 0xFF) {
82*4882a593Smuzhiyun format = RkRgaGetRgaFormatFromAndroid(format);
83*4882a593Smuzhiyun if (format < 0)
84*4882a593Smuzhiyun return -1;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun #endif
87*4882a593Smuzhiyun if (format & 0xFF00 || format == 0)
88*4882a593Smuzhiyun return format;
89*4882a593Smuzhiyun else {
90*4882a593Smuzhiyun format = RkRgaCompatibleFormat(format);
91*4882a593Smuzhiyun if (format & 0xFF00 || format == 0)
92*4882a593Smuzhiyun return format;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun ALOGE("%x is unsupport format now,pilese fix.", format);
96*4882a593Smuzhiyun return -1;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun
bytesPerPixel(int format)99*4882a593Smuzhiyun uint32_t bytesPerPixel(int format) {
100*4882a593Smuzhiyun if (!(format & 0xFF00 || format == 0)) {
101*4882a593Smuzhiyun format = RkRgaCompatibleFormat(format);
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun switch (format) {
105*4882a593Smuzhiyun case RK_FORMAT_RGBA_8888:
106*4882a593Smuzhiyun case RK_FORMAT_RGBX_8888:
107*4882a593Smuzhiyun case RK_FORMAT_BGRA_8888:
108*4882a593Smuzhiyun case RK_FORMAT_BGRX_8888:
109*4882a593Smuzhiyun case RK_FORMAT_ARGB_8888:
110*4882a593Smuzhiyun case RK_FORMAT_XRGB_8888:
111*4882a593Smuzhiyun case RK_FORMAT_ABGR_8888:
112*4882a593Smuzhiyun case RK_FORMAT_XBGR_8888:
113*4882a593Smuzhiyun return 4;
114*4882a593Smuzhiyun case RK_FORMAT_RGB_888:
115*4882a593Smuzhiyun case RK_FORMAT_BGR_888:
116*4882a593Smuzhiyun return 3;
117*4882a593Smuzhiyun case RK_FORMAT_RGB_565:
118*4882a593Smuzhiyun case RK_FORMAT_RGBA_5551:
119*4882a593Smuzhiyun case RK_FORMAT_RGBA_4444:
120*4882a593Smuzhiyun case RK_FORMAT_BGR_565:
121*4882a593Smuzhiyun case RK_FORMAT_BGRA_5551:
122*4882a593Smuzhiyun case RK_FORMAT_BGRA_4444:
123*4882a593Smuzhiyun case RK_FORMAT_ARGB_5551:
124*4882a593Smuzhiyun case RK_FORMAT_ARGB_4444:
125*4882a593Smuzhiyun case RK_FORMAT_ABGR_5551:
126*4882a593Smuzhiyun case RK_FORMAT_ABGR_4444:
127*4882a593Smuzhiyun return 2;
128*4882a593Smuzhiyun case RK_FORMAT_BPP1:
129*4882a593Smuzhiyun case RK_FORMAT_BPP2:
130*4882a593Smuzhiyun case RK_FORMAT_BPP4:
131*4882a593Smuzhiyun case RK_FORMAT_BPP8:
132*4882a593Smuzhiyun return 1;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun return 0;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
checkRectForRga(rga_rect_t rect)137*4882a593Smuzhiyun int checkRectForRga(rga_rect_t rect) {
138*4882a593Smuzhiyun if (rect.xoffset < 0 || rect.yoffset < 0) {
139*4882a593Smuzhiyun ALOGE("err offset[%d,%d]", rect.xoffset, rect.yoffset);
140*4882a593Smuzhiyun return -EINVAL;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun if (rect.width < 2 || rect.height < 2) {
144*4882a593Smuzhiyun ALOGE("err act[%d,%d]", rect.width, rect.height);
145*4882a593Smuzhiyun return -EINVAL;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun if (rect.xoffset + rect.width > rect.wstride) {
149*4882a593Smuzhiyun ALOGE("err ws[%d,%d,%d]", rect.xoffset, rect.width, rect.wstride);
150*4882a593Smuzhiyun return -EINVAL;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun if (rect.yoffset + rect.height > rect.hstride) {
154*4882a593Smuzhiyun ALOGE("err hs[%d,%d,%d]", rect.yoffset, rect.height, rect.hstride);
155*4882a593Smuzhiyun return -EINVAL;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if (NormalRgaIsYuvFormat(RkRgaGetRgaFormat(rect.format)) &&
159*4882a593Smuzhiyun ((rect.wstride % 4) ||(rect.xoffset % 2) || (rect.width % 2) ||
160*4882a593Smuzhiyun (rect.yoffset % 2) || (rect.height % 2) || (rect.hstride % 2))) {
161*4882a593Smuzhiyun ALOGE("err yuv not align to 2");
162*4882a593Smuzhiyun return -EINVAL;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun return 0;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
isRectValid(rga_rect_t rect)168*4882a593Smuzhiyun int isRectValid(rga_rect_t rect) {
169*4882a593Smuzhiyun return rect.width > 0 && rect.height > 0;
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun #ifdef ANDROID
NormalRgaGetRects(buffer_handle_t src,buffer_handle_t dst,int * sType,int * dType,drm_rga_t * tmpRects)173*4882a593Smuzhiyun int NormalRgaGetRects(buffer_handle_t src,
174*4882a593Smuzhiyun buffer_handle_t dst,int* sType,int* dType,drm_rga_t* tmpRects) {
175*4882a593Smuzhiyun int ret = 0;
176*4882a593Smuzhiyun std::vector<int> srcAttrs,dstAttrs;
177*4882a593Smuzhiyun if (src)
178*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(src, &srcAttrs);
179*4882a593Smuzhiyun if (ret) {
180*4882a593Smuzhiyun ALOGE("dst handle get Attributes fail ret = %d,hnd=%p",ret,&src);
181*4882a593Smuzhiyun printf("dst handle get Attributes fail ret = %d,hnd=%p",ret,&src);
182*4882a593Smuzhiyun return ret;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun if (dst)
186*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(dst, &dstAttrs);
187*4882a593Smuzhiyun if (ret) {
188*4882a593Smuzhiyun ALOGE("dst handle get Attributes fail ret = %d,hnd=%p",ret,&dst);
189*4882a593Smuzhiyun printf("dst handle get Attributes fail ret = %d,hnd=%p",ret,&dst);
190*4882a593Smuzhiyun return ret;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun memset(tmpRects,0,sizeof(drm_rga_t));
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun if (src) {
196*4882a593Smuzhiyun tmpRects->src.size = srcAttrs.at(ASIZE);
197*4882a593Smuzhiyun tmpRects->src.width = srcAttrs.at(AWIDTH);
198*4882a593Smuzhiyun tmpRects->src.height = srcAttrs.at(AHEIGHT);
199*4882a593Smuzhiyun tmpRects->src.wstride = srcAttrs.at(ASTRIDE);
200*4882a593Smuzhiyun tmpRects->src.format = srcAttrs.at(AFORMAT);
201*4882a593Smuzhiyun if (sType)
202*4882a593Smuzhiyun *sType = srcAttrs.at(ATYPE);
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun if (dst) {
206*4882a593Smuzhiyun tmpRects->dst.size = dstAttrs.at(ASIZE);
207*4882a593Smuzhiyun tmpRects->dst.width = dstAttrs.at(AWIDTH);
208*4882a593Smuzhiyun tmpRects->dst.height = dstAttrs.at(AHEIGHT);
209*4882a593Smuzhiyun tmpRects->dst.wstride = dstAttrs.at(ASTRIDE);
210*4882a593Smuzhiyun tmpRects->dst.format = dstAttrs.at(AFORMAT);
211*4882a593Smuzhiyun if (dType)
212*4882a593Smuzhiyun *dType = dstAttrs.at(ATYPE);
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun return ret;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
NormalRgaGetRect(buffer_handle_t hnd,rga_rect_t * rect)218*4882a593Smuzhiyun int NormalRgaGetRect(buffer_handle_t hnd, rga_rect_t *rect) {
219*4882a593Smuzhiyun int ret = 0;
220*4882a593Smuzhiyun std::vector<int> dstAttrs;
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun if (!rect) {
223*4882a593Smuzhiyun ALOGE("Get rect but rect[%p] is null point", rect);
224*4882a593Smuzhiyun return -EINVAL;
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(hnd, &dstAttrs);
228*4882a593Smuzhiyun if (ret) {
229*4882a593Smuzhiyun ALOGE("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
230*4882a593Smuzhiyun printf("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
231*4882a593Smuzhiyun return ret;
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun memset(rect, 0, sizeof(rga_rect_t));
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun rect->size = dstAttrs.at(ASIZE);
237*4882a593Smuzhiyun rect->width = dstAttrs.at(AWIDTH);
238*4882a593Smuzhiyun rect->height = dstAttrs.at(AHEIGHT);
239*4882a593Smuzhiyun rect->wstride = dstAttrs.at(ASTRIDE);
240*4882a593Smuzhiyun rect->format = dstAttrs.at(AFORMAT);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun return ret;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
NormalRgaGetMmuType(buffer_handle_t hnd,int * mmuType)245*4882a593Smuzhiyun int NormalRgaGetMmuType(buffer_handle_t hnd, int *mmuType) {
246*4882a593Smuzhiyun int ret = 0;
247*4882a593Smuzhiyun std::vector<int> dstAttrs;
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun if (!mmuType) {
250*4882a593Smuzhiyun ALOGE("Get rect but mmuType[%p] is null point", mmuType);
251*4882a593Smuzhiyun return -EINVAL;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun ret = RkRgaGetHandleAttributes(hnd, &dstAttrs);
255*4882a593Smuzhiyun if (ret) {
256*4882a593Smuzhiyun ALOGE("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
257*4882a593Smuzhiyun printf("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
258*4882a593Smuzhiyun return ret;
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun if (dstAttrs.size() >= 5) {
262*4882a593Smuzhiyun #ifdef ANDROID_8
263*4882a593Smuzhiyun *mmuType = dstAttrs.at(ASIZE);
264*4882a593Smuzhiyun #else
265*4882a593Smuzhiyun *mmuType = dstAttrs.at(ATYPE);
266*4882a593Smuzhiyun #endif
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun return ret;
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun
NormalRgaSetRect(rga_rect_t * rect,int x,int y,int w,int h,int s,int f)273*4882a593Smuzhiyun int NormalRgaSetRect(rga_rect_t *rect, int x, int y,
274*4882a593Smuzhiyun int w, int h, int s, int f) {
275*4882a593Smuzhiyun if (!rect)
276*4882a593Smuzhiyun return -EINVAL;
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun rect->xoffset = x;
279*4882a593Smuzhiyun rect->yoffset = y;
280*4882a593Smuzhiyun rect->width = w;
281*4882a593Smuzhiyun rect->height = h;
282*4882a593Smuzhiyun rect->wstride = s;
283*4882a593Smuzhiyun rect->format = f;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun return 0;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun
NormalRgaSetSrcActiveInfo(struct rga_req * req,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off)288*4882a593Smuzhiyun int NormalRgaSetSrcActiveInfo(struct rga_req *req,
289*4882a593Smuzhiyun unsigned int width, unsigned int height,
290*4882a593Smuzhiyun unsigned int x_off, unsigned int y_off) {
291*4882a593Smuzhiyun req->src.act_w = width;
292*4882a593Smuzhiyun req->src.act_h = height;
293*4882a593Smuzhiyun req->src.x_offset = x_off;
294*4882a593Smuzhiyun req->src.y_offset = y_off;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun return 1;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun
NormalRgaSetFdsOffsets(struct rga_req * req,uint16_t src_fd,uint16_t dst_fd,uint32_t src_offset,uint32_t dst_offset)299*4882a593Smuzhiyun int NormalRgaSetFdsOffsets(struct rga_req *req,
300*4882a593Smuzhiyun uint16_t src_fd, uint16_t dst_fd,
301*4882a593Smuzhiyun uint32_t src_offset, uint32_t dst_offset) {
302*4882a593Smuzhiyun req->line_draw_info.color = src_fd | (dst_fd << 16);
303*4882a593Smuzhiyun req->line_draw_info.flag = src_offset;
304*4882a593Smuzhiyun req->line_draw_info.line_width = dst_offset;
305*4882a593Smuzhiyun return 0;
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetSrcVirtualInfo(struct rga_req * req,unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,unsigned int vir_w,unsigned int vir_h,unsigned int format,unsigned char a_swap_en)309*4882a593Smuzhiyun int NormalRgaSetSrcVirtualInfo(struct rga_req *req,
310*4882a593Smuzhiyun unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,
311*4882a593Smuzhiyun unsigned int vir_w,unsigned int vir_h, unsigned int format,
312*4882a593Smuzhiyun unsigned char a_swap_en)
313*4882a593Smuzhiyun #else
314*4882a593Smuzhiyun int NormalRgaSetSrcVirtualInfo(struct rga_req *req,
315*4882a593Smuzhiyun unsigned int yrgb_addr, unsigned int uv_addr,unsigned int v_addr,
316*4882a593Smuzhiyun unsigned int vir_w, unsigned int vir_h, unsigned int format,
317*4882a593Smuzhiyun unsigned char a_swap_en)
318*4882a593Smuzhiyun #endif
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun req->src.yrgb_addr = yrgb_addr;
321*4882a593Smuzhiyun req->src.uv_addr = uv_addr;
322*4882a593Smuzhiyun req->src.v_addr = v_addr;
323*4882a593Smuzhiyun req->src.vir_w = vir_w;
324*4882a593Smuzhiyun req->src.vir_h = vir_h;
325*4882a593Smuzhiyun req->src.format = format >> 8;
326*4882a593Smuzhiyun req->src.alpha_swap |= (a_swap_en & 1);
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun return 1;
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
NormalRgaSetDstActiveInfo(struct rga_req * req,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off)331*4882a593Smuzhiyun int NormalRgaSetDstActiveInfo(struct rga_req *req,
332*4882a593Smuzhiyun unsigned int width, unsigned int height,
333*4882a593Smuzhiyun unsigned int x_off, unsigned int y_off) {
334*4882a593Smuzhiyun req->dst.act_w = width;
335*4882a593Smuzhiyun req->dst.act_h = height;
336*4882a593Smuzhiyun req->dst.x_offset = x_off;
337*4882a593Smuzhiyun req->dst.y_offset = y_off;
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun return 1;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetDstVirtualInfo(struct rga_req * msg,unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,unsigned int vir_w,unsigned int vir_h,RECT * clip,unsigned int format,unsigned char a_swap_en)343*4882a593Smuzhiyun int NormalRgaSetDstVirtualInfo(struct rga_req *msg,
344*4882a593Smuzhiyun unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,
345*4882a593Smuzhiyun unsigned int vir_w, unsigned int vir_h,
346*4882a593Smuzhiyun RECT *clip,
347*4882a593Smuzhiyun unsigned int format, unsigned char a_swap_en)
348*4882a593Smuzhiyun #else
349*4882a593Smuzhiyun int NormalRgaSetDstVirtualInfo(struct rga_req *msg,
350*4882a593Smuzhiyun unsigned int yrgb_addr,unsigned int uv_addr, unsigned int v_addr,
351*4882a593Smuzhiyun unsigned int vir_w, unsigned int vir_h,
352*4882a593Smuzhiyun RECT *clip,
353*4882a593Smuzhiyun unsigned int format, unsigned char a_swap_en)
354*4882a593Smuzhiyun #endif
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun msg->dst.yrgb_addr = yrgb_addr;
357*4882a593Smuzhiyun msg->dst.uv_addr = uv_addr;
358*4882a593Smuzhiyun msg->dst.v_addr = v_addr;
359*4882a593Smuzhiyun msg->dst.vir_w = vir_w;
360*4882a593Smuzhiyun msg->dst.vir_h = vir_h;
361*4882a593Smuzhiyun msg->dst.format = format >> 8;
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun msg->clip.xmin = clip->xmin;
364*4882a593Smuzhiyun msg->clip.xmax = clip->xmax;
365*4882a593Smuzhiyun msg->clip.ymin = clip->ymin;
366*4882a593Smuzhiyun msg->clip.ymax = clip->ymax;
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun msg->dst.alpha_swap |= (a_swap_en & 1);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun return 1;
371*4882a593Smuzhiyun }
NormalRgaSetPatActiveInfo(struct rga_req * req,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off)372*4882a593Smuzhiyun int NormalRgaSetPatActiveInfo(struct rga_req *req,
373*4882a593Smuzhiyun unsigned int width, unsigned int height,
374*4882a593Smuzhiyun unsigned int x_off, unsigned int y_off) {
375*4882a593Smuzhiyun req->pat.act_w = width;
376*4882a593Smuzhiyun req->pat.act_h = height;
377*4882a593Smuzhiyun req->pat.x_offset = x_off;
378*4882a593Smuzhiyun req->pat.y_offset = y_off;
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun return 1;
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetPatVirtualInfo(struct rga_req * msg,unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,unsigned int vir_w,unsigned int vir_h,RECT * clip,unsigned int format,unsigned char a_swap_en)384*4882a593Smuzhiyun int NormalRgaSetPatVirtualInfo(struct rga_req *msg,
385*4882a593Smuzhiyun unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,
386*4882a593Smuzhiyun unsigned int vir_w, unsigned int vir_h,
387*4882a593Smuzhiyun RECT *clip,
388*4882a593Smuzhiyun unsigned int format, unsigned char a_swap_en)
389*4882a593Smuzhiyun #else
390*4882a593Smuzhiyun int NormalRgaSetPatVirtualInfo(struct rga_req *msg,
391*4882a593Smuzhiyun unsigned int yrgb_addr,unsigned int uv_addr, unsigned int v_addr,
392*4882a593Smuzhiyun unsigned int vir_w, unsigned int vir_h,
393*4882a593Smuzhiyun RECT *clip,
394*4882a593Smuzhiyun unsigned int format, unsigned char a_swap_en)
395*4882a593Smuzhiyun #endif
396*4882a593Smuzhiyun {
397*4882a593Smuzhiyun msg->pat.yrgb_addr = yrgb_addr;
398*4882a593Smuzhiyun msg->pat.uv_addr = uv_addr;
399*4882a593Smuzhiyun msg->pat.v_addr = v_addr;
400*4882a593Smuzhiyun msg->pat.vir_w = vir_w;
401*4882a593Smuzhiyun msg->pat.vir_h = vir_h;
402*4882a593Smuzhiyun msg->pat.format = format >> 8;
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun msg->clip.xmin = clip->xmin;
405*4882a593Smuzhiyun msg->clip.xmax = clip->xmax;
406*4882a593Smuzhiyun msg->clip.ymin = clip->ymin;
407*4882a593Smuzhiyun msg->clip.ymax = clip->ymax;
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun msg->pat.alpha_swap |= (a_swap_en & 1);
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun return 1;
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun
NormalRgaSetPatInfo(struct rga_req * msg,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off,unsigned int pat_format)414*4882a593Smuzhiyun int NormalRgaSetPatInfo(struct rga_req *msg,
415*4882a593Smuzhiyun unsigned int width,unsigned int height,unsigned int x_off,
416*4882a593Smuzhiyun unsigned int y_off, unsigned int pat_format) {
417*4882a593Smuzhiyun msg->pat.act_w = width;
418*4882a593Smuzhiyun msg->pat.act_h = height;
419*4882a593Smuzhiyun msg->pat.x_offset = x_off;
420*4882a593Smuzhiyun msg->pat.y_offset = y_off;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun msg->pat.format = pat_format >> 8;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun return 1;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetRopMaskInfo(struct rga_req * msg,unsigned long rop_mask_addr,unsigned int rop_mask_endian_mode)428*4882a593Smuzhiyun int NormalRgaSetRopMaskInfo(struct rga_req *msg,
429*4882a593Smuzhiyun unsigned long rop_mask_addr,unsigned int rop_mask_endian_mode)
430*4882a593Smuzhiyun #else
431*4882a593Smuzhiyun int NormalRgaSetRopMaskInfo(struct rga_req *msg,
432*4882a593Smuzhiyun unsigned int rop_mask_addr,unsigned int rop_mask_endian_mode)
433*4882a593Smuzhiyun #endif
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun msg->rop_mask_addr = rop_mask_addr;
436*4882a593Smuzhiyun msg->endian_mode = rop_mask_endian_mode;
437*4882a593Smuzhiyun return 1;
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun /* 0:alpha' = alpha + (alpha>>7) | alpha' = alpha */
441*4882a593Smuzhiyun /* 0 global alpha / 1 per pixel alpha / 2 mix mode */
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun /* porter duff alpha mode en */
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun /* use dst alpha */
446*4882a593Smuzhiyun
NormalRgaSetAlphaEnInfo(struct rga_req * msg,unsigned int alpha_cal_mode,unsigned int alpha_mode,unsigned int global_a_value,unsigned int PD_en,unsigned int PD_mode,unsigned int dst_alpha_en)447*4882a593Smuzhiyun int NormalRgaSetAlphaEnInfo(struct rga_req *msg,
448*4882a593Smuzhiyun unsigned int alpha_cal_mode, unsigned int alpha_mode,
449*4882a593Smuzhiyun unsigned int global_a_value, unsigned int PD_en,
450*4882a593Smuzhiyun unsigned int PD_mode, unsigned int dst_alpha_en ) {
451*4882a593Smuzhiyun msg->alpha_rop_flag |= 1;
452*4882a593Smuzhiyun msg->alpha_rop_flag |= ((PD_en & 1) << 3);
453*4882a593Smuzhiyun msg->alpha_rop_flag |= ((alpha_cal_mode & 1) << 4);
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun msg->alpha_global_value = global_a_value;
456*4882a593Smuzhiyun msg->alpha_rop_mode |= (alpha_mode & 3);
457*4882a593Smuzhiyun msg->alpha_rop_mode |= (dst_alpha_en << 5);
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun msg->PD_mode = PD_mode;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun return 1;
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun
NormalRgaSetRopEnInfo(struct rga_req * msg,unsigned int ROP_mode,unsigned int ROP_code,unsigned int color_mode,unsigned int solid_color)466*4882a593Smuzhiyun int NormalRgaSetRopEnInfo(struct rga_req *msg,
467*4882a593Smuzhiyun unsigned int ROP_mode, unsigned int ROP_code,
468*4882a593Smuzhiyun unsigned int color_mode,unsigned int solid_color) {
469*4882a593Smuzhiyun msg->alpha_rop_flag |= (0x3);
470*4882a593Smuzhiyun msg->alpha_rop_mode |= ((ROP_mode & 3) << 2);
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun msg->rop_code = ROP_code;
473*4882a593Smuzhiyun msg->color_fill_mode = color_mode;
474*4882a593Smuzhiyun msg->fg_color = solid_color;
475*4882a593Smuzhiyun return 1;
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun
NormalRgaSetFadingEnInfo(struct rga_req * msg,unsigned char r,unsigned char g,unsigned char b)478*4882a593Smuzhiyun int NormalRgaSetFadingEnInfo(struct rga_req *msg,
479*4882a593Smuzhiyun unsigned char r,unsigned char g,unsigned char b) {
480*4882a593Smuzhiyun msg->alpha_rop_flag |= (0x1 << 2);
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun msg->fading.b = b;
483*4882a593Smuzhiyun msg->fading.g = g;
484*4882a593Smuzhiyun msg->fading.r = r;
485*4882a593Smuzhiyun return 1;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun
NormalRgaSetSrcTransModeInfo(struct rga_req * msg,unsigned char trans_mode,unsigned char a_en,unsigned char b_en,unsigned char g_en,unsigned char r_en,unsigned int color_key_min,unsigned int color_key_max,unsigned char zero_mode_en)488*4882a593Smuzhiyun int NormalRgaSetSrcTransModeInfo(struct rga_req *msg,
489*4882a593Smuzhiyun unsigned char trans_mode,unsigned char a_en,unsigned char b_en,
490*4882a593Smuzhiyun unsigned char g_en,unsigned char r_en,unsigned int color_key_min,
491*4882a593Smuzhiyun unsigned int color_key_max,unsigned char zero_mode_en
492*4882a593Smuzhiyun ) {
493*4882a593Smuzhiyun msg->src_trans_mode = ((a_en & 1) << 4) | ((b_en & 1) << 3) |
494*4882a593Smuzhiyun ((g_en & 1) << 2) | ((r_en & 1) << 1) | (trans_mode & 1);
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun msg->color_key_min = color_key_min;
497*4882a593Smuzhiyun msg->color_key_max = color_key_max;
498*4882a593Smuzhiyun msg->alpha_rop_mode |= (zero_mode_en << 4);
499*4882a593Smuzhiyun return 1;
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
NormalRgaIsBppFormat(int format)502*4882a593Smuzhiyun bool NormalRgaIsBppFormat(int format) {
503*4882a593Smuzhiyun bool ret = false;
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun switch (format) {
506*4882a593Smuzhiyun case RK_FORMAT_BPP1:
507*4882a593Smuzhiyun case RK_FORMAT_BPP2:
508*4882a593Smuzhiyun case RK_FORMAT_BPP4:
509*4882a593Smuzhiyun case RK_FORMAT_BPP8:
510*4882a593Smuzhiyun ret = true;
511*4882a593Smuzhiyun break;
512*4882a593Smuzhiyun default:
513*4882a593Smuzhiyun break;
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun return ret;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
NormalRgaIsYuvFormat(int format)519*4882a593Smuzhiyun bool NormalRgaIsYuvFormat(int format) {
520*4882a593Smuzhiyun bool ret = false;
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun switch (format) {
523*4882a593Smuzhiyun case RK_FORMAT_YCbCr_422_SP:
524*4882a593Smuzhiyun case RK_FORMAT_YCbCr_422_P:
525*4882a593Smuzhiyun case RK_FORMAT_YCbCr_420_SP:
526*4882a593Smuzhiyun case RK_FORMAT_YCbCr_420_P:
527*4882a593Smuzhiyun case RK_FORMAT_YCrCb_422_SP:
528*4882a593Smuzhiyun case RK_FORMAT_YCrCb_422_P:
529*4882a593Smuzhiyun case RK_FORMAT_YCrCb_420_SP:
530*4882a593Smuzhiyun case RK_FORMAT_YCrCb_420_P:
531*4882a593Smuzhiyun case RK_FORMAT_YVYU_422:
532*4882a593Smuzhiyun case RK_FORMAT_YVYU_420:
533*4882a593Smuzhiyun case RK_FORMAT_VYUY_422:
534*4882a593Smuzhiyun case RK_FORMAT_VYUY_420:
535*4882a593Smuzhiyun case RK_FORMAT_YUYV_422:
536*4882a593Smuzhiyun case RK_FORMAT_YUYV_420:
537*4882a593Smuzhiyun case RK_FORMAT_UYVY_422:
538*4882a593Smuzhiyun case RK_FORMAT_UYVY_420:
539*4882a593Smuzhiyun case RK_FORMAT_Y4:
540*4882a593Smuzhiyun case RK_FORMAT_YCbCr_400:
541*4882a593Smuzhiyun case RK_FORMAT_YCbCr_420_SP_10B:
542*4882a593Smuzhiyun case RK_FORMAT_YCrCb_420_SP_10B:
543*4882a593Smuzhiyun case RK_FORMAT_YCrCb_422_10b_SP:
544*4882a593Smuzhiyun case RK_FORMAT_YCbCr_422_10b_SP:
545*4882a593Smuzhiyun ret = true;
546*4882a593Smuzhiyun break;
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun return ret;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
NormalRgaIsRgbFormat(int format)552*4882a593Smuzhiyun bool NormalRgaIsRgbFormat(int format) {
553*4882a593Smuzhiyun bool ret = false;
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun switch (format) {
556*4882a593Smuzhiyun case RK_FORMAT_RGBA_8888:
557*4882a593Smuzhiyun case RK_FORMAT_RGBX_8888:
558*4882a593Smuzhiyun case RK_FORMAT_RGBA_5551:
559*4882a593Smuzhiyun case RK_FORMAT_RGBA_4444:
560*4882a593Smuzhiyun case RK_FORMAT_RGB_888:
561*4882a593Smuzhiyun case RK_FORMAT_RGB_565:
562*4882a593Smuzhiyun case RK_FORMAT_BGRA_8888:
563*4882a593Smuzhiyun case RK_FORMAT_BGRX_8888:
564*4882a593Smuzhiyun case RK_FORMAT_BGRA_5551:
565*4882a593Smuzhiyun case RK_FORMAT_BGRA_4444:
566*4882a593Smuzhiyun case RK_FORMAT_BGR_888:
567*4882a593Smuzhiyun case RK_FORMAT_BGR_565:
568*4882a593Smuzhiyun /*ARGB*/
569*4882a593Smuzhiyun case RK_FORMAT_ARGB_8888:
570*4882a593Smuzhiyun case RK_FORMAT_XRGB_8888:
571*4882a593Smuzhiyun case RK_FORMAT_ARGB_5551:
572*4882a593Smuzhiyun case RK_FORMAT_ARGB_4444:
573*4882a593Smuzhiyun case RK_FORMAT_ABGR_8888:
574*4882a593Smuzhiyun case RK_FORMAT_XBGR_8888:
575*4882a593Smuzhiyun case RK_FORMAT_ABGR_5551:
576*4882a593Smuzhiyun case RK_FORMAT_ABGR_4444:
577*4882a593Smuzhiyun ret = true;
578*4882a593Smuzhiyun break;
579*4882a593Smuzhiyun default:
580*4882a593Smuzhiyun break;
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun return ret;
584*4882a593Smuzhiyun }
585*4882a593Smuzhiyun
NormalRgaFormatHasAlpha(int format)586*4882a593Smuzhiyun bool NormalRgaFormatHasAlpha(int format) {
587*4882a593Smuzhiyun bool ret = false;
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun switch (format) {
590*4882a593Smuzhiyun case RK_FORMAT_RGBA_8888:
591*4882a593Smuzhiyun case RK_FORMAT_RGBA_5551:
592*4882a593Smuzhiyun case RK_FORMAT_RGBA_4444:
593*4882a593Smuzhiyun case RK_FORMAT_BGRA_8888:
594*4882a593Smuzhiyun case RK_FORMAT_BGRA_5551:
595*4882a593Smuzhiyun case RK_FORMAT_BGRA_4444:
596*4882a593Smuzhiyun case RK_FORMAT_ARGB_8888:
597*4882a593Smuzhiyun case RK_FORMAT_ARGB_5551:
598*4882a593Smuzhiyun case RK_FORMAT_ARGB_4444:
599*4882a593Smuzhiyun case RK_FORMAT_ABGR_8888:
600*4882a593Smuzhiyun case RK_FORMAT_ABGR_5551:
601*4882a593Smuzhiyun case RK_FORMAT_ABGR_4444:
602*4882a593Smuzhiyun case RK_FORMAT_RGBA2BPP:
603*4882a593Smuzhiyun ret = true;
604*4882a593Smuzhiyun break;
605*4882a593Smuzhiyun default:
606*4882a593Smuzhiyun break;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun return ret;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun // 0/near 1/bilnear 2/bicubic
613*4882a593Smuzhiyun // 0/copy 1/rotate_scale 2/x_mirror 3/y_mirror
614*4882a593Smuzhiyun // rotate angle
615*4882a593Smuzhiyun // dither en flag
616*4882a593Smuzhiyun // AA flag
NormalRgaSetBitbltMode(struct rga_req * msg,unsigned char scale_mode,unsigned char rotate_mode,unsigned int angle,unsigned int dither_en,unsigned int AA_en,unsigned int yuv2rgb_mode)617*4882a593Smuzhiyun int NormalRgaSetBitbltMode(struct rga_req *msg,
618*4882a593Smuzhiyun unsigned char scale_mode, unsigned char rotate_mode,
619*4882a593Smuzhiyun unsigned int angle, unsigned int dither_en,
620*4882a593Smuzhiyun unsigned int AA_en, unsigned int yuv2rgb_mode) {
621*4882a593Smuzhiyun unsigned int alpha_mode;
622*4882a593Smuzhiyun msg->render_mode = bitblt_mode;
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun msg->scale_mode = scale_mode;
625*4882a593Smuzhiyun msg->rotate_mode = rotate_mode;
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun msg->sina = sina_table[angle];
628*4882a593Smuzhiyun msg->cosa = cosa_table[angle];
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun msg->yuv2rgb_mode = yuv2rgb_mode;
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun msg->alpha_rop_flag |= ((dither_en << 5) & 0x20);
633*4882a593Smuzhiyun msg->alpha_rop_flag |= ((AA_en << 7) & 0x80);
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun alpha_mode = msg->alpha_rop_mode & 3;
636*4882a593Smuzhiyun if(rotate_mode == BB_ROTATE) {
637*4882a593Smuzhiyun if (AA_en == ENABLE) {
638*4882a593Smuzhiyun if ((msg->alpha_rop_flag & 0x3) == 0x1) {
639*4882a593Smuzhiyun if (alpha_mode == 0) {
640*4882a593Smuzhiyun msg->alpha_rop_mode = 0x2;
641*4882a593Smuzhiyun } else if (alpha_mode == 1) {
642*4882a593Smuzhiyun msg->alpha_rop_mode = 0x1;
643*4882a593Smuzhiyun }
644*4882a593Smuzhiyun } else {
645*4882a593Smuzhiyun msg->alpha_rop_flag |= 1;
646*4882a593Smuzhiyun msg->alpha_rop_mode = 1;
647*4882a593Smuzhiyun }
648*4882a593Smuzhiyun }
649*4882a593Smuzhiyun }
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun if (msg->src_trans_mode)
652*4882a593Smuzhiyun msg->scale_mode = 0;
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun return 0;
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun /* 1bpp/2bpp/4bpp/8bpp */
658*4882a593Smuzhiyun /* src endian mode sel */
659*4882a593Smuzhiyun /* BPP1 = 0 */
660*4882a593Smuzhiyun /* BPP1 = 1 */
NormalRgaSetColorPaletteMode(struct rga_req * msg,unsigned char palette_mode,unsigned char endian_mode,unsigned int bpp1_0_color,unsigned int bpp1_1_color)661*4882a593Smuzhiyun int NormalRgaSetColorPaletteMode(struct rga_req *msg,
662*4882a593Smuzhiyun unsigned char palette_mode,unsigned char endian_mode,
663*4882a593Smuzhiyun unsigned int bpp1_0_color, unsigned int bpp1_1_color) {
664*4882a593Smuzhiyun msg->render_mode = color_palette_mode;
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun msg->palette_mode = palette_mode;
667*4882a593Smuzhiyun msg->endian_mode = endian_mode;
668*4882a593Smuzhiyun msg->fg_color = bpp1_0_color;
669*4882a593Smuzhiyun msg->bg_color = bpp1_1_color;
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun return 1;
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun
674*4882a593Smuzhiyun /* gradient color part */
675*4882a593Smuzhiyun /* saturation mode */
676*4882a593Smuzhiyun /* patten fill or solid fill */
677*4882a593Smuzhiyun /* solid color */
678*4882a593Smuzhiyun /* pattern width */
679*4882a593Smuzhiyun /* pattern height */
680*4882a593Smuzhiyun /* pattern x offset */
681*4882a593Smuzhiyun /* pattern y offset */
682*4882a593Smuzhiyun /* alpha en */
NormalRgaSetColorFillMode(struct rga_req * msg,COLOR_FILL * gr_color,unsigned char gr_satur_mode,unsigned char cf_mode,unsigned int color,unsigned short pat_width,unsigned short pat_height,unsigned char pat_x_off,unsigned char pat_y_off,unsigned char aa_en)683*4882a593Smuzhiyun int NormalRgaSetColorFillMode(
684*4882a593Smuzhiyun struct rga_req *msg, COLOR_FILL *gr_color,
685*4882a593Smuzhiyun unsigned char gr_satur_mode, unsigned char cf_mode,
686*4882a593Smuzhiyun unsigned int color, unsigned short pat_width,
687*4882a593Smuzhiyun unsigned short pat_height, unsigned char pat_x_off,
688*4882a593Smuzhiyun unsigned char pat_y_off, unsigned char aa_en) {
689*4882a593Smuzhiyun msg->render_mode = color_fill_mode;
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun msg->gr_color.gr_x_a = ((int)(gr_color->gr_x_a * 256.0))& 0xffff;
692*4882a593Smuzhiyun msg->gr_color.gr_x_b = ((int)(gr_color->gr_x_b * 256.0))& 0xffff;
693*4882a593Smuzhiyun msg->gr_color.gr_x_g = ((int)(gr_color->gr_x_g * 256.0))& 0xffff;
694*4882a593Smuzhiyun msg->gr_color.gr_x_r = ((int)(gr_color->gr_x_r * 256.0))& 0xffff;
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun msg->gr_color.gr_y_a = ((int)(gr_color->gr_y_a * 256.0))& 0xffff;
697*4882a593Smuzhiyun msg->gr_color.gr_y_b = ((int)(gr_color->gr_y_b * 256.0))& 0xffff;
698*4882a593Smuzhiyun msg->gr_color.gr_y_g = ((int)(gr_color->gr_y_g * 256.0))& 0xffff;
699*4882a593Smuzhiyun msg->gr_color.gr_y_r = ((int)(gr_color->gr_y_r * 256.0))& 0xffff;
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun msg->color_fill_mode = cf_mode;
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun msg->pat.act_w = pat_width;
704*4882a593Smuzhiyun msg->pat.act_h = pat_height;
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun msg->pat.x_offset = pat_x_off;
707*4882a593Smuzhiyun msg->pat.y_offset = pat_y_off;
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun msg->fg_color = color;
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun msg->alpha_rop_flag |= ((gr_satur_mode & 1) << 6);
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun if(aa_en) {
714*4882a593Smuzhiyun msg->alpha_rop_flag |= 0x1;
715*4882a593Smuzhiyun msg->alpha_rop_mode = 1;
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun return 1;
718*4882a593Smuzhiyun }
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun /* start point */
721*4882a593Smuzhiyun /* end point */
722*4882a593Smuzhiyun /* line point drawing color */
723*4882a593Smuzhiyun /* line width */
724*4882a593Smuzhiyun /* AA en */
725*4882a593Smuzhiyun /* last point en */
NormalRgaSetLineDrawingMode(struct rga_req * msg,POINT sp,POINT ep,unsigned int color,unsigned int line_width,unsigned char AA_en,unsigned char last_point_en)726*4882a593Smuzhiyun int NormalRgaSetLineDrawingMode(struct rga_req *msg,
727*4882a593Smuzhiyun POINT sp, POINT ep,
728*4882a593Smuzhiyun unsigned int color, unsigned int line_width,
729*4882a593Smuzhiyun unsigned char AA_en, unsigned char last_point_en)
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun {
732*4882a593Smuzhiyun msg->render_mode = line_point_drawing_mode;
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun msg->line_draw_info.start_point.x = sp.x;
735*4882a593Smuzhiyun msg->line_draw_info.start_point.y = sp.y;
736*4882a593Smuzhiyun msg->line_draw_info.end_point.x = ep.x;
737*4882a593Smuzhiyun msg->line_draw_info.end_point.y = ep.y;
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun msg->line_draw_info.color = color;
740*4882a593Smuzhiyun msg->line_draw_info.line_width = line_width;
741*4882a593Smuzhiyun msg->line_draw_info.flag |= (AA_en & 1);
742*4882a593Smuzhiyun msg->line_draw_info.flag |= ((last_point_en & 1) << 1);
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun if (AA_en == 1) {
745*4882a593Smuzhiyun msg->alpha_rop_flag = 1;
746*4882a593Smuzhiyun msg->alpha_rop_mode = 0x1;
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun return 1;
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun /* blur/sharpness */
753*4882a593Smuzhiyun /* filter intensity */
754*4882a593Smuzhiyun /* dither_en flag */
755*4882a593Smuzhiyun
NormalRgaSetBlurSharpFilterMode(struct rga_req * msg,unsigned char filter_mode,unsigned char filter_type,unsigned char dither_en)756*4882a593Smuzhiyun int NormalRgaSetBlurSharpFilterMode(
757*4882a593Smuzhiyun struct rga_req *msg, unsigned char filter_mode,
758*4882a593Smuzhiyun unsigned char filter_type, unsigned char dither_en) {
759*4882a593Smuzhiyun msg->render_mode = blur_sharp_filter_mode;
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun msg->bsfilter_flag |= (filter_type & 3);
762*4882a593Smuzhiyun msg->bsfilter_flag |= ((filter_mode & 1) << 2);
763*4882a593Smuzhiyun msg->alpha_rop_flag |= ((dither_en & 1) << 5);
764*4882a593Smuzhiyun return 1;
765*4882a593Smuzhiyun }
766*4882a593Smuzhiyun
NormalRgaSetPreScalingMode(struct rga_req * msg,unsigned char dither_en)767*4882a593Smuzhiyun int NormalRgaSetPreScalingMode(
768*4882a593Smuzhiyun struct rga_req *msg, unsigned char dither_en) {
769*4882a593Smuzhiyun msg->render_mode = pre_scaling_mode;
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun msg->alpha_rop_flag |= ((dither_en & 1) << 5);
772*4882a593Smuzhiyun return 1;
773*4882a593Smuzhiyun }
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun /* LUT table addr */
776*4882a593Smuzhiyun /* 1bpp/2bpp/4bpp/8bpp */
777*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
NormalRgaUpdatePaletteTableMode(struct rga_req * msg,unsigned long LUT_addr,unsigned int palette_mode)778*4882a593Smuzhiyun int NormalRgaUpdatePaletteTableMode(
779*4882a593Smuzhiyun struct rga_req *msg,unsigned long LUT_addr,unsigned int palette_mode)
780*4882a593Smuzhiyun #else
781*4882a593Smuzhiyun int NormalRgaUpdatePaletteTableMode(
782*4882a593Smuzhiyun struct rga_req *msg,unsigned int LUT_addr, unsigned int palette_mode)
783*4882a593Smuzhiyun #endif
784*4882a593Smuzhiyun {
785*4882a593Smuzhiyun msg->render_mode = update_palette_table_mode;
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun msg->LUT_addr = LUT_addr;
788*4882a593Smuzhiyun msg->palette_mode = palette_mode;
789*4882a593Smuzhiyun return 1;
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun /* patten addr */
793*4882a593Smuzhiyun /* patten width */
794*4882a593Smuzhiyun /* patten height */
795*4882a593Smuzhiyun /* patten format */
796*4882a593Smuzhiyun
NormalRgaUpdatePattenBuffMode(struct rga_req * msg,unsigned int pat_addr,unsigned int w,unsigned int h,unsigned int format)797*4882a593Smuzhiyun int NormalRgaUpdatePattenBuffMode(struct rga_req *msg,
798*4882a593Smuzhiyun unsigned int pat_addr, unsigned int w,
799*4882a593Smuzhiyun unsigned int h, unsigned int format) {
800*4882a593Smuzhiyun msg->render_mode = update_patten_buff_mode;
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun msg->pat.yrgb_addr = pat_addr;
803*4882a593Smuzhiyun msg->pat.act_w = w*h;
804*4882a593Smuzhiyun msg->pat.act_h = 1;
805*4882a593Smuzhiyun msg->pat.format = format;
806*4882a593Smuzhiyun return 1;
807*4882a593Smuzhiyun }
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
NormalRgaMmuInfo(struct rga_req * msg,unsigned char mmu_en,unsigned char src_flush,unsigned char dst_flush,unsigned char cmd_flush,unsigned long base_addr,unsigned char page_size)810*4882a593Smuzhiyun int NormalRgaMmuInfo(struct rga_req *msg,
811*4882a593Smuzhiyun unsigned char mmu_en, unsigned char src_flush,
812*4882a593Smuzhiyun unsigned char dst_flush,unsigned char cmd_flush,
813*4882a593Smuzhiyun unsigned long base_addr, unsigned char page_size)
814*4882a593Smuzhiyun #else
815*4882a593Smuzhiyun int NormalRgaMmuInfo(struct rga_req *msg,
816*4882a593Smuzhiyun unsigned char mmu_en, unsigned char src_flush,
817*4882a593Smuzhiyun unsigned char dst_flush,unsigned char cmd_flush,
818*4882a593Smuzhiyun unsigned int base_addr, unsigned char page_size)
819*4882a593Smuzhiyun #endif
820*4882a593Smuzhiyun {
821*4882a593Smuzhiyun msg->mmu_info.mmu_en = mmu_en;
822*4882a593Smuzhiyun msg->mmu_info.base_addr = base_addr;
823*4882a593Smuzhiyun msg->mmu_info.mmu_flag = ((page_size & 0x3) << 4) |
824*4882a593Smuzhiyun ((cmd_flush & 0x1) << 3) |
825*4882a593Smuzhiyun ((dst_flush & 0x1) << 2) |
826*4882a593Smuzhiyun ((src_flush & 0x1) << 1) | mmu_en;
827*4882a593Smuzhiyun return 1;
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun
NormalRgaMmuFlag(struct rga_req * msg,int src_mmu_en,int dst_mmu_en)830*4882a593Smuzhiyun int NormalRgaMmuFlag(struct rga_req *msg,
831*4882a593Smuzhiyun int src_mmu_en, int dst_mmu_en) {
832*4882a593Smuzhiyun if (src_mmu_en || dst_mmu_en)
833*4882a593Smuzhiyun msg->mmu_info.mmu_flag |= (0x1u << 31);
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun if (src_mmu_en)
836*4882a593Smuzhiyun msg->mmu_info.mmu_flag |= (0x1 << 8);
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun if (dst_mmu_en)
839*4882a593Smuzhiyun msg->mmu_info.mmu_flag |= (0x1 << 10);
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun return 1;
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun
NormalRgaNNQuantizeMode(struct rga_req * msg,rga_info * dst)844*4882a593Smuzhiyun int NormalRgaNNQuantizeMode(struct rga_req *msg, rga_info *dst) {
845*4882a593Smuzhiyun if (dst->nn.nn_flag == 1) {
846*4882a593Smuzhiyun msg->alpha_rop_flag |= (dst->nn.nn_flag << 8);
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun msg->gr_color.gr_x_r = dst->nn.scale_r;
849*4882a593Smuzhiyun msg->gr_color.gr_x_g = dst->nn.scale_g;
850*4882a593Smuzhiyun msg->gr_color.gr_x_b = dst->nn.scale_b;
851*4882a593Smuzhiyun
852*4882a593Smuzhiyun msg->gr_color.gr_y_r = dst->nn.offset_r;
853*4882a593Smuzhiyun msg->gr_color.gr_y_g = dst->nn.offset_g;
854*4882a593Smuzhiyun msg->gr_color.gr_y_b = dst->nn.offset_b;
855*4882a593Smuzhiyun }
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun return 0;
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun
NormalRgaFullColorSpaceConvert(struct rga_req * msg,int color_space_mode)860*4882a593Smuzhiyun int NormalRgaFullColorSpaceConvert(struct rga_req *msg, int color_space_mode) {
861*4882a593Smuzhiyun typedef struct csc_coe_float_t {
862*4882a593Smuzhiyun float r_v;
863*4882a593Smuzhiyun float g_y;
864*4882a593Smuzhiyun float b_u;
865*4882a593Smuzhiyun float off;
866*4882a593Smuzhiyun } csc_coe_float_t;
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun typedef struct full_csc_float_t {
869*4882a593Smuzhiyun csc_coe_float_t coe_y;
870*4882a593Smuzhiyun csc_coe_float_t coe_u;
871*4882a593Smuzhiyun csc_coe_float_t coe_v;
872*4882a593Smuzhiyun } full_csc_float_t;
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun int factor = 0;
875*4882a593Smuzhiyun full_csc_float_t *fptr = NULL;
876*4882a593Smuzhiyun full_csc_t default_csc_table;
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun /* ABGR => AUYV */
879*4882a593Smuzhiyun static full_csc_float_t default_csc_float_table[] = {
880*4882a593Smuzhiyun /* coe_00 * R + coe_01 * G + coe_02 * B + coe_off */
881*4882a593Smuzhiyun { { 0.299, 0.587, 0.114, 0 }, { -0.169, -0.331, 0.5, 128 }, { 0.5, -0.419, -0.081, 128 } }, //R2Y 601 full
882*4882a593Smuzhiyun { { 0.213, 0.715, 0.072, 0 }, { -0.115, -0.385, 0.5, 128 }, { 0.5, -0.454, -0.046, 128 } }, //R2Y 709 full
883*4882a593Smuzhiyun /* coe_00 * V + coe_01 * Y + coe_02 * U + coe_off */
884*4882a593Smuzhiyun { { -0.1826, 0.8588, -0.1014, 52.3554 }, { 0.1007, -0.0004, 0.8948, 0.5781 }, { 0.9005, 0, 0.0653, 4.3855 } }, //601 full range => 709 limit range
885*4882a593Smuzhiyun { { 0.1916, 1, 0.0993, -37.2476 }, { -0.1106, 0, 0.9895, 15.4669 }, { 0.9827, 0.0002, -0.0723, 11.4231 } }, //709 limit range => 601 limit range
886*4882a593Smuzhiyun { { 0.1685, 0.8588, 0.0872, -16.7232 }, { -0.0971, 0, 0.8695, 29.1335 }, { 0.8638, 0, -0.0637, 25.5824 } }, //709 full range => 601 limit range
887*4882a593Smuzhiyun { { 0.1955, 1, 0.1019, -38.0729 }, { -0.1104, 0, 0.9899, 15.4218 }, { 0.9836, 0, -0.0716, 11.2587 } }, //709 full range => 601 full range
888*4882a593Smuzhiyun };
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun factor = 0x3ff;
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun switch (color_space_mode) {
893*4882a593Smuzhiyun case rgb2yuv_601_full :
894*4882a593Smuzhiyun fptr = &(default_csc_float_table[0]);
895*4882a593Smuzhiyun break;
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun case rgb2yuv_709_full :
898*4882a593Smuzhiyun fptr = &(default_csc_float_table[1]);
899*4882a593Smuzhiyun break;
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun case yuv2yuv_709_limit_2_601_limit :
902*4882a593Smuzhiyun fptr = &(default_csc_float_table[3]);
903*4882a593Smuzhiyun break;
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun case yuv2yuv_601_full_2_709_limit :
906*4882a593Smuzhiyun fptr = &(default_csc_float_table[2]);
907*4882a593Smuzhiyun break;
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun case yuv2yuv_709_full_2_601_limit :
910*4882a593Smuzhiyun fptr = &(default_csc_float_table[4]);
911*4882a593Smuzhiyun break;
912*4882a593Smuzhiyun
913*4882a593Smuzhiyun case yuv2yuv_709_full_2_601_full :
914*4882a593Smuzhiyun fptr = &(default_csc_float_table[5]);
915*4882a593Smuzhiyun break;
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun case yuv2yuv_601_limit_2_709_limit :
918*4882a593Smuzhiyun case yuv2yuv_601_limit_2_709_full :
919*4882a593Smuzhiyun case yuv2yuv_601_full_2_709_full :
920*4882a593Smuzhiyun case yuv2yuv_709_limit_2_601_full :
921*4882a593Smuzhiyun default :
922*4882a593Smuzhiyun printf("Not support full csc mode [%x]\n", color_space_mode);
923*4882a593Smuzhiyun return -1;
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun /* enable full csc */
927*4882a593Smuzhiyun default_csc_table.flag = 1;
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun /* full csc coefficient */
930*4882a593Smuzhiyun default_csc_table.coe_y.r_v = (int)(fptr->coe_y.r_v * factor +0.5);
931*4882a593Smuzhiyun default_csc_table.coe_y.g_y = (int)(fptr->coe_y.g_y * factor +0.5);
932*4882a593Smuzhiyun default_csc_table.coe_y.b_u = (int)(fptr->coe_y.b_u * factor +0.5);
933*4882a593Smuzhiyun default_csc_table.coe_y.off = (int)(fptr->coe_y.off * factor +0.5);
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun default_csc_table.coe_u.r_v = (int)(fptr->coe_u.r_v * factor +0.5);
936*4882a593Smuzhiyun default_csc_table.coe_u.g_y = (int)(fptr->coe_u.g_y * factor +0.5);
937*4882a593Smuzhiyun default_csc_table.coe_u.b_u = (int)(fptr->coe_u.b_u * factor +0.5);
938*4882a593Smuzhiyun default_csc_table.coe_u.off = (int)(fptr->coe_u.off * factor +0.5);
939*4882a593Smuzhiyun
940*4882a593Smuzhiyun default_csc_table.coe_v.r_v = (int)(fptr->coe_v.r_v * factor +0.5);
941*4882a593Smuzhiyun default_csc_table.coe_v.g_y = (int)(fptr->coe_v.g_y * factor +0.5);
942*4882a593Smuzhiyun default_csc_table.coe_v.b_u = (int)(fptr->coe_v.b_u * factor +0.5);
943*4882a593Smuzhiyun default_csc_table.coe_v.off = (int)(fptr->coe_v.off * factor +0.5);
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun if (color_space_mode >> 8) {
946*4882a593Smuzhiyun msg->full_csc.flag = 1;
947*4882a593Smuzhiyun memcpy(&msg->full_csc, &default_csc_table, sizeof(full_csc_t));
948*4882a593Smuzhiyun }
949*4882a593Smuzhiyun
950*4882a593Smuzhiyun return 0;
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun
NormalRgaDitherMode(struct rga_req * msg,rga_info * dst,int format)954*4882a593Smuzhiyun int NormalRgaDitherMode(struct rga_req *msg, rga_info *dst, int format)
955*4882a593Smuzhiyun {
956*4882a593Smuzhiyun if (dst->dither.enable == 1)
957*4882a593Smuzhiyun {
958*4882a593Smuzhiyun msg->alpha_rop_flag = 1;
959*4882a593Smuzhiyun msg->alpha_rop_flag |= (dst->dither.enable << 5);
960*4882a593Smuzhiyun }
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun if (format == RK_FORMAT_Y4)
963*4882a593Smuzhiyun {
964*4882a593Smuzhiyun msg->dither_mode = dst->dither.mode;
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun msg->gr_color.gr_x_r = dst->dither.lut0_l;
967*4882a593Smuzhiyun msg->gr_color.gr_x_g = dst->dither.lut0_h;
968*4882a593Smuzhiyun msg->gr_color.gr_y_r = dst->dither.lut1_l;
969*4882a593Smuzhiyun msg->gr_color.gr_y_g = dst->dither.lut1_h;
970*4882a593Smuzhiyun }
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun return 0;
973*4882a593Smuzhiyun }
974*4882a593Smuzhiyun
NormalRgaInitTables()975*4882a593Smuzhiyun int NormalRgaInitTables() {
976*4882a593Smuzhiyun int sinaTable[360] = {
977*4882a593Smuzhiyun 0, 1144, 2287, 3430, 4572, 5712, 6850, 7987, 9121, 10252,
978*4882a593Smuzhiyun 11380, 12505, 13626, 14742, 15855, 16962, 18064, 19161, 20252, 21336,
979*4882a593Smuzhiyun 22415, 23486, 24550, 25607, 26656, 27697, 28729, 29753, 30767, 31772,
980*4882a593Smuzhiyun 32768, 33754, 34729, 35693, 36647, 37590, 38521, 39441, 40348, 41243,
981*4882a593Smuzhiyun 42126, 42995, 43852, 44695, 45525, 46341, 47143, 47930, 48703, 49461,
982*4882a593Smuzhiyun 50203, 50931, 51643, 52339, 53020, 53684, 54332, 54963, 55578, 56175,
983*4882a593Smuzhiyun 56756, 57319, 57865, 58393, 58903, 59396, 59870, 60326, 60764, 61183,
984*4882a593Smuzhiyun 61584, 61966, 62328, 62672, 62997, 63303, 63589, 63856, 64104, 64332,
985*4882a593Smuzhiyun 64540, 64729, 64898, 65048, 65177, 65287, 65376, 65446, 65496, 65526,
986*4882a593Smuzhiyun 65536, 65526, 65496, 65446, 65376, 65287, 65177, 65048, 64898, 64729,
987*4882a593Smuzhiyun 64540, 64332, 64104, 63856, 63589, 63303, 62997, 62672, 62328, 61966,
988*4882a593Smuzhiyun 61584, 61183, 60764, 60326, 59870, 59396, 58903, 58393, 57865, 57319,
989*4882a593Smuzhiyun 56756, 56175, 55578, 54963, 54332, 53684, 53020, 52339, 51643, 50931,
990*4882a593Smuzhiyun 50203, 49461, 48703, 47930, 47143, 46341, 45525, 44695, 43852, 42995,
991*4882a593Smuzhiyun 42126, 41243, 40348, 39441, 38521, 37590, 36647, 35693, 34729, 33754,
992*4882a593Smuzhiyun 32768, 31772, 30767, 29753, 28729, 27697, 26656, 25607, 24550, 23486,
993*4882a593Smuzhiyun 22415, 21336, 20252, 19161, 18064, 16962, 15855, 14742, 13626, 12505,
994*4882a593Smuzhiyun 11380, 10252, 9121, 7987, 6850, 5712, 4572, 3430, 2287, 1144,
995*4882a593Smuzhiyun 0, -1144, -2287, -3430, -4572, -5712, -6850, -7987, -9121, -10252,
996*4882a593Smuzhiyun -11380, -12505, -13626, -14742, -15855, -16962, -18064, -19161, -20252, -21336,
997*4882a593Smuzhiyun -22415, -23486, -24550, -25607, -26656, -27697, -28729, -29753, -30767, -31772,
998*4882a593Smuzhiyun -32768, -33754, -34729, -35693, -36647, -37590, -38521, -39441, -40348, -41243,
999*4882a593Smuzhiyun -42126, -42995, -43852, -44695, -45525, -46341, -47143, -47930, -48703, -49461,
1000*4882a593Smuzhiyun -50203, -50931, -51643, -52339, -53020, -53684, -54332, -54963, -55578, -56175,
1001*4882a593Smuzhiyun -56756, -57319, -57865, -58393, -58903, -59396, -59870, -60326, -60764, -61183,
1002*4882a593Smuzhiyun -61584, -61966, -62328, -62672, -62997, -63303, -63589, -63856, -64104, -64332,
1003*4882a593Smuzhiyun -64540, -64729, -64898, -65048, -65177, -65287, -65376, -65446, -65496, -65526,
1004*4882a593Smuzhiyun -65536, -65526, -65496, -65446, -65376, -65287, -65177, -65048, -64898, -64729,
1005*4882a593Smuzhiyun -64540, -64332, -64104, -63856, -63589, -63303, -62997, -62672, -62328, -61966,
1006*4882a593Smuzhiyun -61584, -61183, -60764, -60326, -59870, -59396, -58903, -58393, -57865, -57319,
1007*4882a593Smuzhiyun -56756, -56175, -55578, -54963, -54332, -53684, -53020, -52339, -51643, -50931,
1008*4882a593Smuzhiyun -50203, -49461, -48703, -47930, -47143, -46341, -45525, -44695, -43852, -42995,
1009*4882a593Smuzhiyun -42126, -41243, -40348, -39441, -38521, -37590, -36647, -35693, -34729, -33754,
1010*4882a593Smuzhiyun -32768, -31772, -30767, -29753, -28729, -27697, -26656, -25607, -24550, -23486,
1011*4882a593Smuzhiyun -22415, -21336, -20252, -19161, -18064, -16962, -15855, -14742, -13626, -12505,
1012*4882a593Smuzhiyun -11380, -10252, -9121, -7987, -6850, -5712, -4572, -3430, -2287, -1144
1013*4882a593Smuzhiyun };
1014*4882a593Smuzhiyun int cosaTable[360] = {
1015*4882a593Smuzhiyun 65536, 65526, 65496, 65446, 65376, 65287, 65177, 65048, 64898, 64729,
1016*4882a593Smuzhiyun 64540, 64332, 64104, 63856, 63589, 63303, 62997, 62672, 62328, 61966,
1017*4882a593Smuzhiyun 61584, 61183, 60764, 60326, 59870, 59396, 58903, 58393, 57865, 57319,
1018*4882a593Smuzhiyun 56756, 56175, 55578, 54963, 54332, 53684, 53020, 52339, 51643, 50931,
1019*4882a593Smuzhiyun 50203, 49461, 48703, 47930, 47143, 46341, 45525, 44695, 43852, 42995,
1020*4882a593Smuzhiyun 42126, 41243, 40348, 39441, 38521, 37590, 36647, 35693, 34729, 33754,
1021*4882a593Smuzhiyun 32768, 31772, 30767, 29753, 28729, 27697, 26656, 25607, 24550, 23486,
1022*4882a593Smuzhiyun 22415, 21336, 20252, 19161, 18064, 16962, 15855, 14742, 13626, 12505,
1023*4882a593Smuzhiyun 11380, 10252, 9121, 7987, 6850, 5712, 4572, 3430, 2287, 1144,
1024*4882a593Smuzhiyun 0, -1144, -2287, -3430, -4572, -5712, -6850, -7987, -9121, -10252,
1025*4882a593Smuzhiyun -11380, -12505, -13626, -14742, -15855, -16962, -18064, -19161, -20252, -21336,
1026*4882a593Smuzhiyun -22415, -23486, -24550, -25607, -26656, -27697, -28729, -29753, -30767, -31772,
1027*4882a593Smuzhiyun -32768, -33754, -34729, -35693, -36647, -37590, -38521, -39441, -40348, -41243,
1028*4882a593Smuzhiyun -42126, -42995, -43852, -44695, -45525, -46341, -47143, -47930, -48703, -49461,
1029*4882a593Smuzhiyun -50203, -50931, -51643, -52339, -53020, -53684, -54332, -54963, -55578, -56175,
1030*4882a593Smuzhiyun -56756, -57319, -57865, -58393, -58903, -59396, -59870, -60326, -60764, -61183,
1031*4882a593Smuzhiyun -61584, -61966, -62328, -62672, -62997, -63303, -63589, -63856, -64104, -64332,
1032*4882a593Smuzhiyun -64540, -64729, -64898, -65048, -65177, -65287, -65376, -65446, -65496, -65526,
1033*4882a593Smuzhiyun -65536, -65526, -65496, -65446, -65376, -65287, -65177, -65048, -64898, -64729,
1034*4882a593Smuzhiyun -64540, -64332, -64104, -63856, -63589, -63303, -62997, -62672, -62328, -61966,
1035*4882a593Smuzhiyun -61584, -61183, -60764, -60326, -59870, -59396, -58903, -58393, -57865, -57319,
1036*4882a593Smuzhiyun -56756, -56175, -55578, -54963, -54332, -53684, -53020, -52339, -51643, -50931,
1037*4882a593Smuzhiyun -50203, -49461, -48703, -47930, -47143, -46341, -45525, -44695, -43852, -42995,
1038*4882a593Smuzhiyun -42126, -41243, -40348, -39441, -38521, -37590, -36647, -35693, -34729, -33754,
1039*4882a593Smuzhiyun -32768, -31772, -30767, -29753, -28729, -27697, -26656, -25607, -24550, -23486,
1040*4882a593Smuzhiyun -22415, -21336, -20252, -19161, -18064, -16962, -15855, -14742, -13626, -12505,
1041*4882a593Smuzhiyun -11380, -10252, -9121, -7987, -6850, -5712, -4572, -3430, -2287, -1144,
1042*4882a593Smuzhiyun 0, 1144, 2287, 3430, 4572, 5712, 6850, 7987, 9121, 10252,
1043*4882a593Smuzhiyun 11380, 12505, 13626, 14742, 15855, 16962, 18064, 19161, 20252, 21336,
1044*4882a593Smuzhiyun 22415, 23486, 24550, 25607, 26656, 27697, 28729, 29753, 30767, 31772,
1045*4882a593Smuzhiyun 32768, 33754, 34729, 35693, 36647, 37590, 38521, 39441, 40348, 41243,
1046*4882a593Smuzhiyun 42126, 42995, 43852, 44695, 45525, 46341, 47143, 47930, 48703, 49461,
1047*4882a593Smuzhiyun 50203, 50931, 51643, 52339, 53020, 53684, 54332, 54963, 55578, 56175,
1048*4882a593Smuzhiyun 56756, 57319, 57865, 58393, 58903, 59396, 59870, 60326, 60764, 61183,
1049*4882a593Smuzhiyun 61584, 61966, 62328, 62672, 62997, 63303, 63589, 63856, 64104, 64332,
1050*4882a593Smuzhiyun 64540, 64729, 64898, 65048, 65177, 65287, 65376, 65446, 65496, 65526
1051*4882a593Smuzhiyun };
1052*4882a593Smuzhiyun memcpy(sina_table, sinaTable, sizeof(sina_table));
1053*4882a593Smuzhiyun memcpy(cosa_table, cosaTable, sizeof(cosa_table));
1054*4882a593Smuzhiyun return 0;
1055*4882a593Smuzhiyun }
1056*4882a593Smuzhiyun
NormalRgaLogOutRgaReq(struct rga_req rgaReg)1057*4882a593Smuzhiyun void NormalRgaLogOutRgaReq(struct rga_req rgaReg) {
1058*4882a593Smuzhiyun ALOGE("render_mode = %d rotate_mode = %d in_fence_fd = %d handle_flag = 0x%x",
1059*4882a593Smuzhiyun rgaReg.render_mode, rgaReg.rotate_mode, rgaReg.in_fence_fd, rgaReg.handle_flag);
1060*4882a593Smuzhiyun ALOGE("src:[%lx,%lx,%lx],x-y[%d,%d],w-h[%d,%d],vw-vh[%d,%d],f=%d, rd_mode = %d",
1061*4882a593Smuzhiyun (unsigned long)rgaReg.src.yrgb_addr, (unsigned long)rgaReg.src.uv_addr, (unsigned long)rgaReg.src.v_addr,
1062*4882a593Smuzhiyun rgaReg.src.x_offset, rgaReg.src.y_offset,
1063*4882a593Smuzhiyun rgaReg.src.act_w, rgaReg.src.act_h,
1064*4882a593Smuzhiyun rgaReg.src.vir_w, rgaReg.src.vir_h, rgaReg.src.format, rgaReg.src.rd_mode);
1065*4882a593Smuzhiyun ALOGE("dst:[%lx,%lx,%lx],x-y[%d,%d],w-h[%d,%d],vw-vh[%d,%d],f=%d, rd_mode = %d",
1066*4882a593Smuzhiyun (unsigned long)rgaReg.dst.yrgb_addr, (unsigned long)rgaReg.dst.uv_addr, (unsigned long)rgaReg.dst.v_addr,
1067*4882a593Smuzhiyun rgaReg.dst.x_offset, rgaReg.dst.y_offset,
1068*4882a593Smuzhiyun rgaReg.dst.act_w, rgaReg.dst.act_h,
1069*4882a593Smuzhiyun rgaReg.dst.vir_w, rgaReg.dst.vir_h, rgaReg.dst.format, rgaReg.dst.rd_mode);
1070*4882a593Smuzhiyun ALOGE("pat:[%lx,%lx,%lx],x-y[%d,%d],w-h[%d,%d],vw-vh[%d,%d],f=%d, rd_mode = %d",
1071*4882a593Smuzhiyun (unsigned long)rgaReg.pat.yrgb_addr, (unsigned long)rgaReg.pat.uv_addr, (unsigned long)rgaReg.pat.v_addr,
1072*4882a593Smuzhiyun rgaReg.pat.x_offset, rgaReg.pat.y_offset,
1073*4882a593Smuzhiyun rgaReg.pat.act_w, rgaReg.pat.act_h,
1074*4882a593Smuzhiyun rgaReg.pat.vir_w, rgaReg.pat.vir_h, rgaReg.pat.format, rgaReg.pat.rd_mode);
1075*4882a593Smuzhiyun ALOGE("ROP:[%lx,%x,%x],LUT[%lx]", (unsigned long)rgaReg.rop_mask_addr, rgaReg.alpha_rop_flag,
1076*4882a593Smuzhiyun rgaReg.rop_code, (unsigned long)rgaReg.LUT_addr);
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun ALOGE("color:[%x,%x,%x,%x,%x]", rgaReg.color_key_max, rgaReg.color_key_min,
1079*4882a593Smuzhiyun rgaReg.fg_color, rgaReg.bg_color, rgaReg.color_fill_mode);
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun ALOGE("MMU:[%d,%lx,%x]", rgaReg.mmu_info.mmu_en,
1082*4882a593Smuzhiyun (unsigned long)rgaReg.mmu_info.base_addr, rgaReg.mmu_info.mmu_flag);
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun ALOGE("mode[%d,%d,%d,%d,%d]", rgaReg.palette_mode, rgaReg.yuv2rgb_mode,
1086*4882a593Smuzhiyun rgaReg.endian_mode, rgaReg.src_trans_mode,rgaReg.scale_mode);
1087*4882a593Smuzhiyun
1088*4882a593Smuzhiyun ALOGE("Full CSC : EN[%d] FACTOR[%d, %d, %d, %d], [%d, %d, %d, %d], [%d, %d, %d, %d]",
1089*4882a593Smuzhiyun rgaReg.full_csc.flag,
1090*4882a593Smuzhiyun rgaReg.full_csc.coe_y.r_v, rgaReg.full_csc.coe_y.g_y, rgaReg.full_csc.coe_y.b_u, rgaReg.full_csc.coe_y.off,
1091*4882a593Smuzhiyun rgaReg.full_csc.coe_u.r_v, rgaReg.full_csc.coe_u.g_y, rgaReg.full_csc.coe_u.b_u, rgaReg.full_csc.coe_u.off,
1092*4882a593Smuzhiyun rgaReg.full_csc.coe_v.r_v, rgaReg.full_csc.coe_v.g_y, rgaReg.full_csc.coe_v.b_u, rgaReg.full_csc.coe_v.off);
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun ALOGE("gr_color_x [%x, %x, %x]", rgaReg.gr_color.gr_x_r, rgaReg.gr_color.gr_x_g, rgaReg.gr_color.gr_x_b);
1095*4882a593Smuzhiyun ALOGE("gr_color_x [%x, %x, %x]", rgaReg.gr_color.gr_y_r, rgaReg.gr_color.gr_y_g, rgaReg.gr_color.gr_y_b);
1096*4882a593Smuzhiyun
1097*4882a593Smuzhiyun return;
1098*4882a593Smuzhiyun }
1099*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2ImgeInfo(rga2_img_info_t * info,rga_img_info_t * orig_info)1100*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2ImgeInfo(rga2_img_info_t *info, rga_img_info_t *orig_info) {
1101*4882a593Smuzhiyun info->yrgb_addr = orig_info->yrgb_addr;
1102*4882a593Smuzhiyun info->uv_addr = orig_info->uv_addr;
1103*4882a593Smuzhiyun info->v_addr = orig_info->v_addr;
1104*4882a593Smuzhiyun info->format = orig_info->format;
1105*4882a593Smuzhiyun info->act_w = orig_info->act_w;
1106*4882a593Smuzhiyun info->act_h = orig_info->act_h;
1107*4882a593Smuzhiyun info->x_offset = orig_info->x_offset;
1108*4882a593Smuzhiyun info->y_offset = orig_info->y_offset;
1109*4882a593Smuzhiyun info->vir_w = orig_info->vir_w;
1110*4882a593Smuzhiyun info->vir_h = orig_info->vir_h;
1111*4882a593Smuzhiyun info->endian_mode = orig_info->endian_mode;
1112*4882a593Smuzhiyun info->alpha_swap = orig_info->alpha_swap;
1113*4882a593Smuzhiyun }
1114*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2Rect(rga2_rect_t * clip,RECT * orig_clip)1115*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2Rect(rga2_rect_t *clip, RECT *orig_clip) {
1116*4882a593Smuzhiyun clip->xmax = orig_clip->xmax;
1117*4882a593Smuzhiyun clip->ymax = orig_clip->ymax;
1118*4882a593Smuzhiyun clip->xmin = orig_clip->xmin;
1119*4882a593Smuzhiyun clip->ymin = orig_clip->ymin;
1120*4882a593Smuzhiyun }
1121*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2ColorFill(rga2_color_fill_t * color,COLOR_FILL * orig_color)1122*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2ColorFill(rga2_color_fill_t *color, COLOR_FILL *orig_color) {
1123*4882a593Smuzhiyun color->gr_x_a = orig_color->gr_x_a;
1124*4882a593Smuzhiyun color->gr_y_a = orig_color->gr_y_a;
1125*4882a593Smuzhiyun color->gr_x_b = orig_color->gr_x_b;
1126*4882a593Smuzhiyun color->gr_y_b = orig_color->gr_y_b;
1127*4882a593Smuzhiyun color->gr_x_g = orig_color->gr_x_g;
1128*4882a593Smuzhiyun color->gr_y_g = orig_color->gr_y_g;
1129*4882a593Smuzhiyun color->gr_x_r = orig_color->gr_x_r;
1130*4882a593Smuzhiyun color->gr_y_r = orig_color->gr_y_r;
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2LineDrawInfo(rga2_line_draw_t * info,line_draw_t * orig_info)1133*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2LineDrawInfo(rga2_line_draw_t *info, line_draw_t *orig_info) {
1134*4882a593Smuzhiyun info->start_point.x = orig_info->start_point.x;
1135*4882a593Smuzhiyun info->start_point.y = orig_info->start_point.y;
1136*4882a593Smuzhiyun info->end_point.x = orig_info->end_point.x;
1137*4882a593Smuzhiyun info->end_point.y = orig_info->end_point.y;
1138*4882a593Smuzhiyun info->color = orig_info->color;
1139*4882a593Smuzhiyun info->flag = orig_info->flag;
1140*4882a593Smuzhiyun info->line_width = orig_info->line_width;
1141*4882a593Smuzhiyun }
1142*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2Fading(rga2_fading_t * fading,FADING * orig_fading)1143*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2Fading(rga2_fading_t *fading, FADING *orig_fading) {
1144*4882a593Smuzhiyun fading->b = orig_fading->b;
1145*4882a593Smuzhiyun fading->g = orig_fading->g;
1146*4882a593Smuzhiyun fading->r = orig_fading->r;
1147*4882a593Smuzhiyun fading->res = orig_fading->res;
1148*4882a593Smuzhiyun }
1149*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2Mmu(rga2_mmu_t * mmu,MMU * orig_mmu)1150*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2Mmu(rga2_mmu_t *mmu, MMU *orig_mmu) {
1151*4882a593Smuzhiyun mmu->mmu_en = orig_mmu->mmu_en;
1152*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
1153*4882a593Smuzhiyun mmu->base_addr = (unsigned long)orig_mmu->base_addr;
1154*4882a593Smuzhiyun #else
1155*4882a593Smuzhiyun mmu->base_addr = (unsigned int)orig_mmu->base_addr;
1156*4882a593Smuzhiyun #endif
1157*4882a593Smuzhiyun mmu->mmu_flag = orig_mmu->mmu_flag;
1158*4882a593Smuzhiyun }
1159*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2FullCscCoe(rga2_csc_coe_t * coe,csc_coe_t * orig_coe)1160*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2FullCscCoe(rga2_csc_coe_t *coe, csc_coe_t *orig_coe) {
1161*4882a593Smuzhiyun coe->r_v = orig_coe->r_v;
1162*4882a593Smuzhiyun coe->g_y = orig_coe->g_y;
1163*4882a593Smuzhiyun coe->b_u = orig_coe->b_u;
1164*4882a593Smuzhiyun coe->off = orig_coe->off;
1165*4882a593Smuzhiyun }
1166*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2FullCsc(rga2_full_csc_t * csc,full_csc_t * orig_csc)1167*4882a593Smuzhiyun static inline void NormalRgaCompatModeConvertRga2FullCsc(rga2_full_csc_t *csc, full_csc_t *orig_csc) {
1168*4882a593Smuzhiyun csc->flag = orig_csc->flag;
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2FullCscCoe(&csc->coe_y, &orig_csc->coe_y);
1171*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2FullCscCoe(&csc->coe_u, &orig_csc->coe_u);
1172*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2FullCscCoe(&csc->coe_v, &orig_csc->coe_v);
1173*4882a593Smuzhiyun }
1174*4882a593Smuzhiyun
NormalRgaCompatModeConvertRga2(rga2_req * req,rga_req * orig_req)1175*4882a593Smuzhiyun void NormalRgaCompatModeConvertRga2(rga2_req *req, rga_req *orig_req) {
1176*4882a593Smuzhiyun req->render_mode = orig_req->render_mode;
1177*4882a593Smuzhiyun
1178*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2ImgeInfo(&req->src, &orig_req->src);
1179*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2ImgeInfo(&req->dst, &orig_req->dst);
1180*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2ImgeInfo(&req->pat, &orig_req->pat);
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun #if defined(__arm64__) || defined(__aarch64__)
1183*4882a593Smuzhiyun req->rop_mask_addr = (unsigned long)orig_req->rop_mask_addr;
1184*4882a593Smuzhiyun req->LUT_addr = (unsigned long)orig_req->LUT_addr;
1185*4882a593Smuzhiyun #else
1186*4882a593Smuzhiyun req->rop_mask_addr = (unsigned int)orig_req->rop_mask_addr;
1187*4882a593Smuzhiyun req->LUT_addr = (unsigned int)orig_req->LUT_addr;
1188*4882a593Smuzhiyun #endif
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2Rect(&req->clip, &orig_req->clip);
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun req->sina = orig_req->sina;
1193*4882a593Smuzhiyun req->cosa = orig_req->cosa;
1194*4882a593Smuzhiyun req->alpha_rop_flag = orig_req->alpha_rop_flag;
1195*4882a593Smuzhiyun req->scale_mode = orig_req->scale_mode;
1196*4882a593Smuzhiyun req->color_key_max = orig_req->color_key_max;
1197*4882a593Smuzhiyun req->color_key_min = orig_req->color_key_min;
1198*4882a593Smuzhiyun req->fg_color = orig_req->fg_color;
1199*4882a593Smuzhiyun req->bg_color = orig_req->bg_color;
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2ColorFill(&req->gr_color, &orig_req->gr_color);
1202*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2LineDrawInfo(&req->line_draw_info, &orig_req->line_draw_info);
1203*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2Fading(&req->fading, &orig_req->fading);
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun req->PD_mode = orig_req->PD_mode;
1206*4882a593Smuzhiyun req->alpha_global_value = orig_req->alpha_global_value;
1207*4882a593Smuzhiyun req->rop_code = orig_req->rop_code;
1208*4882a593Smuzhiyun req->bsfilter_flag = orig_req->bsfilter_flag;
1209*4882a593Smuzhiyun req->palette_mode = orig_req->palette_mode;
1210*4882a593Smuzhiyun req->yuv2rgb_mode = orig_req->yuv2rgb_mode;
1211*4882a593Smuzhiyun req->endian_mode = orig_req->endian_mode;
1212*4882a593Smuzhiyun req->rotate_mode = orig_req->rotate_mode;
1213*4882a593Smuzhiyun req->color_fill_mode = orig_req->color_fill_mode;
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2Mmu(&req->mmu_info, &orig_req->mmu_info);
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun req->alpha_rop_mode = orig_req->alpha_rop_mode;
1218*4882a593Smuzhiyun req->src_trans_mode = orig_req->src_trans_mode;
1219*4882a593Smuzhiyun req->dither_mode = orig_req->dither_mode;
1220*4882a593Smuzhiyun
1221*4882a593Smuzhiyun NormalRgaCompatModeConvertRga2FullCsc(&req->full_csc, &orig_req->full_csc);
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun /* multi_rga moved this part of the processing to the driver. */
1224*4882a593Smuzhiyun if (req->sina == 65536 && req->cosa == 0) {
1225*4882a593Smuzhiyun /* rotate 90 */
1226*4882a593Smuzhiyun req->dst.x_offset = req->dst.x_offset + req->dst.act_h - 1;
1227*4882a593Smuzhiyun } else if (req->sina == 0 && req->cosa == -65536) {
1228*4882a593Smuzhiyun /* rotate 180 */
1229*4882a593Smuzhiyun req->dst.x_offset = req->dst.x_offset + req->dst.act_w - 1;
1230*4882a593Smuzhiyun req->dst.y_offset = req->dst.y_offset + req->dst.act_h - 1;
1231*4882a593Smuzhiyun } else if (req->sina == -65536 && req->cosa == 0) {
1232*4882a593Smuzhiyun /* totate 270 */
1233*4882a593Smuzhiyun req->dst.y_offset = req->dst.y_offset + req->dst.act_w - 1;
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun }
1236