From patchwork Wed Apr 8 11:56:44 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 26513 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 9AB90C32BB for ; Wed, 8 Apr 2026 11:56:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5238562E4D; Wed, 8 Apr 2026 13:56:58 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.b="lzSjg/X5"; dkim=pass (2048-bit key; unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Z5qoqg4S"; dkim-atps=neutral Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 58BC862E11 for ; Wed, 8 Apr 2026 13:56:56 +0200 (CEST) Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6389N2e92412291 for ; Wed, 8 Apr 2026 11:56:55 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=MivQHR3UgI+ QHVQSWj8sNAI8keEIOUE52ZVnqUIuH1k=; b=lzSjg/X5YR6AOEdBQ6EBJd1/agt XWLVGVBJljAZROjq0ID0WkLimSSnZIf+0oc4H7ho6TUe86eA04abvpeFwgkU2zs2 5PWZggTghd+v/kAwY9/V8R+w7w9vUujwdbAisM2jGIh+ERYyOIkHncK6fGMSn0i/ Ab9NWlYuQzZRdvYJhHJ3tuUMmovbO8WnivsMNpMgvlV0EbAQGqiXYRFLYa4celN9 Z1XZWspq5KNwWa8is1muUYvANg+V46CnVhHWDYJOuBBNLt7IkKT84zA37TA7oMWY 5pcYU7YXUOUzKjvHUDAKQoJhFZ3TsXbbmygk3zG0j78VkekNEy/9aJPfRTw== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dd61vbmy9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 08 Apr 2026 11:56:55 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-50d812c898cso114553381cf.1 for ; Wed, 08 Apr 2026 04:56:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775649414; x=1776254214; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MivQHR3UgI+QHVQSWj8sNAI8keEIOUE52ZVnqUIuH1k=; b=Z5qoqg4S2P0T7sFbX+UvuGKPvOfPPPIseW9YNaKoCM23o3vhkF83ysu3dsNy8R5rnj aBcZ6cbY6Gu07zb+77Qd3Ni2e5QDjSSkFNz94M7sE41efQolTHWSWNHDTOmVTsTq9eUu bDkhJu9hSBrtZXyW6+qxOp+q48qEFGj75eK1iI2xcTHi6X+ihj6NfGyD6WkTAzqaMWFK mGoNDsUiCOmAK1NsObCGK6Nw1QqY0PlKkSMxfxPnB2AAETfwLeezqcCaxy6oEIUoN7kl K1fBVVEbz5oaR5FYcli1LdrTAuOFVps5QGoyjY9zjl8YdThMCnQ4B/g5GEMatgOmqy2v kZMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775649414; x=1776254214; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MivQHR3UgI+QHVQSWj8sNAI8keEIOUE52ZVnqUIuH1k=; b=tOP383LFDZUQtyc2LSsF0zCp1hbKTYduPZfm9simrBFxHKQcHfTWgKT73+faa1dSmd UyKi3dP0MiJ9uYnC6zj5v9xR8QWdLVz0PmI0UvK6gwJ4ycWtnkV6Ymequ/Cd0A6KeeCX ep7LHcySdO7KFfanPE5GZ1GMXPHkP6NC4oVG3JsTvZVtMcstTKbp2MHfhghFmYcRXShC PuW7BXtv5BLkQQhMLgn8bW9P7k/s0at5UxDpSisWzI9rotd79nMMFCdbLOFFeoUxgTBc tyq5PFoQ54orxQFkfEHJYBKnZjRT6oSZkWUMnnqqEmIQ/njjPydacZAhnwYI7zNxOTK7 Aftg== X-Gm-Message-State: AOJu0YwLjBiDSHe+07n6ypNyv7J7624/3L/RAL3ni2bSyRuUMQSJ5u2E qN7P2IY6A1OT/OwY3z6SDE/VHPHoXkKDH8byWbOT6mjAAg3YASid8/TlijYoBXz70z1u2ergY/Y iatf7p7us6nwsmDudzFwPLjYqlX4bSIi6Blf7U4fszuot6QlwwwxwEMIFmf3hLKkCvwkFYA4pOp Ju5mDF2psK X-Gm-Gg: AeBDievWosx7IregiawPTC81D6riDPSmUzoxQKpGU3B8MNYVz4gDhIWTDOYPa5DthK6 8lOKf0w4bZWcQ4kZe9g56Wl5pSJdoOwCXzJK/QV7EQoaYJY0J6et/bjrzZogGg9CpFV47ZfotaA oxroiQVbXeowGGddzp3oNUnwGkIhusrHKIRbfvGYG08biNxndbCxnuaLHDxPr9C+3T0HoiZPY8j d0jU7P0qz6+hJIf36iGwGVIorRqlDp3/d8pLYMEZ8aJySi09QTThUAkDKm+ovomVtf/SxUKENaJ IwckRQYTUdc3UlQb1ZLVQAdRXzHrXqNhgVH7urmzLHqQrJMmoLwBm6KUAm44KQQsrCBjZTfwHdh K82LZBQfZQyVCq2esSU8Rp9OiPJbRKtA9YR+DrR82krLb2NfybZ3OkWMzIUhf7E+i2Q75TUgQ2l LDtPPXgqWtiBKkHGvUz6iWYqpyOU9PRkEm X-Received: by 2002:ac8:5853:0:b0:50d:a8f5:1bff with SMTP id d75a77b69052e-50da8f521bdmr76867001cf.9.1775649414017; Wed, 08 Apr 2026 04:56:54 -0700 (PDT) X-Received: by 2002:ac8:5853:0:b0:50d:a8f5:1bff with SMTP id d75a77b69052e-50da8f521bdmr76866701cf.9.1775649413561; Wed, 08 Apr 2026 04:56:53 -0700 (PDT) Received: from t14s (2001-1c00-0c32-7800-07d4-cca3-ec08-7ac7.cable.dynamic.v6.ziggo.nl. [2001:1c00:c32:7800:7d4:cca3:ec08:7ac7]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-66e7b5ffa64sm3158932a12.21.2026.04.08.04.56.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 04:56:52 -0700 (PDT) From: Hans de Goede To: libcamera-devel@lists.libcamera.org Cc: Loic Poulain , Hans de Goede 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 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA4MDExMCBTYWx0ZWRfX22fL6coBfVwR cq4vURNcBTGG31m5cqPg9Zwv0poWD5ivwmIrh6vaLOAEBqwHOHX7Hplmk7lE6KLuD2NGIb19NJi ZXNjGXsGKmzcoCn+dQXMPAjTgmfxNrMXbJ7nAYLKIcxRgNvTUVRungQPgSX8pWLvoMEsiGa4R2t K7RD96jqVmpIX1waP9le9uEF0J4HbI6O0urdybxsUxpOyu15KxIwcDcCIqBJmY7E1NZhFoBRhqA LrEWEzvRm4M7fWWqR1hHJB30IU/yvRHUE63SmCxCcTZw/pB1JT0sKBeJsLUpl5wGW153ROjooKd 5VSljJniM82g273Nc+iznKAnlXLsiXtzGLmxF4QRieTzJj6Eoe6IYdJyFKKCwDBemKMgAWjZp0t XXQP9lzRqpjisEYGF0gz2JyJKsY5a602FJzQjJVa34T4mT+nlwkJ6zBlg2dMo2xgn6O0oouBzCY RWCYnIZ14rUbEHuGKlA== X-Authority-Analysis: v=2.4 cv=FecHAp+6 c=1 sm=1 tr=0 ts=69d64287 cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=Tt5Zj9tVXSUKrUkCGcAA:9 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-ORIG-GUID: 5ZI4q9OINDSL0ZFr2XYAb38TwsBVLYCc X-Proofpoint-GUID: 5ZI4q9OINDSL0ZFr2XYAb38TwsBVLYCc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51, FMLib:17.12.100.49 definitions=2026-04-08_03,2026-04-08_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0 clxscore=1015 impostorscore=0 bulkscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604010000 definitions=main-2604080110 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" Use finer grained locking / disableLinks() calls to allow 2 separate libcamera instances to stream from 2 different cameras at the same time. Note this does not work when mixing (e.g. from containers) older libcamera instances still using the simple pipeline handler with libcamera instances using the new camss pipeline handler. The simple pipeline always picks csid0 for all cameras. When using a camera on phy1 this sets up a 'msm_csiphy1'[1] -> 'msm_csid0'[0] link which does not get disabled by the camss pipeline handler when trying to use a phy0 -> csid0 -> vfe0 pipeline, leading to a "Failed to setup link 'msm_csiphy0'[1] -> 'msm_csid0'[0]: Device or resource busy" error. Signed-off-by: Hans de Goede --- src/libcamera/pipeline/camss/camss.cpp | 17 ++++++++++ src/libcamera/pipeline/camss/camss_csi.cpp | 36 ++++++++++++++-------- src/libcamera/pipeline/camss/camss_csi.h | 3 ++ 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/libcamera/pipeline/camss/camss.cpp b/src/libcamera/pipeline/camss/camss.cpp index 6939ac115..90d7b681e 100644 --- a/src/libcamera/pipeline/camss/camss.cpp +++ b/src/libcamera/pipeline/camss/camss.cpp @@ -119,6 +119,8 @@ private: return static_cast(camera->_d()); } + bool acquireDevice(Camera *camera) override; + void releaseDevice(Camera *camera) override; int allocateBuffers(Camera *camera); void freeBuffers(Camera *camera); static int validateConfigMatchesV4L2DeviceFormat(const StreamConfiguration &cfg, @@ -293,6 +295,7 @@ CameraConfiguration::Status CamssCameraConfiguration::validate() PipelineHandlerCamss::PipelineHandlerCamss(CameraManager *manager) : PipelineHandler(manager), csi_() { + lockOnAcquire_ = false; } std::unique_ptr @@ -419,6 +422,20 @@ void PipelineHandlerCamss::freeBuffers(Camera *camera) data->isp_->freeBuffers(); } +bool PipelineHandlerCamss::acquireDevice(Camera *camera) +{ + CamssCameraData *data = cameraData(camera); + + return data->csi_->acquireDevice(); +} + +void PipelineHandlerCamss::releaseDevice(Camera *camera) +{ + CamssCameraData *data = cameraData(camera); + + data->csi_->releaseDevice(); +} + int PipelineHandlerCamss::start(Camera *camera, [[maybe_unused]] const ControlList *controls) { CamssCameraData *data = cameraData(camera); diff --git a/src/libcamera/pipeline/camss/camss_csi.cpp b/src/libcamera/pipeline/camss/camss_csi.cpp index b7191a8e9..327196992 100644 --- a/src/libcamera/pipeline/camss/camss_csi.cpp +++ b/src/libcamera/pipeline/camss/camss_csi.cpp @@ -268,6 +268,12 @@ int CamssCsiCamera::configure(const StreamConfiguration &cfg, const Transform &t V4L2SubdeviceFormat sensorFormat; int ret; + for (auto &link : links_) { + ret = link.sinkSubdev->entity()->disableLinks(); + if (ret) + return ret; + } + sensorFormat = getSensorFormat(cfg.size, cfg.pixelFormat); /* This updates sensorFormat with the actual established format */ ret = sensor_->setFormat(&sensorFormat, transform); @@ -308,6 +314,24 @@ int CamssCsiCamera::exportBuffers(unsigned int count, return output_->exportBuffers(count, buffers); } +bool CamssCsiCamera::acquireDevice() +{ + for (auto &link : links_) { + if (!link.sinkSubdev->lock()) { + releaseDevice(); + return false; + } + } + + return true; +} + +void CamssCsiCamera::releaseDevice() +{ + for (auto &link : links_) + link.sinkSubdev->unlock(); +} + int CamssCsiCamera::start() { int ret = output_->exportBuffers(bufferCount_, &buffers_); @@ -427,18 +451,6 @@ CamssCsi::Cameras CamssCsi::match(PipelineHandler *pipe, DeviceEnumerator *enume if (!camssMediaDev_) return {}; - /* - * Disable all links that are enabled to start with a clean state, - * CamssCsiCamera::configure() enables links as necessary. - * \todo instead only disable links on used entities, to allow - * 2 separate libcamera instances to drive 2 different sensors. - * This will also require changes to PipelineHandler::acquire() to - * allow a more fine grained version of that locking a list of - * subdevs associated with a Camera instead of the mediactl node. - */ - if (camssMediaDev_->disableLinks()) - return {}; - getEntities(phys_, "msm_csiphy%d", kMaxCsiPhys); getEntities(csids_, "msm_csid%d", kMaxCsiDecoders); /* Only RDI0 is used for now */ diff --git a/src/libcamera/pipeline/camss/camss_csi.h b/src/libcamera/pipeline/camss/camss_csi.h index 4b1b0f83b..cc853b889 100644 --- a/src/libcamera/pipeline/camss/camss_csi.h +++ b/src/libcamera/pipeline/camss/camss_csi.h @@ -50,6 +50,9 @@ public: PixelFormat mbusCodeToPixelFormat(unsigned int code) const; unsigned int PixelFormatToMbusCode(const PixelFormat &format) const; + bool acquireDevice(); + void releaseDevice(); + int start(); void stop();