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