From patchwork Wed Jun 5 22:18:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 1367 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CE50A66C75 for ; Thu, 6 Jun 2019 00:18:32 +0200 (CEST) Received: from localhost.localdomain (unknown [96.44.9.117]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2AF1C9BC; Thu, 6 Jun 2019 00:18:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1559773112; bh=bRpVbdJkCA2p8oENqa8RmSJRj6p0z8NpYLh9vE/vAEU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zom3/DzNyWtl1ecf8cBxqW5bCGtlEM7WzIFQIvQkDlLbZOxco/nEu4jv9TZwepIbE /GPF13YN8ZNL9is8dZ7g+4685ev4PIiLC2E76p8GxDsJ9yidUAevbWrhovIQnz2tnD 9zDX1Esh6L9QFRPU9T4zISVdWVql6iJrulHRDsDA= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 5 Jun 2019 18:18:13 -0400 Message-Id: <20190605221817.966-7-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190605221817.966-1-paul.elder@ideasonboard.com> References: <20190605221817.966-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 06/10] libcamera: ipa_manager: add shims X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Jun 2019 22:18:33 -0000 Make IPAManager load shim shared objects in addition to IPA module shared objects, and keep them in a shims list. When requested for an IPA, if the IPA requires isolation, wrap the IPA in the first shim that is available. Signed-off-by: Paul Elder --- src/libcamera/include/ipa_manager.h | 1 + src/libcamera/ipa_manager.cpp | 34 +++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/libcamera/include/ipa_manager.h b/src/libcamera/include/ipa_manager.h index 310ce7c..a0fb8ad 100644 --- a/src/libcamera/include/ipa_manager.h +++ b/src/libcamera/include/ipa_manager.h @@ -28,6 +28,7 @@ public: private: std::vector modules_; + std::vector shims_; IPAManager(); ~IPAManager(); diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp index f689aa6..3648ea6 100644 --- a/src/libcamera/ipa_manager.cpp +++ b/src/libcamera/ipa_manager.cpp @@ -110,7 +110,10 @@ int IPAManager::addDir(const char *libDir) continue; } - modules_.push_back(ipaModule); + if (!strncmp(ipaModule->info().pipelineName, "Shim", 4)) + shims_.push_back(ipaModule); + else + modules_.push_back(ipaModule); count++; } @@ -132,6 +135,7 @@ std::unique_ptr IPAManager::createIPA(PipelineHandler *pipe, uint32_t minVersion) { IPAModule *m = nullptr; + IPAModule *shim = nullptr; for (IPAModule *module : modules_) { if (module->match(pipe, minVersion, maxVersion)) { @@ -140,7 +144,33 @@ std::unique_ptr IPAManager::createIPA(PipelineHandler *pipe, } } - if (!m || !m->load()) + if (!m) + return nullptr; + + if (m->info().isolate) { + if (shims_.empty()) { + LOG(IPAManager, Error) << "No shims available"; + return nullptr; + } + + shim = shims_.front(); + if (!shim || !shim->load()) { + LOG(IPAManager, Error) << "Failed to obtain shim"; + return nullptr; + } + + auto shimIPAIntf = shim->createInstance(); + if (!shimIPAIntf) { + LOG(IPAManager, Error) << "Failed to load shim"; + return nullptr; + } + + shimIPAIntf->init(m->path()); + + return shimIPAIntf; + } + + if (!m->load()) return nullptr; return m->createInstance();