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

350 lines
9.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: "Bandi, Kushal" <kushal.bandi@intel.com>
Date: Thu, 4 Oct 2018 02:08:37 +0000
Subject: [PATCH] media: intel-ipu4: [VIRT] Psys mediation connected to FE
Change-Id: I60af1e37777424b97a191006ead892448a085e9f
Tracked-On: OAM-64123
Tracked-On: OAM-64294
Tracked-On: OAM-64937
Tracked-On: OLINUX-2973
Tracked-On: OLINUX-3042
Signed-off-by: Bandi, Kushal <kushal.bandi@intel.com>
---
.../intel/virtio/intel-ipu4-para-virt-drv.c | 40 ++++++++----
.../intel/virtio/intel-ipu4-para-virt-psys.c | 62 ++++++++++++++++---
.../intel/virtio/intel-ipu4-para-virt-psys.h | 7 ++-
.../intel/virtio/intel-ipu4-virtio-common.h | 11 ++++
.../virtio/intel-ipu4-virtio-fe-payload.c | 14 +++++
5 files changed, 114 insertions(+), 20 deletions(-)
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c
index 212132f5edc0..08a7ef3a6d38 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c
@@ -883,12 +883,11 @@ int virt_frame_buf_init(struct ici_isys_frame_buf_list *buf_list)
return 0;
}
-static int virt_ici_stream_init(struct virtual_stream *vstream,
+static int virt_ici_stream_init(struct ipu4_virtio_ctx *fe_ctx,struct virtual_stream *vstream,
struct ici_stream_device *strm_dev)
{
int rval;
int num;
- struct ipu4_virtio_ctx *fe_ctx;
if (!stream_dev_init) {
virt_stream_dev_t = MKDEV(MAJOR_STREAM, 0);
@@ -937,6 +936,7 @@ static int virt_ici_stream_init(struct virtual_stream *vstream,
virt_stream_devs_registered++;
+#if 0
fe_ctx = kcalloc(1, sizeof(struct ipu4_virtio_ctx),
GFP_KERNEL);
@@ -954,6 +954,9 @@ static int virt_ici_stream_init(struct virtual_stream *vstream,
}
fe_ctx->domid = fe_ctx->bknd_ops->get_vm_id();
+#endif
+ if (!fe_ctx)
+ return -ENOMEM;
vstream->ctx = fe_ctx;
dev_dbg(&strm_dev->dev, "IPU FE registered with domid:%d\n", fe_ctx->domid);
@@ -1255,7 +1258,7 @@ static int virt_ici_pipeline_init(void)
return 0;
}
-static int virt_ici_init(void)
+static int virt_ici_init(struct ipu4_virtio_ctx *fe_ctx)
{
struct virtual_stream *vstream;
int rval = 0, i;
@@ -1275,22 +1278,17 @@ static int virt_ici_init(void)
dev_set_drvdata(&vstream->strm_dev.dev, vstream);
mutex_lock(&vstream->mutex);
- rval = virt_ici_stream_init(vstream, &vstream->strm_dev);
+ rval = virt_ici_stream_init(fe_ctx,vstream, &vstream->strm_dev);
mutex_unlock(&vstream->mutex);
if (rval)
goto init_fail;
}
- rval = ipu4_virtio_fe_req_queue_init();
- if (rval)
- goto init_fail;
-
rval = virt_ici_pipeline_init();
if (rval)
goto init_fail;
- rval = virt_fe_init();
return rval;
init_fail:
@@ -1298,7 +1296,22 @@ static int virt_ici_init(void)
kfree(vstream);
return rval;
}
+static int virt_fe_probe(void)
+{
+ int rval = 0;
+ rval = ipu4_virtio_fe_req_queue_init();
+ if (rval) {
+ pr_err("FE Ring queue initialization failed\n");
+ return rval;
+ }
+ rval = virt_fe_init();
+ if (rval) {
+ pr_err("FE initialization failed\n");
+ return rval;
+ }
+ return rval;
+}
static void virt_ici_pipeline_exit(void)
{
class_unregister(virt_pipeline_class);
@@ -1318,11 +1331,16 @@ static void virt_ici_exit(void)
static int __init virt_ipu_init(void)
{
int rval = 0;
- rval = virt_ici_init();
+
+ rval = virt_fe_probe();
+ if(rval)
+ return rval;
+
+ rval = virt_ici_init(g_fe_priv);
if(rval)
pr_warn("ipu virt: ISYS init failed\n");
- rval = virt_psys_init();
+ rval = virt_psys_init(g_fe_priv);
if(rval)
pr_warn("ipu virt: PSYS init failed\n");
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 6e040794aef0..8aaa5bbdda79 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
@@ -8,6 +8,7 @@
#include <linux/dma-buf.h>
#include <linux/firmware.h>
#include <linux/fs.h>
+#include <linux/file.h>
#include <linux/highmem.h>
#include <linux/init_task.h>
#include <linux/kthread.h>
@@ -29,6 +30,9 @@
#endif
#include "intel-ipu4-para-virt-psys.h"
+#include "intel-ipu4-virtio-common.h"
+#include "intel-ipu4-virtio-fe-request-queue.h"
+#include "intel-ipu4-virtio-fe-payload.h"
#define IPU_PSYS_NUM_DEVICES 4
#define IPU_PSYS_NAME "intel-ipu4-psys"
@@ -42,6 +46,12 @@ static struct ipu_psys_capability caps = {
.driver = "ipu-psys",
};
+static long ipu_get_manifest(struct ipu_psys_manifest *manifest,
+ struct virt_ipu_psys_fh *fh) {
+
+ return 0;
+}
+
static unsigned int virt_psys_poll(struct file *file,
struct poll_table_struct *wait)
{
@@ -55,7 +65,7 @@ long virt_psys_compat_ioctl32(struct file *file, unsigned int cmd,
int err = 0;
if (err)
- return err;
+ return err;
return 0;
}
@@ -71,6 +81,7 @@ static long virt_psys_ioctl(struct file *file, unsigned int cmd,
} karg;
int err = 0;
+ struct virt_ipu_psys_fh *fh = file->private_data;
void __user *up = (void __user *)arg;
bool copy = (cmd != IPU_IOC_MAPBUF && cmd != IPU_IOC_UNMAPBUF);
@@ -107,7 +118,7 @@ static long virt_psys_ioctl(struct file *file, unsigned int cmd,
//err = ipu_ioctl_dqevent(&karg.ev, fh, file->f_flags);
break;
case IPU_IOC_GET_MANIFEST:
- //err = ipu_get_manifest(&karg.m, fh);
+ err = ipu_get_manifest(&karg.m, fh);
break;
default:
err = -ENOTTY;
@@ -120,15 +131,47 @@ static long virt_psys_ioctl(struct file *file, unsigned int cmd,
}
static int virt_psys_open(struct inode *inode, struct file *file)
{
- int rval;
+ struct virt_ipu_psys *psys = inode_to_ipu_psys(inode);
+ struct virt_ipu_psys_fh *fh;
+ struct ipu4_virtio_req *req;
+ struct ipu4_virtio_ctx *fe_ctx = psys->ctx;
+ int op[2];
+ int rval = 0;
+
+ pr_debug("virt psys open\n");
+ fh = kzalloc(sizeof(*fh), GFP_KERNEL);
+ if (!fh)
+ return -ENOMEM;
+ mutex_init(&fh->bs_mutex);
+
+ fh->psys = psys;
+ file->private_data = fh;
+
+ req = ipu4_virtio_fe_req_queue_get();
+ if (!req) {
+ dev_err(&psys->dev, "Virtio Req buffer failed\n");
+ return -ENOMEM;
+ }
+ op[0] = 0;
+
+ intel_ipu4_virtio_create_req(req, IPU4_CMD_DEVICE_OPEN, &op[0]);
+
+ rval = fe_ctx->bknd_ops->send_req(fe_ctx->domid, req, true,
+ IPU_VIRTIO_QUEUE_1);
+ if (rval) {
+ dev_err(&psys->dev, "Failed to PSYS open virtual device\n");
+ ipu4_virtio_fe_req_queue_put(req);
+ return rval;
+ }
+ ipu4_virtio_fe_req_queue_put(req);
return rval;
}
static int virt_psys_release(struct inode *inode, struct file *file)
{
- int rval;
+ int rval = 0;
return rval;
}
@@ -154,12 +197,15 @@ void virt_psys_exit(void)
}
-int virt_psys_init(void)
+int virt_psys_init(struct ipu4_virtio_ctx *fe_ctx)
{
struct virt_ipu_psys *psys;
unsigned int minor;
int rval = -E2BIG;
+ if (!fe_ctx)
+ return -ENOMEM;
+
rval = alloc_chrdev_region(&virt_psys_dev_t, 0,
IPU_PSYS_NUM_DEVICES, IPU_PSYS_NAME);
if (rval) {
@@ -201,8 +247,10 @@ int virt_psys_init(void)
goto out_mutex_destroy;
}
/* Add the hw stepping information to caps */
- strlcpy(caps.dev_model, IPU_MEDIA_DEV_MODEL_NAME,
- sizeof(caps.dev_model));
+ strlcpy(caps.dev_model, IPU_MEDIA_DEV_MODEL_NAME,
+ sizeof(caps.dev_model));
+
+ psys->ctx = fe_ctx;
pr_info("psys probe minor: %d\n", minor);
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.h b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.h
index f84c1e2baf31..8de72c15b01c 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.h
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-psys.h
@@ -15,7 +15,7 @@ struct virt_ipu_psys {
struct cdev cdev;
struct device dev;
struct mutex mutex;
-
+ struct ipu4_virtio_ctx *ctx;
};
struct virt_ipu_psys_fh {
@@ -30,9 +30,12 @@ struct virt_ipu_psys_fh {
struct mutex bs_mutex; /* Protects buf_set field */
struct list_head buf_sets;
};
-int virt_psys_init(void);
+int virt_psys_init(struct ipu4_virtio_ctx *fe_ctx);
void virt_psys_exit(void);
#define dev_to_vpsys(dev) \
container_of(dev, struct virt_ipu_psys, dev)
+#define inode_to_ipu_psys(inode) \
+ container_of((inode)->i_cdev, struct virt_ipu_psys, cdev)
+
#endif /* INTEL_IPU4_PARA_VIRT_PSYS_H_ */
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-common.h b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-common.h
index 43caddb1550e..f1d184cdcbce 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-common.h
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-common.h
@@ -109,6 +109,17 @@ enum intel_ipu4_virtio_command {
IPU4_CMD_POLL,
IPU4_CMD_PIPELINE_OPEN,
IPU4_CMD_PIPELINE_CLOSE,
+ IPU4_CMD_PSYS_MAPBUF,
+ IPU4_CMD_PSYS_UNMAPBUF,
+ IPU4_CMD_PSYS_QUERYCAP,
+ IPU4_CMD_PSYS_GETBUF,
+ IPU4_CMD_PSYS_PUTBUF,
+ IPU4_CMD_PSYS_QCMD,
+ IPU4_CMD_PSYS_DQEVENT,
+ IPU4_CMD_PSYS_GET_MANIFEST,
+ IPU4_CMD_PSYS_OPEN,
+ IPU4_CMD_PSYS_CLOSE,
+ IPU4_CMD_PSYS_POLL,
IPU4_CMD_GET_N
};
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-fe-payload.c b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-fe-payload.c
index 44edf7414a15..28ed1cfcdecd 100644
--- a/drivers/media/pci/intel/virtio/intel-ipu4-virtio-fe-payload.c
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-virtio-fe-payload.c
@@ -49,6 +49,20 @@ void intel_ipu4_virtio_create_req(struct ipu4_virtio_req *req,
for (i = 0; i < 3; i++)
req->op[i] = op[i];
break;
+ case IPU4_CMD_PSYS_OPEN:
+ req->op[0] = op[0];
+ break;
+ case IPU4_CMD_PSYS_CLOSE:
+ case IPU4_CMD_PSYS_POLL:
+ case IPU4_CMD_PSYS_MAPBUF:
+ case IPU4_CMD_PSYS_UNMAPBUF:
+ case IPU4_CMD_PSYS_QUERYCAP:
+ case IPU4_CMD_PSYS_GETBUF:
+ case IPU4_CMD_PSYS_PUTBUF:
+ case IPU4_CMD_PSYS_QCMD:
+ case IPU4_CMD_PSYS_DQEVENT:
+ case IPU4_CMD_PSYS_GET_MANIFEST:
+ break;
default:
return;
}
--
https://clearlinux.org