From patchwork Fri Oct 2 14:31:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 9935 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 A8D3AC3B5C for ; Fri, 2 Oct 2020 14:33:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7613A63BE8; Fri, 2 Oct 2020 16:33:13 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="m4ypgw7T"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DA26263B98 for ; Fri, 2 Oct 2020 16:33:11 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1BB9C2A2; Fri, 2 Oct 2020 16:33:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1601649191; bh=Pm1OZ25w8/uLGTSJKJLWmLNWSCbcp2Fn+Rh3AQ46Uc8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=m4ypgw7TXDh9r8rGRH2eEjR02qngv8+7qBjObNMgj5fm8NoItuHyckfmnifCyTXwr 5uG2s+yFoYYkRUB2PVh7//kFbmHDqZjF0Ar88vzCyFPgeKvhmB0AydXzOPfOG2KGo3 szv0lDLROcvfGKnW68hbJuKitx1cKo7/Q58DTv4c= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Fri, 2 Oct 2020 23:31:43 +0900 Message-Id: <20201002143154.468162-28-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201002143154.468162-1-paul.elder@ideasonboard.com> References: <20201002143154.468162-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 27/38] ipa: raspberrypi: Add mojom data definition file 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" Add a mojom data definition for raspberrypi pipeline handler's IPAs. This is a direct translation of what the raspberrypi pipeline handler and IPA was using before with IPAOperationData. Also move the enums from raspberrypi.h to raspberrypi.mojom Signed-off-by: Paul Elder --- Changes in v3: - remove stray comment about how our compiler will generate code - add ipa.rpi namespace - not ipa.RPi, because namespace conflict - remove RPi prefix from struct and enum names - add transform parameter to struct ConfigInput Changes in v2: - rebased on "libcamera: pipeline: ipa: raspberrypi: Rework drop frame signalling" - add license - move generic documentation to core.mojom - move documentation from IPA interface - customize the RPi IPA interface to make the pipeline and IPA code cleaner --- include/libcamera/ipa/meson.build | 4 +- include/libcamera/ipa/raspberrypi.h | 18 --- include/libcamera/ipa/raspberrypi.mojom | 158 ++++++++++++++++++++++++ 3 files changed, 161 insertions(+), 19 deletions(-) create mode 100644 include/libcamera/ipa/raspberrypi.mojom diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build index 590a1464..55c97fa5 100644 --- a/include/libcamera/ipa/meson.build +++ b/include/libcamera/ipa/meson.build @@ -24,7 +24,9 @@ ipa_mojom_core = custom_target(core_mojom_file.split('.')[0] + '_mojom_module', '--mojoms', '@INPUT@' ]) -ipa_mojom_files = [] +ipa_mojom_files = [ + 'raspberrypi.mojom', +] ipa_mojoms = [] diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h index b3041591..58262f6c 100644 --- a/include/libcamera/ipa/raspberrypi.h +++ b/include/libcamera/ipa/raspberrypi.h @@ -14,24 +14,6 @@ namespace libcamera { namespace RPi { -enum ConfigParameters { - IPA_CONFIG_LS_TABLE = (1 << 0), - IPA_CONFIG_STAGGERED_WRITE = (1 << 1), - IPA_CONFIG_SENSOR = (1 << 2), - IPA_CONFIG_DROP_FRAMES = (1 << 3), -}; - -enum Operations { - IPA_ACTION_V4L2_SET_STAGGERED = 1, - IPA_ACTION_V4L2_SET_ISP, - IPA_ACTION_STATS_METADATA_COMPLETE, - IPA_ACTION_RUN_ISP, - IPA_ACTION_EMBEDDED_COMPLETE, - IPA_EVENT_SIGNAL_STAT_READY, - IPA_EVENT_SIGNAL_ISP_PREPARE, - IPA_EVENT_QUEUE_REQUEST, -}; - enum BufferMask { ID = 0x00ffff, STATS = 0x010000, diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom new file mode 100644 index 00000000..bbef5178 --- /dev/null +++ b/include/libcamera/ipa/raspberrypi.mojom @@ -0,0 +1,158 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +module ipa.rpi; + +import "include/libcamera/ipa/core.mojom"; + +interface IPARPiInterface { +/** + * \fn init() + * \brief Initialise the IPAInterface + * \param[in] settings The IPA initialization settings + * + * This function initializes the IPA interface. It shall be called before any + * other function of the IPAInterface. The \a settings carry initialization + * parameters that are valid for the whole life time of the IPA interface. + */ + init(IPASettings settings) => (int32 ret); + +/** + * \fn start() + * \brief Start the IPA + * + * This method informs the IPA module that the camera is about to be started. + * The IPA module shall prepare any resources it needs to operate. + * + * \return 0 on success or a negative error code otherwise + */ + start() => (int32 ret); + +/** + * \fn stop() + * \brief Stop the IPA + * + * This method informs the IPA module that the camera is stopped. The IPA module + * shall release resources prepared in start(). + */ + stop(); + +/** + * \fn configure() + * \brief Configure the IPA stream and sensor settings + * \param[in] sensorInfo Camera sensor information + * \param[in] streamConfig Configuration of all active streams + * \param[in] entityControls Controls provided by the pipeline entities + * \param[in] ipaConfig Pipeline-handler-specific configuration data + * \param[out] result Pipeline-handler-specific configuration result + * + * This method shall be called when the camera is started to inform the IPA of + * the camera's streams and the sensor settings. The meaning of the numerical + * keys in the \a streamConfig and \a entityControls maps is defined by the IPA + * protocol. + * + * The \a sensorInfo conveys information about the camera sensor settings that + * the pipeline handler has selected for the configuration. The IPA may use + * that information to tune its algorithms. + * + * The \a ipaConfig and \a result parameters carry custom data passed by the + * pipeline handler to the IPA and back. The pipeline handler may set the \a + * result parameter to null if the IPA protocol doesn't need to pass a result + * back through the configure() function. + */ + configure(CameraSensorInfo sensorInfo, + map streamConfig, + map entityControls, + ConfigInput ipaConfig) + => (ConfigOutput results); + +/** + * \fn mapBuffers() + * \brief Map buffers shared between the pipeline handler and the IPA + * \param[in] buffers List of buffers to map + * + * This method informs the IPA module of memory buffers set up by the pipeline + * handler that the IPA needs to access. It provides dmabuf file handles for + * each buffer, and associates the buffers with unique numerical IDs. + * + * IPAs shall map the dmabuf file handles to their address space and keep a + * cache of the mappings, indexed by the buffer numerical IDs. The IDs are used + * in all other IPA interface methods to refer to buffers, including the + * unmapBuffers() method. + * + * All buffers that the pipeline handler wishes to share with an IPA shall be + * mapped with this method. Buffers may be mapped all at once with a single + * call, or mapped and unmapped dynamically at runtime, depending on the IPA + * protocol. Regardless of the protocol, all buffers mapped at a given time + * shall have unique numerical IDs. + * + * The numerical IDs have no meaning defined by the IPA interface, and IPA + * protocols shall not give them any specific meaning either. They should be + * treated as opaque handles by IPAs, with the only exception that ID zero is + * invalid. + * + * \sa unmapBuffers() + * + * \todo Provide a generic implementation of mapBuffers and unmapBuffers for + * IPAs + */ + mapBuffers(array buffers); + +/** + * \fn unmapBuffers() + * \brief Unmap buffers shared by the pipeline to the IPA + * \param[in] ids List of buffer IDs to unmap + * + * This method removes mappings set up with mapBuffers(). Buffers may be + * unmapped all at once with a single call, or selectively at runtime, depending + * on the IPA protocol. Numerical IDs of unmapped buffers may be reused when + * mapping new buffers. + * + * \sa mapBuffers() + */ + unmapBuffers(array ids); + + [async] signalStatReady(uint32 bufferId); + [async] signalQueueRequest(ControlList controls); + [async] signalIspPrepare(IspPreparePayload data); +}; + +interface IPARPiCallbackInterface { + statsMetadataComplete(uint32 bufferId, ControlList controls); + runIsp(uint32 bufferId); + embeddedComplete(uint32 bufferId); + setIsp(ControlList controls); + setStaggered(ControlList controls); +}; + + +enum ConfigParameters { + RPI_IPA_CONFIG_LS_TABLE = 0x01, + RPI_IPA_CONFIG_STAGGERED_WRITE = 0x02, + RPI_IPA_CONFIG_SENSOR = 0x04, + RPI_IPA_CONFIG_DROP_FRAMES = 0x08, +}; + +struct StaggeredWritePayload { + uint32 gainDelay; + uint32 exposureDelay; + uint32 sensorMetadata; +}; + +struct IspPreparePayload { + uint32 embeddedbufferId; + uint32 bayerbufferId; +}; + +struct ConfigInput { + uint32 op; + uint32 transform; + FileDescriptor lsTableHandle; + int32 lsTableHandleStatic = -1; +}; + +struct ConfigOutput { + uint32 op; + StaggeredWritePayload staggeredWriteResult; + ControlList controls; + int32 dropFrameCount; +};