1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #ifndef _RKISPP_STREAM_H
5*4882a593Smuzhiyun #define _RKISPP_STREAM_H
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include "common.h"
8*4882a593Smuzhiyun #include "params.h"
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #define RKISPP_FEC_BUF_MAX 7
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun struct rkispp_stream;
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun * STREAM_II: input image data
16*4882a593Smuzhiyun * STREAM_MB: module bypass output, no scale
17*4882a593Smuzhiyun * STREAM_S0: scale0 output
18*4882a593Smuzhiyun * STREAM_S1: scale1 output
19*4882a593Smuzhiyun * STREAM_S2: scale2 output
20*4882a593Smuzhiyun * STREAM_VIR: virtual output for debug
21*4882a593Smuzhiyun */
22*4882a593Smuzhiyun enum rkispp_stream_id {
23*4882a593Smuzhiyun STREAM_II = 0,
24*4882a593Smuzhiyun STREAM_MB,
25*4882a593Smuzhiyun STREAM_VIR,
26*4882a593Smuzhiyun STREAM_S0,
27*4882a593Smuzhiyun STREAM_S1,
28*4882a593Smuzhiyun STREAM_S2,
29*4882a593Smuzhiyun STREAM_MAX
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /*
33*4882a593Smuzhiyun * fourcc: pixel format
34*4882a593Smuzhiyun * cplanes: number of colour planes
35*4882a593Smuzhiyun * mplanes: number of stored memory planes
36*4882a593Smuzhiyun * wr_fmt: defines format for reg
37*4882a593Smuzhiyun * bpp: bits per pixel
38*4882a593Smuzhiyun */
39*4882a593Smuzhiyun struct capture_fmt {
40*4882a593Smuzhiyun u32 fourcc;
41*4882a593Smuzhiyun u8 cplanes;
42*4882a593Smuzhiyun u8 mplanes;
43*4882a593Smuzhiyun u8 wr_fmt;
44*4882a593Smuzhiyun u8 bpp[VIDEO_MAX_PLANES];
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* Different config for stream */
48*4882a593Smuzhiyun struct stream_config {
49*4882a593Smuzhiyun const struct capture_fmt *fmts;
50*4882a593Smuzhiyun unsigned int fmt_size;
51*4882a593Smuzhiyun u32 frame_end_id;
52*4882a593Smuzhiyun /* registers */
53*4882a593Smuzhiyun struct {
54*4882a593Smuzhiyun u32 ctrl;
55*4882a593Smuzhiyun u32 factor;
56*4882a593Smuzhiyun u32 cur_y_base;
57*4882a593Smuzhiyun u32 cur_uv_base;
58*4882a593Smuzhiyun u32 cur_vir_stride;
59*4882a593Smuzhiyun u32 cur_y_base_shd;
60*4882a593Smuzhiyun u32 cur_uv_base_shd;
61*4882a593Smuzhiyun } reg;
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun /* Different reg ops for stream */
65*4882a593Smuzhiyun struct streams_ops {
66*4882a593Smuzhiyun int (*config)(struct rkispp_stream *stream);
67*4882a593Smuzhiyun void (*update)(struct rkispp_stream *stream);
68*4882a593Smuzhiyun void (*stop)(struct rkispp_stream *stream);
69*4882a593Smuzhiyun int (*start)(struct rkispp_stream *stream);
70*4882a593Smuzhiyun int (*is_stopped)(struct rkispp_stream *stream);
71*4882a593Smuzhiyun int (*limit_check)(struct rkispp_stream *stream,
72*4882a593Smuzhiyun struct v4l2_pix_format_mplane *try_fmt);
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /* stream input/out flag */
76*4882a593Smuzhiyun enum stream_type {
77*4882a593Smuzhiyun STREAM_INPUT,
78*4882a593Smuzhiyun STREAM_OUTPUT,
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun /* internal using buf */
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun struct in_tnr_buf {
84*4882a593Smuzhiyun struct rkispp_dummy_buffer iir;
85*4882a593Smuzhiyun struct rkispp_dummy_buffer gain_kg;
86*4882a593Smuzhiyun struct rkispp_dummy_buffer wr[RKISPP_BUF_MAX][GROUP_BUF_MAX];
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun struct in_nr_buf {
90*4882a593Smuzhiyun struct rkispp_dummy_buffer tmp_yuv;
91*4882a593Smuzhiyun struct rkispp_dummy_buffer wr[RKISPP_FEC_BUF_MAX];
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun struct tnr_module {
95*4882a593Smuzhiyun struct in_tnr_buf buf;
96*4882a593Smuzhiyun struct list_head list_rd;
97*4882a593Smuzhiyun struct list_head list_wr;
98*4882a593Smuzhiyun struct list_head list_rpt;
99*4882a593Smuzhiyun spinlock_t buf_lock;
100*4882a593Smuzhiyun struct rkisp_ispp_buf *cur_rd;
101*4882a593Smuzhiyun struct rkisp_ispp_buf *nxt_rd;
102*4882a593Smuzhiyun struct rkisp_ispp_buf *cur_wr;
103*4882a593Smuzhiyun struct rkisp_ispp_reg *reg_buf;
104*4882a593Smuzhiyun struct frame_debug_info dbg;
105*4882a593Smuzhiyun u32 uv_offset;
106*4882a593Smuzhiyun bool is_end;
107*4882a593Smuzhiyun bool is_3to1;
108*4882a593Smuzhiyun bool is_buf_init;
109*4882a593Smuzhiyun bool is_trigger;
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun struct nr_module {
113*4882a593Smuzhiyun struct in_nr_buf buf;
114*4882a593Smuzhiyun struct list_head list_rd;
115*4882a593Smuzhiyun struct list_head list_wr;
116*4882a593Smuzhiyun struct list_head list_rpt;
117*4882a593Smuzhiyun spinlock_t buf_lock;
118*4882a593Smuzhiyun struct rkisp_ispp_buf *cur_rd;
119*4882a593Smuzhiyun struct rkispp_dummy_buffer *cur_wr;
120*4882a593Smuzhiyun struct rkisp_ispp_reg *reg_buf;
121*4882a593Smuzhiyun struct frame_debug_info dbg;
122*4882a593Smuzhiyun u32 uv_offset;
123*4882a593Smuzhiyun bool is_end;
124*4882a593Smuzhiyun bool is_buf_init;
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun struct fec_module {
128*4882a593Smuzhiyun struct list_head list_rd;
129*4882a593Smuzhiyun struct list_head list_wr;
130*4882a593Smuzhiyun struct rkisp_ispp_buf *cur_rd;
131*4882a593Smuzhiyun struct rkispp_dummy_buffer *dummy_cur_rd;
132*4882a593Smuzhiyun struct rkisp_ispp_reg *reg_buf;
133*4882a593Smuzhiyun struct frame_debug_info dbg;
134*4882a593Smuzhiyun spinlock_t buf_lock;
135*4882a593Smuzhiyun u32 uv_offset;
136*4882a593Smuzhiyun bool is_end;
137*4882a593Smuzhiyun };
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /* struct rkispp_stream - ISPP stream video device
140*4882a593Smuzhiyun * id: stream video identify
141*4882a593Smuzhiyun * buf_queue: queued buffer list
142*4882a593Smuzhiyun * curr_buf: the buffer used for current frame
143*4882a593Smuzhiyun * next_buf: the buffer used for next frame
144*4882a593Smuzhiyun * done: wait frame end event queue
145*4882a593Smuzhiyun * vbq_lock: lock to protect buf_queue
146*4882a593Smuzhiyun * out_cap_fmt: the output of ispp
147*4882a593Smuzhiyun * out_fmt: the output of v4l2 pix format
148*4882a593Smuzhiyun * last_module: last function module
149*4882a593Smuzhiyun * streaming: stream start flag
150*4882a593Smuzhiyun * stopping: stream stop flag
151*4882a593Smuzhiyun * linked: link enable flag
152*4882a593Smuzhiyun */
153*4882a593Smuzhiyun struct rkispp_stream {
154*4882a593Smuzhiyun enum rkispp_stream_id id;
155*4882a593Smuzhiyun struct rkispp_device *isppdev;
156*4882a593Smuzhiyun struct rkispp_vdev_node vnode;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun struct list_head buf_queue;
159*4882a593Smuzhiyun struct rkispp_buffer *curr_buf;
160*4882a593Smuzhiyun wait_queue_head_t done;
161*4882a593Smuzhiyun spinlock_t vbq_lock;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun enum stream_type type;
164*4882a593Smuzhiyun struct streams_ops *ops;
165*4882a593Smuzhiyun struct stream_config *config;
166*4882a593Smuzhiyun struct capture_fmt out_cap_fmt;
167*4882a593Smuzhiyun struct v4l2_pix_format_mplane out_fmt;
168*4882a593Smuzhiyun struct frame_debug_info dbg;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun u8 last_module;
171*4882a593Smuzhiyun u8 conn_id;
172*4882a593Smuzhiyun bool streaming;
173*4882a593Smuzhiyun bool stopping;
174*4882a593Smuzhiyun bool linked;
175*4882a593Smuzhiyun bool is_upd;
176*4882a593Smuzhiyun bool is_cfg;
177*4882a593Smuzhiyun bool is_end;
178*4882a593Smuzhiyun bool is_reg_withstream;
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun enum {
182*4882a593Smuzhiyun MONITOR_OFF = 0,
183*4882a593Smuzhiyun MONITOR_TNR = BIT(0),
184*4882a593Smuzhiyun MONITOR_NR = BIT(1),
185*4882a593Smuzhiyun MONITOR_FEC = BIT(2),
186*4882a593Smuzhiyun };
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun struct module_monitor {
189*4882a593Smuzhiyun struct rkispp_device *dev;
190*4882a593Smuzhiyun struct work_struct work;
191*4882a593Smuzhiyun struct completion cmpl;
192*4882a593Smuzhiyun u16 time;
193*4882a593Smuzhiyun u8 module;
194*4882a593Smuzhiyun bool is_err;
195*4882a593Smuzhiyun };
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun struct rkispp_monitor {
198*4882a593Smuzhiyun struct module_monitor tnr;
199*4882a593Smuzhiyun struct module_monitor nr;
200*4882a593Smuzhiyun struct module_monitor fec;
201*4882a593Smuzhiyun struct completion cmpl;
202*4882a593Smuzhiyun spinlock_t lock;
203*4882a593Smuzhiyun u8 monitoring_module;
204*4882a593Smuzhiyun u8 restart_module;
205*4882a593Smuzhiyun u8 retry;
206*4882a593Smuzhiyun bool is_restart;
207*4882a593Smuzhiyun bool is_en;
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun struct rkispp_stream_ops {
212*4882a593Smuzhiyun int (*config_modules)(struct rkispp_device *dev);
213*4882a593Smuzhiyun void (*destroy_buf)(struct rkispp_stream *stream);
214*4882a593Smuzhiyun void (*fec_work_event)(struct rkispp_device *dev, void *buf_rd,
215*4882a593Smuzhiyun bool is_isr, bool is_quick);
216*4882a593Smuzhiyun int (*start_isp)(struct rkispp_device *dev);
217*4882a593Smuzhiyun void (*check_to_force_update)(struct rkispp_device *dev, u32 mis_val);
218*4882a593Smuzhiyun void (*update_mi)(struct rkispp_stream *stream);
219*4882a593Smuzhiyun enum hrtimer_restart (*rkispp_frame_done_early)(struct hrtimer *timer);
220*4882a593Smuzhiyun void (*rkispp_module_work_event)(struct rkispp_device *dev,
221*4882a593Smuzhiyun void *buf_rd, void *buf_wr,
222*4882a593Smuzhiyun u32 module, bool is_isr);
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun struct rkispp_vir_cpy {
226*4882a593Smuzhiyun struct work_struct work;
227*4882a593Smuzhiyun struct completion cmpl;
228*4882a593Smuzhiyun struct list_head queue;
229*4882a593Smuzhiyun struct rkispp_stream *stream;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /* rkispp stream device */
233*4882a593Smuzhiyun struct rkispp_stream_vdev {
234*4882a593Smuzhiyun struct rkispp_stream stream[STREAM_MAX];
235*4882a593Smuzhiyun struct tnr_module tnr;
236*4882a593Smuzhiyun struct nr_module nr;
237*4882a593Smuzhiyun struct fec_module fec;
238*4882a593Smuzhiyun struct frame_debug_info dbg;
239*4882a593Smuzhiyun struct rkispp_monitor monitor;
240*4882a593Smuzhiyun struct rkispp_stream_ops *stream_ops;
241*4882a593Smuzhiyun struct rkispp_vir_cpy vir_cpy;
242*4882a593Smuzhiyun struct rkisp_ispp_buf input[VIDEO_MAX_FRAME];
243*4882a593Smuzhiyun struct hrtimer fec_qst;
244*4882a593Smuzhiyun struct hrtimer frame_qst;
245*4882a593Smuzhiyun atomic_t refcnt;
246*4882a593Smuzhiyun u32 module_ens;
247*4882a593Smuzhiyun u32 irq_ends;
248*4882a593Smuzhiyun u32 wait_line;
249*4882a593Smuzhiyun bool is_done_early;
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun int rkispp_get_tnrbuf_fd(struct rkispp_device *dev, struct rkispp_buf_idxfd *idxfd);
253*4882a593Smuzhiyun int rkispp_get_nrbuf_fd(struct rkispp_device *dev, struct rkispp_buf_idxfd *idxfd);
254*4882a593Smuzhiyun void rkispp_set_trigger_mode(struct rkispp_device *dev,
255*4882a593Smuzhiyun struct rkispp_trigger_mode *mode);
256*4882a593Smuzhiyun void rkispp_isr(u32 mis_val, struct rkispp_device *dev);
257*4882a593Smuzhiyun void rkispp_unregister_stream_vdevs(struct rkispp_device *dev);
258*4882a593Smuzhiyun int rkispp_register_stream_vdevs(struct rkispp_device *dev);
259*4882a593Smuzhiyun void *get_pool_buf(struct rkispp_device *dev, struct rkisp_ispp_buf *dbufs);
260*4882a593Smuzhiyun void *dbuf_to_dummy(struct dma_buf *dbuf, struct rkispp_dummy_buffer *pool, int num);
261*4882a593Smuzhiyun void *get_list_buf(struct list_head *list, bool is_isp_ispp);
262*4882a593Smuzhiyun void get_stream_buf(struct rkispp_stream *stream);
263*4882a593Smuzhiyun void secure_config_mb(struct rkispp_stream *stream);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISPP_VERSION_V10)
266*4882a593Smuzhiyun void rkispp_stream_init_ops_v10(struct rkispp_stream_vdev *stream_vdev);
267*4882a593Smuzhiyun void rkispp_params_init_ops_v10(struct rkispp_params_vdev *params_vdev);
268*4882a593Smuzhiyun #else
rkispp_stream_init_ops_v10(struct rkispp_stream_vdev * stream_vdev)269*4882a593Smuzhiyun static inline void rkispp_stream_init_ops_v10(struct rkispp_stream_vdev *stream_vdev) {}
rkispp_params_init_ops_v10(struct rkispp_params_vdev * params_vdev)270*4882a593Smuzhiyun static inline void rkispp_params_init_ops_v10(struct rkispp_params_vdev *params_vdev) {}
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISPP_VERSION_V20)
274*4882a593Smuzhiyun void rkispp_stream_init_ops_v20(struct rkispp_stream_vdev *stream_vdev);
275*4882a593Smuzhiyun void rkispp_params_init_ops_v20(struct rkispp_params_vdev *params_vdev);
276*4882a593Smuzhiyun #else
rkispp_stream_init_ops_v20(struct rkispp_stream_vdev * stream_vdev)277*4882a593Smuzhiyun static inline void rkispp_stream_init_ops_v20(struct rkispp_stream_vdev *stream_vdev) {}
rkispp_params_init_ops_v20(struct rkispp_params_vdev * params_vdev)278*4882a593Smuzhiyun static inline void rkispp_params_init_ops_v20(struct rkispp_params_vdev *params_vdev) {}
279*4882a593Smuzhiyun #endif
280*4882a593Smuzhiyun int rkispp_frame_end(struct rkispp_stream *stream, u32 state);
281*4882a593Smuzhiyun void rkispp_start_3a_run(struct rkispp_device *dev);
282*4882a593Smuzhiyun #endif
283