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