xref: /linux/drivers/staging/media/atomisp/pci/ia_css_pipe.h (revision 0cdee263bc5e7b20f657ea09f9272f50c568f35b)
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 	struct ia_css_pipe_config       config;
106 	struct ia_css_pipe_extra_config extra_config;
107 	struct ia_css_pipe_info         info;
108 	enum ia_css_pipe_id		mode;
109 	struct ia_css_shading_table	*shading_table;
110 	struct ia_css_pipeline		pipeline;
111 	struct ia_css_frame_info	output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE];
112 	struct ia_css_frame_info	bds_output_info;
113 	struct ia_css_frame_info	vf_output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE];
114 	struct ia_css_frame_info	out_yuv_ds_input_info;
115 	struct ia_css_frame_info	vf_yuv_ds_input_info;
116 	struct ia_css_fw_info		*output_stage;	/* extra output stage */
117 	struct ia_css_fw_info		*vf_stage;	/* extra vf_stage */
118 	unsigned int			required_bds_factor;
119 	unsigned int			dvs_frame_delay;
120 	int				num_invalid_frames;
121 	bool				enable_viewfinder[IA_CSS_PIPE_MAX_OUTPUT_STAGE];
122 	struct ia_css_stream		*stream;
123 	struct ia_css_frame		in_frame_struct;
124 	struct ia_css_frame		out_frame_struct;
125 	struct ia_css_frame		vf_frame_struct;
126 	struct ia_css_frame		*continuous_frames[NUM_CONTINUOUS_FRAMES];
127 	struct ia_css_metadata	*cont_md_buffers[NUM_CONTINUOUS_FRAMES];
128 	union {
129 		struct ia_css_preview_settings preview;
130 		struct ia_css_video_settings   video;
131 		struct ia_css_capture_settings capture;
132 		struct ia_css_yuvpp_settings yuvpp;
133 	} pipe_settings;
134 	ia_css_ptr scaler_pp_lut;
135 	struct osys_object *osys_obj;
136 
137 	/* This number is unique per pipe each instance of css. This number is
138 	 * reused as pipeline number also. There is a 1-1 mapping between pipe_num
139 	 * and sp thread id. Current logic limits pipe_num to
140 	 * SH_CSS_MAX_SP_THREADS */
141 	unsigned int pipe_num;
142 };
143 
144 #define IA_CSS_DEFAULT_PIPE { \
145 	.config			= DEFAULT_PIPE_CONFIG, \
146 	.info			= DEFAULT_PIPE_INFO, \
147 	.mode			= IA_CSS_PIPE_ID_VIDEO, /* (pipe_id) */ \
148 	.pipeline		= DEFAULT_PIPELINE, \
149 	.output_info		= {IA_CSS_BINARY_DEFAULT_FRAME_INFO}, \
150 	.bds_output_info	= IA_CSS_BINARY_DEFAULT_FRAME_INFO, \
151 	.vf_output_info		= {IA_CSS_BINARY_DEFAULT_FRAME_INFO}, \
152 	.out_yuv_ds_input_info	= IA_CSS_BINARY_DEFAULT_FRAME_INFO, \
153 	.vf_yuv_ds_input_info	= IA_CSS_BINARY_DEFAULT_FRAME_INFO, \
154 	.required_bds_factor	= SH_CSS_BDS_FACTOR_1_00, \
155 	.dvs_frame_delay	= 1, \
156 	.enable_viewfinder	= {true}, \
157 	.in_frame_struct	= DEFAULT_FRAME, \
158 	.out_frame_struct	= DEFAULT_FRAME, \
159 	.vf_frame_struct	= DEFAULT_FRAME, \
160 	.pipe_settings		= { \
161 		.preview = IA_CSS_DEFAULT_PREVIEW_SETTINGS \
162 	}, \
163 	.pipe_num		= PIPE_ENTRY_EMPTY_TOKEN, \
164 }
165 
166 void ia_css_pipe_map_queue(struct ia_css_pipe *pipe, bool map);
167 
168 int
169 sh_css_param_update_isp_params(struct ia_css_pipe *curr_pipe,
170 			       struct ia_css_isp_parameters *params,
171 			       bool commit, struct ia_css_pipe *pipe);
172 
173 #endif /* __IA_CSS_PIPE_H__ */
174