xref: /OK3568_Linux_fs/external/linux-rga/im2d_api/src/im2d_impl.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  * Authors:
4*4882a593Smuzhiyun  *  Cerf Yu <cerf.yu@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 #ifdef LOG_TAG
20*4882a593Smuzhiyun #undef LOG_TAG
21*4882a593Smuzhiyun #define LOG_TAG "im2d_rga_impl"
22*4882a593Smuzhiyun #else
23*4882a593Smuzhiyun #define LOG_TAG "im2d_rga_impl"
24*4882a593Smuzhiyun #endif
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #include <stdio.h>
27*4882a593Smuzhiyun #include <string.h>
28*4882a593Smuzhiyun #include <errno.h>
29*4882a593Smuzhiyun #include <math.h>
30*4882a593Smuzhiyun #include <sys/ioctl.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include "im2d.h"
33*4882a593Smuzhiyun #include "im2d_impl.h"
34*4882a593Smuzhiyun #include "im2d_log.h"
35*4882a593Smuzhiyun #include "im2d_hardware.h"
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #include "RockchipRga.h"
38*4882a593Smuzhiyun #include "core/NormalRga.h"
39*4882a593Smuzhiyun #include "RgaUtils.h"
40*4882a593Smuzhiyun #include "utils.h"
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #ifdef ANDROID
43*4882a593Smuzhiyun using namespace android;
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define MAX(n1, n2) ((n1) > (n2) ? (n1) : (n2))
47*4882a593Smuzhiyun #define GET_GCD(n1, n2) \
48*4882a593Smuzhiyun     ({ \
49*4882a593Smuzhiyun         int i; \
50*4882a593Smuzhiyun         for(i = 1; i <= (n1) && i <= (n2); i++) { \
51*4882a593Smuzhiyun             if((n1) % i==0 && (n2) % i==0) \
52*4882a593Smuzhiyun                 gcd = i; \
53*4882a593Smuzhiyun         } \
54*4882a593Smuzhiyun         gcd; \
55*4882a593Smuzhiyun     })
56*4882a593Smuzhiyun #define GET_LCM(n1, n2, gcd) (((n1) * (n2)) / gcd)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun extern struct rgaContext *rgaCtx;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun struct im2d_job_manager g_im2d_job_manager;
61*4882a593Smuzhiyun __thread im_context_t g_im2d_context;
62*4882a593Smuzhiyun 
rga_get_context(void)63*4882a593Smuzhiyun IM_API static IM_STATUS rga_get_context(void) {
64*4882a593Smuzhiyun     if (rgaCtx == NULL) {
65*4882a593Smuzhiyun         RockchipRga& rkRga(RockchipRga::get());
66*4882a593Smuzhiyun         if (rgaCtx == NULL) {
67*4882a593Smuzhiyun             IM_LOGE("The current RockchipRga singleton is destroyed. "
68*4882a593Smuzhiyun                     "Please check if RkRgaInit/RkRgaDeInit are called, if so, please disable them.");
69*4882a593Smuzhiyun             return IM_STATUS_FAILED;
70*4882a593Smuzhiyun         }
71*4882a593Smuzhiyun     }
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
rga_support_info_merge_table(rga_info_table_entry * dst_table,rga_info_table_entry * merge_table)76*4882a593Smuzhiyun static IM_STATUS rga_support_info_merge_table(rga_info_table_entry *dst_table, rga_info_table_entry *merge_table) {
77*4882a593Smuzhiyun     if (dst_table == NULL || merge_table == NULL) {
78*4882a593Smuzhiyun         IM_LOGE("%s[%d] dst or merge table is NULL!\n", __FUNCTION__, __LINE__);
79*4882a593Smuzhiyun         return IM_STATUS_FAILED;
80*4882a593Smuzhiyun     }
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun     dst_table->version              |= merge_table->version;
83*4882a593Smuzhiyun     dst_table->input_format         |= merge_table->input_format;
84*4882a593Smuzhiyun     dst_table->output_format        |= merge_table->output_format;
85*4882a593Smuzhiyun     dst_table->feature              |= merge_table->feature;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     dst_table->input_resolution     = MAX(dst_table->input_resolution, merge_table->input_resolution);
88*4882a593Smuzhiyun     dst_table->output_resolution    = MAX(dst_table->output_resolution, merge_table->output_resolution);
89*4882a593Smuzhiyun     dst_table->byte_stride          = MAX(dst_table->byte_stride, merge_table->byte_stride);
90*4882a593Smuzhiyun     dst_table->scale_limit          = MAX(dst_table->scale_limit, merge_table->scale_limit);
91*4882a593Smuzhiyun     dst_table->performance          = MAX(dst_table->performance, merge_table->performance);
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /**
97*4882a593Smuzhiyun  * rga_version_compare() - Used to compare two struct rga_version_t.
98*4882a593Smuzhiyun  * @param version1
99*4882a593Smuzhiyun  * @param version2
100*4882a593Smuzhiyun  *
101*4882a593Smuzhiyun  * @returns
102*4882a593Smuzhiyun  *   if version1 > version2, return >0;
103*4882a593Smuzhiyun  *   if version1 = version2, return 0;
104*4882a593Smuzhiyun  *   if version1 < version2, retunr <0.
105*4882a593Smuzhiyun  */
rga_version_compare(struct rga_version_t version1,struct rga_version_t version2)106*4882a593Smuzhiyun int rga_version_compare(struct rga_version_t version1, struct rga_version_t version2) {
107*4882a593Smuzhiyun     if (version1.major > version2.major)
108*4882a593Smuzhiyun         return 1;
109*4882a593Smuzhiyun     else if (version1.major == version2.major && version1.minor > version2.minor)
110*4882a593Smuzhiyun         return 1;
111*4882a593Smuzhiyun     else if (version1.major == version2.major && version1.minor == version2.minor && version1.revision > version2.revision)
112*4882a593Smuzhiyun         return 1;
113*4882a593Smuzhiyun     else if (version1.major == version2.major && version1.minor == version2.minor && version1.revision == version2.revision)
114*4882a593Smuzhiyun         return 0;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun     return -1;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /**
120*4882a593Smuzhiyun  * rga_version_table_get_current_index() - Find the current version index in bind_table.
121*4882a593Smuzhiyun  *
122*4882a593Smuzhiyun  * @param version
123*4882a593Smuzhiyun  * @param table
124*4882a593Smuzhiyun  * @param table_size
125*4882a593Smuzhiyun  *
126*4882a593Smuzhiyun  * @returns if return value >= 0, then index is found, otherwise, the query fails.
127*4882a593Smuzhiyun  */
rga_version_table_get_current_index(rga_version_t & version,const rga_version_bind_table_entry_t * table,int table_size)128*4882a593Smuzhiyun int rga_version_table_get_current_index(rga_version_t &version, const rga_version_bind_table_entry_t *table, int table_size) {
129*4882a593Smuzhiyun     int index = -1;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun     for (int i = (table_size - 1); i >= 0; i--) {
132*4882a593Smuzhiyun         if (rga_version_compare(version, table[i].current) >= 0) {
133*4882a593Smuzhiyun             if (i == (table_size - 1)) {
134*4882a593Smuzhiyun                 index = i;
135*4882a593Smuzhiyun                 break;
136*4882a593Smuzhiyun             } else if (rga_version_compare(table[i + 1].current, version) > 0) {
137*4882a593Smuzhiyun                 index = i;
138*4882a593Smuzhiyun                 break;
139*4882a593Smuzhiyun             }
140*4882a593Smuzhiyun         }
141*4882a593Smuzhiyun     }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun     return index;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /**
147*4882a593Smuzhiyun  * rga_version_table_get_minimum_index() - Find the current version index in bind_table.
148*4882a593Smuzhiyun  *
149*4882a593Smuzhiyun  * @param version
150*4882a593Smuzhiyun  * @param table
151*4882a593Smuzhiyun  * @param table_size
152*4882a593Smuzhiyun  *
153*4882a593Smuzhiyun  * @returns if return value >= 0, then index is found, otherwise, the query fails.
154*4882a593Smuzhiyun  */
rga_version_table_get_minimum_index(rga_version_t & version,const rga_version_bind_table_entry_t * table,int table_size)155*4882a593Smuzhiyun int rga_version_table_get_minimum_index(rga_version_t &version, const rga_version_bind_table_entry_t *table, int table_size) {
156*4882a593Smuzhiyun     int index = -1;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun     for (int i = (table_size - 1); i >= 0; i--) {
159*4882a593Smuzhiyun         if (rga_version_compare(version, table[i].minimum) >= 0) {
160*4882a593Smuzhiyun             if (i == (table_size - 1)) {
161*4882a593Smuzhiyun                 index = i;
162*4882a593Smuzhiyun                 break;
163*4882a593Smuzhiyun             } else if (rga_version_compare(table[i + 1].minimum, version) > 0) {
164*4882a593Smuzhiyun                 index = i;
165*4882a593Smuzhiyun                 break;
166*4882a593Smuzhiyun             }
167*4882a593Smuzhiyun         }
168*4882a593Smuzhiyun     }
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun     return index;
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /**
174*4882a593Smuzhiyun  * rga_version_table_check_minimum_range() - Check if the minimum version is within the required range.
175*4882a593Smuzhiyun  *
176*4882a593Smuzhiyun  * @param version
177*4882a593Smuzhiyun  * @param table
178*4882a593Smuzhiyun  * @param index
179*4882a593Smuzhiyun  *
180*4882a593Smuzhiyun  * @returns
181*4882a593Smuzhiyun  *   return value > 0, above range.
182*4882a593Smuzhiyun  *   return value = 0, within range.
183*4882a593Smuzhiyun  *   return value < 0, below range.
184*4882a593Smuzhiyun  */
rga_version_table_check_minimum_range(rga_version_t & version,const rga_version_bind_table_entry_t * table,int table_size,int index)185*4882a593Smuzhiyun int rga_version_table_check_minimum_range(rga_version_t &version,
186*4882a593Smuzhiyun                                           const rga_version_bind_table_entry_t *table,
187*4882a593Smuzhiyun                                           int table_size, int index) {
188*4882a593Smuzhiyun     if (rga_version_compare(version, table[index].minimum) >= 0) {
189*4882a593Smuzhiyun         if (index == (table_size - 1))
190*4882a593Smuzhiyun             return 0;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun         if (rga_version_compare(version, table[index + 1].minimum) < 0)
193*4882a593Smuzhiyun             return 0;
194*4882a593Smuzhiyun         else
195*4882a593Smuzhiyun             return 1;
196*4882a593Smuzhiyun     } else {
197*4882a593Smuzhiyun         return -1;
198*4882a593Smuzhiyun     }
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
rga_version_get_current_index_failed_default(rga_version_t & current,rga_version_t & minimum)201*4882a593Smuzhiyun static IM_STATUS rga_version_get_current_index_failed_default(rga_version_t &current, rga_version_t &minimum) {
202*4882a593Smuzhiyun     UNUSED(current);
203*4882a593Smuzhiyun     UNUSED(minimum);
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
rga_version_get_minimum_index_failed_default(rga_version_t & current,rga_version_t & minimum)208*4882a593Smuzhiyun static IM_STATUS rga_version_get_minimum_index_failed_default(rga_version_t &current, rga_version_t &minimum) {
209*4882a593Smuzhiyun     UNUSED(current);
210*4882a593Smuzhiyun     UNUSED(minimum);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun 
rga_version_witnin_minimun_range_default(rga_version_t & current,rga_version_t & minimum)215*4882a593Smuzhiyun static IM_STATUS rga_version_witnin_minimun_range_default(rga_version_t &current, rga_version_t &minimum) {
216*4882a593Smuzhiyun     UNUSED(current);
217*4882a593Smuzhiyun     UNUSED(minimum);
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
rga_version_above_minimun_range_default(rga_version_t & current,rga_version_t & minimum,const rga_version_bind_table_entry_t * least_version_table)222*4882a593Smuzhiyun static IM_STATUS rga_version_above_minimun_range_default(rga_version_t &current, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table) {
223*4882a593Smuzhiyun     UNUSED(current);
224*4882a593Smuzhiyun     UNUSED(minimum);
225*4882a593Smuzhiyun     UNUSED(least_version_table);
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun 
rga_version_below_minimun_range_default(rga_version_t & current,rga_version_t & minimum,const rga_version_bind_table_entry_t * least_version_table)230*4882a593Smuzhiyun static IM_STATUS rga_version_below_minimun_range_default(rga_version_t &current, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table) {
231*4882a593Smuzhiyun     UNUSED(current);
232*4882a593Smuzhiyun     UNUSED(minimum);
233*4882a593Smuzhiyun     UNUSED(least_version_table);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun 
rga_version_get_current_index_failed_user_header(rga_version_t & user_version,rga_version_t & header_version)238*4882a593Smuzhiyun static IM_STATUS rga_version_get_current_index_failed_user_header(rga_version_t &user_version, rga_version_t &header_version) {
239*4882a593Smuzhiyun     IM_LOGE("Failed to get the version binding table of librga, "
240*4882a593Smuzhiyun             "current version: librga: %s, header: %s",
241*4882a593Smuzhiyun             user_version.str, header_version.str);
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun 
rga_version_get_minimum_index_failed_user_header(rga_version_t & user_version,rga_version_t & header_version)246*4882a593Smuzhiyun static IM_STATUS rga_version_get_minimum_index_failed_user_header(rga_version_t &user_version, rga_version_t &header_version) {
247*4882a593Smuzhiyun     IM_LOGE("Failed to get the version binding table of header file, "
248*4882a593Smuzhiyun             "current version: librga: %s, header: %s",
249*4882a593Smuzhiyun             user_version.str, header_version.str);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
rga_version_above_minimun_range_user_header(rga_version_t & user_version,rga_version_t & header_version,const rga_version_bind_table_entry_t * least_version_table)254*4882a593Smuzhiyun static IM_STATUS rga_version_above_minimun_range_user_header(rga_version_t &user_version, rga_version_t &header_version, const rga_version_bind_table_entry_t *least_version_table) {
255*4882a593Smuzhiyun     IM_LOGE("The current referenced header_version is %s, but the running librga's version(%s) is too old, "
256*4882a593Smuzhiyun             "The librga must to be updated to version %s at least. "
257*4882a593Smuzhiyun             "You can try to update the SDK or update librga.so and header files "
258*4882a593Smuzhiyun             "through github(https://github.com/airockchip/librga/). ",
259*4882a593Smuzhiyun             header_version.str, user_version.str,
260*4882a593Smuzhiyun             least_version_table->current.str);
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun 
rga_version_below_minimun_range_user_header(rga_version_t & user_version,rga_version_t & header_version,const rga_version_bind_table_entry_t * least_version_table)265*4882a593Smuzhiyun static IM_STATUS rga_version_below_minimun_range_user_header(rga_version_t &user_version, rga_version_t &header_version, const rga_version_bind_table_entry_t *least_version_table) {
266*4882a593Smuzhiyun     IM_LOGE("The current librga.so's verison is %s, but the referenced header_version(%s) is too old, "
267*4882a593Smuzhiyun             "it is recommended to update the librga's header_version to %s and above."
268*4882a593Smuzhiyun             "You can try to update the SDK or update librga.so and header files "
269*4882a593Smuzhiyun             "through github(https://github.com/airockchip/librga/)",
270*4882a593Smuzhiyun             user_version.str, header_version.str,
271*4882a593Smuzhiyun             least_version_table->minimum.str);
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun 
rga_version_get_current_index_faile_user_driver(rga_version_t & user_version,rga_version_t & driver_version)276*4882a593Smuzhiyun static IM_STATUS rga_version_get_current_index_faile_user_driver(rga_version_t &user_version, rga_version_t &driver_version) {
277*4882a593Smuzhiyun     IM_LOGE("Failed to get the version binding table of librga, "
278*4882a593Smuzhiyun             "current version: librga: %s, driver: %s",
279*4882a593Smuzhiyun             user_version.str, driver_version.str);
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun 
rga_version_get_minimum_index_failed_user_driver(rga_version_t & user_version,rga_version_t & driver_version)284*4882a593Smuzhiyun static IM_STATUS rga_version_get_minimum_index_failed_user_driver(rga_version_t &user_version, rga_version_t &driver_version) {
285*4882a593Smuzhiyun     IM_LOGE("Failed to get the version binding table of rga_driver, "
286*4882a593Smuzhiyun             "current version: librga: %s, driver: %s",
287*4882a593Smuzhiyun             user_version.str, driver_version.str);
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
rga_version_above_minimun_range_user_driver(rga_version_t & user_version,rga_version_t & driver_version,const rga_version_bind_table_entry_t * least_version_table)292*4882a593Smuzhiyun static IM_STATUS rga_version_above_minimun_range_user_driver(rga_version_t &user_version, rga_version_t &driver_version, const rga_version_bind_table_entry_t *least_version_table) {
293*4882a593Smuzhiyun     IM_LOGE("The librga must to be updated to version %s at least. "
294*4882a593Smuzhiyun             "You can try to update the SDK or update librga.so and header files "
295*4882a593Smuzhiyun             "through github(https://github.com/airockchip/librga/). "
296*4882a593Smuzhiyun             "current version: librga %s, driver %s.",
297*4882a593Smuzhiyun             least_version_table->current.str,
298*4882a593Smuzhiyun             user_version.str, driver_version.str);
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun 
rga_version_below_minimun_range_user_driver(rga_version_t & user_version,rga_version_t & driver_version,const rga_version_bind_table_entry_t * least_version_table)303*4882a593Smuzhiyun static IM_STATUS rga_version_below_minimun_range_user_driver(rga_version_t &user_version, rga_version_t &driver_version, const rga_version_bind_table_entry_t *least_version_table) {
304*4882a593Smuzhiyun     IM_LOGE("The driver may be compatible, "
305*4882a593Smuzhiyun             "but it is best to update the driver to version %s. "
306*4882a593Smuzhiyun             "You can try to update the SDK or update the "
307*4882a593Smuzhiyun             "<SDK>/kernel/drivers/video/rockchip/rga3 directory individually. "
308*4882a593Smuzhiyun             "current version: librga %s, driver %s.",
309*4882a593Smuzhiyun             least_version_table->minimum.str,
310*4882a593Smuzhiyun             user_version.str, driver_version.str);
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun     return IM_STATUS_ERROR_VERSION;
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun static const rga_version_check_ops_t rga_version_check_user_header_ops {
316*4882a593Smuzhiyun     .get_current_index_failed = rga_version_get_current_index_failed_user_header,
317*4882a593Smuzhiyun     .get_minimum_index_failed = rga_version_get_minimum_index_failed_user_header,
318*4882a593Smuzhiyun     .witnin_minimun_range = rga_version_witnin_minimun_range_default,
319*4882a593Smuzhiyun     .above_minimun_range = rga_version_above_minimun_range_user_header,
320*4882a593Smuzhiyun     .below_minimun_range = rga_version_below_minimun_range_user_header,
321*4882a593Smuzhiyun };
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun static const rga_version_check_ops_t rga_version_check_user_driver_ops {
324*4882a593Smuzhiyun     .get_current_index_failed = rga_version_get_current_index_faile_user_driver,
325*4882a593Smuzhiyun     .get_minimum_index_failed = rga_version_get_minimum_index_failed_user_driver,
326*4882a593Smuzhiyun     .witnin_minimun_range = rga_version_witnin_minimun_range_default,
327*4882a593Smuzhiyun     .above_minimun_range = rga_version_above_minimun_range_user_driver,
328*4882a593Smuzhiyun     .below_minimun_range = rga_version_below_minimun_range_user_driver,
329*4882a593Smuzhiyun };
330*4882a593Smuzhiyun 
rga_version_check(rga_version_t & current_version,rga_version_t & minimum_version,const rga_version_bind_table_entry_t * table,int table_size,const rga_version_check_ops_t * ops)331*4882a593Smuzhiyun static int rga_version_check(rga_version_t &current_version, rga_version_t &minimum_version,
332*4882a593Smuzhiyun                              const rga_version_bind_table_entry_t *table, int table_size,
333*4882a593Smuzhiyun                              const rga_version_check_ops_t *ops) {
334*4882a593Smuzhiyun     int ret;
335*4882a593Smuzhiyun     int current_bind_index, least_index;
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun     current_bind_index = rga_version_table_get_current_index(current_version, table, table_size);
338*4882a593Smuzhiyun     if (current_bind_index < 0)
339*4882a593Smuzhiyun         return ops->get_current_index_failed ?
340*4882a593Smuzhiyun                ops->get_current_index_failed(current_version, minimum_version) :
341*4882a593Smuzhiyun                rga_version_get_current_index_failed_default(current_version, minimum_version);
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun     switch (rga_version_table_check_minimum_range(minimum_version, table, table_size, current_bind_index)) {
344*4882a593Smuzhiyun         case 0:
345*4882a593Smuzhiyun             ops->witnin_minimun_range ?
346*4882a593Smuzhiyun                 ops->witnin_minimun_range(current_version, minimum_version) :
347*4882a593Smuzhiyun                 rga_version_witnin_minimun_range_default(current_version, minimum_version);
348*4882a593Smuzhiyun             return 0;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun         case -1:
351*4882a593Smuzhiyun             ops->below_minimun_range ?
352*4882a593Smuzhiyun                 ops->below_minimun_range(current_version, minimum_version, &(table[current_bind_index])) :
353*4882a593Smuzhiyun                 rga_version_below_minimun_range_default(current_version, minimum_version, &(table[current_bind_index]));
354*4882a593Smuzhiyun             return -1;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun         case 1:
357*4882a593Smuzhiyun             least_index = rga_version_table_get_minimum_index(minimum_version, table, table_size);
358*4882a593Smuzhiyun             if (least_index < 0) {
359*4882a593Smuzhiyun                 ops->get_minimum_index_failed ?
360*4882a593Smuzhiyun                     ops->get_minimum_index_failed(current_version, minimum_version) :
361*4882a593Smuzhiyun                     rga_version_get_minimum_index_failed_default(current_version, minimum_version);
362*4882a593Smuzhiyun                 return 1;
363*4882a593Smuzhiyun             }
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun             ops->above_minimun_range ?
366*4882a593Smuzhiyun                 ops->above_minimun_range(current_version, minimum_version, &(table[least_index])) :
367*4882a593Smuzhiyun                 rga_version_above_minimun_range_default(current_version, minimum_version, &(table[least_index]));
368*4882a593Smuzhiyun             return 1;
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun         default:
371*4882a593Smuzhiyun             IM_LOGE("This shouldn't happen!");
372*4882a593Smuzhiyun             return IM_STATUS_FAILED;
373*4882a593Smuzhiyun     }
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun 
rga_yuv_legality_check(const char * name,rga_buffer_t info,im_rect rect)376*4882a593Smuzhiyun static IM_STATUS rga_yuv_legality_check(const char *name, rga_buffer_t info, im_rect rect) {
377*4882a593Smuzhiyun     if ((info.wstride % 2) || (info.hstride % 2) ||
378*4882a593Smuzhiyun         (info.width % 2)  || (info.height % 2) ||
379*4882a593Smuzhiyun         (rect.x % 2) || (rect.y % 2) ||
380*4882a593Smuzhiyun         (rect.width % 2) || (rect.height % 2)) {
381*4882a593Smuzhiyun         IM_LOGW("%s, Error yuv not align to 2, rect[x,y,w,h] = [%d, %d, %d, %d], "
382*4882a593Smuzhiyun                 "wstride = %d, hstride = %d, format = 0x%x(%s)",
383*4882a593Smuzhiyun                 name, rect.x, rect.y, info.width, info.height, info.wstride, info.hstride,
384*4882a593Smuzhiyun                 info.format, translate_format_str(info.format));
385*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
386*4882a593Smuzhiyun     }
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun 
rga_is_buffer_valid(rga_buffer_t buf)391*4882a593Smuzhiyun bool rga_is_buffer_valid(rga_buffer_t buf) {
392*4882a593Smuzhiyun     return (buf.phy_addr != NULL || buf.vir_addr != NULL || buf.fd > 0 || buf.handle > 0);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun 
rga_is_rect_valid(im_rect rect)395*4882a593Smuzhiyun bool rga_is_rect_valid(im_rect rect) {
396*4882a593Smuzhiyun     return (rect.x > 0 || rect.y > 0 || (rect.width > 0 && rect.height > 0));
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun 
empty_structure(rga_buffer_t * src,rga_buffer_t * dst,rga_buffer_t * pat,im_rect * srect,im_rect * drect,im_rect * prect,im_opt_t * opt)399*4882a593Smuzhiyun void empty_structure(rga_buffer_t *src, rga_buffer_t *dst, rga_buffer_t *pat,
400*4882a593Smuzhiyun                      im_rect *srect, im_rect *drect, im_rect *prect, im_opt_t *opt) {
401*4882a593Smuzhiyun     if (src != NULL)
402*4882a593Smuzhiyun         memset(src, 0, sizeof(*src));
403*4882a593Smuzhiyun     if (dst != NULL)
404*4882a593Smuzhiyun         memset(dst, 0, sizeof(*dst));
405*4882a593Smuzhiyun     if (pat != NULL)
406*4882a593Smuzhiyun         memset(pat, 0, sizeof(*pat));
407*4882a593Smuzhiyun     if (srect != NULL)
408*4882a593Smuzhiyun         memset(srect, 0, sizeof(*srect));
409*4882a593Smuzhiyun     if (drect != NULL)
410*4882a593Smuzhiyun         memset(drect, 0, sizeof(*drect));
411*4882a593Smuzhiyun     if (prect != NULL)
412*4882a593Smuzhiyun         memset(prect, 0, sizeof(*prect));
413*4882a593Smuzhiyun     if (opt != NULL)
414*4882a593Smuzhiyun         memset(opt, 0, sizeof(*opt));
415*4882a593Smuzhiyun }
416*4882a593Smuzhiyun 
rga_set_buffer_info(rga_buffer_t dst,rga_info_t * dstinfo)417*4882a593Smuzhiyun IM_STATUS rga_set_buffer_info(rga_buffer_t dst, rga_info_t* dstinfo) {
418*4882a593Smuzhiyun     if(NULL == dstinfo) {
419*4882a593Smuzhiyun         IM_LOGE("Invaild dstinfo, dst structure address is NULL!");
420*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
421*4882a593Smuzhiyun     }
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun     if (dst.handle > 0) {
424*4882a593Smuzhiyun         dstinfo->handle = dst.handle;
425*4882a593Smuzhiyun     } else if(dst.phy_addr != NULL) {
426*4882a593Smuzhiyun         dstinfo->phyAddr= dst.phy_addr;
427*4882a593Smuzhiyun     } else if(dst.fd > 0) {
428*4882a593Smuzhiyun         dstinfo->fd = dst.fd;
429*4882a593Smuzhiyun         dstinfo->mmuFlag = 1;
430*4882a593Smuzhiyun     } else if(dst.vir_addr != NULL) {
431*4882a593Smuzhiyun         dstinfo->virAddr = dst.vir_addr;
432*4882a593Smuzhiyun         dstinfo->mmuFlag = 1;
433*4882a593Smuzhiyun     } else {
434*4882a593Smuzhiyun         IM_LOGE("Invaild dst buffer, no address available in dst buffer, phy_addr = %ld, fd = %d, vir_addr = %ld, handle = %d",
435*4882a593Smuzhiyun                 (unsigned long)dst.phy_addr, dst.fd, (unsigned long)dst.vir_addr, dst.handle);
436*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
437*4882a593Smuzhiyun     }
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun 
rga_set_buffer_info(const rga_buffer_t src,rga_buffer_t dst,rga_info_t * srcinfo,rga_info_t * dstinfo)442*4882a593Smuzhiyun IM_STATUS rga_set_buffer_info(const rga_buffer_t src, rga_buffer_t dst, rga_info_t* srcinfo, rga_info_t* dstinfo) {
443*4882a593Smuzhiyun     if(NULL == srcinfo) {
444*4882a593Smuzhiyun         IM_LOGE("Invaild srcinfo, src structure address is NULL.");
445*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
446*4882a593Smuzhiyun     }
447*4882a593Smuzhiyun     if(NULL == dstinfo) {
448*4882a593Smuzhiyun         IM_LOGE("Invaild dstinfo, dst structure address is NULL.");
449*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
450*4882a593Smuzhiyun     }
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun     if (src.handle > 0) {
453*4882a593Smuzhiyun         srcinfo->handle = src.handle;
454*4882a593Smuzhiyun     } else if(src.phy_addr != NULL) {
455*4882a593Smuzhiyun         srcinfo->phyAddr = src.phy_addr;
456*4882a593Smuzhiyun     } else if(src.fd > 0) {
457*4882a593Smuzhiyun         srcinfo->fd = src.fd;
458*4882a593Smuzhiyun         srcinfo->mmuFlag = 1;
459*4882a593Smuzhiyun     } else if(src.vir_addr != NULL) {
460*4882a593Smuzhiyun         srcinfo->virAddr = src.vir_addr;
461*4882a593Smuzhiyun         srcinfo->mmuFlag = 1;
462*4882a593Smuzhiyun     } else {
463*4882a593Smuzhiyun         IM_LOGE("Invaild src buffer, no address available in src buffer, phy_addr = %ld, fd = %d, vir_addr = %ld, handle = %d",
464*4882a593Smuzhiyun                 (unsigned long)src.phy_addr, src.fd, (unsigned long)src.vir_addr, src.handle);
465*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
466*4882a593Smuzhiyun     }
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun     if (dst.handle > 0) {
469*4882a593Smuzhiyun         dstinfo->handle = dst.handle;
470*4882a593Smuzhiyun     } else if(dst.phy_addr != NULL) {
471*4882a593Smuzhiyun         dstinfo->phyAddr= dst.phy_addr;
472*4882a593Smuzhiyun     } else if(dst.fd > 0) {
473*4882a593Smuzhiyun         dstinfo->fd = dst.fd;
474*4882a593Smuzhiyun         dstinfo->mmuFlag = 1;
475*4882a593Smuzhiyun     } else if(dst.vir_addr != NULL) {
476*4882a593Smuzhiyun         dstinfo->virAddr = dst.vir_addr;
477*4882a593Smuzhiyun         dstinfo->mmuFlag = 1;
478*4882a593Smuzhiyun     } else {
479*4882a593Smuzhiyun         IM_LOGE("Invaild dst buffer, no address available in dst buffer, phy_addr = %ld, fd = %d, vir_addr = %ld, handle = %d",
480*4882a593Smuzhiyun                 (unsigned long)dst.phy_addr, dst.fd, (unsigned long)dst.vir_addr, dst.handle);
481*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
482*4882a593Smuzhiyun     }
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun 
rga_get_info(rga_info_table_entry * return_table)487*4882a593Smuzhiyun IM_STATUS rga_get_info(rga_info_table_entry *return_table) {
488*4882a593Smuzhiyun     int ret;
489*4882a593Smuzhiyun     int  rga_version = 0;
490*4882a593Smuzhiyun     rga_info_table_entry merge_table;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun     ret = rga_get_context();
493*4882a593Smuzhiyun     if (ret != IM_STATUS_SUCCESS)
494*4882a593Smuzhiyun         return (IM_STATUS)ret;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun     memset(&merge_table, 0x0, sizeof(merge_table));
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun     for (uint32_t i = 0; i < rgaCtx->mHwVersions.size; i++) {
499*4882a593Smuzhiyun         if (rgaCtx->mHwVersions.version[i].major == 2 &&
500*4882a593Smuzhiyun             rgaCtx->mHwVersions.version[i].minor == 0) {
501*4882a593Smuzhiyun             if (rgaCtx->mHwVersions.version[i].revision == 0) {
502*4882a593Smuzhiyun                 rga_version = IM_RGA_HW_VERSION_RGA_2_INDEX;
503*4882a593Smuzhiyun                 memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
504*4882a593Smuzhiyun             } else {
505*4882a593Smuzhiyun                 goto TRY_TO_COMPATIBLE;
506*4882a593Smuzhiyun             }
507*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 3 &&
508*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 0) {
509*4882a593Smuzhiyun             switch (rgaCtx->mHwVersions.version[i].revision) {
510*4882a593Smuzhiyun                 case 0x16445 :
511*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_INDEX;
512*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
513*4882a593Smuzhiyun                     break;
514*4882a593Smuzhiyun                 case 0x22245 :
515*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
516*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
517*4882a593Smuzhiyun                     break;
518*4882a593Smuzhiyun                 case 0x76831 :
519*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_3_INDEX;
520*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
521*4882a593Smuzhiyun                     break;
522*4882a593Smuzhiyun                 default :
523*4882a593Smuzhiyun                     goto TRY_TO_COMPATIBLE;
524*4882a593Smuzhiyun             }
525*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 3 &&
526*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 2) {
527*4882a593Smuzhiyun             switch (rgaCtx->mHwVersions.version[i].revision) {
528*4882a593Smuzhiyun                 case 0x18218 :
529*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
530*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun                     merge_table.feature |= IM_RGA_SUPPORT_FEATURE_ROP;
533*4882a593Smuzhiyun                     break;
534*4882a593Smuzhiyun                 case 0x56726 :
535*4882a593Smuzhiyun                 case 0x63318 :
536*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
537*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun                     merge_table.input_format |= IM_RGA_SUPPORT_FORMAT_YUYV_422 |
540*4882a593Smuzhiyun                                                  IM_RGA_SUPPORT_FORMAT_YUV_400;
541*4882a593Smuzhiyun                     merge_table.output_format |= IM_RGA_SUPPORT_FORMAT_YUV_400 |
542*4882a593Smuzhiyun                                                   IM_RGA_SUPPORT_FORMAT_Y4;
543*4882a593Smuzhiyun                     merge_table.feature |= IM_RGA_SUPPORT_FEATURE_QUANTIZE |
544*4882a593Smuzhiyun                                             IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC |
545*4882a593Smuzhiyun                                             IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC;
546*4882a593Smuzhiyun                     break;
547*4882a593Smuzhiyun                 default :
548*4882a593Smuzhiyun                     goto TRY_TO_COMPATIBLE;
549*4882a593Smuzhiyun             }
550*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 3 &&
551*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 3) {
552*4882a593Smuzhiyun             switch (rgaCtx->mHwVersions.version[i].revision) {
553*4882a593Smuzhiyun                 case 0x87975:
554*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
555*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun                     merge_table.input_format |= IM_RGA_SUPPORT_FORMAT_YUYV_422 |
558*4882a593Smuzhiyun                                                 IM_RGA_SUPPORT_FORMAT_YUV_400 |
559*4882a593Smuzhiyun                                                 IM_RGA_SUPPORT_FORMAT_RGBA2BPP;
560*4882a593Smuzhiyun                     merge_table.output_format |= IM_RGA_SUPPORT_FORMAT_YUV_400 |
561*4882a593Smuzhiyun                                                  IM_RGA_SUPPORT_FORMAT_Y4;
562*4882a593Smuzhiyun                     merge_table.feature |= IM_RGA_SUPPORT_FEATURE_QUANTIZE |
563*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC |
564*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC |
565*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_MOSAIC |
566*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_OSD |
567*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_PRE_INTR;
568*4882a593Smuzhiyun                     break;
569*4882a593Smuzhiyun                 default :
570*4882a593Smuzhiyun                     goto TRY_TO_COMPATIBLE;
571*4882a593Smuzhiyun             }
572*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 3 &&
573*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 6) {
574*4882a593Smuzhiyun             switch (rgaCtx->mHwVersions.version[i].revision) {
575*4882a593Smuzhiyun                 case 0x92812:
576*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
577*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun                     merge_table.input_format |= IM_RGA_SUPPORT_FORMAT_YUYV_422 |
580*4882a593Smuzhiyun                                                 IM_RGA_SUPPORT_FORMAT_YUV_400 |
581*4882a593Smuzhiyun                                                 IM_RGA_SUPPORT_FORMAT_RGBA2BPP;
582*4882a593Smuzhiyun                     merge_table.output_format |= IM_RGA_SUPPORT_FORMAT_YUV_400 |
583*4882a593Smuzhiyun                                                  IM_RGA_SUPPORT_FORMAT_Y4;
584*4882a593Smuzhiyun                     merge_table.feature |= IM_RGA_SUPPORT_FEATURE_QUANTIZE |
585*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC |
586*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC |
587*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_MOSAIC |
588*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_OSD |
589*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_PRE_INTR;
590*4882a593Smuzhiyun                     break;
591*4882a593Smuzhiyun                 default :
592*4882a593Smuzhiyun                     goto TRY_TO_COMPATIBLE;
593*4882a593Smuzhiyun                 }
594*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 3 &&
595*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 7) {
596*4882a593Smuzhiyun             switch (rgaCtx->mHwVersions.version[i].revision) {
597*4882a593Smuzhiyun                 case 0x93215:
598*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
599*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun                     merge_table.input_format |= IM_RGA_SUPPORT_FORMAT_YUYV_422 |
602*4882a593Smuzhiyun                                                 IM_RGA_SUPPORT_FORMAT_YUV_400 |
603*4882a593Smuzhiyun                                                 IM_RGA_SUPPORT_FORMAT_RGBA2BPP;
604*4882a593Smuzhiyun                     merge_table.output_format |= IM_RGA_SUPPORT_FORMAT_YUV_400 |
605*4882a593Smuzhiyun                                                  IM_RGA_SUPPORT_FORMAT_Y4;
606*4882a593Smuzhiyun                     merge_table.feature |= IM_RGA_SUPPORT_FEATURE_QUANTIZE |
607*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC |
608*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC |
609*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_MOSAIC |
610*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_OSD |
611*4882a593Smuzhiyun                                            IM_RGA_SUPPORT_FEATURE_PRE_INTR;
612*4882a593Smuzhiyun                     break;
613*4882a593Smuzhiyun                 default :
614*4882a593Smuzhiyun                     goto TRY_TO_COMPATIBLE;
615*4882a593Smuzhiyun             }
616*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 4 &&
617*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 0) {
618*4882a593Smuzhiyun             switch (rgaCtx->mHwVersions.version[i].revision) {
619*4882a593Smuzhiyun                 case 0x18632 :
620*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_LITE0_INDEX;
621*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
622*4882a593Smuzhiyun                     break;
623*4882a593Smuzhiyun                 case 0x23998 :
624*4882a593Smuzhiyun                 case 0x28610 :
625*4882a593Smuzhiyun                     rga_version = IM_RGA_HW_VERSION_RGA_2_LITE1_INDEX;
626*4882a593Smuzhiyun                     memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun                     merge_table.feature |= IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC;
629*4882a593Smuzhiyun                     break;
630*4882a593Smuzhiyun                 default :
631*4882a593Smuzhiyun                     goto TRY_TO_COMPATIBLE;
632*4882a593Smuzhiyun             }
633*4882a593Smuzhiyun         } else if (rgaCtx->mHwVersions.version[i].major == 42 &&
634*4882a593Smuzhiyun                    rgaCtx->mHwVersions.version[i].minor == 0) {
635*4882a593Smuzhiyun             if (rgaCtx->mHwVersions.version[i].revision == 0x17760) {
636*4882a593Smuzhiyun                 rga_version = IM_RGA_HW_VERSION_RGA_2_LITE1_INDEX;
637*4882a593Smuzhiyun                 memcpy(&merge_table, &hw_info_table[rga_version], sizeof(merge_table));
638*4882a593Smuzhiyun             } else {
639*4882a593Smuzhiyun                 goto TRY_TO_COMPATIBLE;
640*4882a593Smuzhiyun             }
641*4882a593Smuzhiyun         } else {
642*4882a593Smuzhiyun             goto TRY_TO_COMPATIBLE;
643*4882a593Smuzhiyun         }
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun         rga_support_info_merge_table(return_table, &merge_table);
646*4882a593Smuzhiyun     }
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun TRY_TO_COMPATIBLE:
651*4882a593Smuzhiyun     if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "1.3", 3) == 0)
652*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_1_INDEX;
653*4882a593Smuzhiyun     else if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "1.6", 3) == 0)
654*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_1_PLUS_INDEX;
655*4882a593Smuzhiyun     /*3288 vesion is 2.00*/
656*4882a593Smuzhiyun     else if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "2.00", 4) == 0)
657*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_2_INDEX;
658*4882a593Smuzhiyun     /*3288w version is 3.00*/
659*4882a593Smuzhiyun     else if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "3.00", 4) == 0)
660*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_2_INDEX;
661*4882a593Smuzhiyun     else if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "3.02", 4) == 0)
662*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_2_ENHANCE_INDEX;
663*4882a593Smuzhiyun     else if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "4.00", 4) == 0)
664*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_2_LITE0_INDEX;
665*4882a593Smuzhiyun     /*The version number of lite1 cannot be obtained temporarily.*/
666*4882a593Smuzhiyun     else if (strncmp((char *)rgaCtx->mHwVersions.version[0].str, "4.00", 4) == 0)
667*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_2_LITE1_INDEX;
668*4882a593Smuzhiyun     else
669*4882a593Smuzhiyun         rga_version = IM_RGA_HW_VERSION_RGA_V_ERR_INDEX;
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun     memcpy(return_table, &hw_info_table[rga_version], sizeof(rga_info_table_entry));
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun     if (rga_version == IM_RGA_HW_VERSION_RGA_V_ERR_INDEX) {
674*4882a593Smuzhiyun         IM_LOGE("Can not get the correct RGA version, please check the driver, version=%s\n",
675*4882a593Smuzhiyun                 rgaCtx->mHwVersions.version[0].str);
676*4882a593Smuzhiyun         return IM_STATUS_FAILED;
677*4882a593Smuzhiyun     }
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
680*4882a593Smuzhiyun }
681*4882a593Smuzhiyun 
rga_check_header(rga_version_t header_version)682*4882a593Smuzhiyun IM_STATUS rga_check_header(rga_version_t header_version) {
683*4882a593Smuzhiyun     int ret;
684*4882a593Smuzhiyun     int table_size = sizeof(user_header_bind_table) / sizeof(rga_version_bind_table_entry_t);
685*4882a593Smuzhiyun     rga_version_t user_version = RGA_SET_CURRENT_API_VERSION;
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun     ret = rga_version_check(user_version, header_version,
688*4882a593Smuzhiyun                             user_header_bind_table, table_size,
689*4882a593Smuzhiyun                             &rga_version_check_user_header_ops);
690*4882a593Smuzhiyun     switch (ret) {
691*4882a593Smuzhiyun         case 0:
692*4882a593Smuzhiyun             return IM_STATUS_SUCCESS;
693*4882a593Smuzhiyun         case 1:
694*4882a593Smuzhiyun         case -1:
695*4882a593Smuzhiyun         default:
696*4882a593Smuzhiyun             return IM_STATUS_ERROR_VERSION;
697*4882a593Smuzhiyun     }
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun 
rga_check_driver(rga_version_t & driver_version)700*4882a593Smuzhiyun IM_STATUS rga_check_driver(rga_version_t &driver_version) {
701*4882a593Smuzhiyun     int ret;
702*4882a593Smuzhiyun     int table_size = sizeof(user_driver_bind_table) / sizeof(rga_version_bind_table_entry_t);
703*4882a593Smuzhiyun     rga_version_t user_version = RGA_SET_CURRENT_API_VERSION;
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun     ret =  rga_version_check(user_version, driver_version,
706*4882a593Smuzhiyun                              user_driver_bind_table, table_size,
707*4882a593Smuzhiyun                              &rga_version_check_user_driver_ops);
708*4882a593Smuzhiyun     switch (ret) {
709*4882a593Smuzhiyun         case 0:
710*4882a593Smuzhiyun         case -1:
711*4882a593Smuzhiyun             return IM_STATUS_SUCCESS;
712*4882a593Smuzhiyun         case 1:
713*4882a593Smuzhiyun         default:
714*4882a593Smuzhiyun             return IM_STATUS_ERROR_VERSION;
715*4882a593Smuzhiyun     }
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun 
rga_check_info(const char * name,const rga_buffer_t info,const im_rect rect,int resolution_usage)718*4882a593Smuzhiyun IM_STATUS rga_check_info(const char *name, const rga_buffer_t info, const im_rect rect, int resolution_usage) {
719*4882a593Smuzhiyun     /**************** src/dst judgment ****************/
720*4882a593Smuzhiyun     if (info.width <= 0 || info.height <= 0 || info.format < 0) {
721*4882a593Smuzhiyun         IM_LOGW("Illegal %s, the parameter cannot be negative or 0, width = %d, height = %d, format = 0x%x(%s)",
722*4882a593Smuzhiyun                 name, info.width, info.height, info.format, translate_format_str(info.format));
723*4882a593Smuzhiyun         return IM_STATUS_ILLEGAL_PARAM;
724*4882a593Smuzhiyun     }
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun     if (info.width < 2 || info.height < 2) {
727*4882a593Smuzhiyun         IM_LOGW("Hardware limitation %s, unsupported operation of images smaller than 2 pixels, "
728*4882a593Smuzhiyun                 "width = %d, height = %d",
729*4882a593Smuzhiyun                 name, info.width, info.height);
730*4882a593Smuzhiyun         return IM_STATUS_ILLEGAL_PARAM;
731*4882a593Smuzhiyun     }
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun     if (info.wstride < info.width || info.hstride < info.height) {
734*4882a593Smuzhiyun         IM_LOGW("Invaild %s, Virtual width or height is less than actual width and height, "
735*4882a593Smuzhiyun                 "wstride = %d, width = %d, hstride = %d, height = %d",
736*4882a593Smuzhiyun                 name, info.wstride, info.width, info.hstride, info.height);
737*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
738*4882a593Smuzhiyun     }
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun     /**************** rect judgment ****************/
741*4882a593Smuzhiyun     if (rect.width < 0 || rect.height < 0 || rect.x < 0 || rect.y < 0) {
742*4882a593Smuzhiyun         IM_LOGW("Illegal %s rect, the parameter cannot be negative, rect[x,y,w,h] = [%d, %d, %d, %d]",
743*4882a593Smuzhiyun                 name, rect.x, rect.y, rect.width, rect.height);
744*4882a593Smuzhiyun         return IM_STATUS_ILLEGAL_PARAM;
745*4882a593Smuzhiyun     }
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun     if ((rect.width > 0  && rect.width < 2) || (rect.height > 0 && rect.height < 2) ||
748*4882a593Smuzhiyun         (rect.x > 0 && rect.x < 2)          || (rect.y > 0 && rect.y < 2)) {
749*4882a593Smuzhiyun         IM_LOGW("Hardware limitation %s rect, unsupported operation of images smaller than 2 pixels, "
750*4882a593Smuzhiyun                 "rect[x,y,w,h] = [%d, %d, %d, %d]",
751*4882a593Smuzhiyun                 name, rect.x, rect.y, rect.width, rect.height);
752*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
753*4882a593Smuzhiyun     }
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun     if ((rect.width + rect.x > info.wstride) || (rect.height + rect.y > info.hstride)) {
756*4882a593Smuzhiyun         IM_LOGW("Invaild %s rect, the sum of width and height of rect needs to be less than wstride or hstride, "
757*4882a593Smuzhiyun                 "rect[x,y,w,h] = [%d, %d, %d, %d], wstride = %d, hstride = %d",
758*4882a593Smuzhiyun                 name, rect.x, rect.y, rect.width, rect.height, info.wstride, info.hstride);
759*4882a593Smuzhiyun         return IM_STATUS_INVALID_PARAM;
760*4882a593Smuzhiyun     }
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun     /**************** resolution check ****************/
763*4882a593Smuzhiyun     if (info.width > resolution_usage ||
764*4882a593Smuzhiyun         info.height > resolution_usage) {
765*4882a593Smuzhiyun         IM_LOGW("Unsupported %s to input resolution more than %d, width = %d, height = %d",
766*4882a593Smuzhiyun                 name, resolution_usage, info.width, info.height);
767*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
768*4882a593Smuzhiyun     } else if ((rect.width > 0 && rect.width > resolution_usage) ||
769*4882a593Smuzhiyun                (rect.height > 0 && rect.height > resolution_usage)) {
770*4882a593Smuzhiyun         IM_LOGW("Unsupported %s rect to output resolution more than %d, rect[x,y,w,h] = [%d, %d, %d, %d]",
771*4882a593Smuzhiyun                 name, resolution_usage, rect.x, rect.y, rect.width, rect.height);
772*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
773*4882a593Smuzhiyun     }
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
776*4882a593Smuzhiyun }
777*4882a593Smuzhiyun 
rga_check_limit(rga_buffer_t src,rga_buffer_t dst,int scale_usage,int mode_usage)778*4882a593Smuzhiyun IM_STATUS rga_check_limit(rga_buffer_t src, rga_buffer_t dst, int scale_usage, int mode_usage) {
779*4882a593Smuzhiyun     int src_width = 0, src_height = 0;
780*4882a593Smuzhiyun     int dst_width = 0, dst_height = 0;
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun     src_width = src.width;
783*4882a593Smuzhiyun     src_height = src.height;
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun     if (mode_usage & IM_HAL_TRANSFORM_ROT_270 || mode_usage & IM_HAL_TRANSFORM_ROT_90) {
786*4882a593Smuzhiyun         dst_width = dst.height;
787*4882a593Smuzhiyun         dst_height = dst.width;
788*4882a593Smuzhiyun     } else {
789*4882a593Smuzhiyun         dst_width = dst.width;
790*4882a593Smuzhiyun         dst_height = dst.height;
791*4882a593Smuzhiyun     }
792*4882a593Smuzhiyun     if (((src_width >> (int)(log(scale_usage)/log(2))) > dst_width) ||
793*4882a593Smuzhiyun        ((src_height >> (int)(log(scale_usage)/log(2))) > dst_height)) {
794*4882a593Smuzhiyun         IM_LOGW("Unsupported to scaling less than 1/%d ~ %d times, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
795*4882a593Smuzhiyun                 scale_usage, scale_usage, src.width, src.height, dst.width, dst.height);
796*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
797*4882a593Smuzhiyun     }
798*4882a593Smuzhiyun     if (((dst_width >> (int)(log(scale_usage)/log(2))) > src_width) ||
799*4882a593Smuzhiyun        ((dst_height >> (int)(log(scale_usage)/log(2))) > src_height)) {
800*4882a593Smuzhiyun         IM_LOGW("Unsupported to scaling more than 1/%d ~ %d times, src[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
801*4882a593Smuzhiyun                 scale_usage, scale_usage, src.width, src.height, dst.width, dst.height);
802*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
803*4882a593Smuzhiyun     }
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun 
rga_check_format(const char * name,rga_buffer_t info,im_rect rect,int format_usage,int mode_usgae)808*4882a593Smuzhiyun IM_STATUS rga_check_format(const char *name, rga_buffer_t info, im_rect rect, int format_usage, int mode_usgae) {
809*4882a593Smuzhiyun     IM_STATUS ret;
810*4882a593Smuzhiyun     int format = info.format;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun     if (format == RK_FORMAT_RGBA_8888 || format == RK_FORMAT_BGRA_8888 ||
813*4882a593Smuzhiyun         format == RK_FORMAT_RGBX_8888 || format == RK_FORMAT_BGRX_8888 ||
814*4882a593Smuzhiyun         format == RK_FORMAT_ARGB_8888 || format == RK_FORMAT_ABGR_8888 ||
815*4882a593Smuzhiyun         format == RK_FORMAT_XRGB_8888 || format == RK_FORMAT_XBGR_8888 ||
816*4882a593Smuzhiyun         format == RK_FORMAT_RGB_888   || format == RK_FORMAT_BGR_888   ||
817*4882a593Smuzhiyun         format == RK_FORMAT_RGB_565   || format == RK_FORMAT_BGR_565) {
818*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_RGB) {
819*4882a593Smuzhiyun             IM_LOGW("%s unsupported RGB format, format = 0x%x(%s)\n%s",
820*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
821*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
822*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
823*4882a593Smuzhiyun         }
824*4882a593Smuzhiyun     } else if (format == RK_FORMAT_RGBA_4444 || format == RK_FORMAT_BGRA_4444 ||
825*4882a593Smuzhiyun                format == RK_FORMAT_RGBA_5551 || format == RK_FORMAT_BGRA_5551 ||
826*4882a593Smuzhiyun                format == RK_FORMAT_ARGB_4444 || format == RK_FORMAT_ABGR_4444 ||
827*4882a593Smuzhiyun                format == RK_FORMAT_ARGB_5551 || format == RK_FORMAT_ABGR_5551) {
828*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_RGB_OTHER) {
829*4882a593Smuzhiyun             IM_LOGW("%s unsupported RGBA 4444/5551 format, format = 0x%x(%s)\n%s",
830*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
831*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
832*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
833*4882a593Smuzhiyun         }
834*4882a593Smuzhiyun     } else if (format == RK_FORMAT_BPP1 || format == RK_FORMAT_BPP2 ||
835*4882a593Smuzhiyun                format == RK_FORMAT_BPP4 || format == RK_FORMAT_BPP8) {
836*4882a593Smuzhiyun         if ((~format_usage & IM_RGA_SUPPORT_FORMAT_BPP) && !(mode_usgae & IM_COLOR_PALETTE)) {
837*4882a593Smuzhiyun             IM_LOGW("%s unsupported BPP format, format = 0x%x(%s)\n%s",
838*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
839*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
840*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
841*4882a593Smuzhiyun         }
842*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCrCb_420_SP || format == RK_FORMAT_YCbCr_420_SP) {
843*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_8_BIT) {
844*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV420 semi-planner 8bit format, format = 0x%x(%s)\n%s",
845*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
846*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
847*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
848*4882a593Smuzhiyun         }
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
851*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
852*4882a593Smuzhiyun             return ret;
853*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCrCb_420_P  || format == RK_FORMAT_YCbCr_420_P) {
854*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_420_PLANNER_8_BIT) {
855*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV420 planner 8bit format, format = 0x%x(%s)\n%s",
856*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
857*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
858*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
859*4882a593Smuzhiyun         }
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
862*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
863*4882a593Smuzhiyun             return ret;
864*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCrCb_422_SP || format == RK_FORMAT_YCbCr_422_SP) {
865*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_8_BIT) {
866*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV422 semi-planner 8bit format, format = 0x%x(%s)\n%s",
867*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
868*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
869*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
870*4882a593Smuzhiyun         }
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
873*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
874*4882a593Smuzhiyun             return ret;
875*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCrCb_422_P  || format == RK_FORMAT_YCbCr_422_P) {
876*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_422_PLANNER_8_BIT) {
877*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV422 planner 8bit format, format = 0x%x(%s)\n%s",
878*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
879*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
880*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
881*4882a593Smuzhiyun         }
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
884*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
885*4882a593Smuzhiyun             return ret;
886*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCrCb_420_SP_10B || format == RK_FORMAT_YCbCr_420_SP_10B) {
887*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_420_SEMI_PLANNER_10_BIT) {
888*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV420 semi-planner 10bit format, format = 0x%x(%s)\n%s",
889*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
890*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
891*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
892*4882a593Smuzhiyun         }
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
895*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
896*4882a593Smuzhiyun             return ret;
897*4882a593Smuzhiyun         IM_LOGW("If it is an RK encoder output, it needs to be aligned with an odd multiple of 256.\n");
898*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCrCb_422_10b_SP || format == RK_FORMAT_YCbCr_422_10b_SP) {
899*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_422_SEMI_PLANNER_10_BIT) {
900*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV422 semi-planner 10bit format, format = 0x%x(%s)\n%s",
901*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
902*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
903*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
904*4882a593Smuzhiyun         }
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
907*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
908*4882a593Smuzhiyun             return ret;
909*4882a593Smuzhiyun         IM_LOGW("If it is an RK encoder output, it needs to be aligned with an odd multiple of 256.\n");
910*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YUYV_420 || format == RK_FORMAT_YVYU_420 ||
911*4882a593Smuzhiyun                format == RK_FORMAT_UYVY_420 || format == RK_FORMAT_VYUY_420) {
912*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUYV_420) {
913*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUYV format, format = 0x%x(%s)\n%s",
914*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
915*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
916*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
917*4882a593Smuzhiyun         }
918*4882a593Smuzhiyun 
919*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
920*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
921*4882a593Smuzhiyun             return ret;
922*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YUYV_422 || format == RK_FORMAT_YVYU_422 ||
923*4882a593Smuzhiyun                format == RK_FORMAT_UYVY_422 || format == RK_FORMAT_VYUY_422) {
924*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUYV_422) {
925*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUYV format, format = 0x%x(%s)\n%s",
926*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
927*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
928*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
929*4882a593Smuzhiyun         }
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
932*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
933*4882a593Smuzhiyun             return ret;
934*4882a593Smuzhiyun     } else if (format == RK_FORMAT_YCbCr_400) {
935*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_YUV_400) {
936*4882a593Smuzhiyun             IM_LOGW("%s unsupported YUV400 format, format = 0x%x(%s)\n%s",
937*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
938*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
939*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
940*4882a593Smuzhiyun         }
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
943*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
944*4882a593Smuzhiyun             return ret;
945*4882a593Smuzhiyun     } else if (format == RK_FORMAT_Y4) {
946*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_Y4) {
947*4882a593Smuzhiyun             IM_LOGW("%s unsupported Y4/Y1 format, format = 0x%x(%s)\n%s",
948*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
949*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
950*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
951*4882a593Smuzhiyun         }
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun         ret = rga_yuv_legality_check(name, info, rect);
954*4882a593Smuzhiyun         if (ret != IM_STATUS_SUCCESS)
955*4882a593Smuzhiyun             return ret;
956*4882a593Smuzhiyun     } else if (format == RK_FORMAT_RGBA2BPP) {
957*4882a593Smuzhiyun         if (~format_usage & IM_RGA_SUPPORT_FORMAT_RGBA2BPP) {
958*4882a593Smuzhiyun             IM_LOGW("%s unsupported rgba2bpp format, format = 0x%x(%s)\n%s",
959*4882a593Smuzhiyun                     name, info.format, translate_format_str(info.format),
960*4882a593Smuzhiyun                     querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
961*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
962*4882a593Smuzhiyun         }
963*4882a593Smuzhiyun     } else {
964*4882a593Smuzhiyun         IM_LOGW("%s unsupported this format, format = 0x%x(%s)\n%s",
965*4882a593Smuzhiyun                 name, info.format, translate_format_str(info.format),
966*4882a593Smuzhiyun                 querystring((strcmp("dst", name) == 0) ? RGA_OUTPUT_FORMAT : RGA_INPUT_FORMAT));
967*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
968*4882a593Smuzhiyun     }
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
971*4882a593Smuzhiyun }
972*4882a593Smuzhiyun 
rga_check_align(const char * name,rga_buffer_t info,int byte_stride,bool is_read)973*4882a593Smuzhiyun IM_STATUS rga_check_align(const char *name, rga_buffer_t info, int byte_stride, bool is_read) {
974*4882a593Smuzhiyun     int bpp = 0;
975*4882a593Smuzhiyun     int bit_stride, pixel_stride, align, gcd;
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun     /* data mode align */
978*4882a593Smuzhiyun     switch (info.rd_mode) {
979*4882a593Smuzhiyun         case IM_FBC_MODE:
980*4882a593Smuzhiyun             if (info.wstride % 16) {
981*4882a593Smuzhiyun                 IM_LOGE("%s FBC mode does not support width_stride[%d] is non-16 aligned\n",
982*4882a593Smuzhiyun                         name, info.width);
983*4882a593Smuzhiyun                 return IM_STATUS_NOT_SUPPORTED;
984*4882a593Smuzhiyun             }
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun             if (info.hstride % 16) {
987*4882a593Smuzhiyun                 IM_LOGE("%s FBC mode does not support height_stride[%d] is non-16 aligned\n",
988*4882a593Smuzhiyun                         name, info.height);
989*4882a593Smuzhiyun                 return IM_STATUS_NOT_SUPPORTED;
990*4882a593Smuzhiyun             }
991*4882a593Smuzhiyun             break;
992*4882a593Smuzhiyun         case IM_TILE_MODE:
993*4882a593Smuzhiyun             if (info.width % 8) {
994*4882a593Smuzhiyun                 IM_LOGE("%s TILE8*8 mode does not support width[%d] is non-8 aligned\n",
995*4882a593Smuzhiyun                         name, info.width);
996*4882a593Smuzhiyun                 return IM_STATUS_NOT_SUPPORTED;
997*4882a593Smuzhiyun             }
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun             if (info.height % 8) {
1000*4882a593Smuzhiyun                 IM_LOGE("%s TILE8*8 mode does not support height[%d] is non-8 aligned\n",
1001*4882a593Smuzhiyun                         name, info.height);
1002*4882a593Smuzhiyun                 return IM_STATUS_NOT_SUPPORTED;
1003*4882a593Smuzhiyun             }
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun             if (is_read) {
1006*4882a593Smuzhiyun                 if (info.wstride % 16) {
1007*4882a593Smuzhiyun                     IM_LOGE("%s TILE8*8 mode does not support input width_stride[%d] is non-16 aligned\n",
1008*4882a593Smuzhiyun                             name, info.wstride);
1009*4882a593Smuzhiyun                     return IM_STATUS_NOT_SUPPORTED;
1010*4882a593Smuzhiyun                 }
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun                 if (info.hstride % 16) {
1013*4882a593Smuzhiyun                     IM_LOGE("%s TILE8*8 mode does not support input height_stride[%d] is non-16 aligned\n",
1014*4882a593Smuzhiyun                             name, info.hstride);
1015*4882a593Smuzhiyun                     return IM_STATUS_NOT_SUPPORTED;
1016*4882a593Smuzhiyun                 }
1017*4882a593Smuzhiyun             }
1018*4882a593Smuzhiyun             break;
1019*4882a593Smuzhiyun         default:
1020*4882a593Smuzhiyun             break;
1021*4882a593Smuzhiyun     }
1022*4882a593Smuzhiyun 
1023*4882a593Smuzhiyun     pixel_stride = get_perPixel_stride_from_format(info.format);
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun     bit_stride = pixel_stride * info.wstride;
1026*4882a593Smuzhiyun     if (bit_stride % (byte_stride * 8) == 0) {
1027*4882a593Smuzhiyun         return IM_STATUS_NOERROR;
1028*4882a593Smuzhiyun     } else {
1029*4882a593Smuzhiyun         gcd = GET_GCD(pixel_stride, byte_stride * 8);
1030*4882a593Smuzhiyun         align = GET_LCM(pixel_stride, byte_stride * 8, gcd) / pixel_stride;
1031*4882a593Smuzhiyun         IM_LOGW("%s unsupport width stride %d, %s width stride should be %d aligned!",
1032*4882a593Smuzhiyun                 name, info.wstride, translate_format_str(info.format), align);
1033*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1034*4882a593Smuzhiyun     }
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
1037*4882a593Smuzhiyun }
1038*4882a593Smuzhiyun 
rga_check_blend(rga_buffer_t src,rga_buffer_t pat,rga_buffer_t dst,int pat_enable,int mode_usage)1039*4882a593Smuzhiyun IM_STATUS rga_check_blend(rga_buffer_t src, rga_buffer_t pat, rga_buffer_t dst, int pat_enable, int mode_usage) {
1040*4882a593Smuzhiyun     int src_fmt, pat_fmt, dst_fmt;
1041*4882a593Smuzhiyun     bool src_isRGB, pat_isRGB, dst_isRGB;
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun     src_fmt = src.format;
1044*4882a593Smuzhiyun     pat_fmt = pat.format;
1045*4882a593Smuzhiyun     dst_fmt = dst.format;
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun     src_isRGB = NormalRgaIsRgbFormat(src_fmt);
1048*4882a593Smuzhiyun     pat_isRGB = NormalRgaIsRgbFormat(pat_fmt);
1049*4882a593Smuzhiyun     dst_isRGB = NormalRgaIsRgbFormat(dst_fmt);
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun     /**************** blend mode check ****************/
1052*4882a593Smuzhiyun     switch (mode_usage & IM_ALPHA_BLEND_MASK) {
1053*4882a593Smuzhiyun         case IM_ALPHA_BLEND_SRC :
1054*4882a593Smuzhiyun         case IM_ALPHA_BLEND_DST :
1055*4882a593Smuzhiyun             break;
1056*4882a593Smuzhiyun         case IM_ALPHA_BLEND_SRC_OVER :
1057*4882a593Smuzhiyun             if (!NormalRgaFormatHasAlpha(src_fmt)) {
1058*4882a593Smuzhiyun                 IM_LOGW("Blend mode 'src_over' unsupported src format without alpha, "
1059*4882a593Smuzhiyun                         "format[src,src1,dst] = [0x%x(%s), 0x%x(%s), 0x%x(%s)]",
1060*4882a593Smuzhiyun                         src_fmt, translate_format_str(src_fmt),
1061*4882a593Smuzhiyun                         pat_fmt, translate_format_str(pat_fmt),
1062*4882a593Smuzhiyun                         dst_fmt, translate_format_str(dst_fmt));
1063*4882a593Smuzhiyun                 return IM_STATUS_NOT_SUPPORTED;
1064*4882a593Smuzhiyun             }
1065*4882a593Smuzhiyun             break;
1066*4882a593Smuzhiyun         case IM_ALPHA_BLEND_DST_OVER :
1067*4882a593Smuzhiyun             if (pat_enable) {
1068*4882a593Smuzhiyun                 if (!NormalRgaFormatHasAlpha(pat_fmt)) {
1069*4882a593Smuzhiyun                     IM_LOGW("Blend mode 'dst_over' unsupported pat format without alpha, "
1070*4882a593Smuzhiyun                             "format[src,src1,dst] = [0x%x(%s), 0x%x(%s), 0x%x(%s)]",
1071*4882a593Smuzhiyun                             src_fmt, translate_format_str(src_fmt),
1072*4882a593Smuzhiyun                             pat_fmt, translate_format_str(pat_fmt),
1073*4882a593Smuzhiyun                             dst_fmt, translate_format_str(dst_fmt));
1074*4882a593Smuzhiyun                     return IM_STATUS_NOT_SUPPORTED;
1075*4882a593Smuzhiyun                 }
1076*4882a593Smuzhiyun             } else {
1077*4882a593Smuzhiyun                 if (!NormalRgaFormatHasAlpha(dst_fmt)) {
1078*4882a593Smuzhiyun                     IM_LOGW("Blend mode 'dst_over' unsupported dst format without alpha, "
1079*4882a593Smuzhiyun                             "format[src,src1,dst] = [0x%x(%s), 0x%x(%s), 0x%x(%s)]",
1080*4882a593Smuzhiyun                             src_fmt, translate_format_str(src_fmt),
1081*4882a593Smuzhiyun                             pat_fmt, translate_format_str(pat_fmt),
1082*4882a593Smuzhiyun                             dst_fmt, translate_format_str(dst_fmt));
1083*4882a593Smuzhiyun                     return IM_STATUS_NOT_SUPPORTED;
1084*4882a593Smuzhiyun                 }
1085*4882a593Smuzhiyun             }
1086*4882a593Smuzhiyun             break;
1087*4882a593Smuzhiyun         default :
1088*4882a593Smuzhiyun             if (!(NormalRgaFormatHasAlpha(src_fmt) || NormalRgaFormatHasAlpha(dst_fmt))) {
1089*4882a593Smuzhiyun                 IM_LOGW("Blend mode unsupported format without alpha, "
1090*4882a593Smuzhiyun                         "format[src,src1,dst] = [0x%x(%s), 0x%x(%s), 0x%x(%s)]",
1091*4882a593Smuzhiyun                         src_fmt, translate_format_str(src_fmt),
1092*4882a593Smuzhiyun                         pat_fmt, translate_format_str(pat_fmt),
1093*4882a593Smuzhiyun                         dst_fmt, translate_format_str(dst_fmt));
1094*4882a593Smuzhiyun                 return IM_STATUS_NOT_SUPPORTED;
1095*4882a593Smuzhiyun             }
1096*4882a593Smuzhiyun             break;
1097*4882a593Smuzhiyun     }
1098*4882a593Smuzhiyun 
1099*4882a593Smuzhiyun     /* src1 don't support scale, and src1's size must aqual to dst.' */
1100*4882a593Smuzhiyun     if (pat_enable && (pat.width != dst.width || pat.height != dst.height)) {
1101*4882a593Smuzhiyun         IM_LOGW("In the three-channel mode Alapha blend, the width and height of the src1 channel "
1102*4882a593Smuzhiyun                 "must be equal to the dst channel, src1[w,h] = [%d, %d], dst[w,h] = [%d, %d]",
1103*4882a593Smuzhiyun                 pat.width, pat.height, dst.width, dst.height);
1104*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1105*4882a593Smuzhiyun     }
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
1108*4882a593Smuzhiyun }
1109*4882a593Smuzhiyun 
rga_check_rotate(int mode_usage,rga_info_table_entry & table)1110*4882a593Smuzhiyun IM_STATUS rga_check_rotate(int mode_usage, rga_info_table_entry &table) {
1111*4882a593Smuzhiyun     if (table.version & (IM_RGA_HW_VERSION_RGA_1 | IM_RGA_HW_VERSION_RGA_1_PLUS)) {
1112*4882a593Smuzhiyun         if (mode_usage & IM_HAL_TRANSFORM_FLIP_H_V) {
1113*4882a593Smuzhiyun             IM_LOGW("RGA1/RGA1_PLUS cannot support H_V mirror.");
1114*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
1115*4882a593Smuzhiyun         }
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun         if ((mode_usage & (IM_HAL_TRANSFORM_ROT_90 + IM_HAL_TRANSFORM_ROT_180 + IM_HAL_TRANSFORM_ROT_270)) &&
1118*4882a593Smuzhiyun             (mode_usage & (IM_HAL_TRANSFORM_FLIP_H + IM_HAL_TRANSFORM_FLIP_V + IM_HAL_TRANSFORM_FLIP_H_V))) {
1119*4882a593Smuzhiyun             IM_LOGW("RGA1/RGA1_PLUS cannot support rotate with mirror.");
1120*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
1121*4882a593Smuzhiyun         }
1122*4882a593Smuzhiyun     }
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
1125*4882a593Smuzhiyun }
1126*4882a593Smuzhiyun 
rga_check_feature(rga_buffer_t src,rga_buffer_t pat,rga_buffer_t dst,int pat_enable,int mode_usage,int feature_usage)1127*4882a593Smuzhiyun IM_STATUS rga_check_feature(rga_buffer_t src, rga_buffer_t pat, rga_buffer_t dst,
1128*4882a593Smuzhiyun                                    int pat_enable, int mode_usage, int feature_usage) {
1129*4882a593Smuzhiyun     if ((mode_usage & IM_COLOR_FILL) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_COLOR_FILL)) {
1130*4882a593Smuzhiyun         IM_LOGW("The platform does not support color fill featrue. \n%s",
1131*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1132*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1133*4882a593Smuzhiyun     }
1134*4882a593Smuzhiyun 
1135*4882a593Smuzhiyun     if ((mode_usage & IM_COLOR_PALETTE) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE)) {
1136*4882a593Smuzhiyun         IM_LOGW("The platform does not support color palette featrue. \n%s",
1137*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1138*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1139*4882a593Smuzhiyun     }
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun     if ((mode_usage & IM_ROP) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_ROP)) {
1142*4882a593Smuzhiyun         IM_LOGW("The platform does not support ROP featrue. \n%s",
1143*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1144*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1145*4882a593Smuzhiyun     }
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun     if ((mode_usage & IM_NN_QUANTIZE) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_QUANTIZE)) {
1148*4882a593Smuzhiyun         IM_LOGW("The platform does not support quantize featrue. \n%s",
1149*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1150*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1151*4882a593Smuzhiyun     }
1152*4882a593Smuzhiyun 
1153*4882a593Smuzhiyun     if ((pat_enable ? (pat.color_space_mode & IM_RGB_TO_YUV_MASK) : 0) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC)) {
1154*4882a593Smuzhiyun         IM_LOGW("The platform does not support src1 channel RGB2YUV color space convert featrue. \n%s",
1155*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1156*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1157*4882a593Smuzhiyun     }
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun     if ((src.color_space_mode & IM_FULL_CSC_MASK ||
1160*4882a593Smuzhiyun         dst.color_space_mode & IM_FULL_CSC_MASK ||
1161*4882a593Smuzhiyun         (pat_enable ? (pat.color_space_mode & IM_FULL_CSC_MASK) : 0)) &&
1162*4882a593Smuzhiyun         (~feature_usage & IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC)) {
1163*4882a593Smuzhiyun         IM_LOGW("The platform does not support dst channel full color space convert(Y2Y/Y2R) featrue. \n%s",
1164*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1165*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1166*4882a593Smuzhiyun     }
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun     if ((mode_usage & IM_MOSAIC) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_MOSAIC)) {
1169*4882a593Smuzhiyun         IM_LOGW("The platform does not support mosaic featrue. \n%s",
1170*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1171*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1172*4882a593Smuzhiyun     }
1173*4882a593Smuzhiyun 
1174*4882a593Smuzhiyun     if ((mode_usage & IM_OSD) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_OSD)) {
1175*4882a593Smuzhiyun         IM_LOGW("The platform does not support osd featrue. \n%s",
1176*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1177*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1178*4882a593Smuzhiyun     }
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun     if ((mode_usage & IM_PRE_INTR) && (~feature_usage & IM_RGA_SUPPORT_FEATURE_PRE_INTR)) {
1181*4882a593Smuzhiyun         IM_LOGW("The platform does not support pre_intr featrue. \n%s",
1182*4882a593Smuzhiyun                 querystring(RGA_FEATURE));
1183*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1184*4882a593Smuzhiyun     }
1185*4882a593Smuzhiyun 
1186*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
1187*4882a593Smuzhiyun }
1188*4882a593Smuzhiyun 
rga_check(const rga_buffer_t src,const rga_buffer_t dst,const rga_buffer_t pat,const im_rect src_rect,const im_rect dst_rect,const im_rect pat_rect,int mode_usage)1189*4882a593Smuzhiyun IM_STATUS rga_check(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
1190*4882a593Smuzhiyun                     const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect, int mode_usage) {
1191*4882a593Smuzhiyun     bool pat_enable = 0;
1192*4882a593Smuzhiyun     IM_STATUS ret = IM_STATUS_NOERROR;
1193*4882a593Smuzhiyun     rga_info_table_entry rga_info;
1194*4882a593Smuzhiyun 
1195*4882a593Smuzhiyun     memset(&rga_info, 0x0, sizeof(rga_info));
1196*4882a593Smuzhiyun     ret = rga_get_info(&rga_info);
1197*4882a593Smuzhiyun     if (IM_STATUS_FAILED == ret) {
1198*4882a593Smuzhiyun         IM_LOGE("rga im2d: rga2 get info failed!\n");
1199*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1200*4882a593Smuzhiyun     }
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun     if (mode_usage & IM_ALPHA_BLEND_MASK) {
1203*4882a593Smuzhiyun         if (rga_is_buffer_valid(pat))
1204*4882a593Smuzhiyun             pat_enable = 1;
1205*4882a593Smuzhiyun     }
1206*4882a593Smuzhiyun 
1207*4882a593Smuzhiyun     /**************** feature judgment ****************/
1208*4882a593Smuzhiyun     ret = rga_check_feature(src, pat, dst, pat_enable, mode_usage, rga_info.feature);
1209*4882a593Smuzhiyun     if (ret != IM_STATUS_NOERROR)
1210*4882a593Smuzhiyun         return ret;
1211*4882a593Smuzhiyun 
1212*4882a593Smuzhiyun     /**************** info judgment ****************/
1213*4882a593Smuzhiyun     if (~mode_usage & IM_COLOR_FILL) {
1214*4882a593Smuzhiyun         ret = rga_check_info("src", src, src_rect, rga_info.input_resolution);
1215*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1216*4882a593Smuzhiyun             return ret;
1217*4882a593Smuzhiyun         ret = rga_check_format("src", src, src_rect, rga_info.input_format, mode_usage);
1218*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1219*4882a593Smuzhiyun             return ret;
1220*4882a593Smuzhiyun         ret = rga_check_align("src", src, rga_info.byte_stride, true);
1221*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1222*4882a593Smuzhiyun             return ret;
1223*4882a593Smuzhiyun     }
1224*4882a593Smuzhiyun     if (pat_enable) {
1225*4882a593Smuzhiyun         /* RGA1 cannot support src1. */
1226*4882a593Smuzhiyun         if (rga_info.version & (IM_RGA_HW_VERSION_RGA_1 | IM_RGA_HW_VERSION_RGA_1_PLUS)) {
1227*4882a593Smuzhiyun             IM_LOGW("RGA1/RGA1_PLUS cannot support src1.");
1228*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
1229*4882a593Smuzhiyun         }
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun         ret = rga_check_info("pat", pat, pat_rect, rga_info.input_resolution);
1233*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1234*4882a593Smuzhiyun             return ret;
1235*4882a593Smuzhiyun         ret = rga_check_format("pat", pat, pat_rect, rga_info.input_format, mode_usage);
1236*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1237*4882a593Smuzhiyun             return ret;
1238*4882a593Smuzhiyun         ret = rga_check_align("pat", pat, rga_info.byte_stride, true);
1239*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1240*4882a593Smuzhiyun             return ret;
1241*4882a593Smuzhiyun     }
1242*4882a593Smuzhiyun     ret = rga_check_info("dst", dst, dst_rect, rga_info.output_resolution);
1243*4882a593Smuzhiyun     if (ret != IM_STATUS_NOERROR)
1244*4882a593Smuzhiyun         return ret;
1245*4882a593Smuzhiyun     ret = rga_check_format("dst", dst, dst_rect, rga_info.output_format, mode_usage);
1246*4882a593Smuzhiyun     if (ret != IM_STATUS_NOERROR)
1247*4882a593Smuzhiyun         return ret;
1248*4882a593Smuzhiyun     ret = rga_check_align("dst", dst, rga_info.byte_stride, false);
1249*4882a593Smuzhiyun     if (ret != IM_STATUS_NOERROR)
1250*4882a593Smuzhiyun         return ret;
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun     if ((~mode_usage & IM_COLOR_FILL)) {
1253*4882a593Smuzhiyun         ret = rga_check_limit(src, dst, rga_info.scale_limit, mode_usage);
1254*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1255*4882a593Smuzhiyun             return ret;
1256*4882a593Smuzhiyun     }
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun     if (mode_usage & IM_ALPHA_BLEND_MASK) {
1259*4882a593Smuzhiyun         ret = rga_check_blend(src, pat, dst, pat_enable, mode_usage);
1260*4882a593Smuzhiyun         if (ret != IM_STATUS_NOERROR)
1261*4882a593Smuzhiyun             return ret;
1262*4882a593Smuzhiyun     }
1263*4882a593Smuzhiyun 
1264*4882a593Smuzhiyun     ret = rga_check_rotate(mode_usage, rga_info);
1265*4882a593Smuzhiyun     if (ret != IM_STATUS_NOERROR)
1266*4882a593Smuzhiyun         return ret;
1267*4882a593Smuzhiyun 
1268*4882a593Smuzhiyun     return IM_STATUS_NOERROR;
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun 
rga_check_external(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect src_rect,im_rect dst_rect,im_rect pat_rect,int mode_usage)1271*4882a593Smuzhiyun IM_STATUS rga_check_external(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1272*4882a593Smuzhiyun                              im_rect src_rect, im_rect dst_rect, im_rect pat_rect,
1273*4882a593Smuzhiyun                              int mode_usage) {
1274*4882a593Smuzhiyun     int ret;
1275*4882a593Smuzhiyun     int format;
1276*4882a593Smuzhiyun 
1277*4882a593Smuzhiyun     if (mode_usage & IM_CROP) {
1278*4882a593Smuzhiyun         dst_rect.width = src_rect.width;
1279*4882a593Smuzhiyun         dst_rect.height = src_rect.height;
1280*4882a593Smuzhiyun     }
1281*4882a593Smuzhiyun 
1282*4882a593Smuzhiyun     rga_apply_rect(&src, &src_rect);
1283*4882a593Smuzhiyun     format = convert_to_rga_format(src.format);
1284*4882a593Smuzhiyun     if (format == RK_FORMAT_UNKNOWN) {
1285*4882a593Smuzhiyun         IM_LOGW("Invaild src format [0x%x]!\n", src.format);
1286*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1287*4882a593Smuzhiyun     }
1288*4882a593Smuzhiyun     src.format = format;
1289*4882a593Smuzhiyun 
1290*4882a593Smuzhiyun     rga_apply_rect(&dst, &dst_rect);
1291*4882a593Smuzhiyun     format = convert_to_rga_format(dst.format);
1292*4882a593Smuzhiyun     if (format == RK_FORMAT_UNKNOWN) {
1293*4882a593Smuzhiyun         IM_LOGW("Invaild dst format [0x%x]!\n", dst.format);
1294*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1295*4882a593Smuzhiyun     }
1296*4882a593Smuzhiyun     dst.format = format;
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun     if (rga_is_buffer_valid(pat)) {
1299*4882a593Smuzhiyun         rga_apply_rect(&pat, &pat_rect);
1300*4882a593Smuzhiyun         format = convert_to_rga_format(pat.format);
1301*4882a593Smuzhiyun         if (format == RK_FORMAT_UNKNOWN) {
1302*4882a593Smuzhiyun             IM_LOGW("Invaild pat format [0x%x]!\n", pat.format);
1303*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
1304*4882a593Smuzhiyun         }
1305*4882a593Smuzhiyun         pat.format = format;
1306*4882a593Smuzhiyun     }
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun     return rga_check(src, dst, pat, src_rect, dst_rect, pat_rect, mode_usage);
1309*4882a593Smuzhiyun }
1310*4882a593Smuzhiyun 
rga_import_buffers(struct rga_buffer_pool * buffer_pool)1311*4882a593Smuzhiyun IM_API IM_STATUS rga_import_buffers(struct rga_buffer_pool *buffer_pool) {
1312*4882a593Smuzhiyun     int ret = 0;
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun     ret = rga_get_context();
1315*4882a593Smuzhiyun     if (ret != IM_STATUS_SUCCESS)
1316*4882a593Smuzhiyun         return (IM_STATUS)ret;
1317*4882a593Smuzhiyun 
1318*4882a593Smuzhiyun     if (buffer_pool == NULL) {
1319*4882a593Smuzhiyun         IM_LOGW("buffer pool is null!");
1320*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1321*4882a593Smuzhiyun     }
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun     ret = ioctl(rgaCtx->rgaFd, RGA_IOC_IMPORT_BUFFER, buffer_pool);
1324*4882a593Smuzhiyun     if (ret < 0) {
1325*4882a593Smuzhiyun         IM_LOGW("RGA_IOC_IMPORT_BUFFER fail! %s", strerror(errno));
1326*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1327*4882a593Smuzhiyun     }
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
1330*4882a593Smuzhiyun }
1331*4882a593Smuzhiyun 
rga_import_buffer(uint64_t memory,int type,uint32_t size)1332*4882a593Smuzhiyun IM_API rga_buffer_handle_t rga_import_buffer(uint64_t memory, int type, uint32_t size) {
1333*4882a593Smuzhiyun     struct rga_buffer_pool buffer_pool;
1334*4882a593Smuzhiyun     struct rga_external_buffer buffers[1];
1335*4882a593Smuzhiyun 
1336*4882a593Smuzhiyun     memset(&buffer_pool, 0x0, sizeof(buffer_pool));
1337*4882a593Smuzhiyun     memset(buffers, 0x0, sizeof(buffers));
1338*4882a593Smuzhiyun 
1339*4882a593Smuzhiyun     buffers[0].type = type;
1340*4882a593Smuzhiyun     buffers[0].memory = memory;
1341*4882a593Smuzhiyun     buffers[0].memory_info.size = size;
1342*4882a593Smuzhiyun 
1343*4882a593Smuzhiyun     buffer_pool.buffers = ptr_to_u64(buffers);
1344*4882a593Smuzhiyun     buffer_pool.size = 1;
1345*4882a593Smuzhiyun 
1346*4882a593Smuzhiyun     if (rga_import_buffers(&buffer_pool) != IM_STATUS_SUCCESS)
1347*4882a593Smuzhiyun         return -1;
1348*4882a593Smuzhiyun 
1349*4882a593Smuzhiyun     return buffers[0].handle;
1350*4882a593Smuzhiyun }
1351*4882a593Smuzhiyun 
rga_import_buffer(uint64_t memory,int type,im_handle_param_t * param)1352*4882a593Smuzhiyun IM_API rga_buffer_handle_t rga_import_buffer(uint64_t memory, int type, im_handle_param_t *param) {
1353*4882a593Smuzhiyun     int format;
1354*4882a593Smuzhiyun     struct rga_buffer_pool buffer_pool;
1355*4882a593Smuzhiyun     struct rga_external_buffer buffers[1];
1356*4882a593Smuzhiyun 
1357*4882a593Smuzhiyun     memset(&buffer_pool, 0x0, sizeof(buffer_pool));
1358*4882a593Smuzhiyun     memset(buffers, 0x0, sizeof(buffers));
1359*4882a593Smuzhiyun 
1360*4882a593Smuzhiyun     buffers[0].type = type;
1361*4882a593Smuzhiyun     buffers[0].memory = memory;
1362*4882a593Smuzhiyun     memcpy(&buffers[0].memory_info, param, sizeof(*param));
1363*4882a593Smuzhiyun     format = convert_to_rga_format(buffers[0].memory_info.format);
1364*4882a593Smuzhiyun     if (format == RK_FORMAT_UNKNOWN) {
1365*4882a593Smuzhiyun         IM_LOGW("Invaild format [0x%x]!\n", buffers[0].memory_info.format);
1366*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1367*4882a593Smuzhiyun     }
1368*4882a593Smuzhiyun     buffers[0].memory_info.format = format >> 8;
1369*4882a593Smuzhiyun 
1370*4882a593Smuzhiyun     buffer_pool.buffers = ptr_to_u64(buffers);
1371*4882a593Smuzhiyun     buffer_pool.size = 1;
1372*4882a593Smuzhiyun 
1373*4882a593Smuzhiyun     if (rga_import_buffers(&buffer_pool) != IM_STATUS_SUCCESS)
1374*4882a593Smuzhiyun         return 0;
1375*4882a593Smuzhiyun 
1376*4882a593Smuzhiyun     return buffers[0].handle;
1377*4882a593Smuzhiyun }
1378*4882a593Smuzhiyun 
rga_release_buffers(struct rga_buffer_pool * buffer_pool)1379*4882a593Smuzhiyun IM_API IM_STATUS rga_release_buffers(struct rga_buffer_pool *buffer_pool) {
1380*4882a593Smuzhiyun     int ret = 0;
1381*4882a593Smuzhiyun 
1382*4882a593Smuzhiyun     ret = rga_get_context();
1383*4882a593Smuzhiyun     if (ret != IM_STATUS_SUCCESS)
1384*4882a593Smuzhiyun         return (IM_STATUS)ret;
1385*4882a593Smuzhiyun 
1386*4882a593Smuzhiyun     if (buffer_pool == NULL) {
1387*4882a593Smuzhiyun         IM_LOGW("buffer pool is null!");
1388*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1389*4882a593Smuzhiyun     }
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun     ret = ioctl(rgaCtx->rgaFd, RGA_IOC_RELEASE_BUFFER, buffer_pool);
1392*4882a593Smuzhiyun     if (ret < 0) {
1393*4882a593Smuzhiyun         IM_LOGW("RGA_IOC_RELEASE_BUFFER fail! %s", strerror(errno));
1394*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1395*4882a593Smuzhiyun     }
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
1398*4882a593Smuzhiyun }
1399*4882a593Smuzhiyun 
rga_release_buffer(int handle)1400*4882a593Smuzhiyun IM_API IM_STATUS rga_release_buffer(int handle) {
1401*4882a593Smuzhiyun     struct rga_buffer_pool buffer_pool;
1402*4882a593Smuzhiyun     struct rga_external_buffer buffers[1];
1403*4882a593Smuzhiyun 
1404*4882a593Smuzhiyun     memset(&buffer_pool, 0x0, sizeof(buffer_pool));
1405*4882a593Smuzhiyun     memset(buffers, 0x0, sizeof(buffers));
1406*4882a593Smuzhiyun 
1407*4882a593Smuzhiyun     buffers[0].handle = handle;
1408*4882a593Smuzhiyun 
1409*4882a593Smuzhiyun     buffer_pool.buffers = ptr_to_u64(buffers);
1410*4882a593Smuzhiyun     buffer_pool.size = 1;
1411*4882a593Smuzhiyun 
1412*4882a593Smuzhiyun     return rga_release_buffers(&buffer_pool);
1413*4882a593Smuzhiyun }
1414*4882a593Smuzhiyun 
rga_dump_channel_info(int log_level,const char * name,im_rect & rect,rga_buffer_t & image)1415*4882a593Smuzhiyun static void rga_dump_channel_info(int log_level, const char *name, im_rect &rect, rga_buffer_t &image) {
1416*4882a593Smuzhiyun     log_level |= IM_LOG_FORCE;
1417*4882a593Smuzhiyun 
1418*4882a593Smuzhiyun     IM_LOG(log_level,
1419*4882a593Smuzhiyun            "%s_channel: \n"
1420*4882a593Smuzhiyun            "  rect[x,y,w,h] = [%d, %d, %d, %d]\n"
1421*4882a593Smuzhiyun            "  image[w,h,ws,hs,f] = [%d, %d, %d, %d, %s]\n"
1422*4882a593Smuzhiyun            "  buffer[handle,fd,va,pa] = [%d, %d, %lx, %lx]\n"
1423*4882a593Smuzhiyun            "  color_space = 0x%x, global_alpha = 0x%x, rd_mode = 0x%x\n",
1424*4882a593Smuzhiyun            name,
1425*4882a593Smuzhiyun            rect.x, rect.y, rect.width, rect.height,
1426*4882a593Smuzhiyun            image.width, image.height, image.wstride, image.hstride, translate_format_str(image.format),
1427*4882a593Smuzhiyun            image.handle, image.fd, (unsigned long)image.vir_addr, (unsigned long)image.phy_addr,
1428*4882a593Smuzhiyun            image.color_space_mode, image.global_alpha, image.rd_mode);
1429*4882a593Smuzhiyun }
1430*4882a593Smuzhiyun 
rga_dump_osd_info(int log_level,im_osd_t & osd_info)1431*4882a593Smuzhiyun static void rga_dump_osd_info(int log_level, im_osd_t &osd_info) {
1432*4882a593Smuzhiyun     IM_LOG(log_level, "osd_mode[0x%x]:\n", osd_info.osd_mode);
1433*4882a593Smuzhiyun 
1434*4882a593Smuzhiyun     IM_LOG(log_level, "  block: \n"
1435*4882a593Smuzhiyun                       "    width_mode[0x%x], width/witdh_index[0x%x], block_count[%d]\n"
1436*4882a593Smuzhiyun                       "    background_config[0x%x], direction[0x%x], color_mode[0x%x]\n"
1437*4882a593Smuzhiyun                       "    normal_color[0x%x], invert_color[0x%x]\n",
1438*4882a593Smuzhiyun            osd_info.block_parm.width_mode, osd_info.block_parm.width, osd_info.block_parm.block_count,
1439*4882a593Smuzhiyun            osd_info.block_parm.background_config, osd_info.block_parm.direction, osd_info.block_parm.color_mode,
1440*4882a593Smuzhiyun            osd_info.block_parm.normal_color.value, osd_info.block_parm.invert_color.value);
1441*4882a593Smuzhiyun 
1442*4882a593Smuzhiyun     IM_LOG(log_level, "  invert_config:\n"
1443*4882a593Smuzhiyun                       "    channel[0x%x], flags_mode[0x%x], flages_index[%d] threash[0x%x]\n"
1444*4882a593Smuzhiyun                       "    flages: invert[0x%llx], current[0x%llx]\n"
1445*4882a593Smuzhiyun                       "    invert_mode[%x]",
1446*4882a593Smuzhiyun            osd_info.invert_config.invert_channel, osd_info.invert_config.flags_mode,
1447*4882a593Smuzhiyun            osd_info.invert_config.flags_index, osd_info.invert_config.threash,
1448*4882a593Smuzhiyun            (unsigned long long)osd_info.invert_config.invert_flags,
1449*4882a593Smuzhiyun            (unsigned long long)osd_info.invert_config.current_flags,
1450*4882a593Smuzhiyun            osd_info.invert_config.invert_mode);
1451*4882a593Smuzhiyun     if (osd_info.invert_config.invert_mode == IM_OSD_INVERT_USE_FACTOR)
1452*4882a593Smuzhiyun         IM_LOG(log_level, "    factor[min,max] = alpha[0x%x, 0x%x], yg[0x%x, 0x%x], crb[0x%x, 0x%x]\n",
1453*4882a593Smuzhiyun                osd_info.invert_config.factor.alpha_min, osd_info.invert_config.factor.alpha_max,
1454*4882a593Smuzhiyun                osd_info.invert_config.factor.yg_min, osd_info.invert_config.factor.yg_max,
1455*4882a593Smuzhiyun                osd_info.invert_config.factor.crb_min, osd_info.invert_config.factor.crb_max);
1456*4882a593Smuzhiyun     else
1457*4882a593Smuzhiyun         IM_LOG(log_level, "\n");
1458*4882a593Smuzhiyun 
1459*4882a593Smuzhiyun     IM_LOG(log_level, "  bpp2rgb info:\n"
1460*4882a593Smuzhiyun                       "    ac_swap[0x%x], endian_swap[0x%x], color0[0x%x], color1[0x%x]\n",
1461*4882a593Smuzhiyun            osd_info.bpp2_info.ac_swap, osd_info.bpp2_info.endian_swap,
1462*4882a593Smuzhiyun            osd_info.bpp2_info.color0.value, osd_info.bpp2_info.color1.value);
1463*4882a593Smuzhiyun }
1464*4882a593Smuzhiyun 
rga_dump_opt(int log_level,im_opt_t & opt,int usage)1465*4882a593Smuzhiyun static void rga_dump_opt(int log_level, im_opt_t &opt, int usage) {
1466*4882a593Smuzhiyun     log_level |= IM_LOG_FORCE;
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun     IM_LOG(log_level, "opt version[0x%x]:\n", opt.version);
1469*4882a593Smuzhiyun     IM_LOG(log_level, "set_core[0x%x], priority[%d]\n", opt.core, opt.priority);
1470*4882a593Smuzhiyun 
1471*4882a593Smuzhiyun     if (usage & IM_COLOR_FILL)
1472*4882a593Smuzhiyun         IM_LOG(log_level, "color[0x%x] ", opt.color);
1473*4882a593Smuzhiyun     if (usage & IM_MOSAIC)
1474*4882a593Smuzhiyun         IM_LOG(log_level, "mosaic[%d] ", opt.mosaic_mode);
1475*4882a593Smuzhiyun     if (usage & IM_ROP)
1476*4882a593Smuzhiyun         IM_LOG(log_level, "rop[0x%x] ", opt.rop_code);
1477*4882a593Smuzhiyun     if (usage & IM_ALPHA_COLORKEY_MASK)
1478*4882a593Smuzhiyun         IM_LOG(log_level, "color_key[min,max] = [0x%x, 0x%x] ",
1479*4882a593Smuzhiyun                opt.colorkey_range.min, opt.colorkey_range.max);
1480*4882a593Smuzhiyun     if (usage & (IM_COLOR_FILL | IM_MOSAIC | IM_ROP | IM_ALPHA_COLORKEY_MASK))
1481*4882a593Smuzhiyun         IM_LOG(log_level, "\n");
1482*4882a593Smuzhiyun 
1483*4882a593Smuzhiyun     if (usage & IM_NN_QUANTIZE)
1484*4882a593Smuzhiyun         IM_LOG(log_level, "nn:\n"
1485*4882a593Smuzhiyun                           "  scale[r,g,b] = [%d, %d, %d], offset[r,g,b] = [0x%x, 0x%x, 0x%x]\n",
1486*4882a593Smuzhiyun                opt.nn.scale_r, opt.nn.scale_g, opt.nn.scale_b,
1487*4882a593Smuzhiyun                opt.nn.offset_r, opt.nn.offset_g, opt.nn.offset_b);
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun     if (usage & IM_OSD)
1490*4882a593Smuzhiyun         rga_dump_osd_info(log_level, opt.osd_config);
1491*4882a593Smuzhiyun 
1492*4882a593Smuzhiyun     if (usage & IM_PRE_INTR)
1493*4882a593Smuzhiyun         IM_LOG(log_level, "pre_intr:\n"
1494*4882a593Smuzhiyun                           "  flags[0x%x], read_threshold[0x%x], write_start[0x%x], write_step[0x%x]\n",
1495*4882a593Smuzhiyun                opt.intr_config.flags, opt.intr_config.read_threshold,
1496*4882a593Smuzhiyun                opt.intr_config.write_start, opt.intr_config.write_step);
1497*4882a593Smuzhiyun }
1498*4882a593Smuzhiyun 
rga_get_opt(im_opt_t * opt,void * ptr)1499*4882a593Smuzhiyun IM_STATUS rga_get_opt(im_opt_t *opt, void *ptr) {
1500*4882a593Smuzhiyun     if (opt == NULL || ptr == NULL)
1501*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1502*4882a593Smuzhiyun 
1503*4882a593Smuzhiyun     /*
1504*4882a593Smuzhiyun      * Prevent the value of 'color' from being mistakenly used as
1505*4882a593Smuzhiyun      * version information.
1506*4882a593Smuzhiyun      */
1507*4882a593Smuzhiyun     if (rga_version_compare(RGA_GET_API_VERSION(*(im_api_version_t *)ptr),
1508*4882a593Smuzhiyun                             (struct rga_version_t){ 2, 0, 0, {0}}) > 0)
1509*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun     if (rga_version_compare(RGA_GET_API_VERSION(*(im_api_version_t *)ptr),
1512*4882a593Smuzhiyun                             (struct rga_version_t){ 1, 7, 2, {0}}) <= 0) {
1513*4882a593Smuzhiyun         opt->color = ((im_opt_t *)ptr)->color;
1514*4882a593Smuzhiyun         memcpy(&opt->colorkey_range, &((im_opt_t *)ptr)->colorkey_range, sizeof(im_colorkey_range));
1515*4882a593Smuzhiyun         memcpy(&opt->nn, &((im_opt_t *)ptr)->nn, sizeof(im_nn_t));
1516*4882a593Smuzhiyun         opt->rop_code = ((im_opt_t *)ptr)->rop_code;
1517*4882a593Smuzhiyun         opt->priority = ((im_opt_t *)ptr)->priority;
1518*4882a593Smuzhiyun         opt->core = ((im_opt_t *)ptr)->core;
1519*4882a593Smuzhiyun     } else {
1520*4882a593Smuzhiyun         memcpy(opt, ptr, sizeof(im_opt_t));
1521*4882a593Smuzhiyun     }
1522*4882a593Smuzhiyun 
1523*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
1524*4882a593Smuzhiyun }
1525*4882a593Smuzhiyun 
rga_task_submit(im_job_handle_t job_handle,rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,int acquire_fence_fd,int * release_fence_fd,im_opt_t * opt_ptr,int usage)1526*4882a593Smuzhiyun static IM_STATUS rga_task_submit(im_job_handle_t job_handle, rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1527*4882a593Smuzhiyun                                  im_rect srect, im_rect drect, im_rect prect,
1528*4882a593Smuzhiyun                                  int acquire_fence_fd, int *release_fence_fd,
1529*4882a593Smuzhiyun                                  im_opt_t *opt_ptr, int usage) {
1530*4882a593Smuzhiyun     int ret;
1531*4882a593Smuzhiyun     int format;
1532*4882a593Smuzhiyun     rga_info_t srcinfo;
1533*4882a593Smuzhiyun     rga_info_t dstinfo;
1534*4882a593Smuzhiyun     rga_info_t patinfo;
1535*4882a593Smuzhiyun 
1536*4882a593Smuzhiyun     im_opt_t opt;
1537*4882a593Smuzhiyun 
1538*4882a593Smuzhiyun     if (rga_get_opt(&opt, opt_ptr) == IM_STATUS_FAILED)
1539*4882a593Smuzhiyun         memset(&opt, 0x0, sizeof(opt));
1540*4882a593Smuzhiyun 
1541*4882a593Smuzhiyun     memset(&srcinfo, 0, sizeof(rga_info_t));
1542*4882a593Smuzhiyun     memset(&dstinfo, 0, sizeof(rga_info_t));
1543*4882a593Smuzhiyun     memset(&patinfo, 0, sizeof(rga_info_t));
1544*4882a593Smuzhiyun 
1545*4882a593Smuzhiyun     if (usage & IM_COLOR_FILL)
1546*4882a593Smuzhiyun         ret = rga_set_buffer_info(dst, &dstinfo);
1547*4882a593Smuzhiyun     else
1548*4882a593Smuzhiyun         ret = rga_set_buffer_info(src, dst, &srcinfo, &dstinfo);
1549*4882a593Smuzhiyun 
1550*4882a593Smuzhiyun     if (ret <= 0)
1551*4882a593Smuzhiyun         return (IM_STATUS)ret;
1552*4882a593Smuzhiyun 
1553*4882a593Smuzhiyun     rga_apply_rect(&src, &srect);
1554*4882a593Smuzhiyun     format = convert_to_rga_format(src.format);
1555*4882a593Smuzhiyun     if (format == RK_FORMAT_UNKNOWN) {
1556*4882a593Smuzhiyun         IM_LOGW("Invaild src format [0x%x]!\n", src.format);
1557*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1558*4882a593Smuzhiyun     }
1559*4882a593Smuzhiyun     src.format = format;
1560*4882a593Smuzhiyun 
1561*4882a593Smuzhiyun     rga_set_rect(&srcinfo.rect, srect.x, srect.y, src.width, src.height, src.wstride, src.hstride, src.format);
1562*4882a593Smuzhiyun 
1563*4882a593Smuzhiyun     rga_apply_rect(&dst, &drect);
1564*4882a593Smuzhiyun     format = convert_to_rga_format(dst.format);
1565*4882a593Smuzhiyun     if (format == RK_FORMAT_UNKNOWN) {
1566*4882a593Smuzhiyun         IM_LOGW("Invaild dst format [0x%x]!\n", dst.format);
1567*4882a593Smuzhiyun         return IM_STATUS_NOT_SUPPORTED;
1568*4882a593Smuzhiyun     }
1569*4882a593Smuzhiyun     dst.format = format;
1570*4882a593Smuzhiyun 
1571*4882a593Smuzhiyun     rga_set_rect(&dstinfo.rect, drect.x, drect.y, dst.width, dst.height, dst.wstride, dst.hstride, dst.format);
1572*4882a593Smuzhiyun 
1573*4882a593Smuzhiyun     if (((usage & IM_COLOR_PALETTE) || (usage & IM_ALPHA_BLEND_MASK)) &&
1574*4882a593Smuzhiyun         rga_is_buffer_valid(pat)) {
1575*4882a593Smuzhiyun 
1576*4882a593Smuzhiyun         ret = rga_set_buffer_info(pat, &patinfo);
1577*4882a593Smuzhiyun         if (ret <= 0)
1578*4882a593Smuzhiyun             return (IM_STATUS)ret;
1579*4882a593Smuzhiyun 
1580*4882a593Smuzhiyun         rga_apply_rect(&pat, &prect);
1581*4882a593Smuzhiyun         format = convert_to_rga_format(pat.format);
1582*4882a593Smuzhiyun         if (format == RK_FORMAT_UNKNOWN) {
1583*4882a593Smuzhiyun             IM_LOGW("Invaild pat format [0x%x]!\n", pat.format);
1584*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
1585*4882a593Smuzhiyun         }
1586*4882a593Smuzhiyun         pat.format = format;
1587*4882a593Smuzhiyun 
1588*4882a593Smuzhiyun         rga_set_rect(&patinfo.rect, prect.x, prect.y, pat.width, pat.height, pat.wstride, pat.hstride, pat.format);
1589*4882a593Smuzhiyun     }
1590*4882a593Smuzhiyun 
1591*4882a593Smuzhiyun     ret = rga_check(src, dst, pat, srect, drect, prect, usage);
1592*4882a593Smuzhiyun     if(ret != IM_STATUS_NOERROR)
1593*4882a593Smuzhiyun         return (IM_STATUS)ret;
1594*4882a593Smuzhiyun 
1595*4882a593Smuzhiyun     /* Transform */
1596*4882a593Smuzhiyun     if (usage & IM_HAL_TRANSFORM_MASK) {
1597*4882a593Smuzhiyun         switch (usage & (IM_HAL_TRANSFORM_ROT_90 + IM_HAL_TRANSFORM_ROT_180 + IM_HAL_TRANSFORM_ROT_270)) {
1598*4882a593Smuzhiyun             case IM_HAL_TRANSFORM_ROT_90:
1599*4882a593Smuzhiyun                 srcinfo.rotation = HAL_TRANSFORM_ROT_90;
1600*4882a593Smuzhiyun                 break;
1601*4882a593Smuzhiyun             case IM_HAL_TRANSFORM_ROT_180:
1602*4882a593Smuzhiyun                 srcinfo.rotation = HAL_TRANSFORM_ROT_180;
1603*4882a593Smuzhiyun                 break;
1604*4882a593Smuzhiyun             case IM_HAL_TRANSFORM_ROT_270:
1605*4882a593Smuzhiyun                 srcinfo.rotation = HAL_TRANSFORM_ROT_270;
1606*4882a593Smuzhiyun                 break;
1607*4882a593Smuzhiyun         }
1608*4882a593Smuzhiyun 
1609*4882a593Smuzhiyun         switch (usage & (IM_HAL_TRANSFORM_FLIP_V + IM_HAL_TRANSFORM_FLIP_H + IM_HAL_TRANSFORM_FLIP_H_V)) {
1610*4882a593Smuzhiyun             case IM_HAL_TRANSFORM_FLIP_V:
1611*4882a593Smuzhiyun                 srcinfo.rotation |= srcinfo.rotation ?
1612*4882a593Smuzhiyun                                     HAL_TRANSFORM_FLIP_V << 4 :
1613*4882a593Smuzhiyun                                     HAL_TRANSFORM_FLIP_V;
1614*4882a593Smuzhiyun                 break;
1615*4882a593Smuzhiyun             case IM_HAL_TRANSFORM_FLIP_H:
1616*4882a593Smuzhiyun                 srcinfo.rotation |= srcinfo.rotation ?
1617*4882a593Smuzhiyun                                     HAL_TRANSFORM_FLIP_H << 4 :
1618*4882a593Smuzhiyun                                     HAL_TRANSFORM_FLIP_H;
1619*4882a593Smuzhiyun                 break;
1620*4882a593Smuzhiyun             case IM_HAL_TRANSFORM_FLIP_H_V:
1621*4882a593Smuzhiyun                 srcinfo.rotation |= srcinfo.rotation ?
1622*4882a593Smuzhiyun                                     HAL_TRANSFORM_FLIP_H_V << 4 :
1623*4882a593Smuzhiyun                                     HAL_TRANSFORM_FLIP_H_V;
1624*4882a593Smuzhiyun                 break;
1625*4882a593Smuzhiyun         }
1626*4882a593Smuzhiyun 
1627*4882a593Smuzhiyun         if(srcinfo.rotation ==0)
1628*4882a593Smuzhiyun             IM_LOGE("rga_im2d: Could not find rotate/flip usage : 0x%x \n", usage);
1629*4882a593Smuzhiyun     }
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun     /* Blend */
1632*4882a593Smuzhiyun     if (usage & IM_ALPHA_BLEND_MASK) {
1633*4882a593Smuzhiyun         switch(usage & IM_ALPHA_BLEND_MASK) {
1634*4882a593Smuzhiyun             case IM_ALPHA_BLEND_SRC:
1635*4882a593Smuzhiyun                 srcinfo.blend = 0x1;
1636*4882a593Smuzhiyun                 break;
1637*4882a593Smuzhiyun             case IM_ALPHA_BLEND_DST:
1638*4882a593Smuzhiyun                 srcinfo.blend = 0x2;
1639*4882a593Smuzhiyun                 break;
1640*4882a593Smuzhiyun             case IM_ALPHA_BLEND_SRC_OVER:
1641*4882a593Smuzhiyun                 srcinfo.blend = (usage & IM_ALPHA_BLEND_PRE_MUL) ? 0x405 : 0x105;
1642*4882a593Smuzhiyun                 break;
1643*4882a593Smuzhiyun             case IM_ALPHA_BLEND_SRC_IN:
1644*4882a593Smuzhiyun                 break;
1645*4882a593Smuzhiyun             case IM_ALPHA_BLEND_DST_IN:
1646*4882a593Smuzhiyun                 break;
1647*4882a593Smuzhiyun             case IM_ALPHA_BLEND_SRC_OUT:
1648*4882a593Smuzhiyun                 break;
1649*4882a593Smuzhiyun             case IM_ALPHA_BLEND_DST_OVER:
1650*4882a593Smuzhiyun                 srcinfo.blend = (usage & IM_ALPHA_BLEND_PRE_MUL) ? 0x504 : 0x501;
1651*4882a593Smuzhiyun                 break;
1652*4882a593Smuzhiyun             case IM_ALPHA_BLEND_SRC_ATOP:
1653*4882a593Smuzhiyun                 break;
1654*4882a593Smuzhiyun             case IM_ALPHA_BLEND_DST_OUT:
1655*4882a593Smuzhiyun                 break;
1656*4882a593Smuzhiyun             case IM_ALPHA_BLEND_XOR:
1657*4882a593Smuzhiyun                 break;
1658*4882a593Smuzhiyun         }
1659*4882a593Smuzhiyun 
1660*4882a593Smuzhiyun         if(srcinfo.blend == 0)
1661*4882a593Smuzhiyun             IM_LOGE("rga_im2d: Could not find blend usage : 0x%x \n", usage);
1662*4882a593Smuzhiyun 
1663*4882a593Smuzhiyun         /* set global alpha */
1664*4882a593Smuzhiyun         if (src.global_alpha > 0)
1665*4882a593Smuzhiyun             srcinfo.blend ^= src.global_alpha << 16;
1666*4882a593Smuzhiyun         else {
1667*4882a593Smuzhiyun             srcinfo.blend ^= 0xFF << 16;
1668*4882a593Smuzhiyun         }
1669*4882a593Smuzhiyun     }
1670*4882a593Smuzhiyun 
1671*4882a593Smuzhiyun     /* color key */
1672*4882a593Smuzhiyun     if (usage & IM_ALPHA_COLORKEY_MASK) {
1673*4882a593Smuzhiyun         srcinfo.blend = 0xff0105;
1674*4882a593Smuzhiyun 
1675*4882a593Smuzhiyun         srcinfo.colorkey_en = 1;
1676*4882a593Smuzhiyun         srcinfo.colorkey_min = opt.colorkey_range.min;
1677*4882a593Smuzhiyun         srcinfo.colorkey_max = opt.colorkey_range.max;
1678*4882a593Smuzhiyun         switch (usage & IM_ALPHA_COLORKEY_MASK) {
1679*4882a593Smuzhiyun             case IM_ALPHA_COLORKEY_NORMAL:
1680*4882a593Smuzhiyun                 srcinfo.colorkey_mode = 0;
1681*4882a593Smuzhiyun                 break;
1682*4882a593Smuzhiyun             case IM_ALPHA_COLORKEY_INVERTED:
1683*4882a593Smuzhiyun                 srcinfo.colorkey_mode = 1;
1684*4882a593Smuzhiyun                 break;
1685*4882a593Smuzhiyun         }
1686*4882a593Smuzhiyun     }
1687*4882a593Smuzhiyun 
1688*4882a593Smuzhiyun     /* OSD */
1689*4882a593Smuzhiyun     if (usage & IM_OSD) {
1690*4882a593Smuzhiyun         srcinfo.osd_info.enable = true;
1691*4882a593Smuzhiyun 
1692*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.mode = opt.osd_config.osd_mode;
1693*4882a593Smuzhiyun 
1694*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.width_mode = opt.osd_config.block_parm.width_mode;
1695*4882a593Smuzhiyun         if (opt.osd_config.block_parm.width_mode == IM_OSD_BLOCK_MODE_NORMAL)
1696*4882a593Smuzhiyun             srcinfo.osd_info.mode_ctrl.block_fix_width = opt.osd_config.block_parm.width;
1697*4882a593Smuzhiyun         else if (opt.osd_config.block_parm.width_mode == IM_OSD_BLOCK_MODE_DIFFERENT)
1698*4882a593Smuzhiyun             srcinfo.osd_info.mode_ctrl.unfix_index = opt.osd_config.block_parm.width_index;
1699*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.block_num = opt.osd_config.block_parm.block_count;
1700*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.default_color_sel = opt.osd_config.block_parm.background_config;
1701*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.direction_mode = opt.osd_config.block_parm.direction;
1702*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.color_mode = opt.osd_config.block_parm.color_mode;
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun         if (pat.format == RK_FORMAT_RGBA2BPP) {
1705*4882a593Smuzhiyun             srcinfo.osd_info.bpp2_info.ac_swap = opt.osd_config.bpp2_info.ac_swap;
1706*4882a593Smuzhiyun             srcinfo.osd_info.bpp2_info.endian_swap = opt.osd_config.bpp2_info.endian_swap;
1707*4882a593Smuzhiyun             srcinfo.osd_info.bpp2_info.color0.value = opt.osd_config.bpp2_info.color0.value;
1708*4882a593Smuzhiyun             srcinfo.osd_info.bpp2_info.color1.value = opt.osd_config.bpp2_info.color1.value;
1709*4882a593Smuzhiyun         } else {
1710*4882a593Smuzhiyun             srcinfo.osd_info.bpp2_info.color0.value = opt.osd_config.block_parm.normal_color.value;
1711*4882a593Smuzhiyun             srcinfo.osd_info.bpp2_info.color1.value = opt.osd_config.block_parm.invert_color.value;
1712*4882a593Smuzhiyun         }
1713*4882a593Smuzhiyun 
1714*4882a593Smuzhiyun         switch (opt.osd_config.invert_config.invert_channel) {
1715*4882a593Smuzhiyun             case IM_OSD_INVERT_CHANNEL_NONE:
1716*4882a593Smuzhiyun                 srcinfo.osd_info.mode_ctrl.invert_enable = (0x1 << 1) | (0x1 << 2);
1717*4882a593Smuzhiyun                 break;
1718*4882a593Smuzhiyun             case IM_OSD_INVERT_CHANNEL_Y_G:
1719*4882a593Smuzhiyun                 srcinfo.osd_info.mode_ctrl.invert_enable = 0x1 << 2;
1720*4882a593Smuzhiyun                 break;
1721*4882a593Smuzhiyun             case IM_OSD_INVERT_CHANNEL_C_RB:
1722*4882a593Smuzhiyun                 srcinfo.osd_info.mode_ctrl.invert_enable = 0x1 << 1;
1723*4882a593Smuzhiyun                 break;
1724*4882a593Smuzhiyun             case IM_OSD_INVERT_CHANNEL_ALPHA:
1725*4882a593Smuzhiyun                 srcinfo.osd_info.mode_ctrl.invert_enable = (0x1 << 0) | (0x1 << 1) | (0x1 << 2);
1726*4882a593Smuzhiyun                 break;
1727*4882a593Smuzhiyun             case IM_OSD_INVERT_CHANNEL_COLOR:
1728*4882a593Smuzhiyun                 srcinfo.osd_info.mode_ctrl.invert_enable = 0;
1729*4882a593Smuzhiyun                 break;
1730*4882a593Smuzhiyun             case IM_OSD_INVERT_CHANNEL_BOTH:
1731*4882a593Smuzhiyun                 srcinfo.osd_info.mode_ctrl.invert_enable = 0x1 << 0;
1732*4882a593Smuzhiyun         }
1733*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.invert_flags_mode = opt.osd_config.invert_config.flags_mode;
1734*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.flags_index = opt.osd_config.invert_config.flags_index;
1735*4882a593Smuzhiyun 
1736*4882a593Smuzhiyun         srcinfo.osd_info.last_flags = opt.osd_config.invert_config.invert_flags;
1737*4882a593Smuzhiyun         srcinfo.osd_info.cur_flags = opt.osd_config.invert_config.current_flags;
1738*4882a593Smuzhiyun 
1739*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.invert_mode = opt.osd_config.invert_config.invert_mode;
1740*4882a593Smuzhiyun         if (opt.osd_config.invert_config.invert_mode == IM_OSD_INVERT_USE_FACTOR) {
1741*4882a593Smuzhiyun             srcinfo.osd_info.cal_factor.alpha_max = opt.osd_config.invert_config.factor.alpha_max;
1742*4882a593Smuzhiyun             srcinfo.osd_info.cal_factor.alpha_min = opt.osd_config.invert_config.factor.alpha_min;
1743*4882a593Smuzhiyun             srcinfo.osd_info.cal_factor.crb_max = opt.osd_config.invert_config.factor.crb_max;
1744*4882a593Smuzhiyun             srcinfo.osd_info.cal_factor.crb_min = opt.osd_config.invert_config.factor.crb_min;
1745*4882a593Smuzhiyun             srcinfo.osd_info.cal_factor.yg_max = opt.osd_config.invert_config.factor.yg_max;
1746*4882a593Smuzhiyun             srcinfo.osd_info.cal_factor.yg_min = opt.osd_config.invert_config.factor.yg_min;
1747*4882a593Smuzhiyun         }
1748*4882a593Smuzhiyun         srcinfo.osd_info.mode_ctrl.invert_thresh = opt.osd_config.invert_config.threash;
1749*4882a593Smuzhiyun     }
1750*4882a593Smuzhiyun 
1751*4882a593Smuzhiyun     /* set NN quantize */
1752*4882a593Smuzhiyun     if (usage & IM_NN_QUANTIZE) {
1753*4882a593Smuzhiyun         dstinfo.nn.nn_flag = 1;
1754*4882a593Smuzhiyun         dstinfo.nn.scale_r  = opt.nn.scale_r;
1755*4882a593Smuzhiyun         dstinfo.nn.scale_g  = opt.nn.scale_g;
1756*4882a593Smuzhiyun         dstinfo.nn.scale_b  = opt.nn.scale_b;
1757*4882a593Smuzhiyun         dstinfo.nn.offset_r = opt.nn.offset_r;
1758*4882a593Smuzhiyun         dstinfo.nn.offset_g = opt.nn.offset_g;
1759*4882a593Smuzhiyun         dstinfo.nn.offset_b = opt.nn.offset_b;
1760*4882a593Smuzhiyun     }
1761*4882a593Smuzhiyun 
1762*4882a593Smuzhiyun     /* set ROP */
1763*4882a593Smuzhiyun     if (usage & IM_ROP) {
1764*4882a593Smuzhiyun         srcinfo.rop_code = opt.rop_code;
1765*4882a593Smuzhiyun     }
1766*4882a593Smuzhiyun 
1767*4882a593Smuzhiyun     /* set mosaic */
1768*4882a593Smuzhiyun     if (usage & IM_MOSAIC) {
1769*4882a593Smuzhiyun         srcinfo.mosaic_info.enable = true;
1770*4882a593Smuzhiyun         srcinfo.mosaic_info.mode = opt.mosaic_mode;
1771*4882a593Smuzhiyun     }
1772*4882a593Smuzhiyun 
1773*4882a593Smuzhiyun     /* set intr config */
1774*4882a593Smuzhiyun     if (usage & IM_PRE_INTR) {
1775*4882a593Smuzhiyun         srcinfo.pre_intr.enable = true;
1776*4882a593Smuzhiyun 
1777*4882a593Smuzhiyun         srcinfo.pre_intr.read_intr_en = opt.intr_config.flags & IM_INTR_READ_INTR ? true : false;
1778*4882a593Smuzhiyun         if (srcinfo.pre_intr.read_intr_en) {
1779*4882a593Smuzhiyun             srcinfo.pre_intr.read_intr_en = true;
1780*4882a593Smuzhiyun             srcinfo.pre_intr.read_hold_en = opt.intr_config.flags & IM_INTR_READ_HOLD ? true : false;
1781*4882a593Smuzhiyun             srcinfo.pre_intr.read_threshold = opt.intr_config.read_threshold;
1782*4882a593Smuzhiyun         }
1783*4882a593Smuzhiyun 
1784*4882a593Smuzhiyun         srcinfo.pre_intr.write_intr_en = opt.intr_config.flags & IM_INTR_WRITE_INTR ? true : false;
1785*4882a593Smuzhiyun         if (srcinfo.pre_intr.write_intr_en > 0) {
1786*4882a593Smuzhiyun                 srcinfo.pre_intr.write_start = opt.intr_config.write_start;
1787*4882a593Smuzhiyun                 srcinfo.pre_intr.write_step = opt.intr_config.write_step;
1788*4882a593Smuzhiyun         }
1789*4882a593Smuzhiyun     }
1790*4882a593Smuzhiyun 
1791*4882a593Smuzhiyun     /* special config for color space convert */
1792*4882a593Smuzhiyun     if ((dst.color_space_mode & IM_YUV_TO_RGB_MASK) && (dst.color_space_mode & IM_RGB_TO_YUV_MASK)) {
1793*4882a593Smuzhiyun         if (rga_is_buffer_valid(pat) &&
1794*4882a593Smuzhiyun             NormalRgaIsYuvFormat(src.format) &&
1795*4882a593Smuzhiyun             NormalRgaIsRgbFormat(pat.format) &&
1796*4882a593Smuzhiyun             NormalRgaIsYuvFormat(dst.format)) {
1797*4882a593Smuzhiyun             dstinfo.color_space_mode = dst.color_space_mode;
1798*4882a593Smuzhiyun         } else {
1799*4882a593Smuzhiyun             IM_LOGW("Not yuv + rgb -> yuv does not need for color_sapce_mode R2Y & Y2R, please fix, "
1800*4882a593Smuzhiyun                     "src_fromat = 0x%x(%s), src1_format = 0x%x(%s), dst_format = 0x%x(%s)",
1801*4882a593Smuzhiyun                     src.format, translate_format_str(src.format),
1802*4882a593Smuzhiyun                     pat.format, translate_format_str(pat.format),
1803*4882a593Smuzhiyun                     dst.format, translate_format_str(dst.format));
1804*4882a593Smuzhiyun             return IM_STATUS_ILLEGAL_PARAM;
1805*4882a593Smuzhiyun         }
1806*4882a593Smuzhiyun     } else if (dst.color_space_mode & (IM_YUV_TO_RGB_MASK)) {
1807*4882a593Smuzhiyun         if (rga_is_buffer_valid(pat) &&
1808*4882a593Smuzhiyun             NormalRgaIsYuvFormat(src.format) &&
1809*4882a593Smuzhiyun             NormalRgaIsRgbFormat(pat.format) &&
1810*4882a593Smuzhiyun             NormalRgaIsRgbFormat(dst.format)) {
1811*4882a593Smuzhiyun             dstinfo.color_space_mode = dst.color_space_mode;
1812*4882a593Smuzhiyun         } else if (NormalRgaIsYuvFormat(src.format) &&
1813*4882a593Smuzhiyun                    NormalRgaIsRgbFormat(dst.format)) {
1814*4882a593Smuzhiyun             dstinfo.color_space_mode = dst.color_space_mode;
1815*4882a593Smuzhiyun         } else {
1816*4882a593Smuzhiyun             IM_LOGW("Not yuv to rgb does not need for color_sapce_mode, please fix, "
1817*4882a593Smuzhiyun                     "src_fromat = 0x%x(%s), src1_format = 0x%x(%s), dst_format = 0x%x(%s)",
1818*4882a593Smuzhiyun                     src.format, translate_format_str(src.format),
1819*4882a593Smuzhiyun                     pat.format, rga_is_buffer_valid(pat) ? translate_format_str(pat.format) : "none",
1820*4882a593Smuzhiyun                     dst.format, translate_format_str(dst.format));
1821*4882a593Smuzhiyun             return IM_STATUS_ILLEGAL_PARAM;
1822*4882a593Smuzhiyun         }
1823*4882a593Smuzhiyun     } else if (dst.color_space_mode & (IM_RGB_TO_YUV_MASK)) {
1824*4882a593Smuzhiyun         if (rga_is_buffer_valid(pat) &&
1825*4882a593Smuzhiyun             NormalRgaIsRgbFormat(src.format) &&
1826*4882a593Smuzhiyun             NormalRgaIsRgbFormat(pat.format) &&
1827*4882a593Smuzhiyun             NormalRgaIsYuvFormat(dst.format)) {
1828*4882a593Smuzhiyun             dstinfo.color_space_mode = dst.color_space_mode;
1829*4882a593Smuzhiyun         } else if (NormalRgaIsRgbFormat(src.format) &&
1830*4882a593Smuzhiyun                    NormalRgaIsYuvFormat(dst.format)) {
1831*4882a593Smuzhiyun             dstinfo.color_space_mode = dst.color_space_mode;
1832*4882a593Smuzhiyun         } else {
1833*4882a593Smuzhiyun             IM_LOGW("Not rgb to yuv does not need for color_sapce_mode, please fix, "
1834*4882a593Smuzhiyun                     "src_fromat = 0x%x(%s), src1_format = 0x%x(%s), dst_format = 0x%x(%s)",
1835*4882a593Smuzhiyun                     src.format, translate_format_str(src.format),
1836*4882a593Smuzhiyun                     pat.format, rga_is_buffer_valid(pat) ? translate_format_str(pat.format) : "none",
1837*4882a593Smuzhiyun                     dst.format, translate_format_str(dst.format));
1838*4882a593Smuzhiyun             return IM_STATUS_ILLEGAL_PARAM;
1839*4882a593Smuzhiyun         }
1840*4882a593Smuzhiyun     } else if (src.color_space_mode & IM_FULL_CSC_MASK ||
1841*4882a593Smuzhiyun                dst.color_space_mode & IM_FULL_CSC_MASK) {
1842*4882a593Smuzhiyun         /* Get default color space */
1843*4882a593Smuzhiyun         if (src.color_space_mode == IM_COLOR_SPACE_DEFAULT) {
1844*4882a593Smuzhiyun             if  (NormalRgaIsRgbFormat(src.format)) {
1845*4882a593Smuzhiyun                 src.color_space_mode = IM_RGB_FULL;
1846*4882a593Smuzhiyun             } else if (NormalRgaIsYuvFormat(src.format)) {
1847*4882a593Smuzhiyun                 src.color_space_mode = IM_YUV_BT601_LIMIT_RANGE;
1848*4882a593Smuzhiyun             }
1849*4882a593Smuzhiyun         }
1850*4882a593Smuzhiyun 
1851*4882a593Smuzhiyun         if (dst.color_space_mode == IM_COLOR_SPACE_DEFAULT) {
1852*4882a593Smuzhiyun             if  (NormalRgaIsRgbFormat(dst.format)) {
1853*4882a593Smuzhiyun                 src.color_space_mode = IM_RGB_FULL;
1854*4882a593Smuzhiyun             } else if (NormalRgaIsYuvFormat(dst.format)) {
1855*4882a593Smuzhiyun                 src.color_space_mode = IM_YUV_BT601_LIMIT_RANGE;
1856*4882a593Smuzhiyun             }
1857*4882a593Smuzhiyun         }
1858*4882a593Smuzhiyun 
1859*4882a593Smuzhiyun         if (src.color_space_mode == IM_RGB_FULL &&
1860*4882a593Smuzhiyun             dst.color_space_mode == IM_YUV_BT709_FULL_RANGE) {
1861*4882a593Smuzhiyun             dstinfo.color_space_mode = rgb2yuv_709_full;
1862*4882a593Smuzhiyun         } else if (src.color_space_mode == IM_YUV_BT601_FULL_RANGE &&
1863*4882a593Smuzhiyun                    dst.color_space_mode == IM_YUV_BT709_LIMIT_RANGE) {
1864*4882a593Smuzhiyun             dstinfo.color_space_mode = yuv2yuv_601_full_2_709_limit;
1865*4882a593Smuzhiyun         } else if (src.color_space_mode == IM_YUV_BT709_LIMIT_RANGE &&
1866*4882a593Smuzhiyun                    dst.color_space_mode == IM_YUV_BT601_LIMIT_RANGE) {
1867*4882a593Smuzhiyun             dstinfo.color_space_mode = yuv2yuv_709_limit_2_601_limit;
1868*4882a593Smuzhiyun         } else if (src.color_space_mode == IM_YUV_BT709_FULL_RANGE &&
1869*4882a593Smuzhiyun                    dst.color_space_mode == IM_YUV_BT601_LIMIT_RANGE) {
1870*4882a593Smuzhiyun             dstinfo.color_space_mode = yuv2yuv_709_full_2_601_limit;
1871*4882a593Smuzhiyun         } else if (src.color_space_mode == IM_YUV_BT709_FULL_RANGE &&
1872*4882a593Smuzhiyun                    dst.color_space_mode == IM_YUV_BT601_FULL_RANGE) {
1873*4882a593Smuzhiyun             dstinfo.color_space_mode = yuv2yuv_709_full_2_601_full;
1874*4882a593Smuzhiyun         } else {
1875*4882a593Smuzhiyun             IM_LOGW("Unsupported full csc mode! src_csm = 0x%x, dst_csm = 0x%x",
1876*4882a593Smuzhiyun                     src.color_space_mode, dst.color_space_mode);
1877*4882a593Smuzhiyun             return IM_STATUS_NOT_SUPPORTED;
1878*4882a593Smuzhiyun         }
1879*4882a593Smuzhiyun     }
1880*4882a593Smuzhiyun 
1881*4882a593Smuzhiyun     if (dst.format == RK_FORMAT_Y4) {
1882*4882a593Smuzhiyun         switch (dst.color_space_mode) {
1883*4882a593Smuzhiyun             case IM_RGB_TO_Y4 :
1884*4882a593Smuzhiyun                 dstinfo.dither.enable = 0;
1885*4882a593Smuzhiyun                 dstinfo.dither.mode = 0;
1886*4882a593Smuzhiyun                 break;
1887*4882a593Smuzhiyun             case IM_RGB_TO_Y4_DITHER :
1888*4882a593Smuzhiyun                 dstinfo.dither.enable = 1;
1889*4882a593Smuzhiyun                 dstinfo.dither.mode = 0;
1890*4882a593Smuzhiyun                 break;
1891*4882a593Smuzhiyun             case IM_RGB_TO_Y1_DITHER :
1892*4882a593Smuzhiyun                 dstinfo.dither.enable = 1;
1893*4882a593Smuzhiyun                 dstinfo.dither.mode = 1;
1894*4882a593Smuzhiyun                 break;
1895*4882a593Smuzhiyun             default :
1896*4882a593Smuzhiyun                 dstinfo.dither.enable = 1;
1897*4882a593Smuzhiyun                 dstinfo.dither.mode = 0;
1898*4882a593Smuzhiyun                 break;
1899*4882a593Smuzhiyun         }
1900*4882a593Smuzhiyun         dstinfo.dither.lut0_l = 0x3210;
1901*4882a593Smuzhiyun         dstinfo.dither.lut0_h = 0x7654;
1902*4882a593Smuzhiyun         dstinfo.dither.lut1_l = 0xba98;
1903*4882a593Smuzhiyun         dstinfo.dither.lut1_h = 0xfedc;
1904*4882a593Smuzhiyun     }
1905*4882a593Smuzhiyun 
1906*4882a593Smuzhiyun     srcinfo.rd_mode = src.rd_mode;
1907*4882a593Smuzhiyun     dstinfo.rd_mode = dst.rd_mode;
1908*4882a593Smuzhiyun     if (rga_is_buffer_valid(pat))
1909*4882a593Smuzhiyun         patinfo.rd_mode = pat.rd_mode;
1910*4882a593Smuzhiyun 
1911*4882a593Smuzhiyun     RockchipRga& rkRga(RockchipRga::get());
1912*4882a593Smuzhiyun 
1913*4882a593Smuzhiyun     if (usage & IM_ASYNC) {
1914*4882a593Smuzhiyun         if (release_fence_fd == NULL) {
1915*4882a593Smuzhiyun             IM_LOGW("Async mode release_fence_fd cannot be NULL!");
1916*4882a593Smuzhiyun             return IM_STATUS_ILLEGAL_PARAM;
1917*4882a593Smuzhiyun         }
1918*4882a593Smuzhiyun 
1919*4882a593Smuzhiyun         dstinfo.sync_mode = RGA_BLIT_ASYNC;
1920*4882a593Smuzhiyun 
1921*4882a593Smuzhiyun     } else if (usage & IM_SYNC) {
1922*4882a593Smuzhiyun         dstinfo.sync_mode = RGA_BLIT_SYNC;
1923*4882a593Smuzhiyun     }
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun     dstinfo.in_fence_fd = acquire_fence_fd;
1926*4882a593Smuzhiyun     dstinfo.core = opt.core ? opt.core : g_im2d_context.core;
1927*4882a593Smuzhiyun     dstinfo.priority = opt.priority ? opt.priority : g_im2d_context.priority;
1928*4882a593Smuzhiyun 
1929*4882a593Smuzhiyun     dstinfo.job_handle = job_handle;
1930*4882a593Smuzhiyun 
1931*4882a593Smuzhiyun     if (usage & IM_COLOR_FILL) {
1932*4882a593Smuzhiyun         dstinfo.color = opt.color;
1933*4882a593Smuzhiyun         ret = rkRga.RkRgaCollorFill(&dstinfo);
1934*4882a593Smuzhiyun     } else if (usage & IM_COLOR_PALETTE) {
1935*4882a593Smuzhiyun         ret = rkRga.RkRgaCollorPalette(&srcinfo, &dstinfo, &patinfo);
1936*4882a593Smuzhiyun     } else if ((usage & IM_ALPHA_BLEND_MASK) && rga_is_buffer_valid(pat)) {
1937*4882a593Smuzhiyun         ret = rkRga.RkRgaBlit(&srcinfo, &dstinfo, &patinfo);
1938*4882a593Smuzhiyun     }else {
1939*4882a593Smuzhiyun         ret = rkRga.RkRgaBlit(&srcinfo, &dstinfo, NULL);
1940*4882a593Smuzhiyun     }
1941*4882a593Smuzhiyun 
1942*4882a593Smuzhiyun     if (ret) {
1943*4882a593Smuzhiyun         IM_LOGE("Failed to call RockChipRga interface, please use 'dmesg' command to view driver error log.");
1944*4882a593Smuzhiyun         rga_dump_channel_info(IM_LOG_ERROR | IM_LOG_FORCE, "src", srect, src);
1945*4882a593Smuzhiyun         if (rga_is_buffer_valid(pat))
1946*4882a593Smuzhiyun             rga_dump_channel_info(IM_LOG_ERROR | IM_LOG_FORCE, "src1/pat", prect, pat);
1947*4882a593Smuzhiyun         rga_dump_channel_info(IM_LOG_ERROR | IM_LOG_FORCE, "dst", drect, dst);
1948*4882a593Smuzhiyun 
1949*4882a593Smuzhiyun         if (opt_ptr != NULL)
1950*4882a593Smuzhiyun             rga_dump_opt(IM_LOG_ERROR | IM_LOG_FORCE, *opt_ptr, usage);
1951*4882a593Smuzhiyun 
1952*4882a593Smuzhiyun         IM_LOGFE("acquir_fence[%d], release_fence_ptr[0x%lx], usage[0x%x]\n",
1953*4882a593Smuzhiyun                  acquire_fence_fd, (unsigned long)release_fence_fd, usage);
1954*4882a593Smuzhiyun 
1955*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1956*4882a593Smuzhiyun     }
1957*4882a593Smuzhiyun 
1958*4882a593Smuzhiyun     if (usage & IM_ASYNC)
1959*4882a593Smuzhiyun         *release_fence_fd = dstinfo.out_fence_fd;
1960*4882a593Smuzhiyun 
1961*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
1962*4882a593Smuzhiyun }
1963*4882a593Smuzhiyun 
rga_single_task_submit(rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,int acquire_fence_fd,int * release_fence_fd,im_opt_t * opt_ptr,int usage)1964*4882a593Smuzhiyun IM_STATUS rga_single_task_submit(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1965*4882a593Smuzhiyun                                  im_rect srect, im_rect drect, im_rect prect,
1966*4882a593Smuzhiyun                                  int acquire_fence_fd, int *release_fence_fd,
1967*4882a593Smuzhiyun                                  im_opt_t *opt_ptr, int usage) {
1968*4882a593Smuzhiyun     return rga_task_submit(0, src, dst, pat, srect, drect, prect, acquire_fence_fd, release_fence_fd, opt_ptr, usage);
1969*4882a593Smuzhiyun }
1970*4882a593Smuzhiyun 
rga_task_submit(im_job_handle_t job_handle,rga_buffer_t src,rga_buffer_t dst,rga_buffer_t pat,im_rect srect,im_rect drect,im_rect prect,im_opt_t * opt_ptr,int usage)1971*4882a593Smuzhiyun IM_STATUS rga_task_submit(im_job_handle_t job_handle, rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
1972*4882a593Smuzhiyun                           im_rect srect, im_rect drect, im_rect prect, im_opt_t *opt_ptr, int usage) {
1973*4882a593Smuzhiyun     return rga_task_submit(job_handle, src, dst, pat, srect, drect, prect, 0, NULL, opt_ptr, usage);
1974*4882a593Smuzhiyun }
1975*4882a593Smuzhiyun 
rga_job_create(uint32_t flags)1976*4882a593Smuzhiyun im_job_handle_t rga_job_create(uint32_t flags) {
1977*4882a593Smuzhiyun     int ret;
1978*4882a593Smuzhiyun     im_job_handle_t job_handle;
1979*4882a593Smuzhiyun     im_rga_job_t *job = NULL;
1980*4882a593Smuzhiyun 
1981*4882a593Smuzhiyun     if (rga_get_context() != IM_STATUS_SUCCESS)
1982*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1983*4882a593Smuzhiyun 
1984*4882a593Smuzhiyun     if (ioctl(rgaCtx->rgaFd, RGA_IOC_REQUEST_CREATE, &flags) < 0) {
1985*4882a593Smuzhiyun         IM_LOGE(" %s(%d) start config fail: %s",__FUNCTION__, __LINE__,strerror(errno));
1986*4882a593Smuzhiyun         return IM_STATUS_FAILED;
1987*4882a593Smuzhiyun     }
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun     job_handle = flags;
1990*4882a593Smuzhiyun 
1991*4882a593Smuzhiyun     g_im2d_job_manager.mutex.lock();
1992*4882a593Smuzhiyun 
1993*4882a593Smuzhiyun     if (g_im2d_job_manager.job_map.count(job_handle) != 0) {
1994*4882a593Smuzhiyun         IM_LOGE("job_map error! handle[%d] already exists[%lu]!\n",
1995*4882a593Smuzhiyun                 job_handle, (unsigned long)g_im2d_job_manager.job_map.count(job_handle));
1996*4882a593Smuzhiyun         ret = IM_STATUS_FAILED;
1997*4882a593Smuzhiyun         goto error_cancel_job;
1998*4882a593Smuzhiyun     }
1999*4882a593Smuzhiyun 
2000*4882a593Smuzhiyun     job = (im_rga_job_t *)malloc(sizeof(*job));
2001*4882a593Smuzhiyun     if (job == NULL) {
2002*4882a593Smuzhiyun         IM_LOGE("rga job alloc error!\n");
2003*4882a593Smuzhiyun         ret = IM_STATUS_FAILED;
2004*4882a593Smuzhiyun         goto error_cancel_job;
2005*4882a593Smuzhiyun     }
2006*4882a593Smuzhiyun 
2007*4882a593Smuzhiyun     memset(job, 0x0, sizeof(*job));
2008*4882a593Smuzhiyun 
2009*4882a593Smuzhiyun     job->id = job_handle;
2010*4882a593Smuzhiyun     g_im2d_job_manager.job_map[job_handle] = job;
2011*4882a593Smuzhiyun     g_im2d_job_manager.job_count++;
2012*4882a593Smuzhiyun 
2013*4882a593Smuzhiyun     g_im2d_job_manager.mutex.unlock();
2014*4882a593Smuzhiyun 
2015*4882a593Smuzhiyun     return job_handle;
2016*4882a593Smuzhiyun 
2017*4882a593Smuzhiyun error_cancel_job:
2018*4882a593Smuzhiyun     g_im2d_job_manager.mutex.unlock();
2019*4882a593Smuzhiyun     rga_job_cancel(job_handle);
2020*4882a593Smuzhiyun 
2021*4882a593Smuzhiyun     return ret;
2022*4882a593Smuzhiyun }
2023*4882a593Smuzhiyun 
rga_job_cancel(im_job_handle_t job_handle)2024*4882a593Smuzhiyun IM_STATUS rga_job_cancel(im_job_handle_t job_handle) {
2025*4882a593Smuzhiyun     im_rga_job_t *job = NULL;
2026*4882a593Smuzhiyun 
2027*4882a593Smuzhiyun     if (rga_get_context() != IM_STATUS_SUCCESS)
2028*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2029*4882a593Smuzhiyun 
2030*4882a593Smuzhiyun     g_im2d_job_manager.mutex.lock();
2031*4882a593Smuzhiyun 
2032*4882a593Smuzhiyun     if (g_im2d_job_manager.job_map.count(job_handle) > 0) {
2033*4882a593Smuzhiyun         job = g_im2d_job_manager.job_map[job_handle];
2034*4882a593Smuzhiyun         if (job != NULL)
2035*4882a593Smuzhiyun             free(job);
2036*4882a593Smuzhiyun 
2037*4882a593Smuzhiyun         g_im2d_job_manager.job_map.erase(job_handle);
2038*4882a593Smuzhiyun     }
2039*4882a593Smuzhiyun 
2040*4882a593Smuzhiyun     g_im2d_job_manager.job_count--;
2041*4882a593Smuzhiyun 
2042*4882a593Smuzhiyun     g_im2d_job_manager.mutex.unlock();
2043*4882a593Smuzhiyun 
2044*4882a593Smuzhiyun     if (ioctl(rgaCtx->rgaFd, RGA_IOC_REQUEST_CANCEL, &job_handle) < 0) {
2045*4882a593Smuzhiyun         IM_LOGE(" %s(%d) start config fail: %s",__FUNCTION__, __LINE__,strerror(errno));
2046*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2047*4882a593Smuzhiyun     }
2048*4882a593Smuzhiyun 
2049*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
2050*4882a593Smuzhiyun }
2051*4882a593Smuzhiyun 
rga_job_submit(im_job_handle_t job_handle,int sync_mode,int acquire_fence_fd,int * release_fence_fd)2052*4882a593Smuzhiyun IM_STATUS rga_job_submit(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd) {
2053*4882a593Smuzhiyun     int ret;
2054*4882a593Smuzhiyun     im_rga_job_t *job = NULL;
2055*4882a593Smuzhiyun     struct rga_user_request submit_request;
2056*4882a593Smuzhiyun 
2057*4882a593Smuzhiyun     if (rga_get_context() != IM_STATUS_SUCCESS)
2058*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2059*4882a593Smuzhiyun 
2060*4882a593Smuzhiyun     g_im2d_job_manager.mutex.lock();
2061*4882a593Smuzhiyun 
2062*4882a593Smuzhiyun     if (g_im2d_job_manager.job_map.count(job_handle) == 0) {
2063*4882a593Smuzhiyun         IM_LOGE("job_handle[%d] is illegal!\n", job_handle);
2064*4882a593Smuzhiyun 
2065*4882a593Smuzhiyun         g_im2d_job_manager.mutex.unlock();
2066*4882a593Smuzhiyun         return IM_STATUS_ILLEGAL_PARAM;
2067*4882a593Smuzhiyun     }
2068*4882a593Smuzhiyun 
2069*4882a593Smuzhiyun     job = g_im2d_job_manager.job_map[job_handle];
2070*4882a593Smuzhiyun     if (job == NULL) {
2071*4882a593Smuzhiyun         IM_LOGE("job is NULL!\n");
2072*4882a593Smuzhiyun 
2073*4882a593Smuzhiyun         g_im2d_job_manager.mutex.unlock();
2074*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2075*4882a593Smuzhiyun     }
2076*4882a593Smuzhiyun 
2077*4882a593Smuzhiyun     memset(&submit_request, 0x0, sizeof(submit_request));
2078*4882a593Smuzhiyun 
2079*4882a593Smuzhiyun     submit_request.task_ptr = ptr_to_u64(&job->req);
2080*4882a593Smuzhiyun     submit_request.task_num = job->task_count;
2081*4882a593Smuzhiyun     submit_request.id = job->id;
2082*4882a593Smuzhiyun 
2083*4882a593Smuzhiyun     g_im2d_job_manager.job_map.erase(job_handle);
2084*4882a593Smuzhiyun     g_im2d_job_manager.job_count--;
2085*4882a593Smuzhiyun 
2086*4882a593Smuzhiyun     g_im2d_job_manager.mutex.unlock();
2087*4882a593Smuzhiyun 
2088*4882a593Smuzhiyun     free(job);
2089*4882a593Smuzhiyun 
2090*4882a593Smuzhiyun     switch (sync_mode) {
2091*4882a593Smuzhiyun         case IM_SYNC:
2092*4882a593Smuzhiyun             submit_request.sync_mode = RGA_BLIT_SYNC;
2093*4882a593Smuzhiyun             break;
2094*4882a593Smuzhiyun         case IM_ASYNC:
2095*4882a593Smuzhiyun             submit_request.sync_mode = RGA_BLIT_ASYNC;
2096*4882a593Smuzhiyun             break;
2097*4882a593Smuzhiyun         default:
2098*4882a593Smuzhiyun             IM_LOGE("illegal sync mode!\n");
2099*4882a593Smuzhiyun             return IM_STATUS_ILLEGAL_PARAM;
2100*4882a593Smuzhiyun     }
2101*4882a593Smuzhiyun 
2102*4882a593Smuzhiyun     submit_request.acquire_fence_fd = acquire_fence_fd;
2103*4882a593Smuzhiyun 
2104*4882a593Smuzhiyun     ret = ioctl(rgaCtx->rgaFd, RGA_IOC_REQUEST_SUBMIT, &submit_request);
2105*4882a593Smuzhiyun     if (ret < 0) {
2106*4882a593Smuzhiyun         IM_LOGE(" %s(%d) start config fail: %s",__FUNCTION__, __LINE__,strerror(errno));
2107*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2108*4882a593Smuzhiyun     }
2109*4882a593Smuzhiyun 
2110*4882a593Smuzhiyun     if ((sync_mode == IM_ASYNC) && release_fence_fd)
2111*4882a593Smuzhiyun         *release_fence_fd = submit_request.release_fence_fd;
2112*4882a593Smuzhiyun 
2113*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
2114*4882a593Smuzhiyun }
2115*4882a593Smuzhiyun 
rga_job_config(im_job_handle_t job_handle,int sync_mode,int acquire_fence_fd,int * release_fence_fd)2116*4882a593Smuzhiyun IM_STATUS rga_job_config(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd) {
2117*4882a593Smuzhiyun     int ret;
2118*4882a593Smuzhiyun     im_rga_job_t *job = NULL;
2119*4882a593Smuzhiyun     struct rga_user_request config_request;
2120*4882a593Smuzhiyun 
2121*4882a593Smuzhiyun     if (rga_get_context() != IM_STATUS_SUCCESS)
2122*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2123*4882a593Smuzhiyun 
2124*4882a593Smuzhiyun     g_im2d_job_manager.mutex.lock();
2125*4882a593Smuzhiyun 
2126*4882a593Smuzhiyun     if (g_im2d_job_manager.job_map.count(job_handle) == 0) {
2127*4882a593Smuzhiyun         IM_LOGE("job_handle[%d] is illegal!\n", job_handle);
2128*4882a593Smuzhiyun 
2129*4882a593Smuzhiyun         g_im2d_job_manager.mutex.unlock();
2130*4882a593Smuzhiyun         return IM_STATUS_ILLEGAL_PARAM;
2131*4882a593Smuzhiyun     }
2132*4882a593Smuzhiyun 
2133*4882a593Smuzhiyun     job = g_im2d_job_manager.job_map[job_handle];
2134*4882a593Smuzhiyun     if (job == NULL) {
2135*4882a593Smuzhiyun         IM_LOGE("job is NULL!\n");
2136*4882a593Smuzhiyun 
2137*4882a593Smuzhiyun         g_im2d_job_manager.mutex.unlock();
2138*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2139*4882a593Smuzhiyun     }
2140*4882a593Smuzhiyun 
2141*4882a593Smuzhiyun     memset(&config_request, 0x0, sizeof(config_request));
2142*4882a593Smuzhiyun 
2143*4882a593Smuzhiyun     config_request.task_ptr = ptr_to_u64(&job->req);
2144*4882a593Smuzhiyun     config_request.task_num = job->task_count;
2145*4882a593Smuzhiyun     config_request.id = job->id;
2146*4882a593Smuzhiyun 
2147*4882a593Smuzhiyun     g_im2d_job_manager.mutex.unlock();
2148*4882a593Smuzhiyun 
2149*4882a593Smuzhiyun     switch (sync_mode) {
2150*4882a593Smuzhiyun         case IM_SYNC:
2151*4882a593Smuzhiyun             config_request.sync_mode = RGA_BLIT_SYNC;
2152*4882a593Smuzhiyun             break;
2153*4882a593Smuzhiyun         case IM_ASYNC:
2154*4882a593Smuzhiyun             config_request.sync_mode = RGA_BLIT_ASYNC;
2155*4882a593Smuzhiyun             break;
2156*4882a593Smuzhiyun         default:
2157*4882a593Smuzhiyun             IM_LOGE("illegal sync mode!\n");
2158*4882a593Smuzhiyun             return IM_STATUS_ILLEGAL_PARAM;
2159*4882a593Smuzhiyun     }
2160*4882a593Smuzhiyun 
2161*4882a593Smuzhiyun     config_request.acquire_fence_fd = acquire_fence_fd;
2162*4882a593Smuzhiyun 
2163*4882a593Smuzhiyun     ret = ioctl(rgaCtx->rgaFd, RGA_IOC_REQUEST_CONFIG, &config_request);
2164*4882a593Smuzhiyun     if (ret < 0) {
2165*4882a593Smuzhiyun         IM_LOGE(" %s(%d) start config fail: %s",__FUNCTION__, __LINE__,strerror(errno));
2166*4882a593Smuzhiyun         return IM_STATUS_FAILED;
2167*4882a593Smuzhiyun     }
2168*4882a593Smuzhiyun 
2169*4882a593Smuzhiyun     if ((sync_mode == IM_ASYNC) && release_fence_fd)
2170*4882a593Smuzhiyun         *release_fence_fd = config_request.release_fence_fd;
2171*4882a593Smuzhiyun 
2172*4882a593Smuzhiyun     return IM_STATUS_SUCCESS;
2173*4882a593Smuzhiyun }
2174