xref: /OK3568_Linux_fs/external/linux-rga/im2d_api/src/im2d_impl.h (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 #ifndef _RGA_IM2D_IMPL_H_
20*4882a593Smuzhiyun #define _RGA_IM2D_IMPL_H_
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include "drmrga.h"
23*4882a593Smuzhiyun #include "im2d.h"
24*4882a593Smuzhiyun #include "im2d_hardware.h"
25*4882a593Smuzhiyun #include <map>
26*4882a593Smuzhiyun #include <mutex>
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define ALIGN(val, align) (((val) + ((align) - 1)) & ~((align) - 1))
29*4882a593Smuzhiyun #define DOWN_ALIGN(val, align) ((val) & ~((align) - 1))
30*4882a593Smuzhiyun #define UNUSED(...) (void)(__VA_ARGS__)
31*4882a593Smuzhiyun /*
32*4882a593Smuzhiyun  * version bit:
33*4882a593Smuzhiyun  *     0~7b   build
34*4882a593Smuzhiyun  *     8~15b  revision
35*4882a593Smuzhiyun  *     16~23b minor
36*4882a593Smuzhiyun  *     24~31b major
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun #define RGA_GET_API_VERSION(v) {\
39*4882a593Smuzhiyun     (((v) >> 24) & 0xff), \
40*4882a593Smuzhiyun     (((v) >> 16) & 0xff), \
41*4882a593Smuzhiyun     (((v) >> 8) & 0xff), \
42*4882a593Smuzhiyun     {0}\
43*4882a593Smuzhiyun     }
44*4882a593Smuzhiyun #define RGA_SET_VERSION(major, minor, revision) \
45*4882a593Smuzhiyun     (struct rga_version_t) { \
46*4882a593Smuzhiyun     (major), (minor), (revision),  \
47*4882a593Smuzhiyun     RGA_VERSION_STR(major) "." RGA_VERSION_STR(minor) "." RGA_VERSION_STR(revision) \
48*4882a593Smuzhiyun     }
49*4882a593Smuzhiyun #define RGA_SET_CURRENT_API_VERSION (\
50*4882a593Smuzhiyun     RGA_SET_VERSION(RGA_API_MAJOR_VERSION, RGA_API_MINOR_VERSION, RGA_API_REVISION_VERSION) \
51*4882a593Smuzhiyun     )
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun typedef struct rga_version_check_ops {
55*4882a593Smuzhiyun     IM_STATUS (*get_current_index_failed)(rga_version_t &current, rga_version_t &minimum);
56*4882a593Smuzhiyun     IM_STATUS (*get_minimum_index_failed)(rga_version_t &current, rga_version_t &minimum);
57*4882a593Smuzhiyun     IM_STATUS (*witnin_minimun_range)(rga_version_t &current, rga_version_t &minimum);
58*4882a593Smuzhiyun     IM_STATUS (*above_minimun_range)(rga_version_t &current, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table);
59*4882a593Smuzhiyun     IM_STATUS (*below_minimun_range)(rga_version_t &current, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table);
60*4882a593Smuzhiyun } rga_version_check_ops_t;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun typedef struct im_context {
63*4882a593Smuzhiyun     int priority;
64*4882a593Smuzhiyun     IM_SCHEDULER_CORE core;
65*4882a593Smuzhiyun     int check_mode;
66*4882a593Smuzhiyun } im_context_t;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun typedef struct im_rga_job {
69*4882a593Smuzhiyun     struct rga_req req[RGA_TASK_NUM_MAX];
70*4882a593Smuzhiyun     int task_count;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun     int id;
73*4882a593Smuzhiyun } im_rga_job_t;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct im2d_job_manager {
76*4882a593Smuzhiyun     std::map<im_job_handle_t, im_rga_job_t *> job_map;
77*4882a593Smuzhiyun     int job_count;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun     std::mutex mutex;
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun int rga_version_compare(struct rga_version_t version1, struct rga_version_t version2);
83*4882a593Smuzhiyun int rga_version_table_get_current_index(rga_version_t &version, const rga_version_bind_table_entry_t *table, int table_size);
84*4882a593Smuzhiyun int rga_version_table_get_minimum_index(rga_version_t &version, const rga_version_bind_table_entry_t *table, int table_size);
85*4882a593Smuzhiyun int rga_version_table_check_minimum_range(rga_version_t &version,
86*4882a593Smuzhiyun                                           const rga_version_bind_table_entry_t *table,
87*4882a593Smuzhiyun                                           int table_size, int index);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun bool rga_is_buffer_valid(rga_buffer_t buf);
90*4882a593Smuzhiyun bool rga_is_rect_valid(im_rect rect);
91*4882a593Smuzhiyun void empty_structure(rga_buffer_t *src, rga_buffer_t *dst, rga_buffer_t *pat,
92*4882a593Smuzhiyun                                 im_rect *srect, im_rect *drect, im_rect *prect, im_opt_t *opt);
93*4882a593Smuzhiyun IM_STATUS rga_set_buffer_info(rga_buffer_t dst, rga_info_t* dstinfo);
94*4882a593Smuzhiyun IM_STATUS rga_set_buffer_info(const rga_buffer_t src, rga_buffer_t dst, rga_info_t* srcinfo, rga_info_t* dstinfo);
rga_apply_rect(rga_buffer_t * image,im_rect * rect)95*4882a593Smuzhiyun inline void rga_apply_rect(rga_buffer_t *image, im_rect *rect) {
96*4882a593Smuzhiyun     if (rect->width > 0 && rect->height > 0) {
97*4882a593Smuzhiyun         image->width = rect->width;
98*4882a593Smuzhiyun         image->height = rect->height;
99*4882a593Smuzhiyun     }
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun IM_STATUS rga_get_info(rga_info_table_entry *return_table);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun IM_STATUS rga_check_header(rga_version_t header_version);
105*4882a593Smuzhiyun IM_STATUS rga_check_driver(rga_version_t &driver_version);
106*4882a593Smuzhiyun IM_STATUS rga_check_external(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
107*4882a593Smuzhiyun                              const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect,
108*4882a593Smuzhiyun                              int mode_usage);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun IM_API IM_STATUS rga_import_buffers(struct rga_buffer_pool *buffer_pool);
111*4882a593Smuzhiyun IM_API IM_STATUS rga_release_buffers(struct rga_buffer_pool *buffer_pool);
112*4882a593Smuzhiyun IM_API rga_buffer_handle_t rga_import_buffer(uint64_t memory, int type, uint32_t size);
113*4882a593Smuzhiyun IM_API rga_buffer_handle_t rga_import_buffer(uint64_t memory, int type, im_handle_param_t *param);
114*4882a593Smuzhiyun IM_API IM_STATUS rga_release_buffer(int handle);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun IM_STATUS rga_get_opt(im_opt_t *opt, void *ptr);
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun IM_STATUS rga_single_task_submit(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
119*4882a593Smuzhiyun                                  im_rect srect, im_rect drect, im_rect prect,
120*4882a593Smuzhiyun                                  int acquire_fence_fd, int *release_fence_fd,
121*4882a593Smuzhiyun                                  im_opt_t *opt_ptr, int usage);
122*4882a593Smuzhiyun IM_STATUS rga_task_submit(im_job_handle_t job_handle,
123*4882a593Smuzhiyun                           rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
124*4882a593Smuzhiyun                           im_rect srect, im_rect drect, im_rect prect,
125*4882a593Smuzhiyun                           im_opt_t *opt_ptr, int usage);
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun im_job_handle_t rga_job_create(uint32_t flags);
128*4882a593Smuzhiyun IM_STATUS rga_job_cancel(im_job_handle_t job_handle);
129*4882a593Smuzhiyun IM_STATUS rga_job_submit(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd);
130*4882a593Smuzhiyun IM_STATUS rga_job_config(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #endif
133