* [PATCH 0/2] Memory-to-memory media controller topology
@ 2018-06-20 19:44 Ezequiel Garcia
2018-06-20 19:44 ` [PATCH 1/2] media: add helpers for memory-to-memory media controller Ezequiel Garcia
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Ezequiel Garcia @ 2018-06-20 19:44 UTC (permalink / raw)
To: linux-media
Cc: Hans Verkuil, Laurent Pinchart, kernel, Nicolas Dufresne,
emil.velikov, Ezequiel Garcia
As discussed on IRC, memory-to-memory need to be modeled
properly in order to be supported by the media controller
framework, and thus to support the Request API.
The topology looks like this:
Device topology
- entity 1: source (1 pad, 1 link)
type Node subtype V4L flags 0
pad0: Source
<- "proc":0 [ENABLED,IMMUTABLE]
- entity 3: proc (2 pads, 2 links)
type Node subtype Unknown flags 0
pad0: Source
-> "source":0 [ENABLED,IMMUTABLE]
pad1: Sink
<- "sink":0 [ENABLED,IMMUTABLE]
- entity 6: sink (1 pad, 1 link)
type Node subtype V4L flags 0
pad0: Sink
-> "proc":1 [ENABLED,IMMUTABLE]
The first commit introduces a register/unregister API,
that creates/destroys all the entities and pads needed,
and links them.
The second commit uses this API to support the vim2m driver.
Ezequiel Garcia (1):
media: add helpers for memory-to-memory media controller
Hans Verkuil (1):
vim2m: add media device
drivers/media/platform/vim2m.c | 41 +++++-
drivers/media/v4l2-core/v4l2-dev.c | 13 +-
drivers/media/v4l2-core/v4l2-mem2mem.c | 176 +++++++++++++++++++++++++
include/media/v4l2-mem2mem.h | 5 +
include/uapi/linux/media.h | 3 +
5 files changed, 229 insertions(+), 9 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] media: add helpers for memory-to-memory media controller
2018-06-20 19:44 [PATCH 0/2] Memory-to-memory media controller topology Ezequiel Garcia
@ 2018-06-20 19:44 ` Ezequiel Garcia
2018-06-20 21:23 ` kbuild test robot
2018-06-20 19:44 ` [PATCH 2/2] vim2m: add media device Ezequiel Garcia
2018-06-21 12:07 ` [PATCH 0/2] Memory-to-memory media controller topology Hans Verkuil
2 siblings, 1 reply; 6+ messages in thread
From: Ezequiel Garcia @ 2018-06-20 19:44 UTC (permalink / raw)
To: linux-media
Cc: Hans Verkuil, Laurent Pinchart, kernel, Nicolas Dufresne,
emil.velikov, Ezequiel Garcia
A memory-to-memory pipeline device consists in three
entities: two DMA engine and one video processing entities.
The DMA engine entities are linked to a V4L interface.
This commit add a new v4l2_m2m_{un}register_media_controller
API to register this topology.
For instance, a typical mem2mem device topology would
look like this:
Device topology
- entity 1: source (1 pad, 1 link)
type Node subtype V4L flags 0
pad0: Source
<- "proc":0 [ENABLED,IMMUTABLE]
- entity 3: proc (2 pads, 2 links)
type Node subtype Unknown flags 0
pad0: Source
-> "source":0 [ENABLED,IMMUTABLE]
pad1: Sink
<- "sink":0 [ENABLED,IMMUTABLE]
- entity 6: sink (1 pad, 1 link)
type Node subtype V4L flags 0
pad0: Sink
-> "proc":1 [ENABLED,IMMUTABLE]
Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Suggested-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
---
drivers/media/v4l2-core/v4l2-dev.c | 13 +-
drivers/media/v4l2-core/v4l2-mem2mem.c | 176 +++++++++++++++++++++++++
include/media/v4l2-mem2mem.h | 5 +
include/uapi/linux/media.h | 3 +
4 files changed, 192 insertions(+), 5 deletions(-)
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index 4ffd7d60a901..c1996d73ca74 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -202,7 +202,7 @@ static void v4l2_device_release(struct device *cd)
mutex_unlock(&videodev_lock);
#if defined(CONFIG_MEDIA_CONTROLLER)
- if (v4l2_dev->mdev) {
+ if (v4l2_dev->mdev && vdev->vfl_dir != VFL_DIR_M2M) {
/* Remove interfaces and interface links */
media_devnode_remove(vdev->intf_devnode);
if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN)
@@ -733,19 +733,22 @@ static void determine_valid_ioctls(struct video_device *vdev)
BASE_VIDIOC_PRIVATE);
}
-static int video_register_media_controller(struct video_device *vdev, int type)
+static int video_register_media_controller(struct video_device *vdev)
{
#if defined(CONFIG_MEDIA_CONTROLLER)
u32 intf_type;
int ret;
- if (!vdev->v4l2_dev->mdev)
+ /* Memory-to-memory devices are more complex and use
+ * their own function to register its mc entities.
+ */
+ if (!vdev->v4l2_dev->mdev || vdev->vfl_dir == VFL_DIR_M2M)
return 0;
vdev->entity.obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE;
vdev->entity.function = MEDIA_ENT_F_UNKNOWN;
- switch (type) {
+ switch (vdev->vfl_type) {
case VFL_TYPE_GRABBER:
intf_type = MEDIA_INTF_T_V4L_VIDEO;
vdev->entity.function = MEDIA_ENT_F_IO_V4L;
@@ -993,7 +996,7 @@ int __video_register_device(struct video_device *vdev,
v4l2_device_get(vdev->v4l2_dev);
/* Part 5: Register the entity. */
- ret = video_register_media_controller(vdev, type);
+ ret = video_register_media_controller(vdev);
/* Part 6: Activate this minor. The char device can now be used. */
set_bit(V4L2_FL_REGISTERED, &vdev->flags);
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
index c4f963d96a79..c9ee141c2b33 100644
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
@@ -17,9 +17,11 @@
#include <linux/sched.h>
#include <linux/slab.h>
+#include <media/media-device.h>
#include <media/videobuf2-v4l2.h>
#include <media/v4l2-mem2mem.h>
#include <media/v4l2-dev.h>
+#include <media/v4l2-device.h>
#include <media/v4l2-fh.h>
#include <media/v4l2-event.h>
@@ -50,6 +52,19 @@ module_param(debug, bool, 0644);
* offsets but for different queues */
#define DST_QUEUE_OFF_BASE (1 << 30)
+enum v4l2_m2m_entity_type {
+ MEM2MEM_ENT_TYPE_SOURCE,
+ MEM2MEM_ENT_TYPE_SINK,
+ MEM2MEM_ENT_TYPE_PROC,
+ MEM2MEM_ENT_TYPE_MAX
+};
+
+static const char * const m2m_entity_name[] = {
+ "source",
+ "sink",
+ "proc"
+};
+
/**
* struct v4l2_m2m_dev - per-device context
@@ -60,6 +75,15 @@ module_param(debug, bool, 0644);
*/
struct v4l2_m2m_dev {
struct v4l2_m2m_ctx *curr_ctx;
+#ifdef CONFIG_MEDIA_CONTROLLER
+ struct media_entity *source;
+ struct media_pad source_pad;
+ struct media_entity sink;
+ struct media_pad sink_pad;
+ struct media_entity proc;
+ struct media_pad proc_pads[2];
+ struct media_intf_devnode *intf_devnode;
+#endif
struct list_head job_queue;
spinlock_t job_spinlock;
@@ -595,6 +619,158 @@ int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
}
EXPORT_SYMBOL(v4l2_m2m_mmap);
+void v4l2_m2m_unregister_media_controller(struct v4l2_m2m_dev *m2m_dev)
+{
+ media_remove_intf_links(&m2m_dev->intf_devnode->intf);
+ media_devnode_remove(m2m_dev->intf_devnode);
+
+ media_entity_remove_links(m2m_dev->source);
+ media_entity_remove_links(&m2m_dev->sink);
+ media_entity_remove_links(&m2m_dev->proc);
+ media_device_unregister_entity(m2m_dev->source);
+ media_device_unregister_entity(&m2m_dev->sink);
+ media_device_unregister_entity(&m2m_dev->proc);
+}
+EXPORT_SYMBOL_GPL(v4l2_m2m_unregister_media_controller);
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+static int v4l2_m2m_register_entity(struct media_device *mdev,
+ struct v4l2_m2m_dev *m2m_dev, enum v4l2_m2m_entity_type type,
+ int function)
+{
+ struct media_entity *entity;
+ struct media_pad *pads;
+ int num_pads;
+ int ret;
+
+ switch (type) {
+ case MEM2MEM_ENT_TYPE_SOURCE:
+ entity = m2m_dev->source;
+ pads = &m2m_dev->source_pad;
+ entity->name = m2m_entity_name[type];
+ pads[0].flags = MEDIA_PAD_FL_SOURCE;
+ num_pads = 1;
+ break;
+ case MEM2MEM_ENT_TYPE_SINK:
+ entity = &m2m_dev->sink;
+ pads = &m2m_dev->sink_pad;
+ pads[0].flags = MEDIA_PAD_FL_SINK;
+ num_pads = 1;
+ break;
+ case MEM2MEM_ENT_TYPE_PROC:
+ entity = &m2m_dev->proc;
+ pads = m2m_dev->proc_pads;
+ pads[0].flags = MEDIA_PAD_FL_SOURCE;
+ pads[1].flags = MEDIA_PAD_FL_SINK;
+ num_pads = 2;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ entity->obj_type = MEDIA_ENTITY_TYPE_BASE;
+ entity->name = m2m_entity_name[type];
+ entity->function = function;
+
+ ret = media_entity_pads_init(entity, num_pads, pads);
+ if (ret)
+ return ret;
+ ret = media_device_register_entity(mdev, entity);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+#endif
+
+int v4l2_m2m_register_media_controller(struct v4l2_m2m_dev *m2m_dev,
+ struct video_device *vdev, int function)
+{
+#if defined(CONFIG_MEDIA_CONTROLLER)
+ struct media_device *mdev = vdev->v4l2_dev->mdev;
+ struct media_link *link;
+ int ret;
+
+ if (!mdev)
+ return 0;
+
+ /* A memory-to-memory device consists in two
+ * DMA engine and one video processing entities.
+ * The DMA engine entities are linked to a V4L interface
+ */
+
+ /* Create the three entities with their pads */
+ m2m_dev->source = &vdev->entity;
+ ret = v4l2_m2m_register_entity(mdev, m2m_dev,
+ MEM2MEM_ENT_TYPE_SOURCE, MEDIA_ENT_F_IO_V4L);
+ if (ret)
+ return ret;
+ ret = v4l2_m2m_register_entity(mdev, m2m_dev,
+ MEM2MEM_ENT_TYPE_PROC, function);
+ if (ret)
+ goto err_rel_entity0;
+ ret = v4l2_m2m_register_entity(mdev, m2m_dev,
+ MEM2MEM_ENT_TYPE_SINK, MEDIA_ENT_F_IO_V4L);
+ if (ret)
+ goto err_rel_entity1;
+
+ /* Connect the three entities */
+ ret = media_create_pad_link(&m2m_dev->sink, 0, &m2m_dev->proc, 1,
+ MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED);
+ if (ret)
+ goto err_rel_entity2;
+
+ ret = media_create_pad_link(&m2m_dev->proc, 0, m2m_dev->source, 0,
+ MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED);
+ if (ret)
+ goto err_rm_links0;
+
+ /* Create video interface */
+ m2m_dev->intf_devnode = media_devnode_create(mdev,
+ MEDIA_INTF_T_V4L_VIDEO, 0,
+ VIDEO_MAJOR, vdev->minor);
+ if (!m2m_dev->intf_devnode) {
+ ret = -ENOMEM;
+ goto err_rm_links1;
+ }
+
+ /* Connect the two DMA engines to the interface */
+ link = media_create_intf_link(m2m_dev->source,
+ &m2m_dev->intf_devnode->intf, MEDIA_LNK_FL_ENABLED);
+ if (!link) {
+ ret = -ENOMEM;
+ goto err_rm_devnode;
+ }
+
+ link = media_create_intf_link(&m2m_dev->sink,
+ &m2m_dev->intf_devnode->intf, MEDIA_LNK_FL_ENABLED);
+ if (!link) {
+ ret = -ENOMEM;
+ goto err_rm_intf_link;
+ }
+ return 0;
+
+err_rm_intf_link:
+ media_remove_intf_links(&m2m_dev->intf_devnode->intf);
+err_rm_devnode:
+ media_devnode_remove(m2m_dev->intf_devnode);
+err_rm_links1:
+ media_entity_remove_links(&m2m_dev->sink);
+err_rm_links0:
+ media_entity_remove_links(&m2m_dev->proc);
+ media_entity_remove_links(m2m_dev->source);
+err_rel_entity2:
+ media_device_unregister_entity(&m2m_dev->proc);
+err_rel_entity1:
+ media_device_unregister_entity(&m2m_dev->sink);
+err_rel_entity0:
+ media_device_unregister_entity(m2m_dev->source);
+ return ret;
+#endif
+ return 0;
+}
+EXPORT_SYMBOL_GPL(v4l2_m2m_register_media_controller);
+
struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops)
{
struct v4l2_m2m_dev *m2m_dev;
diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
index 3d07ba3a8262..36e252d2149a 100644
--- a/include/media/v4l2-mem2mem.h
+++ b/include/media/v4l2-mem2mem.h
@@ -53,6 +53,7 @@ struct v4l2_m2m_ops {
void (*unlock)(void *priv);
};
+struct video_device;
struct v4l2_m2m_dev;
/**
@@ -328,6 +329,10 @@ int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
*/
struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops);
+void v4l2_m2m_unregister_media_controller(struct v4l2_m2m_dev *m2m_dev);
+int v4l2_m2m_register_media_controller(struct v4l2_m2m_dev *m2m_dev,
+ struct video_device *vdev, int function);
+
/**
* v4l2_m2m_release() - cleans up and frees a m2m_dev structure
*
diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h
index c7e9a5cba24e..5f58c7ac04c0 100644
--- a/include/uapi/linux/media.h
+++ b/include/uapi/linux/media.h
@@ -132,6 +132,9 @@ struct media_device_info {
#define MEDIA_ENT_F_PROC_VIDEO_LUT (MEDIA_ENT_F_BASE + 0x4004)
#define MEDIA_ENT_F_PROC_VIDEO_SCALER (MEDIA_ENT_F_BASE + 0x4005)
#define MEDIA_ENT_F_PROC_VIDEO_STATISTICS (MEDIA_ENT_F_BASE + 0x4006)
+#define MEDIA_ENT_F_PROC_VIDEO_DECODER (MEDIA_ENT_F_BASE + 0x4007)
+#define MEDIA_ENT_F_PROC_VIDEO_ENCODER (MEDIA_ENT_F_BASE + 0x4008)
+#define MEDIA_ENT_F_PROC_VIDEO_DEINTERLACER (MEDIA_ENT_F_BASE + 0x4009)
/*
* Switch and bridge entity functions
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] vim2m: add media device
2018-06-20 19:44 [PATCH 0/2] Memory-to-memory media controller topology Ezequiel Garcia
2018-06-20 19:44 ` [PATCH 1/2] media: add helpers for memory-to-memory media controller Ezequiel Garcia
@ 2018-06-20 19:44 ` Ezequiel Garcia
2018-06-21 12:07 ` [PATCH 0/2] Memory-to-memory media controller topology Hans Verkuil
2 siblings, 0 replies; 6+ messages in thread
From: Ezequiel Garcia @ 2018-06-20 19:44 UTC (permalink / raw)
To: linux-media
Cc: Hans Verkuil, Laurent Pinchart, kernel, Nicolas Dufresne,
emil.velikov, Ezequiel Garcia
From: Hans Verkuil <hans.verkuil@cisco.com>
Request API requires a media node. Add one to the vim2m driver so we can
use requests with it.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
---
drivers/media/platform/vim2m.c | 41 ++++++++++++++++++++++++++++++----
1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c
index 065483e62db4..da13a8927f3f 100644
--- a/drivers/media/platform/vim2m.c
+++ b/drivers/media/platform/vim2m.c
@@ -140,6 +140,9 @@ static struct vim2m_fmt *find_format(struct v4l2_format *f)
struct vim2m_dev {
struct v4l2_device v4l2_dev;
struct video_device vfd;
+#ifdef CONFIG_MEDIA_CONTROLLER
+ struct media_device mdev;
+#endif
atomic_t num_inst;
struct mutex dev_mutex;
@@ -1016,7 +1019,7 @@ static int vim2m_probe(struct platform_device *pdev)
ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
if (ret) {
v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
- goto unreg_dev;
+ goto unreg_v4l2;
}
video_set_drvdata(vfd, dev);
@@ -1031,15 +1034,39 @@ static int vim2m_probe(struct platform_device *pdev)
if (IS_ERR(dev->m2m_dev)) {
v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n");
ret = PTR_ERR(dev->m2m_dev);
- goto err_m2m;
+ goto unreg_dev;
+ }
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+ dev->mdev.dev = &pdev->dev;
+ strlcpy(dev->mdev.model, "vim2m", sizeof(dev->mdev.model));
+ media_device_init(&dev->mdev);
+ dev->v4l2_dev.mdev = &dev->mdev;
+
+ ret = v4l2_m2m_register_media_controller(dev->m2m_dev,
+ vfd, MEDIA_ENT_F_PROC_VIDEO_SCALER);
+ if (ret) {
+ v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n");
+ goto unreg_m2m;
}
+ ret = media_device_register(&dev->mdev);
+ if (ret) {
+ v4l2_err(&dev->v4l2_dev, "Failed to register mem2mem media device\n");
+ goto unreg_m2m_mc;
+ }
+#endif
return 0;
-err_m2m:
+#ifdef CONFIG_MEDIA_CONTROLLER
+unreg_m2m_mc:
+ v4l2_m2m_unregister_media_controller(dev->m2m_dev);
+unreg_m2m:
v4l2_m2m_release(dev->m2m_dev);
- video_unregister_device(&dev->vfd);
+#endif
unreg_dev:
+ video_unregister_device(&dev->vfd);
+unreg_v4l2:
v4l2_device_unregister(&dev->v4l2_dev);
return ret;
@@ -1050,6 +1077,12 @@ static int vim2m_remove(struct platform_device *pdev)
struct vim2m_dev *dev = platform_get_drvdata(pdev);
v4l2_info(&dev->v4l2_dev, "Removing " MEM2MEM_NAME);
+
+#ifdef CONFIG_MEDIA_CONTROLLER
+ media_device_unregister(&dev->mdev);
+ v4l2_m2m_unregister_media_controller(dev->m2m_dev);
+ media_device_cleanup(&dev->mdev);
+#endif
v4l2_m2m_release(dev->m2m_dev);
del_timer_sync(&dev->timer);
video_unregister_device(&dev->vfd);
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] media: add helpers for memory-to-memory media controller
2018-06-20 19:44 ` [PATCH 1/2] media: add helpers for memory-to-memory media controller Ezequiel Garcia
@ 2018-06-20 21:23 ` kbuild test robot
0 siblings, 0 replies; 6+ messages in thread
From: kbuild test robot @ 2018-06-20 21:23 UTC (permalink / raw)
To: Ezequiel Garcia
Cc: kbuild-all, linux-media, Hans Verkuil, Laurent Pinchart, kernel,
Nicolas Dufresne, emil.velikov, Ezequiel Garcia
[-- Attachment #1: Type: text/plain, Size: 3231 bytes --]
Hi Ezequiel,
I love your patch! Yet something to improve:
[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v4.18-rc1 next-20180620]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Ezequiel-Garcia/media-add-helpers-for-memory-to-memory-media-controller/20180621-050216
base: git://linuxtv.org/media_tree.git master
config: x86_64-randconfig-x012-201824 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All errors (new ones prefixed by >>):
drivers/media/v4l2-core/v4l2-mem2mem.c: In function 'v4l2_m2m_unregister_media_controller':
>> drivers/media/v4l2-core/v4l2-mem2mem.c:624:34: error: 'struct v4l2_m2m_dev' has no member named 'intf_devnode'
media_remove_intf_links(&m2m_dev->intf_devnode->intf);
^~
drivers/media/v4l2-core/v4l2-mem2mem.c:625:30: error: 'struct v4l2_m2m_dev' has no member named 'intf_devnode'
media_devnode_remove(m2m_dev->intf_devnode);
^~
>> drivers/media/v4l2-core/v4l2-mem2mem.c:627:35: error: 'struct v4l2_m2m_dev' has no member named 'source'
media_entity_remove_links(m2m_dev->source);
^~
>> drivers/media/v4l2-core/v4l2-mem2mem.c:628:36: error: 'struct v4l2_m2m_dev' has no member named 'sink'
media_entity_remove_links(&m2m_dev->sink);
^~
>> drivers/media/v4l2-core/v4l2-mem2mem.c:629:36: error: 'struct v4l2_m2m_dev' has no member named 'proc'
media_entity_remove_links(&m2m_dev->proc);
^~
drivers/media/v4l2-core/v4l2-mem2mem.c:630:40: error: 'struct v4l2_m2m_dev' has no member named 'source'
media_device_unregister_entity(m2m_dev->source);
^~
drivers/media/v4l2-core/v4l2-mem2mem.c:631:41: error: 'struct v4l2_m2m_dev' has no member named 'sink'
media_device_unregister_entity(&m2m_dev->sink);
^~
drivers/media/v4l2-core/v4l2-mem2mem.c:632:41: error: 'struct v4l2_m2m_dev' has no member named 'proc'
media_device_unregister_entity(&m2m_dev->proc);
^~
vim +624 drivers/media/v4l2-core/v4l2-mem2mem.c
621
622 void v4l2_m2m_unregister_media_controller(struct v4l2_m2m_dev *m2m_dev)
623 {
> 624 media_remove_intf_links(&m2m_dev->intf_devnode->intf);
> 625 media_devnode_remove(m2m_dev->intf_devnode);
626
> 627 media_entity_remove_links(m2m_dev->source);
> 628 media_entity_remove_links(&m2m_dev->sink);
> 629 media_entity_remove_links(&m2m_dev->proc);
630 media_device_unregister_entity(m2m_dev->source);
631 media_device_unregister_entity(&m2m_dev->sink);
632 media_device_unregister_entity(&m2m_dev->proc);
633 }
634 EXPORT_SYMBOL_GPL(v4l2_m2m_unregister_media_controller);
635
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28308 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 0/2] Memory-to-memory media controller topology
2018-06-20 19:44 [PATCH 0/2] Memory-to-memory media controller topology Ezequiel Garcia
2018-06-20 19:44 ` [PATCH 1/2] media: add helpers for memory-to-memory media controller Ezequiel Garcia
2018-06-20 19:44 ` [PATCH 2/2] vim2m: add media device Ezequiel Garcia
@ 2018-06-21 12:07 ` Hans Verkuil
2018-06-21 20:04 ` Ezequiel Garcia
2 siblings, 1 reply; 6+ messages in thread
From: Hans Verkuil @ 2018-06-21 12:07 UTC (permalink / raw)
To: Ezequiel Garcia, linux-media
Cc: Hans Verkuil, Laurent Pinchart, kernel, Nicolas Dufresne,
emil.velikov
On 06/20/18 21:44, Ezequiel Garcia wrote:
> As discussed on IRC, memory-to-memory need to be modeled
> properly in order to be supported by the media controller
> framework, and thus to support the Request API.
>
> The topology looks like this:
>
> Device topology
> - entity 1: source (1 pad, 1 link)
> type Node subtype V4L flags 0
> pad0: Source
> <- "proc":0 [ENABLED,IMMUTABLE]
>
> - entity 3: proc (2 pads, 2 links)
> type Node subtype Unknown flags 0
> pad0: Source
> -> "source":0 [ENABLED,IMMUTABLE]
> pad1: Sink
> <- "sink":0 [ENABLED,IMMUTABLE]
>
> - entity 6: sink (1 pad, 1 link)
> type Node subtype V4L flags 0
> pad0: Sink
> -> "proc":1 [ENABLED,IMMUTABLE]
>
> The first commit introduces a register/unregister API,
> that creates/destroys all the entities and pads needed,
> and links them.
Can you add the output of v4l2-compliance -m /dev/mediaX here as well?
Thanks!
Hans
>
> The second commit uses this API to support the vim2m driver.
>
> Ezequiel Garcia (1):
> media: add helpers for memory-to-memory media controller
>
> Hans Verkuil (1):
> vim2m: add media device
>
> drivers/media/platform/vim2m.c | 41 +++++-
> drivers/media/v4l2-core/v4l2-dev.c | 13 +-
> drivers/media/v4l2-core/v4l2-mem2mem.c | 176 +++++++++++++++++++++++++
> include/media/v4l2-mem2mem.h | 5 +
> include/uapi/linux/media.h | 3 +
> 5 files changed, 229 insertions(+), 9 deletions(-)
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 0/2] Memory-to-memory media controller topology
2018-06-21 12:07 ` [PATCH 0/2] Memory-to-memory media controller topology Hans Verkuil
@ 2018-06-21 20:04 ` Ezequiel Garcia
0 siblings, 0 replies; 6+ messages in thread
From: Ezequiel Garcia @ 2018-06-21 20:04 UTC (permalink / raw)
To: Hans Verkuil, linux-media
Cc: Hans Verkuil, Laurent Pinchart, kernel, Nicolas Dufresne,
emil.velikov
On Thu, 2018-06-21 at 14:07 +0200, Hans Verkuil wrote:
> On 06/20/18 21:44, Ezequiel Garcia wrote:
> > As discussed on IRC, memory-to-memory need to be modeled
> > properly in order to be supported by the media controller
> > framework, and thus to support the Request API.
> >
> > The topology looks like this:
> >
> > Device topology
> > - entity 1: source (1 pad, 1 link)
> > type Node subtype V4L flags 0
> > pad0: Source
> > <- "proc":0 [ENABLED,IMMUTABLE]
> >
> > - entity 3: proc (2 pads, 2 links)
> > type Node subtype Unknown flags 0
> > pad0: Source
> > -> "source":0 [ENABLED,IMMUTABLE]
> > pad1: Sink
> > <- "sink":0 [ENABLED,IMMUTABLE]
> >
> > - entity 6: sink (1 pad, 1 link)
> > type Node subtype V4L flags 0
> > pad0: Sink
> > -> "proc":1 [ENABLED,IMMUTABLE]
> >
> > The first commit introduces a register/unregister API,
> > that creates/destroys all the entities and pads needed,
> > and links them.
>
> Can you add the output of v4l2-compliance -m /dev/mediaX here as
> well?
>
Let me post a new version of the patch, with some minor changes,
including the output of the v4l2-compliance tool.
Thanks,
Eze
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-06-21 20:04 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-20 19:44 [PATCH 0/2] Memory-to-memory media controller topology Ezequiel Garcia
2018-06-20 19:44 ` [PATCH 1/2] media: add helpers for memory-to-memory media controller Ezequiel Garcia
2018-06-20 21:23 ` kbuild test robot
2018-06-20 19:44 ` [PATCH 2/2] vim2m: add media device Ezequiel Garcia
2018-06-21 12:07 ` [PATCH 0/2] Memory-to-memory media controller topology Hans Verkuil
2018-06-21 20:04 ` Ezequiel Garcia
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox