GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / staging / media / atomisp / pci / atomisp_subdev.h
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
323         struct v4l2_ctrl *disable_dz;
324
325         struct {
326                 struct list_head fw;
327                 struct list_head memory_maps;
328                 struct ia_css_pipe *pipeline;
329                 bool extension_mode;
330                 struct ida ida;
331                 struct completion acc_done;
332                 void *acc_stages;
333         } acc;
334
335         struct atomisp_subdev_params params;
336
337         struct atomisp_stream_env stream_env[ATOMISP_INPUT_STREAM_NUM];
338
339         struct v4l2_pix_format dvs_envelop;
340         unsigned int s3a_bufs_in_css[IA_CSS_PIPE_ID_NUM];
341         unsigned int dis_bufs_in_css;
342
343         unsigned int metadata_bufs_in_css
344         [ATOMISP_INPUT_STREAM_NUM][IA_CSS_PIPE_ID_NUM];
345         /* The list of free and available metadata buffers for CSS */
346         struct list_head metadata[ATOMISP_METADATA_TYPE_NUM];
347         /* The list of metadata buffers which have been en-queued to CSS */
348         struct list_head metadata_in_css[ATOMISP_METADATA_TYPE_NUM];
349         /* The list of metadata buffers which are ready for userspace to get */
350         struct list_head metadata_ready[ATOMISP_METADATA_TYPE_NUM];
351
352         /* The list of free and available s3a stat buffers for CSS */
353         struct list_head s3a_stats;
354         /* The list of s3a stat buffers which have been en-queued to CSS */
355         struct list_head s3a_stats_in_css;
356         /* The list of s3a stat buffers which are ready for userspace to get */
357         struct list_head s3a_stats_ready;
358
359         struct list_head dis_stats;
360         struct list_head dis_stats_in_css;
361         spinlock_t dis_stats_lock;
362
363         struct ia_css_frame *vf_frame; /* TODO: needed? */
364         struct ia_css_frame *raw_output_frame;
365         enum atomisp_frame_status frame_status[VIDEO_MAX_FRAME];
366
367         /* This field specifies which camera (v4l2 input) is selected. */
368         int input_curr;
369         /* This field specifies which sensor is being selected when there
370            are multiple sensors connected to the same MIPI port. */
371         int sensor_curr;
372
373         atomic_t sof_count;
374         atomic_t sequence;      /* Sequence value that is assigned to buffer. */
375         atomic_t sequence_temp;
376
377         unsigned int streaming; /* Hold both mutex and lock to change this */
378         bool stream_prepared; /* whether css stream is created */
379
380         /* subdev index: will be used to show which subdev is holding the
381          * resource, like which camera is used by which subdev
382          */
383         unsigned int index;
384
385         /* delayed memory allocation for css */
386         struct completion init_done;
387         struct workqueue_struct *delayed_init_workq;
388         unsigned int delayed_init;
389         struct work_struct delayed_init_work;
390
391         unsigned int latest_preview_exp_id; /* CSS ZSL/SDV raw buffer id */
392
393         unsigned int mipi_frame_size;
394
395         bool copy_mode; /* CSI2+ use copy mode */
396         bool yuvpp_mode;        /* CSI2+ yuvpp pipe */
397
398         int raw_buffer_bitmap[ATOMISP_MAX_EXP_ID / 32 +
399                                                  1]; /* Record each Raw Buffer lock status */
400         int raw_buffer_locked_count;
401         spinlock_t raw_buffer_bitmap_lock;
402
403         /* ISP 2400 */
404         struct timer_list wdt;
405         unsigned int wdt_duration;      /* in jiffies */
406         unsigned long wdt_expires;
407
408         /* ISP2401 */
409         bool re_trigger_capture;
410
411         struct atomisp_resolution sensor_array_res;
412         bool high_speed_mode; /* Indicate whether now is a high speed mode */
413         int pending_capture_request; /* Indicates the number of pending capture requests. */
414
415         unsigned int preview_exp_id;
416         unsigned int postview_exp_id;
417 };
418
419 extern const struct atomisp_in_fmt_conv atomisp_in_fmt_conv[];
420
421 u32 atomisp_subdev_uncompressed_code(u32 code);
422 bool atomisp_subdev_is_compressed(u32 code);
423 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv(u32 code);
424
425 /* ISP2400 */
426 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(
427     enum atomisp_input_format atomisp_in_fmt);
428
429 /* ISP2401 */
430 const struct atomisp_in_fmt_conv
431 *atomisp_find_in_fmt_conv_by_atomisp_in_fmt(enum atomisp_input_format
432         atomisp_in_fmt);
433
434 const struct atomisp_in_fmt_conv *atomisp_find_in_fmt_conv_compressed(u32 code);
435 bool atomisp_subdev_format_conversion(struct atomisp_sub_device *asd,
436                                       unsigned int source_pad);
437 uint16_t atomisp_subdev_source_pad(struct video_device *vdev);
438
439 /* Get pointer to appropriate format */
440 struct v4l2_mbus_framefmt
441 *atomisp_subdev_get_ffmt(struct v4l2_subdev *sd,
442                          struct v4l2_subdev_state *sd_state, uint32_t which,
443                          uint32_t pad);
444 struct v4l2_rect *atomisp_subdev_get_rect(struct v4l2_subdev *sd,
445         struct v4l2_subdev_state *sd_state,
446         u32 which, uint32_t pad,
447         uint32_t target);
448 int atomisp_subdev_set_selection(struct v4l2_subdev *sd,
449                                  struct v4l2_subdev_state *sd_state,
450                                  u32 which, uint32_t pad, uint32_t target,
451                                  u32 flags, struct v4l2_rect *r);
452 /* Actually set the format */
453 void atomisp_subdev_set_ffmt(struct v4l2_subdev *sd,
454                              struct v4l2_subdev_state *sd_state,
455                              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__ */