clear-pkgs-linux-iot-lts2018/0818-media-intel-ipu4-VIRT-...

171 lines
5.1 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ong Hock Yu <ong.hock.yu@intel.com>
Date: Sun, 25 Nov 2018 23:16:32 +0000
Subject: [PATCH] media: intel-ipu4: [VIRT] Use native driver function return
value for the IOCTL calls.
As libcamhal error handling is dependent on native
driver return value. Virtualized driver should not
discard it.
Change-Id: I3d6e225e868c51a4e2df5a29a0b7df2ae3cc66f6
Tracked-On: OAM-64123
Tracked-On: OAM-64294
Tracked-On: OAM-64937
Tracked-On: OLINUX-2973
Tracked-On: OLINUX-3042
Signed-off-by: Ong Hock Yu <ong.hock.yu@intel.com>
---
.../pci/intel/virtio/intel-ipu4-para-virt-psys.c | 13 +++++++++++++
.../pci/intel/virtio/intel-ipu4-virtio-be-psys.c | 12 ++++++++++++
.../pci/intel/virtio/intel-ipu4-virtio-be-stream.c | 13 ++++++++-----
3 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.c b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.c
index 2a669cc68c34..f85f22c0584d 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.c
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.c
@@ -106,6 +106,8 @@ int ipu_get_manifest(struct ipu_psys_manifest *m,
kfree(manifest_data);
kfree(manifest_wrap);
+ rval = req->func_ret;
+
ipu4_virtio_fe_req_queue_put(req);
pr_debug("%s: processing ended %d", __func__, rval);
@@ -139,6 +141,8 @@ int ipu_query_caps(struct ipu_psys_capability *caps,
return rval;
}
+ rval = req->func_ret;
+
ipu4_virtio_fe_req_queue_put(req);
pr_debug("%s: processing ended %d", __func__, rval);
@@ -218,6 +222,8 @@ int ipu_psys_kcmd_new(struct ipu_psys_command *cmd,
if (cmd_wrap) kfree(cmd_wrap);
if (psys_buffers) kfree(psys_buffers);
+ rval = req->func_ret;
+
ipu4_virtio_fe_req_queue_put(req);
return rval;
@@ -432,6 +438,9 @@ int ipu_psys_getbuf(struct ipu_psys_buffer *buf,
kfree(attach);
exit:
+
+ rval = req->func_ret;
+
ipu4_virtio_fe_req_queue_put(req);
pr_debug("%s: processing ended %d", __func__, rval);
@@ -475,6 +484,8 @@ int ipu_psys_unmapbuf(int fd, struct virt_ipu_psys_fh *fh)
error_exit:
+ rval = req->func_ret;
+
ipu4_virtio_fe_req_queue_put(req);
pr_debug("%s: processing ended %d", __func__, rval);
@@ -543,6 +554,8 @@ long ipu_ioctl_dqevent(struct ipu_psys_event *event,
error_exit:
+ rval = req->func_ret;
+
ipu4_virtio_fe_req_queue_put(req);
pr_debug("%s: processing ended %d", __func__, rval);
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-psys.c b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-psys.c
index 1c71fd34f38a..c69e48c76397 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-psys.c
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-psys.c
@@ -30,6 +30,8 @@ int process_psys_unmapbuf(struct ipu4_virtio_req_info *req_info)
fd passed from SOS to user space is invalid in UOS.*/
ksys_close(req_info->request->op[0]);
+ req_info->request->func_ret = status;
+
if (status)
return IPU4_REQ_ERROR;
else
@@ -56,6 +58,8 @@ int process_psys_querycap(struct ipu4_virtio_req_info *req_info)
unmap_guest_phys(req_info->domid,
req_info->request->payload);
+ req_info->request->func_ret = status;
+
if (status)
return IPU4_REQ_ERROR;
else
@@ -74,6 +78,8 @@ int process_psys_qcmd(struct ipu4_virtio_req_info *req_info)
status = fh->vfops->qcmd(fh, req_info);
+ req_info->request->func_ret = status;
+
if (status)
return IPU4_REQ_ERROR;
else
@@ -87,6 +93,8 @@ int process_psys_dqevent(struct ipu4_virtio_req_info *req_info)
status = fh->vfops->dqevent(fh, req_info, psys_file->f_flags);
+ req_info->request->func_ret = status;
+
if (status)
return IPU4_REQ_ERROR;
else
@@ -100,6 +108,8 @@ int process_psys_getbuf(struct ipu4_virtio_req_info *req_info)
status = fh->vfops->get_buf(fh, req_info);
+ req_info->request->func_ret = status;
+
if (status)
return IPU4_REQ_ERROR;
else
@@ -113,6 +123,8 @@ int process_psys_get_manifest(struct ipu4_virtio_req_info *req_info)
status = fh->vfops->get_manifest(fh, req_info);
+ req_info->request->func_ret = status;
+
if (status)
return IPU4_REQ_ERROR;
else
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-stream.c b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-stream.c
index b47deacb9a00..9025b9586d67 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-stream.c
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-be-stream.c
@@ -188,14 +188,17 @@ int process_poll(struct ipu4_virtio_req_info *req_info)
as->buf_list.wait,
!list_empty(&as->buf_list.putbuf_list),
POLL_WAIT);
- if (time_remain) {
- req->func_ret = POLLIN;
- return IPU4_REQ_PROCESSED;
- } else {
- pr_err("%s poll timeout! %d", __func__, req->op[0]);
+ if((time_remain == -ERESTARTSYS) ||
+ time_remain == 0) {
+ pr_err("%s poll timeout or unexpected wake up! code:%d port:%d",
+ __func__, time_remain, req->op[0]);
req->func_ret = 0;
return IPU4_REQ_ERROR;
}
+ else {
+ req->func_ret = POLLIN;
+ return IPU4_REQ_PROCESSED;
+ }
}
}
--
https://clearlinux.org