xref: /openbmc/linux/drivers/media/platform/amphion/vpu_helpers.h (revision d76231e460fbaba7115212bf55f1eab35aba6223)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2020-2021 NXP
4  */
5 
6 #ifndef _AMPHION_VPU_HELPERS_H
7 #define _AMPHION_VPU_HELPERS_H
8 
9 struct vpu_pair {
10 	u32 src;
11 	u32 dst;
12 };
13 
14 #define MAKE_TIMESTAMP(s, ns)		(((s32)(s) * NSEC_PER_SEC) + (ns))
15 #define VPU_INVALID_TIMESTAMP		MAKE_TIMESTAMP(-1, 0)
16 
17 int vpu_helper_find_in_array_u8(const u8 *array, u32 size, u32 x);
18 bool vpu_helper_check_type(struct vpu_inst *inst, u32 type);
19 const struct vpu_format *vpu_helper_find_format(struct vpu_inst *inst, u32 type, u32 pixelfmt);
20 const struct vpu_format *vpu_helper_enum_format(struct vpu_inst *inst, u32 type, int index);
21 u32 vpu_helper_valid_frame_width(struct vpu_inst *inst, u32 width);
22 u32 vpu_helper_valid_frame_height(struct vpu_inst *inst, u32 height);
23 u32 vpu_helper_get_plane_size(u32 fmt, u32 width, u32 height, int plane_no,
24 			      u32 stride, u32 interlaced, u32 *pbl);
25 u32 vpu_helper_copy_from_stream_buffer(struct vpu_buffer *stream_buffer,
26 				       u32 *rptr, u32 size, void *dst);
27 u32 vpu_helper_copy_to_stream_buffer(struct vpu_buffer *stream_buffer,
28 				     u32 *wptr, u32 size, void *src);
29 u32 vpu_helper_memset_stream_buffer(struct vpu_buffer *stream_buffer,
30 				    u32 *wptr, u8 val, u32 size);
31 u32 vpu_helper_get_free_space(struct vpu_inst *inst);
32 u32 vpu_helper_get_used_space(struct vpu_inst *inst);
33 int vpu_helper_g_volatile_ctrl(struct v4l2_ctrl *ctrl);
34 void vpu_helper_get_kmp_next(const u8 *pattern, int *next, int size);
35 int vpu_helper_kmp_search(u8 *s, int s_len, const u8 *p, int p_len, int *next);
36 int vpu_helper_kmp_search_in_stream_buffer(struct vpu_buffer *stream_buffer,
37 					   u32 offset, int bytesused,
38 					   const u8 *p, int p_len, int *next);
39 int vpu_helper_find_startcode(struct vpu_buffer *stream_buffer,
40 			      u32 pixelformat, u32 offset, u32 bytesused);
41 
42 static inline u32 vpu_helper_step_walk(struct vpu_buffer *stream_buffer, u32 pos, u32 step)
43 {
44 	pos += step;
45 	if (pos > stream_buffer->phys + stream_buffer->length)
46 		pos -= stream_buffer->length;
47 
48 	return pos;
49 }
50 
51 static inline u8 vpu_helper_read_byte(struct vpu_buffer *stream_buffer, u32 pos)
52 {
53 	u8 *pdata = (u8 *)stream_buffer->virt;
54 
55 	return pdata[pos % stream_buffer->length];
56 }
57 
58 int vpu_color_check_primaries(u32 primaries);
59 int vpu_color_check_transfers(u32 transfers);
60 int vpu_color_check_matrix(u32 matrix);
61 int vpu_color_check_full_range(u32 full_range);
62 u32 vpu_color_cvrt_primaries_v2i(u32 primaries);
63 u32 vpu_color_cvrt_primaries_i2v(u32 primaries);
64 u32 vpu_color_cvrt_transfers_v2i(u32 transfers);
65 u32 vpu_color_cvrt_transfers_i2v(u32 transfers);
66 u32 vpu_color_cvrt_matrix_v2i(u32 matrix);
67 u32 vpu_color_cvrt_matrix_i2v(u32 matrix);
68 u32 vpu_color_cvrt_full_range_v2i(u32 full_range);
69 u32 vpu_color_cvrt_full_range_i2v(u32 full_range);
70 int vpu_color_get_default(u32 primaries, u32 *ptransfers, u32 *pmatrix, u32 *pfull_range);
71 
72 int vpu_find_dst_by_src(struct vpu_pair *pairs, u32 cnt, u32 src);
73 int vpu_find_src_by_dst(struct vpu_pair *pairs, u32 cnt, u32 dst);
74 #endif
75