xref: /linux/drivers/staging/media/atomisp/pci/atomisp_subdev.h (revision 0cdee263bc5e7b20f657ea09f9272f50c568f35b) !
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Medifield PNW Camera Imaging ISP subsystem.
4  *
5  * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
6  */
7 #ifndef __ATOMISP_SUBDEV_H__
8 #define __ATOMISP_SUBDEV_H__
9 
10 #include <media/v4l2-ctrls.h>
11 #include <media/v4l2-device.h>
12 #include <media/v4l2-subdev.h>
13 #include <media/videobuf2-v4l2.h>
14 #include "atomisp_common.h"
15 #include "atomisp_compat.h"
16 #include "atomisp_v4l2.h"
17 
18 #include "ia_css.h"
19 
20 /* EXP_ID's ranger is 1 ~ 250 */
21 #define ATOMISP_MAX_EXP_ID     (250)
22 
23 #define ATOMISP_SUBDEV_PAD_SINK			0
24 #define ATOMISP_SUBDEV_PAD_SOURCE		1
25 #define ATOMISP_SUBDEV_PADS_NUM			2
26 
27 struct atomisp_in_fmt_conv {
28 	u32     code;
29 	u8 bpp; /* bits per pixel */
30 	u8 depth; /* uncompressed */
31 	enum atomisp_input_format atomisp_in_fmt;
32 	enum ia_css_bayer_order bayer_order;
33 };
34 
35 struct atomisp_sub_device;
36 
37 struct atomisp_video_pipe {
38 	struct video_device vdev;
39 	enum v4l2_buf_type type;
40 	struct media_pad pad;
41 	struct media_pipeline pipe;
42 	struct vb2_queue vb_queue;
43 	/* Lock for vb_queue, when also taking isp->mutex this must be taken first! */
44 	struct mutex vb_queue_mutex;
45 	/* List of video-buffers handed over to the CSS  */
46 	struct list_head buffers_in_css;
47 	/* List of video-buffers handed over to the driver, but not yet to the CSS */
48 	struct list_head activeq;
49 	/*
50 	 * the buffers waiting for per-frame parameters, this is only valid
51 	 * in per-frame setting mode.
52 	 */
53 	struct list_head buffers_waiting_for_param;
54 	/* the link list to store per_frame parameters */
55 	struct list_head per_frame_params;
56 
57 	/* Filled through atomisp_get_css_frame_info() on queue setup */
58 	struct ia_css_frame_info frame_info;
59 
60 	/*
61 	 * irq_lock is used to protect video buffer state change operations and
62 	 * also to make activeq and capq operations atomic.
63 	 */
64 	spinlock_t irq_lock;
65 	unsigned int users;
66 
67 	struct atomisp_device *isp;
68 	struct v4l2_pix_format pix;
69 	u32 sh_fmt;
70 
71 	struct atomisp_sub_device *asd;
72 
73 	/*
74 	 * This frame_config_id is got from CSS when dequueues buffers from CSS,
75 	 * it is used to indicate which parameter it has applied.
76 	 */
77 	unsigned int frame_config_id[VIDEO_MAX_FRAME];
78 	/*
79 	 * This config id is set when camera HAL enqueues buffer, it has a
80 	 * non-zero value to indicate which parameter it needs to applu
81 	 */
82 	unsigned int frame_request_config_id[VIDEO_MAX_FRAME];
83 	struct atomisp_css_params_with_list *frame_params[VIDEO_MAX_FRAME];
84 };
85 
86 #define vq_to_pipe(queue) \
87 	container_of(queue, struct atomisp_video_pipe, vb_queue)
88 
89 #define vb_to_pipe(vb) vq_to_pipe((vb)->vb2_queue)
90 
91 struct atomisp_pad_format {
92 	struct v4l2_mbus_framefmt fmt;
93 	struct v4l2_rect crop;
94 	struct v4l2_rect compose;
95 };
96 
97 /*
98  * This structure is used to cache the CSS parameters, it aligns to
99  * struct ia_css_isp_config but without un-supported and deprecated parts.
100  */
101 struct atomisp_css_params {
102 	struct ia_css_wb_config   wb_config;
103 	struct ia_css_cc_config   cc_config;
104 	struct ia_css_tnr_config  tnr_config;
105 	struct ia_css_ecd_config  ecd_config;
106 	struct ia_css_ynr_config  ynr_config;
107 	struct ia_css_fc_config   fc_config;
108 	struct ia_css_formats_config formats_config;
109 	struct ia_css_cnr_config  cnr_config;
110 	struct ia_css_macc_config macc_config;
111 	struct ia_css_ctc_config  ctc_config;
112 	struct ia_css_aa_config   aa_config;
113 	struct ia_css_aa_config   baa_config;
114 	struct ia_css_ce_config   ce_config;
115 	struct ia_css_ob_config   ob_config;
116 	struct ia_css_dp_config   dp_config;
117 	struct ia_css_de_config   de_config;
118 	struct ia_css_gc_config   gc_config;
119 	struct ia_css_nr_config   nr_config;
120 	struct ia_css_ee_config   ee_config;
121 	struct ia_css_anr_config  anr_config;
122 	struct ia_css_3a_config   s3a_config;
123 	struct ia_css_xnr_config  xnr_config;
124 	struct ia_css_dz_config   dz_config;
125 	struct ia_css_cc_config yuv2rgb_cc_config;
126 	struct ia_css_cc_config rgb2yuv_cc_config;
127 	struct ia_css_macc_table  macc_table;
128 	struct ia_css_gamma_table gamma_table;
129 	struct ia_css_ctc_table   ctc_table;
130 
131 	struct ia_css_xnr_table   xnr_table;
132 	struct ia_css_rgb_gamma_table r_gamma_table;
133 	struct ia_css_rgb_gamma_table g_gamma_table;
134 	struct ia_css_rgb_gamma_table b_gamma_table;
135 
136 	struct ia_css_vector      motion_vector;
137 	struct ia_css_anr_thres   anr_thres;
138 
139 	struct ia_css_dvs_6axis_config *dvs_6axis;
140 	struct ia_css_dvs2_coefficients *dvs2_coeff;
141 	struct ia_css_shading_table *shading_table;
142 	struct ia_css_morph_table   *morph_table;
143 
144 	/*
145 	 * Used to store the user pointer address of the frame. driver needs to
146 	 * translate to ia_css_frame * and then set to CSS.
147 	 */
148 	void		*output_frame;
149 	u32	isp_config_id;
150 
151 	/* Indicates which parameters need to be updated. */
152 	struct atomisp_parameters update_flag;
153 };
154 
155 struct atomisp_subdev_params {
156 	int yuv_ds_en;
157 	unsigned int color_effect;
158 	bool gdc_cac_en;
159 	bool macc_en;
160 	bool bad_pixel_en;
161 	bool video_dis_en;
162 	bool sc_en;
163 	bool fpn_en;
164 	bool xnr_en;
165 	bool low_light;
166 	int false_color;
167 	unsigned int histogram_elenum;
168 
169 	/* Current grid info */
170 	struct ia_css_grid_info curr_grid_info;
171 	enum ia_css_pipe_id s3a_enabled_pipe;
172 
173 	int s3a_output_bytes;
174 
175 	bool dis_proj_data_valid;
176 
177 	struct ia_css_dz_config   dz_config;  /** Digital Zoom */
178 	struct ia_css_capture_config   capture_config;
179 
180 	struct ia_css_isp_config config;
181 
182 	/* current configurations */
183 	struct atomisp_css_params css_param;
184 
185 	/*
186 	 * Intermediate buffers used to communicate data between
187 	 * CSS and user space.
188 	 */
189 	struct ia_css_3a_statistics *s3a_user_stat;
190 
191 	void *metadata_user[ATOMISP_METADATA_TYPE_NUM];
192 	u32 metadata_width_size;
193 
194 	struct ia_css_dvs2_statistics *dvs_stat;
195 	struct ia_css_dvs_6axis_config *dvs_6axis;
196 	u32 exp_id;
197 	int  dvs_hor_coef_bytes;
198 	int  dvs_ver_coef_bytes;
199 	int  dvs_ver_proj_bytes;
200 	int  dvs_hor_proj_bytes;
201 
202 	/* Flag to check if driver needs to update params to css */
203 	bool css_update_params_needed;
204 };
205 
206 struct atomisp_css_params_with_list {
207 	/* parameters for CSS */
208 	struct atomisp_css_params params;
209 	struct list_head list;
210 };
211 
212 struct atomisp_sub_device {
213 	struct v4l2_subdev subdev;
214 	struct media_pad pads[ATOMISP_SUBDEV_PADS_NUM];
215 	struct atomisp_pad_format fmt[ATOMISP_SUBDEV_PADS_NUM];
216 	/* Padding for currently set sink-pad fmt */
217 	u32 sink_pad_padding_w;
218 	u32 sink_pad_padding_h;
219 
220 	unsigned int output;
221 	struct atomisp_video_pipe video_out;
222 	struct atomisp_device *isp;
223 	struct v4l2_ctrl_handler ctrl_handler;
224 	struct v4l2_ctrl *run_mode;
225 	struct v4l2_ctrl *vfpp;
226 	struct v4l2_ctrl *continuous_raw_buffer_size;
227 	struct v4l2_ctrl *continuous_viewfinder;
228 	struct v4l2_ctrl *enable_raw_buffer_lock;
229 
230 	/* ISP2401 */
231 	struct v4l2_ctrl *ion_dev_fd;
232 
233 	struct v4l2_ctrl *disable_dz;
234 
235 	struct atomisp_subdev_params params;
236 
237 	struct atomisp_stream_env stream_env[ATOMISP_INPUT_STREAM_NUM];
238 
239 	struct v4l2_pix_format dvs_envelop;
240 	unsigned int s3a_bufs_in_css[IA_CSS_PIPE_ID_NUM];
241 	unsigned int dis_bufs_in_css;
242 
243 	unsigned int metadata_bufs_in_css
244 	[ATOMISP_INPUT_STREAM_NUM][IA_CSS_PIPE_ID_NUM];
245 	/* The list of free and available metadata buffers for CSS */
246 	struct list_head metadata[ATOMISP_METADATA_TYPE_NUM];
247 	/* The list of metadata buffers which have been en-queued to CSS */
248 	struct list_head metadata_in_css[ATOMISP_METADATA_TYPE_NUM];
249 	/* The list of metadata buffers which are ready for userspace to get */
250 	struct list_head metadata_ready[ATOMISP_METADATA_TYPE_NUM];
251 
252 	/* The list of free and available s3a stat buffers for CSS */
253 	struct list_head s3a_stats;
254 	/* The list of s3a stat buffers which have been en-queued to CSS */
255 	struct list_head s3a_stats_in_css;
256 	/* The list of s3a stat buffers which are ready for userspace to get */
257 	struct list_head s3a_stats_ready;
258 
259 	struct list_head dis_stats;
260 	struct list_head dis_stats_in_css;
261 	spinlock_t dis_stats_lock;
262 
263 	/* This field specifies which camera (v4l2 input) is selected. */
264 	int input_curr;
265 
266 	atomic_t sof_count;
267 	atomic_t sequence;      /* Sequence value that is assigned to buffer. */
268 	atomic_t sequence_temp;
269 
270 	/*
271 	 * Writers of streaming must hold both isp->mutex and isp->lock.
272 	 * Readers of streaming need to hold only one of the two locks.
273 	 */
274 	bool streaming;
275 	bool stream_prepared; /* whether css stream is created */
276 	bool recreate_streams_on_resume;
277 
278 	unsigned int latest_preview_exp_id; /* CSS ZSL/SDV raw buffer id */
279 
280 	bool copy_mode; /* CSI2+ use copy mode */
281 
282 	int raw_buffer_bitmap[ATOMISP_MAX_EXP_ID / 32 +
283 						 1]; /* Record each Raw Buffer lock status */
284 	int raw_buffer_locked_count;
285 	spinlock_t raw_buffer_bitmap_lock;
286 
287 	/* ISP2401 */
288 	bool re_trigger_capture;
289 
290 	struct atomisp_resolution sensor_array_res;
291 	bool high_speed_mode; /* Indicate whether now is a high speed mode */
292 
293 	unsigned int preview_exp_id;
294 	unsigned int postview_exp_id;
295 };
296 
297 extern const struct atomisp_in_fmt_conv atomisp_in_fmt_conv[];
298 
299 u32 atomisp_subdev_uncompressed_code(u32 code);
300 bool atomisp_subdev_is_compressed(u32 code);
301 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv(u32 code);
302 
303 /* ISP2400 */
304 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(
305     enum atomisp_input_format atomisp_in_fmt);
306 
307 /* ISP2401 */
308 const struct atomisp_in_fmt_conv
309 *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(enum atomisp_input_format
310 	atomisp_in_fmt);
311 
312 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_compressed(u32 code);
313 bool atomisp_subdev_format_conversion(struct atomisp_sub_device *asd);
314 
315 /* Get pointer to appropriate format */
316 struct v4l2_mbus_framefmt
317 *atomisp_subdev_get_ffmt(struct v4l2_subdev *sd,
318 			 struct v4l2_subdev_state *sd_state, uint32_t which,
319 			 uint32_t pad);
320 struct v4l2_rect *atomisp_subdev_get_rect(struct v4l2_subdev *sd,
321 	struct v4l2_subdev_state *sd_state,
322 	u32 which, uint32_t pad,
323 	uint32_t target);
324 int atomisp_subdev_set_selection(struct v4l2_subdev *sd,
325 				 struct v4l2_subdev_state *sd_state,
326 				 u32 which, uint32_t pad, uint32_t target,
327 				 u32 flags, struct v4l2_rect *r);
328 /* Actually set the format */
329 void atomisp_subdev_set_ffmt(struct v4l2_subdev *sd,
330 			     struct v4l2_subdev_state *sd_state,
331 			     uint32_t which,
332 			     u32 pad, struct v4l2_mbus_framefmt *ffmt);
333 
334 void atomisp_subdev_cleanup_pending_events(struct atomisp_sub_device *asd);
335 
336 void atomisp_subdev_unregister_entities(struct atomisp_sub_device *asd);
337 int atomisp_subdev_register_subdev(struct atomisp_sub_device *asd,
338 				   struct v4l2_device *vdev);
339 int atomisp_subdev_init(struct atomisp_device *isp);
340 void atomisp_subdev_cleanup(struct atomisp_device *isp);
341 
342 #endif /* __ATOMISP_SUBDEV_H__ */
343