1 .. SPDX-License-Identifier: GPL-2.0
3 Media Controller devices
4 ------------------------
9 The media controller userspace API is documented in
10 :ref:`the Media Controller uAPI book <media_controller>`. This document focus
11 on the kernel-side implementation of the media framework.
13 Abstract media device model
14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
16 Discovering a device internal topology, and configuring it at runtime, is one
17 of the goals of the media framework. To achieve this, hardware devices are
18 modelled as an oriented graph of building blocks called entities connected
21 An entity is a basic media hardware building block. It can correspond to
22 a large variety of logical blocks such as physical hardware devices
23 (CMOS sensor for instance), logical hardware devices (a building block
24 in a System-on-Chip image processing pipeline), DMA channels or physical
27 A pad is a connection endpoint through which an entity can interact with
28 other entities. Data (not restricted to video) produced by an entity
29 flows from the entity's output to one or more entity inputs. Pads should
30 not be confused with physical pins at chip boundaries.
32 A link is a point-to-point oriented connection between two pads, either
33 on the same entity or on different entities. Data flows from a source
39 A media device is represented by a struct :c:type:`media_device`
40 instance, defined in ``include/media/media-device.h``.
41 Allocation of the structure is handled by the media device driver, usually by
42 embedding the :c:type:`media_device` instance in a larger driver-specific
45 Drivers register media device instances by calling
46 :c:func:`__media_device_register()` via the macro ``media_device_register()``
47 and unregistered by calling :c:func:`media_device_unregister()`.
52 Entities are represented by a struct :c:type:`media_entity`
53 instance, defined in ``include/media/media-entity.h``. The structure is usually
54 embedded into a higher-level structure, such as
55 :c:type:`v4l2_subdev` or :c:type:`video_device`
56 instances, although drivers can allocate entities directly.
58 Drivers initialize entity pads by calling
59 :c:func:`media_entity_pads_init()`.
61 Drivers register entities with a media device by calling
62 :c:func:`media_device_register_entity()`
63 and unregistered by calling
64 :c:func:`media_device_unregister_entity()`.
69 Interfaces are represented by a
70 struct :c:type:`media_interface` instance, defined in
71 ``include/media/media-entity.h``. Currently, only one type of interface is
72 defined: a device node. Such interfaces are represented by a
73 struct :c:type:`media_intf_devnode`.
75 Drivers initialize and create device node interfaces by calling
76 :c:func:`media_devnode_create()`
77 and remove them by calling:
78 :c:func:`media_devnode_remove()`.
82 Pads are represented by a struct :c:type:`media_pad` instance,
83 defined in ``include/media/media-entity.h``. Each entity stores its pads in
84 a pads array managed by the entity driver. Drivers usually embed the array in
85 a driver-specific structure.
87 Pads are identified by their entity and their 0-based index in the pads
90 Both information are stored in the struct :c:type:`media_pad`,
91 making the struct :c:type:`media_pad` pointer the canonical way
92 to store and pass link references.
94 Pads have flags that describe the pad capabilities and state.
96 ``MEDIA_PAD_FL_SINK`` indicates that the pad supports sinking data.
97 ``MEDIA_PAD_FL_SOURCE`` indicates that the pad supports sourcing data.
101 One and only one of ``MEDIA_PAD_FL_SINK`` or ``MEDIA_PAD_FL_SOURCE`` must
107 Links are represented by a struct :c:type:`media_link` instance,
108 defined in ``include/media/media-entity.h``. There are two types of links:
110 **1. pad to pad links**:
112 Associate two entities via their PADs. Each entity has a list that points
113 to all links originating at or targeting any of its pads.
114 A given link is thus stored twice, once in the source entity and once in
117 Drivers create pad to pad links by calling:
118 :c:func:`media_create_pad_link()` and remove with
119 :c:func:`media_entity_remove_links()`.
121 **2. interface to entity links**:
123 Associate one interface to a Link.
125 Drivers create interface to entity links by calling:
126 :c:func:`media_create_intf_link()` and remove with
127 :c:func:`media_remove_intf_links()`.
131 Links can only be created after having both ends already created.
133 Links have flags that describe the link capabilities and state. The
134 valid values are described at :c:func:`media_create_pad_link()` and
135 :c:func:`media_create_intf_link()`.
140 The media framework provides APIs to iterate over entities in a graph.
142 To iterate over all entities belonging to a media device, drivers can use
143 the media_device_for_each_entity macro, defined in
144 ``include/media/media-device.h``.
148 struct media_entity *entity;
150 media_device_for_each_entity(entity, mdev) {
151 // entity will point to each entity in turn
155 Drivers might also need to iterate over all entities in a graph that can be
156 reached only through enabled links starting at a given entity. The media
157 framework provides a depth-first graph traversal API for that purpose.
161 Graphs with cycles (whether directed or undirected) are **NOT**
162 supported by the graph traversal API. To prevent infinite loops, the graph
163 traversal code limits the maximum depth to ``MEDIA_ENTITY_ENUM_MAX_DEPTH``,
164 currently defined as 16.
166 Drivers initiate a graph traversal by calling
167 :c:func:`media_graph_walk_start()`
169 The graph structure, provided by the caller, is initialized to start graph
170 traversal at the given entity.
172 Drivers can then retrieve the next entity by calling
173 :c:func:`media_graph_walk_next()`
175 When the graph traversal is complete the function will return ``NULL``.
177 Graph traversal can be interrupted at any moment. No cleanup function call
178 is required and the graph structure can be freed normally.
180 Helper functions can be used to find a link between two given pads, or a pad
181 connected to another pad through an enabled link
182 :c:func:`media_entity_find_link()` and
183 :c:func:`media_entity_remote_pad()`.
185 Use count and power handling
186 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
188 Due to the wide differences between drivers regarding power management
189 needs, the media controller does not implement power management. However,
190 the struct :c:type:`media_entity` includes a ``use_count``
191 field that media drivers
192 can use to track the number of users of every entity for power management
195 The :c:type:`media_entity<media_entity>`.\ ``use_count`` field is owned by
196 media drivers and must not be
197 touched by entity drivers. Access to the field must be protected by the
198 :c:type:`media_device`.\ ``graph_mutex`` lock.
203 Link properties can be modified at runtime by calling
204 :c:func:`media_entity_setup_link()`.
206 Pipelines and media streams
207 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
209 When starting streaming, drivers must notify all entities in the pipeline to
210 prevent link states from being modified during streaming by calling
211 :c:func:`media_pipeline_start()`.
213 The function will mark all entities connected to the given entity through
214 enabled links, either directly or indirectly, as streaming.
216 The struct :c:type:`media_pipeline` instance pointed to by
217 the pipe argument will be stored in every entity in the pipeline.
218 Drivers should embed the struct :c:type:`media_pipeline`
219 in higher-level pipeline structures and can then access the
220 pipeline through the struct :c:type:`media_entity`
223 Calls to :c:func:`media_pipeline_start()` can be nested.
224 The pipeline pointer must be identical for all nested calls to the function.
226 :c:func:`media_pipeline_start()` may return an error. In that case,
227 it will clean up any of the changes it did by itself.
229 When stopping the stream, drivers must notify the entities with
230 :c:func:`media_pipeline_stop()`.
232 If multiple calls to :c:func:`media_pipeline_start()` have been
233 made the same number of :c:func:`media_pipeline_stop()` calls
234 are required to stop streaming.
235 The :c:type:`media_entity`.\ ``pipe`` field is reset to ``NULL`` on the last
238 Link configuration will fail with ``-EBUSY`` by default if either end of the
239 link is a streaming entity. Links that can be modified while streaming must
240 be marked with the ``MEDIA_LNK_FL_DYNAMIC`` flag.
242 If other operations need to be disallowed on streaming entities (such as
243 changing entities configuration parameters) drivers can explicitly check the
244 media_entity stream_count field to find out if an entity is streaming. This
245 operation must be done with the media_device graph_mutex held.
250 Link validation is performed by :c:func:`media_pipeline_start()`
251 for any entity which has sink pads in the pipeline. The
252 :c:type:`media_entity`.\ ``link_validate()`` callback is used for that
253 purpose. In ``link_validate()`` callback, entity driver should check
254 that the properties of the source pad of the connected entity and its own
255 sink pad match. It is up to the type of the entity (and in the end, the
256 properties of the hardware) what matching actually means.
258 Subsystems should facilitate link validation by providing subsystem specific
259 helper functions to provide easy access for commonly needed information, and
260 in the end provide a way to use driver-specific callbacks.
262 Media Controller Device Allocator API
263 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
265 When the media device belongs to more than one driver, the shared media
266 device is allocated with the shared struct device as the key for look ups.
268 The shared media device should stay in registered state until the last
269 driver unregisters it. In addition, the media device should be released when
270 all the references are released. Each driver gets a reference to the media
271 device during probe, when it allocates the media device. If media device is
272 already allocated, the allocate API bumps up the refcount and returns the
273 existing media device. The driver puts the reference back in its disconnect
274 routine when it calls :c:func:`media_device_delete()`.
276 The media device is unregistered and cleaned up from the kref put handler to
277 ensure that the media device stays in registered state until the last driver
278 unregisters the media device.
282 Drivers should use the appropriate media-core routines to manage the shared
283 media device life-time handling the two states:
284 1. allocate -> register -> delete
285 2. get reference to already registered device -> delete
287 call :c:func:`media_device_delete()` routine to make sure the shared media
288 device delete is handled correctly.
291 Call :c:func:`media_device_usb_allocate()` to allocate or get a reference
292 Call :c:func:`media_device_register()`, if media devnode isn't registered
294 **driver disconnect:**
295 Call :c:func:`media_device_delete()` to free the media_device. Freeing is
296 handled by the kref put handler.
301 .. kernel-doc:: include/media/media-device.h
303 .. kernel-doc:: include/media/media-devnode.h
305 .. kernel-doc:: include/media/media-entity.h
307 .. kernel-doc:: include/media/media-request.h
309 .. kernel-doc:: include/media/media-dev-allocator.h