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;
}
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;
}
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;
}
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;
}
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;
}
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;
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;
}
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;
}
#include <linux/exynos_iovmm.h>
#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;
}
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;
}
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);
#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;
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)
{
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,
}
pmem->dvaddr = dvaddr;
}
+ vipx_info("[%20s] memory is allocated(%#p,%#x,%zu)",
+ pmem->name, kvaddr, (int)pmem->dvaddr, pmem->size);
vipx_leave();
return 0;