From patchwork Thu May 29 08:23:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 23457 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id D7568C3237 for ; Thu, 29 May 2025 08:23:50 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A8E0468DA6; Thu, 29 May 2025 10:23:49 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="LC9AnQ4x"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7355468D96 for ; Thu, 29 May 2025 10:23:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1748507026; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=lybEu8xduo775TlcnJfN251xdp0d9lGNC8hS2lYLfp8=; b=LC9AnQ4xNTxS+qtxKphJfm3tmfisFJ22G3lSgW8D+4xZkdb+QWNWtJk6ifwVwZjKVhQ0hq NNsAt5BELLRsgh7kdCAo6SCGobz0gLzIGMEdn5cnnxw4J28mkctadeHvP0+xxJEgAmkk/t Sn93Bby3OJoUpdXl4y5YURD98WoM1vU= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-693-ML4PLX8gOG6Eh9m-RivLIw-1; Thu, 29 May 2025 04:23:42 -0400 X-MC-Unique: ML4PLX8gOG6Eh9m-RivLIw-1 X-Mimecast-MFC-AGG-ID: ML4PLX8gOG6Eh9m-RivLIw_1748507021 Received: from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B59FE1800ECC; Thu, 29 May 2025 08:23:41 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.225.203]) by mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id DF59C1955D82; Thu, 29 May 2025 08:23:39 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Mattijs Korpershoek , Laurent Pinchart Subject: [PATCH v3] apps: cam: Skip non-display GPUs Date: Thu, 29 May 2025 10:23:26 +0200 Message-ID: <20250529082326.25156-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.15 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: sr85P_D278cxLbJR0WQnZmzslYhxWq5n-2prv6eyjWc_1748507021 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 Reviewed-by: Kieran Bingham Reviewed-by: Mattijs Korpershoek Reviewed-by: Laurent Pinchart --- 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. */ + std::unique_ptr 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;