From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: "Bandi, Kushal" 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 --- .../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 #include #include +#include #include #include #include @@ -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