1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Support for Intel Camera Imaging ISP subsystem. 4 * Copyright (c) 2015, Intel Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms and conditions of the GNU General Public License, 8 * version 2, as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 */ 15 16 #ifndef __IA_CSS_PIPE_H__ 17 #define __IA_CSS_PIPE_H__ 18 19 #include <type_support.h> 20 #include "ia_css_stream.h" 21 #include "ia_css_frame.h" 22 #include "ia_css_pipeline.h" 23 #include "ia_css_binary.h" 24 #include "sh_css_legacy.h" 25 26 #define PIPE_ENTRY_EMPTY_TOKEN (~0U) 27 #define PIPE_ENTRY_RESERVED_TOKEN (0x1) 28 29 struct ia_css_preview_settings { 30 struct ia_css_binary copy_binary; 31 struct ia_css_binary preview_binary; 32 struct ia_css_binary vf_pp_binary; 33 34 /* 2401 only for these two - do we in fact use them for anything real */ 35 struct ia_css_frame *delay_frames[MAX_NUM_VIDEO_DELAY_FRAMES]; 36 struct ia_css_frame *tnr_frames[NUM_VIDEO_TNR_FRAMES]; 37 38 struct ia_css_pipe *copy_pipe; 39 struct ia_css_pipe *capture_pipe; 40 struct ia_css_pipe *acc_pipe; 41 }; 42 43 #define IA_CSS_DEFAULT_PREVIEW_SETTINGS { \ 44 .copy_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 45 .preview_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 46 .vf_pp_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 47 } 48 49 struct ia_css_capture_settings { 50 struct ia_css_binary copy_binary; 51 /* we extend primary binary to multiple stages because in ISP2.6.1 52 * the computation load is too high to fit in one single binary. */ 53 struct ia_css_binary primary_binary[MAX_NUM_PRIMARY_STAGES]; 54 unsigned int num_primary_stage; 55 struct ia_css_binary pre_isp_binary; 56 struct ia_css_binary anr_gdc_binary; 57 struct ia_css_binary post_isp_binary; 58 struct ia_css_binary capture_pp_binary; 59 struct ia_css_binary vf_pp_binary; 60 struct ia_css_binary capture_ldc_binary; 61 struct ia_css_binary *yuv_scaler_binary; 62 struct ia_css_frame *delay_frames[MAX_NUM_VIDEO_DELAY_FRAMES]; 63 bool *is_output_stage; 64 unsigned int num_yuv_scaler; 65 }; 66 67 #define IA_CSS_DEFAULT_CAPTURE_SETTINGS { \ 68 .copy_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 69 .primary_binary = {IA_CSS_BINARY_DEFAULT_SETTINGS}, \ 70 .pre_isp_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 71 .anr_gdc_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 72 .post_isp_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 73 .capture_pp_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 74 .vf_pp_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 75 .capture_ldc_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 76 } 77 78 struct ia_css_video_settings { 79 struct ia_css_binary copy_binary; 80 struct ia_css_binary video_binary; 81 struct ia_css_binary vf_pp_binary; 82 struct ia_css_binary *yuv_scaler_binary; 83 struct ia_css_frame *delay_frames[MAX_NUM_VIDEO_DELAY_FRAMES]; 84 struct ia_css_frame *tnr_frames[NUM_VIDEO_TNR_FRAMES]; 85 struct ia_css_frame *vf_pp_in_frame; 86 struct ia_css_pipe *copy_pipe; 87 struct ia_css_pipe *capture_pipe; 88 bool *is_output_stage; 89 unsigned int num_yuv_scaler; 90 }; 91 92 #define IA_CSS_DEFAULT_VIDEO_SETTINGS { \ 93 .copy_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 94 .video_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 95 .vf_pp_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 96 } 97 98 struct ia_css_yuvpp_settings { 99 struct ia_css_binary copy_binary; 100 struct ia_css_binary *yuv_scaler_binary; 101 struct ia_css_binary *vf_pp_binary; 102 bool *is_output_stage; 103 unsigned int num_yuv_scaler; 104 unsigned int num_vf_pp; 105 unsigned int num_output; 106 }; 107 108 #define IA_CSS_DEFAULT_YUVPP_SETTINGS { \ 109 .copy_binary = IA_CSS_BINARY_DEFAULT_SETTINGS, \ 110 } 111 112 struct osys_object; 113 114 struct ia_css_pipe { 115 /* TODO: Remove stop_requested and use stop_requested in the pipeline */ 116 bool stop_requested; 117 struct ia_css_pipe_config config; 118 struct ia_css_pipe_extra_config extra_config; 119 struct ia_css_pipe_info info; 120 enum ia_css_pipe_id mode; 121 struct ia_css_shading_table *shading_table; 122 struct ia_css_pipeline pipeline; 123 struct ia_css_frame_info output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE]; 124 struct ia_css_frame_info bds_output_info; 125 struct ia_css_frame_info vf_output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE]; 126 struct ia_css_frame_info out_yuv_ds_input_info; 127 struct ia_css_frame_info vf_yuv_ds_input_info; 128 struct ia_css_fw_info *output_stage; /* extra output stage */ 129 struct ia_css_fw_info *vf_stage; /* extra vf_stage */ 130 unsigned int required_bds_factor; 131 unsigned int dvs_frame_delay; 132 int num_invalid_frames; 133 bool enable_viewfinder[IA_CSS_PIPE_MAX_OUTPUT_STAGE]; 134 struct ia_css_stream *stream; 135 struct ia_css_frame in_frame_struct; 136 struct ia_css_frame out_frame_struct; 137 struct ia_css_frame vf_frame_struct; 138 struct ia_css_frame *continuous_frames[NUM_CONTINUOUS_FRAMES]; 139 struct ia_css_metadata *cont_md_buffers[NUM_CONTINUOUS_FRAMES]; 140 union { 141 struct ia_css_preview_settings preview; 142 struct ia_css_video_settings video; 143 struct ia_css_capture_settings capture; 144 struct ia_css_yuvpp_settings yuvpp; 145 } pipe_settings; 146 ia_css_ptr scaler_pp_lut; 147 struct osys_object *osys_obj; 148 149 /* This number is unique per pipe each instance of css. This number is 150 * reused as pipeline number also. There is a 1-1 mapping between pipe_num 151 * and sp thread id. Current logic limits pipe_num to 152 * SH_CSS_MAX_SP_THREADS */ 153 unsigned int pipe_num; 154 }; 155 156 #define IA_CSS_DEFAULT_PIPE { \ 157 .config = DEFAULT_PIPE_CONFIG, \ 158 .info = DEFAULT_PIPE_INFO, \ 159 .mode = IA_CSS_PIPE_ID_ACC, /* (pipe_id) */ \ 160 .pipeline = DEFAULT_PIPELINE, \ 161 .output_info = {IA_CSS_BINARY_DEFAULT_FRAME_INFO}, \ 162 .bds_output_info = IA_CSS_BINARY_DEFAULT_FRAME_INFO, \ 163 .vf_output_info = {IA_CSS_BINARY_DEFAULT_FRAME_INFO}, \ 164 .out_yuv_ds_input_info = IA_CSS_BINARY_DEFAULT_FRAME_INFO, \ 165 .vf_yuv_ds_input_info = IA_CSS_BINARY_DEFAULT_FRAME_INFO, \ 166 .required_bds_factor = SH_CSS_BDS_FACTOR_1_00, \ 167 .dvs_frame_delay = 1, \ 168 .enable_viewfinder = {true}, \ 169 .in_frame_struct = DEFAULT_FRAME, \ 170 .out_frame_struct = DEFAULT_FRAME, \ 171 .vf_frame_struct = DEFAULT_FRAME, \ 172 .pipe_settings = { \ 173 .preview = IA_CSS_DEFAULT_PREVIEW_SETTINGS \ 174 }, \ 175 .pipe_num = PIPE_ENTRY_EMPTY_TOKEN, \ 176 } 177 178 void ia_css_pipe_map_queue(struct ia_css_pipe *pipe, bool map); 179 180 int 181 sh_css_param_update_isp_params(struct ia_css_pipe *curr_pipe, 182 struct ia_css_isp_parameters *params, 183 bool commit, struct ia_css_pipe *pipe); 184 185 #endif /* __IA_CSS_PIPE_H__ */ 186