[libcamera-devel] [PATCH] cam: drm: Skip DRM devices not capable of supporting the atomic API
Jacopo Mondi
jacopo at jmondi.org
Wed Sep 28 08:10:02 CEST 2022
Hi Laurent
On Wed, Sep 28, 2022 at 02:26:28AM +0300, Laurent Pinchart via libcamera-devel wrote:
> The DRM helper picks the first DRM card that it can open. On platforms
> that have a standalone GPU, this risks selecting a device corresponding
> to the GPU instead of the display controller. Fix this by skipping
> devices that don't support the KMS atomic API. Some legacy display
> controllers would be skipped as well, but libcamera doesn't run on those
> systems anyway, and the DRM helper doesn't support the legacy KMS
> modeset API in any case.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/cam/drm.cpp | 31 +++++++++++++++++++++++--------
> 1 file changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp
> index b0602c942853..b2a6b0bba9e8 100644
> --- a/src/cam/drm.cpp
> +++ b/src/cam/drm.cpp
> @@ -430,7 +430,8 @@ int Device::init()
> int Device::openCard()
> {
> const std::string dirName = "/dev/dri/";
> - int ret = -ENOENT;
> + bool found = false;
> + int ret;
>
> /*
> * Open the first DRM/KMS device beginning with /dev/dri/card. The
> @@ -449,24 +450,38 @@ int Device::openCard()
> }
>
> for (struct dirent *res; (res = readdir(folder));) {
> + uint64_t cap;
> +
> if (strncmp(res->d_name, "card", 4))
> continue;
>
> const std::string devName = dirName + res->d_name;
> fd_ = open(devName.c_str(), O_RDWR | O_CLOEXEC);
> - if (fd_ >= 0) {
> - ret = 0;
> - break;
> + if (fd_ < 0) {
> + ret = -errno;
As we don't propagate errors up, can't you use errno directly ?
> + std::cerr << "Failed to open DRM/KMS device " << devName << ": "
> + << strerror(-ret) << std::endl;
> + continue;
> }
>
> - ret = -errno;
> - std::cerr << "Failed to open DRM/KMS device " << devName << ": "
> - << strerror(-ret) << std::endl;
> + /*
> + * Skip devices that don't support the atomic API, to avoid
> + * selecting a DRM device corresponding to a GPU.
> + */
> + ret = drmGetCap(fd_, DRM_CLIENT_CAP_ATOMIC, &cap);
This is the only reference I found of drmGetCap:
https://patchwork.kernel.org/project/dri-devel/patch/1298251639-21282-1-git-send-email-skeggsb@gmail.com/
Can it return a negative value ?
> + if (ret < 0) {
> + drmClose(fd_);
> + fd_ = -1;
> + continue;
> + }
> +
> + found = true;
> + break;
> }
>
> closedir(folder);
>
> - return ret;
> + return found ? 0 : -ENOENT;
> }
>
> int Device::getResources()
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list