media: mfc: DRV3.2: support dump call-back function
authorAyoung Sim <a.sim@samsung.com>
Wed, 14 Mar 2018 00:52:20 +0000 (09:52 +0900)
committerSunyoung Kang <sy0816.kang@samsung.com>
Tue, 29 May 2018 06:59:18 +0000 (15:59 +0900)
struct s5p_mfc_dump_ops supports the information dump function by call-back.
This is for maintain the layer of the driver.
Function of any layer can call the dump function using "call_dop()" macro,
because it exists in the lowest layer.

Change-Id: Ic452aa316d10ddb6194444fe7aa3f707080d49ae
Signed-off-by: Ayoung Sim <a.sim@samsung.com>
14 files changed:
drivers/media/platform/exynos/mfc/s5p_mfc.c
drivers/media/platform/exynos/mfc/s5p_mfc_common.h
drivers/media/platform/exynos/mfc/s5p_mfc_ctrl.c
drivers/media/platform/exynos/mfc/s5p_mfc_data_struct.h
drivers/media/platform/exynos/mfc/s5p_mfc_dec_vb2_ops.c
drivers/media/platform/exynos/mfc/s5p_mfc_enc_vb2_ops.c
drivers/media/platform/exynos/mfc/s5p_mfc_hwlock.c
drivers/media/platform/exynos/mfc/s5p_mfc_irq.c
drivers/media/platform/exynos/mfc/s5p_mfc_nal_q.c
drivers/media/platform/exynos/mfc/s5p_mfc_otf.c
drivers/media/platform/exynos/mfc/s5p_mfc_reg.c
drivers/media/platform/exynos/mfc/s5p_mfc_utils.c
drivers/media/platform/exynos/mfc/s5p_mfc_watchdog.c
drivers/media/platform/exynos/mfc/s5p_mfc_watchdog.h

index 3eadb229fa53c7b52137bfdda3f3a554843c6b7c..31631127599e07436d217d8e144679e00b324249 100644 (file)
@@ -635,7 +635,7 @@ static int mfc_wait_close_inst(struct s5p_mfc_dev *dev, struct s5p_mfc_ctx *ctx)
                                        S5P_FIMV_R2H_CMD_CLOSE_INSTANCE_RET)) {
                        mfc_err_ctx("waiting once more but timed out\n");
                        dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_CLOSE_INST);
-                       s5p_mfc_dump_info_and_stop_hw(dev);
+                       call_dop(dev, dump_and_stop_always, dev);
                }
        }
 
@@ -902,7 +902,7 @@ int s5p_mfc_sysmmu_fault_handler(struct iommu_domain *iodmn, struct device *devi
        dev->logging_data->fault_addr = (unsigned int)addr;
 
        s5p_mfc_dump_buffer_info(dev, addr);
-       s5p_mfc_dump_info_and_stop_hw(dev);
+       call_dop(dev, dump_and_stop_always, dev);
 
        return 0;
 }
@@ -1190,6 +1190,9 @@ static int s5p_mfc_probe(struct platform_device *pdev)
        }
        INIT_WORK(&dev->butler_work, s5p_mfc_butler_worker);
 
+       /* dump information call-back function */
+       dev->dump_ops = &mfc_dump_ops;
+
 #ifdef CONFIG_MFC_USE_BUS_DEVFREQ
        atomic_set(&dev->qos_req_cur, 0);
 
index 7dc722fad617e19b1fec0ac80fb13855d2cda975..f39cf55d3985cdf0fbaa964542488c3c119a0f8a 100644 (file)
        (((c)->c_ops->op) ?             \
                ((c)->c_ops->op(args)) : 0)
 
+#define call_dop(d, op, args...)       \
+       (((d)->dump_ops->op) ?          \
+               ((d)->dump_ops->op(args)) : 0)
+
 #define        MFC_CTRL_TYPE_GET       (MFC_CTRL_TYPE_GET_SRC | MFC_CTRL_TYPE_GET_DST)
 #define        MFC_CTRL_TYPE_SRC       (MFC_CTRL_TYPE_SET | MFC_CTRL_TYPE_GET_SRC)
 #define        MFC_CTRL_TYPE_DST       (MFC_CTRL_TYPE_GET_DST)
index ee15f5e2fa88fa5131aac3831ae7c198e9c27b3c..03422ec28cd78161a248908c4bbdd45e14e248f9 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "s5p_mfc_hwlock.h"
 #include "s5p_mfc_nal_q.h"
-#include "s5p_mfc_watchdog.h"
 #include "s5p_mfc_sync.h"
 
 #include "s5p_mfc_pm.h"
@@ -259,7 +258,7 @@ int s5p_mfc_sleep(struct s5p_mfc_dev *dev)
        if (s5p_mfc_wait_for_done_dev(dev, S5P_FIMV_R2H_CMD_SLEEP_RET)) {
                mfc_err_dev("Failed to SLEEP\n");
                dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_SLEEP);
