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 ¤t, rga_version_t &minimum);
56 IM_STATUS (*get_minimum_index_failed)(rga_version_t ¤t, rga_version_t &minimum);
57 IM_STATUS (*witnin_minimun_range)(rga_version_t ¤t, rga_version_t &minimum);
58 IM_STATUS (*above_minimun_range)(rga_version_t ¤t, rga_version_t &minimum, const rga_version_bind_table_entry_t *least_version_table);
59 IM_STATUS (*below_minimun_range)(rga_version_t ¤t, 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