1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2010 - 2015, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  */
15 
16 #ifndef __IA_CSS_FRAME_H__
17 #define __IA_CSS_FRAME_H__
18 
19 /* ISP2401 */
20 #include <ia_css_types.h>
21 
22 #include <ia_css_frame_format.h>
23 #include <ia_css_frame_public.h>
24 #include "dma.h"
25 
26 /*********************************************************************
27 ****	Frame INFO APIs
28 **********************************************************************/
29 /* @brief Sets the given width and alignment to the frame info
30  *
31  * @param
32  * @param[in]	info        The info to which parameters would set
33  * @param[in]	width       The width to be set to info
34  * @param[in]	aligned     The aligned to be set to info
35  * @return
36  */
37 void ia_css_frame_info_set_width(struct ia_css_frame_info *info,
38 				 unsigned int width,
39 				 unsigned int min_padded_width);
40 
41 /* @brief Sets the given format to the frame info
42  *
43  * @param
44  * @param[in]	info        The info to which parameters would set
45  * @param[in]	format      The format to be set to info
46  * @return
47  */
48 void ia_css_frame_info_set_format(struct ia_css_frame_info *info,
49 				  enum ia_css_frame_format format);
50 
51 /* @brief Sets the frame info with the given parameters
52  *
53  * @param
54  * @param[in]	info        The info to which parameters would set
55  * @param[in]	width       The width to be set to info
56  * @param[in]	height      The height to be set to info
57  * @param[in]	format      The format to be set to info
58  * @param[in]	aligned     The aligned to be set to info
59  * @return
60  */
61 void ia_css_frame_info_init(struct ia_css_frame_info *info,
62 			    unsigned int width,
63 			    unsigned int height,
64 			    enum ia_css_frame_format format,
65 			    unsigned int aligned);
66 
67 /* @brief Checks whether 2 frame infos has the same resolution
68  *
69  * @param
70  * @param[in]	frame_a         The first frame to be compared
71  * @param[in]	frame_b         The second frame to be compared
72  * @return      Returns true if the frames are equal
73  */
74 bool ia_css_frame_info_is_same_resolution(
75     const struct ia_css_frame_info *info_a,
76     const struct ia_css_frame_info *info_b);
77 
78 /* @brief Check the frame info is valid
79  *
80  * @param
81  * @param[in]	info       The frame attributes to be initialized
82  * @return	The error code.
83  */
84 int ia_css_frame_check_info(const struct ia_css_frame_info *info);
85 
86 /*********************************************************************
87 ****	Frame APIs
88 **********************************************************************/
89 
90 /* @brief Initialize the plane depending on the frame type
91  *
92  * @param
93  * @param[in]	frame           The frame attributes to be initialized
94  * @return	The error code.
95  */
96 int ia_css_frame_init_planes(struct ia_css_frame *frame);
97 
98 /* @brief Free an array of frames
99  *
100  * @param
101  * @param[in]	num_frames      The number of frames to be freed in the array
102  * @param[in]   **frames_array  The array of frames to be removed
103  * @return
104  */
105 void ia_css_frame_free_multiple(unsigned int num_frames,
106 				struct ia_css_frame **frames_array);
107 
108 /* @brief Allocate a CSS frame structure of given size in bytes..
109  *
110  * @param	frame	The allocated frame.
111  * @param[in]	size_bytes	The frame size in bytes.
112  * @return	The error code.
113  *
114  * Allocate a frame using the given size in bytes.
115  * The frame structure is partially null initialized.
116  */
117 int ia_css_frame_allocate_with_buffer_size(struct ia_css_frame **frame,
118 					   const unsigned int size_bytes);
119 
120 /* @brief Check whether 2 frames are same type
121  *
122  * @param
123  * @param[in]	frame_a         The first frame to be compared
124  * @param[in]	frame_b         The second frame to be compared
125  * @return      Returns true if the frames are equal
126  */
127 bool ia_css_frame_is_same_type(
128     const struct ia_css_frame *frame_a,
129     const struct ia_css_frame *frame_b);
130 
131 /* @brief Configure a dma port from frame info
132  *
133  * @param
134  * @param[in]	config         The DAM port configuration
135  * @param[in]	info           The frame info
136  * @return
137  */
138 int ia_css_dma_configure_from_info(struct dma_port_config *config,
139 				   const struct ia_css_frame_info *info);
140 
141 unsigned int ia_css_frame_pad_width(unsigned int width, enum ia_css_frame_format format);
142 
143 #endif /* __IA_CSS_FRAME_H__ */
144