GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / staging / media / atomisp / pci / ia_css_pipe.h
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__ */