Show a patch.

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

{
    "id": 26513,
    "url": "https://patchwork.libcamera.org/api/patches/26513/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26513/",
    "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": "<20260408115645.12487-3-johannes.goede@oss.qualcomm.com>",
    "date": "2026-04-08T11:56:44",
    "name": "[RFC,2/3] camss: Use finer grained locking / disableLinks()",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "43197ebfb6106dbbed3a283933b743239e816a90",
    "submitter": {
        "id": 242,
        "url": "https://patchwork.libcamera.org/api/people/242/?format=api",
        "name": "Hans de Goede",
        "email": "johannes.goede@oss.qualcomm.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26513/mbox/",
    "series": [
        {
            "id": 5878,
            "url": "https://patchwork.libcamera.org/api/series/5878/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5878",
            "date": "2026-04-08T11:56:42",
            "name": "camss: Add CAMSS pipeline handler",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5878/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26513/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26513/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 9AB90C32BB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  8 Apr 2026 11:56:58 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5238562E4D;\n\tWed,  8 Apr 2026 13:56:58 +0200 (CEST)",
            "from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n\t[205.220.180.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 58BC862E11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Apr 2026 13:56:56 +0200 (CEST)",
            "from pps.filterd (m0279869.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t6389N2e92412291 for <libcamera-devel@lists.libcamera.org>;\n\tWed, 8 Apr 2026 11:56:55 GMT",
            "from mail-qt1-f198.google.com (mail-qt1-f198.google.com\n\t[209.85.160.198])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dd61vbmy9-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 08 Apr 2026 11:56:55 +0000 (GMT)",
            "by mail-qt1-f198.google.com with SMTP id\n\td75a77b69052e-50d812c898cso114553381cf.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 08 Apr 2026 04:56:54 -0700 (PDT)",
            "from t14s\n\t(2001-1c00-0c32-7800-07d4-cca3-ec08-7ac7.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:c32:7800:7d4:cca3:ec08:7ac7])\n\tby smtp.gmail.com with ESMTPSA id\n\t4fb4d7f45d1cf-66e7b5ffa64sm3158932a12.21.2026.04.08.04.56.51\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 08 Apr 2026 04:56:52 -0700 (PDT)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"lzSjg/X5\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"Z5qoqg4S\"; dkim-atps=neutral",
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:date:from:in-reply-to:message-id\n\t:mime-version:references:subject:to; s=qcppdkim1; bh=MivQHR3UgI+\n\tQHVQSWj8sNAI8keEIOUE52ZVnqUIuH1k=; b=lzSjg/X5YR6AOEdBQ6EBJd1/agt\n\tXWLVGVBJljAZROjq0ID0WkLimSSnZIf+0oc4H7ho6TUe86eA04abvpeFwgkU2zs2\n\t5PWZggTghd+v/kAwY9/V8R+w7w9vUujwdbAisM2jGIh+ERYyOIkHncK6fGMSn0i/\n\tAb9NWlYuQzZRdvYJhHJ3tuUMmovbO8WnivsMNpMgvlV0EbAQGqiXYRFLYa4celN9\n\tZ1XZWspq5KNwWa8is1muUYvANg+V46CnVhHWDYJOuBBNLt7IkKT84zA37TA7oMWY\n\t5pcYU7YXUOUzKjvHUDAKQoJhFZ3TsXbbmygk3zG0j78VkekNEy/9aJPfRTw==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1775649414; x=1776254214;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=MivQHR3UgI+QHVQSWj8sNAI8keEIOUE52ZVnqUIuH1k=;\n\tb=Z5qoqg4S2P0T7sFbX+UvuGKPvOfPPPIseW9YNaKoCM23o3vhkF83ysu3dsNy8R5rnj\n\taBcZ6cbY6Gu07zb+77Qd3Ni2e5QDjSSkFNz94M7sE41efQolTHWSWNHDTOmVTsTq9eUu\n\tbDkhJu9hSBrtZXyW6+qxOp+q48qEFGj75eK1iI2xcTHi6X+ihj6NfGyD6WkTAzqaMWFK\n\tmGoNDsUiCOmAK1NsObCGK6Nw1QqY0PlKkSMxfxPnB2AAETfwLeezqcCaxy6oEIUoN7kl\n\tK1fBVVEbz5oaR5FYcli1LdrTAuOFVps5QGoyjY9zjl8YdThMCnQ4B/g5GEMatgOmqy2v\n\tkZMA=="
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1775649414; x=1776254214;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=MivQHR3UgI+QHVQSWj8sNAI8keEIOUE52ZVnqUIuH1k=;\n\tb=tOP383LFDZUQtyc2LSsF0zCp1hbKTYduPZfm9simrBFxHKQcHfTWgKT73+faa1dSmd\n\tUyKi3dP0MiJ9uYnC6zj5v9xR8QWdLVz0PmI0UvK6gwJ4ycWtnkV6Ymequ/Cd0A6KeeCX\n\tep7LHcySdO7KFfanPE5GZ1GMXPHkP6NC4oVG3JsTvZVtMcstTKbp2MHfhghFmYcRXShC\n\tPuW7BXtv5BLkQQhMLgn8bW9P7k/s0at5UxDpSisWzI9rotd79nMMFCdbLOFFeoUxgTBc\n\ttyq5PFoQ54orxQFkfEHJYBKnZjRT6oSZkWUMnnqqEmIQ/njjPydacZAhnwYI7zNxOTK7\n\tAftg==",
        "X-Gm-Message-State": "AOJu0YwLjBiDSHe+07n6ypNyv7J7624/3L/RAL3ni2bSyRuUMQSJ5u2E\n\tqN7P2IY6A1OT/OwY3z6SDE/VHPHoXkKDH8byWbOT6mjAAg3YASid8/TlijYoBXz70z1u2ergY/Y\n\tiatf7p7us6nwsmDudzFwPLjYqlX4bSIi6Blf7U4fszuot6QlwwwxwEMIFmf3hLKkCvwkFYA4pOp\n\tJu5mDF2psK",
        "X-Gm-Gg": "AeBDievWosx7IregiawPTC81D6riDPSmUzoxQKpGU3B8MNYVz4gDhIWTDOYPa5DthK6\n\t8lOKf0w4bZWcQ4kZe9g56Wl5pSJdoOwCXzJK/QV7EQoaYJY0J6et/bjrzZogGg9CpFV47ZfotaA\n\toxroiQVbXeowGGddzp3oNUnwGkIhusrHKIRbfvGYG08biNxndbCxnuaLHDxPr9C+3T0HoiZPY8j\n\td0jU7P0qz6+hJIf36iGwGVIorRqlDp3/d8pLYMEZ8aJySi09QTThUAkDKm+ovomVtf/SxUKENaJ\n\tIwckRQYTUdc3UlQb1ZLVQAdRXzHrXqNhgVH7urmzLHqQrJMmoLwBm6KUAm44KQQsrCBjZTfwHdh\n\tK82LZBQfZQyVCq2esSU8Rp9OiPJbRKtA9YR+DrR82krLb2NfybZ3OkWMzIUhf7E+i2Q75TUgQ2l\n\tLDtPPXgqWtiBKkHGvUz6iWYqpyOU9PRkEm",
        "X-Received": [
            "by 2002:ac8:5853:0:b0:50d:a8f5:1bff with SMTP id\n\td75a77b69052e-50da8f521bdmr76867001cf.9.1775649414017; \n\tWed, 08 Apr 2026 04:56:54 -0700 (PDT)",
            "by 2002:ac8:5853:0:b0:50d:a8f5:1bff with SMTP id\n\td75a77b69052e-50da8f521bdmr76866701cf.9.1775649413561; \n\tWed, 08 Apr 2026 04:56:53 -0700 (PDT)"
        ],
        "From": "Hans de Goede <johannes.goede@oss.qualcomm.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Loic Poulain <loic.poulain@oss.qualcomm.com>,\n\tHans de Goede <johannes.goede@oss.qualcomm.com>",
        "Subject": "[RFC 2/3] camss: Use finer grained locking / disableLinks()",
        "Date": "Wed,  8 Apr 2026 13:56:44 +0200",
        "Message-ID": "<20260408115645.12487-3-johannes.goede@oss.qualcomm.com>",
        "X-Mailer": "git-send-email 2.53.0",
        "In-Reply-To": "<20260408115645.12487-1-johannes.goede@oss.qualcomm.com>",
        "References": "<20260408115645.12487-1-johannes.goede@oss.qualcomm.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDA4MDExMCBTYWx0ZWRfX22fL6coBfVwR\n\tcq4vURNcBTGG31m5cqPg9Zwv0poWD5ivwmIrh6vaLOAEBqwHOHX7Hplmk7lE6KLuD2NGIb19NJi\n\tZXNjGXsGKmzcoCn+dQXMPAjTgmfxNrMXbJ7nAYLKIcxRgNvTUVRungQPgSX8pWLvoMEsiGa4R2t\n\tK7RD96jqVmpIX1waP9le9uEF0J4HbI6O0urdybxsUxpOyu15KxIwcDcCIqBJmY7E1NZhFoBRhqA\n\tLrEWEzvRm4M7fWWqR1hHJB30IU/yvRHUE63SmCxCcTZw/pB1JT0sKBeJsLUpl5wGW153ROjooKd\n\t5VSljJniM82g273Nc+iznKAnlXLsiXtzGLmxF4QRieTzJj6Eoe6IYdJyFKKCwDBemKMgAWjZp0t\n\tXXQP9lzRqpjisEYGF0gz2JyJKsY5a602FJzQjJVa34T4mT+nlwkJ6zBlg2dMo2xgn6O0oouBzCY\n\tRWCYnIZ14rUbEHuGKlA==",
        "X-Authority-Analysis": "v=2.4 cv=FecHAp+6 c=1 sm=1 tr=0 ts=69d64287 cx=c_pps\n\ta=mPf7EqFMSY9/WdsSgAYMbA==:117 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10\n\ta=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22\n\ta=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=Tt5Zj9tVXSUKrUkCGcAA:9\n\ta=dawVfQjAaf238kedN5IG:22",
        "X-Proofpoint-ORIG-GUID": "5ZI4q9OINDSL0ZFr2XYAb38TwsBVLYCc",
        "X-Proofpoint-GUID": "5ZI4q9OINDSL0ZFr2XYAb38TwsBVLYCc",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-04-08_03,2026-04-08_01,2025-10-01_01",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n\tmalwarescore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501\n\tsuspectscore=0 clxscore=1015 impostorscore=0 bulkscore=0 adultscore=0\n\tspamscore=0 classifier=typeunknown authscore=0 authtc= authcc=\n\troute=outbound\n\tadjust=0 reason=mlx scancount=1 engine=8.22.0-2604010000\n\tdefinitions=main-2604080110",
        "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": "Use finer grained locking / disableLinks() calls to allow 2 separate\nlibcamera instances to stream from 2 different cameras at the same time.\n\nNote this does not work when mixing (e.g. from containers) older libcamera\ninstances still using the simple pipeline handler with libcamera instances\nusing the new camss pipeline handler. The simple pipeline always picks\ncsid0 for all cameras. When using a camera on phy1 this sets up a\n'msm_csiphy1'[1] -> 'msm_csid0'[0] link which does not get disabled by\nthe camss pipeline handler when trying to use a phy0 -> csid0 -> vfe0\npipeline, leading to a \"Failed to setup link 'msm_csiphy0'[1] ->\n'msm_csid0'[0]: Device or resource busy\" error.\n\nSigned-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>\n---\n src/libcamera/pipeline/camss/camss.cpp     | 17 ++++++++++\n src/libcamera/pipeline/camss/camss_csi.cpp | 36 ++++++++++++++--------\n src/libcamera/pipeline/camss/camss_csi.h   |  3 ++\n 3 files changed, 44 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/src/libcamera/pipeline/camss/camss.cpp b/src/libcamera/pipeline/camss/camss.cpp\nindex 6939ac115..90d7b681e 100644\n--- a/src/libcamera/pipeline/camss/camss.cpp\n+++ b/src/libcamera/pipeline/camss/camss.cpp\n@@ -119,6 +119,8 @@ private:\n \t\treturn static_cast<CamssCameraData *>(camera->_d());\n \t}\n \n+\tbool acquireDevice(Camera *camera) override;\n+\tvoid releaseDevice(Camera *camera) override;\n \tint allocateBuffers(Camera *camera);\n \tvoid freeBuffers(Camera *camera);\n \tstatic int validateConfigMatchesV4L2DeviceFormat(const StreamConfiguration &cfg,\n@@ -293,6 +295,7 @@ CameraConfiguration::Status CamssCameraConfiguration::validate()\n PipelineHandlerCamss::PipelineHandlerCamss(CameraManager *manager)\n \t: PipelineHandler(manager), csi_()\n {\n+\tlockOnAcquire_ = false;\n }\n \n std::unique_ptr<CameraConfiguration>\n@@ -419,6 +422,20 @@ void PipelineHandlerCamss::freeBuffers(Camera *camera)\n \tdata->isp_->freeBuffers();\n }\n \n+bool PipelineHandlerCamss::acquireDevice(Camera *camera)\n+{\n+\tCamssCameraData *data = cameraData(camera);\n+\n+\treturn data->csi_->acquireDevice();\n+}\n+\n+void PipelineHandlerCamss::releaseDevice(Camera *camera)\n+{\n+\tCamssCameraData *data = cameraData(camera);\n+\n+\tdata->csi_->releaseDevice();\n+}\n+\n int PipelineHandlerCamss::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n {\n \tCamssCameraData *data = cameraData(camera);\ndiff --git a/src/libcamera/pipeline/camss/camss_csi.cpp b/src/libcamera/pipeline/camss/camss_csi.cpp\nindex b7191a8e9..327196992 100644\n--- a/src/libcamera/pipeline/camss/camss_csi.cpp\n+++ b/src/libcamera/pipeline/camss/camss_csi.cpp\n@@ -268,6 +268,12 @@ int CamssCsiCamera::configure(const StreamConfiguration &cfg, const Transform &t\n \tV4L2SubdeviceFormat sensorFormat;\n \tint ret;\n \n+\tfor (auto &link : links_) {\n+\t\tret = link.sinkSubdev->entity()->disableLinks();\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n \tsensorFormat = getSensorFormat(cfg.size, cfg.pixelFormat);\n \t/* This updates sensorFormat with the actual established format */\n \tret = sensor_->setFormat(&sensorFormat, transform);\n@@ -308,6 +314,24 @@ int CamssCsiCamera::exportBuffers(unsigned int count,\n \treturn output_->exportBuffers(count, buffers);\n }\n \n+bool CamssCsiCamera::acquireDevice()\n+{\n+\tfor (auto &link : links_) {\n+\t\tif (!link.sinkSubdev->lock()) {\n+\t\t\treleaseDevice();\n+\t\t\treturn false;\n+\t\t}\n+\t}\n+\n+\treturn true;\n+}\n+\n+void CamssCsiCamera::releaseDevice()\n+{\n+\tfor (auto &link : links_)\n+\t\tlink.sinkSubdev->unlock();\n+}\n+\n int CamssCsiCamera::start()\n {\n \tint ret = output_->exportBuffers(bufferCount_, &buffers_);\n@@ -427,18 +451,6 @@ CamssCsi::Cameras CamssCsi::match(PipelineHandler *pipe, DeviceEnumerator *enume\n \tif (!camssMediaDev_)\n \t\treturn {};\n \n-\t/*\n-\t * Disable all links that are enabled to start with a clean state,\n-\t * CamssCsiCamera::configure() enables links as necessary.\n-\t * \\todo instead only disable links on used entities, to allow\n-\t * 2 separate libcamera instances to drive 2 different sensors.\n-\t * This will also require changes to PipelineHandler::acquire() to\n-\t * allow a more fine grained version of that locking a list of\n-\t * subdevs associated with a Camera instead of the mediactl node.\n-\t */\n-\tif (camssMediaDev_->disableLinks())\n-\t\treturn {};\n-\n \tgetEntities(phys_, \"msm_csiphy%d\", kMaxCsiPhys);\n \tgetEntities(csids_, \"msm_csid%d\", kMaxCsiDecoders);\n \t/* Only RDI0 is used for now */\ndiff --git a/src/libcamera/pipeline/camss/camss_csi.h b/src/libcamera/pipeline/camss/camss_csi.h\nindex 4b1b0f83b..cc853b889 100644\n--- a/src/libcamera/pipeline/camss/camss_csi.h\n+++ b/src/libcamera/pipeline/camss/camss_csi.h\n@@ -50,6 +50,9 @@ public:\n \tPixelFormat mbusCodeToPixelFormat(unsigned int code) const;\n \tunsigned int PixelFormatToMbusCode(const PixelFormat &format) const;\n \n+\tbool acquireDevice();\n+\tvoid releaseDevice();\n+\n \tint start();\n \tvoid stop();\n \n",
    "prefixes": [
        "RFC",
        "2/3"
    ]
}