Show a patch.

GET /api/patches/23457/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 23457,
    "url": "https://patchwork.libcamera.org/api/patches/23457/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/23457/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20250529082326.25156-1-mzamazal@redhat.com>",
    "date": "2025-05-29T08:23:26",
    "name": "[v3] apps: cam: Skip non-display GPUs",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "d298b93a931522fd7930ccebba8538df8a5e3e31",
    "submitter": {
        "id": 177,
        "url": "https://patchwork.libcamera.org/api/people/177/?format=api",
        "name": "Milan Zamazal",
        "email": "mzamazal@redhat.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/23457/mbox/",
    "series": [
        {
            "id": 5200,
            "url": "https://patchwork.libcamera.org/api/series/5200/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5200",
            "date": "2025-05-29T08:23:26",
            "name": "[v3] apps: cam: Skip non-display GPUs",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/5200/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/23457/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/23457/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D7568C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 29 May 2025 08:23:50 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A8E0468DA6;\n\tThu, 29 May 2025 10:23:49 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7355468D96\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 29 May 2025 10:23:47 +0200 (CEST)",
            "from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-693-ML4PLX8gOG6Eh9m-RivLIw-1;\n\tThu, 29 May 2025 04:23:42 -0400",
            "from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.15])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id B59FE1800ECC; Thu, 29 May 2025 08:23:41 +0000 (UTC)",
            "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.225.203])\n\tby mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id DF59C1955D82; Thu, 29 May 2025 08:23:39 +0000 (UTC)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"LC9AnQ4x\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1748507026;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding;\n\tbh=lybEu8xduo775TlcnJfN251xdp0d9lGNC8hS2lYLfp8=;\n\tb=LC9AnQ4xNTxS+qtxKphJfm3tmfisFJ22G3lSgW8D+4xZkdb+QWNWtJk6ifwVwZjKVhQ0hq\n\tNNsAt5BELLRsgh7kdCAo6SCGobz0gLzIGMEdn5cnnxw4J28mkctadeHvP0+xxJEgAmkk/t\n\tSn93Bby3OJoUpdXl4y5YURD98WoM1vU=",
        "X-MC-Unique": "ML4PLX8gOG6Eh9m-RivLIw-1",
        "X-Mimecast-MFC-AGG-ID": "ML4PLX8gOG6Eh9m-RivLIw_1748507021",
        "From": "Milan Zamazal <mzamazal@redhat.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>,\n\tMattijs Korpershoek <mkorpershoek@kernel.org>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "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-Transfer-Encoding": "8bit",
        "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": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Device::openCard() in the cam DRM helpers looks for a /dev/dri/card*\ndevice that can be opened and that doesn't fail when asked about\nDRM_CAP_DUMB_BUFFER capability (regardless whether the capability is\nsupported by the device).\n\nThere can be matching devices that are not display devices.  This can\nlead to selection of such a device and inability to use KMS output with\n`cam' application.  The ultimate goal is to display something on the\ndevice and later the KMS sink will fail if there is no connector\nattached to the device (although it can actually fail earlier, when\ntrying to set DRM_CLIENT_CAP_ATOMIC capability if this is not\nsupported).\n\nLet's avoid selecting devices without connectors, CRTCs or encoders.\nThe added check makes the original check for DRM_CAP_DUMB_BUFFER API\nmost likely unnecessary, let's remove it.\n\nChanges in v3:\n- Added checks for the presence of CRTCs and encoders.\n- Removed the check for DRM_CAP_DUMB_BUFFER.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n src/apps/cam/drm.cpp | 22 ++++++++++------------\n 1 file changed, 10 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp\nindex 47bbb6b05..c40c31410 100644\n--- a/src/apps/cam/drm.cpp\n+++ b/src/apps/cam/drm.cpp\n@@ -450,8 +450,6 @@ int Device::openCard()\n \t}\n \n \tfor (struct dirent *res; (res = readdir(folder));) {\n-\t\tuint64_t cap;\n-\n \t\tif (strncmp(res->d_name, \"card\", 4))\n \t\t\tcontinue;\n \n@@ -464,16 +462,16 @@ int Device::openCard()\n \t\t\tcontinue;\n \t\t}\n \n-\t\t/*\n-\t\t * Skip devices that don't support the modeset API, to avoid\n-\t\t * selecting a DRM device corresponding to a GPU. There is no\n-\t\t * modeset capability, but the kernel returns an error for most\n-\t\t * caps if mode setting isn't support by the driver. The\n-\t\t * DRM_CAP_DUMB_BUFFER capability is one of those, other would\n-\t\t * do as well. The capability value itself isn't relevant.\n-\t\t */\n-\t\tret = drmGetCap(fd_, DRM_CAP_DUMB_BUFFER, &cap);\n-\t\tif (ret < 0) {\n+\t\t/* Skip devices without connectors. */\n+\t\tstd::unique_ptr<drmModeRes, decltype(&drmModeFreeResources)> resources{\n+\t\t\tdrmModeGetResources(fd_),\n+\t\t\t&drmModeFreeResources\n+\t\t};\n+\t\tif (!resources ||\n+\t\t    resources->count_connectors <= 0 ||\n+\t\t    resources->count_crtcs <= 0 ||\n+\t\t    resources->count_encoders <= 0) {\n+\t\t\tresources.reset();\n \t\t\tdrmClose(fd_);\n \t\t\tfd_ = -1;\n \t\t\tcontinue;\n",
    "prefixes": [
        "v3"
    ]
}