From patchwork Fri Sep 18 07:59:54 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 28328 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 8A0CFC335D for ; Fri, 18 Sep 2026 08:08:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D49B968752; Fri, 18 Sep 2026 10:08:06 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="imSO05m8"; dkim-atps=neutral Received: from mail-wr2-x10.google.com (mail-wr2-x10.google.com [IPv6:2a00:1450:4864:30::10]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C5E5868728 for ; Fri, 18 Sep 2026 10:07:54 +0200 (CEST) Received: by mail-wr2-x10.google.com with SMTP id ffacd0b85a97d-482e1b30c94so52442f8f.1 for ; Fri, 18 Sep 2026 01:07:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1789718874; x=1790323674; 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:content-type; bh=Bev3Ztd+jvcwWH3cZh1zm1zvxaVEXCcNo0HFAKbPWM8=; b=imSO05m8f5inVG5l5LQIeoltILw3FjdAZIq7Q8ew/xRm4VmmGWRjO4q9f7oKGKHaHZ tOYRGKPFEadUQeTaWiEZsPalwFXTqqKsLyue+gJNALBzZP00XepwC5Ar8qBlROT79fT/ dnM0z2IT0KWJRm2dwBmtzQxdPC4FDXE6BKm5aZWXpO9uTuD7qgVWEKCPDP6qSdw2Z/VW SBvn/di7Gcc0ov1z5g1a222F9c8aBI0vYPYyDAVrHaAeAjMEMiaBSsFpqrg9MJuIhvBI 1WjndSEblrTXJsqc0WWcoFyqwl9C0h8AhMUw0Oa+RN13NEE4Xq0pmLzqks+RKKp6G2KD INqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789718874; x=1790323674; 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:content-type; bh=Bev3Ztd+jvcwWH3cZh1zm1zvxaVEXCcNo0HFAKbPWM8=; b=s1Jcfd5z/K69PiZftLieYC2k2Z3YO+4EIT3Dwk8arA86GSwz7A98FDn5LZV+STzCQZ y6WrQ2nAvFMgDOPnS/VjvXC4UnRtZA0EvVx7TgV4q4vDBRPBwJNAnOGWHdYDWnKxDAcw kBH9g22e+9vnK9q+E7/3nyye++mvoaxwj5rX9pGiBVkRi9kToGV4ojndw/idGBhOdcxc xmcA4BBnlxvT9xVKX7G1UF2GpfagupLCGafZPtbbqyTh7y6UQpBUVgoDvJlxYQZg20LR lwVgucHQFD03Oek+C8pQ9KvY94RD9hsl51YNyU+hXaz8iJqcYmfqQ6om2uA3F2SaHxHd kN2A== X-Gm-Message-State: AFuF++kuurxiNHABffHAynhSr1dsIL6xEXdWi9Veglcc+h+RZboXblje szrJS+4M+UZKP17UaYOMvOBarCATUfRH7U5nEGdDTN+Azwb4G5cYIHXumtzwK8PNYvZwuZj0NWF YyOn3yzw= X-Gm-Gg: AYBFou0iZImGSfinoW8hxQ3SSYEAhQb7tDbGE6IppIK0ZsfMDDHB+UmqkCtyehC9GHl 1rkP7PSmxO23Jls4WNbb5qFmrWNnzfqhmY51k9Hag6Ej80WI1JcWGnqQjc4LzeKMdZbE7OB3fIL DfUtFogMsy88ey1bUk4LqO8OT4wMunW+AMHBrfhtGujmDvuU+MJB+K0dvxMPs9lfe7UrZlSGMg2 HZVu6mqC6gKHoTaMkh/4fyw/fJgofHscoJ+NuD00Awq4NUdUpQPLdQZ/TuJAY3+pAmMGXjFMNyL L6BaWWOs0DDtQj/454ZQfXf4TlMgrnilQTJeqeadzkX18e39SLZ/rv2+27pMXX9JNe+/7HZ6FR8 zUslF7vb+ZwTWch3pzuqm7nlJ7q2x0DP2sV2Dy03s3gu6CVF+JP/m4lVyA7FIv7GHG4BAQiX5UR WUd4xR09HoOj2FUk5klKbLmcMl3rp7iuQEGmdFnpzuK/ZD5OByQuBLst61WIFhovUIC2te0suBj FwvsNsd731dyKRiv5nZoo8LDi6YYXXFdLOHU/1GYGgt+Z8n8dJ4IfMjGJnJ7lc9vKLK/2OUeBKh 6WFKzDGgTy5QBkwP3KIZASBmAjE7yBngYsjhT88c1a99Ao7jhST4HNvCX0L/1v60/iRkx33NuNu QyO9dQA42HsXFK/+mdooSafQDCxo4YvqVNr4= X-Received: by 2002:a05:6000:1a8c:b0:487:803:ba34 with SMTP id ffacd0b85a97d-4871faa2329mr1269116f8f.6.1789718874180; Fri, 18 Sep 2026 01:07:54 -0700 (PDT) Received: from naush-dell.pitowers.org ([2a00:1098:3142:1f:45e3:df8b:2b18:6253]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-487203f077fsm1742230f8f.26.2026.09.18.01.07.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 01:07:53 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Cc: Naushir Patuck Subject: [RFC PATCH v1 16/20] pipeline: rpi: Add platform helpers for camera enumeration Date: Fri, 18 Sep 2026 08:59:54 +0100 Message-ID: <20260918080734.1228227-17-naush@raspberrypi.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918080734.1228227-1-naush@raspberrypi.com> References: <20260918080734.1228227-1-naush@raspberrypi.com> MIME-Version: 1.0 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" The vc4 and pisp match() implementations differ only in the media devices they look for, the frontend link name, the camera data they allocate and, for pisp, a check of the PiSP variant. Expose these differences as platforms specific helpers in PipelineHandlerBase and implement them for both vc4 and pisp. In a subsequent commit, a generic survey() and createCamera() can be built on them. The existing match() implementations are left untouched. Signed-off-by: Naushir Patuck --- .../pipeline/rpi/common/pipeline_base.h | 12 ++++ src/libcamera/pipeline/rpi/pisp/pisp.cpp | 69 +++++++++++++++++++ src/libcamera/pipeline/rpi/vc4/vc4.cpp | 22 ++++++ 3 files changed, 103 insertions(+) diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.h b/src/libcamera/pipeline/rpi/common/pipeline_base.h index ca12a4875faf..16c509d6a769 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.h +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.h @@ -245,6 +245,18 @@ protected: void mapBuffers(Camera *camera, const BufferMap &buffers, unsigned int mask); + /* Platform-specific helpers used by survey() and createCamera(). */ + virtual DeviceMatch frontendMatch() const = 0; + virtual DeviceMatch backendMatch() const = 0; + virtual const char *frontendLinkName() const = 0; + virtual bool platformSupported([[maybe_unused]] const MediaDevice *frontend, + [[maybe_unused]] const MediaDevice *backend) const + { + return true; + } + virtual std::unique_ptr + allocateCameraData(MediaDevice *frontend, MediaDevice *backend) = 0; + virtual int platformRegister(std::unique_ptr &cameraData, std::shared_ptr unicam, std::shared_ptr isp) = 0; diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index 159c6b05ee7b..34de291f4092 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -869,12 +869,81 @@ private: return static_cast(camera->_d()); } + DeviceMatch frontendMatch() const override + { + DeviceMatch cfe("rp1-cfe"); + cfe.add("rp1-cfe-fe-image0"); + cfe.add("rp1-cfe-fe-stats"); + cfe.add("rp1-cfe-fe-config"); + return cfe; + } + + DeviceMatch backendMatch() const override + { + DeviceMatch isp("pispbe"); + isp.add("pispbe-input"); + isp.add("pispbe-config"); + isp.add("pispbe-output0"); + isp.add("pispbe-output1"); + isp.add("pispbe-tdn_output"); + isp.add("pispbe-tdn_input"); + isp.add("pispbe-stitch_output"); + isp.add("pispbe-stitch_input"); + return isp; + } + + const char *frontendLinkName() const override + { + return "csi2"; + } + + bool platformSupported(const MediaDevice *frontend, + const MediaDevice *backend) const override + { + const libpisp::PiSPVariant &variant = + libpisp::get_variant(frontend->hwRevision(), + backend->hwRevision()); + return variant.NumFrontEnds() && variant.NumBackEnds(); + } + + std::unique_ptr + allocateCameraData(MediaDevice *frontend, MediaDevice *backend) override; + int allocateBuffers(Camera *camera) override; int platformRegister(std::unique_ptr &cameraData, std::shared_ptr cfe, std::shared_ptr isp) override; }; +std::unique_ptr +PipelineHandlerPiSP::allocateCameraData(MediaDevice *frontend, MediaDevice *backend) +{ + const libpisp::PiSPVariant &variant = + libpisp::get_variant(frontend->hwRevision(), + backend->hwRevision()); + if (!variant.NumFrontEnds() || !variant.NumBackEnds()) { + LOG(RPI, Error) << "Unsupported PiSP variant"; + return {}; + } + + std::unique_ptr cameraData = + std::make_unique(this, variant); + PiSPCameraData *pisp = + static_cast(cameraData.get()); + + pisp->fe_ = SharedMemObject + ("pisp_frontend", true, pisp->pispVariant_); + pisp->be_ = SharedMemObject + ("pisp_backend", BackEnd::Config({}), pisp->pispVariant_); + + if (!pisp->fe_.fd().isValid() || !pisp->be_.fd().isValid()) { + LOG(RPI, Error) << "Failed to create ISP shared objects"; + return {}; + } + + return cameraData; +} + bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator) { constexpr unsigned int numCfeDevices = 2; diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp index 200e3b58724a..f6af31072eee 100644 --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp @@ -158,6 +158,28 @@ private: return static_cast(camera->_d()); } + DeviceMatch frontendMatch() const override + { + return DeviceMatch("unicam"); + } + + DeviceMatch backendMatch() const override + { + return DeviceMatch("bcm2835-isp"); + } + + const char *frontendLinkName() const override + { + return "unicam-image"; + } + + std::unique_ptr + allocateCameraData([[maybe_unused]] MediaDevice *frontend, + [[maybe_unused]] MediaDevice *backend) override + { + return std::make_unique(this); + } + int allocateBuffers(Camera *camera) override; int platformRegister(std::unique_ptr &cameraData, std::shared_ptr unicam,