Home | History | Annotate | Download | only in media
      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