File Index
Files and directories
Sign in
FILE

atomisp_subdev.h

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/media/atomisp/pci/atomisp_subdev.h C
  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
 27struct 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
 35struct atomisp_sub_device;
 36
 37struct 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
 91struct 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 */
101struct 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
155struct 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
206struct atomisp_css_params_with_list {
207	/* parameters for CSS */
208	struct atomisp_css_params params;
209	struct list_head list;
210};
211
212struct 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
297extern const struct atomisp_in_fmt_conv atomisp_in_fmt_conv[];
298
299u32 atomisp_subdev_uncompressed_code(u32 code);
300bool atomisp_subdev_is_compressed(u32 code);
301const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv(u32 code);
302
303/* ISP2400 */
304const 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 */
308const struct atomisp_in_fmt_conv
309*atomisp_find_in_fmt_conv_by_atomisp_in_fmt(enum atomisp_input_format
310	atomisp_in_fmt);
311
312const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_compressed(u32 code);
313bool atomisp_subdev_format_conversion(struct atomisp_sub_device *asd);
314
315/* Get pointer to appropriate format */
316struct 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);
320struct 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);
324int 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 */
329void 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
334void atomisp_subdev_cleanup_pending_events(struct atomisp_sub_device *asd);
335
336void atomisp_subdev_unregister_entities(struct atomisp_sub_device *asd);
337int atomisp_subdev_register_subdev(struct atomisp_sub_device *asd,
338				   struct v4l2_device *vdev);
339int atomisp_subdev_init(struct atomisp_device *isp);
340void atomisp_subdev_cleanup(struct atomisp_device *isp);
341
342#endif /* __ATOMISP_SUBDEV_H__ */
~/ Read-only file preview.