-               s5p_mfc_dump_info_and_stop_hw(dev);
+               call_dop(dev, dump_and_stop_always, dev);
                return -EIO;
        }
 
@@ -335,7 +334,7 @@ int s5p_mfc_wakeup(struct s5p_mfc_dev *dev)
        if (s5p_mfc_wait_for_done_dev(dev, S5P_FIMV_R2H_CMD_FW_STATUS_RET)) {
                mfc_err_dev("Failed to RISC_ON\n");
                dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_RISC_ON);
-               s5p_mfc_dump_info_and_stop_hw(dev);
+               call_dop(dev, dump_and_stop_always, dev);
                return -EIO;
        }
 
@@ -346,7 +345,7 @@ int s5p_mfc_wakeup(struct s5p_mfc_dev *dev)
        if (s5p_mfc_wait_for_done_dev(dev, S5P_FIMV_R2H_CMD_WAKEUP_RET)) {
                mfc_err_dev("Failed to WAKEUP\n");
                dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_WAKEUP);
-               s5p_mfc_dump_info_and_stop_hw(dev);
+               call_dop(dev, dump_and_stop_always, dev);
                return -EIO;
        }
 
index 6573a38b938dbe79b4a3e36c2dca75cd433cd550..19dcf6aa180595e71489159fb6773bdd28f64dae 100644 (file)
@@ -650,6 +650,11 @@ struct s5p_mfc_perf {
        int drv_margin;
 };
 
+extern struct s5p_mfc_dump_ops mfc_dump_ops;
+struct s5p_mfc_dump_ops {
+       void (*dump_and_stop_always)(struct s5p_mfc_dev *dev);
+};
+
 /**
  * struct s5p_mfc_dev - The struct containing driver internal parameters.
  */
@@ -753,6 +758,7 @@ struct s5p_mfc_dev {
 #endif
 
        struct s5p_mfc_debugfs debugfs;
+       struct s5p_mfc_dump_ops *dump_ops;
 
        struct s5p_mfc_perf perf;
 };
index cadcd56f31fa687c8bb75758b0ef1b212fed60ee..f5e48ed46678c9e283204f208c49e33eb903f310 100644 (file)
 
 #include "s5p_mfc_hwlock.h"
 #include "s5p_mfc_nal_q.h"
-#include "s5p_mfc_watchdog.h"
 #include "s5p_mfc_opr.h"
 #include "s5p_mfc_sync.h"
 
-#include "s5p_mfc_pm.h"
-
 #include "s5p_mfc_queue.h"
 #include "s5p_mfc_utils.h"
 #include "s5p_mfc_buf.h"
@@ -531,7 +528,7 @@ static void s5p_mfc_dec_stop_streaming(struct vb2_queue *q)
                if (s5p_mfc_wait_for_done_ctx(ctx, S5P_FIMV_R2H_CMD_DPB_FLUSH_RET)) {
                        mfc_err_ctx("time out during DPB flush\n");
                        dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_DPB_FLUSH);
-                       s5p_mfc_dump_info_and_stop_hw(dev);
+                       call_dop(dev, dump_and_stop_always, dev);
                }
 
                s5p_mfc_change_state(ctx, prev_state);
index f31adbc3f3b6a96d912afc96d8ad3538f7cccbf3..efe7a187e24cf2d4217c3214dee9993a81d88578 100644 (file)
@@ -17,8 +17,6 @@
 #include "s5p_mfc_opr.h"
 #include "s5p_mfc_sync.h"
 
-#include "s5p_mfc_pm.h"
-
 #include "s5p_mfc_qos.h"
 #include "s5p_mfc_queue.h"
 #include "s5p_mfc_utils.h"
index 83e5138bb2fddd4f03bd6d7c6bdb506ac9ff3000..21c7beab17cbfc655a993fbf1f0dea75be54b7fe 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "s5p_mfc_nal_q.h"
 #include "s5p_mfc_otf.h"
-#include "s5p_mfc_watchdog.h"
 #include "s5p_mfc_opr.h"
 #include "s5p_mfc_sync.h"
 
@@ -617,7 +616,7 @@ void s5p_mfc_cache_flush(struct s5p_mfc_dev *dev, int is_drm)
        if (s5p_mfc_wait_for_done_dev(dev, S5P_FIMV_R2H_CMD_CACHE_FLUSH_RET)) {
                mfc_err_dev("Failed to CACHE_FLUSH\n");
                dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_CHACHE_FLUSH);
-               s5p_mfc_dump_info_and_stop_hw(dev);
+               call_dop(dev, dump_and_stop_always, dev);
        }
 
        s5p_mfc_pm_clock_off(dev);
@@ -696,7 +695,7 @@ static int mfc_nal_q_just_run(struct s5p_mfc_ctx *ctx, int need_cache_flush)
                                        S5P_FIMV_R2H_CMD_COMPLETE_QUEUE_RET)) {
                                mfc_err_dev("NAL Q: Failed to stop queue.\n");
                                dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_STOP_NAL_Q);
