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