1 #ifndef __UAPI_LINUX_CAM_REQ_MGR_H
2 #define __UAPI_LINUX_CAM_REQ_MGR_H
3 
4 #include <linux/videodev2.h>
5 #include <linux/types.h>
6 #include <linux/ioctl.h>
7 #include <linux/media.h>
8 #include <media/cam_defs.h>
9 
10 #define CAM_REQ_MGR_VNODE_NAME "cam-req-mgr-devnode"
11 
12 #define CAM_DEVICE_TYPE_BASE      (MEDIA_ENT_F_OLD_BASE)
13 #define CAM_VNODE_DEVICE_TYPE     (CAM_DEVICE_TYPE_BASE)
14 #define CAM_SENSOR_DEVICE_TYPE    (CAM_DEVICE_TYPE_BASE + 1)
15 #define CAM_IFE_DEVICE_TYPE       (CAM_DEVICE_TYPE_BASE + 2)
16 #define CAM_ICP_DEVICE_TYPE       (CAM_DEVICE_TYPE_BASE + 3)
17 #define CAM_LRME_DEVICE_TYPE      (CAM_DEVICE_TYPE_BASE + 4)
18 #define CAM_JPEG_DEVICE_TYPE      (CAM_DEVICE_TYPE_BASE + 5)
19 #define CAM_FD_DEVICE_TYPE        (CAM_DEVICE_TYPE_BASE + 6)
20 #define CAM_CPAS_DEVICE_TYPE      (CAM_DEVICE_TYPE_BASE + 7)
21 #define CAM_CSIPHY_DEVICE_TYPE    (CAM_DEVICE_TYPE_BASE + 8)
22 #define CAM_ACTUATOR_DEVICE_TYPE  (CAM_DEVICE_TYPE_BASE + 9)
23 #define CAM_CCI_DEVICE_TYPE       (CAM_DEVICE_TYPE_BASE + 10)
24 #define CAM_FLASH_DEVICE_TYPE     (CAM_DEVICE_TYPE_BASE + 11)
25 #define CAM_EEPROM_DEVICE_TYPE    (CAM_DEVICE_TYPE_BASE + 12)
26 #define CAM_OIS_DEVICE_TYPE       (CAM_DEVICE_TYPE_BASE + 13)
27 
28 /* cam_req_mgr hdl info */
29 #define CAM_REQ_MGR_HDL_IDX_POS           8
30 #define CAM_REQ_MGR_HDL_IDX_MASK          ((1 << CAM_REQ_MGR_HDL_IDX_POS) - 1)
31 #define CAM_REQ_MGR_GET_HDL_IDX(hdl)      (hdl & CAM_REQ_MGR_HDL_IDX_MASK)
32 
33 /**
34  * Max handles supported by cam_req_mgr
35  * It includes both session and device handles
36  */
37 #define CAM_REQ_MGR_MAX_HANDLES           64
38 #define MAX_LINKS_PER_SESSION             2
39 
40 /* V4L event type which user space will subscribe to */
41 #define V4L_EVENT_CAM_REQ_MGR_EVENT       (V4L2_EVENT_PRIVATE_START + 0)
42 
43 /* Specific event ids to get notified in user space */
44 #define V4L_EVENT_CAM_REQ_MGR_SOF            0
45 #define V4L_EVENT_CAM_REQ_MGR_ERROR          1
46 #define V4L_EVENT_CAM_REQ_MGR_SOF_BOOT_TS    2
47 #define V4L_EVENT_CAM_REQ_MGR_MAX            3
48 
49 /* SOF Event status */
50 #define CAM_REQ_MGR_SOF_EVENT_SUCCESS           0
51 #define CAM_REQ_MGR_SOF_EVENT_ERROR             1
52 
53 /* Link control operations */
54 #define CAM_REQ_MGR_LINK_ACTIVATE               0
55 #define CAM_REQ_MGR_LINK_DEACTIVATE             1
56 
57 /**
58  * Request Manager : flush_type
59  * @CAM_REQ_MGR_FLUSH_TYPE_ALL: Req mgr will remove all the pending
60  * requests from input/processing queue.
61  * @CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ: Req mgr will remove only particular
62  * request id from input/processing queue.
63  * @CAM_REQ_MGR_FLUSH_TYPE_MAX: Max number of the flush type
64  * @opcode: CAM_REQ_MGR_FLUSH_REQ
65  */
66 #define CAM_REQ_MGR_FLUSH_TYPE_ALL          0
67 #define CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ   1
68 #define CAM_REQ_MGR_FLUSH_TYPE_MAX          2
69 
70 /**
71  * Request Manager : Sync Mode type
72  * @CAM_REQ_MGR_SYNC_MODE_NO_SYNC: Req mgr will apply non-sync mode for this
73  * request.
74  * @CAM_REQ_MGR_SYNC_MODE_SYNC: Req mgr will apply sync mode for this request.
75  */
76 #define CAM_REQ_MGR_SYNC_MODE_NO_SYNC   0
77 #define CAM_REQ_MGR_SYNC_MODE_SYNC      1
78 
79 /**
80  * struct cam_req_mgr_event_data
81  * @session_hdl: session handle
82  * @link_hdl: link handle
83  * @frame_id: frame id
84  * @reserved: reserved for 64 bit aligngment
85  * @req_id: request id
86  * @tv_sec: timestamp in seconds
87  * @tv_usec: timestamp in micro seconds
88  */
89 struct cam_req_mgr_event_data {
90 	int32_t   session_hdl;
91 	int32_t   link_hdl;
92 	int32_t   frame_id;
93 	int32_t   reserved;
94 	int64_t   req_id;
95 	uint64_t  tv_sec;
96 	uint64_t  tv_usec;
97 };
98 
99 /**
100  * struct cam_req_mgr_session_info
101  * @session_hdl: In/Output param - session_handle
102  * @opcode1: CAM_REQ_MGR_CREATE_SESSION
103  * @opcode2: CAM_REQ_MGR_DESTROY_SESSION
104  */
105 struct cam_req_mgr_session_info {
106 	int32_t session_hdl;
107 	int32_t reserved;
108 };
109 
110 /**
111  * struct cam_req_mgr_link_info
112  * @session_hdl: Input param - Identifier for CSL session
113  * @num_devices: Input Param - Num of devices to be linked
114  * @dev_hdls: Input param - List of device handles to be linked
115  * @link_hdl: Output Param -Identifier for link
116  * @opcode: CAM_REQ_MGR_LINK
117  */
118 struct cam_req_mgr_link_info {
119 	int32_t session_hdl;
120 	uint32_t num_devices;
121 	int32_t dev_hdls[CAM_REQ_MGR_MAX_HANDLES];
122 	int32_t link_hdl;
123 };
124 
125 /**
126  * struct cam_req_mgr_unlink_info
127  * @session_hdl: input param - session handle
128  * @link_hdl: input param - link handle
129  * @opcode: CAM_REQ_MGR_UNLINK
130  */
131 struct cam_req_mgr_unlink_info {
132 	int32_t session_hdl;
133 	int32_t link_hdl;
134 };
135 
136 /**
137  * struct cam_req_mgr_flush_info
138  * @brief: User can tell drivers to flush a particular request id or
139  * flush all requests from its pending processing queue. Flush is a
140  * blocking call and driver shall ensure all requests are flushed
141  * before returning.
142  * @session_hdl: Input param - Identifier for CSL session
143  * @link_hdl: Input Param -Identifier for link
144  * @flush_type: User can cancel a particular req id or can flush
145  * all requests in queue
146  * @reserved: reserved for 64 bit aligngment
147  * @req_id: field is valid only if flush type is cancel request
148  * for flush all this field value is not considered.
149  * @opcode: CAM_REQ_MGR_FLUSH_REQ
150  */
151 struct cam_req_mgr_flush_info {
152 	int32_t session_hdl;
153 	int32_t link_hdl;
154 	uint32_t flush_type;
155 	uint32_t reserved;
156 	int64_t req_id;
157 };
158 
159 /** struct cam_req_mgr_sched_info
160  * @session_hdl: Input param - Identifier for CSL session
161  * @link_hdl: Input Param -Identifier for link
162  * inluding itself.
163  * @bubble_enable: Input Param - Cam req mgr will do bubble recovery if this
164  * flag is set.
165  * @sync_mode: Type of Sync mode for this request
166  * @req_id: Input Param - Request Id from which all requests will be flushed
167  */
168 struct cam_req_mgr_sched_request {
169 	int32_t session_hdl;
170 	int32_t link_hdl;
171 	int32_t bubble_enable;
172 	int32_t sync_mode;
173 	int64_t req_id;
174 };
175 
176 /**
177  * struct cam_req_mgr_sync_mode
178  * @session_hdl:         Input param - Identifier for CSL session
179  * @sync_mode:           Input Param - Type of sync mode
180  * @num_links:           Input Param - Num of links in sync mode (Valid only
181  *                             when sync_mode is one of SYNC enabled modes)
182  * @link_hdls:           Input Param - Array of link handles to be in sync mode
183  *                             (Valid only when sync_mode is one of SYNC
184  *                             enabled modes)
185  * @master_link_hdl:     Input Param - To dictate which link's SOF drives system
186  *                             (Valid only when sync_mode is one of SYNC
187  *                             enabled modes)
188  *
189  * @opcode: CAM_REQ_MGR_SYNC_MODE
190  */
191 struct cam_req_mgr_sync_mode {
192 	int32_t session_hdl;
193 	int32_t sync_mode;
194 	int32_t num_links;
195 	int32_t link_hdls[MAX_LINKS_PER_SESSION];
196 	int32_t master_link_hdl;
197 	int32_t reserved;
198 };
199 
200 /**
201  * struct cam_req_mgr_link_control
202  * @ops:                 Link operations: activate/deactive
203  * @session_hdl:         Input param - Identifier for CSL session
204  * @num_links:           Input Param - Num of links
205  * @reserved:            reserved field
206  * @link_hdls:           Input Param - Links to be activated/deactivated
207  *
208  * @opcode: CAM_REQ_MGR_LINK_CONTROL
209  */
210 struct cam_req_mgr_link_control {
211 	int32_t ops;
212 	int32_t session_hdl;
213 	int32_t num_links;
214 	int32_t reserved;
215 	int32_t link_hdls[MAX_LINKS_PER_SESSION];
216 };
217 
218 /**
219  * cam_req_mgr specific opcode ids
220  */
221 #define CAM_REQ_MGR_CREATE_DEV_NODES            (CAM_COMMON_OPCODE_MAX + 1)
222 #define CAM_REQ_MGR_CREATE_SESSION              (CAM_COMMON_OPCODE_MAX + 2)
223 #define CAM_REQ_MGR_DESTROY_SESSION             (CAM_COMMON_OPCODE_MAX + 3)
224 #define CAM_REQ_MGR_LINK                        (CAM_COMMON_OPCODE_MAX + 4)
225 #define CAM_REQ_MGR_UNLINK                      (CAM_COMMON_OPCODE_MAX + 5)
226 #define CAM_REQ_MGR_SCHED_REQ                   (CAM_COMMON_OPCODE_MAX + 6)
227 #define CAM_REQ_MGR_FLUSH_REQ                   (CAM_COMMON_OPCODE_MAX + 7)
228 #define CAM_REQ_MGR_SYNC_MODE                   (CAM_COMMON_OPCODE_MAX + 8)
229 #define CAM_REQ_MGR_ALLOC_BUF                   (CAM_COMMON_OPCODE_MAX + 9)
230 #define CAM_REQ_MGR_MAP_BUF                     (CAM_COMMON_OPCODE_MAX + 10)
231 #define CAM_REQ_MGR_RELEASE_BUF                 (CAM_COMMON_OPCODE_MAX + 11)
232 #define CAM_REQ_MGR_CACHE_OPS                   (CAM_COMMON_OPCODE_MAX + 12)
233 #define CAM_REQ_MGR_LINK_CONTROL                (CAM_COMMON_OPCODE_MAX + 13)
234 /* end of cam_req_mgr opcodes */
235 
236 #define CAM_MEM_FLAG_HW_READ_WRITE              (1<<0)
237 #define CAM_MEM_FLAG_HW_READ_ONLY               (1<<1)
238 #define CAM_MEM_FLAG_HW_WRITE_ONLY              (1<<2)
239 #define CAM_MEM_FLAG_KMD_ACCESS                 (1<<3)
240 #define CAM_MEM_FLAG_UMD_ACCESS                 (1<<4)
241 #define CAM_MEM_FLAG_PROTECTED_MODE             (1<<5)
242 #define CAM_MEM_FLAG_CMD_BUF_TYPE               (1<<6)
243 #define CAM_MEM_FLAG_PIXEL_BUF_TYPE             (1<<7)
244 #define CAM_MEM_FLAG_STATS_BUF_TYPE             (1<<8)
245 #define CAM_MEM_FLAG_PACKET_BUF_TYPE            (1<<9)
246 #define CAM_MEM_FLAG_CACHE                      (1<<10)
247 #define CAM_MEM_FLAG_HW_SHARED_ACCESS           (1<<11)
248 
249 #define CAM_MEM_MMU_MAX_HANDLE                  16
250 
251 /* Maximum allowed buffers in existence */
252 #define CAM_MEM_BUFQ_MAX                        1024
253 
254 #define CAM_MEM_MGR_SECURE_BIT_POS              15
255 #define CAM_MEM_MGR_HDL_IDX_SIZE                15
256 #define CAM_MEM_MGR_HDL_FD_SIZE                 16
257 #define CAM_MEM_MGR_HDL_IDX_END_POS             16
258 #define CAM_MEM_MGR_HDL_FD_END_POS              32
259 
260 #define CAM_MEM_MGR_HDL_IDX_MASK      ((1 << CAM_MEM_MGR_HDL_IDX_SIZE) - 1)
261 
262 #define GET_MEM_HANDLE(idx, fd) \
263 	((idx & CAM_MEM_MGR_HDL_IDX_MASK) | \
264 	(fd << (CAM_MEM_MGR_HDL_FD_END_POS - CAM_MEM_MGR_HDL_FD_SIZE))) \
265 
266 #define CAM_MEM_MGR_GET_HDL_IDX(hdl) (hdl & CAM_MEM_MGR_HDL_IDX_MASK)
267 
268 #define CAM_MEM_MGR_SET_SECURE_HDL(hdl, flag) \
269 	((flag) ? (hdl |= (1 << CAM_MEM_MGR_SECURE_BIT_POS)) : \
270 	((hdl) &= ~(1 << CAM_MEM_MGR_SECURE_BIT_POS)))
271 
272 #define CAM_MEM_MGR_IS_SECURE_HDL(hdl) \
273 	(((hdl) & \
274 	(1<<CAM_MEM_MGR_SECURE_BIT_POS)) >> CAM_MEM_MGR_SECURE_BIT_POS)
275 
276 /**
277  * memory allocation type
278  */
279 #define CAM_MEM_DMA_NONE                        0
280 #define CAM_MEM_DMA_BIDIRECTIONAL               1
281 #define CAM_MEM_DMA_TO_DEVICE                   2
282 #define CAM_MEM_DMA_FROM_DEVICE                 3
283 
284 
285 /**
286  * memory cache operation
287  */
288 #define CAM_MEM_CLEAN_CACHE                     1
289 #define CAM_MEM_INV_CACHE                       2
290 #define CAM_MEM_CLEAN_INV_CACHE                 3
291 
292 
293 /**
294  * struct cam_mem_alloc_out_params
295  * @buf_handle: buffer handle
296  * @fd: output buffer file descriptor
297  * @vaddr: virtual address pointer
298  */
299 struct cam_mem_alloc_out_params {
300 	uint32_t buf_handle;
301 	int32_t fd;
302 	uint64_t vaddr;
303 };
304 
305 /**
306  * struct cam_mem_map_out_params
307  * @buf_handle: buffer handle
308  * @reserved: reserved for future
309  * @vaddr: virtual address pointer
310  */
311 struct cam_mem_map_out_params {
312 	uint32_t buf_handle;
313 	uint32_t reserved;
314 	uint64_t vaddr;
315 };
316 
317 /**
318  * struct cam_mem_mgr_alloc_cmd
319  * @len: size of buffer to allocate
320  * @align: alignment of the buffer
321  * @mmu_hdls: array of mmu handles
322  * @num_hdl: number of handles
323  * @flags: flags of the buffer
324  * @out: out params
325  */
326 /* CAM_REQ_MGR_ALLOC_BUF */
327 struct cam_mem_mgr_alloc_cmd {
328 	uint64_t len;
329 	uint64_t align;
330 	int32_t mmu_hdls[CAM_MEM_MMU_MAX_HANDLE];
331 	uint32_t num_hdl;
332 	uint32_t flags;
333 	struct cam_mem_alloc_out_params out;
334 };
335 
336 /**
337  * struct cam_mem_mgr_map_cmd
338  * @mmu_hdls: array of mmu handles
339  * @num_hdl: number of handles
340  * @flags: flags of the buffer
341  * @fd: output buffer file descriptor
342  * @reserved: reserved field
343  * @out: out params
344  */
345 
346 /* CAM_REQ_MGR_MAP_BUF */
347 struct cam_mem_mgr_map_cmd {
348 	int32_t mmu_hdls[CAM_MEM_MMU_MAX_HANDLE];
349 	uint32_t num_hdl;
350 	uint32_t flags;
351 	int32_t fd;
352 	uint32_t reserved;
353 	struct cam_mem_map_out_params out;
354 };
355 
356 /**
357  * struct cam_mem_mgr_map_cmd
358  * @buf_handle: buffer handle
359  * @reserved: reserved field
360  */
361 /* CAM_REQ_MGR_RELEASE_BUF */
362 struct cam_mem_mgr_release_cmd {
363 	int32_t buf_handle;
364 	uint32_t reserved;
365 };
366 
367 /**
368  * struct cam_mem_mgr_map_cmd
369  * @buf_handle: buffer handle
370  * @ops: cache operations
371  */
372 /* CAM_REQ_MGR_CACHE_OPS */
373 struct cam_mem_cache_ops_cmd {
374 	int32_t buf_handle;
375 	uint32_t mem_cache_ops;
376 };
377 
378 /**
379  * Request Manager : error message type
380  * @CAM_REQ_MGR_ERROR_TYPE_DEVICE: Device error message, fatal to session
381  * @CAM_REQ_MGR_ERROR_TYPE_REQUEST: Error on a single request, not fatal
382  * @CAM_REQ_MGR_ERROR_TYPE_BUFFER: Buffer was not filled, not fatal
383  */
384 #define CAM_REQ_MGR_ERROR_TYPE_DEVICE           0
385 #define CAM_REQ_MGR_ERROR_TYPE_REQUEST          1
386 #define CAM_REQ_MGR_ERROR_TYPE_BUFFER           2
387 
388 /**
389  * struct cam_req_mgr_error_msg
390  * @error_type: type of error
391  * @request_id: request id of frame
392  * @device_hdl: device handle
393  * @linke_hdl: link_hdl
394  * @resource_size: size of the resource
395  */
396 struct cam_req_mgr_error_msg {
397 	uint32_t error_type;
398 	uint32_t request_id;
399 	int32_t device_hdl;
400 	int32_t link_hdl;
401 	uint64_t resource_size;
402 };
403 
404 /**
405  * struct cam_req_mgr_frame_msg
406  * @request_id: request id of the frame
407  * @frame_id: frame id of the frame
408  * @timestamp: timestamp of the frame
409  * @link_hdl: link handle associated with this message
410  * @sof_status: sof status success or fail
411  */
412 struct cam_req_mgr_frame_msg {
413 	uint64_t request_id;
414 	uint64_t frame_id;
415 	uint64_t timestamp;
416 	int32_t  link_hdl;
417 	uint32_t sof_status;
418 };
419 
420 /**
421  * struct cam_req_mgr_message
422  * @session_hdl: session to which the frame belongs to
423  * @reserved: reserved field
424  * @u: union which can either be error or frame message
425  */
426 struct cam_req_mgr_message {
427 	int32_t session_hdl;
428 	int32_t reserved;
429 	union {
430 		struct cam_req_mgr_error_msg err_msg;
431 		struct cam_req_mgr_frame_msg frame_msg;
432 	} u;
433 };
434 #endif /* __UAPI_LINUX_CAM_REQ_MGR_H */
435