media: mtk-vpu: return error for GET_LOG_OBJECT ioctl

GET_LOG_OBJECT is an ioctl used for debug. Since it is not implemented
here, return an error. This prevent the FW to believe the ioctl
was done successfully and also avoid having an error message
printed because of unknown ioctl.

Signed-off-by: Fabien Parent <fparent@baylibre.com>
diff --git a/drivers/media/platform/mtk-vpu/mtk_vcu.c b/drivers/media/platform/mtk-vpu/mtk_vcu.c
index 548aa51..089b78c7 100644
--- a/drivers/media/platform/mtk-vpu/mtk_vcu.c
+++ b/drivers/media/platform/mtk-vpu/mtk_vcu.c
@@ -285,6 +285,7 @@
 	const char *vcuname;
 	const char *path;
 	int vcuid;
+	struct log_test_nofuse *vdec_log_info;
 	wait_queue_head_t vdec_log_get_wq;
 	atomic_t vdec_log_got;
 	struct map_cache_mva map_buffer[MAP_VENC_CACHE_MAX_NUM];
@@ -429,6 +430,33 @@
 	return ret;
 }
 
+static int vcu_log_get(struct mtk_vcu *vcu, unsigned long arg)
+{
+	int ret;
+	unsigned char *user_data_addr = NULL;
+
+	user_data_addr = (unsigned char *)arg;
+
+	ret = wait_event_freezable(vcu->vdec_log_get_wq,
+				    atomic_read(&vcu->vdec_log_got));
+	if (ret != 0) {
+		pr_info("[VCU][%d] wait event return %d @%s\n",
+			vcu->vcuid, ret, __func__);
+		return ret;
+	}
+
+	ret = copy_to_user(user_data_addr, vcu->vdec_log_info,
+		(unsigned long)sizeof(struct log_test_nofuse));
+	if (ret != 0) {
+		pr_info("[VCU] %s(%d) Copy data to user failed!\n",
+			__func__, __LINE__);
+		ret = -EINVAL;
+	}
+	atomic_set(&vcu->vdec_log_got, 0);
+
+	return ret;
+}
+
 unsigned int vcu_get_vdec_hw_capa(struct mtk_vpu_plat *vpu)
 {
 	struct mtk_vcu *vcu = to_vcu(vpu);
@@ -773,6 +801,9 @@
 	case VCUD_GET_OBJECT:
 		ret = vcu_ipi_get(vcu_dev, arg);
 		break;
+	case VCUD_GET_LOG_OBJECT:
+		ret = vcu_log_get(vcu_dev, arg);
+		break;
 	case VCUD_MVA_ALLOCATION:
 		user_data_addr = (unsigned char *)arg;
 		ret = (long)copy_from_user(&mem_buff_data, user_data_addr,
@@ -881,6 +912,7 @@
 	switch (cmd) {
 	case COMPAT_VCUD_SET_OBJECT:
 	case VCUD_GET_OBJECT:
+	case VCUD_GET_LOG_OBJECT:
 	case VCUD_SET_MMAP_TYPE:
 		share_data32 = compat_ptr((uint32_t)arg);
 		ret = file->f_op->unlocked_ioctl(file,
@@ -972,6 +1004,10 @@
 		return ret;
 	}
 	vcu_mtkdev[vcuid] = vcu;
+	vcu_mtkdev[vcuid]->vdec_log_info = devm_kzalloc(dev,
+		sizeof(struct log_test_nofuse), GFP_KERNEL);
+	if (!vcu_mtkdev[vcuid]->vdec_log_info)
+		return -ENOMEM;
 
 #ifdef CONFIG_MTK_IOMMU
 	vcu_mtkdev[vcuid]->io_domain = iommu_get_domain_for_dev(dev);