From patchwork Fri May 30 09:08:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 23458 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 60D2BC31E9 for ; Fri, 30 May 2025 09:08:26 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7C91E68DA8; Fri, 30 May 2025 11:08:25 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="PnRDgPi7"; 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 8A6DD614D5 for ; Fri, 30 May 2025 11:08:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1748596102; 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=3s6WTprmrADzWvHdn8PwsMMPwAV7HEPWV8n7QSLCfXs=; b=PnRDgPi7SV3oS6Yoz6Q53gVBl3g5Kl7xyX8nIWT7wP6ICegJ0ruXtOd2ORwn6wokfdVfIp f3vfHXO4c2nFINhT12cC+qtGq03lmqkRkwDFReyq9Ogsil9rdWrcm3MNANvwY6OizCGflQ VzFPhVkdL4u0zPLaf2Qvd+j0RHcCUak= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-257-RT-HNK6fN5edtqNDhjz24g-1; Fri, 30 May 2025 05:08:21 -0400 X-MC-Unique: RT-HNK6fN5edtqNDhjz24g-1 X-Mimecast-MFC-AGG-ID: RT-HNK6fN5edtqNDhjz24g_1748596100 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 373281956086; Fri, 30 May 2025 09:08:20 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.226.53]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 1675819560A7; Fri, 30 May 2025 09:08:17 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Kieran Bingham , Mattijs Korpershoek , Laurent Pinchart Subject: [PATCH v4] apps: cam: Skip non-display GPUs Date: Fri, 30 May 2025 11:08:15 +0200 Message-ID: <20250530090815.18587-1-mzamazal@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: TbVtfuvLNo7qZZrXInak-6tyRdM3pULKPqUJGn1wjYQ_1748596100 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. Signed-off-by: Milan Zamazal Reviewed-by: Kieran Bingham Reviewed-by: Mattijs Korpershoek Reviewed-by: Laurent Pinchart --- src/apps/cam/drm.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp index 47bbb6b05..f4b470976 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; @@ -465,15 +463,22 @@ int Device::openCard() } /* - * 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. + * 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. */ - ret = drmGetCap(fd_, DRM_CAP_DUMB_BUFFER, &cap); - if (ret < 0) { + 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;