• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
3 
4 #ifndef _RKISP_ISP_STATS_H
5 #define _RKISP_ISP_STATS_H
6 
7 #include <linux/rkisp1-config.h>
8 #include <linux/interrupt.h>
9 #include <linux/kfifo.h>
10 #include "common.h"
11 
12 #define RKISP_STATS_DDR_BUF_NUM		1
13 #define RKISP_READOUT_WORK_SIZE	\
14 	(8 * sizeof(struct rkisp_isp_readout_work))
15 
16 struct rkisp_isp_stats_vdev;
17 
18 enum rkisp_isp_readout_cmd {
19 	RKISP_ISP_READOUT_MEAS,
20 	RKISP_ISP_READOUT_META,
21 };
22 
23 struct rkisp_isp_readout_work {
24 	unsigned int frame_id;
25 	unsigned int isp_ris;
26 	unsigned int isp3a_ris;
27 	enum rkisp_isp_readout_cmd readout;
28 	unsigned long long timestamp;
29 };
30 
31 struct rkisp_isp_stats_ops {
32 	void (*isr_hdl)(struct rkisp_isp_stats_vdev *stats_vdev,
33 			u32 isp_mis, u32 isp3a_ris);
34 	void (*send_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
35 			  struct rkisp_isp_readout_work *meas_work);
36 	void (*rdbk_enable)(struct rkisp_isp_stats_vdev *stats_vdev, bool en);
37 };
38 
39 /*
40  * struct rkisp_isp_stats_vdev - ISP Statistics device
41  *
42  * @irq_lock: buffer queue lock
43  * @stat: stats buffer list
44  * @readout_wq: workqueue for statistics information read
45  */
46 struct rkisp_isp_stats_vdev {
47 	struct rkisp_vdev_node vnode;
48 	struct rkisp_device *dev;
49 
50 	spinlock_t irq_lock;
51 	struct list_head stat;
52 	struct v4l2_format vdev_fmt;
53 	bool streamon;
54 
55 	spinlock_t rd_lock;
56 	struct kfifo rd_kfifo;
57 	struct tasklet_struct rd_tasklet;
58 
59 	struct rkisp_isp_stats_ops *ops;
60 	void *priv_ops;
61 	void *priv_cfg;
62 
63 	struct rkisp_dummy_buffer stats_buf[RKISP_STATS_DDR_BUF_NUM];
64 	u32 rd_buf_idx;
65 	u32 wr_buf_idx;
66 	bool rd_stats_from_ddr;
67 
68 	bool rdbk_mode;
69 	u32 isp_rdbk;
70 	u32 isp3a_rdbk;
71 
72 	struct rkisp_dummy_buffer tmp_statsbuf;
73 	struct rkisp_buffer *cur_buf;
74 };
75 
76 void rkisp_stats_rdbk_enable(struct rkisp_isp_stats_vdev *stats_vdev, bool en);
77 
78 void rkisp_stats_first_ddr_config(struct rkisp_isp_stats_vdev *stats_vdev);
79 
80 void rkisp_stats_isr(struct rkisp_isp_stats_vdev *stats_vdev,
81 		     u32 isp_ris, u32 isp3a_ris);
82 
83 int rkisp_register_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev,
84 			       struct v4l2_device *v4l2_dev,
85 			       struct rkisp_device *dev);
86 
87 void rkisp_unregister_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev);
88 
89 #endif /* _RKISP_ISP_STATS_H */
90