blob: 6205b109f52ba39915809ce99bf241e44de7635e [file] [log] [blame]
Pratap Nirujogi6e759912018-01-17 17:51:17 +05301/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef _MSM_ISP_BUF_H_
14#define _MSM_ISP_BUF_H_
15
16#include <media/msmb_isp.h>
17#include "msm_sd.h"
18
19/* Buffer type could be userspace / HAL.
20 * Userspase could provide native or scratch buffer.
21 */
22#define BUF_SRC(id) ( \
23 (id & ISP_SCRATCH_BUF_BIT) ? MSM_ISP_BUFFER_SRC_SCRATCH : \
24 (id & ISP_NATIVE_BUF_BIT) ? MSM_ISP_BUFFER_SRC_NATIVE : \
25 MSM_ISP_BUFFER_SRC_HAL)
26
27/*
28 * This mask can be set dynamically if there are more than 2 VFE
29 * and 2 of those are used
30 */
31#define ISP_SHARE_BUF_MASK 0x3
32#define ISP_NUM_BUF_MASK 2
33#define BUF_MGR_NUM_BUF_Q 28
34#define MAX_IOMMU_CTX 2
35
36#define MSM_ISP_INVALID_BUF_INDEX 0xFFFFFFFF
37
38struct msm_isp_buf_mgr;
39
40enum msm_isp_buffer_src_t {
41 MSM_ISP_BUFFER_SRC_HAL,
42 MSM_ISP_BUFFER_SRC_NATIVE,
43 MSM_ISP_BUFFER_SRC_SCRATCH,
44 MSM_ISP_BUFFER_SRC_MAX,
45};
46
47enum msm_isp_buffer_state {
48 MSM_ISP_BUFFER_STATE_UNUSED, /* not used */
49 MSM_ISP_BUFFER_STATE_INITIALIZED, /* REQBUF done */
50 MSM_ISP_BUFFER_STATE_PREPARED, /* BUF mapped */
51 MSM_ISP_BUFFER_STATE_QUEUED, /* buf queued */
52 MSM_ISP_BUFFER_STATE_DEQUEUED, /* in use in VFE */
53 MSM_ISP_BUFFER_STATE_DIVERTED, /* Sent to other hardware*/
54 MSM_ISP_BUFFER_STATE_DISPATCHED, /* Sent to HAL*/
55};
56
57enum msm_isp_buffer_put_state {
58 MSM_ISP_BUFFER_STATE_PUT_PREPARED, /* on init */
59 MSM_ISP_BUFFER_STATE_PUT_BUF, /* on rotation */
60 MSM_ISP_BUFFER_STATE_FLUSH, /* on recovery */
61 MSM_ISP_BUFFER_STATE_DROP_REG, /* on drop frame for reg_update */
62 MSM_ISP_BUFFER_STATE_DROP_SKIP, /* on drop frame for sw skip */
63 MSM_ISP_BUFFER_STATE_RETURN_EMPTY, /* for return empty */
64};
65
66enum msm_isp_buffer_flush_t {
67 MSM_ISP_BUFFER_FLUSH_DIVERTED,
68 MSM_ISP_BUFFER_FLUSH_ALL,
69};
70
71enum msm_isp_buf_mgr_state {
72 MSM_ISP_BUF_MGR_ATTACH,
73 MSM_ISP_BUF_MGR_DETACH,
74};
75
76struct msm_isp_buffer_mapped_info {
77 size_t len;
78 dma_addr_t paddr;
79 int buf_fd;
80};
81
82struct buffer_cmd {
83 struct list_head list;
84 struct msm_isp_buffer_mapped_info *mapped_info;
85};
86
87struct msm_isp_buffer_debug_t {
88 enum msm_isp_buffer_put_state put_state[2];
89 uint8_t put_state_last;
90};
91
92struct msm_isp_buffer {
93 /*Common Data structure*/
94 int num_planes;
95 struct msm_isp_buffer_mapped_info mapped_info[VIDEO_MAX_PLANES];
96 int buf_idx;
97 uint32_t bufq_handle;
98 uint32_t frame_id;
99 struct timeval *tv;
100 /* Indicates whether buffer is used as ping ot pong buffer */
101 uint32_t pingpong_bit;
102 /* Indicates buffer is reconfig due to drop frame */
103 uint32_t is_drop_reconfig;
104
105 /*Native buffer*/
106 struct list_head list;
107 enum msm_isp_buffer_state state;
108
109 struct msm_isp_buffer_debug_t buf_debug;
110
111 /*Vb2 buffer data*/
112 struct vb2_v4l2_buffer *vb2_v4l2_buf;
113};
114
115struct msm_isp_bufq {
116 uint32_t session_id;
117 uint32_t stream_id;
118 uint32_t num_bufs;
119 uint32_t bufq_handle;
120 enum msm_isp_buf_type buf_type;
121 struct msm_isp_buffer *bufs;
122 spinlock_t bufq_lock;
123 /*Native buffer queue*/
124 struct list_head head;
125 enum smmu_attach_mode security_mode;
126};
127
128struct msm_isp_buf_ops {
129 int (*request_buf)(struct msm_isp_buf_mgr *buf_mgr,
130 struct msm_isp_buf_request_ver2 *buf_request);
131
132 int (*enqueue_buf)(struct msm_isp_buf_mgr *buf_mgr,
133 struct msm_isp_qbuf_info *info);
134
135 int (*dequeue_buf)(struct msm_isp_buf_mgr *buf_mgr,
136 struct msm_isp_qbuf_info *info);
137
138 int (*release_buf)(struct msm_isp_buf_mgr *buf_mgr,
139 uint32_t bufq_handle);
140
141 int (*get_bufq_handle)(struct msm_isp_buf_mgr *buf_mgr,
142 uint32_t session_id, uint32_t stream_id);
143
144 int (*get_buf_src)(struct msm_isp_buf_mgr *buf_mgr,
145 uint32_t bufq_handle, uint32_t *buf_src);
146
147 int (*get_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id,
148 uint32_t bufq_handle, uint32_t buf_index,
149 struct msm_isp_buffer **buf_info);
150
151 int (*get_buf_by_index)(struct msm_isp_buf_mgr *buf_mgr,
152 uint32_t bufq_handle, uint32_t buf_index,
153 struct msm_isp_buffer **buf_info);
154
155 int (*map_buf)(struct msm_isp_buf_mgr *buf_mgr,
156 struct msm_isp_buffer_mapped_info *mapped_info, uint32_t fd);
157
158 int (*unmap_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t fd);
159
160 int (*put_buf)(struct msm_isp_buf_mgr *buf_mgr,
161 uint32_t bufq_handle, uint32_t buf_index);
162
163 int (*flush_buf)(struct msm_isp_buf_mgr *buf_mgr,
164 uint32_t bufq_handle, enum msm_isp_buffer_flush_t flush_type,
165 struct timeval *tv, uint32_t frame_id);
166
167 int (*buf_done)(struct msm_isp_buf_mgr *buf_mgr,
168 uint32_t bufq_handle, uint32_t buf_index,
169 struct timeval *tv, uint32_t frame_id, uint32_t output_format);
170 void (*register_ctx)(struct msm_isp_buf_mgr *buf_mgr,
171 struct device **iommu_ctx1, struct device **iommu_ctx2,
172 int num_iommu_ctx1, int num_iommu_ctx2);
173 int (*buf_mgr_init)(struct msm_isp_buf_mgr *buf_mgr,
174 const char *ctx_name);
175 int (*buf_mgr_deinit)(struct msm_isp_buf_mgr *buf_mgr);
176 int (*buf_mgr_debug)(struct msm_isp_buf_mgr *buf_mgr,
177 unsigned long fault_addr);
178 struct msm_isp_bufq * (*get_bufq)(struct msm_isp_buf_mgr *buf_mgr,
179 uint32_t bufq_handle);
180 int (*buf_divert)(struct msm_isp_buf_mgr *buf_mgr,
181 uint32_t bufq_handle, uint32_t buf_index,
182 struct timeval *tv, uint32_t frame_id);
weikaoccbc8892020-08-28 13:49:39 +0800183 int (*buf_err)(struct msm_isp_buf_mgr *buf_mgr,
184 uint32_t bufq_handle, uint32_t buf_index,
185 struct timeval *tv, uint32_t frame_id, uint32_t output_format);
Pratap Nirujogi6e759912018-01-17 17:51:17 +0530186};
187
188struct msm_isp_buf_mgr {
189 int init_done;
190 uint32_t open_count;
191 uint32_t pagefault_debug_disable;
192 uint32_t frameId_mismatch_recovery;
193 uint16_t num_buf_q;
194 struct msm_isp_bufq bufq[BUF_MGR_NUM_BUF_Q];
195
196 struct ion_client *client;
197 struct msm_isp_buf_ops *ops;
198
199 struct msm_sd_req_vb2_q *vb2_ops;
200
201
202 /*Add secure mode*/
203 int secure_enable;
204
205 int attach_ref_cnt;
206 enum msm_isp_buf_mgr_state attach_state;
207 struct device *isp_dev;
208 struct mutex lock;
209 /* Scratch buffer */
210 dma_addr_t scratch_buf_addr;
211 dma_addr_t scratch_buf_stats_addr;
212 uint32_t scratch_buf_range;
213 int iommu_hdl;
214 struct ion_handle *sc_handle;
215};
216
217int msm_isp_create_isp_buf_mgr(struct msm_isp_buf_mgr *buf_mgr,
218 struct msm_sd_req_vb2_q *vb2_ops, struct device *dev,
219 uint32_t scratch_addr_range);
220
221int msm_isp_proc_buf_cmd(struct msm_isp_buf_mgr *buf_mgr,
222 unsigned int cmd, void *arg);
223
224int msm_isp_smmu_attach(struct msm_isp_buf_mgr *buf_mgr,
225 void *arg);
226
227#endif /* _MSM_ISP_BUF_H_ */