blob: 0c05503eaf1fa6c7c0a109cfac1460cc0c4afe2b [file] [log] [blame]
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -03001Media Controller devices
2------------------------
3
4Media Controller
5~~~~~~~~~~~~~~~~
6
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -03007The media controller userspace API is documented in
Mauro Carvalho Chehabda83c882016-07-20 10:36:18 -03008:ref:`the Media Controller uAPI book <media_controller>`. This document focus
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -03009on the kernel-side implementation of the media framework.
10
11Abstract media device model
12^^^^^^^^^^^^^^^^^^^^^^^^^^^
13
14Discovering a device internal topology, and configuring it at runtime, is one
15of the goals of the media framework. To achieve this, hardware devices are
16modelled as an oriented graph of building blocks called entities connected
17through pads.
18
19An entity is a basic media hardware building block. It can correspond to
20a large variety of logical blocks such as physical hardware devices
21(CMOS sensor for instance), logical hardware devices (a building block
22in a System-on-Chip image processing pipeline), DMA channels or physical
23connectors.
24
25A pad is a connection endpoint through which an entity can interact with
26other entities. Data (not restricted to video) produced by an entity
27flows from the entity's output to one or more entity inputs. Pads should
28not be confused with physical pins at chip boundaries.
29
30A link is a point-to-point oriented connection between two pads, either
31on the same entity or on different entities. Data flows from a source
32pad to a sink pad.
33
34Media device
35^^^^^^^^^^^^
36
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -030037A media device is represented by a struct :c:type:`media_device`
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030038instance, defined in ``include/media/media-device.h``.
39Allocation of the structure is handled by the media device driver, usually by
40embedding the :c:type:`media_device` instance in a larger driver-specific
41structure.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030042
43Drivers register media device instances by calling
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -030044:c:func:`__media_device_register()` via the macro ``media_device_register()``
45and unregistered by calling :c:func:`media_device_unregister()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030046
47Entities
48^^^^^^^^
49
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -030050Entities are represented by a struct :c:type:`media_entity`
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030051instance, defined in ``include/media/media-entity.h``. The structure is usually
52embedded into a higher-level structure, such as
Mauro Carvalho Chehab041d8212016-07-21 15:29:11 -030053:c:type:`v4l2_subdev` or :c:type:`video_device`
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030054instances, although drivers can allocate entities directly.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030055
56Drivers initialize entity pads by calling
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -030057:c:func:`media_entity_pads_init()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030058
59Drivers register entities with a media device by calling
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -030060:c:func:`media_device_register_entity()`
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030061and unregistred by calling
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -030062:c:func:`media_device_unregister_entity()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030063
64Interfaces
65^^^^^^^^^^
66
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030067Interfaces are represented by a
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -030068struct :c:type:`media_interface` instance, defined in
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030069``include/media/media-entity.h``. Currently, only one type of interface is
70defined: a device node. Such interfaces are represented by a
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -030071struct :c:type:`media_intf_devnode`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030072
73Drivers initialize and create device node interfaces by calling
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -030074:c:func:`media_devnode_create()`
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030075and remove them by calling:
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -030076:c:func:`media_devnode_remove()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030077
78Pads
79^^^^
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -030080Pads are represented by a struct :c:type:`media_pad` instance,
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030081defined in ``include/media/media-entity.h``. Each entity stores its pads in
82a pads array managed by the entity driver. Drivers usually embed the array in
83a driver-specific structure.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030084
85Pads are identified by their entity and their 0-based index in the pads
86array.
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030087
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -030088Both information are stored in the struct :c:type:`media_pad`,
89making the struct :c:type:`media_pad` pointer the canonical way
Mauro Carvalho Chehab3c7d91e2016-08-29 16:03:00 -030090to store and pass link references.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030091
92Pads have flags that describe the pad capabilities and state.
93
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030094``MEDIA_PAD_FL_SINK`` indicates that the pad supports sinking data.
95``MEDIA_PAD_FL_SOURCE`` indicates that the pad supports sourcing data.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -030096
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -030097.. note::
98
99 One and only one of ``MEDIA_PAD_FL_SINK`` or ``MEDIA_PAD_FL_SOURCE`` must
100 be set for each pad.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300101
102Links
103^^^^^
104
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -0300105Links are represented by a struct :c:type:`media_link` instance,
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300106defined in ``include/media/media-entity.h``. There are two types of links:
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300107
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300108**1. pad to pad links**:
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300109
110Associate two entities via their PADs. Each entity has a list that points
111to all links originating at or targeting any of its pads.
112A given link is thus stored twice, once in the source entity and once in
113the target entity.
114
115Drivers create pad to pad links by calling:
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -0300116:c:func:`media_create_pad_link()` and remove with
117:c:func:`media_entity_remove_links()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300118
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300119**2. interface to entity links**:
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300120
121Associate one interface to a Link.
122
123Drivers create interface to entity links by calling:
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -0300124:c:func:`media_create_intf_link()` and remove with
125:c:func:`media_remove_intf_links()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300126
127.. note::
128
129 Links can only be created after having both ends already created.
130
131Links have flags that describe the link capabilities and state. The
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -0300132valid values are described at :c:func:`media_create_pad_link()` and
133:c:func:`media_create_intf_link()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300134
135Graph traversal
136^^^^^^^^^^^^^^^
137
138The media framework provides APIs to iterate over entities in a graph.
139
140To iterate over all entities belonging to a media device, drivers can use
141the media_device_for_each_entity macro, defined in
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300142``include/media/media-device.h``.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300143
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300144.. code-block:: c
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300145
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300146 struct media_entity *entity;
147
148 media_device_for_each_entity(entity, mdev) {
149 // entity will point to each entity in turn
150 ...
151 }
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300152
153Drivers might also need to iterate over all entities in a graph that can be
154reached only through enabled links starting at a given entity. The media
155framework provides a depth-first graph traversal API for that purpose.
156
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300157.. note::
158
159 Graphs with cycles (whether directed or undirected) are **NOT**
160 supported by the graph traversal API. To prevent infinite loops, the graph
161 traversal code limits the maximum depth to ``MEDIA_ENTITY_ENUM_MAX_DEPTH``,
162 currently defined as 16.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300163
164Drivers initiate a graph traversal by calling
Sakari Ailus20b85222016-11-21 14:48:30 -0200165:c:func:`media_graph_walk_start()`
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300166
167The graph structure, provided by the caller, is initialized to start graph
168traversal at the given entity.
169
170Drivers can then retrieve the next entity by calling
Sakari Ailus20b85222016-11-21 14:48:30 -0200171:c:func:`media_graph_walk_next()`
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300172
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300173When the graph traversal is complete the function will return ``NULL``.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300174
175Graph traversal can be interrupted at any moment. No cleanup function call
176is required and the graph structure can be freed normally.
177
178Helper functions can be used to find a link between two given pads, or a pad
179connected to another pad through an enabled link
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -0300180:c:func:`media_entity_find_link()` and
181:c:func:`media_entity_remote_pad()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300182
183Use count and power handling
184^^^^^^^^^^^^^^^^^^^^^^^^^^^^
185
186Due to the wide differences between drivers regarding power management
187needs, the media controller does not implement power management. However,
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -0300188the struct :c:type:`media_entity` includes a ``use_count``
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300189field that media drivers
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300190can use to track the number of users of every entity for power management
191needs.
192
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300193The :c:type:`media_entity<media_entity>`.\ ``use_count`` field is owned by
194media drivers and must not be
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300195touched by entity drivers. Access to the field must be protected by the
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300196:c:type:`media_device`.\ ``graph_mutex`` lock.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300197
198Links setup
199^^^^^^^^^^^
200
201Link properties can be modified at runtime by calling
Mauro Carvalho Chehab7b998ba2016-07-23 07:21:06 -0300202:c:func:`media_entity_setup_link()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300203
204Pipelines and media streams
205^^^^^^^^^^^^^^^^^^^^^^^^^^^
206
207When starting streaming, drivers must notify all entities in the pipeline to
208prevent link states from being modified during streaming by calling
Sakari Ailus20b85222016-11-21 14:48:30 -0200209:c:func:`media_pipeline_start()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300210
211The function will mark all entities connected to the given entity through
212enabled links, either directly or indirectly, as streaming.
213
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -0300214The struct :c:type:`media_pipeline` instance pointed to by
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300215the pipe argument will be stored in every entity in the pipeline.
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -0300216Drivers should embed the struct :c:type:`media_pipeline`
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300217in higher-level pipeline structures and can then access the
Mauro Carvalho Chehabfc78c7c2016-09-08 05:43:01 -0300218pipeline through the struct :c:type:`media_entity`
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300219pipe field.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300220
Sakari Ailus20b85222016-11-21 14:48:30 -0200221Calls to :c:func:`media_pipeline_start()` can be nested.
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300222The pipeline pointer must be identical for all nested calls to the function.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300223
Sakari Ailus20b85222016-11-21 14:48:30 -0200224:c:func:`media_pipeline_start()` may return an error. In that case,
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300225it will clean up any of the changes it did by itself.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300226
227When stopping the stream, drivers must notify the entities with
Sakari Ailus20b85222016-11-21 14:48:30 -0200228:c:func:`media_pipeline_stop()`.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300229
Sakari Ailus20b85222016-11-21 14:48:30 -0200230If multiple calls to :c:func:`media_pipeline_start()` have been
231made the same number of :c:func:`media_pipeline_stop()` calls
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300232are required to stop streaming.
233The :c:type:`media_entity`.\ ``pipe`` field is reset to ``NULL`` on the last
234nested stop call.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300235
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300236Link configuration will fail with ``-EBUSY`` by default if either end of the
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300237link is a streaming entity. Links that can be modified while streaming must
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300238be marked with the ``MEDIA_LNK_FL_DYNAMIC`` flag.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300239
240If other operations need to be disallowed on streaming entities (such as
241changing entities configuration parameters) drivers can explicitly check the
242media_entity stream_count field to find out if an entity is streaming. This
243operation must be done with the media_device graph_mutex held.
244
245Link validation
246^^^^^^^^^^^^^^^
247
Sakari Ailus20b85222016-11-21 14:48:30 -0200248Link validation is performed by :c:func:`media_pipeline_start()`
Mauro Carvalho Chehab74604b72016-07-17 09:18:03 -0300249for any entity which has sink pads in the pipeline. The
250:c:type:`media_entity`.\ ``link_validate()`` callback is used for that
251purpose. In ``link_validate()`` callback, entity driver should check
252that the properties of the source pad of the connected entity and its own
253sink pad match. It is up to the type of the entity (and in the end, the
254properties of the hardware) what matching actually means.
Mauro Carvalho Chehab684ffa22016-07-17 08:22:23 -0300255
256Subsystems should facilitate link validation by providing subsystem specific
257helper functions to provide easy access for commonly needed information, and
258in the end provide a way to use driver-specific callbacks.
259
260.. kernel-doc:: include/media/media-device.h
261
262.. kernel-doc:: include/media/media-devnode.h
263
264.. kernel-doc:: include/media/media-entity.h