Merge "msm: camera: isp: Use HAL sent frameid for offline buffer"
This commit is contained in:
commit
691251103e
|
@ -206,6 +206,67 @@ static void msm_isp_unprepare_v4l2_buf(
|
|||
return;
|
||||
}
|
||||
|
||||
static int msm_isp_map_buf(struct msm_isp_buf_mgr *buf_mgr,
|
||||
struct msm_isp_buffer_mapped_info *mapped_info, uint32_t fd)
|
||||
{
|
||||
int rc = 0;
|
||||
int ret;
|
||||
int iommu_hdl;
|
||||
|
||||
if (!buf_mgr || !mapped_info) {
|
||||
pr_err_ratelimited("%s: %d] NULL ptr buf_mgr %p mapped_info %p\n",
|
||||
__func__, __LINE__, buf_mgr, mapped_info);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (buf_mgr->secure_enable == NON_SECURE_MODE)
|
||||
iommu_hdl = buf_mgr->ns_iommu_hdl;
|
||||
else
|
||||
iommu_hdl = buf_mgr->sec_iommu_hdl;
|
||||
|
||||
ret = cam_smmu_get_phy_addr(iommu_hdl,
|
||||
fd,
|
||||
CAM_SMMU_MAP_RW,
|
||||
&(mapped_info->paddr),
|
||||
(size_t *)&(mapped_info->len));
|
||||
|
||||
if (ret) {
|
||||
rc = -EINVAL;
|
||||
pr_err_ratelimited("%s: cannot map address", __func__);
|
||||
goto smmu_map_error;
|
||||
}
|
||||
CDBG("%s: addr:%lu\n",
|
||||
__func__, (unsigned long)mapped_info->paddr);
|
||||
|
||||
return rc;
|
||||
smmu_map_error:
|
||||
cam_smmu_put_phy_addr(iommu_hdl,
|
||||
fd);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int msm_isp_unmap_buf(struct msm_isp_buf_mgr *buf_mgr,
|
||||
uint32_t fd)
|
||||
{
|
||||
int iommu_hdl;
|
||||
|
||||
if (!buf_mgr) {
|
||||
pr_err_ratelimited("%s: %d] NULL ptr buf_mgr\n",
|
||||
__func__, __LINE__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (buf_mgr->secure_enable == NON_SECURE_MODE)
|
||||
iommu_hdl = buf_mgr->ns_iommu_hdl;
|
||||
else
|
||||
iommu_hdl = buf_mgr->sec_iommu_hdl;
|
||||
|
||||
cam_smmu_put_phy_addr(iommu_hdl,
|
||||
fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_isp_buf_prepare(struct msm_isp_buf_mgr *buf_mgr,
|
||||
struct msm_isp_qbuf_info *info, struct vb2_buffer *vb2_buf)
|
||||
{
|
||||
|
@ -1188,24 +1249,34 @@ int msm_isp_proc_buf_cmd(struct msm_isp_buf_mgr *buf_mgr,
|
|||
switch (cmd) {
|
||||
case VIDIOC_MSM_ISP_REQUEST_BUF: {
|
||||
struct msm_isp_buf_request *buf_req = arg;
|
||||
|
||||
buf_mgr->ops->request_buf(buf_mgr, buf_req);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_MSM_ISP_ENQUEUE_BUF: {
|
||||
struct msm_isp_qbuf_info *qbuf_info = arg;
|
||||
|
||||
buf_mgr->ops->enqueue_buf(buf_mgr, qbuf_info);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_MSM_ISP_DEQUEUE_BUF: {
|
||||
struct msm_isp_qbuf_info *qbuf_info = arg;
|
||||
|
||||
buf_mgr->ops->dequeue_buf(buf_mgr, qbuf_info);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_MSM_ISP_RELEASE_BUF: {
|
||||
struct msm_isp_buf_request *buf_req = arg;
|
||||
|
||||
buf_mgr->ops->release_buf(buf_mgr, buf_req->handle);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_MSM_ISP_UNMAP_BUF: {
|
||||
struct msm_isp_unmap_buf_req *unmap_req = arg;
|
||||
|
||||
buf_mgr->ops->unmap_buf(buf_mgr, unmap_req->fd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1274,6 +1345,8 @@ static struct msm_isp_buf_ops isp_buf_ops = {
|
|||
.get_buf_src = msm_isp_get_buf_src,
|
||||
.get_buf = msm_isp_get_buf,
|
||||
.get_buf_by_index = msm_isp_get_buf_by_index,
|
||||
.map_buf = msm_isp_map_buf,
|
||||
.unmap_buf = msm_isp_unmap_buf,
|
||||
.put_buf = msm_isp_put_buf,
|
||||
.flush_buf = msm_isp_flush_buf,
|
||||
.buf_done = msm_isp_buf_done,
|
||||
|
|
|
@ -130,7 +130,12 @@ struct msm_isp_buf_ops {
|
|||
uint32_t bufq_handle, uint32_t buf_index,
|
||||
struct msm_isp_buffer **buf_info);
|
||||
|
||||
int (*put_buf) (struct msm_isp_buf_mgr *buf_mgr,
|
||||
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,
|
||||
|
|
|
@ -420,6 +420,8 @@ struct msm_vfe_fetch_engine_info {
|
|||
uint32_t bufq_handle;
|
||||
uint32_t buf_idx;
|
||||
uint8_t is_busy;
|
||||
uint8_t offline_mode;
|
||||
uint32_t fd;
|
||||
};
|
||||
|
||||
enum msm_wm_ub_cfg_type {
|
||||
|
|
|
@ -1079,37 +1079,56 @@ static int msm_vfe40_start_fetch_engine(struct vfe_device *vfe_dev,
|
|||
void *arg)
|
||||
{
|
||||
int rc = 0;
|
||||
uint32_t bufq_handle;
|
||||
uint32_t bufq_handle = 0;
|
||||
struct msm_isp_buffer *buf = NULL;
|
||||
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
|
||||
struct msm_isp_buffer_mapped_info mapped_info;
|
||||
|
||||
if (vfe_dev->fetch_engine_info.is_busy == 1) {
|
||||
pr_err("%s: fetch engine busy\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
|
||||
/* There is other option of passing buffer address from user,
|
||||
* in such case, driver needs to map the buffer and use it*/
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
in such case, driver needs to map the buffer and use it*/
|
||||
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
|
||||
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
|
||||
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
|
||||
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (!fe_cfg->offline_mode) {
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id,
|
||||
fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0 || !buf) {
|
||||
pr_err("%s: No fetch buffer rc= %d buf= %p\n",
|
||||
__func__, rc, buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
mapped_info = buf->mapped_info[0];
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
|
||||
} else {
|
||||
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
|
||||
&mapped_info, fe_cfg->fd);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: No fetch buffer\n", __func__);
|
||||
pr_err("%s: can not map buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
}
|
||||
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
|
||||
vfe_dev->fetch_engine_info.is_busy = 1;
|
||||
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x228);
|
||||
|
||||
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x228);
|
||||
|
||||
msm_camera_io_w_mb(0x10000, vfe_dev->vfe_base + 0x4C);
|
||||
msm_camera_io_w_mb(0x20000, vfe_dev->vfe_base + 0x4C);
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DIVERTED;
|
||||
|
||||
ISP_DBG("%s:VFE%d Fetch Engine ready\n", __func__, vfe_dev->pdev->id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -931,37 +931,51 @@ static int msm_vfe44_fetch_engine_start(struct vfe_device *vfe_dev,
|
|||
uint32_t bufq_handle;
|
||||
struct msm_isp_buffer *buf = NULL;
|
||||
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
|
||||
struct msm_isp_buffer_mapped_info mapped_info;
|
||||
|
||||
if (vfe_dev->fetch_engine_info.is_busy == 1) {
|
||||
pr_err("%s: fetch engine busy\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
|
||||
/* There is other option of passing buffer address from user,
|
||||
in such case, driver needs to map the buffer and use it*/
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
|
||||
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
|
||||
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
|
||||
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: No fetch buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
if (!fe_cfg->offline_mode) {
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id,
|
||||
fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: No fetch buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
mapped_info = buf->mapped_info[0];
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
|
||||
} else {
|
||||
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
|
||||
&mapped_info, fe_cfg->fd);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: can not map buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
|
||||
vfe_dev->fetch_engine_info.is_busy = 1;
|
||||
|
||||
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x228);
|
||||
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x228);
|
||||
|
||||
msm_camera_io_w_mb(0x10000, vfe_dev->vfe_base + 0x4C);
|
||||
msm_camera_io_w_mb(0x20000, vfe_dev->vfe_base + 0x4C);
|
||||
|
||||
ISP_DBG("%s: Fetch Engine ready\n", __func__);
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DIVERTED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -750,7 +750,7 @@ static int32_t msm_vfe46_convert_bpp_to_reg(int32_t bpp, uint32_t *bpp_reg)
|
|||
*bpp_reg = 0x3;
|
||||
break;
|
||||
default:
|
||||
pr_err("%s:%d invalid bpp %d", __func__, __LINE__, bpp);
|
||||
pr_err("%s:%d invalid bpp %d\n", __func__, __LINE__, bpp);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -870,40 +870,56 @@ static int msm_vfe46_start_fetch_engine(struct vfe_device *vfe_dev,
|
|||
void *arg)
|
||||
{
|
||||
int rc = 0;
|
||||
uint32_t bufq_handle;
|
||||
uint32_t bufq_handle = 0;
|
||||
struct msm_isp_buffer *buf = NULL;
|
||||
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
|
||||
struct msm_isp_buffer_mapped_info mapped_info;
|
||||
|
||||
if (vfe_dev->fetch_engine_info.is_busy == 1) {
|
||||
pr_err("%s: fetch engine busy\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
|
||||
/* There is other option of passing buffer address from user,
|
||||
in such case, driver needs to map the buffer and use it*/
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
|
||||
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
|
||||
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
|
||||
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: No fetch buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
if (!fe_cfg->offline_mode) {
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id,
|
||||
fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0 || !buf) {
|
||||
pr_err("%s: No fetch buffer rc= %d buf= %p\n",
|
||||
__func__, rc, buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
mapped_info = buf->mapped_info[0];
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
|
||||
} else {
|
||||
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
|
||||
&mapped_info, fe_cfg->fd);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: can not map buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
|
||||
vfe_dev->fetch_engine_info.is_busy = 1;
|
||||
|
||||
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x268);
|
||||
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x268);
|
||||
|
||||
msm_camera_io_w_mb(0x100000, vfe_dev->vfe_base + 0x80);
|
||||
msm_camera_io_w_mb(0x200000, vfe_dev->vfe_base + 0x80);
|
||||
|
||||
ISP_DBG("%s:VFE%d Fetch Engine ready\n", __func__, vfe_dev->pdev->id);
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -908,39 +908,58 @@ static int msm_vfe47_start_fetch_engine(struct vfe_device *vfe_dev,
|
|||
void *arg)
|
||||
{
|
||||
int rc = 0;
|
||||
uint32_t bufq_handle;
|
||||
uint32_t bufq_handle = 0;
|
||||
struct msm_isp_buffer *buf = NULL;
|
||||
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
|
||||
struct msm_isp_buffer_mapped_info mapped_info;
|
||||
|
||||
if (vfe_dev->fetch_engine_info.is_busy == 1) {
|
||||
pr_err("%s: fetch engine busy\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(&mapped_info, 0, sizeof(struct msm_isp_buffer_mapped_info));
|
||||
|
||||
/* There is other option of passing buffer address from user,
|
||||
in such case, driver needs to map the buffer and use it*/
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id, fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
vfe_dev->fetch_engine_info.session_id = fe_cfg->session_id;
|
||||
vfe_dev->fetch_engine_info.stream_id = fe_cfg->stream_id;
|
||||
vfe_dev->fetch_engine_info.offline_mode = fe_cfg->offline_mode;
|
||||
vfe_dev->fetch_engine_info.fd = fe_cfg->fd;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: No fetch buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
if (!fe_cfg->offline_mode) {
|
||||
bufq_handle = vfe_dev->buf_mgr->ops->get_bufq_handle(
|
||||
vfe_dev->buf_mgr, fe_cfg->session_id,
|
||||
fe_cfg->stream_id);
|
||||
vfe_dev->fetch_engine_info.bufq_handle = bufq_handle;
|
||||
|
||||
rc = vfe_dev->buf_mgr->ops->get_buf_by_index(
|
||||
vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf);
|
||||
if (rc < 0 || !buf) {
|
||||
pr_err("%s: No fetch buffer rc= %d buf= %p\n",
|
||||
__func__, rc, buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
mapped_info = buf->mapped_info[0];
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
|
||||
} else {
|
||||
rc = vfe_dev->buf_mgr->ops->map_buf(vfe_dev->buf_mgr,
|
||||
&mapped_info, fe_cfg->fd);
|
||||
if (rc < 0) {
|
||||
pr_err("%s: can not map buffer\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
vfe_dev->fetch_engine_info.buf_idx = fe_cfg->buf_idx;
|
||||
vfe_dev->fetch_engine_info.is_busy = 1;
|
||||
|
||||
msm_camera_io_w(buf->mapped_info[0].paddr, vfe_dev->vfe_base + 0x2F4);
|
||||
msm_camera_io_w(mapped_info.paddr, vfe_dev->vfe_base + 0x2F4);
|
||||
|
||||
msm_camera_io_w_mb(0x100000, vfe_dev->vfe_base + 0x80);
|
||||
msm_camera_io_w_mb(0x200000, vfe_dev->vfe_base + 0x80);
|
||||
|
||||
ISP_DBG("%s:VFE%d Fetch Engine ready\n", __func__, vfe_dev->pdev->id);
|
||||
buf->state = MSM_ISP_BUFFER_STATE_DISPATCHED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -589,6 +589,21 @@ static int msm_isp_set_clk_rate(struct vfe_device *vfe_dev, long *rate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int msm_isp_start_fetch_engine(struct vfe_device *vfe_dev,
|
||||
void *arg)
|
||||
{
|
||||
struct msm_vfe_fetch_eng_start *fe_cfg = arg;
|
||||
/*
|
||||
* For Offline VFE, HAL expects same frame id
|
||||
* for offline output which it requested in do_reprocess.
|
||||
*/
|
||||
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id =
|
||||
fe_cfg->frame_id;
|
||||
return vfe_dev->hw_info->vfe_ops.core_ops.
|
||||
start_fetch_eng(vfe_dev, arg);
|
||||
}
|
||||
|
||||
void msm_isp_fetch_engine_done_notify(struct vfe_device *vfe_dev,
|
||||
struct msm_vfe_fetch_engine_info *fetch_engine_info)
|
||||
{
|
||||
|
@ -596,17 +611,18 @@ void msm_isp_fetch_engine_done_notify(struct vfe_device *vfe_dev,
|
|||
if (!fetch_engine_info->is_busy)
|
||||
return;
|
||||
|
||||
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id++;
|
||||
if (vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id == 0)
|
||||
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id = 1;
|
||||
|
||||
memset(&fe_rd_done_event, 0, sizeof(struct msm_isp_event_data));
|
||||
fe_rd_done_event.frame_id =
|
||||
vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id;
|
||||
fe_rd_done_event.u.buf_done.session_id = fetch_engine_info->session_id;
|
||||
fe_rd_done_event.u.buf_done.stream_id = fetch_engine_info->stream_id;
|
||||
fe_rd_done_event.u.buf_done.handle = fetch_engine_info->bufq_handle;
|
||||
fe_rd_done_event.u.buf_done.buf_idx = fetch_engine_info->buf_idx;
|
||||
fe_rd_done_event.u.fetch_done.session_id =
|
||||
fetch_engine_info->session_id;
|
||||
fe_rd_done_event.u.fetch_done.stream_id = fetch_engine_info->stream_id;
|
||||
fe_rd_done_event.u.fetch_done.handle = fetch_engine_info->bufq_handle;
|
||||
fe_rd_done_event.u.fetch_done.buf_idx = fetch_engine_info->buf_idx;
|
||||
fe_rd_done_event.u.fetch_done.fd = fetch_engine_info->fd;
|
||||
fe_rd_done_event.u.fetch_done.offline_mode =
|
||||
fetch_engine_info->offline_mode;
|
||||
|
||||
ISP_DBG("%s:VFE%d ISP_EVENT_FE_READ_DONE buf_idx %d\n",
|
||||
__func__, vfe_dev->pdev->id, fetch_engine_info->buf_idx);
|
||||
fetch_engine_info->is_busy = 0;
|
||||
|
@ -998,6 +1014,8 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd,
|
|||
/* fallthrough */
|
||||
case VIDIOC_MSM_ISP_DEQUEUE_BUF:
|
||||
/* fallthrough */
|
||||
case VIDIOC_MSM_ISP_UNMAP_BUF:
|
||||
/* fallthrough */
|
||||
case VIDIOC_MSM_ISP_RELEASE_BUF: {
|
||||
mutex_lock(&vfe_dev->buf_mgr_mutex);
|
||||
rc = msm_isp_proc_buf_cmd(vfe_dev->buf_mgr, cmd, arg);
|
||||
|
@ -1062,9 +1080,9 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd,
|
|||
mutex_unlock(&vfe_dev->core_mutex);
|
||||
break;
|
||||
case VIDIOC_MSM_ISP_FETCH_ENG_START:
|
||||
case VIDIOC_MSM_ISP_MAP_BUF_START_FE:
|
||||
mutex_lock(&vfe_dev->core_mutex);
|
||||
rc = vfe_dev->hw_info->vfe_ops.core_ops.
|
||||
start_fetch_eng(vfe_dev, arg);
|
||||
rc = msm_isp_start_fetch_engine(vfe_dev, arg);
|
||||
mutex_unlock(&vfe_dev->core_mutex);
|
||||
break;
|
||||
case VIDIOC_MSM_ISP_REG_UPDATE_CMD:
|
||||
|
|
|
@ -240,7 +240,10 @@ struct msm_vfe_fetch_eng_start {
|
|||
uint32_t session_id;
|
||||
uint32_t stream_id;
|
||||
uint32_t buf_idx;
|
||||
uint8_t offline_mode;
|
||||
uint32_t fd;
|
||||
uint32_t buf_addr;
|
||||
uint32_t frame_id;
|
||||
};
|
||||
|
||||
struct msm_vfe_axi_plane_cfg {
|
||||
|
@ -489,6 +492,10 @@ enum msm_isp_buf_type {
|
|||
MAX_ISP_BUF_TYPE,
|
||||
};
|
||||
|
||||
struct msm_isp_unmap_buf_req {
|
||||
uint32_t fd;
|
||||
};
|
||||
|
||||
struct msm_isp_buf_request {
|
||||
uint32_t session_id;
|
||||
uint32_t stream_id;
|
||||
|
@ -621,6 +628,14 @@ struct msm_isp_buf_event {
|
|||
uint32_t output_format;
|
||||
int8_t buf_idx;
|
||||
};
|
||||
struct msm_isp_fetch_eng_event {
|
||||
uint32_t session_id;
|
||||
uint32_t stream_id;
|
||||
uint32_t handle;
|
||||
uint32_t fd;
|
||||
int8_t buf_idx;
|
||||
int8_t offline_mode;
|
||||
};
|
||||
struct msm_isp_stats_event {
|
||||
uint32_t stats_mask; /* 4 bytes */
|
||||
uint8_t stats_buf_idxs[MSM_ISP_STATS_MAX]; /* 11 bytes */
|
||||
|
@ -692,6 +707,8 @@ struct msm_isp_event_data {
|
|||
struct msm_isp_stats_event stats;
|
||||
/* Sent for Buf_Divert event */
|
||||
struct msm_isp_buf_event buf_done;
|
||||
/* Sent for offline fetch done event */
|
||||
struct msm_isp_fetch_eng_event fetch_done;
|
||||
/* Sent for Error_Event */
|
||||
struct msm_isp_error_info error_info;
|
||||
/*
|
||||
|
@ -712,6 +729,7 @@ struct msm_isp_event_data32 {
|
|||
union {
|
||||
struct msm_isp_stats_event stats;
|
||||
struct msm_isp_buf_event buf_done;
|
||||
struct msm_isp_fetch_eng_event fetch_done;
|
||||
struct msm_isp_error_info error_info;
|
||||
struct msm_isp_output_info output_info;
|
||||
struct msm_isp_sof_info sof_info;
|
||||
|
@ -825,4 +843,10 @@ struct msm_isp_set_stats_ab {
|
|||
#define VIDIOC_MSM_ISP_SET_STATS_BANDWIDTH \
|
||||
_IOWR('V', BASE_VIDIOC_PRIVATE+23, struct msm_isp_set_stats_ab)
|
||||
|
||||
#define VIDIOC_MSM_ISP_MAP_BUF_START_FE \
|
||||
_IOWR('V', BASE_VIDIOC_PRIVATE+21, struct msm_vfe_fetch_eng_start)
|
||||
|
||||
#define VIDIOC_MSM_ISP_UNMAP_BUF \
|
||||
_IOWR('V', BASE_VIDIOC_PRIVATE+22, struct msm_isp_unmap_buf_req)
|
||||
|
||||
#endif /* __MSMB_ISP__ */
|
||||
|
|
Loading…
Reference in New Issue