-                               s5p_mfc_dump_info_and_stop_hw(dev);
+                               call_dop(dev, dump_and_stop_always, dev);
                        }
                        nal_q_handle->nal_q_exception = 0;
                        ret = 1;
index 4843b02b89083273dd06a4ab72692606bde10482..957edd69a9459c9359d92ebf3c20e8bdddeda74c 100644 (file)
@@ -15,7 +15,6 @@
 #include "s5p_mfc_hwlock.h"
 #include "s5p_mfc_nal_q.h"
 #include "s5p_mfc_otf.h"
-#include "s5p_mfc_watchdog.h"
 #include "s5p_mfc_opr.h"
 #include "s5p_mfc_sync.h"
 
index 02578cf2ca17e8cb2d14baef30be6b3bd457af43..d6e097b48d85c96983eda8b977b4ed12a5fd1b5f 100644 (file)
@@ -12,7 +12,6 @@
 
 #include "s5p_mfc_nal_q.h"
 
-#include "s5p_mfc_watchdog.h"
 #include "s5p_mfc_sync.h"
 
 #include "s5p_mfc_pm.h"
@@ -481,7 +480,7 @@ void s5p_mfc_nal_q_stop_if_started(struct s5p_mfc_dev *dev)
                                S5P_FIMV_R2H_CMD_COMPLETE_QUEUE_RET)) {
                mfc_err_dev("NAL Q: Failed to stop qeueue during get hwlock\n");
                dev->logging_data->cause |= (1 << MFC_CAUSE_FAIL_STOP_NAL_Q_FOR_OTHER);
-               s5p_mfc_dump_info_and_stop_hw(dev);
+               call_dop(dev, dump_and_stop_always, dev);
        }
 
        mfc_debug_leave();
index c5be3770fbf60b8bc4386045018fca21334fbd1d..a54252b656b7f0ffd545decfb9cb7f7547282048 100644 (file)
@@ -21,7 +21,6 @@
 #include "s5p_mfc_otf.h"
 #include "s5p_mfc_hwfc_internal.h"
 
-#include "s5p_mfc_watchdog.h"
 #include "s5p_mfc_sync.h"
 
 #include "s5p_mfc_inst.h"
index 3c515b82746b250eb96755b8e9b9cf6af6b08b7d..e8c77f03de7cd8ee61820e4cfb7f96043a79dbab 100644 (file)
@@ -14,8 +14,6 @@
 
 #include "s5p_mfc_reg.h"
 
-#include "s5p_mfc_mem.h"
-
 void s5p_mfc_dbg_enable(struct s5p_mfc_dev *dev)
 {
        mfc_debug(2, "MFC debug info enable\n");
index d71512633dd49770236c88aed13c1a5cc7184800..4a014a6bc47a8b43b4826c4f7fdfcfe6feb294c0 100644 (file)
@@ -14,8 +14,6 @@
 
 #include "s5p_mfc_utils.h"
 
-#include "s5p_mfc_mem.h"
-
 int s5p_mfc_check_vb_with_fmt(struct s5p_mfc_fmt *fmt, struct vb2_buffer *vb)
 {
        if (!fmt)
index c22b9c3fbc4c6bc261bbe9e15c91b456f583f706..0009f79cdf26f0e9c10f7c3509fa78a44e1f8dbd 100644 (file)
@@ -264,7 +264,7 @@ void s5p_mfc_dump_buffer_info(struct s5p_mfc_dev *dev, unsigned long addr)
        }
 }
 
-void s5p_mfc_dump_info_and_stop_hw(struct s5p_mfc_dev *dev)
+static void mfc_dump_info_and_stop_hw(struct s5p_mfc_dev *dev)
 {
        MFC_TRACE_DEV("** mfc will stop!!!\n");
        mfc_display_state(dev);
@@ -316,5 +316,9 @@ void s5p_mfc_watchdog_worker(struct work_struct *work)
        atomic_set(&dev->watchdog_tick_cnt, 0);
 
        /* Stop after dumping information */
-       s5p_mfc_dump_info_and_stop_hw(dev);
+       mfc_dump_info_and_stop_hw(dev);
 }
+
+struct s5p_mfc_dump_ops mfc_dump_ops = {
+       .dump_and_stop_always           = mfc_dump_info_and_stop_hw,
+};
index 7867d1229dcc78bde1f50e7395fa7953ac257acb..d72f15634c14fba16bf403c6b384052d52d3ddbd 100644 (file)
@@ -16,7 +16,6 @@
 #include "s5p_mfc_common.h"
 
 void s5p_mfc_dump_buffer_info(struct s5p_mfc_dev *dev, unsigned long addr);
-void s5p_mfc_dump_info_and_stop_hw(struct s5p_mfc_dev *dev);
 void s5p_mfc_watchdog_worker(struct work_struct *work);
 
 #endif /* __S5P_MFC_WATCHDOG_H */