blob: fa20a95a39a32c72d7d88dfa52e88cd09a077b84 [file] [log] [blame]
/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _MSM_ISP_BUF_H_
#define _MSM_ISP_BUF_H_
#include <media/msmb_isp.h>
#include "msm_sd.h"
/* Buffer type could be userspace / HAL.
* Userspase could provide native or scratch buffer.
*/
#define BUF_SRC(id) ( \
(id & ISP_SCRATCH_BUF_BIT) ? MSM_ISP_BUFFER_SRC_SCRATCH : \
(id & ISP_NATIVE_BUF_BIT) ? MSM_ISP_BUFFER_SRC_NATIVE : \
MSM_ISP_BUFFER_SRC_HAL)
/*
* This mask can be set dynamically if there are more than 2 VFE
* and 2 of those are used
*/
#define ISP_SHARE_BUF_MASK 0x3
#define ISP_NUM_BUF_MASK 2
#define BUF_MGR_NUM_BUF_Q 28
#define MAX_IOMMU_CTX 2
#define MSM_ISP_INVALID_BUF_INDEX 0xFFFFFFFF
struct msm_isp_buf_mgr;
enum msm_isp_buffer_src_t {
MSM_ISP_BUFFER_SRC_HAL,
MSM_ISP_BUFFER_SRC_NATIVE,
MSM_ISP_BUFFER_SRC_SCRATCH,
MSM_ISP_BUFFER_SRC_MAX,
};
enum msm_isp_buffer_state {
MSM_ISP_BUFFER_STATE_UNUSED, /* not used */
MSM_ISP_BUFFER_STATE_INITIALIZED, /* REQBUF done */
MSM_ISP_BUFFER_STATE_PREPARED, /* BUF mapped */
MSM_ISP_BUFFER_STATE_QUEUED, /* buf queued */
MSM_ISP_BUFFER_STATE_DEQUEUED, /* in use in VFE */
MSM_ISP_BUFFER_STATE_DIVERTED, /* Sent to other hardware*/
MSM_ISP_BUFFER_STATE_DISPATCHED, /* Sent to HAL*/
};
enum msm_isp_buffer_put_state {
MSM_ISP_BUFFER_STATE_PUT_PREPARED, /* on init */
MSM_ISP_BUFFER_STATE_PUT_BUF, /* on rotation */
MSM_ISP_BUFFER_STATE_FLUSH, /* on recovery */
MSM_ISP_BUFFER_STATE_DROP_REG, /* on drop frame for reg_update */
MSM_ISP_BUFFER_STATE_DROP_SKIP, /* on drop frame for sw skip */
MSM_ISP_BUFFER_STATE_RETURN_EMPTY, /* for return empty */
};
enum msm_isp_buffer_flush_t {
MSM_ISP_BUFFER_FLUSH_DIVERTED,
MSM_ISP_BUFFER_FLUSH_ALL,
};
enum msm_isp_buf_mgr_state {
MSM_ISP_BUF_MGR_ATTACH,
MSM_ISP_BUF_MGR_DETACH,
};
struct msm_isp_buffer_mapped_info {
size_t len;
dma_addr_t paddr;
int buf_fd;
};
struct buffer_cmd {
struct list_head list;
struct msm_isp_buffer_mapped_info *mapped_info;
};
struct msm_isp_buffer_debug_t {
enum msm_isp_buffer_put_state put_state[2];
uint8_t put_state_last;
};
struct msm_isp_buffer {
/*Common Data structure*/
int num_planes;
struct msm_isp_buffer_mapped_info mapped_info[VIDEO_MAX_PLANES];
int buf_idx;
uint32_t bufq_handle;
uint32_t frame_id;
struct timeval *tv;
/* Indicates whether buffer is used as ping ot pong buffer */
uint32_t pingpong_bit;
/* Indicates buffer is reconfig due to drop frame */
uint32_t is_drop_reconfig;
/*Native buffer*/
struct list_head list;
enum msm_isp_buffer_state state;
struct msm_isp_buffer_debug_t buf_debug;
/*Vb2 buffer data*/
struct vb2_v4l2_buffer *vb2_v4l2_buf;
};
struct msm_isp_bufq {
uint32_t session_id;
uint32_t stream_id;
uint32_t num_bufs;
uint32_t bufq_handle;
enum msm_isp_buf_type buf_type;
struct msm_isp_buffer *bufs;
spinlock_t bufq_lock;
/*Native buffer queue*/
struct list_head head;
enum smmu_attach_mode security_mode;
};
struct msm_isp_buf_ops {
int (*request_buf)(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_buf_request_ver2 *buf_request);
int (*enqueue_buf)(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_qbuf_info *info);
int (*dequeue_buf)(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_qbuf_info *info);
int (*release_buf)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle);
int (*get_bufq_handle)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t session_id, uint32_t stream_id);
int (*get_buf_src)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t *buf_src);
int (*get_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id,
uint32_t bufq_handle, uint32_t buf_index,
struct msm_isp_buffer **buf_info);
int (*get_buf_by_index)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t buf_index,
struct msm_isp_buffer **buf_info);
int (*map_buf)(struct msm_isp_buf_mgr *buf_mgr,
struct msm_isp_buffer_mapped_info *mapped_info, uint32_t fd);
int (*unmap_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t fd);
int (*put_buf)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t buf_index);
int (*flush_buf)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, enum msm_isp_buffer_flush_t flush_type,
struct timeval *tv, uint32_t frame_id);
int (*buf_done)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t buf_index,
struct timeval *tv, uint32_t frame_id, uint32_t output_format);
void (*register_ctx)(struct msm_isp_buf_mgr *buf_mgr,
struct device **iommu_ctx1, struct device **iommu_ctx2,
int num_iommu_ctx1, int num_iommu_ctx2);
int (*buf_mgr_init)(struct msm_isp_buf_mgr *buf_mgr,
const char *ctx_name);
int (*buf_mgr_deinit)(struct msm_isp_buf_mgr *buf_mgr);
int (*buf_mgr_debug)(struct msm_isp_buf_mgr *buf_mgr,
unsigned long fault_addr);
struct msm_isp_bufq * (*get_bufq)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle);
int (*buf_divert)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t buf_index,
struct timeval *tv, uint32_t frame_id);
int (*buf_err)(struct msm_isp_buf_mgr *buf_mgr,
uint32_t bufq_handle, uint32_t buf_index,
struct timeval *tv, uint32_t frame_id, uint32_t output_format);
};
struct msm_isp_buf_mgr {
int init_done;
uint32_t open_count;
uint32_t pagefault_debug_disable;
uint32_t frameId_mismatch_recovery;
uint16_t num_buf_q;
struct msm_isp_bufq bufq[BUF_MGR_NUM_BUF_Q];
struct ion_client *client;
struct msm_isp_buf_ops *ops;
struct msm_sd_req_vb2_q *vb2_ops;
/*Add secure mode*/
int secure_enable;
int attach_ref_cnt;
enum msm_isp_buf_mgr_state attach_state;
struct device *isp_dev;
struct mutex lock;
/* Scratch buffer */
dma_addr_t scratch_buf_addr;
dma_addr_t scratch_buf_stats_addr;
uint32_t scratch_buf_range;
int iommu_hdl;
struct ion_handle *sc_handle;
};
int msm_isp_create_isp_buf_mgr(struct msm_isp_buf_mgr *buf_mgr,
struct msm_sd_req_vb2_q *vb2_ops, struct device *dev,
uint32_t scratch_addr_range);
int msm_isp_proc_buf_cmd(struct msm_isp_buf_mgr *buf_mgr,
unsigned int cmd, void *arg);
int msm_isp_smmu_attach(struct msm_isp_buf_mgr *buf_mgr,
void *arg);
#endif /* _MSM_ISP_BUF_H_ */