From patchwork Mon Oct 7 08:58:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2123 Return-Path: Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5724161565 for ; Mon, 7 Oct 2019 10:57:02 +0200 (CEST) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 1F576240008 for ; Mon, 7 Oct 2019 08:57:01 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Mon, 7 Oct 2019 10:58:38 +0200 Message-Id: <20191007085842.7608-2-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191007085842.7608-1-jacopo@jmondi.org> References: <20191007085842.7608-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 1/5] ipa: vimc: Rename ipa_dummy to ipa_vimc 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: , X-List-Received-Date: Mon, 07 Oct 2019 08:57:02 -0000 The DummyIPA is actually a test IPA module for the virtual media controller driver VIMC. Rename it accordingly to its usage. Reviewed-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Signed-off-by: Jacopo Mondi --- src/ipa/{ipa_dummy.cpp => ipa_vimc.cpp} | 10 +++++----- src/ipa/meson.build | 10 +++++----- test/ipa/ipa_test.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) rename src/ipa/{ipa_dummy.cpp => ipa_vimc.cpp} (71%) diff --git a/src/ipa/ipa_dummy.cpp b/src/ipa/ipa_vimc.cpp similarity index 71% rename from src/ipa/ipa_dummy.cpp rename to src/ipa/ipa_vimc.cpp index 9d0cbdc8b1ad..abc06e7f5fd5 100644 --- a/src/ipa/ipa_dummy.cpp +++ b/src/ipa/ipa_vimc.cpp @@ -2,7 +2,7 @@ /* * Copyright (C) 2019, Google Inc. * - * ipa_dummy.cpp - Dummy Image Processing Algorithm module + * ipa_vimc.cpp - Vimc Image Processing Algorithm module */ #include @@ -12,15 +12,15 @@ namespace libcamera { -class IPADummy : public IPAInterface +class IPAVimc : public IPAInterface { public: int init(); }; -int IPADummy::init() +int IPAVimc::init() { - std::cout << "initializing dummy IPA!" << std::endl; + std::cout << "initializing vimc IPA!" << std::endl; return 0; } @@ -39,7 +39,7 @@ const struct IPAModuleInfo ipaModuleInfo = { IPAInterface *ipaCreate() { - return new IPADummy(); + return new IPAVimc(); } }; diff --git a/src/ipa/meson.build b/src/ipa/meson.build index f09915bc1388..b5bcd7b2c3db 100644 --- a/src/ipa/meson.build +++ b/src/ipa/meson.build @@ -1,12 +1,12 @@ -ipa_dummy_sources = [ - ['ipa_dummy', 'LGPL-2.1-or-later'], - ['ipa_dummy_isolate', 'Proprietary'], +ipa_vimc_sources = [ + ['ipa_vimc', 'LGPL-2.1-or-later'], + ['ipa_vimc_isolate', 'Proprietary'], ] ipa_install_dir = join_paths(get_option('libdir'), 'libcamera') -foreach t : ipa_dummy_sources - ipa = shared_module(t[0], 'ipa_dummy.cpp', +foreach t : ipa_vimc_sources + ipa = shared_module(t[0], 'ipa_vimc.cpp', name_prefix : '', include_directories : libcamera_includes, install : true, diff --git a/test/ipa/ipa_test.cpp b/test/ipa/ipa_test.cpp index b9e1bd61c299..8f9b2d8058ec 100644 --- a/test/ipa/ipa_test.cpp +++ b/test/ipa/ipa_test.cpp @@ -62,7 +62,7 @@ protected: "GPL-2.0-or-later", }; - count += runTest("src/ipa/ipa_dummy.so", testInfo); + count += runTest("src/ipa/ipa_vimc.so", testInfo); if (count < 0) return TestFail; From patchwork Mon Oct 7 08:58:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2124 Return-Path: Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B4BE761565 for ; Mon, 7 Oct 2019 10:57:02 +0200 (CEST) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 7DE80240005 for ; Mon, 7 Oct 2019 08:57:02 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Mon, 7 Oct 2019 10:58:39 +0200 Message-Id: <20191007085842.7608-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191007085842.7608-1-jacopo@jmondi.org> References: <20191007085842.7608-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 2/5] test: ipa: Rename the ipa_test to ipa_module_test 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: , X-List-Received-Date: Mon, 07 Oct 2019 08:57:02 -0000 Update the IPA test to match the test class name in prevision of adding more IPA tests. Also update the description comment in the test unit, as the old name for the test was still used. Reviewed-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Signed-off-by: Jacopo Mondi --- test/ipa/{ipa_test.cpp => ipa_module_test.cpp} | 2 +- test/ipa/meson.build | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename test/ipa/{ipa_test.cpp => ipa_module_test.cpp} (95%) diff --git a/test/ipa/ipa_test.cpp b/test/ipa/ipa_module_test.cpp similarity index 95% rename from test/ipa/ipa_test.cpp rename to test/ipa/ipa_module_test.cpp index 8f9b2d8058ec..3a634099a550 100644 --- a/test/ipa/ipa_test.cpp +++ b/test/ipa/ipa_module_test.cpp @@ -2,7 +2,7 @@ /* * Copyright (C) 2019, Google Inc. * - * load-so.cpp - loading .so tests + * ipa_module_test.cpp - Test loading of the VIMC IPA module and verify its info */ #include diff --git a/test/ipa/meson.build b/test/ipa/meson.build index 1749ab7d4338..e174671d05e1 100644 --- a/test/ipa/meson.build +++ b/test/ipa/meson.build @@ -1,5 +1,5 @@ ipa_test = [ - ['ipa_test', 'ipa_test.cpp'], + ['ipa_module_test', 'ipa_module_test.cpp'], ] foreach t : ipa_test From patchwork Mon Oct 7 08:58:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2125 Return-Path: Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1C76761565 for ; Mon, 7 Oct 2019 10:57:03 +0200 (CEST) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay10.mail.gandi.net (Postfix) with ESMTPSA id DD938240005 for ; Mon, 7 Oct 2019 08:57:02 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Mon, 7 Oct 2019 10:58:40 +0200 Message-Id: <20191007085842.7608-4-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191007085842.7608-1-jacopo@jmondi.org> References: <20191007085842.7608-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 3/5] ipa: meson: Give IPAs access to internal libcamera APIs 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: , X-List-Received-Date: Mon, 07 Oct 2019 08:57:03 -0000 Open source IPA implementations can benefit from usage of libcamera internal APIs. Allow this by compiling against the internal headers and linking against libcamera. Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/ipa/meson.build | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ipa/meson.build b/src/ipa/meson.build index b5bcd7b2c3db..ac16e1da6126 100644 --- a/src/ipa/meson.build +++ b/src/ipa/meson.build @@ -5,10 +5,16 @@ ipa_vimc_sources = [ ipa_install_dir = join_paths(get_option('libdir'), 'libcamera') +ipa_includes = [ + libcamera_includes, + libcamera_internal_includes, +] + foreach t : ipa_vimc_sources ipa = shared_module(t[0], 'ipa_vimc.cpp', name_prefix : '', - include_directories : libcamera_includes, + include_directories : ipa_includes, + dependencies : libcamera_dep, install : true, install_dir : ipa_install_dir, cpp_args : '-DLICENSE="' + t[1] + '"') From patchwork Mon Oct 7 08:58:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2126 Return-Path: Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8E80C61565 for ; Mon, 7 Oct 2019 10:57:03 +0200 (CEST) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 4A74D24000D for ; Mon, 7 Oct 2019 08:57:03 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Mon, 7 Oct 2019 10:58:41 +0200 Message-Id: <20191007085842.7608-5-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191007085842.7608-1-jacopo@jmondi.org> References: <20191007085842.7608-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 4/5] ipa: vimc: Add support for tracing operations 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: , X-List-Received-Date: Mon, 07 Oct 2019 08:57:04 -0000 Add support to the dummy VIMC IPA for tracing operation by using a FIFO channel that will be used by the IPA Interface test to verify communications with the IPA. At the moment only add support for the init() operation as it's the only defined one. Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- include/ipa/ipa_vimc.h | 22 ++++++++++++++ src/ipa/ipa_vimc.cpp | 68 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 include/ipa/ipa_vimc.h -- 2.23.0 diff --git a/include/ipa/ipa_vimc.h b/include/ipa/ipa_vimc.h new file mode 100644 index 000000000000..3e0375fe3a2c --- /dev/null +++ b/include/ipa/ipa_vimc.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * ipa_vimc.h - Vimc Image Processing Algorithm module + */ + +#ifndef __LIBCAMERA_IPA_VIMC_H__ +#define __LIBCAMERA_IPA_VIMC_H__ + +namespace libcamera { + +#define VIMC_IPA_FIFO_PATH "/tmp/vimc_ipa_fifo" + +enum IPAOperationCode { + IPAOperationNone, + IPAOperationInit, +}; + +}; /* namespace libcamera */ + +#endif /* __LIBCAMERA_IPA_VIMC_H__ */ diff --git a/src/ipa/ipa_vimc.cpp b/src/ipa/ipa_vimc.cpp index abc06e7f5fd5..83ce6bc19fd1 100644 --- a/src/ipa/ipa_vimc.cpp +++ b/src/ipa/ipa_vimc.cpp @@ -5,25 +5,91 @@ * ipa_vimc.cpp - Vimc Image Processing Algorithm module */ +#include + +#include +#include +#include +#include + #include #include #include +#include "log.h" + namespace libcamera { +LOG_DEFINE_CATEGORY(IPAVimc) + class IPAVimc : public IPAInterface { public: + IPAVimc(); + ~IPAVimc(); + int init(); + +private: + void initTrace(); + void trace(enum IPAOperationCode operation); + + int fd_; }; +IPAVimc::IPAVimc() + : fd_(-1) +{ + initTrace(); +} + +IPAVimc::~IPAVimc() +{ + if (fd_) + ::close(fd_); +} + int IPAVimc::init() { - std::cout << "initializing vimc IPA!" << std::endl; + trace(IPAOperationInit); + + LOG(IPAVimc, Debug) << "initializing vimc IPA!"; + return 0; } +void IPAVimc::initTrace() +{ + struct stat fifoStat; + int ret = stat(VIMC_IPA_FIFO_PATH, &fifoStat); + if (ret) + return; + + ret = ::open(VIMC_IPA_FIFO_PATH, O_WRONLY); + if (ret < 0) { + ret = errno; + LOG(IPAVimc, Error) << "Failed to open vimc IPA test FIFO: " + << strerror(ret); + return; + } + + fd_ = ret; +} + +void IPAVimc::trace(enum IPAOperationCode operation) +{ + if (fd_ < 0) + return; + + int ret = ::write(fd_, &operation, sizeof(operation)); + if (ret < 0) { + ret = errno; + LOG(IPAVimc, Error) << "Failed to write to vimc IPA test FIFO: " + << strerror(ret); + } +} + /* * External IPA module interface */ From patchwork Mon Oct 7 08:58:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2127 Return-Path: Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EA4FE6196D for ; Mon, 7 Oct 2019 10:57:03 +0200 (CEST) Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay10.mail.gandi.net (Postfix) with ESMTPSA id B4C9E24000F for ; Mon, 7 Oct 2019 08:57:03 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Mon, 7 Oct 2019 10:58:42 +0200 Message-Id: <20191007085842.7608-6-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191007085842.7608-1-jacopo@jmondi.org> References: <20191007085842.7608-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 5/5] test: ipa: Add test for the IPA Interface 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: , X-List-Received-Date: Mon, 07 Oct 2019 08:57:04 -0000 Implement a basic test for IPA Interface using the VIMC dummy IPA module. The test implements an out-of-band feedback channel between the test and the dummy IPA module to verify the success of the IPA interactions. Test the only available operation defined by the IPA interface by receiving a confirmation code on the fifo communication channel. Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- test/ipa/ipa_interface_test.cpp | 142 ++++++++++++++++++++++++++++++++ test/ipa/meson.build | 3 +- 2 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 test/ipa/ipa_interface_test.cpp -- 2.23.0 diff --git a/test/ipa/ipa_interface_test.cpp b/test/ipa/ipa_interface_test.cpp new file mode 100644 index 000000000000..171e572461a5 --- /dev/null +++ b/test/ipa/ipa_interface_test.cpp @@ -0,0 +1,142 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * ipa_interface_test.cpp - Test the IPA interface + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include "device_enumerator.h" +#include "ipa_manager.h" +#include "ipa_module.h" +#include "pipeline_handler.h" +#include "test.h" +#include "thread.h" + +using namespace std; +using namespace libcamera; + +class IPAInterfaceTest : public Test, public Object +{ +public: + IPAInterfaceTest() + : trace_(IPAOperationNone), notifier_(nullptr), fd_(-1) + { + } + + ~IPAInterfaceTest() + { + delete notifier_; + } + +protected: + int init() override + { + /* Create a pipeline handler for vimc. */ + std::vector &factories = + PipelineHandlerFactory::factories(); + for (PipelineHandlerFactory *factory : factories) { + if (factory->name() == "PipelineHandlerVimc") { + pipe_ = factory->create(nullptr); + break; + } + } + + if (!pipe_) { + cerr << "Vimc pipeline not found" << endl; + return TestPass; + } + + /* Create and open the communication FIFO. */ + int ret = mkfifo(VIMC_IPA_FIFO_PATH, S_IRUSR | S_IWUSR); + if (ret) { + ret = errno; + cerr << "Failed to create IPA test FIFO at '" + << VIMC_IPA_FIFO_PATH << "': " << strerror(ret) + << endl; + return TestFail; + } + + ret = open(VIMC_IPA_FIFO_PATH, O_RDONLY | O_NONBLOCK); + if (ret < 0) { + ret = errno; + cerr << "Failed to open IPA test FIFO at '" + << VIMC_IPA_FIFO_PATH << "': " << strerror(ret) + << endl; + unlink(VIMC_IPA_FIFO_PATH); + return TestFail; + } + fd_ = ret; + + notifier_ = new EventNotifier(fd_, EventNotifier::Read, this); + notifier_->activated.connect(this, &IPAInterfaceTest::readTrace); + + return TestPass; + } + + int run() override + { + EventDispatcher *dispatcher = thread()->eventDispatcher(); + Timer timer; + + ipa_ = IPAManager::instance()->createIPA(pipe_.get(), 0, 0); + if (!ipa_) { + cerr << "Failed to create VIMC IPA interface" << endl; + return TestFail; + } + + /* Test initialization of IPA module. */ + ipa_->init(); + timer.start(1000); + while (timer.isRunning() && trace_ != IPAOperationInit) + dispatcher->processEvents(); + + if (trace_ != IPAOperationInit) { + cerr << "Failed to test IPA initialization sequence" + << endl; + return TestFail; + } + + return TestPass; + } + + void cleanup() override + { + close(fd_); + unlink(VIMC_IPA_FIFO_PATH); + } + +private: + void readTrace(EventNotifier *notifier) + { + ssize_t s = read(notifier->fd(), &trace_, sizeof(trace_)); + if (s < 0) { + int ret = errno; + cerr << "Failed to read from IPA test FIFO at '" + << VIMC_IPA_FIFO_PATH << "': " << strerror(ret) + << endl; + trace_ = IPAOperationNone; + } + } + + std::shared_ptr pipe_; + std::unique_ptr ipa_; + enum IPAOperationCode trace_; + EventNotifier *notifier_; + int fd_; +}; + +TEST_REGISTER(IPAInterfaceTest) diff --git a/test/ipa/meson.build b/test/ipa/meson.build index e174671d05e1..c501fcf99aed 100644 --- a/test/ipa/meson.build +++ b/test/ipa/meson.build @@ -1,5 +1,6 @@ ipa_test = [ - ['ipa_module_test', 'ipa_module_test.cpp'], + ['ipa_module_test', 'ipa_module_test.cpp'], + ['ipa_interface_test', 'ipa_interface_test.cpp'], ] foreach t : ipa_test