[COMMON] media: smfc: add System MMU fault handler
authorCho KyongHo <pullip.cho@samsung.com>
Fri, 10 Apr 2015 10:12:51 +0000 (19:12 +0900)
committerSeungchul Kim <sc377.kim@samsung.com>
Mon, 28 May 2018 05:30:54 +0000 (14:30 +0900)
Change-Id: Idb1a7cebb4dccb043dc834ceb4daacb5cdd7e983
Signed-off-by: Cho KyongHo <pullip.cho@samsung.com>
drivers/media/platform/exynos/smfc/smfc.c
drivers/media/platform/exynos/smfc/smfc.h

index 579f67336994ee1bf0fee96278af97ee1e39d067..b19494f0231c966a8b8c9eceb56872ea4765a43e 100644 (file)
@@ -283,6 +283,8 @@ static irqreturn_t exynos_smfc_irq_handler(int irq, void *priv)
        u32 streamsize = smfc_get_streamsize(smfc);
        u32 thumb_streamsize = smfc_get_2nd_streamsize(smfc);
 
+       smfc->flags &= ~SMFC_DEV_RUNNING;
+
        if (!smfc_hwstatus_okay(smfc, ctx)) {
                smfc_dump_registers(smfc);
                state = VB2_BUF_STATE_ERROR;
@@ -1144,6 +1146,8 @@ static void smfc_m2m_device_run(void *priv)
        smfc_hwconfigure_image(ctx);
        smfc_configure_secondary_image(ctx);
        smfc_hwconfigure_start(ctx);
+
+       ctx->smfc->flags |= SMFC_DEV_RUNNING;
 }
 
 static void smfc_m2m_job_abort(void *priv)
@@ -1284,6 +1288,18 @@ err_clk:
        return ret;
 }
 
+static int __attribute__((unused)) smfc_iommu_fault_handler(
+               struct iommu_domain *domain, struct device *dev,
+               unsigned long fault_addr, int fault_flags, void *token)
+{
+       struct smfc_dev *smfc = token;
+
+       if (smfc->flags & SMFC_DEV_RUNNING)
+               smfc_dump_registers(smfc);
+
+       return 0;
+}
+
 static int exynos_smfc_probe(struct platform_device *pdev)
 {
        struct smfc_dev *smfc;
@@ -1337,6 +1353,8 @@ static int exynos_smfc_probe(struct platform_device *pdev)
        if (ret < 0)
                return ret;
 
+       iovmm_set_fault_handler(&pdev->dev, smfc_iommu_fault_handler, smfc);
+
        ret = iovmm_activate(&pdev->dev);
        if (ret < 0)
                return ret;
index dbe63674083d73b0e3289bdbe82e5aa196ca73ca..5ff118c78d61c354995f303c2c645f8dc75283d1 100644 (file)
@@ -41,6 +41,8 @@ static inline bool is_jpeg(const struct smfc_image_format *fmt)
        return fmt->bpp_buf[0] == 0;
 }
 
+#define SMFC_DEV_RUNNING       (1 << 0)
+
 struct smfc_dev {
        struct v4l2_device v4l2_dev;
        struct video_device *videodev;
@@ -50,6 +52,7 @@ struct smfc_dev {
        struct mutex video_device_mutex;
        int device_id;
        u32 hwver;
+       u32 flags;
 
        struct clk *clk_gate;
        struct clk *clk_gate2; /* available if clk_gate is valid */