summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-07-17 06:25:45 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-07-17 06:25:44 -0700
commit91c93365f76e98b5547e03c74ee38b7ac36328ae (patch)
treedd41cbcca417e2ca9f1d9025c4cbaf15b7a5f1c1
parentaf4754e7db4b75b5a20c193d9af7c4426ae75894 (diff)
parent8c5b4d8e68d45ca14a955c3d5a85b7dba3634611 (diff)
Merge "msm: jpeg: Add support for SMMU fault handler"
-rw-r--r--drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_sync.c48
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c6
2 files changed, 53 insertions, 1 deletions
diff --git a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_sync.c b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_sync.c
index d27f56a9ad65..7e4d9dfb6612 100644
--- a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_sync.c
+++ b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_sync.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2016, 2019, 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
@@ -1522,6 +1522,46 @@ long __msm_jpeg_ioctl(struct msm_jpeg_device *pgmn_dev,
return rc;
}
+static void msm_jpeg_iommu_fault_handler (struct iommu_domain *domain,
+ struct device *dev, unsigned long iova, int flags, void *token)
+{
+ struct msm_jpeg_device *pgmn_dev;
+
+ if (token) {
+ pgmn_dev = token;
+ JPEG_PR_ERR("%s: core type %d addr 0x%lx\n",
+ __func__, pgmn_dev->core_type, iova);
+ JPEG_PR_ERR("%s: FE ion_fd %d y_addr 0x%x y_len %d\n",
+ __func__,
+ pgmn_dev->fe_pingpong_buf.buf[1].ion_fd,
+ pgmn_dev->fe_pingpong_buf.buf[1].y_buffer_addr,
+ pgmn_dev->fe_pingpong_buf.buf[1].y_len);
+ JPEG_PR_ERR("%s: FE cbcr_addr %x cbcr_len %d\n",
+ __func__,
+ pgmn_dev->fe_pingpong_buf.buf[1].cbcr_buffer_addr,
+ pgmn_dev->fe_pingpong_buf.buf[1].cbcr_len);
+ JPEG_PR_ERR("%s: FE pln2_addr %x pln2_len %d frame_len %d\n",
+ __func__,
+ pgmn_dev->fe_pingpong_buf.buf[1].pln2_addr,
+ pgmn_dev->fe_pingpong_buf.buf[1].pln2_len,
+ pgmn_dev->fe_pingpong_buf.buf[1].framedone_len);
+ JPEG_PR_ERR("%s: WE ion_fd %d y_addr 0x%x y_len %d\n",
+ __func__,
+ pgmn_dev->we_pingpong_buf.buf[0].ion_fd,
+ pgmn_dev->we_pingpong_buf.buf[0].y_buffer_addr,
+ pgmn_dev->we_pingpong_buf.buf[0].y_len);
+ JPEG_PR_ERR("%s: WE cbcr_addr %x cbcr_len %d\n",
+ __func__,
+ pgmn_dev->we_pingpong_buf.buf[0].cbcr_buffer_addr,
+ pgmn_dev->we_pingpong_buf.buf[0].cbcr_len);
+ JPEG_PR_ERR("%s: WE pln2_addr %x pln2_len %d frame_len %d\n",
+ __func__,
+ pgmn_dev->we_pingpong_buf.buf[0].pln2_addr,
+ pgmn_dev->we_pingpong_buf.buf[0].pln2_len,
+ pgmn_dev->we_pingpong_buf.buf[0].framedone_len);
+ }
+}
+
int __msm_jpeg_init(struct msm_jpeg_device *pgmn_dev)
{
int rc = 0;
@@ -1555,6 +1595,12 @@ int __msm_jpeg_init(struct msm_jpeg_device *pgmn_dev)
goto err_smmu;
}
+ cam_smmu_reg_client_page_fault_handler(
+ pgmn_dev->iommu_hdl,
+ msm_jpeg_iommu_fault_handler,
+ NULL,
+ pgmn_dev);
+
/* setup all the resources for the jpeg driver */
rc = msm_jpeg_platform_setup(pgmn_dev);
if (rc < 0) {
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
index 83abaea1fa44..69155d60abb8 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
@@ -1581,6 +1581,12 @@ static int cpp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
pr_debug("DEBUG_R1: 0x%x\n",
msm_camera_io_r(cpp_dev->cpp_hw_base + 0x8C));
+ /* Update bandwidth usage to enable AXI/ABH clock,
+ * which will help to reset CPP AXI.Bandwidth will be
+ * made zero at cpp_release_hardware.
+ */
+ msm_cpp_update_bandwidth(cpp_dev, 0x1000, 0x1000);
+
/* mask IRQ status */
msm_camera_io_w(0xB, cpp_dev->cpp_hw_base + 0xC);