1 /* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License version 2 and 5 * only version 2 as published by the Free Software Foundation. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 */ 12 #ifndef __MSMB_ISP__ 13 #define __MSMB_ISP__ 14 15 #include <linux/videodev2.h> 16 17 #define MAX_PLANES_PER_STREAM 3 18 #define MAX_NUM_STREAM 7 19 20 #define ISP_VERSION_47 47 21 #define ISP_VERSION_46 46 22 #define ISP_VERSION_44 44 23 #define ISP_VERSION_40 40 24 #define ISP_VERSION_32 32 25 #define ISP_NATIVE_BUF_BIT (0x10000 << 0) 26 #define ISP0_BIT (0x10000 << 1) 27 #define ISP1_BIT (0x10000 << 2) 28 #define ISP_META_CHANNEL_BIT (0x10000 << 3) 29 #define ISP_SCRATCH_BUF_BIT (0x10000 << 4) 30 #define ISP_STATS_STREAM_BIT 0x80000000 31 32 struct msm_vfe_cfg_cmd_list; 33 34 enum ISP_START_PIXEL_PATTERN { 35 ISP_BAYER_RGRGRG, 36 ISP_BAYER_GRGRGR, 37 ISP_BAYER_BGBGBG, 38 ISP_BAYER_GBGBGB, 39 ISP_YUV_YCbYCr, 40 ISP_YUV_YCrYCb, 41 ISP_YUV_CbYCrY, 42 ISP_YUV_CrYCbY, 43 ISP_PIX_PATTERN_MAX 44 }; 45 46 enum msm_vfe_plane_fmt { 47 Y_PLANE, 48 CB_PLANE, 49 CR_PLANE, 50 CRCB_PLANE, 51 CBCR_PLANE, 52 VFE_PLANE_FMT_MAX 53 }; 54 55 enum msm_vfe_input_src { 56 VFE_PIX_0, 57 VFE_RAW_0, 58 VFE_RAW_1, 59 VFE_RAW_2, 60 VFE_SRC_MAX, 61 }; 62 63 enum msm_vfe_axi_stream_src { 64 PIX_ENCODER, 65 PIX_VIEWFINDER, 66 PIX_VIDEO, 67 CAMIF_RAW, 68 IDEAL_RAW, 69 RDI_INTF_0, 70 RDI_INTF_1, 71 RDI_INTF_2, 72 VFE_AXI_SRC_MAX 73 }; 74 75 enum msm_vfe_frame_skip_pattern { 76 NO_SKIP, 77 EVERY_2FRAME, 78 EVERY_3FRAME, 79 EVERY_4FRAME, 80 EVERY_5FRAME, 81 EVERY_6FRAME, 82 EVERY_7FRAME, 83 EVERY_8FRAME, 84 EVERY_16FRAME, 85 EVERY_32FRAME, 86 SKIP_ALL, 87 SKIP_RANGE, 88 MAX_SKIP, 89 }; 90 91 enum msm_isp_stats_type { 92 MSM_ISP_STATS_AEC, /* legacy based AEC */ 93 MSM_ISP_STATS_AF, /* legacy based AF */ 94 MSM_ISP_STATS_AWB, /* legacy based AWB */ 95 MSM_ISP_STATS_RS, /* legacy based RS */ 96 MSM_ISP_STATS_CS, /* legacy based CS */ 97 MSM_ISP_STATS_IHIST, /* legacy based HIST */ 98 MSM_ISP_STATS_SKIN, /* legacy based SKIN */ 99 MSM_ISP_STATS_BG, /* Bayer Grids */ 100 MSM_ISP_STATS_BF, /* Bayer Focus */ 101 MSM_ISP_STATS_BE, /* Bayer Exposure*/ 102 MSM_ISP_STATS_BHIST, /* Bayer Hist */ 103 MSM_ISP_STATS_BF_SCALE, /* Bayer Focus scale */ 104 MSM_ISP_STATS_HDR_BE, /* HDR Bayer Exposure */ 105 MSM_ISP_STATS_HDR_BHIST, /* HDR Bayer Hist */ 106 MSM_ISP_STATS_AEC_BG, /* AEC BG */ 107 MSM_ISP_STATS_MAX /* MAX */ 108 }; 109 110 /* 111 * @stats_type_mask: Stats type mask (enum msm_isp_stats_type). 112 * @stream_src_mask: Stream src mask (enum msm_vfe_axi_stream_src) 113 * @skip_mode: skip pattern, if skip mode is range only then min/max is used 114 * @min_frame_id: minimum frame id (valid only if skip_mode = RANGE) 115 * @max_frame_id: maximum frame id (valid only if skip_mode = RANGE) 116 */ 117 struct msm_isp_sw_framskip { 118 uint32_t stats_type_mask; 119 uint32_t stream_src_mask; 120 enum msm_vfe_frame_skip_pattern skip_mode; 121 uint32_t min_frame_id; 122 uint32_t max_frame_id; 123 }; 124 125 enum msm_vfe_testgen_color_pattern { 126 COLOR_BAR_8_COLOR, 127 UNICOLOR_WHITE, 128 UNICOLOR_YELLOW, 129 UNICOLOR_CYAN, 130 UNICOLOR_GREEN, 131 UNICOLOR_MAGENTA, 132 UNICOLOR_RED, 133 UNICOLOR_BLUE, 134 UNICOLOR_BLACK, 135 MAX_COLOR, 136 }; 137 138 enum msm_vfe_camif_input { 139 CAMIF_DISABLED, 140 CAMIF_PAD_REG_INPUT, 141 CAMIF_MIDDI_INPUT, 142 CAMIF_MIPI_INPUT, 143 }; 144 145 struct msm_vfe_fetch_engine_cfg { 146 uint32_t input_format; 147 uint32_t buf_width; 148 uint32_t buf_height; 149 uint32_t fetch_width; 150 uint32_t fetch_height; 151 uint32_t x_offset; 152 uint32_t y_offset; 153 uint32_t buf_stride; 154 }; 155 156 /* 157 * Camif output general configuration 158 */ 159 struct msm_vfe_camif_subsample_cfg { 160 uint32_t irq_subsample_period; 161 uint32_t irq_subsample_pattern; 162 uint32_t sof_counter_step; 163 uint32_t pixel_skip; 164 uint32_t line_skip; 165 }; 166 167 /* 168 * Camif frame and window configuration 169 */ 170 struct msm_vfe_camif_cfg { 171 uint32_t lines_per_frame; 172 uint32_t pixels_per_line; 173 uint32_t first_pixel; 174 uint32_t last_pixel; 175 uint32_t first_line; 176 uint32_t last_line; 177 uint32_t epoch_line0; 178 uint32_t epoch_line1; 179 uint32_t hbi_cnt; 180 enum msm_vfe_camif_input camif_input; 181 struct msm_vfe_camif_subsample_cfg subsample_cfg; 182 }; 183 184 struct msm_vfe_testgen_cfg { 185 uint32_t lines_per_frame; 186 uint32_t pixels_per_line; 187 uint32_t v_blank; 188 uint32_t h_blank; 189 enum ISP_START_PIXEL_PATTERN pixel_bayer_pattern; 190 uint32_t rotate_period; 191 enum msm_vfe_testgen_color_pattern color_bar_pattern; 192 uint32_t burst_num_frame; 193 }; 194 195 enum msm_vfe_inputmux { 196 CAMIF, 197 TESTGEN, 198 EXTERNAL_READ, 199 }; 200 201 enum msm_vfe_stats_composite_group { 202 STATS_COMPOSITE_GRP_NONE, 203 STATS_COMPOSITE_GRP_1, 204 STATS_COMPOSITE_GRP_2, 205 STATS_COMPOSITE_GRP_MAX, 206 }; 207 208 struct msm_vfe_pix_cfg { 209 struct msm_vfe_camif_cfg camif_cfg; 210 struct msm_vfe_testgen_cfg testgen_cfg; 211 struct msm_vfe_fetch_engine_cfg fetch_engine_cfg; 212 enum msm_vfe_inputmux input_mux; 213 enum ISP_START_PIXEL_PATTERN pixel_pattern; 214 uint32_t input_format; 215 uint32_t is_split; 216 }; 217 218 struct msm_vfe_rdi_cfg { 219 uint8_t cid; 220 uint8_t frame_based; 221 }; 222 223 struct msm_vfe_input_cfg { 224 union { 225 struct msm_vfe_pix_cfg pix_cfg; 226 struct msm_vfe_rdi_cfg rdi_cfg; 227 } d; 228 enum msm_vfe_input_src input_src; 229 uint32_t input_pix_clk; 230 }; 231 232 struct msm_vfe_fetch_eng_start { 233 uint32_t session_id; 234 uint32_t stream_id; 235 uint32_t buf_idx; 236 uint32_t buf_addr; 237 }; 238 239 struct msm_vfe_axi_plane_cfg { 240 uint32_t output_width; /*Include padding*/ 241 uint32_t output_height; 242 uint32_t output_stride; 243 uint32_t output_scan_lines; 244 uint32_t output_plane_format; /*Y/Cb/Cr/CbCr*/ 245 uint32_t plane_addr_offset; 246 uint8_t csid_src; /*RDI 0-2*/ 247 uint8_t rdi_cid;/*CID 1-16*/ 248 }; 249 250 enum msm_stream_memory_input_t { 251 MEMORY_INPUT_DISABLED, 252 MEMORY_INPUT_ENABLED 253 }; 254 255 struct msm_vfe_axi_stream_request_cmd { 256 uint32_t session_id; 257 uint32_t stream_id; 258 uint32_t vt_enable; 259 uint32_t output_format;/*Planar/RAW/Misc*/ 260 enum msm_vfe_axi_stream_src stream_src; /*CAMIF/IDEAL/RDIs*/ 261 struct msm_vfe_axi_plane_cfg plane_cfg[MAX_PLANES_PER_STREAM]; 262 263 uint32_t burst_count; 264 uint32_t hfr_mode; 265 uint8_t frame_base; 266 267 uint32_t init_frame_drop; /*MAX 31 Frames*/ 268 enum msm_vfe_frame_skip_pattern frame_skip_pattern; 269 uint8_t buf_divert; /* if TRUE no vb2 buf done. */ 270 /*Return values*/ 271 uint32_t axi_stream_handle; 272 uint32_t controllable_output; 273 uint32_t burst_len; 274 /* Flag indicating memory input stream */ 275 enum msm_stream_memory_input_t memory_input; 276 }; 277 278 struct msm_vfe_axi_stream_release_cmd { 279 uint32_t stream_handle; 280 }; 281 282 enum msm_vfe_axi_stream_cmd { 283 STOP_STREAM, 284 START_STREAM, 285 STOP_IMMEDIATELY, 286 }; 287 288 struct msm_vfe_axi_stream_cfg_cmd { 289 uint8_t num_streams; 290 uint32_t stream_handle[MAX_NUM_STREAM]; 291 enum msm_vfe_axi_stream_cmd cmd; 292 }; 293 294 enum msm_vfe_axi_stream_update_type { 295 ENABLE_STREAM_BUF_DIVERT, 296 DISABLE_STREAM_BUF_DIVERT, 297 UPDATE_STREAM_FRAMEDROP_PATTERN, 298 UPDATE_STREAM_STATS_FRAMEDROP_PATTERN, 299 UPDATE_STREAM_AXI_CONFIG, 300 UPDATE_STREAM_REQUEST_FRAMES, 301 UPDATE_STREAM_ADD_BUFQ, 302 UPDATE_STREAM_REMOVE_BUFQ, 303 UPDATE_STREAM_SW_FRAME_DROP, 304 }; 305 306 enum msm_vfe_iommu_type { 307 IOMMU_ATTACH, 308 IOMMU_DETACH, 309 }; 310 311 enum msm_vfe_buff_queue_id { 312 VFE_BUF_QUEUE_DEFAULT, 313 VFE_BUF_QUEUE_SHARED, 314 VFE_BUF_QUEUE_MAX, 315 }; 316 317 struct msm_vfe_axi_stream_cfg_update_info { 318 uint32_t stream_handle; 319 uint32_t output_format; 320 uint32_t user_stream_id; 321 uint32_t frame_id; 322 enum msm_vfe_frame_skip_pattern skip_pattern; 323 struct msm_vfe_axi_plane_cfg plane_cfg[MAX_PLANES_PER_STREAM]; 324 struct msm_isp_sw_framskip sw_skip_info; 325 }; 326 327 struct msm_vfe_axi_halt_cmd { 328 uint32_t stop_camif; 329 uint32_t overflow_detected; 330 uint32_t blocking_halt; 331 }; 332 333 struct msm_vfe_axi_reset_cmd { 334 uint32_t blocking; 335 uint32_t frame_id; 336 }; 337 338 struct msm_vfe_axi_restart_cmd { 339 uint32_t enable_camif; 340 }; 341 342 struct msm_vfe_axi_stream_update_cmd { 343 uint32_t num_streams; 344 enum msm_vfe_axi_stream_update_type update_type; 345 struct msm_vfe_axi_stream_cfg_update_info 346 update_info[MSM_ISP_STATS_MAX]; 347 }; 348 349 struct msm_vfe_smmu_attach_cmd { 350 uint32_t security_mode; 351 uint32_t iommu_attach_mode; 352 }; 353 354 struct msm_vfe_stats_stream_request_cmd { 355 uint32_t session_id; 356 uint32_t stream_id; 357 enum msm_isp_stats_type stats_type; 358 uint32_t composite_flag; 359 uint32_t framedrop_pattern; 360 uint32_t init_frame_drop; /*MAX 31 Frames*/ 361 uint32_t irq_subsample_pattern; 362 uint32_t buffer_offset; 363 uint32_t stream_handle; 364 }; 365 366 struct msm_vfe_stats_stream_release_cmd { 367 uint32_t stream_handle; 368 }; 369 struct msm_vfe_stats_stream_cfg_cmd { 370 uint8_t num_streams; 371 uint32_t stream_handle[MSM_ISP_STATS_MAX]; 372 uint8_t enable; 373 uint32_t stats_burst_len; 374 }; 375 376 enum msm_vfe_reg_cfg_type { 377 VFE_WRITE, 378 VFE_WRITE_MB, 379 VFE_READ, 380 VFE_CFG_MASK, 381 VFE_WRITE_DMI_16BIT, 382 VFE_WRITE_DMI_32BIT, 383 VFE_WRITE_DMI_64BIT, 384 VFE_READ_DMI_16BIT, 385 VFE_READ_DMI_32BIT, 386 VFE_READ_DMI_64BIT, 387 GET_MAX_CLK_RATE, 388 GET_CLK_RATES, 389 GET_ISP_ID, 390 VFE_HW_UPDATE_LOCK, 391 VFE_HW_UPDATE_UNLOCK, 392 SET_WM_UB_SIZE, 393 SET_UB_POLICY, 394 }; 395 396 struct msm_vfe_cfg_cmd2 { 397 uint16_t num_cfg; 398 uint16_t cmd_len; 399 void __user *cfg_data; 400 void __user *cfg_cmd; 401 }; 402 403 struct msm_vfe_cfg_cmd_list { 404 struct msm_vfe_cfg_cmd2 cfg_cmd; 405 struct msm_vfe_cfg_cmd_list *next; 406 uint32_t next_size; 407 }; 408 409 struct msm_vfe_reg_rw_info { 410 uint32_t reg_offset; 411 uint32_t cmd_data_offset; 412 uint32_t len; 413 }; 414 415 struct msm_vfe_reg_mask_info { 416 uint32_t reg_offset; 417 uint32_t mask; 418 uint32_t val; 419 }; 420 421 struct msm_vfe_reg_dmi_info { 422 uint32_t hi_tbl_offset; /*Optional*/ 423 uint32_t lo_tbl_offset; /*Required*/ 424 uint32_t len; 425 }; 426 427 struct msm_vfe_reg_cfg_cmd { 428 union { 429 struct msm_vfe_reg_rw_info rw_info; 430 struct msm_vfe_reg_mask_info mask_info; 431 struct msm_vfe_reg_dmi_info dmi_info; 432 } u; 433 434 enum msm_vfe_reg_cfg_type cmd_type; 435 }; 436 437 enum msm_isp_buf_type { 438 ISP_PRIVATE_BUF, 439 ISP_SHARE_BUF, 440 MAX_ISP_BUF_TYPE, 441 }; 442 443 struct msm_isp_buf_request { 444 uint32_t session_id; 445 uint32_t stream_id; 446 uint8_t num_buf; 447 uint32_t handle; 448 enum msm_isp_buf_type buf_type; 449 }; 450 451 struct msm_isp_qbuf_plane { 452 uint32_t addr; 453 uint32_t offset; 454 uint32_t length; 455 }; 456 457 struct msm_isp_qbuf_buffer { 458 struct msm_isp_qbuf_plane planes[MAX_PLANES_PER_STREAM]; 459 uint32_t num_planes; 460 }; 461 462 struct msm_isp_qbuf_info { 463 uint32_t handle; 464 int32_t buf_idx; 465 /*Only used for prepare buffer*/ 466 struct msm_isp_qbuf_buffer buffer; 467 /*Only used for diverted buffer*/ 468 uint32_t dirty_buf; 469 }; 470 471 struct msm_isp_clk_rates { 472 uint32_t nominal_rate; 473 uint32_t high_rate; 474 }; 475 476 struct msm_vfe_axi_src_state { 477 enum msm_vfe_input_src input_src; 478 uint32_t src_active; 479 uint32_t src_frame_id; 480 }; 481 482 enum msm_isp_event_mask_index { 483 ISP_EVENT_MASK_INDEX_STATS_NOTIFY = 0, 484 ISP_EVENT_MASK_INDEX_ERROR = 1, 485 ISP_EVENT_MASK_INDEX_IOMMU_P_FAULT = 2, 486 ISP_EVENT_MASK_INDEX_STREAM_UPDATE_DONE = 3, 487 ISP_EVENT_MASK_INDEX_REG_UPDATE = 4, 488 ISP_EVENT_MASK_INDEX_SOF = 5, 489 ISP_EVENT_MASK_INDEX_BUF_DIVERT = 6, 490 ISP_EVENT_MASK_INDEX_COMP_STATS_NOTIFY = 7, 491 ISP_EVENT_MASK_INDEX_MASK_FE_READ_DONE = 8 492 }; 493 494 495 #define ISP_EVENT_SUBS_MASK_NONE 0 496 497 #define ISP_EVENT_SUBS_MASK_STATS_NOTIFY \ 498 (1 << ISP_EVENT_MASK_INDEX_STATS_NOTIFY) 499 500 #define ISP_EVENT_SUBS_MASK_ERROR \ 501 (1 << ISP_EVENT_MASK_INDEX_ERROR) 502 503 #define ISP_EVENT_SUBS_MASK_IOMMU_P_FAULT \ 504 (1 << ISP_EVENT_MASK_INDEX_IOMMU_P_FAULT) 505 506 #define ISP_EVENT_SUBS_MASK_STREAM_UPDATE_DONE \ 507 (1 << ISP_EVENT_MASK_INDEX_STREAM_UPDATE_DONE) 508 509 #define ISP_EVENT_SUBS_MASK_REG_UPDATE \ 510 (1 << ISP_EVENT_MASK_INDEX_REG_UPDATE) 511 512 #define ISP_EVENT_SUBS_MASK_SOF \ 513 (1 << ISP_EVENT_MASK_INDEX_SOF) 514 515 #define ISP_EVENT_SUBS_MASK_BUF_DIVERT \ 516 (1 << ISP_EVENT_MASK_INDEX_BUF_DIVERT) 517 518 #define ISP_EVENT_SUBS_MASK_COMP_STATS_NOTIFY \ 519 (1 << ISP_EVENT_MASK_INDEX_COMP_STATS_NOTIFY) 520 521 #define ISP_EVENT_SUBS_MASK_FE_READ_DONE \ 522 (1 << ISP_EVENT_MASK_INDEX_MASK_FE_READ_DONE) 523 524 enum msm_isp_event_idx { 525 ISP_REG_UPDATE = 0, 526 ISP_EPOCH_0 = 1, 527 ISP_EPOCH_1 = 2, 528 ISP_START_ACK = 3, 529 ISP_STOP_ACK = 4, 530 ISP_IRQ_VIOLATION = 5, 531 ISP_STATS_OVERFLOW = 6, 532 ISP_BUF_DONE = 7, 533 ISP_FE_RD_DONE = 8, 534 ISP_IOMMU_P_FAULT = 9, 535 ISP_ERROR = 10, 536 ISP_PING_PONG_MISMATCH = 11, 537 ISP_REG_UPDATE_MISSING = 12, 538 ISP_EVENT_MAX = 13 539 }; 540 541 #define ISP_EVENT_OFFSET 8 542 #define ISP_EVENT_BASE (V4L2_EVENT_PRIVATE_START) 543 #define ISP_BUF_EVENT_BASE (ISP_EVENT_BASE + (1 << ISP_EVENT_OFFSET)) 544 #define ISP_STATS_EVENT_BASE (ISP_EVENT_BASE + (2 << ISP_EVENT_OFFSET)) 545 #define ISP_CAMIF_EVENT_BASE (ISP_EVENT_BASE + (3 << ISP_EVENT_OFFSET)) 546 #define ISP_STREAM_EVENT_BASE (ISP_EVENT_BASE + (4 << ISP_EVENT_OFFSET)) 547 #define ISP_EVENT_REG_UPDATE (ISP_EVENT_BASE + ISP_REG_UPDATE) 548 #define ISP_EVENT_EPOCH_0 (ISP_EVENT_BASE + ISP_EPOCH_0) 549 #define ISP_EVENT_EPOCH_1 (ISP_EVENT_BASE + ISP_EPOCH_1) 550 #define ISP_EVENT_START_ACK (ISP_EVENT_BASE + ISP_START_ACK) 551 #define ISP_EVENT_STOP_ACK (ISP_EVENT_BASE + ISP_STOP_ACK) 552 #define ISP_EVENT_IRQ_VIOLATION (ISP_EVENT_BASE + ISP_IRQ_VIOLATION) 553 #define ISP_EVENT_STATS_OVERFLOW (ISP_EVENT_BASE + ISP_STATS_OVERFLOW) 554 #define ISP_EVENT_ERROR (ISP_EVENT_BASE + ISP_ERROR) 555 #define ISP_EVENT_SOF (ISP_CAMIF_EVENT_BASE) 556 #define ISP_EVENT_EOF (ISP_CAMIF_EVENT_BASE + 1) 557 #define ISP_EVENT_BUF_DONE (ISP_EVENT_BASE + ISP_BUF_DONE) 558 #define ISP_EVENT_BUF_DIVERT (ISP_BUF_EVENT_BASE) 559 #define ISP_EVENT_STATS_NOTIFY (ISP_STATS_EVENT_BASE) 560 #define ISP_EVENT_COMP_STATS_NOTIFY (ISP_EVENT_STATS_NOTIFY + MSM_ISP_STATS_MAX) 561 #define ISP_EVENT_FE_READ_DONE (ISP_EVENT_BASE + ISP_FE_RD_DONE) 562 #define ISP_EVENT_IOMMU_P_FAULT (ISP_EVENT_BASE + ISP_IOMMU_P_FAULT) 563 #define ISP_EVENT_PING_PONG_MISMATCH (ISP_EVENT_BASE + ISP_PING_PONG_MISMATCH) 564 #define ISP_EVENT_REG_UPDATE_MISSING (ISP_EVENT_BASE + ISP_REG_UPDATE_MISSING) 565 #define ISP_EVENT_STREAM_UPDATE_DONE (ISP_STREAM_EVENT_BASE) 566 567 /* The msm_v4l2_event_data structure should match the 568 * v4l2_event.u.data field. 569 * should not exceed 64 bytes */ 570 571 struct msm_isp_buf_event { 572 uint32_t session_id; 573 uint32_t stream_id; 574 uint32_t handle; 575 uint32_t output_format; 576 int8_t buf_idx; 577 }; 578 struct msm_isp_stats_event { 579 uint32_t stats_mask; /* 4 bytes */ 580 uint8_t stats_buf_idxs[MSM_ISP_STATS_MAX]; /* 11 bytes */ 581 }; 582 583 struct msm_isp_stream_ack { 584 uint32_t session_id; 585 uint32_t stream_id; 586 uint32_t handle; 587 }; 588 589 enum msm_vfe_error_type { 590 ISP_ERROR_NONE, 591 ISP_ERROR_CAMIF, 592 ISP_ERROR_BUS_OVERFLOW, 593 ISP_ERROR_RETURN_EMPTY_BUFFER, 594 ISP_ERROR_FRAME_ID_MISMATCH, 595 ISP_ERROR_MAX, 596 }; 597 598 struct msm_isp_error_info { 599 enum msm_vfe_error_type err_type; 600 uint32_t session_id; 601 uint32_t stream_id; 602 }; 603 604 struct msm_isp_output_info { 605 uint32_t regs_not_updated; 606 uint32_t output_err_mask; 607 uint16_t stream_framedrop_mask; 608 uint32_t stats_framedrop_mask; 609 uint32_t axi_updating_mask; 610 }; 611 612 struct msm_isp_event_data { 613 /*Wall clock except for buffer divert events 614 *which use monotonic clock 615 */ 616 struct timeval timestamp; 617 /* Monotonic timestamp since bootup */ 618 struct timeval mono_timestamp; 619 uint32_t frame_id; 620 union { 621 struct msm_isp_stats_event stats; 622 struct msm_isp_buf_event buf_done; 623 struct msm_isp_error_info error_info; 624 struct msm_isp_output_info output_info; 625 } u; /* union can have max 52 bytes */ 626 }; 627 628 #ifdef CONFIG_COMPAT 629 struct msm_isp_event_data32 { 630 struct compat_timeval timestamp; 631 struct compat_timeval mono_timestamp; 632 uint32_t frame_id; 633 union { 634 struct msm_isp_stats_event stats; 635 struct msm_isp_buf_event buf_done; 636 struct msm_isp_error_info error_info; 637 struct msm_isp_output_info output_info; 638 } u; 639 }; 640 #endif 641 642 #define V4L2_PIX_FMT_QBGGR8 v4l2_fourcc('Q', 'B', 'G', '8') 643 #define V4L2_PIX_FMT_QGBRG8 v4l2_fourcc('Q', 'G', 'B', '8') 644 #define V4L2_PIX_FMT_QGRBG8 v4l2_fourcc('Q', 'G', 'R', '8') 645 #define V4L2_PIX_FMT_QRGGB8 v4l2_fourcc('Q', 'R', 'G', '8') 646 #define V4L2_PIX_FMT_QBGGR10 v4l2_fourcc('Q', 'B', 'G', '0') 647 #define V4L2_PIX_FMT_QGBRG10 v4l2_fourcc('Q', 'G', 'B', '0') 648 #define V4L2_PIX_FMT_QGRBG10 v4l2_fourcc('Q', 'G', 'R', '0') 649 #define V4L2_PIX_FMT_QRGGB10 v4l2_fourcc('Q', 'R', 'G', '0') 650 #define V4L2_PIX_FMT_QBGGR12 v4l2_fourcc('Q', 'B', 'G', '2') 651 #define V4L2_PIX_FMT_QGBRG12 v4l2_fourcc('Q', 'G', 'B', '2') 652 #define V4L2_PIX_FMT_QGRBG12 v4l2_fourcc('Q', 'G', 'R', '2') 653 #define V4L2_PIX_FMT_QRGGB12 v4l2_fourcc('Q', 'R', 'G', '2') 654 #define V4L2_PIX_FMT_QBGGR14 v4l2_fourcc('Q', 'B', 'G', '4') 655 #define V4L2_PIX_FMT_QGBRG14 v4l2_fourcc('Q', 'G', 'B', '4') 656 #define V4L2_PIX_FMT_QGRBG14 v4l2_fourcc('Q', 'G', 'R', '4') 657 #define V4L2_PIX_FMT_QRGGB14 v4l2_fourcc('Q', 'R', 'G', '4') 658 #define V4L2_PIX_FMT_P16BGGR10 v4l2_fourcc('P', 'B', 'G', '0') 659 #define V4L2_PIX_FMT_P16GBRG10 v4l2_fourcc('P', 'G', 'B', '0') 660 #define V4L2_PIX_FMT_P16GRBG10 v4l2_fourcc('P', 'G', 'R', '0') 661 #define V4L2_PIX_FMT_P16RGGB10 v4l2_fourcc('P', 'R', 'G', '0') 662 #define V4L2_PIX_FMT_NV14 v4l2_fourcc('N', 'V', '1', '4') 663 #define V4L2_PIX_FMT_NV41 v4l2_fourcc('N', 'V', '4', '1') 664 #define V4L2_PIX_FMT_META v4l2_fourcc('Q', 'M', 'E', 'T') 665 #define V4L2_PIX_FMT_SBGGR14 v4l2_fourcc('B', 'G', '1', '4') /* 14 BGBG.GRGR.*/ 666 #define V4L2_PIX_FMT_SGBRG14 v4l2_fourcc('G', 'B', '1', '4') /* 14 GBGB.RGRG.*/ 667 #define V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4') /* 14 GRGR.BGBG.*/ 668 #define V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4') /* 14 RGRG.GBGB.*/ 669 670 #define VIDIOC_MSM_VFE_REG_CFG \ 671 _IOWR('V', BASE_VIDIOC_PRIVATE, struct msm_vfe_cfg_cmd2) 672 673 #define VIDIOC_MSM_ISP_REQUEST_BUF \ 674 _IOWR('V', BASE_VIDIOC_PRIVATE+1, struct msm_isp_buf_request) 675 676 #define VIDIOC_MSM_ISP_ENQUEUE_BUF \ 677 _IOWR('V', BASE_VIDIOC_PRIVATE+2, struct msm_isp_qbuf_info) 678 679 #define VIDIOC_MSM_ISP_RELEASE_BUF \ 680 _IOWR('V', BASE_VIDIOC_PRIVATE+3, struct msm_isp_buf_request) 681 682 #define VIDIOC_MSM_ISP_REQUEST_STREAM \ 683 _IOWR('V', BASE_VIDIOC_PRIVATE+4, struct msm_vfe_axi_stream_request_cmd) 684 685 #define VIDIOC_MSM_ISP_CFG_STREAM \ 686 _IOWR('V', BASE_VIDIOC_PRIVATE+5, struct msm_vfe_axi_stream_cfg_cmd) 687 688 #define VIDIOC_MSM_ISP_RELEASE_STREAM \ 689 _IOWR('V', BASE_VIDIOC_PRIVATE+6, struct msm_vfe_axi_stream_release_cmd) 690 691 #define VIDIOC_MSM_ISP_INPUT_CFG \ 692 _IOWR('V', BASE_VIDIOC_PRIVATE+7, struct msm_vfe_input_cfg) 693 694 #define VIDIOC_MSM_ISP_SET_SRC_STATE \ 695 _IOWR('V', BASE_VIDIOC_PRIVATE+8, struct msm_vfe_axi_src_state) 696 697 #define VIDIOC_MSM_ISP_REQUEST_STATS_STREAM \ 698 _IOWR('V', BASE_VIDIOC_PRIVATE+9, \ 699 struct msm_vfe_stats_stream_request_cmd) 700 701 #define VIDIOC_MSM_ISP_CFG_STATS_STREAM \ 702 _IOWR('V', BASE_VIDIOC_PRIVATE+10, struct msm_vfe_stats_stream_cfg_cmd) 703 704 #define VIDIOC_MSM_ISP_RELEASE_STATS_STREAM \ 705 _IOWR('V', BASE_VIDIOC_PRIVATE+11, \ 706 struct msm_vfe_stats_stream_release_cmd) 707 708 #define VIDIOC_MSM_ISP_REG_UPDATE_CMD \ 709 _IOWR('V', BASE_VIDIOC_PRIVATE+12, enum msm_vfe_input_src) 710 711 #define VIDIOC_MSM_ISP_UPDATE_STREAM \ 712 _IOWR('V', BASE_VIDIOC_PRIVATE+13, struct msm_vfe_axi_stream_update_cmd) 713 714 #define VIDIOC_MSM_VFE_REG_LIST_CFG \ 715 _IOWR('V', BASE_VIDIOC_PRIVATE+14, struct msm_vfe_cfg_cmd_list) 716 717 #define VIDIOC_MSM_ISP_SMMU_ATTACH \ 718 _IOWR('V', BASE_VIDIOC_PRIVATE+15, struct msm_vfe_smmu_attach_cmd) 719 720 #define VIDIOC_MSM_ISP_UPDATE_STATS_STREAM \ 721 _IOWR('V', BASE_VIDIOC_PRIVATE+16, struct msm_vfe_axi_stream_update_cmd) 722 723 #define VIDIOC_MSM_ISP_AXI_HALT \ 724 _IOWR('V', BASE_VIDIOC_PRIVATE+17, struct msm_vfe_axi_halt_cmd) 725 726 #define VIDIOC_MSM_ISP_AXI_RESET \ 727 _IOWR('V', BASE_VIDIOC_PRIVATE+18, struct msm_vfe_axi_reset_cmd) 728 729 #define VIDIOC_MSM_ISP_AXI_RESTART \ 730 _IOWR('V', BASE_VIDIOC_PRIVATE+19, struct msm_vfe_axi_restart_cmd) 731 732 #define VIDIOC_MSM_ISP_FETCH_ENG_START \ 733 _IOWR('V', BASE_VIDIOC_PRIVATE+20, struct msm_vfe_fetch_eng_start) 734 735 #define VIDIOC_MSM_ISP_DEQUEUE_BUF \ 736 _IOWR('V', BASE_VIDIOC_PRIVATE+21, struct msm_isp_qbuf_info) 737 738 #endif /* __MSMB_ISP__ */ 739