• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Media Controller devices
2------------------------
3
4Media Controller
5~~~~~~~~~~~~~~~~
6
7The media controller userspace API is documented in
8:ref:`the Media Controller uAPI book <media_controller>`. This document focus
9on 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
37A media device is represented by a struct :c:type:`media_device`
38instance, 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.
42
43Drivers register media device instances by calling
44:c:func:`__media_device_register()` via the macro ``media_device_register()``
45and unregistered by calling :c:func:`media_device_unregister()`.
46
47Entities
48^^^^^^^^
49
50Entities are represented by a struct :c:type:`media_entity`
51instance, defined in ``include/media/media-entity.h``. The structure is usually
52embedded into a higher-level structure, such as
53:c:type:`v4l2_subdev` or :c:type:`video_device`
54instances, although drivers can allocate entities directly.
55
56Drivers initialize entity pads by calling
57:c:func:`media_entity_pads_init()`.
58
59Drivers register entities with a media device by calling
60:c:func:`media_device_register_entity()`
61and unregistred by calling
62:c:func:`media_device_unregister_entity()`.
63
64Interfaces
65^^^^^^^^^^
66
67Interfaces are represented by a
68struct :c:type:`media_interface` instance, defined in
69``include/media/media-entity.h``. Currently, only one type of interface is
70defined: a device node. Such interfaces are represented by a
71struct :c:type:`media_intf_devnode`.
72
73Drivers initialize and create device node interfaces by calling
74:c:func:`media_devnode_create()`
75and remove them by calling:
76:c:func:`media_devnode_remove()`.
77
78Pads
79^^^^
80Pads are represented by a struct :c:type:`media_pad` instance,
81defined 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.
84
85Pads are identified by their entity and their 0-based index in the pads
86array.
87
88Both information are stored in the struct :c:type:`media_pad`,
89making the struct :c:type:`media_pad` pointer the canonical way
90to store and pass link references.
91
92Pads have flags that describe the pad capabilities and state.
93
94``MEDIA_PAD_FL_SINK`` indicates that the pad supports sinking data.
95``MEDIA_PAD_FL_SOURCE`` indicates that the pad supports sourcing data.
96
97.. note::
98
99  One and only one of ``MEDIA_PAD_FL_SINK`` or ``MEDIA_PAD_FL_SOURCE`` must
100  be set for each pad.
101
102Links
103^^^^^
104
105Links are represented by a struct :c:type:`media_link` instance,
106defined in ``include/media/media-entity.h``. There are two types of links:
107
108**1. pad to pad links**:
109
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:
116:c:func:`media_create_pad_link()` and remove with
117:c:func:`media_entity_remove_links()`.
118
119**2. interface to entity links**:
120
121Associate one interface to a Link.
122
123Drivers create interface to entity links by calling:
124:c:func:`media_create_intf_link()` and remove with
125:c:func:`media_remove_intf_links()`.
126
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
132valid values are described at :c:func:`media_create_pad_link()` and
133:c:func:`media_create_intf_link()`.
134
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
142``include/media/media-device.h``.
143
144..  code-block:: c
145
146    struct media_entity *entity;
147
148    media_device_for_each_entity(entity, mdev) {
149    // entity will point to each entity in turn
150    ...
151    }
152
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
157.. 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.
163
164Drivers initiate a graph traversal by calling
165:c:func:`media_graph_walk_start()`
166
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
171:c:func:`media_graph_walk_next()`
172
173When the graph traversal is complete the function will return ``NULL``.
174
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
180:c:func:`media_entity_find_link()` and
181:c:func:`media_entity_remote_pad()`.
182
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,
188the struct :c:type:`media_entity` includes a ``use_count``
189field that media drivers
190can use to track the number of users of every entity for power management
191needs.
192
193The :c:type:`media_entity<media_entity>`.\ ``use_count`` field is owned by
194media drivers and must not be
195touched by entity drivers. Access to the field must be protected by the
196:c:type:`media_device`.\ ``graph_mutex`` lock.
197
198Links setup
199^^^^^^^^^^^
200
201Link properties can be modified at runtime by calling
202:c:func:`media_entity_setup_link()`.
203
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
209:c:func:`media_pipeline_start()`.
210
211The function will mark all entities connected to the given entity through
212enabled links, either directly or indirectly, as streaming.
213
214The struct :c:type:`media_pipeline` instance pointed to by
215the pipe argument will be stored in every entity in the pipeline.
216Drivers should embed the struct :c:type:`media_pipeline`
217in higher-level pipeline structures and can then access the
218pipeline through the struct :c:type:`media_entity`
219pipe field.
220
221Calls to :c:func:`media_pipeline_start()` can be nested.
222The pipeline pointer must be identical for all nested calls to the function.
223
224:c:func:`media_pipeline_start()` may return an error. In that case,
225it will clean up any of the changes it did by itself.
226
227When stopping the stream, drivers must notify the entities with
228:c:func:`media_pipeline_stop()`.
229
230If multiple calls to :c:func:`media_pipeline_start()` have been
231made the same number of :c:func:`media_pipeline_stop()` calls
232are required to stop streaming.
233The :c:type:`media_entity`.\ ``pipe`` field is reset to ``NULL`` on the last
234nested stop call.
235
236Link configuration will fail with ``-EBUSY`` by default if either end of the
237link is a streaming entity. Links that can be modified while streaming must
238be marked with the ``MEDIA_LNK_FL_DYNAMIC`` flag.
239
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
248Link validation is performed by :c:func:`media_pipeline_start()`
249for 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.
255
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
265