xref: /OK3568_Linux_fs/external/linux-rga/im2d_api/src/im2d_impl.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
3  * Authors:
4  *  Cerf Yu <cerf.yu@rock-chips.com>
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #ifndef _RGA_IM2D_IMPL_H_
20 #define _RGA_IM2D_IMPL_H_
21 
22 #include "drmrga.h"
23 #include "im2d.h"
24 #include "im2d_hardware.h"
25 #include <map>
26 #include <mutex>
27 
28 #define ALIGN(val, align) (((val) + ((align) - 1)) & ~((align) - 1))
29 #define DOWN_ALIGN(val, align) ((val) & ~((align) - 1))
30 #define UNUSED(...) (void)(__VA_ARGS__)
31 /*
32  * version bit:
33  *     0~7b   build
34  *     8~15b  revision
35  *     16~23b minor
36  *     24~31b major
37  */
38 #define RGA_GET_API_VERSION(v) {\
39     (((v) >> 24) & 0xff), \
40     (((v) >> 16) & 0xff), \
41     (((v) >> 8) & 0xff), \
42     {0}\
43     }
44 #define RGA_SET_VERSION(major, minor, revision) \
45     (struct rga_version_t) { \
46     (major), (minor), (revision),  \
47     RGA_VERSION_STR(major) "." RGA_VERSION_STR(minor) "." RGA_VERSION_STR(revision) \
48     }
49 #define RGA_SET_CURRENT_API_VERSION (\
50     RGA_SET_VERSION(RGA_API_MAJOR_VERSION, RGA_API_MINOR_VERSION, RGA_API_REVISION_VERSION) \
51     )
52 
53 
54 typedef struct rga_version_check_ops {
55     IM_STATUS (*get_current_index_failed)(rga_version_t &current, rga_version_t &minimum);
56     IM_STATUS (*get_minimum_index_failed)(rga_version_t &current, rga_version_t &minimum);
57     IM_STATUS (*witnin_minimun_range)(rga_version_t &current, rga_version_t &minimum);
58     IM_STATUS (*above_minimun_range)(rga_version_t &current, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table);
59     IM_STATUS (*below_minimun_range)(rga_version_t &current, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table);
60 } rga_version_check_ops_t;
61 
62 typedef struct im_context {
63     int priority;
64     IM_SCHEDULER_CORE core;
65     int check_mode;
66 } im_context_t;
67 
68 typedef struct im_rga_job {
69     struct rga_req req[RGA_TASK_NUM_MAX];
70     int task_count;
71 
72     int id;
73 } im_rga_job_t;
74 
75 struct im2d_job_manager {
76     std::map<im_job_handle_t, im_rga_job_t *> job_map;
77     int job_count;
78 
79     std::mutex mutex;
80 };
81 
82 int rga_version_compare(struct rga_version_t version1, struct rga_version_t version2);
83 int rga_version_table_get_current_index(rga_version_t &version, const rga_version_bind_table_entry_t *table, int table_size);
84 int rga_version_table_get_minimum_index(rga_version_t &version, const rga_version_bind_table_entry_t *table, int table_size);
85 int rga_version_table_check_minimum_range(rga_version_t &version,
86                                           const rga_version_bind_table_entry_t *table,
87                                           int table_size, int index);
88 
89 bool rga_is_buffer_valid(rga_buffer_t buf);
90 bool rga_is_rect_valid(im_rect rect);
91 void empty_structure(rga_buffer_t *src, rga_buffer_t *dst, rga_buffer_t *pat,
92                                 im_rect *srect, im_rect *drect, im_rect *prect, im_opt_t *opt);
93 IM_STATUS rga_set_buffer_info(rga_buffer_t dst, rga_info_t* dstinfo);
94 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 inline void rga_apply_rect(rga_buffer_t *image, im_rect *rect) {
96     if (rect->width > 0 && rect->height > 0) {
97         image->width = rect->width;
98         image->height = rect->height;
99     }
100 }
101 
102 IM_STATUS rga_get_info(rga_info_table_entry *return_table);
103 
104 IM_STATUS rga_check_header(rga_version_t header_version);
105 IM_STATUS rga_check_driver(rga_version_t &driver_version);
106 IM_STATUS rga_check_external(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
107                              const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect,
108                              int mode_usage);
109 
110 IM_API IM_STATUS rga_import_buffers(struct rga_buffer_pool *buffer_pool);
111 IM_API IM_STATUS rga_release_buffers(struct rga_buffer_pool *buffer_pool);
112 IM_API rga_buffer_handle_t rga_import_buffer(uint64_t memory, int type, uint32_t size);
113 IM_API rga_buffer_handle_t rga_import_buffer(uint64_t memory, int type, im_handle_param_t *param);
114 IM_API IM_STATUS rga_release_buffer(int handle);
115 
116 IM_STATUS rga_get_opt(im_opt_t *opt, void *ptr);
117 
118 IM_STATUS rga_single_task_submit(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
119                                  im_rect srect, im_rect drect, im_rect prect,
120                                  int acquire_fence_fd, int *release_fence_fd,
121                                  im_opt_t *opt_ptr, int usage);
122 IM_STATUS rga_task_submit(im_job_handle_t job_handle,
123                           rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
124                           im_rect srect, im_rect drect, im_rect prect,
125                           im_opt_t *opt_ptr, int usage);
126 
127 im_job_handle_t rga_job_create(uint32_t flags);
128 IM_STATUS rga_job_cancel(im_job_handle_t job_handle);
129 IM_STATUS rga_job_submit(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd);
130 IM_STATUS rga_job_config(im_job_handle_t job_handle, int sync_mode, int acquire_fence_fd, int *release_fence_fd);
131 
132 #endif
133