On 02/05/2018 12:59 PM, Sakari Ailus wrote:
> Hi Hans,
>
> On Mon, Feb 05, 2018 at 11:26:47AM +0100, Hans Verkuil wrote:
>> The function media_device_enum_entities() has this workaround:
>>
>> /*
>> * Workaround for a bug at media-ctl <= v1.10 that makes it to
>> * do the wrong thing if the entity function doesn't belong to
>> * either MEDIA_ENT_F_OLD_BASE or MEDIA_ENT_F_OLD_SUBDEV_BASE
>> * Ranges.
>> *
>> * Non-subdevices are expected to be at the MEDIA_ENT_F_OLD_BASE,
>> * or, otherwise, will be silently ignored by media-ctl when
>> * printing the graphviz diagram. So, map them into the devnode
>> * old range.
>> */
>> if (ent->function < MEDIA_ENT_F_OLD_BASE ||
>> ent->function > MEDIA_ENT_F_TUNER) {
>> if (is_media_entity_v4l2_subdev(ent))
>> entd->type = MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN;
>> else if (ent->function != MEDIA_ENT_F_IO_V4L)
>> entd->type = MEDIA_ENT_T_DEVNODE_UNKNOWN;
>> }
>>
>> But this means that the entity type returned by ENUM_ENTITIES just overwrites
>> perfectly fine types by bogus values and thus the returned value differs
>> from that returned by G_TOPOLOGY.
>>
>> Can we please, please remove this workaround? I have no idea why a workaround
>> for media-ctl of all things ever made it in the kernel.
>
> The entity types were replaced by entity functions back in 2015 with the
> big Media controller reshuffle. While I agree functions are better for
> describing entities than types (and those types had Linux specific
> interfaces in them), the new function-based API still may support a single
> value, i.e. a single function per device.
>
> This also created two different name spaces for describing entities: the
> old types used by the MC API and the new functions used by MC v2 API.
>
> This doesn't go well with the fact that, as you noticed, the pad
> information is not available through MC v2 API. The pad information is
> required by the user space so software continues to use the original MC
> API.
>
> I don't think there's a way to avoid maintaining two name spaces (types and
> functions) without breaking at least one of the APIs.
The comment specifically claims that this workaround is for media-ctl and
it suggests that it is fixed after v1.10. Is that comment bogus? I can't
really tell which commit fixed media-ctl. Does anyone know?
As far as I can tell the function defines have been chosen in such a way that
they will equally well work with the old name space. There should be no
problem there whatsoever and media-ctl should switch to use the new defines.
We now have a broken ENUM_ENTITIES ioctl (it rudely overwrites VBI/DVB/etc
types)
and a broken G_TOPOLOGY ioctl (no pad index).
This sucks. Let's fix both so that they at least report consistent information.
>
>>
>> I'm adding media support to the vivid driver and because of this media-ctl -p
>> gives me this:
>>
>> Device topology
>> - entity 1: vivid-000-vid-cap (1 pad, 0 link)
>> type Node subtype V4L flags 0
>> device node name /dev/video0
>> pad0: Source
>>
>> - entity 5: vivid-000-vid-out (1 pad, 0 link)
>> type Node subtype V4L flags 0
>> device node name /dev/video1
>> pad0: Sink
>>
>> - entity 9: vivid-000-vbi-cap (1 pad, 0 link)
>> type Unknown subtype Unknown flags 0
>> pad0: Source
>>
>> - entity 13: vivid-000-vbi-out (1 pad, 0 link)
>> type Unknown subtype Unknown flags 0
>> pad0: Sink
>>
>> - entity 17: vivid-000-sdr-cap (1 pad, 0 link)
>> type Unknown subtype Unknown flags 0
>> pad0: Source
>
> It may be that there's no corresponding type for certain functions.
'type' can be interpreted as 'function'. All possible legacy type/subtype
combinations map to a unique function. It's how the spec defines this as well.
But it is subverted by this awful workaround.
Regards,
Hans