From patchwork Sun Oct 6 20:08:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2117 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F164F60E1E for ; Sun, 6 Oct 2019 22:07:12 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id AC907C0003 for ; Sun, 6 Oct 2019 20:07:12 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Oct 2019 22:08:48 +0200 Message-Id: <20191006200852.11775-2-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006200852.11775-1-jacopo@jmondi.org> References: <20191006200852.11775-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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: Sun, 06 Oct 2019 20:07:13 -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 Sun Oct 6 20:08:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2118 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5A5A460E1E for ; Sun, 6 Oct 2019 22:07:13 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 2434CC0003 for ; Sun, 6 Oct 2019 20:07:12 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Oct 2019 22:08:49 +0200 Message-Id: <20191006200852.11775-3-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006200852.11775-1-jacopo@jmondi.org> References: <20191006200852.11775-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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: Sun, 06 Oct 2019 20:07:13 -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 Sun Oct 6 20:08:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2119 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B724561968 for ; Sun, 6 Oct 2019 22:07:13 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 807F8C0003 for ; Sun, 6 Oct 2019 20:07:13 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Oct 2019 22:08:50 +0200 Message-Id: <20191006200852.11775-4-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006200852.11775-1-jacopo@jmondi.org> References: <20191006200852.11775-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 3/5] ipa: meson: Allow IPAs to include internal headers 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: Sun, 06 Oct 2019 20:07:14 -0000 Extend the list of inclusion paths for the IPA modules in src/ipa/ to include internal libcamera headers. Only Open Source IPA implementations will live in src/ipa/ and they link against libcamera, so they should be able to include internal headers as well as public ones. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- 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 Sun Oct 6 20:08:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2120 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2094360E1E for ; Sun, 6 Oct 2019 22:07:14 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id DDA1EC0003 for ; Sun, 6 Oct 2019 20:07:13 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Oct 2019 22:08:51 +0200 Message-Id: <20191006200852.11775-5-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006200852.11775-1-jacopo@jmondi.org> References: <20191006200852.11775-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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: Sun, 06 Oct 2019 20:07:14 -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. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- include/ipa/ipa_vimc.h | 21 +++++++++++++ src/ipa/ipa_vimc.cpp | 68 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 include/ipa/ipa_vimc.h diff --git a/include/ipa/ipa_vimc.h b/include/ipa/ipa_vimc.h new file mode 100644 index 000000000000..f4a3ef4f32a4 --- /dev/null +++ b/include/ipa/ipa_vimc.h @@ -0,0 +1,21 @@ +/* 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 { + +static const char *vimcFifoPath = "/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..0bc0b73c2d3f 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(vimcFifoPath, &fifoStat); + if (ret) + return; + + ret = ::open(vimcFifoPath, 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 Sun Oct 6 20:08:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2121 Return-Path: Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8563861966 for ; Sun, 6 Oct 2019 22:07:14 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 46A9EC0005 for ; Sun, 6 Oct 2019 20:07:14 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Oct 2019 22:08:52 +0200 Message-Id: <20191006200852.11775-6-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006200852.11775-1-jacopo@jmondi.org> References: <20191006200852.11775-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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: Sun, 06 Oct 2019 20:07:14 -0000 Implementing 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. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- test/ipa/ipa_interface_test.cpp | 138 ++++++++++++++++++++++++++++++++ test/ipa/meson.build | 3 +- 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 test/ipa/ipa_interface_test.cpp diff --git a/test/ipa/ipa_interface_test.cpp b/test/ipa/ipa_interface_test.cpp new file mode 100644 index 000000000000..71bdcc651392 --- /dev/null +++ b/test/ipa/ipa_interface_test.cpp @@ -0,0 +1,138 @@ +/* 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(vimcFifoPath, S_IRUSR | S_IWUSR); + if (ret) { + ret = -errno; + cerr << "Failed to create IPA test FIFO at: " + << vimcFifoPath << ": " << strerror(-ret) << endl; + return TestFail; + } + + ret = open(vimcFifoPath, O_RDONLY | O_NONBLOCK); + if (ret < 0) { + ret = -errno; + cerr << "Failed to open IPA test FIFO at: " + << vimcFifoPath << ": " << strerror(-ret) << endl; + unlink(vimcFifoPath); + 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(vimcFifoPath); + } + +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: " + << 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