[PATCH v3] apps: cam: Skip non-display GPUs
Milan Zamazal
mzamazal at redhat.com
Fri May 30 11:10:17 CEST 2025
Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:
> On Fri, May 30, 2025 at 09:05:41AM +0200, Mattijs Korpershoek wrote:
>> On jeu., mai 29, 2025 at 15:08, Kieran Bingham wrote:
>> > Quoting Milan Zamazal (2025-05-29 09:23:26)
>
>> >> Device::openCard() in the cam DRM helpers looks for a /dev/dri/card*
>> >> device that can be opened and that doesn't fail when asked about
>> >> DRM_CAP_DUMB_BUFFER capability (regardless whether the capability is
>> >> supported by the device).
>> >>
>> >> There can be matching devices that are not display devices. This can
>> >> lead to selection of such a device and inability to use KMS output with
>> >> `cam' application. The ultimate goal is to display something on the
>> >> device and later the KMS sink will fail if there is no connector
>> >> attached to the device (although it can actually fail earlier, when
>> >> trying to set DRM_CLIENT_CAP_ATOMIC capability if this is not
>> >> supported).
>> >>
>> >> Let's avoid selecting devices without connectors, CRTCs or encoders.
>> >> The added check makes the original check for DRM_CAP_DUMB_BUFFER API
>> >> most likely unnecessary, let's remove it.
>> >>
>> >> Changes in v3:
>> >> - Added checks for the presence of CRTCs and encoders.
>> >> - Removed the check for DRM_CAP_DUMB_BUFFER.
>> >>
>> >> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
>> >> ---
>> >> src/apps/cam/drm.cpp | 22 ++++++++++------------
>> >> 1 file changed, 10 insertions(+), 12 deletions(-)
>> >>
>> >> diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp
>> >> index 47bbb6b05..c40c31410 100644
>> >> --- a/src/apps/cam/drm.cpp
>> >> +++ b/src/apps/cam/drm.cpp
>> >> @@ -450,8 +450,6 @@ int Device::openCard()
>> >> }
>> >>
>> >> for (struct dirent *res; (res = readdir(folder));) {
>> >> - uint64_t cap;
>> >> -
>> >> if (strncmp(res->d_name, "card", 4))
>> >> continue;
>> >>
>> >> @@ -464,16 +462,16 @@ int Device::openCard()
>> >> continue;
>> >> }
>> >>
>> >> - /*
>> >> - * Skip devices that don't support the modeset API, to avoid
>> >> - * selecting a DRM device corresponding to a GPU. There is no
>> >> - * modeset capability, but the kernel returns an error for most
>> >> - * caps if mode setting isn't support by the driver. The
>> >> - * DRM_CAP_DUMB_BUFFER capability is one of those, other would
>> >> - * do as well. The capability value itself isn't relevant.
>> >> - */
>> >> - ret = drmGetCap(fd_, DRM_CAP_DUMB_BUFFER, &cap);
>> >> - if (ret < 0) {
>> >> + /* Skip devices without connectors. */
>> >
>> > This all sounds reasonable to me, though this comment now skips devices
>> > without connectors/crts/encoders.
>> >
>> > Perhaps we should update it while applying?
>> >
>> > /* Skip non-display devices */
>>
>> I agree with the fixup.
>
> I would expand it a bit
>
> /*
> * Skip non-display devices. While this could in theory be done
> * by checking for support of the mode setting API, some
> * out-of-tree render-only GPU drivers (namely powervr)
> * incorrectly set the DRIVER_MODESET driver feature. Check for
> * the presence of at least one CRTC, encoder and connector
> * instead.
> */
Yes, thank you, done in v4 (the only change there).
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
>> If it's applied, then:
>>
>> Reviewed-by: Mattijs Korpershoek <mkorpershoek at kernel.org>
>>
>> > Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>> >
>> >> + std::unique_ptr<drmModeRes, decltype(&drmModeFreeResources)> resources{
>> >> + drmModeGetResources(fd_),
>> >> + &drmModeFreeResources
>> >> + };
>> >> + if (!resources ||
>> >> + resources->count_connectors <= 0 ||
>> >> + resources->count_crtcs <= 0 ||
>> >> + resources->count_encoders <= 0) {
>> >> + resources.reset();
>> >> drmClose(fd_);
>> >> fd_ = -1;
>> >> continue;
More information about the libcamera-devel
mailing list