From 12f6f74a560a7e28b5a9db2b92108221c418592b Mon Sep 17 00:00:00 2001 From: Sanghwa Park Date: Wed, 13 Feb 2019 15:26:51 +0900 Subject: [PATCH] [RAMEN9610-12132] vipx: add logs for debugging Change-Id: I2ad36a3049c7e3a300987284c0c0e0ced44de4b9 Signed-off-by: Sanghwa Park --- drivers/vision/vipx/vipx-core.c | 14 ++++-- drivers/vision/vipx/vipx-device.c | 13 ++--- drivers/vision/vipx/vipx-interface.c | 3 ++ drivers/vision/vipx/vipx-mailbox.c | 74 +++++++++++++++++++++++++--- drivers/vision/vipx/vipx-mailbox.h | 1 + drivers/vision/vipx/vipx-memory.c | 2 + 6 files changed, 90 insertions(+), 17 deletions(-) diff --git a/drivers/vision/vipx/vipx-core.c b/drivers/vision/vipx/vipx-core.c index e80bf26d5d24..7de774f0e598 100644 --- a/drivers/vision/vipx/vipx-core.c +++ b/drivers/vision/vipx/vipx-core.c @@ -311,6 +311,7 @@ p_err_vops: mutex_unlock(&vctx->lock); p_err_lock: args->ret = ret; + vipx_err("Failed to load kernel binary(%d)\n", ret); /* return value is included in args->ret */ return 0; } @@ -340,6 +341,7 @@ p_err_vops: mutex_unlock(&vctx->lock); p_err_lock: args->ret = ret; + vipx_err("Failed to unload kernel binary(%d)\n", ret); /* return value is included in args->ret */ return 0; } @@ -368,6 +370,7 @@ p_err_vops: mutex_unlock(&vctx->lock); p_err_lock: args->ret = ret; + vipx_err("Failed to load graph(%d)\n", ret); /* return value is included in args->ret */ return 0; } @@ -396,6 +399,7 @@ p_err_vops: mutex_unlock(&vctx->lock); p_err_lock: args->ret = ret; + vipx_err("Failed to unload graph(%d)\n", ret); /* return value is included in args->ret */ return 0; } @@ -424,6 +428,7 @@ p_err_vops: mutex_unlock(&vctx->lock); p_err_lock: args->ret = ret; + vipx_err("Failed to execute submodel(%d)\n", ret); /* return value is included in args->ret */ return 0; } @@ -486,7 +491,8 @@ static int vipx_open(struct inode *inode, struct file *file) mutex_unlock(&core->lock); - vipx_info("The vipx has been successfully opened\n"); + vipx_info("The vipx has been successfully opened(count:%d)\n", + vdev->open_count); vipx_leave(); return 0; @@ -495,7 +501,8 @@ p_err_vctx: vipx_device_close(vdev); p_err_device: mutex_unlock(&core->lock); - vipx_err("Failed to open the vipx [%d]\n", ret); + vipx_err("Failed to open the vipx(count:%d)(%d)\n", + vdev->open_count, ret); p_err_lock: return ret; } @@ -521,7 +528,8 @@ static int vipx_release(struct inode *inode, struct file *file) vipx_device_close(core->device); mutex_unlock(&core->lock); - vipx_info("The vipx has been closed\n"); + vipx_info("The vipx has been closed(count:%d)\n", + core->device->open_count); vipx_leave(); return 0; } diff --git a/drivers/vision/vipx/vipx-device.c b/drivers/vision/vipx/vipx-device.c index edfd41227b29..65c0644dc218 100644 --- a/drivers/vision/vipx/vipx-device.c +++ b/drivers/vision/vipx/vipx-device.c @@ -16,28 +16,25 @@ #include #include "vipx-log.h" +#include "vipx-mailbox.h" #include "vipx-graph.h" #include "vipx-device.h" -static void __vipx_fault_handler(struct vipx_device *vdev) -{ - vipx_enter(); - vipx_leave(); -} - static int __attribute__((unused)) vipx_fault_handler( struct iommu_domain *domain, struct device *dev, unsigned long fault_addr, int fault_flag, void *token) { struct vipx_device *vdev; + struct vipx_mailbox_ctrl *mctrl; pr_err("< VIPX FAULT HANDLER >\n"); pr_err("Device virtual(0x%lX) is invalid access\n", fault_addr); vdev = dev_get_drvdata(dev); - vipx_debug_dump_debug_regs(); + mctrl = vdev->system.interface.mctrl; - __vipx_fault_handler(vdev); + vipx_debug_dump_debug_regs(); + vipx_mailbox_dump(mctrl); return -EINVAL; } diff --git a/drivers/vision/vipx/vipx-interface.c b/drivers/vision/vipx/vipx-interface.c index 6eb897da6b51..bbe5ec0f0a7e 100644 --- a/drivers/vision/vipx/vipx-interface.c +++ b/drivers/vision/vipx/vipx-interface.c @@ -197,6 +197,7 @@ static int __vipx_interface_send_mailbox(struct vipx_interface *itf, ret = vipx_mailbox_check_full(mctrl, type, MAILBOX_WAIT); if (ret) { vipx_err("mailbox is full(%lu/%u)\n", type, itask->id); + vipx_mailbox_dump(mctrl); goto p_err_process; } @@ -222,6 +223,8 @@ static int __vipx_interface_send_mailbox(struct vipx_interface *itf, taskmgr_x_barrier_irqr(itaskmgr, 0, flags); ret = __vipx_interface_wait_mailbox_reply(itf, itask); + if (ret) + vipx_mailbox_dump(mctrl); taskmgr_e_barrier_irqs(itaskmgr, 0, flags); vipx_task_trans_pro_to_com(itaskmgr, itask); diff --git a/drivers/vision/vipx/vipx-mailbox.c b/drivers/vision/vipx/vipx-mailbox.c index 64bf00d8d727..0068a6720845 100644 --- a/drivers/vision/vipx/vipx-mailbox.c +++ b/drivers/vision/vipx/vipx-mailbox.c @@ -14,6 +14,74 @@ #include "vipx-io.h" #include "vipx-mailbox.h" +static inline int __vipx_mailbox_is_empty(struct vipx_mailbox_head *head) +{ + vipx_check(); + return head->wmsg_idx == head->rmsg_idx; +} + +static void __vipx_mailbox_dump(struct vipx_mailbox_head *head, void *data) +{ + int idx; + + vipx_enter(); + vipx_info("mailbox haed (%u,%u,%u,%u)\n", + head->rmsg_idx, head->wmsg_idx, + head->mbox_size, head->elem_size); + + for (idx = 0; idx < head->mbox_size; ++idx) { + vipx_info("mailbox data (%d/%u)\n", idx, head->mbox_size - 1); + print_hex_dump(KERN_INFO, "[VIPx]:", DUMP_PREFIX_OFFSET, 32, 4, + data + (idx * head->elem_size), + head->elem_size, false); + } + vipx_leave(); +} + +void vipx_mailbox_dump(struct vipx_mailbox_ctrl *mctrl) +{ + int ret; + + vipx_enter(); + ret = __vipx_mailbox_is_empty(&mctrl->h2d_normal_head); + if (ret) { + vipx_info("h2d normal mailbox is empty\n"); + } else { + vipx_info("h2d normal mailbox dump\n"); + __vipx_mailbox_dump(&mctrl->h2d_normal_head, + mctrl->h2d_normal_data); + } + + ret = __vipx_mailbox_is_empty(&mctrl->h2d_urgent_head); + if (ret) { + vipx_info("h2d urgent mailbox is empty\n"); + } else { + vipx_info("h2d urgent mailbox dump\n"); + __vipx_mailbox_dump(&mctrl->h2d_urgent_head, + &mctrl->h2d_urgent_data); + } + + ret = __vipx_mailbox_is_empty(&mctrl->d2h_normal_head); + if (ret) { + vipx_info("d2h normal mailbox is empty\n"); + } else { + vipx_info("d2h normal mailbox dump\n"); + __vipx_mailbox_dump(&mctrl->d2h_normal_head, + &mctrl->d2h_normal_data); + } + + ret = __vipx_mailbox_is_empty(&mctrl->d2h_urgent_head); + if (ret) { + vipx_info("d2h urgent mailbox is empty\n"); + } else { + vipx_info("d2h urgent mailbox dump\n"); + __vipx_mailbox_dump(&mctrl->d2h_urgent_head, + &mctrl->d2h_urgent_data); + } + + vipx_leave(); +} + static ssize_t __vipx_mailbox_get_remain_size(struct vipx_mailbox_head *head) { unsigned int rmsg_idx, wmsg_idx, mbox_size; @@ -161,12 +229,6 @@ p_err: return ret; } -static inline int __vipx_mailbox_is_empty(struct vipx_mailbox_head *head) -{ - vipx_check(); - return head->wmsg_idx == head->rmsg_idx; -} - int vipx_mailbox_check_reply(struct vipx_mailbox_ctrl *mctrl, unsigned int type, int wait) { diff --git a/drivers/vision/vipx/vipx-mailbox.h b/drivers/vision/vipx/vipx-mailbox.h index 1f10277b804f..9cb0dc7787ab 100644 --- a/drivers/vision/vipx/vipx-mailbox.h +++ b/drivers/vision/vipx/vipx-mailbox.h @@ -51,6 +51,7 @@ struct vipx_mailbox_ctrl { struct vipx_d2h_message d2h_urgent_data[MAX_URGENT_MSG_COUNT]; }; +void vipx_mailbox_dump(struct vipx_mailbox_ctrl *mctrl); int vipx_mailbox_check_full(struct vipx_mailbox_ctrl *mctrl, unsigned int type, int wait); int vipx_mailbox_write(struct vipx_mailbox_ctrl *mctrl, unsigned int type, diff --git a/drivers/vision/vipx/vipx-memory.c b/drivers/vision/vipx/vipx-memory.c index ac75be277ae6..99ffe946d6ce 100644 --- a/drivers/vision/vipx/vipx-memory.c +++ b/drivers/vision/vipx/vipx-memory.c @@ -278,6 +278,8 @@ static int __vipx_memory_alloc(struct vipx_memory *mem, } pmem->dvaddr = dvaddr; } + vipx_info("[%20s] memory is allocated(%#p,%#x,%zu)", + pmem->name, kvaddr, (int)pmem->dvaddr, pmem->size); vipx_leave(); return 0; -- 2.20.1