• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License version
9  * 2 as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  *
17  */
18 #ifndef __ATOMISP_SUBDEV_H__
19 #define __ATOMISP_SUBDEV_H__
20 
21 #include <media/v4l2-ctrls.h>
22 #include <media/v4l2-device.h>
23 #include <media/v4l2-subdev.h>
24 #include <media/videobuf-core.h>
25 
26 #include "atomisp_common.h"
27 #include "atomisp_compat.h"
28 #include "atomisp_v4l2.h"
29 
30 #include "ia_css.h"
31 
32 /* EXP_ID's ranger is 1 ~ 250 */
33 #define ATOMISP_MAX_EXP_ID     (250)
34 enum atomisp_subdev_input_entity {
35 	ATOMISP_SUBDEV_INPUT_NONE,
36 	ATOMISP_SUBDEV_INPUT_MEMORY,
37 	ATOMISP_SUBDEV_INPUT_CSI2,
38 	/*
39 	 * The following enum for CSI2 port must go together in one row.
40 	 * Otherwise it breaks the code logic.
41 	 */
42 	ATOMISP_SUBDEV_INPUT_CSI2_PORT1,
43 	ATOMISP_SUBDEV_INPUT_CSI2_PORT2,
44 	ATOMISP_SUBDEV_INPUT_CSI2_PORT3,
45 };
46 
47 #define ATOMISP_SUBDEV_PAD_SINK			0
48 /* capture output for still frames */
49 #define ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE	1
50 /* viewfinder output for downscaled capture output */
51 #define ATOMISP_SUBDEV_PAD_SOURCE_VF		2
52 /* preview output for display */
53 #define ATOMISP_SUBDEV_PAD_SOURCE_PREVIEW	3
54 /* main output for video pipeline */
55 #define ATOMISP_SUBDEV_PAD_SOURCE_VIDEO	4
56 #define ATOMISP_SUBDEV_PADS_NUM			5
57 
58 struct atomisp_in_fmt_conv {
59 	u32     code;
60 	u8 bpp; /* bits per pixel */
61 	u8 depth; /* uncompressed */
62 	enum atomisp_input_format atomisp_in_fmt;
63 	enum ia_css_bayer_order bayer_order;
64 };
65 
66 struct atomisp_sub_device;
67 
68 struct atomisp_video_pipe {
69 	struct video_device vdev;
70 	enum v4l2_buf_type type;
71 	struct media_pad pad;
72 	struct videobuf_queue capq;
73 	struct videobuf_queue outq;
74 	struct list_head activeq;
75 	struct list_head activeq_out;
76 	/*
77 	 * the buffers waiting for per-frame parameters, this is only valid
78 	 * in per-frame setting mode.
79 	 */
80 	struct list_head buffers_waiting_for_param;
81 	/* the link list to store per_frame parameters */
82 	struct list_head per_frame_params;
83 
84 	/* Store here the initial run mode */
85 	unsigned int default_run_mode;
86 
87 	unsigned int buffers_in_css;
88 
89 	/* irq_lock is used to protect video buffer state change operations and
90 	 * also to make activeq, activeq_out, capq and outq list
91 	 * operations atomic. */
92 	spinlock_t irq_lock;
93 	unsigned int users;
94 
95 	struct atomisp_device *isp;
96 	struct v4l2_pix_format pix;
97 	u32 sh_fmt;
98 
99 	struct atomisp_sub_device *asd;
100 
101 	/*
102 	 * This frame_config_id is got from CSS when dequueues buffers from CSS,
103 	 * it is used to indicate which parameter it has applied.
104 	 */
105 	unsigned int frame_config_id[VIDEO_MAX_FRAME];
106 	/*
107 	 * This config id is set when camera HAL enqueues buffer, it has a
108 	 * non-zero value to indicate which parameter it needs to applu
109 	 */
110 	unsigned int frame_request_config_id[VIDEO_MAX_FRAME];
111 	struct atomisp_css_params_with_list *frame_params[VIDEO_MAX_FRAME];
112 
113 	/*
114 	* move wdt from asd struct to create wdt for each pipe
115 	*/
116 	/* ISP2401 */
117 	struct timer_list wdt;
118 	unsigned int wdt_duration;	/* in jiffies */
119 	unsigned long wdt_expires;
120 	atomic_t wdt_count;
121 };
122 
123 struct atomisp_acc_pipe {
124 	struct video_device vdev;
125 	unsigned int users;
126 	bool running;
127 	struct atomisp_sub_device *asd;
128 	struct atomisp_device *isp;
129 };
130 
131 struct atomisp_pad_format {
132 	struct v4l2_mbus_framefmt fmt;
133 	struct v4l2_rect crop;
134 	struct v4l2_rect compose;
135 };
136 
137 /* Internal states for flash process */
138 enum atomisp_flash_state {
139 	ATOMISP_FLASH_IDLE,
140 	ATOMISP_FLASH_REQUESTED,
141 	ATOMISP_FLASH_ONGOING,
142 	ATOMISP_FLASH_DONE
143 };
144 
145 /*
146  * This structure is used to cache the CSS parameters, it aligns to
147  * struct ia_css_isp_config but without un-supported and deprecated parts.
148  */
149 struct atomisp_css_params {
150 	struct ia_css_wb_config   wb_config;
151 	struct ia_css_cc_config   cc_config;
152 	struct ia_css_tnr_config  tnr_config;
153 	struct ia_css_ecd_config  ecd_config;
154 	struct ia_css_ynr_config  ynr_config;
155 	struct ia_css_fc_config   fc_config;
156 	struct ia_css_formats_config formats_config;
157 	struct ia_css_cnr_config  cnr_config;
158 	struct ia_css_macc_config macc_config;
159 	struct ia_css_ctc_config  ctc_config;
160 	struct ia_css_aa_config   aa_config;
161 	struct ia_css_aa_config   baa_config;
162 	struct ia_css_ce_config   ce_config;
163 	struct ia_css_ob_config   ob_config;
164 	struct ia_css_dp_config   dp_config;
165 	struct ia_css_de_config   de_config;
166 	struct ia_css_gc_config   gc_config;
167 	struct ia_css_nr_config   nr_config;
168 	struct ia_css_ee_config   ee_config;
169 	struct ia_css_anr_config  anr_config;
170 	struct ia_css_3a_config   s3a_config;
171 	struct ia_css_xnr_config  xnr_config;
172 	struct ia_css_dz_config   dz_config;
173 	struct ia_css_cc_config yuv2rgb_cc_config;
174 	struct ia_css_cc_config rgb2yuv_cc_config;
175 	struct ia_css_macc_table  macc_table;
176 	struct ia_css_gamma_table gamma_table;
177 	struct ia_css_ctc_table   ctc_table;
178 
179 	struct ia_css_xnr_table   xnr_table;
180 	struct ia_css_rgb_gamma_table r_gamma_table;
181 	struct ia_css_rgb_gamma_table g_gamma_table;
182 	struct ia_css_rgb_gamma_table b_gamma_table;
183 
184 	struct ia_css_vector      motion_vector;
185 	struct ia_css_anr_thres   anr_thres;
186 
187 	struct ia_css_dvs_6axis_config *dvs_6axis;
188 	struct ia_css_dvs2_coefficients *dvs2_coeff;
189 	struct ia_css_shading_table *shading_table;
190 	struct ia_css_morph_table   *morph_table;
191 
192 	/*
193 	 * Used to store the user pointer address of the frame. driver needs to
194 	 * translate to ia_css_frame * and then set to CSS.
195 	 */
196 	void		*output_frame;
197 	u32	isp_config_id;
198 
199 	/* Indicates which parameters need to be updated. */
200 	struct atomisp_parameters update_flag;
201 };
202 
203 struct atomisp_subdev_params {
204 	/* FIXME: Determines whether raw capture buffer are being passed to
205 	 * user space. Unimplemented for now. */
206 	int online_process;
207 	int yuv_ds_en;
208 	unsigned int color_effect;
209 	bool gdc_cac_en;
210 	bool macc_en;
211 	bool bad_pixel_en;
212 	bool video_dis_en;
213 	bool sc_en;
214 	bool fpn_en;
215 	bool xnr_en;
216 	bool low_light;
217 	int false_color;
218 	unsigned int histogram_elenum;
219 
220 	/* Current grid info */
221 	struct ia_css_grid_info curr_grid_info;
222 	enum ia_css_pipe_id s3a_enabled_pipe;
223 
224 	int s3a_output_bytes;
225 
226 	bool dis_proj_data_valid;
227 
228 	struct ia_css_dz_config   dz_config;  /** Digital Zoom */
229 	struct ia_css_capture_config   capture_config;
230 
231 	struct ia_css_isp_config config;
232 
233 	/* current configurations */
234 	struct atomisp_css_params css_param;
235 
236 	/*
237 	 * Intermediate buffers used to communicate data between
238 	 * CSS and user space.
239 	 */
240 	struct ia_css_3a_statistics *s3a_user_stat;
241 
242 	void *metadata_user[ATOMISP_METADATA_TYPE_NUM];
243 	u32 metadata_width_size;
244 
245 	struct ia_css_dvs2_statistics *dvs_stat;
246 	struct ia_css_dvs_6axis_config *dvs_6axis;
247 	u32 exp_id;
248 	int  dvs_hor_coef_bytes;
249 	int  dvs_ver_coef_bytes;
250 	int  dvs_ver_proj_bytes;
251 	int  dvs_hor_proj_bytes;
252 
253 	/* Flash */
254 	int num_flash_frames;
255 	enum atomisp_flash_state flash_state;
256 	enum atomisp_frame_status last_frame_status;
257 
258 	/* continuous capture */
259 	struct atomisp_cont_capture_conf offline_parm;
260 	/* Flag to check if driver needs to update params to css */
261 	bool css_update_params_needed;
262 };
263 
264 struct atomisp_css_params_with_list {
265 	/* parameters for CSS */
266 	struct atomisp_css_params params;
267 	struct list_head list;
268 };
269 
270 struct atomisp_acc_fw {
271 	struct ia_css_fw_info *fw;
272 	unsigned int handle;
273 	unsigned int flags;
274 	unsigned int type;
275 	struct {
276 		size_t length;
277 		unsigned long css_ptr;
278 	} args[ATOMISP_ACC_NR_MEMORY];
279 	struct list_head list;
280 };
281 
282 struct atomisp_map {
283 	ia_css_ptr ptr;
284 	size_t length;
285 	struct list_head list;
286 	/* FIXME: should keep book which maps are currently used
287 	 * by binaries and not allow releasing those
288 	 * which are in use. Implement by reference counting.
289 	 */
290 };
291 
292 struct atomisp_sub_device {
293 	struct v4l2_subdev subdev;
294 	struct media_pad pads[ATOMISP_SUBDEV_PADS_NUM];
295 	struct atomisp_pad_format fmt[ATOMISP_SUBDEV_PADS_NUM];
296 	u16 capture_pad; /* main capture pad; defines much of isp config */
297 
298 	enum atomisp_subdev_input_entity input;
299 	unsigned int output;
300 	struct atomisp_video_pipe video_in;
301 	struct atomisp_video_pipe video_out_capture; /* capture output */
302 	struct atomisp_video_pipe video_out_vf;      /* viewfinder output */
303 	struct atomisp_video_pipe video_out_preview; /* preview output */
304 	struct atomisp_acc_pipe video_acc;
305 	/* video pipe main output */
306 	struct atomisp_video_pipe video_out_video_capture;
307 	/* struct isp_subdev_params params; */
308 	spinlock_t lock;
309 	struct atomisp_device *isp;
310 	struct v4l2_ctrl_handler ctrl_handler;
311 	struct v4l2_ctrl *fmt_auto;
312 	struct v4l2_ctrl *run_mode;
313 	struct v4l2_ctrl *depth_mode;
314 	struct v4l2_ctrl *vfpp;
315 	struct v4l2_ctrl *continuous_mode;
316 	struct v4l2_ctrl *continuous_raw_buffer_size;
317 	struct v4l2_ctrl *continuous_viewfinder;
318 	struct v4l2_ctrl *enable_raw_buffer_lock;
319 
320 	/* ISP2401 */
321 	struct v4l2_ctrl *ion_dev_fd;
322 	struct v4l2_ctrl *select_isp_version;
323 
324 	struct v4l2_ctrl *disable_dz;
325 
326 	struct {
327 		struct list_head fw;
328 		struct list_head memory_maps;
329 		struct ia_css_pipe *pipeline;
330 		bool extension_mode;
331 		struct ida ida;
332 		struct completion acc_done;
333 		void *acc_stages;
334 	} acc;
335 
336 	struct atomisp_subdev_params params;
337 
338 	struct atomisp_stream_env stream_env[ATOMISP_INPUT_STREAM_NUM];
339 
340 	struct v4l2_pix_format dvs_envelop;
341 	unsigned int s3a_bufs_in_css[IA_CSS_PIPE_ID_NUM];
342 	unsigned int dis_bufs_in_css;
343 
344 	unsigned int metadata_bufs_in_css
345 	[ATOMISP_INPUT_STREAM_NUM][IA_CSS_PIPE_ID_NUM];
346 	/* The list of free and available metadata buffers for CSS */
347 	struct list_head metadata[ATOMISP_METADATA_TYPE_NUM];
348 	/* The list of metadata buffers which have been en-queued to CSS */
349 	struct list_head metadata_in_css[ATOMISP_METADATA_TYPE_NUM];
350 	/* The list of metadata buffers which are ready for userspace to get */
351 	struct list_head metadata_ready[ATOMISP_METADATA_TYPE_NUM];
352 
353 	/* The list of free and available s3a stat buffers for CSS */
354 	struct list_head s3a_stats;
355 	/* The list of s3a stat buffers which have been en-queued to CSS */
356 	struct list_head s3a_stats_in_css;
357 	/* The list of s3a stat buffers which are ready for userspace to get */
358 	struct list_head s3a_stats_ready;
359 
360 	struct list_head dis_stats;
361 	struct list_head dis_stats_in_css;
362 	spinlock_t dis_stats_lock;
363 
364 	struct ia_css_frame *vf_frame; /* TODO: needed? */
365 	struct ia_css_frame *raw_output_frame;
366 	enum atomisp_frame_status frame_status[VIDEO_MAX_FRAME];
367 
368 	/* This field specifies which camera (v4l2 input) is selected. */
369 	int input_curr;
370 	/* This field specifies which sensor is being selected when there
371 	   are multiple sensors connected to the same MIPI port. */
372 	int sensor_curr;
373 
374 	atomic_t sof_count;
375 	atomic_t sequence;      /* Sequence value that is assigned to buffer. */
376 	atomic_t sequence_temp;
377 
378 	unsigned int streaming; /* Hold both mutex and lock to change this */
379 	bool stream_prepared; /* whether css stream is created */
380 
381 	/* subdev index: will be used to show which subdev is holding the
382 	 * resource, like which camera is used by which subdev
383 	 */
384 	unsigned int index;
385 
386 	/* delayed memory allocation for css */
387 	struct completion init_done;
388 	struct workqueue_struct *delayed_init_workq;
389 	unsigned int delayed_init;
390 	struct work_struct delayed_init_work;
391 
392 	unsigned int latest_preview_exp_id; /* CSS ZSL/SDV raw buffer id */
393 
394 	unsigned int mipi_frame_size;
395 
396 	bool copy_mode; /* CSI2+ use copy mode */
397 	bool yuvpp_mode;	/* CSI2+ yuvpp pipe */
398 
399 	int raw_buffer_bitmap[ATOMISP_MAX_EXP_ID / 32 +
400 						 1]; /* Record each Raw Buffer lock status */
401 	int raw_buffer_locked_count;
402 	spinlock_t raw_buffer_bitmap_lock;
403 
404 	/* ISP 2400 */
405 	struct timer_list wdt;
406 	unsigned int wdt_duration;	/* in jiffies */
407 	unsigned long wdt_expires;
408 
409 	/* ISP2401 */
410 	bool re_trigger_capture;
411 
412 	struct atomisp_resolution sensor_array_res;
413 	bool high_speed_mode; /* Indicate whether now is a high speed mode */
414 	int pending_capture_request; /* Indicates the number of pending capture requests. */
415 
416 	unsigned int preview_exp_id;
417 	unsigned int postview_exp_id;
418 };
419 
420 extern const struct atomisp_in_fmt_conv atomisp_in_fmt_conv[];
421 
422 u32 atomisp_subdev_uncompressed_code(u32 code);
423 bool atomisp_subdev_is_compressed(u32 code);
424 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv(u32 code);
425 
426 /* ISP2400 */
427 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(
428     enum atomisp_input_format atomisp_in_fmt);
429 
430 /* ISP2401 */
431 const struct atomisp_in_fmt_conv
432 *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(enum atomisp_input_format
433 	atomisp_in_fmt);
434 
435 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_compressed(u32 code);
436 bool atomisp_subdev_format_conversion(struct atomisp_sub_device *asd,
437 				      unsigned int source_pad);
438 uint16_t atomisp_subdev_source_pad(struct video_device *vdev);
439 
440 /* Get pointer to appropriate format */
441 struct v4l2_mbus_framefmt
442 *atomisp_subdev_get_ffmt(struct v4l2_subdev *sd,
443 			 struct v4l2_subdev_pad_config *cfg, uint32_t which,
444 			 uint32_t pad);
445 struct v4l2_rect *atomisp_subdev_get_rect(struct v4l2_subdev *sd,
446 	struct v4l2_subdev_pad_config *cfg,
447 	u32 which, uint32_t pad,
448 	uint32_t target);
449 int atomisp_subdev_set_selection(struct v4l2_subdev *sd,
450 				 struct v4l2_subdev_pad_config *cfg,
451 				 u32 which, uint32_t pad, uint32_t target,
452 				 u32 flags, struct v4l2_rect *r);
453 /* Actually set the format */
454 void atomisp_subdev_set_ffmt(struct v4l2_subdev *sd,
455 			     struct v4l2_subdev_pad_config *cfg, uint32_t which,
456 			     u32 pad, struct v4l2_mbus_framefmt *ffmt);
457 
458 int atomisp_update_run_mode(struct atomisp_sub_device *asd);
459 
460 void atomisp_subdev_cleanup_pending_events(struct atomisp_sub_device *asd);
461 
462 void atomisp_subdev_unregister_entities(struct atomisp_sub_device *asd);
463 int atomisp_subdev_register_entities(struct atomisp_sub_device *asd,
464 				     struct v4l2_device *vdev);
465 int atomisp_subdev_init(struct atomisp_device *isp);
466 void atomisp_subdev_cleanup(struct atomisp_device *isp);
467 int atomisp_create_pads_links(struct atomisp_device *isp);
468 
469 #endif /* __ATOMISP_SUBDEV_H__ */
470