On 9/20/19 5:07 PM, Dafna Hirschfeld wrote: > Hi, > > On Fri, 2019-09-20 at 15:17 +0200, Hans Verkuil wrote: >> Hi Dafna, >> >> On 9/19/19 10:32 PM, Dafna Hirschfeld wrote: >>> This patchset introduces the usage of configfs in order to create vimc devices >>> with a configured topology. A patch introducing configfs usage was already sent by Helen Koike: >>> https://patchwork.linuxtv.org/patch/53397/ . The current patch is based on her patch but >>> suggests a new API for using configfs. >>> It uses symlinks to represent a link between two entities, an approach already used in the kernel >>> by usb gadgets composed with configfs to associate usb gadget's functions to its configurations. >>> For example, a topology of sensor->capture will be created with the following commands: >>> >>> CONFIGFS_ROOT=/sys/kernel/config >>> >>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/ >>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/vimc-sensor:sen >>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/vimc-capture:cap >>> tree ${CONFIGFS_ROOT} >>> /configfs/ >>> `-- vimc >>> `-- mdev >>> |-- hotplug >>> |-- vimc-capture:cap >>> | `-- pad:sink:0 >>> `-- vimc-sensor:sen >>> `-- pad:source:0 >>> >>> mkdir ${CONFIGFS_ROOT}/vimc/mdev/vimc-sensor:sen/pad:source:0/to-cap >>> ln -s ${CONFIGFS_ROOT}/vimc/mdev/vimc-capture:cap/pad:sink:0 ${CONFIGFS_ROOT}/vimc/mdev/vimc-sensor:sen/pad:source:0/to-cap >>> tree ${CONFIGFS_ROOT} >>> /configfs/ >>> `-- vimc >>> `-- mdev >>> |-- hotplug >>> |-- vimc-capture:cap >>> | `-- pad:sink:0 >>> `-- vimc-sensor:sen >>> `-- pad:source:0 >>> `-- to-cap >>> |-- enabled >>> |-- immutable >>> `-- pad:sink:0 -> ../../../../../vimc/mdev/vimc-capture:cap/pad:sink:0 >>> >>> There are several reasons to prefer the symlink approach in order to represent links between entities. >>> The previous approach in which links are represented with directories of the form 'entity1:pad>-><entity2:pad' >>> requires userspace to parse the dirctories names in order to understand the topology, while in the symlink >>> approach userspace needs only to traverse the configfs tree. >>> Also, the usage of symlinks prevents userspace from creating links between entities that don't exist and also >>> an entity can't be removed if there is a symlink pointing to it or from it, while in the previous approach the >> >> Why can't you remove an entity if there is a symlink pointing to it? >> >> In the example above I can remove mdev/vimc-capture:cap just fine. Afterwards >> the pad:sink:0 symlink will point to a non-existing file, but that's valid >> symlink behavior. > > Hmm, this should not be allowed, maybe you did something wrong? > I get: > # rmdir /sys/kernel/config/vimc/mdev/vimc-capture:cap > rmdir: failed to remove '/sys/kernel/config/vimc/mdev/vimc-capture:cap': Device or resource busy > > >> Or is vimc checking internally and prohibits the user from making invalid changes? > > No, this is not internal to vimc, it is part of configfs, it is also written in the docs: > > "A config_item cannot be removed while it links to any other item, nor > can it be removed while an item links to it. Dangling symlinks are not > allowed in configfs." Ah, I was not aware of that. Just ignore my comments about this, then :-) Nice, I learned something today. Regards, Hans > > Regards, > Dafna > >> In any case, this cover letter is a bit confusing and needs to address this in more >> detail. >> >> Regards, >> >> Hans >> >>> links were created by creating unrelated directories and care had to be taken to ensure consistency. This way >>> the topology configured from userspace is restricted to always be valid and represent the current topology of >>> the device. This results in less validation needed in kernel code when plugging the device and less possibility >>> for mistakes in the userspace side. Last, but not least, using symlinks is the natural way of associating things >>> in configfs. >>> >>> This patch is meant to demonstrate the suggested configfs api and get comments and acceptance/disagreement from >>> the community. It passes few tests that configure basic topology and streams the capture entities. >>> Here is the tests script: https://gitlab.collabora.com/dafna/scripts/blob/master/configfs/sym-unit-tests-simple-topo.sh >>> Further versions will go through more extensive debugging. >>> >>> The patchset is rebased on top of v5 of the patchset 'Collapse vimc into single monolithic driver' sent by Shuah Khan >>> https://lkml.org/lkml/2019/9/17/656 >>> >>> Patch 1, was sent by me before as a single patch and is needed for the configfs implementation. >>> >>> Patch 2, documents how to use the new configfs api in order to create and set devices topologies. >>> >>> Patch 3, only adds the new configfs api code but does not use it yet, so it still creates only the hardcoded device. >>> >>> Patch 4, removes the hardcoded device topology and creates devices with topologies configured with the configfs. >>> >>> Patch 5, implements indexing for the bus_info field since now there can be more than one vimc device. >>> >>> Dafna Hirschfeld (5): >>> media: vimc: upon streaming, check that the pipeline starts with a >>> source entity >>> docs: media: vimc: Documenting vimc topology configuration using >>> configfs >>> media: vimc: Add the implementation for the configfs api >>> media: vimc: use configfs instead of having hardcoded configuration >>> media: vimc: Add device index to the bus_info >>> >>> Documentation/media/v4l-drivers/vimc.dot | 28 +- >>> Documentation/media/v4l-drivers/vimc.rst | 240 ++++++- >>> drivers/media/platform/vimc/Kconfig | 9 +- >>> drivers/media/platform/vimc/Makefile | 2 +- >>> drivers/media/platform/vimc/vimc-capture.c | 50 +- >>> drivers/media/platform/vimc/vimc-common.h | 86 ++- >>> drivers/media/platform/vimc/vimc-configfs.c | 656 ++++++++++++++++++++ >>> drivers/media/platform/vimc/vimc-configfs.h | 41 ++ >>> drivers/media/platform/vimc/vimc-core.c | 350 +++++------ >>> drivers/media/platform/vimc/vimc-debayer.c | 35 +- >>> drivers/media/platform/vimc/vimc-scaler.c | 35 +- >>> drivers/media/platform/vimc/vimc-sensor.c | 33 +- >>> drivers/media/platform/vimc/vimc-streamer.c | 39 +- >>> 13 files changed, 1289 insertions(+), 315 deletions(-) >>> create mode 100644 drivers/media/platform/vimc/vimc-configfs.c >>> create mode 100644 drivers/media/platform/vimc/vimc-configfs.h >>> >